<?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.3.1</version>
  <mincmsversion>1.9</mincmsversion>
	<help><![CDATA[PGRpdiBzdHlsZT0iZmxvYXQ6cmlnaHQ7Ij48Zm9ybSBhY3Rpb249Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3IiIG1ldGhvZD0icG9zdCI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY21kIiB2YWx1ZT0iX3MteGNsaWNrIiAvPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Imhvc3RlZF9idXR0b25faWQiIHZhbHVlPSJGTEgyQU44OVVQUEFHIiAvPjxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJodHRwczovL3d3dy5wYXlwYWxvYmplY3RzLmNvbS9lbl9HQi9pL2J0bi9idG5fZG9uYXRlX0xHLmdpZiIgYm9yZGVyPSIwIiBuYW1lPSJzdWJtaXQiIGFsdD0iUGF5UGFsIOKAlCBUaGUgc2FmZXIsIGVhc2llciB3YXkgdG8gcGF5IG9ubGluZS4iIHN0eWxlPSJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7IiAvPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgc3JjPSJodHRwczovL3d3dy5wYXlwYWxvYmplY3RzLmNvbS9kZV9ERS9pL3Njci9waXhlbC5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC9mb3JtPjwvZGl2PjxkaXYgaWQ9InBhZ2VfdGFicyI+PGRpdiBpZD0iZ2VuZXJhbCI+R2VuZXJhbDwvZGl2PjxkaXYgaWQ9InNob3J0Y3V0cyI+S2V5Ym9hcmQgU2hvcnRjdXRzPC9kaXY+PGRpdiBpZD0iZnJvbnRlbmQiPkZyb250ZW5kPC9kaXY+PGRpdiBpZD0iYWJvdXQiPkFib3V0PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY2xlYXJiIj48L2Rpdj48ZGl2IGlkPSJwYWdlX2NvbnRlbnQiPjxkaXYgaWQ9ImdlbmVyYWxfYyI+PGltZyBzdHlsZT0iZmxvYXQ6cmlnaHQ7bWFyZ2luOjAgMTBweCAxMHB4IDEwcHg7IGJvcmRlcjogNXB4IHNvbGlkICNmMGYwZjA7IiBzcmM9Imh0dHA6Ly91bmlxdTMuZHluZG5zLXNlcnZlci5jb20vZGVtb3MvMS4xMS9tb2R1bGVzL0FjZUVkaXRvci9pbWFnZXMvZWRpdG9yLmpwZyIgYWx0PSJFZGl0b3IiIHdpZHRoPSIzMTYiIGhlaWdodD0iMjU5IiAvPg0KPGgzPldoYXQgZG9lcyB0aGlzIG1vZHVsZSBkbz88L2gzPg0KPHA+QWNlRWRpdG9yIGlzIGEgU3ludGF4aGlnaGxpZ2h0ZXIgbW9kdWxlIHVzaW5nIDxzdHJvbmc+QWNlPC9zdHJvbmc+IGEgc3RhbmRhbG9uZSBjb2RlIGVkaXRvciB3cml0dGVuIGluIEphdmFTY3JpcHQuPGJyIC8+IA0KR29hbCBvZiBBY2UgY29kZSBlZGl0b3IgZ3JvdXAgaXMgdG8gY3JlYXRlIGEgd2ViIGJhc2VkIGNvZGUgZWRpdG9yIHRoYXQgbWF0Y2hlcyBhbmQgZXh0ZW5kcyB0aGUgZmVhdHVyZXMsIHVzYWJpbGl0eSBhbmQgcGVyZm9ybWFuY2Ugb2YgZXhpc3RpbmcgbmF0aXZlIGVkaXRvcnMgc3VjaCBhcyBUZXh0TWF0ZSwgVmltIG9yIEVjbGlwc2UuPGJyIC8+DQpJdCBjYW4gYmUgZWFzaWx5IGVtYmVkZGVkIGluIGFueSB3ZWIgcGFnZSBhbmQgSmF2YVNjcmlwdCBhcHBsaWNhdGlvbi48YnIgLz4gDQpBY2UgaXMgZGV2ZWxvcGVkIGFzIHRoZSBwcmltYXJ5IGVkaXRvciBmb3IgPGEgaHJlZj0iaHR0cDovL3d3dy5jbG91ZDlpZGUuY29tIj5DbG91ZDkgSURFPC9hPiBhbmQgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgTW96aWxsYSBTa3l3cml0ZXIgKEJlc3BpbikgUHJvamVjdC48L3A+DQo8aDM+QWNlIGlzIGhvc3RlZCBvbiBHaXRIdWI8L2gzPg0KPHA+VGhlIEFjZSBzb3VyY2UgY29kZSBpcyBob3N0ZWQgb24gR2l0SHViLiBJdCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTW96aWxsYSB0cmktbGljZW5zZSAoTVBML0dQTC9MR1BMKS48YnIgLz4NClRoaXMgaXMgdGhlIHNhbWUgbGljZW5zZSB1c2VkIGJ5IEZpcmVmb3guIFRoaXMgbGljZW5zZSBpcyBmcmllbmRseSB0byBhbGwga2luZHMgb2YgcHJvamVjdHMsIHdoZXRoZXIgb3BlbiBzb3VyY2Ugb3Igbm90LjxiciAvPg0KIFRha2UgY2hhcmdlIG9mIHlvdXIgZWRpdG9yIGFuZCBhZGQgeW91ciBmYXZvcml0ZSBsYW5ndWFnZSBoaWdobGlnaHRpbmcgYW5kIGtleWJpbmRpbmdzITwvcD4NCjxoMz5Vc2luZyBBY2VFZGl0b3IgTW9kdWxlPC9oMz4NCjxwPlVzaW5nIEFjZUVkaXRvciBNb2R1bGUgaXMgc2ltcGxlLjxiciAvPg0KQWZ0ZXIgQWNlRWRpdG9yIHdhcyBpbnN0YWxsZWQgZ28gdG8gIk15IFByZWZlcmVuY2VzICZyYXF1bzsgVXNlciBQcmVmZXJlbmNlcyIgYW5kIGNob29zZSBBY2VFZGl0b3IgYXMgeW91ciBTeW50YXhoaWdobGlnaHRlciBvZiBjaG9pY2UgZnJvbSAiU2VsZWN0IHN5bnRheCBoaWdobGlnaHRlciB0byB1c2U6IiBEcm9wZG93bi48YnIgLz4NCk1ha2Ugc3VyZSB5b3UgaGF2ZSAnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnIFBlcm1zaXNzaW9uLjwvcD4NCjxoMz5TZXR0aW5nczwvaDM+DQo8cD5Zb3UgY2FuIGNoYW5nZSBkZWZhdWx0IFNldHRpbmdzIGFuZCBUaGVtZXMgaW4gIkV4dGVuc2lvbnMgJnJhcXVvOyBBY2VFZGl0b3IiPC9wPjxiciBzdHlsZSA9ImNsZWFyOmJvdGg7IiAvPjwvZGl2PjxkaXYgaWQ9InNob3J0Y3V0c19jIj48ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICAgICAgPGgzPkRlZmF1bHQgS2V5Ym9hcmQgU2hvcnRjdXRzPC9oMz4NCg0KPHRhYmxlIGNsYXNzPSJwYWdldGFibGUiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSJEZWZhdWx0IEtleWJvYXJkIFNob3J0Y3V0cyI+DQo8dGhlYWQ+PHRyPg0KPHRoPlBDIChXaW5kb3dzL0xpbnV4KTwvdGQ+DQo8dGg+TWFjPC90ZD4NCjx0aD5hY3Rpb248L3RkPg0KPC90cj48L3RoZWFkPg0KPHRib2R5Pg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1SZXR1cm48L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVJldHVybjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmZ1bGxzY3JlZW48L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtUzwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtUzwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnBlcmZvcm0gc2F2ZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1MPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Y2VudGVyIHNlbGVjdGlvbjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1BbHQtRG93bjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtT3B0aW9uLURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5jb3B5IGxpbmVzIGRvd248L3RkPg0KPC90cj4NCjx0ciBsY2Fzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtQWx0LVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1PcHRpb24tVXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5jb3B5IGxpbmVzIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzIiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUY8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUY8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5maW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUs8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUc8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5maW5kIG5leHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtSzwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtRzwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmZpbmQgcHJldmlvdXM8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkRvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Eb3duLEN0cmwtTjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIGxpbmUgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+VXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5VcCxDdHJsLVA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyBsaW5lIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUVuZCxDdHJsLURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUVuZCxDb21tYW5kLURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5MZWZ0LEN0cmwtQjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtTDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtTDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGxpbmU8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkFsdC1SaWdodCxFbmQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVJpZ2h0LEVuZCxDdHJsLUU8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBsaW5lIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+QWx0LUxlZnQsSG9tZTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtTGVmdCxIb21lLEN0cmwtQTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGxpbmUgc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPlBhZ2VEb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVBhZ2VEb3duLEN0cmwtVjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHBhZ2UgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+UGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVBhZ2VVcDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHBhZ2UgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPlJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+UmlnaHQsQ3RybC1GPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtSG9tZSxDdHJsLVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1Ib21lLENvbW1hbmQtVXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLUxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byB3b3JkIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5PcHRpb24tUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzIiPg0KPHRkIGFsaWduPSJsZWZ0Ij5UYWI8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5UYWI8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5pbmRlbnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkFsdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5tb3ZlIGxpbmVzIGRvd248L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkFsdC1VcDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1VcDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPm1vdmUgbGluZXMgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVRhYjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVRhYjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPm91dGRlbnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkluc2VydDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkluc2VydDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPm92ZXJ3cml0ZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+UGFnZURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5wYWdlZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+UGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+cGFnZXVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVNoaWZ0LVosQ3RybC1ZPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1aLENvbW1hbmQtWTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnJlZG88L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtRDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtRDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnJlbW92ZSBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUs8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgdG8gbGluZSBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1CYWNrc3BhY2U8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgdG8gbGluZXN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5BbHQtQmFja3NwYWNlLEN0cmwtQWx0LUJhY2tzcGFjZTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnJlbW92ZSB3b3JkIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkFsdC1EZWxldGU8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgd29yZCByaWdodDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1SPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1PcHRpb24tRjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnJlcGxhY2U8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtUjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtT3B0aW9uLUY8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5yZXBsYWNlIGFsbDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1BPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1BPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IGFsbDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRG93bjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRW5kPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRW5kPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IGxpbmUgZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1Ib21lPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtSG9tZTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCBsaW5lIHN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzIiPg0KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1QYWdlRG93bjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVBhZ2VEb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHBhZ2UgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHBhZ2UgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtRW5kLEFsdC1TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHRvIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+QWx0LVNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB0byBsaW5lIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+QWx0LVNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdG8gbGluZSBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1Ib21lLEFsdC1TaGlmdC1VcDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdG8gc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1TaGlmdC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHdvcmQgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzIiPg0KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLU88L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zcGxpdCBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLTc8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLTc8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij50b2dnbGUgY29tbWVudDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1UPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1UPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+dHJhbnNwb3NlIGxldHRlcnM8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtWjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtWjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnVuZG88L3RkPg0KPC90cj4NCjwvdGJvZHk+DQo8L3RhYmxlPjwvZGl2PjwvZGl2PjxkaXYgaWQ9ImZyb250ZW5kX2MiPjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+PHA+VGhpcyBNb2R1bGUgYW5kIEFjZSBTY3JpcHQgY2FuIGFsc28gYmUgdXNlZCBhcyBhIEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGVyLjxiciAvPg0KVG8gbWFrZSBpdCB3b3JrIHlvdSBoYXZlIHRvIGluY2x1ZGUgalF1ZXJ5IEZyYW1ld29yaywgZm9yIGV4YW1wbGUgdXNpbmcgQ01TTVMge2Ntc19qcXVlcnl9IHRhZyBhbmQgYXMgd2VsbCBpbmNsdWRlIHtBY2VFZGl0b3J9IGluIHlvdXIgcGFnZSB0d2ljZS4gRmlyc3QgYWRkIHRoZSBtb2R1bGUgdGFnIGluIHlvdXIgJmx0O2hlYWQmZ3Q7IHNlY3Rpb24gb2YgVGVtcGxhdGUgb3IgaW4gJnF1b3Q7UGFnZSBTcGVjaWZpYyBNZXRkYXRhJnF1b3Q7IGZpZWxkIG9mIHlvdXIgQ29udGVudCBwYWdlLCBsaWtlIHtBY2VFZGl0b3IgYWN0aW9uPSdoZWFkJ30gYW5kIGFub3RoZXIgY2FsbCB0byBzcGVjaWZ5IHdoaWNoIGFyZWEgc2hvdWxkIGJlIGhpZ2hsaWdodGVkLCBmb3IgZXhhbXBsZSB7QWNlRWRpdG9yIGRpdmlkPSdmb28nfSwgd2hpY2ggd291bGQgdGFyZ2V0IGEgcGFnZSBlbGVtZW50IHdpdGggaWQgPGVtPmZvbzwvZW0+LjwvcD4NCjxoMz5TbyBob3cgZG8geW91IHVzZSBpdD88L2gzPg0KPHA+Rmlyc3QgaW5jbHVkZSBqUXVlcnkgYW5kIE1vZHVsZSB0YWcgaW4geW91ciBQYWdlICZsdDtoZWFkJmd0OyBhcmVhLCBmb3IgZXhhbXBsZSBpbiAmcXVvdDtQYWdlIFNwZWNpZmljIE1ldGRhdGEmcXVvdDs6PC9wPg0KCTxwcmU+DQoJe2Ntc19qcXVlcnl9DQoJe0FjZUVkaXRvciBhY3Rpb249J2hlYWQnfQ0KCTwvcHJlPg0KPHA+VGhpcyBpbmNsdWRlcyBuZWVkZWQgc2NyaXB0cyBmb3IgQWNlIFN5bnRheGhpZ2hsaWdodGVyIHRvIHdvcmsuPGJyIC8+DQpJbiBNb2R1bGVzIEFkbWluIGludGVyZmFjZSB5b3UgY2FuIHNlbGVjdCBkZWZhdWx0IHNldHRpbmdzIGZvciB5b3VyICdoZWFkJyBhY3Rpb24gb3IgdXNlIHBhcmFtZXRlciBtb2Rlcz0naHRtbCxqYXZhc2NyaXB0JyBhbmQgdGhlbWVzPSd0ZXh0bWF0ZScgd2hpY2ggd291bGQgb3ZlcnJpZGUgc2VsZWN0ZWQgUHJlZmVyZW5jZXMuPC9wPg0KPHA+Tm93IHdoZW4geW91IGhhdmUgbmVlZGVkIHNjcmlwdHMgaW5jbHVkZWQsIG9uZSBtb3JlIE1vZHVsZSB0YWcgY2FsbCBpcyBuZWVkZWQgKGZvciBleGFtcGxlIGluIHlvdXIgQ29udGVudCBFZGl0b3IgYXJlYSkgdG8gc3BlY2lmeSB3aGljaCBhcmVhIG9mIHlvdXIgUGFnZSBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQuPC9wPg0KCTxwcmU+DQoJe0FjZUVkaXRvciBkaXZpZD0nc29tZS1pZCd9DQoJPC9wcmU+DQo8cD5UaGlzIHRhZyBpbmNsdWRlcyBuZWVkZWQgU2NyaXB0IGFuZCBTdHlsZSB0aGF0IGlzIHVzZWQgdG8gSGlnaGxpZ2h0IHNlbGVjdGVkIGVsZW1lbnQgd2l0aCBzcGVjaWZpZWQgaWQuPGJyIC8+DQpBbGwgeW91IG5lZWQgdGhlbiBpcyB3cml0ZSB5b3VyIENvZGUgdGhhdCB5b3Ugd2FudCB0byBIaWdobGlnaHQgYW5kIHdyYXAgaXQgaW5zaWRlIGFuIGVsZW1lbiBsaWtlICZsdDtkaXYmZ3Q7IHdpdGggc3BlY2lmaWVkIGlkLjwvcD48cHJlPg0KJmx0O3ByZSBpZD0mcXVvdDtzb21lLWlkJnF1b3Q7Jmd0Ow0KJmFtcDtsdDtodG1sJmFtcDtndDsNCiDCoCDCoCAmYW1wO2x0O2hlYWQmYW1wO2d0Ow0KIMKgIMKgICZhbXA7bHQ7c3R5bGUgdHlwZT0mcXVvdDt0ZXh0L2NzcyZxdW90OyZhbXA7Z3Q7DQogwqAgwqAgwqAgwqAgLnRleHQtbGF5ZXIgew0KIMKgIMKgIMKgIMKgIMKgIMKgIGZvbnQtZmFtaWx5OiBNb25hY28sICZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7LCBtb25vc3BhY2U7DQogwqAgwqAgwqAgwqAgwqAgwqAgZm9udC1zaXplOiAxMnB4Ow0KIMKgIMKgIMKgIMKgIMKgIMKgIGN1cnNvcjogdGV4dDsNCiDCoCDCoCDCoCDCoCB9DQogwqAgwqAgJmFtcDtsdDsvc3R5bGUmYW1wO2d0Ow0KIMKgIMKgICZhbXA7bHQ7L2hlYWQmYW1wO2d0Ow0KIMKgIMKgICZhbXA7bHQ7Ym9keSZhbXA7Z3Q7DQogwqAgwqAgwqAgwqAgJmFtcDtsdDtoMSBzdHlsZT0mcXVvdDtjb2xvcjpyZWQmcXVvdDsmYW1wO2d0O0p1aHUgS2lubmVycyZhbXA7bHQ7L2gxJmFtcDtndDsNCiDCoCDCoCAmYW1wO2x0Oy9ib2R5JmFtcDtndDsgJmFtcDtsdDsvaHRtbCZhbXA7Z3Q7DQombHQ7L3ByZSZndDs8L3ByZT48L2Rpdj48L2Rpdj48ZGl2IGlkPSJhYm91dF9jIj48ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPjxoMz5TdXBwb3J0PC9oMz4NCjxwPkFzIHBlciB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzLWlzLiBQbGVhc2UgcmVhZCB0aGUgdGV4dCBvZiB0aGUgbGljZW5zZSBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+DQo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4NCjxwPkNvcHlyaWdodCAmY29weTsgMjAxMiwgR29yYW4gSWxpYyA8YSBocmVmPSJtYWlsdG86dW5pcXUzZUBnbWFpbC5jb20iPiZsdDt1bmlxdTNlQGdtYWlsLmNvbSZndDs8L2E+IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0IiByZWw9ImV4dGVybmFsIj53d3cuaWNoLW1hY2gtZGFzLmF0PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPg0KPHA+VGhpcyBtb2R1bGUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+R05VIFB1YmxpYyBMaWNlbnNlPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4NCgk8aDM+VGVhbTwvaDM+DQoJPHVsPg0KCQk8bGk+R29yYW4gSWxpYyAodW5pcXUzKSBnLmlsaWNAaS1hcnRzLmV1IDxiciAvPnd3dy5pY2gtbWFjaC1kYXMuYXQ8L2xpPgkNCgkJPGxpPlJvYmVydCBDYW1wYmVsbCAoY2FsZ3V5MTAwMCkgY2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyAgPGJyIC8+d3d3LmNhbGd1eTEwMDAuY29tPC9saT4JCQ0KCQk8bGk+Sm9uYXRoYW4gU2NobWlkIChGb2FseSopIGhpQGpvbmF0aGFuc2NobWlkLmRlIDxiciAvPnd3dy5qb25hdGhhbnNjaG1pZC5kZTwvbGk+DQoJPC91bD4NCjwvZGl2PjwvZGl2PjwvZGl2Pg0KPGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgbGFuZ3VhZ2UgdG8gdXNlIGZvciBkaXNwbGF5IG9uIHRoZSBmcm9udGVuZC4gTm90IGFsbCBtb2R1bGVzIHN1cHBvcnQgb3IgbmVlZCB0aGlzLjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gYWN0aW9uPSJkZWZhdWx0IiAtIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhY3Rpb24gb2YgTW9kdWxlIHRhZy4gUG9zc2libGUgdmFsdWVzIGFyZSAnZGVmYXVsdCcgYW5kICdoZWFkJy4gQm90aCBhcmUgbmVlZGVkIGZvciBjb3JyZWN0IEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGluZyBmdW5jdGlvbi4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+aGVhZDwvbGk+DQoJPGxpPmRlZmF1bHQ8L2xpPg0KPC91bD48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IG1vZGVzPSJodG1sIiAtIGlzIHVzZWQgd2l0aCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0naGVhZCd9PC9jb2RlPi4gWW91IGNhbiBpbmNsdWRlIG11bHRpcGxlIGNvbW1hIHNlcGFyYXRlZCAnbW9kZXMnIHRoYXQgeW91IHdpbGwgYmUgdXNpbmcgb24geW91ciB3ZWJzaXRlLiBUaGlzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB5b3VyICZsdDtoZWFkJmd0OyBvZiBUZW1wbGF0ZSBvciBQYWdlIHNwZWNpZmljIE1ldGFkYXRhLiBUaGlzIHdpbGwgb3ZlcnJpZGUgeW91IFByZWZlcmVuY2VzIHNlbGVjdGVkIGluIE1vZHVsZSBBZG1pbiBhcmVhLiA8YnIgLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlOg0KPHVsPg0KCTxsaT5qYXZhc2NyaXB0PC9saT4gDQoJPGxpPnBsYWluPC9saT4gDQoJPGxpPnN2ZzwvbGk+IA0KCTxsaT5odG1sPC9saT4NCgk8bGk+Y3NzPC9saT4NCgk8bGk+c2NzczwvbGk+DQoJPGxpPmNvZmZlZTwvbGk+DQoJPGxpPmpzb248L2xpPg0KCTxsaT5weXRob248L2xpPg0KCTxsaT5ydWJ5PC9saT4NCgk8bGk+cGVybDwvbGk+DQoJPGxpPnBocDwvbGk+DQoJPGxpPmphdmE8L2xpPg0KCTxsaT5jc2hhcnA8L2xpPg0KCTxsaT5jX2NwcDwvbGk+DQoJPGxpPmNsb2p1cmU8L2xpPg0KCTxsaT5vY2FtbDwvbGk+DQoJPGxpPnRleHRpbGU8L2xpPg0KCTxsaT5ncm9vdnk8L2xpPg0KCTxsaT5zY2FsYTwvbGk+DQo8L3VsPjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gdGhlbWVzPSJ0ZXh0bWF0ZSIgLSBpcyB1c2VkIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249J2hlYWQnfTwvY29kZT4uIFlvdSBjYW4gaW5jbHVkZSBtdWx0aXBsZSBjb21tYSBzZXBhcmF0ZWQgJ3RoZW1lcycgdGhhdCB5b3Ugd2lsbCBiZSB1c2luZyBvbiB5b3VyIHdlYnNpdGUuIFRoaXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHlvdXIgJmx0O2hlYWQmZ3Q7IG9mIFRlbXBsYXRlIG9yIFBhZ2Ugc3BlY2lmaWMgTWV0YWRhdGEuIFRoaXMgd2lsbCBvdmVycmlkZSB5b3UgUHJlZmVyZW5jZXMgc2VsZWN0ZWQgaW4gTW9kdWxlIEFkbWluIGFyZWEuIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6DQo8dWw+DQoJPGxpPmNsb3VkczwvbGk+IA0KCTxsaT5jbG91ZHNfbWlkbmlnaHQ8L2xpPiANCgk8bGk+Y29iYWx0PC9saT4gDQoJPGxpPmNyaW1zb25fZWRpdG9yPC9saT4NCgk8bGk+ZGF3bjwvbGk+DQoJPGxpPmVjbGlwc2U8L2xpPg0KCTxsaT5pZGxlX2ZpbmdlcnM8L2xpPg0KCTxsaT5rcl90aGVtZTwvbGk+DQoJPGxpPm1lcmJpdm9yZTwvbGk+DQoJPGxpPm1lcmJpdm9yZV9zb2Z0PC9saT4NCgk8bGk+bW9ub19pbmR1c3RyaWFsPC9saT4NCgk8bGk+bW9ub2thaTwvbGk+DQoJPGxpPnBhc3RlbF9vbl9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfbGlnaHQ8L2xpPg0KCTxsaT50ZXh0bWF0ZTwvbGk+DQoJPGxpPnR3aWxpZ2h0PC9saT4NCgk8bGk+dmlicmFudF9pbms8L2xpPg0KPC91bD48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IG1vZGU9Imh0bWwiIC0gaXMgdXNlZCB3aXRoaW4gYSBwYWdlIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249J2RlZmF1bHQnfTwvY29kZT4gbW9kdWxlIHRhZy4gVGhpcyBzcGVjaWZpZXMgU3ludGF4aGlnaGxpZ2h0ZXIgbW9kZSBmb3Igc3BlY2lmaWMgY29kZSBhcmVhLiA8YnIgLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlOg0KPHVsPg0KCTxsaT5qYXZhc2NyaXB0PC9saT4gDQoJPGxpPnBsYWluPC9saT4gDQoJPGxpPnN2ZzwvbGk+IA0KCTxsaT5odG1sPC9saT4NCgk8bGk+Y3NzPC9saT4NCgk8bGk+c2NzczwvbGk+DQoJPGxpPmNvZmZlZTwvbGk+DQoJPGxpPmpzb248L2xpPg0KCTxsaT5weXRob248L2xpPg0KCTxsaT5ydWJ5PC9saT4NCgk8bGk+cGVybDwvbGk+DQoJPGxpPnBocDwvbGk+DQoJPGxpPmphdmE8L2xpPg0KCTxsaT5jc2hhcnA8L2xpPg0KCTxsaT5jX2NwcDwvbGk+DQoJPGxpPmNsb2p1cmU8L2xpPg0KCTxsaT5vY2FtbDwvbGk+DQoJPGxpPnRleHRpbGU8L2xpPg0KCTxsaT5ncm9vdnk8L2xpPg0KCTxsaT5zY2FsYTwvbGk+DQo8L3VsPjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gdGhlbWU9InRleHRtYXRlIiAtIGlzIHVzZWQgd2l0aGluIGEgcGFnZSB3aXRoIDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSdkZWZhdWx0J308L2NvZGU+IG1vZHVsZSB0YWcuIFRoaXMgc3BlY2lmaWVzIFN5bnRheGhpZ2hsaWdodGVyIHRoZW1lIGZvciBzcGVjaWZpYyBjb2RlIGFyZWEuIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6DQo8dWw+DQoJPGxpPmNsb3VkczwvbGk+IA0KCTxsaT5jbG91ZHNfbWlkbmlnaHQ8L2xpPiANCgk8bGk+Y29iYWx0PC9saT4gDQoJPGxpPmNyaW1zb25fZWRpdG9yPC9saT4NCgk8bGk+ZGF3bjwvbGk+DQoJPGxpPmVjbGlwc2U8L2xpPg0KCTxsaT5pZGxlX2ZpbmdlcnM8L2xpPg0KCTxsaT5rcl90aGVtZTwvbGk+DQoJPGxpPm1lcmJpdm9yZTwvbGk+DQoJPGxpPm1lcmJpdm9yZV9zb2Z0PC9saT4NCgk8bGk+bW9ub19pbmR1c3RyaWFsPC9saT4NCgk8bGk+bW9ub2thaTwvbGk+DQoJPGxpPnBhc3RlbF9vbl9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfbGlnaHQ8L2xpPg0KCTxsaT50ZXh0bWF0ZTwvbGk+DQoJPGxpPnR3aWxpZ2h0PC9saT4NCgk8bGk+dmlicmFudF9pbms8L2xpPg0KPC91bD48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IHdpZHRoPSI0MDAiIC0gc3BlY2lmaWVzIHdpZHRoIG9mIFN5bnRheGhpZ2hsaWdodGVyIGFyZWEgaW4gcGl4ZWwuPC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBoZWlnaHQ9IjQwMCIgLSBzcGVjaWZpZXMgaGVpZ2h0IG9mIFN5bnRheGhpZ2hsaWdodGVyIGFyZWEgaW4gcGl4ZWwuPC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBkaXZpZD0iZWRpdG9yIiAtIGlkIG9mIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgeW91ciBjb2RlLiBVc2UgdW5pcXVlIGlkIGZvciBlYWNoIGNvZGUgY2h1bmNrLjwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBHb3JhbiBJbGljICZsdDt1bmlxdTNlQGdtYWlsLmNvbSZndDs8YnIgLz48YnIgLz5WZXJzaW9uOiAwLjIuMy4xPGJyIC8+PGJyIC8+Q2hhbmdlIEhpc3Rvcnk6PGJyIC8+DQo8aDM+VmVyc2lvbiAwLjE8L2gzPg0KPHVsPg0KCTxsaT5JdCdzIGZyZXNoISBOb3RoaW5nIGNoYW5nZWQgeWV0ITwvbGk+DQoJPGxpPlVzaW5nIEFjZSBWZXJzaW9uIDAuMi4wPC9saT4NCjwvdWw+DQo8aDM+VmVyc2lvbiAwLjI8L2gzPg0KPHVsPg0KCTxsaT5BZGRlZCBDVFJMLVMgS2V5YmluZGluZzwvbGk+DQoJPGxpPkFkZGVkIEZ1bGxzY3JlZW5tb2RlPC9saT4NCgk8bGk+QWRkZWQgRnJvbnRlbmQgSGlnaGxpZ2h0aW5nPC9saT4NCgk8bGk+VXBkYXRlZCBBY2U8L2xpPg0KPC91bD4NCjxoMz5WZXJzaW9uIDAuMi4xPC9oMz4NCjx1bD4NCgk8bGk+QWRkZWQgSW50ZXJuZXQgRXhwbG9yZXIgcHJlZmVyZW5jZTwvbGk+DQoJPGxpPlVwZGF0ZWQgQUNFIHdpdGggdGhlbWVzPC9saT4NCjwvdWw+DQo8aDM+VmVyc2lvbiAwLjIuMjwvaDM+DQo8dWw+DQoJPGxpPkZpeCBmb3IgU2FmYXJpL01hYzwvbGk+DQo8L3VsPg0KPGgzPlZlcnNpb24gMC4yLjM8L2gzPg0KPHVsPg0KICAgIDxsaT5VcGRhdGVkIHRvIGxhdGVzdCBhY2UgZnJvbSBnaXRodWI8L2xpPg0KICAgIDxsaT5BZGRlZCBhZGRpdGlvbmFsIHByZWZlcmVuY2VzIChNb2RpZnkgVGVtcGxhdGVzLCBBY2VFZGl0b3IgVXNlciBQcmVmZXJlbmNlKTwvbGk+DQogICAgPGxpPkFkZGVkIGFiaWxpdHkgdG8gY2hhbmdlIEFjZUVkaXRvciBwcmVmZXJlbmNlcyBwZXIgdXNlcjwvbGk+DQogICAgPGxpPk1vdmVkIG1vZHVsZSBmcm9tIGV4dGVuaW9ucyB0byBteXByZWZzPC9saT4NCjwvdWw+DQo8aDM+VmVyc2lvbiAwLjIuMy4xPC9oMz4NCjx1bD4NCiAgICA8bGk+TW9kZSBwcmVmZXJlbmNlIGJ1Z2ZpeDwvbGk+DQo8L3VsPg0KPGgzPlJvYWRtYXA8L2gzPg0KPHVsPg0KCTxsaT48ZGVsPkFkZCBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRpbmc8L2RlbD48L2xpPg0KCTxsaT48ZGVsPkFkZCBGdWxsc2NyZWVubW9kZTwvZGVsPjwvbGk+DQoJPGxpPjxkZWw+QWRkIEtleWJpbmRpbmcgKENUUkwrUyk8L2RlbD48L2xpPg0KCTxsaT5BZGQgRWRpdG9yIGJlaGF2aW9yIChWaW0sIEVNYWNzKTwvbGk+DQoJPGxpPk1heWJlIGFkZCBUb29sYmFyPC9saT4NCjwvdWw+PGJyIC8+]]></about>
	<description><![CDATA[AceEditor is a Syntaxhighlighter module using <strong>Ace</strong> a standalone code editor written in JavaScript.]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/ace/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/ace/ChangeLog.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[MjAxMS4wOC4wMiwgVmVyc2lvbiAwLjIuMA0KDQoqIFNwbGl0IHZpZXcgKEp1bGlhbiBWaWVyZWNrKQ0KICAtIHNwbGl0IGVkaXRvciBhcmVhIGhvcml6b250YWxseSBvciB2ZXJ0aXZhbGx5IHRvIHNob3cgdHdvIGZpbGVzIGF0IHRoZSBzYW1lDQogICAgdGltZQ0KDQoqIENvZGUgRm9sZGluZyAoSnVsaWFuIFZpZXJlY2spDQogIC0gVW5zdHJ1Y3R1cmVkIGNvZGUgZm9sZGluZw0KICAtIFdpbGwgYmUgdGhlIGJhc2lzIGZvciBsYW5ndWFnZSBhd2FyZSBmb2xkaW5nDQoNCiogTW9kZSBiZWhhdmlvdXJzIChDaHJpcyBTcGVuY2VyKQ0KICAtIEFkZHMgbW9kZSBzcGVjaWZpYyBob29rcyB3aGljaCBhbGxvdyB0cmFuc2Zvcm1hdGlvbnMgb2YgZW50ZXJlZCB0ZXh0DQogIC0gQXV0b2Nsb3Npbmcgb2YgYnJhY2VzLCBwYXJhbnRoZXNpcyBhbmQgcXVvdGF0aW9uIG1hcmtzIGluIEMgc3R5bGUgbW9kZXMNCiAgLSBBdXRvY2xvc2luZyBvZiBhbmd1bGFyIGJyYWNrZXRzIGluIFhNTCBzdHlsZSBtb2Rlcw0KDQoqIE5ldyBsYW5ndWFnZSBtb2Rlcw0KICAtIENsb2p1cmUgKENhcmluIE1laWVyKQ0KICAtIEMjIChSb2IgQ29uZXJ5KQ0KICAtIEdyb292eSAoQmVuIFRpbGZvcmQpDQogIC0gU2NhbGEgKEJlbiBUaWxmb3JkKQ0KICAtIEpTT04NCiAgLSBPQ2FtbCAoU2VyZ2kgTWFuc2lsbGEpDQogIC0gUGVybCAoUGFuYWdpb3RpcyBBc3RpdGhhcykNCiAgLSBTQ1NTL1NBU1MgKEFuZHJlYXMgTWFkc2VuKQ0KICAtIFNWRw0KICAtIFRleHRpbGUgKEtlbGxleSB2YW4gRXZlcnQpDQogIC0gU0NBRCAoSmFjb2IgSGFuc3NvbikNCiAgDQoqIExpdmUgc3ludGF4IGNoZWNrcw0KICAtIExpbnQgZm9yIENzcyB1c2luZyBDU1MgTGludCA8aHR0cDovL2Nzc2xpbnQubmV0Lz4NCiAgLSBDb2ZmZWVTY3JpcHQNCg0KKiBOZXcgVGhlbWVzDQogIC0gQ3JpbXNvbiBFZGl0b3IgKGllYnVnZ3kpDQogIC0gTWVyYml2b3JlIChNaWNoYWVsIFNjaHdhcnR6KQ0KICAtIE1lcmJpdm9yZSBzb2Z0IChNaWNoYWVsIFNjaHdhcnR6KQ0KICAtIFNvbGFyaXplZCBkYXJrL2xpZ2h0IDxodHRwOi8vZXRoYW5zY2hvb25vdmVyLmNvbS9zb2xhcml6ZWQ+IChEYXZpZCBBbGFuDQogICAgSGplbGxlKQ0KICAtIFZpYnJhbnQgSW5rIChNaWNoYWVsIFNjaHdhcnR6KQ0KDQoqIFNtYWxsIEZlYXR1cmVzL0VuaGFuY2VtZW50cw0KICAtIExvdHMgb2YgcmVuZGVyIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgKEhhcnV0eXVuIEFtaXJqYW55YW4pDQogIC0gSW1wcm92ZWQgUnVieSBoaWdobGlnaHRpbmcgKENocmlzIFdhbnN0cmF0aCwgVHJlbnQgT2dyZW4pDQogIC0gSW1wcm92ZWQgUEhQIGhpZ2hsaWdodGluZyAoVGhvbWFzIEhydXNrYSkNCiAgLSBJbXByb3ZlZCBDU1MgaGlnaGxpZ2h0aW5nIChTZWFuIEtlbGxvZ2cpDQogIC0gQ2xpY2tzIHdoaWNoIGNhdXNlIHRoZSBlZGl0b3IgdG8gYmUgZm9jdXNlZCBkb24ndCByZXNldCB0aGUgc2VsZWN0aW9uDQogIC0gTWFrZSBwYWRkaW5nIHRleHQgbGF5ZXIgc3BlY2lmaWMgc28gdGhhdCBwcmludCBtYXJnaW4gYW5kIGFjdGl2ZSBsaW5lDQogICAgaGlnaGxpZ2h0IGFyZSBub3QgYWZmZWN0ZWQgKElyYWtsaSBHb3phbGlzaHZpbGkpDQogIC0gQWRkZWQgc2V0Rm9udFNpemUgbWV0aG9kDQogIC0gSW1wcm92ZWQgdmkga2V5YmluZGluZ3MgKFRyZW50IE9ncmVuKQ0KICAtIFdoZW4gdW5mb2N1c2VkIG1ha2UgY3Vyc29yIHRyYW5zcGFyZW50IGluc3RlYWQgb2YgcmVtb3ZpbmcgaXQgKEhhcnV0eXVuDQogICAgQW1pcmphbnlhbikNCiAgLSBTdXBwb3J0IGZvciBtYXRjaGluZyBncm91cHMgaW4gdG9rZW5pemVyIHdpdGggYXJyYXlzIG9mIHRva2VucyAoQ2hyaXMNCiAgICBTcGVuY2VyKQ0KDQoqIEJ1ZyBmaXhlcw0KICAtIEFkZCBzdXBwb3J0IGZvciB0aGUgbmV3IE9TWCBzY3JvbGwgYmFycw0KICAtIFByb3Blcmx5IGhpZ2hsaWdodCBKYXZhU2NyaXB0IHJlZ2V4cCBsaXRlcmFscw0KICAtIFByb3BlciBoYW5kbGluZyBvZiB1bmljb2RlIGNoYXJhY3RlcnMgaW4gSmF2YVNjcmlwdCBpZGVudGlmaWVycw0KICAtIEZpeCByZW1vdmUgbGluZXMgY29tbWFuZCBvbiBsYXN0IGxpbmUgKEhhcnV0eXVuIEFtaXJqYW55YW4pDQogIC0gRml4IHNjcm9sbCB3aGVlbCBzbHVnZ2lzaG5lc3MgaW4gU2FmYXJpDQogIC0gTWFrZSBrZXlib2FyZCBpbmZyYXN0cnVjdHVyZSByb3V0ZSBrZXlzIGxpa2UgW11eJCB0aGUgcmlnaHQgd2F5IChKdWxpYW4NCiAgICBWaWVyZWNrKQ0KDQoyMDExLjAyLjE0LCBWZXJzaW9uIDAuMS42DQoNCiogRmxvYXRpbmcgQW5jaG9ycw0KICAtIEFuIEFuY2hvciBpcyBhIGZsb2F0aW5nIHBvaW50ZXIgaW4gdGhlIGRvY3VtZW50LiANCiAgLSBXaGVuZXZlciB0ZXh0IGlzIGluc2VydGVkIG9yIGRlbGV0ZWQgYmVmb3JlIHRoZSBjdXJzb3IsIHRoZSBwb3NpdGlvbiBvZg0KICAgIHRoZSBjdXJzb3IgaXMgdXBkYXRlZA0KICAtIFVzZXNkIGZvciB0aGUgY3Vyc29yIGFuZCBzZWxlY3Rpb24NCiAgLSBCYXNpcyBmb3IgYm9va21hcmtzLCBtdWx0aXBsZSBjdXJzb3JzIGFuZCBzbmlwcGV0cyBpbiB0aGUgZnV0dXJlDQoqIEV4dGVuc2l2ZSBzdXBwb3J0IGZvciBDb2NvYSBzdHlsZSBrZXliaW5kaW5ncyBvbiB0aGUgTWFjIDxodHRwczovL2dpdGh1Yi5jb20vYWpheG9yZy9hY2UvaXNzdWVzL2Nsb3NlZCNpc3N1ZS8xMTYvY29tbWVudC83Njc4MDM+DQoqIE5ldyBjb21tYW5kczoNCiAgLSBjZW50ZXIgc2VsZWN0aW9uIGluIHZpZXdwb3J0DQogIC0gcmVtb3ZlIHRvIGVuZC9zdGFydCBvZiBsaW5lDQogIC0gc3BsaXQgbGluZQ0KICAtIHRyYW5zcG9zZSBsZXR0ZXJzDQoqIFJlZmF0b3IgbWFya2VycyAgDQogIC0gQ3VzdG9tIGNvZGUgY2FuIGJlIHVzZWQgdG8gcmVuZGVyIG1hcmtlcnMNCiAgLSBNYXJrZXJzIGNhbiBiZSBpbiBmcm9udCBvciBiZWhpbmQgdGhlIHRleHQNCiAgLSBNYXJrZXJzIGFyZSBub3cgc3RvcmVkIGluIHRoZSBzZXNzaW9uICh3YXMgaW4gdGhlIHJlbmRlcmVyKQ0KKiBMb3RzIG9mIElFOCBmaXhlcyBpbmNsdWRpbmcgY29weSwgY3V0IGFuZCBzZWxlY3Rpb25zDQoqIFVuaXQgdGVzdHMgY2FuIGFsc28gYmUgcnVuIGluIHRoZSBicm93c2VyDQogIDxodHRwczovL2dpdGh1Yi5jb20vYWpheG9yZy9hY2UvYmxvYi9tYXN0ZXIvbGliL2FjZS90ZXN0L3Rlc3RzLmh0bWw+DQoqIFNvZnQgd3JhcCBjYW4gYWRhcHQgdG8gdGhlIHdpZHRoIG9mIHRoZSBlZGl0b3IgKE1pa2UgUmF0Y2xpZmZlLCBKb2UgQ2hlbmcpDQoqIEFkZCBtaW5pbWFsIG5vZGUgc2VydmVyIHNlcnZlci5qcyB0byBydW4gdGhlIEFjZSBkZW1vIGluIENocm9tZQ0KKiBUaGUgdG9wIGxldmVsIGVkaXRvci5odG1sIGRlbW8gaGFzIGJlZW4gcmVuYW1lZCB0byBpbmRleC5odG1sDQoqIEJ1ZyBmaXhlcw0KICAtIEZpeGVkIGdvdG9MaW5lIHRvIGNvbnNpZGVyIHdyYXBwZWQgbGluZXMgd2hlbiBjYWxjdWxhdGluZyB3aGVyZSB0byBzY3JvbGwgdG8gKEphbWVzIEFsbGVuKQ0KICAtIEZpeGVkIGlzdWVzIHdoZW4gdGhlIGVkaXRvciB3YXMgc2Nyb2xsZWQgaW4gdGhlIHdlYiBwYWdlIChFcmljIEFsbGFtKQ0KICAtIEhpZ2hsaWdodGluZyBvZiBQeXRob24gc3RyaW5nIGxpdGVyYWxzDQogIC0gU3ludGF4IHJ1bGUgZm9yIFBIUCBjb21tZW50cw0KDQoyMDExLjAyLjA4LCBWZXJzaW9uIDAuMS41DQoNCiogQWRkIENvZmZlZXNjcmlwdCBNb2RlIChTYXRvc2hpIE11cmFrYW1pKQ0KKiBGaXggd29yZCB3cmFwIGJ1ZyAoSnVsaWFuIFZpZXJlY2spDQoqIEZpeCBwYWNrYWdlZCB2ZXJzaW9uIG9mIHRoZSBFY2xpcHNlIG1vZGUNCiogTG9hZGluZyBvZiB3b3JrZXJzIGlzIG1vcmUgcm9idXN0DQoqIEZpeCAiY2xpY2sgc2VsZWN0aW9uIg0KKiBBbGxvdyB0b2tpemluZyBlbXB0eSBsaW5lcyAoRGFuaWVsIEtyZWNoKQ0KKiBNYWtlIFBhZ2VVcC9Eb3duIGJlaGF2aW9yIG1vcmUgY29uc2lzdGVudCB3aXRoIG5hdGl2ZSBPUyAoSm9lIENoZW5nKQ0KDQoyMDExLjAyLjA0LCBWZXJzaW9uIDAuMS40DQoNCiogQWRkIEMvQysrIG1vZGUgY29udHJpYnV0ZWQgYnkgR2FzdMOzbiBLbGVpbWFuDQoqIEZpeCBleGNlcHRpb24gaW4ga2V5IGlucHV0DQoNCjIwMTEuMDIuMDQsIFZlcnNpb24gMC4xLjMNCg0KKiBMZXQgdGhlIHBhY2thZ2VkIHZlcnNpb24gcGxheSBuaWNlIHdpdGggcmVxdWlyZUpTDQoqIEFkZCBSdWJ5IG1vZGUgY29udHJpYnV0ZWQgYnkgU2hsb21vIFphbG1hbiBIZWlnaA0KKiBBZGQgSmF2YSBtb2RlIGNvbnRyaWJ1dGVkIGJ5IFRvbSBUYXNjaGUNCiogRml4IGFubm90YXRpb24gYnVnDQoqIENoYW5naW5nIGEgZG9jdW1lbnQgYWRkZWQgYSBuZXcgZW1wdHkgbGluZSBhdCB0aGUgZW5k]]></data>
	</file>
	<file>
	  <filename>/ace/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[TGljZW5zZWQgdW5kZXIgdGhlIHRyaS1saWNlbnNlIE1QTC9MR1BML0dQTC4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICBNT1pJTExBIFBVQkxJQyBMSUNFTlNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMS4xDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLQ0KDQoxLiBEZWZpbml0aW9ucy4NCg0KICAgICAxLjAuMS4gIkNvbW1lcmNpYWwgVXNlIiBtZWFucyBkaXN0cmlidXRpb24gb3Igb3RoZXJ3aXNlIG1ha2luZyB0aGUNCiAgICAgQ292ZXJlZCBDb2RlIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5Lg0KDQogICAgIDEuMS4gIkNvbnRyaWJ1dG9yIiBtZWFucyBlYWNoIGVudGl0eSB0aGF0IGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8NCiAgICAgdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuDQoNCiAgICAgMS4yLiAiQ29udHJpYnV0b3IgVmVyc2lvbiIgbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbA0KICAgICBDb2RlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYSBDb250cmlidXRvciwgYW5kIHRoZSBNb2RpZmljYXRpb25zDQogICAgIG1hZGUgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLg0KDQogICAgIDEuMy4gIkNvdmVyZWQgQ29kZSIgbWVhbnMgdGhlIE9yaWdpbmFsIENvZGUgb3IgTW9kaWZpY2F0aW9ucyBvciB0aGUNCiAgICAgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIENvZGUgYW5kIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZQ0KICAgICBpbmNsdWRpbmcgcG9ydGlvbnMgdGhlcmVvZi4NCg0KICAgICAxLjQuICJFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20iIG1lYW5zIGEgbWVjaGFuaXNtIGdlbmVyYWxseQ0KICAgICBhY2NlcHRlZCBpbiB0aGUgc29mdHdhcmUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGZvciB0aGUgZWxlY3Ryb25pYw0KICAgICB0cmFuc2ZlciBvZiBkYXRhLg0KDQogICAgIDEuNS4gIkV4ZWN1dGFibGUiIG1lYW5zIENvdmVyZWQgQ29kZSBpbiBhbnkgZm9ybSBvdGhlciB0aGFuIFNvdXJjZQ0KICAgICBDb2RlLg0KDQogICAgIDEuNi4gIkluaXRpYWwgRGV2ZWxvcGVyIiBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgaWRlbnRpZmllZA0KICAgICBhcyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW4gdGhlIFNvdXJjZSBDb2RlIG5vdGljZSByZXF1aXJlZCBieSBFeGhpYml0DQogICAgIEEuDQoNCiAgICAgMS43LiAiTGFyZ2VyIFdvcmsiIG1lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkIENvZGUgb3INCiAgICAgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuDQoNCiAgICAgMS44LiAiTGljZW5zZSIgbWVhbnMgdGhpcyBkb2N1bWVudC4NCg0KICAgICAxLjguMS4gIkxpY2Vuc2FibGUiIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZSBtYXhpbXVtDQogICAgIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbCBncmFudCBvcg0KICAgICBzdWJzZXF1ZW50bHkgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMgY29udmV5ZWQgaGVyZWluLg0KDQogICAgIDEuOS4gIk1vZGlmaWNhdGlvbnMiIG1lYW5zIGFueSBhZGRpdGlvbiB0byBvciBkZWxldGlvbiBmcm9tIHRoZQ0KICAgICBzdWJzdGFuY2Ugb3Igc3RydWN0dXJlIG9mIGVpdGhlciB0aGUgT3JpZ2luYWwgQ29kZSBvciBhbnkgcHJldmlvdXMNCiAgICAgTW9kaWZpY2F0aW9ucy4gV2hlbiBDb3ZlcmVkIENvZGUgaXMgcmVsZWFzZWQgYXMgYSBzZXJpZXMgb2YgZmlsZXMsIGENCiAgICAgTW9kaWZpY2F0aW9uIGlzOg0KICAgICAgICAgIEEuIEFueSBhZGRpdGlvbiB0byBvciBkZWxldGlvbiBmcm9tIHRoZSBjb250ZW50cyBvZiBhIGZpbGUNCiAgICAgICAgICBjb250YWluaW5nIE9yaWdpbmFsIENvZGUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9ucy4NCg0KICAgICAgICAgIEIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZSBPcmlnaW5hbCBDb2RlIG9yDQogICAgICAgICAgcHJldmlvdXMgTW9kaWZpY2F0aW9ucy4NCg0KICAgICAxLjEwLiAiT3JpZ2luYWwgQ29kZSIgbWVhbnMgU291cmNlIENvZGUgb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZQ0KICAgICB3aGljaCBpcyBkZXNjcmliZWQgaW4gdGhlIFNvdXJjZSBDb2RlIG5vdGljZSByZXF1aXJlZCBieSBFeGhpYml0IEEgYXMNCiAgICAgT3JpZ2luYWwgQ29kZSwgYW5kIHdoaWNoLCBhdCB0aGUgdGltZSBvZiBpdHMgcmVsZWFzZSB1bmRlciB0aGlzDQogICAgIExpY2Vuc2UgaXMgbm90IGFscmVhZHkgQ292ZXJlZCBDb2RlIGdvdmVybmVkIGJ5IHRoaXMgTGljZW5zZS4NCg0KICAgICAxLjEwLjEuICJQYXRlbnQgQ2xhaW1zIiBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQgb3INCiAgICAgaGVyZWFmdGVyIGFjcXVpcmVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLCAgbWV0aG9kLCBwcm9jZXNzLA0KICAgICBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuDQoNCiAgICAgMS4xMS4gIlNvdXJjZSBDb2RlIiBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIENvdmVyZWQgQ29kZSBmb3INCiAgICAgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQsIGluY2x1ZGluZyBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cw0KICAgICBhbnkgYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wNCiAgICAgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiBhbiBFeGVjdXRhYmxlLCBvciBzb3VyY2UgY29kZQ0KICAgICBkaWZmZXJlbnRpYWwgY29tcGFyaXNvbnMgYWdhaW5zdCBlaXRoZXIgdGhlIE9yaWdpbmFsIENvZGUgb3IgYW5vdGhlcg0KICAgICB3ZWxsIGtub3duLCBhdmFpbGFibGUgQ292ZXJlZCBDb2RlIG9mIHRoZSBDb250cmlidXRvcidzIGNob2ljZS4gVGhlDQogICAgIFNvdXJjZSBDb2RlIGNhbiBiZSBpbiBhIGNvbXByZXNzZWQgb3IgYXJjaGl2YWwgZm9ybSwgcHJvdmlkZWQgdGhlDQogICAgIGFwcHJvcHJpYXRlIGRlY29tcHJlc3Npb24gb3IgZGUtYXJjaGl2aW5nIHNvZnR3YXJlIGlzIHdpZGVseSBhdmFpbGFibGUNCiAgICAgZm9yIG5vIGNoYXJnZS4NCg0KICAgICAxLjEyLiAiWW91IiAob3IgIllvdXIiKSAgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eQ0KICAgICBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZiB0aGUgdGVybXMgb2YsIHRoaXMNCiAgICAgTGljZW5zZSBvciBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpc3N1ZWQgdW5kZXIgU2VjdGlvbiA2LjEuDQogICAgIEZvciBsZWdhbCBlbnRpdGllcywgIllvdSIgaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMNCiAgICAgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZg0KICAgICB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsDQogICAgIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieQ0KICAgICBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQNCiAgICAgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcyBvciBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoDQogICAgIGVudGl0eS4NCg0KMi4gU291cmNlIENvZGUgTGljZW5zZS4NCg0KICAgICAyLjEuIFRoZSBJbml0aWFsIERldmVsb3BlciBHcmFudC4NCiAgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLA0KICAgICBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5DQogICAgIGNsYWltczoNCiAgICAgICAgICAoYSkgIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yDQogICAgICAgICAgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IEluaXRpYWwgRGV2ZWxvcGVyIHRvIHVzZSwgcmVwcm9kdWNlLA0KICAgICAgICAgIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwNCiAgICAgICAgICBDb2RlIChvciBwb3J0aW9ucyB0aGVyZW9mKSB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywgYW5kL29yDQogICAgICAgICAgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQNCg0KICAgICAgICAgIChiKSB1bmRlciBQYXRlbnRzIENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcgb3INCiAgICAgICAgICBzZWxsaW5nIG9mIE9yaWdpbmFsIENvZGUsIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBwcmFjdGljZSwNCiAgICAgICAgICBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZiB0aGUNCiAgICAgICAgICBPcmlnaW5hbCBDb2RlIChvciBwb3J0aW9ucyB0aGVyZW9mKS4NCg0KICAgICAgICAgIChjKSB0aGUgbGljZW5zZXMgZ3JhbnRlZCBpbiB0aGlzIFNlY3Rpb24gMi4xKGEpIGFuZCAoYikgYXJlDQogICAgICAgICAgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIEluaXRpYWwgRGV2ZWxvcGVyIGZpcnN0IGRpc3RyaWJ1dGVzDQogICAgICAgICAgT3JpZ2luYWwgQ29kZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLg0KDQogICAgICAgICAgKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMShiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMNCiAgICAgICAgICBncmFudGVkOiAxKSBmb3IgY29kZSB0aGF0IFlvdSBkZWxldGUgZnJvbSB0aGUgT3JpZ2luYWwgQ29kZTsgMikNCiAgICAgICAgICBzZXBhcmF0ZSBmcm9tIHRoZSBPcmlnaW5hbCBDb2RlOyAgb3IgMykgZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkDQogICAgICAgICAgYnk6IGkpIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsIENvZGUgb3IgaWkpIHRoZQ0KICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4NCg0KICAgICAyLjIuIENvbnRyaWJ1dG9yIEdyYW50Lg0KICAgICBTdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIGVhY2ggQ29udHJpYnV0b3INCiAgICAgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZQ0KDQogICAgICAgICAgKGEpICB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvcg0KICAgICAgICAgIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBDb250cmlidXRvciwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwNCiAgICAgICAgICBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zDQogICAgICAgICAgY3JlYXRlZCBieSBzdWNoIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSBlaXRoZXIgb24gYW4NCiAgICAgICAgICB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzIENvdmVyZWQgQ29kZQ0KICAgICAgICAgIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZA0KDQogICAgICAgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nLCBvcg0KICAgICAgICAgIHNlbGxpbmcgb2YgIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIGVpdGhlciBhbG9uZQ0KICAgICAgICAgIGFuZC9vciBpbiBjb21iaW5hdGlvbiB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucw0KICAgICAgICAgIG9mIHN1Y2ggY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBoYXZlDQogICAgICAgICAgbWFkZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mOiAxKSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdA0KICAgICAgICAgIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKTsgYW5kIDIpIHRoZSBjb21iaW5hdGlvbiBvZg0KICAgICAgICAgIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yDQogICAgICAgICAgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbikuDQoNCiAgICAgICAgICAoYykgdGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4yKGEpIGFuZCAyLjIoYikgYXJlDQogICAgICAgICAgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0IG1ha2VzIENvbW1lcmNpYWwgVXNlIG9mDQogICAgICAgICAgdGhlIENvdmVyZWQgQ29kZS4NCg0KICAgICAgICAgIChkKSAgICBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjIoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzDQogICAgICAgICAgZ3JhbnRlZDogMSkgZm9yIGFueSBjb2RlIHRoYXQgQ29udHJpYnV0b3IgaGFzIGRlbGV0ZWQgZnJvbSB0aGUNCiAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uOyAyKSAgc2VwYXJhdGUgZnJvbSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbjsNCiAgICAgICAgICAzKSAgZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiBpKSB0aGlyZCBwYXJ0eSBtb2RpZmljYXRpb25zIG9mDQogICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbiBvciBpaSkgIHRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUNCiAgICAgICAgICBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggb3RoZXIgc29mdHdhcmUgIChleGNlcHQgYXMgcGFydCBvZiB0aGUNCiAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciA0KSB1bmRlciBQYXRlbnQgQ2xhaW1zDQogICAgICAgICAgaW5mcmluZ2VkIGJ5IENvdmVyZWQgQ29kZSBpbiB0aGUgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkNCiAgICAgICAgICB0aGF0IENvbnRyaWJ1dG9yLg0KDQozLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuDQoNCiAgICAgMy4xLiBBcHBsaWNhdGlvbiBvZiBMaWNlbnNlLg0KICAgICBUaGUgTW9kaWZpY2F0aW9ucyB3aGljaCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIGFyZQ0KICAgICBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uDQogICAgIFNlY3Rpb24gMi4yLiBUaGUgU291cmNlIENvZGUgdmVyc2lvbiBvZiBDb3ZlcmVkIENvZGUgbWF5IGJlDQogICAgIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciBhIGZ1dHVyZSB2ZXJzaW9uDQogICAgIG9mIHRoaXMgTGljZW5zZSByZWxlYXNlZCB1bmRlciBTZWN0aW9uIDYuMSwgYW5kIFlvdSBtdXN0IGluY2x1ZGUgYQ0KICAgICBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5IGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlIFlvdQ0KICAgICBkaXN0cmlidXRlLiBZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBTb3VyY2UgQ29kZQ0KICAgICB2ZXJzaW9uIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMNCiAgICAgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50cycgcmlnaHRzIGhlcmV1bmRlci4gSG93ZXZlciwgWW91IG1heSBpbmNsdWRlDQogICAgIGFuIGFkZGl0aW9uYWwgZG9jdW1lbnQgb2ZmZXJpbmcgdGhlIGFkZGl0aW9uYWwgcmlnaHRzIGRlc2NyaWJlZCBpbg0KICAgICBTZWN0aW9uIDMuNS4NCg0KICAgICAzLjIuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4NCiAgICAgQW55IE1vZGlmaWNhdGlvbiB3aGljaCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIG11c3QgYmUNCiAgICAgbWFkZSBhdmFpbGFibGUgaW4gU291cmNlIENvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlDQogICAgIGVpdGhlciBvbiB0aGUgc2FtZSBtZWRpYSBhcyBhbiBFeGVjdXRhYmxlIHZlcnNpb24gb3IgdmlhIGFuIGFjY2VwdGVkDQogICAgIEVsZWN0cm9uaWMgRGlzdHJpYnV0aW9uIE1lY2hhbmlzbSB0byBhbnlvbmUgdG8gd2hvbSB5b3UgbWFkZSBhbg0KICAgICBFeGVjdXRhYmxlIHZlcnNpb24gYXZhaWxhYmxlOyBhbmQgaWYgbWFkZSBhdmFpbGFibGUgdmlhIEVsZWN0cm9uaWMNCiAgICAgRGlzdHJpYnV0aW9uIE1lY2hhbmlzbSwgbXVzdCByZW1haW4gYXZhaWxhYmxlIGZvciBhdCBsZWFzdCB0d2VsdmUgKDEyKQ0KICAgICBtb250aHMgYWZ0ZXIgdGhlIGRhdGUgaXQgaW5pdGlhbGx5IGJlY2FtZSBhdmFpbGFibGUsIG9yIGF0IGxlYXN0IHNpeA0KICAgICAoNikgbW9udGhzIGFmdGVyIGEgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoYXQgcGFydGljdWxhciBNb2RpZmljYXRpb24NCiAgICAgaGFzIGJlZW4gbWFkZSBhdmFpbGFibGUgdG8gc3VjaCByZWNpcGllbnRzLiBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvcg0KICAgICBlbnN1cmluZyB0aGF0IHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIHJlbWFpbnMgYXZhaWxhYmxlIGV2ZW4gaWYgdGhlDQogICAgIEVsZWN0cm9uaWMgRGlzdHJpYnV0aW9uIE1lY2hhbmlzbSBpcyBtYWludGFpbmVkIGJ5IGEgdGhpcmQgcGFydHkuDQoNCiAgICAgMy4zLiBEZXNjcmlwdGlvbiBvZiBNb2RpZmljYXRpb25zLg0KICAgICBZb3UgbXVzdCBjYXVzZSBhbGwgQ292ZXJlZCBDb2RlIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIHRvIGNvbnRhaW4gYQ0KICAgICBmaWxlIGRvY3VtZW50aW5nIHRoZSBjaGFuZ2VzIFlvdSBtYWRlIHRvIGNyZWF0ZSB0aGF0IENvdmVyZWQgQ29kZSBhbmQNCiAgICAgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gWW91IG11c3QgaW5jbHVkZSBhIHByb21pbmVudCBzdGF0ZW1lbnQgdGhhdA0KICAgICB0aGUgTW9kaWZpY2F0aW9uIGlzIGRlcml2ZWQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIGZyb20gT3JpZ2luYWwNCiAgICAgQ29kZSBwcm92aWRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGluY2x1ZGluZyB0aGUgbmFtZSBvZiB0aGUNCiAgICAgSW5pdGlhbCBEZXZlbG9wZXIgaW4gKGEpIHRoZSBTb3VyY2UgQ29kZSwgYW5kIChiKSBpbiBhbnkgbm90aWNlIGluIGFuDQogICAgIEV4ZWN1dGFibGUgdmVyc2lvbiBvciByZWxhdGVkIGRvY3VtZW50YXRpb24gaW4gd2hpY2ggWW91IGRlc2NyaWJlIHRoZQ0KICAgICBvcmlnaW4gb3Igb3duZXJzaGlwIG9mIHRoZSBDb3ZlcmVkIENvZGUuDQoNCiAgICAgMy40LiBJbnRlbGxlY3R1YWwgUHJvcGVydHkgTWF0dGVycw0KICAgICAgICAgIChhKSBUaGlyZCBQYXJ0eSBDbGFpbXMuDQogICAgICAgICAgSWYgQ29udHJpYnV0b3IgaGFzIGtub3dsZWRnZSB0aGF0IGEgbGljZW5zZSB1bmRlciBhIHRoaXJkIHBhcnR5J3MNCiAgICAgICAgICBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGlzIHJlcXVpcmVkIHRvIGV4ZXJjaXNlIHRoZSByaWdodHMNCiAgICAgICAgICBncmFudGVkIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdW5kZXIgU2VjdGlvbnMgMi4xIG9yIDIuMiwNCiAgICAgICAgICBDb250cmlidXRvciBtdXN0IGluY2x1ZGUgYSB0ZXh0IGZpbGUgd2l0aCB0aGUgU291cmNlIENvZGUNCiAgICAgICAgICBkaXN0cmlidXRpb24gdGl0bGVkICJMRUdBTCIgd2hpY2ggZGVzY3JpYmVzIHRoZSBjbGFpbSBhbmQgdGhlDQogICAgICAgICAgcGFydHkgbWFraW5nIHRoZSBjbGFpbSBpbiBzdWZmaWNpZW50IGRldGFpbCB0aGF0IGEgcmVjaXBpZW50IHdpbGwNCiAgICAgICAgICBrbm93IHdob20gdG8gY29udGFjdC4gSWYgQ29udHJpYnV0b3Igb2J0YWlucyBzdWNoIGtub3dsZWRnZSBhZnRlcg0KICAgICAgICAgIHRoZSBNb2RpZmljYXRpb24gaXMgbWFkZSBhdmFpbGFibGUgYXMgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy4yLA0KICAgICAgICAgIENvbnRyaWJ1dG9yIHNoYWxsIHByb21wdGx5IG1vZGlmeSB0aGUgTEVHQUwgZmlsZSBpbiBhbGwgY29waWVzDQogICAgICAgICAgQ29udHJpYnV0b3IgbWFrZXMgYXZhaWxhYmxlIHRoZXJlYWZ0ZXIgYW5kIHNoYWxsIHRha2Ugb3RoZXIgc3RlcHMNCiAgICAgICAgICAoc3VjaCBhcyBub3RpZnlpbmcgYXBwcm9wcmlhdGUgbWFpbGluZyBsaXN0cyBvciBuZXdzZ3JvdXBzKQ0KICAgICAgICAgIHJlYXNvbmFibHkgY2FsY3VsYXRlZCB0byBpbmZvcm0gdGhvc2Ugd2hvIHJlY2VpdmVkIHRoZSBDb3ZlcmVkDQogICAgICAgICAgQ29kZSB0aGF0IG5ldyBrbm93bGVkZ2UgaGFzIGJlZW4gb2J0YWluZWQuDQoNCiAgICAgICAgICAoYikgQ29udHJpYnV0b3IgQVBJcy4NCiAgICAgICAgICBJZiBDb250cmlidXRvcidzIE1vZGlmaWNhdGlvbnMgaW5jbHVkZSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZw0KICAgICAgICAgIGludGVyZmFjZSBhbmQgQ29udHJpYnV0b3IgaGFzIGtub3dsZWRnZSBvZiBwYXRlbnQgbGljZW5zZXMgd2hpY2gNCiAgICAgICAgICBhcmUgcmVhc29uYWJseSBuZWNlc3NhcnkgdG8gaW1wbGVtZW50IHRoYXQgQVBJLCBDb250cmlidXRvciBtdXN0DQogICAgICAgICAgYWxzbyBpbmNsdWRlIHRoaXMgaW5mb3JtYXRpb24gaW4gdGhlIExFR0FMIGZpbGUuDQoNCiAgICAgICAgICAgICAgIChjKSAgICBSZXByZXNlbnRhdGlvbnMuDQogICAgICAgICAgQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0LCBleGNlcHQgYXMgZGlzY2xvc2VkIHB1cnN1YW50IHRvDQogICAgICAgICAgU2VjdGlvbiAzLjQoYSkgYWJvdmUsIENvbnRyaWJ1dG9yIGJlbGlldmVzIHRoYXQgQ29udHJpYnV0b3Incw0KICAgICAgICAgIE1vZGlmaWNhdGlvbnMgYXJlIENvbnRyaWJ1dG9yJ3Mgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yDQogICAgICAgICAgQ29udHJpYnV0b3IgaGFzIHN1ZmZpY2llbnQgcmlnaHRzIHRvIGdyYW50IHRoZSByaWdodHMgY29udmV5ZWQgYnkNCiAgICAgICAgICB0aGlzIExpY2Vuc2UuDQoNCiAgICAgMy41LiBSZXF1aXJlZCBOb3RpY2VzLg0KICAgICBZb3UgbXVzdCBkdXBsaWNhdGUgdGhlIG5vdGljZSBpbiBFeGhpYml0IEEgaW4gZWFjaCBmaWxlIG9mIHRoZSBTb3VyY2UNCiAgICAgQ29kZS4gIElmIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBwdXQgc3VjaCBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyIFNvdXJjZQ0KICAgICBDb2RlIGZpbGUgZHVlIHRvIGl0cyBzdHJ1Y3R1cmUsIHRoZW4gWW91IG11c3QgaW5jbHVkZSBzdWNoIG5vdGljZSBpbiBhDQogICAgIGxvY2F0aW9uIChzdWNoIGFzIGEgcmVsZXZhbnQgZGlyZWN0b3J5KSB3aGVyZSBhIHVzZXIgd291bGQgYmUgbGlrZWx5DQogICAgIHRvIGxvb2sgZm9yIHN1Y2ggYSBub3RpY2UuICBJZiBZb3UgY3JlYXRlZCBvbmUgb3IgbW9yZSBNb2RpZmljYXRpb24ocykNCiAgICAgWW91IG1heSBhZGQgeW91ciBuYW1lIGFzIGEgQ29udHJpYnV0b3IgdG8gdGhlIG5vdGljZSBkZXNjcmliZWQgaW4NCiAgICAgRXhoaWJpdCBBLiAgWW91IG11c3QgYWxzbyBkdXBsaWNhdGUgdGhpcyBMaWNlbnNlIGluIGFueSBkb2N1bWVudGF0aW9uDQogICAgIGZvciB0aGUgU291cmNlIENvZGUgd2hlcmUgWW91IGRlc2NyaWJlIHJlY2lwaWVudHMnIHJpZ2h0cyBvciBvd25lcnNoaXANCiAgICAgcmlnaHRzIHJlbGF0aW5nIHRvIENvdmVyZWQgQ29kZS4gIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8NCiAgICAgY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkNCiAgICAgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIENvZGUuIEhvd2V2ZXIsIFlvdQ0KICAgICBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24gYmVoYWxmIG9mIHRoZSBJbml0aWFsDQogICAgIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGFuDQogICAgIGFueSBzdWNoIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMNCiAgICAgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbA0KICAgICBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZQ0KICAgICBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIHdhcnJhbnR5LA0KICAgICBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4NCg0KICAgICAzLjYuIERpc3RyaWJ1dGlvbiBvZiBFeGVjdXRhYmxlIFZlcnNpb25zLg0KICAgICBZb3UgbWF5IGRpc3RyaWJ1dGUgQ292ZXJlZCBDb2RlIGluIEV4ZWN1dGFibGUgZm9ybSBvbmx5IGlmIHRoZQ0KICAgICByZXF1aXJlbWVudHMgb2YgU2VjdGlvbiAzLjEtMy41IGhhdmUgYmVlbiBtZXQgZm9yIHRoYXQgQ292ZXJlZCBDb2RlLA0KICAgICBhbmQgaWYgWW91IGluY2x1ZGUgYSBub3RpY2Ugc3RhdGluZyB0aGF0IHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIG9mDQogICAgIHRoZSBDb3ZlcmVkIENvZGUgaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsDQogICAgIGluY2x1ZGluZyBhIGRlc2NyaXB0aW9uIG9mIGhvdyBhbmQgd2hlcmUgWW91IGhhdmUgZnVsZmlsbGVkIHRoZQ0KICAgICBvYmxpZ2F0aW9ucyBvZiBTZWN0aW9uIDMuMi4gVGhlIG5vdGljZSBtdXN0IGJlIGNvbnNwaWN1b3VzbHkgaW5jbHVkZWQNCiAgICAgaW4gYW55IG5vdGljZSBpbiBhbiBFeGVjdXRhYmxlIHZlcnNpb24sIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiBvcg0KICAgICBjb2xsYXRlcmFsIGluIHdoaWNoIFlvdSBkZXNjcmliZSByZWNpcGllbnRzJyByaWdodHMgcmVsYXRpbmcgdG8gdGhlDQogICAgIENvdmVyZWQgQ29kZS4gWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gb2YgQ292ZXJlZA0KICAgICBDb2RlIG9yIG93bmVyc2hpcCByaWdodHMgdW5kZXIgYSBsaWNlbnNlIG9mIFlvdXIgY2hvaWNlLCB3aGljaCBtYXkNCiAgICAgY29udGFpbiB0ZXJtcyBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbg0KICAgICBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgdGhhdCB0aGUgbGljZW5zZSBmb3IgdGhlDQogICAgIEV4ZWN1dGFibGUgdmVyc2lvbiBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZSByZWNpcGllbnQncw0KICAgICByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIHZlcnNpb24gZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzDQogICAgIExpY2Vuc2UuIElmIFlvdSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gdW5kZXIgYSBkaWZmZXJlbnQNCiAgICAgbGljZW5zZSBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgdGVybXMgd2hpY2ggZGlmZmVyDQogICAgIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsDQogICAgIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZQ0KICAgICBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkNCiAgICAgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2gNCiAgICAgdGVybXMgWW91IG9mZmVyLg0KDQogICAgIDMuNy4gTGFyZ2VyIFdvcmtzLg0KICAgICBZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIENvZGUgd2l0aCBvdGhlciBjb2RlDQogICAgIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXINCiAgICAgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoIGEgY2FzZSwgWW91IG11c3QgbWFrZSBzdXJlIHRoZQ0KICAgICByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIENvZGUuDQoNCjQuIEluYWJpbGl0eSB0byBDb21wbHkgRHVlIHRvIFN0YXR1dGUgb3IgUmVndWxhdGlvbi4NCg0KICAgICBJZiBpdCBpcyBpbXBvc3NpYmxlIGZvciBZb3UgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSB0ZXJtcyBvZiB0aGlzDQogICAgIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvIHNvbWUgb3IgYWxsIG9mIHRoZSBDb3ZlcmVkIENvZGUgZHVlIHRvDQogICAgIHN0YXR1dGUsIGp1ZGljaWFsIG9yZGVyLCBvciByZWd1bGF0aW9uIHRoZW4gWW91IG11c3Q6IChhKSBjb21wbHkgd2l0aA0KICAgICB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZTsgYW5kIChiKQ0KICAgICBkZXNjcmliZSB0aGUgbGltaXRhdGlvbnMgYW5kIHRoZSBjb2RlIHRoZXkgYWZmZWN0LiBTdWNoIGRlc2NyaXB0aW9uDQogICAgIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIExFR0FMIGZpbGUgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy40IGFuZCBtdXN0DQogICAgIGJlIGluY2x1ZGVkIHdpdGggYWxsIGRpc3RyaWJ1dGlvbnMgb2YgdGhlIFNvdXJjZSBDb2RlLiBFeGNlcHQgdG8gdGhlDQogICAgIGV4dGVudCBwcm9oaWJpdGVkIGJ5IHN0YXR1dGUgb3IgcmVndWxhdGlvbiwgc3VjaCBkZXNjcmlwdGlvbiBtdXN0IGJlDQogICAgIHN1ZmZpY2llbnRseSBkZXRhaWxlZCBmb3IgYSByZWNpcGllbnQgb2Ygb3JkaW5hcnkgc2tpbGwgdG8gYmUgYWJsZSB0bw0KICAgICB1bmRlcnN0YW5kIGl0Lg0KDQo1LiBBcHBsaWNhdGlvbiBvZiB0aGlzIExpY2Vuc2UuDQoNCiAgICAgVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gY29kZSB0byB3aGljaCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaGFzDQogICAgIGF0dGFjaGVkIHRoZSBub3RpY2UgaW4gRXhoaWJpdCBBIGFuZCB0byByZWxhdGVkIENvdmVyZWQgQ29kZS4NCg0KNi4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuDQoNCiAgICAgNi4xLiBOZXcgVmVyc2lvbnMuDQogICAgIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uICgiTmV0c2NhcGUiKSBtYXkgcHVibGlzaCByZXZpc2VkDQogICAgIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbg0KICAgICB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuDQoNCiAgICAgNi4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLg0KICAgICBPbmNlIENvdmVyZWQgQ29kZSBoYXMgYmVlbiBwdWJsaXNoZWQgdW5kZXIgYSBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgdGhlDQogICAgIExpY2Vuc2UsIFlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhhdA0KICAgICB2ZXJzaW9uLiBZb3UgbWF5IGFsc28gY2hvb3NlIHRvIHVzZSBzdWNoIENvdmVyZWQgQ29kZSB1bmRlciB0aGUgdGVybXMNCiAgICAgb2YgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSBwdWJsaXNoZWQgYnkgTmV0c2NhcGUuIE5vIG9uZQ0KICAgICBvdGhlciB0aGFuIE5ldHNjYXBlIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoZSB0ZXJtcyBhcHBsaWNhYmxlIHRvDQogICAgIENvdmVyZWQgQ29kZSBjcmVhdGVkIHVuZGVyIHRoaXMgTGljZW5zZS4NCg0KICAgICA2LjMuIERlcml2YXRpdmUgV29ya3MuDQogICAgIElmIFlvdSBjcmVhdGUgb3IgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgKHdoaWNoIHlvdSBtYXkNCiAgICAgb25seSBkbyBpbiBvcmRlciB0byBhcHBseSBpdCB0byBjb2RlIHdoaWNoIGlzIG5vdCBhbHJlYWR5IENvdmVyZWQgQ29kZQ0KICAgICBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UpLCBZb3UgbXVzdCAoYSkgcmVuYW1lIFlvdXIgbGljZW5zZSBzbyB0aGF0DQogICAgIHRoZSBwaHJhc2VzICJNb3ppbGxhIiwgIk1PWklMTEFQTCIsICJNT1pQTCIsICJOZXRzY2FwZSIsDQogICAgICJNUEwiLCAiTlBMIiBvciBhbnkgY29uZnVzaW5nbHkgc2ltaWxhciBwaHJhc2UgZG8gbm90IGFwcGVhciBpbiB5b3VyDQogICAgIGxpY2Vuc2UgKGV4Y2VwdCB0byBub3RlIHRoYXQgeW91ciBsaWNlbnNlIGRpZmZlcnMgZnJvbSB0aGlzIExpY2Vuc2UpDQogICAgIGFuZCAoYikgb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdCBZb3VyIHZlcnNpb24gb2YgdGhlIGxpY2Vuc2UNCiAgICAgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgYW5kDQogICAgIE5ldHNjYXBlIFB1YmxpYyBMaWNlbnNlLiAoRmlsbGluZyBpbiB0aGUgbmFtZSBvZiB0aGUgSW5pdGlhbA0KICAgICBEZXZlbG9wZXIsIE9yaWdpbmFsIENvZGUgb3IgQ29udHJpYnV0b3IgaW4gdGhlIG5vdGljZSBkZXNjcmliZWQgaW4NCiAgICAgRXhoaWJpdCBBIHNoYWxsIG5vdCBvZiB0aGVtc2VsdmVzIGJlIGRlZW1lZCB0byBiZSBtb2RpZmljYXRpb25zIG9mDQogICAgIHRoaXMgTGljZW5zZS4pDQoNCjcuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuDQoNCiAgICAgQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLA0KICAgICBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywNCiAgICAgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GDQogICAgIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4NCiAgICAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRCBDT0RFDQogICAgIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsDQogICAgIFlPVSAoTk9UIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUNCiAgICAgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUg0KICAgICBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRg0KICAgICBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTIERJU0NMQUlNRVIuDQoNCjguIFRFUk1JTkFUSU9OLg0KDQogICAgIDguMS4gIFRoaXMgTGljZW5zZSBhbmQgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmV1bmRlciB3aWxsIHRlcm1pbmF0ZQ0KICAgICBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlDQogICAgIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mIGJlY29taW5nIGF3YXJlIG9mIHRoZSBicmVhY2guIEFsbA0KICAgICBzdWJsaWNlbnNlcyB0byB0aGUgQ292ZXJlZCBDb2RlIHdoaWNoIGFyZSBwcm9wZXJseSBncmFudGVkIHNoYWxsDQogICAgIHN1cnZpdmUgYW55IHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZS4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXINCiAgICAgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UNCiAgICAgc2hhbGwgc3Vydml2ZS4NCg0KICAgICA4LjIuICBJZiBZb3UgaW5pdGlhdGUgbGl0aWdhdGlvbiBieSBhc3NlcnRpbmcgYSBwYXRlbnQgaW5mcmluZ2VtZW50DQogICAgIGNsYWltIChleGNsdWRpbmcgZGVjbGF0b3J5IGp1ZGdtZW50IGFjdGlvbnMpIGFnYWluc3QgSW5pdGlhbCBEZXZlbG9wZXINCiAgICAgb3IgYSBDb250cmlidXRvciAodGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yIGFnYWluc3Qgd2hvbQ0KICAgICBZb3UgZmlsZSBzdWNoIGFjdGlvbiBpcyByZWZlcnJlZCB0byBhcyAiUGFydGljaXBhbnQiKSAgYWxsZWdpbmcgdGhhdDoNCg0KICAgICAoYSkgIHN1Y2ggUGFydGljaXBhbnQncyBDb250cmlidXRvciBWZXJzaW9uIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkNCiAgICAgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgYnkgc3VjaA0KICAgICBQYXJ0aWNpcGFudCB0byBZb3UgdW5kZXIgU2VjdGlvbnMgMi4xIGFuZC9vciAyLjIgb2YgdGhpcyBMaWNlbnNlDQogICAgIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQgdGVybWluYXRlIHByb3NwZWN0aXZlbHksDQogICAgIHVubGVzcyBpZiB3aXRoaW4gNjAgZGF5cyBhZnRlciByZWNlaXB0IG9mIG5vdGljZSBZb3UgZWl0aGVyOiAoaSkNCiAgICAgYWdyZWUgaW4gd3JpdGluZyB0byBwYXkgUGFydGljaXBhbnQgYSBtdXR1YWxseSBhZ3JlZWFibGUgcmVhc29uYWJsZQ0KICAgICByb3lhbHR5IGZvciBZb3VyIHBhc3QgYW5kIGZ1dHVyZSB1c2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHN1Y2gNCiAgICAgUGFydGljaXBhbnQsIG9yIChpaSkgd2l0aGRyYXcgWW91ciBsaXRpZ2F0aW9uIGNsYWltIHdpdGggcmVzcGVjdCB0bw0KICAgICB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbiBhZ2FpbnN0IHN1Y2ggUGFydGljaXBhbnQuICBJZiB3aXRoaW4gNjAgZGF5cw0KICAgICBvZiBub3RpY2UsIGEgcmVhc29uYWJsZSByb3lhbHR5IGFuZCBwYXltZW50IGFycmFuZ2VtZW50IGFyZSBub3QNCiAgICAgbXV0dWFsbHkgYWdyZWVkIHVwb24gaW4gd3JpdGluZyBieSB0aGUgcGFydGllcyBvciB0aGUgbGl0aWdhdGlvbiBjbGFpbQ0KICAgICBpcyBub3Qgd2l0aGRyYXduLCB0aGUgcmlnaHRzIGdyYW50ZWQgYnkgUGFydGljaXBhbnQgdG8gWW91IHVuZGVyDQogICAgIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIGF0IHRoZSBleHBpcmF0aW9uIG9mDQogICAgIHRoZSA2MCBkYXkgbm90aWNlIHBlcmlvZCBzcGVjaWZpZWQgYWJvdmUuDQoNCiAgICAgKGIpICBhbnkgc29mdHdhcmUsIGhhcmR3YXJlLCBvciBkZXZpY2UsIG90aGVyIHRoYW4gc3VjaCBQYXJ0aWNpcGFudCdzDQogICAgIENvbnRyaWJ1dG9yIFZlcnNpb24sIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4NCiAgICAgYW55IHJpZ2h0cyBncmFudGVkIHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50IHVuZGVyIFNlY3Rpb25zIDIuMShiKQ0KICAgICBhbmQgMi4yKGIpIGFyZSByZXZva2VkIGVmZmVjdGl2ZSBhcyBvZiB0aGUgZGF0ZSBZb3UgZmlyc3QgbWFkZSwgdXNlZCwNCiAgICAgc29sZCwgZGlzdHJpYnV0ZWQsIG9yIGhhZCBtYWRlLCBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdA0KICAgICBQYXJ0aWNpcGFudC4NCg0KICAgICA4LjMuICBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSBhZ2FpbnN0IFBhcnRpY2lwYW50DQogICAgIGFsbGVnaW5nIHRoYXQgc3VjaCBQYXJ0aWNpcGFudCdzIENvbnRyaWJ1dG9yIFZlcnNpb24gZGlyZWN0bHkgb3INCiAgICAgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55IHBhdGVudCB3aGVyZSBzdWNoIGNsYWltIGlzIHJlc29sdmVkIChzdWNoIGFzDQogICAgIGJ5IGxpY2Vuc2Ugb3Igc2V0dGxlbWVudCkgcHJpb3IgdG8gdGhlIGluaXRpYXRpb24gb2YgcGF0ZW50DQogICAgIGluZnJpbmdlbWVudCBsaXRpZ2F0aW9uLCB0aGVuIHRoZSByZWFzb25hYmxlIHZhbHVlIG9mIHRoZSBsaWNlbnNlcw0KICAgICBncmFudGVkIGJ5IHN1Y2ggUGFydGljaXBhbnQgdW5kZXIgU2VjdGlvbnMgMi4xIG9yIDIuMiBzaGFsbCBiZSB0YWtlbg0KICAgICBpbnRvIGFjY291bnQgaW4gZGV0ZXJtaW5pbmcgdGhlIGFtb3VudCBvciB2YWx1ZSBvZiBhbnkgcGF5bWVudCBvcg0KICAgICBsaWNlbnNlLg0KDQogICAgIDguNC4gIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9ucyA4LjEgb3IgOC4yIGFib3ZlLA0KICAgICBhbGwgZW5kIHVzZXIgbGljZW5zZSBhZ3JlZW1lbnRzIChleGNsdWRpbmcgZGlzdHJpYnV0b3JzIGFuZCByZXNlbGxlcnMpDQogICAgIHdoaWNoIGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXINCiAgICAgcHJpb3IgdG8gdGVybWluYXRpb24gc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4NCg0KOS4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuDQoNCiAgICAgVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQNCiAgICAgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUgSU5JVElBTA0KICAgICBERVZFTE9QRVIsIEFOWSBPVEhFUiBDT05UUklCVVRPUiwgT1IgQU5ZIERJU1RSSUJVVE9SIE9GIENPVkVSRUQgQ09ERSwNCiAgICAgT1IgQU5ZIFNVUFBMSUVSIE9GIEFOWSBPRiBTVUNIIFBBUlRJRVMsIEJFIExJQUJMRSBUTyBBTlkgUEVSU09OIEZPUg0KICAgICBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkNCiAgICAgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBEQU1BR0VTIEZPUiBMT1NTIE9GIEdPT0RXSUxMLA0KICAgICBXT1JLIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUg0KICAgICBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVODQogICAgIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRg0KICAgICBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwgSU5KVVJZDQogICAgIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFknUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcNCiAgICAgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPIE5PVCBBTExPVyBUSEUNCiAgICAgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIFNPDQogICAgIFRISVMgRVhDTFVTSU9OIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLg0KDQoxMC4gVS5TLiBHT1ZFUk5NRU5UIEVORCBVU0VSUy4NCg0KICAgICBUaGUgQ292ZXJlZCBDb2RlIGlzIGEgImNvbW1lcmNpYWwgaXRlbSwiIGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGluDQogICAgIDQ4IEMuRi5SLiAyLjEwMSAoT2N0LiAxOTk1KSwgY29uc2lzdGluZyBvZiAiY29tbWVyY2lhbCBjb21wdXRlcg0KICAgICBzb2Z0d2FyZSIgYW5kICJjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIGRvY3VtZW50YXRpb24sIiBhcyBzdWNoDQogICAgIHRlcm1zIGFyZSB1c2VkIGluIDQ4IEMuRi5SLiAxMi4yMTIgKFNlcHQuIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDgNCiAgICAgQy5GLlIuIDEyLjIxMiBhbmQgNDggQy5GLlIuIDIyNy43MjAyLTEgdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLA0KICAgICBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycyBhY3F1aXJlIENvdmVyZWQgQ29kZSB3aXRoIG9ubHkgdGhvc2UNCiAgICAgcmlnaHRzIHNldCBmb3J0aCBoZXJlaW4uDQoNCjExLiBNSVNDRUxMQU5FT1VTLg0KDQogICAgIFRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0DQogICAgIG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUNCiAgICAgdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUgZXh0ZW50DQogICAgIG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUgZ292ZXJuZWQgYnkNCiAgICAgQ2FsaWZvcm5pYSBsYXcgcHJvdmlzaW9ucyAoZXhjZXB0IHRvIHRoZSBleHRlbnQgYXBwbGljYWJsZSBsYXcsIGlmDQogICAgIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIGl0cyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4NCiAgICAgV2l0aCByZXNwZWN0IHRvIGRpc3B1dGVzIGluIHdoaWNoIGF0IGxlYXN0IG9uZSBwYXJ0eSBpcyBhIGNpdGl6ZW4gb2YsDQogICAgIG9yIGFuIGVudGl0eSBjaGFydGVyZWQgb3IgcmVnaXN0ZXJlZCB0byBkbyBidXNpbmVzcyBpbiB0aGUgVW5pdGVkDQogICAgIFN0YXRlcyBvZiBBbWVyaWNhLCBhbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUNCiAgICAgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBGZWRlcmFsIENvdXJ0cyBvZiB0aGUgTm9ydGhlcm4NCiAgICAgRGlzdHJpY3Qgb2YgQ2FsaWZvcm5pYSwgd2l0aCB2ZW51ZSBseWluZyBpbiBTYW50YSBDbGFyYSBDb3VudHksDQogICAgIENhbGlmb3JuaWEsIHdpdGggdGhlIGxvc2luZyBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZw0KICAgICB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0IGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5cycgZmVlcyBhbmQNCiAgICAgZXhwZW5zZXMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbg0KICAgICBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLg0KICAgICBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdA0KICAgICBzaGFsbCBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcw0KICAgICBMaWNlbnNlLg0KDQoxMi4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4NCg0KICAgICBBcyBiZXR3ZWVuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCB0aGUgQ29udHJpYnV0b3JzLCBlYWNoIHBhcnR5IGlzDQogICAgIHJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwNCiAgICAgb3V0IG9mIGl0cyB1dGlsaXphdGlvbiBvZiByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBZb3UgYWdyZWUgdG8NCiAgICAgd29yayB3aXRoIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBDb250cmlidXRvcnMgdG8gZGlzdHJpYnV0ZSBzdWNoDQogICAgIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZyBoZXJlaW4gaXMgaW50ZW5kZWQgb3INCiAgICAgc2hhbGwgYmUgZGVlbWVkIHRvIGNvbnN0aXR1dGUgYW55IGFkbWlzc2lvbiBvZiBsaWFiaWxpdHkuDQoNCjEzLiBNVUxUSVBMRS1MSUNFTlNFRCBDT0RFLg0KDQogICAgIEluaXRpYWwgRGV2ZWxvcGVyIG1heSBkZXNpZ25hdGUgcG9ydGlvbnMgb2YgdGhlIENvdmVyZWQgQ29kZSBhcw0KICAgICAiTXVsdGlwbGUtTGljZW5zZWQiLiAgIk11bHRpcGxlLUxpY2Vuc2VkIiBtZWFucyB0aGF0IHRoZSBJbml0aWFsDQogICAgIERldmVsb3BlciBwZXJtaXRzIHlvdSB0byB1dGlsaXplIHBvcnRpb25zIG9mIHRoZSBDb3ZlcmVkIENvZGUgdW5kZXINCiAgICAgWW91ciBjaG9pY2Ugb2YgdGhlIE5QTCBvciB0aGUgYWx0ZXJuYXRpdmUgbGljZW5zZXMsIGlmIGFueSwgc3BlY2lmaWVkDQogICAgIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBpbiB0aGUgZmlsZSBkZXNjcmliZWQgaW4gRXhoaWJpdCBBLg0KDQpFWEhJQklUIEEgLU1vemlsbGEgUHVibGljIExpY2Vuc2UuDQoNCiAgICAgYGBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlDQogICAgIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4NCiAgICAgY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQoNCiAgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIg0KICAgICBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQ0KICAgICBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMNCiAgICAgdW5kZXIgdGhlIExpY2Vuc2UuDQoNCiAgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18uDQoNCiAgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIF9fX19fX19fX19fX19fX19fX19fX19fXy4NCiAgICAgUG9ydGlvbnMgY3JlYXRlZCBieSBfX19fX19fX19fX19fX19fX19fX19fIGFyZSBDb3B5cmlnaHQgKEMpIF9fX19fXw0KICAgICBfX19fX19fX19fX19fX19fX19fX19fXy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCg0KICAgICBDb250cmlidXRvcihzKTogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18uDQoNCiAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMNCiAgICAgb2YgdGhlIF9fX19fIGxpY2Vuc2UgKHRoZSAgIltfX19dIExpY2Vuc2UiKSwgaW4gd2hpY2ggY2FzZSB0aGUNCiAgICAgcHJvdmlzaW9ucyBvZiBbX19fX19fXSBMaWNlbnNlIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhvc2UNCiAgICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogICAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgW19fX19dIExpY2Vuc2UgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlDQogICAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieQ0KICAgICBkZWxldGluZyAgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZA0KICAgICBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBbX19fXSBMaWNlbnNlLiAgSWYgeW91IGRvIG5vdCBkZWxldGUNCiAgICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQ0KICAgICB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgW19fX10gTGljZW5zZS4iDQoNCiAgICAgW05PVEU6IFRoZSB0ZXh0IG9mIHRoaXMgRXhoaWJpdCBBIG1heSBkaWZmZXIgc2xpZ2h0bHkgZnJvbSB0aGUgdGV4dCBvZg0KICAgICB0aGUgbm90aWNlcyBpbiB0aGUgU291cmNlIENvZGUgZmlsZXMgb2YgdGhlIE9yaWdpbmFsIENvZGUuIFlvdSBzaG91bGQNCiAgICAgdXNlIHRoZSB0ZXh0IG9mIHRoaXMgRXhoaWJpdCBBIHJhdGhlciB0aGFuIHRoZSB0ZXh0IGZvdW5kIGluIHRoZQ0KICAgICBPcmlnaW5hbCBDb2RlIFNvdXJjZSBDb2RlIGZvciBZb3VyIE1vZGlmaWNhdGlvbnMuXQ0KDQoNCg0KICAgICAgICAgICAgICAgICAgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQ0KICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDMsIDI5IEp1bmUgMjAwNw==]]></data>
	</file>
	<file>
	  <filename>/ace/Readme.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[QWNlIChBamF4Lm9yZyBDbG91ZDkgRWRpdG9yKQ0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpBY2UgaXMgYSBzdGFuZGFsb25lIGNvZGUgZWRpdG9yIHdyaXR0ZW4gaW4gSmF2YVNjcmlwdC4gT3VyIGdvYWwgaXMgdG8gY3JlYXRlIGEgYnJvd3NlciBiYXNlZCBlZGl0b3IgdGhhdCBtYXRjaGVzIGFuZCBleHRlbmRzIHRoZSBmZWF0dXJlcywgdXNhYmlsaXR5IGFuZCBwZXJmb3JtYW5jZSBvZiBleGlzdGluZyBuYXRpdmUgZWRpdG9ycyBzdWNoIGFzIFRleHRNYXRlLCBWaW0gb3IgRWNsaXBzZS4gSXQgY2FuIGJlIGVhc2lseSBlbWJlZGRlZCBpbiBhbnkgd2ViIHBhZ2Ugb3IgSmF2YVNjcmlwdCBhcHBsaWNhdGlvbi4gQWNlIGlzIGRldmVsb3BlZCBhcyB0aGUgcHJpbWFyeSBlZGl0b3IgZm9yIFtDbG91ZDkgSURFXShodHRwOi8vd3d3LmNsb3VkOWlkZS5jb20vKSBhbmQgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgTW96aWxsYSBTa3l3cml0ZXIgKEJlc3BpbikgUHJvamVjdC4NCg0KRmVhdHVyZXMNCi0tLS0tLS0tDQoNCiogU3ludGF4IGhpZ2hsaWdodGluZw0KKiBBdXRvbWF0aWMgaW5kZW50IGFuZCBvdXRkZW50DQoqIEFuIG9wdGlvbmFsIGNvbW1hbmQgbGluZQ0KKiBIYW5kbGVzIGh1Z2UgZG9jdW1lbnRzICgxMDAsMDAwIGxpbmVzIGFuZCBtb3JlIGFyZSBubyBwcm9ibGVtKQ0KKiBGdWxseSBjdXN0b21pemFibGUga2V5IGJpbmRpbmdzIGluY2x1ZGluZyBWSSBhbmQgRW1hY3MgbW9kZXMNCiogVGhlbWVzIChUZXh0TWF0ZSB0aGVtZXMgY2FuIGJlIGltcG9ydGVkKQ0KKiBTZWFyY2ggYW5kIHJlcGxhY2Ugd2l0aCByZWd1bGFyIGV4cHJlc3Npb25zDQoqIEhpZ2hsaWdodCBtYXRjaGluZyBwYXJlbnRoZXNlcw0KKiBUb2dnbGUgYmV0d2VlbiBzb2Z0IHRhYnMgYW5kIHJlYWwgdGFicw0KKiBEaXNwbGF5cyBoaWRkZW4gY2hhcmFjdGVycw0KKiBEcmFnIGFuZCBkcm9wIHRleHQgdXNpbmcgdGhlIG1vdXNlDQoqIExpbmUgd3JhcHBpbmcNCiogVW5zdHJ1Y3R1cmVkIC8gdXNlciBjb2RlIGZvbGRpbmcNCiogTGl2ZSBzeW50YXggY2hlY2tlciAoY3VycmVudGx5IEphdmFTY3JpcHQvQ29mZmVlU2NyaXB0KQ0KDQpUYWtlIEFjZSBmb3IgYSBzcGluIQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KQ2hlY2sgb3V0IHRoZSBBY2UgbGl2ZSBbZGVtb10oaHR0cDovL2FqYXhvcmcuZ2l0aHViLmNvbS9hY2UvKSBvciBnZXQgYSBbQ2xvdWQ5IElERSBhY2NvdW50XShodHRwOi8vcnVuLmNsb3VkOWlkZS5jb20pIHRvIGV4cGVyaWVuY2UgQWNlIHdoaWxlIGVkaXRpbmcgb25lIG9mIHlvdXIgb3duIEdpdEh1YiBwcm9qZWN0cy4NCg0KSWYgeW91IHdhbnQsIHlvdSBjYW4gdXNlIEFjZSBhcyBhIHRleHRhcmVhIHJlcGxhY2VtZW50IHRoYW5rcyB0byB0aGUgW0FjZSBCb29rbWFya2xldF0oaHR0cDovL2FqYXhvcmcuZ2l0aHViLmNvbS9hY2UvYnVpbGQvdGV4dGFyZWEvZWRpdG9yLmh0bWwpLg0KDQpIaXN0b3J5DQotLS0tLS0tDQoNClByZXZpb3VzbHkga25vd24gYXMg4oCcQmVzcGlu4oCdIGFuZCDigJxTa3l3cml0ZXLigJ0gaXTigJlzIG5vdyBrbm93biBhcyBBY2UgKEFqYXgub3JnIENsb3VkOSBFZGl0b3IpISBCZXNwaW4gYW5kIEFjZSBzdGFydGVkIGFzIHR3byBpbmRlcGVuZGVudCBwcm9qZWN0cywgYm90aCBhaW1pbmcgdG8gYnVpbGQgYSBuby1jb21wcm9taXNlIGNvZGUgZWRpdG9yIGNvbXBvbmVudCBmb3IgdGhlIHdlYi4gQmVzcGluIHN0YXJ0ZWQgYXMgcGFydCBvZiBNb3ppbGxhIExhYnMgYW5kIHdhcyBiYXNlZCBvbiB0aGUgY2FudmFzIHRhZywgd2hpbGUgQWNlIGlzIHRoZSBFZGl0b3IgY29tcG9uZW50IG9mIHRoZSBDbG91ZDkgSURFIGFuZCBpcyB1c2luZyB0aGUgRE9NIGZvciByZW5kZXJpbmcuIEFmdGVyIHRoZSByZWxlYXNlIG9mIEFjZSBhdCBKU0NvbmYuZXUgMjAxMCBpbiBCZXJsaW4gdGhlIFNreXdyaXRlciB0ZWFtIGRlY2lkZWQgdG8gbWVyZ2UgQWNlIHdpdGggYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgU2t5d3JpdGVyJ3MgcGx1Z2luIHN5c3RlbSBhbmQgc29tZSBvZiBTa3l3cml0ZXIncyBleHRlbnNpYmlsaXR5IHBvaW50cy4gQWxsIHRoZXNlIGNoYW5nZXMgaGF2ZSBiZWVuIG1lcmdlZCBiYWNrIHRvIEFjZS4gQm90aCBBamF4Lm9yZyBhbmQgTW96aWxsYSBhcmUgYWN0aXZlbHkgZGV2ZWxvcGluZyBhbmQgbWFpbnRhaW5pbmcgQWNlLg0KDQpHZXR0aW5nIHRoZSBjb2RlDQotLS0tLS0tLS0tLS0tLS0tDQoNCkFjZSBpcyBhIGNvbW11bml0eSBwcm9qZWN0LiBXZSBhY3RpdmVseSBlbmNvdXJhZ2UgYW5kIHN1cHBvcnQgY29udHJpYnV0aW9ucy4gVGhlIEFjZSBzb3VyY2UgY29kZSBpcyBob3N0ZWQgb24gR2l0SHViLiBJdCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTW96aWxsYSB0cmktbGljZW5zZSAoTVBML0dQTC9MR1BMKSwgdGhlIHNhbWUgbGljZW5zZSB1c2VkIGJ5IEZpcmVmb3guIFRoaXMgbGljZW5zZSBpcyBmcmllbmRseSB0byBhbGwga2luZHMgb2YgcHJvamVjdHMsIHdoZXRoZXIgb3BlbiBzb3VyY2Ugb3Igbm90LiBUYWtlIGNoYXJnZSBvZiB5b3VyIGVkaXRvciBhbmQgYWRkIHlvdXIgZmF2b3JpdGUgbGFuZ3VhZ2UgaGlnaGxpZ2h0aW5nIGFuZCBrZXliaW5kaW5ncyENCg0KYGBgYmFzaA0KICAgIGdpdCBjbG9uZSBnaXQ6Ly9naXRodWIuY29tL2FqYXhvcmcvYWNlLmdpdA0KICAgIGNkIGFjZQ0KICAgIGdpdCBzdWJtb2R1bGUgdXBkYXRlIC0taW5pdCAtLXJlY3Vyc2l2ZQ0KYGBgDQoNCkVtYmVkZGluZyBBY2UNCi0tLS0tLS0tLS0tLS0NCg0KQWNlIGNhbiBiZSBlYXNpbHkgZW1iZWRkZWQgaW50byBhbnkgZXhpc3Rpbmcgd2ViIHBhZ2UuIFRoZSBBY2UgZ2l0IHJlcG9zaXRvcnkgc2hpcHMgd2l0aCBhIHByZS1wYWNrYWdlZCB2ZXJzaW9uIG9mIEFjZSBpbnNpZGUgb2YgdGhlIGBidWlsZGAgZGlyZWN0b3J5LiBUaGUgc2FtZSBwYWNrYWdlZCBmaWxlcyBhcmUgYWxzbyBhdmFpbGFibGUgYXMgYSBzZXBhcmF0ZSBbZG93bmxvYWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hamF4b3JnL2FjZS9kb3dubG9hZHMpLiBTaW1wbHkgY29weSB0aGUgY29udGVudHMgb2YgdGhlIGBzcmNgIHN1YmRpcmVjdG9yeSBzb21ld2hlcmUgaW50byB5b3VyIHByb2plY3QgYW5kIHRha2UgYSBsb29rIGF0IHRoZSBpbmNsdWRlZCBkZW1vcyBvZiBob3cgdG8gdXNlIEFjZS4NCg0KVGhlIGVhc2llc3QgdmVyc2lvbiBpcyBzaW1wbHk6DQoNCmBgYGh0bWwNCiAgICA8ZGl2IGlkPSJlZGl0b3IiPnNvbWUgdGV4dDwvZGl2Pg0KICAgIDxzY3JpcHQgc3JjPSJzcmMvYWNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4NCiAgICA8c2NyaXB0Pg0KICAgIHdpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIGVkaXRvciA9IGFjZS5lZGl0KCJlZGl0b3IiKTsNCiAgICB9Ow0KICAgIDwvc2NyaXB0Pg0KYGBgDQoNCldpdGggImVkaXRvciIgYmVpbmcgdGhlIGlkIG9mIHRoZSBET00gZWxlbWVudCwgd2hpY2ggc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBhbiBlZGl0b3IuIE5vdGUgdGhhdCB0aGlzIGVsZW1lbnQgbXVzdCBiZSBleHBsaWNpdGx5IHNpemVkIGFuZCBwb3NpdGlvbmVkIGBhYnNvbHV0ZWAgb3IgYHJlbGF0aXZlYCBmb3IgQWNlIHRvIHdvcmsuIGUuZy4NCg0KYGBgY3NzDQogICAgI2VkaXRvciB7DQogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICAgICAgd2lkdGg6IDUwMHB4Ow0KICAgICAgICBoZWlnaHQ6IDQwMHB4Ow0KICAgIH0NCmBgYA0KDQpUbyBjaGFuZ2UgdGhlIHRoZW1lIHNpbXBseSBpbmNsdWRlIHRoZSBUaGVtZSdzIEphdmFTY3JpcHQgZmlsZQ0KDQpgYGBodG1sDQogICAgPHNjcmlwdCBzcmM9InNyYy90aGVtZS10d2lsaWdodC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+DQpgYGANCg0KYW5kIGNvbmZpZ3VyZSB0aGUgZWRpdG9yIHRvIHVzZSB0aGUgdGhlbWU6DQoNCmBgYGphdmFzY3JpcHQNCiAgICBlZGl0b3Iuc2V0VGhlbWUoImFjZS90aGVtZS90d2lsaWdodCIpOw0KYGBgDQoNCkJ5IGRlZmF1bHQgdGhlIGVkaXRvciBvbmx5IHN1cHBvcnRzIHBsYWluIHRleHQgbW9kZTsgbWFueSBvdGhlciBsYW5ndWFnZXMgYXJlIGF2YWlsYWJsZSBhcyBzZXBhcmF0ZSBtb2R1bGVzLiBBZnRlciBpbmNsdWRpbmcgdGhlIG1vZGUncyBKYXZhU2NyaXB0IGZpbGU6DQoNCmBgYGh0bWwNCiAgICA8c2NyaXB0IHNyYz0ic3JjL21vZGUtamF2YXNjcmlwdC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+DQpgYGANCg0KVGhlbiB0aGUgbW9kZSBjYW4gYmUgdXNlZCBsaWtlIHRoaXM6DQoNCmBgYGphdmFzY3JpcHQNCiAgICB2YXIgSmF2YVNjcmlwdE1vZGUgPSByZXF1aXJlKCJhY2UvbW9kZS9qYXZhc2NyaXB0IikuTW9kZTsNCiAgICBlZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUobmV3IEphdmFTY3JpcHRNb2RlKCkpOw0KYGBgDQoNCkRvY3VtZW50YXRpb24NCi0tLS0tLS0tLS0tLS0NCg0KWW91IGZpbmQgYSBsb3QgbW9yZSBzYW1wbGUgY29kZSBpbiB0aGUgW2RlbW8gYXBwXShodHRwczovL2dpdGh1Yi5jb20vYWpheG9yZy9hY2UvYmxvYi9tYXN0ZXIvZGVtby9kZW1vLmpzKS4NCg0KVGhlcmUgaXMgYWxzbyBzb21lIGRvY3VtZW50YXRpb24gb24gdGhlIFt3aWtpIHBhZ2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9hamF4b3JnL2FjZS93aWtpKS4NCg0KSWYgeW91IHN0aWxsIG5lZWQgaGVscCwgZmVlbCBmcmVlIHRvIGRyb3AgYSBtYWlsIG9uIHRoZSBbYWNlIG1haWxpbmcgbGlzdF0oaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2FjZS1kaXNjdXNzKS4NCg0KUnVubmluZyBBY2UNCi0tLS0tLS0tLS0tDQoNCkFmdGVyIHRoZSBjaGVja291dCBBY2Ugd29ya3Mgb3V0IG9mIHRoZSBib3guIE5vIGJ1aWxkIHN0ZXAgaXMgcmVxdWlyZWQuIE9wZW4gJ2VkaXRvci5odG1sJyBpbiBhbnkgYnJvd3NlciBleGNlcHQgR29vZ2xlIENocm9tZS4gR29vZ2xlIENocm9tZSBkb2Vzbid0IGFsbG93IFhNTEhUVFBSZXF1ZXN0cyBmcm9tIGZpbGVzIGxvYWRlZCBmcm9tIGRpc2MgKGkuZS4gd2l0aCBhIGZpbGU6Ly8vIFVSTCkuIFRvIG9wZW4gQWNlIGluIENocm9tZSBzaW1wbHkgc3RhcnQgdGhlIGJ1bmRsZWQgbWluaSBIVFRQIHNlcnZlcjoNCg0KYGBgYmFzaA0KICAgIC4vc3RhdGljLnB5DQpgYGANCg0KT3IgdXNpbmcgTm9kZS5KUw0KDQpgYGBiYXNoDQogICAgLi9zdGF0aWMuanMNCmBgYA0KDQpUaGUgZWRpdG9yIGNhbiB0aGVuIGJlIG9wZW5lZCBhdCBodHRwOi8vbG9jYWxob3N0Ojg4ODgvaW5kZXguaHRtbC4NCg0KUGFja2FnZSBBY2UNCi0tLS0tLS0tLS0tDQoNClRvIHBhY2thZ2UgQWNlIHdlIHVzZSB0aGUgZHJ5aWNlIGJ1aWxkIHRvb2wgZGV2ZWxvcGVkIGJ5IHRoZSBNb3ppbGxhIFNreXdyaXRlciB0ZWFtLiBCZWZvcmUgeW91IGNhbiBidWlsZCB5b3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc3VibW9kdWxlcyBhcmUgdXAgdG8gZGF0ZS4NCg0KYGBgYmFzaA0KICAgIGdpdCBzdWJtb2R1bGUgdXBkYXRlIC0taW5pdCAtLXJlY3Vyc2l2ZQ0KYGBgDQoNCk1ha2Ugc3VyZSB5b3UgYXQgbGVhc3QgdmVyc2lvbiAwLjMuMCBvZiBkcnlpY2UNCg0KYGBgYmFzaA0KICAgIG5wbSBpbnN0YWxsIGRyeWljZQ0KYGBgDQoNCkFmdGVyd2FyZHMgQWNlIGNhbiBiZSBidWlsdCBieSBjYWxsaW5nDQoNCmBgYGJhc2gNCiAgICAuL01ha2VmaWxlLmRyeWljZS5qcyBub3JtYWwNCmBgYA0KDQpUaGUgcGFja2FnZWQgQWNlIHdpbGwgYmUgcHV0IGluIHRoZSAnYnVpbGQnIGZvbGRlci4NCg0KVG8gYnVpbGQgdGhlIGJvb2ttYXJrbGV0IHZlcnNpb24gZXhlY3V0ZQ0KDQpgYGBiYXNoDQogICAgLi9NYWtlZmlsZS5kcnlpY2UuanMgYm0NCmBgYA0KDQpSdW5uaW5nIHRoZSBVbml0IFRlc3RzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClRoZSBBY2UgdW5pdCB0ZXN0cyBydW4gb24gbm9kZS5qcy4gQmVmb3JlIHRoZSBmaXJzdCBydW4gYSBjb3VwbGUgb2Ygbm9kZSBtb2R1bGVzIGhhdmUgdG8gYmUgaW5zdGFsbGVkLiBUaGUgZWFzaWVzdCB3YXkgdG8gZG8gdGhpcyBpcyBieSB1c2luZyB0aGUgbm9kZSBwYWNrYWdlIG1hbmFnZXIgKG5wbSkuIEluIHRoZSBBY2UgYmFzZSBkaXJlY3Rvcnkgc2ltcGx5IGNhbGwNCg0KYGBgYmFzaA0KICAgIG5wbSBsaW5rIC4NCmBgYA0KDQpUbyBydW4gdGhlIHRlc3RzIGNhbGw6DQoNCmBgYGJhc2gNCiAgICBub2RlIGxpYi9hY2UvdGVzdC9hbGwuanMNCmBgYA0KDQpZb3UgY2FuIGFsc28gcnVuIHRoZSB0ZXN0cyBpbiB5b3VyIGJyb3dzZXIgYnkgc2VydmluZzoNCg0KICAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODg4OC9saWIvYWNlL3Rlc3QvdGVzdHMuaHRtbA0KDQpUaGlzIG1ha2VzIGRlYnVnZ2luZyBmYWlsaW5nIHRlc3RzIHdheSBtb3JlIGVhc2llci4NCg0KQ29udGludW91cyBJbnRlZ3JhdGlvbiBzdGF0dXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClRoaXMgcHJvamVjdCBpcyB0ZXN0ZWQgd2l0aCBbVHJhdmlzIENJXShodHRwOi8vdHJhdmlzLWNpLm9yZykNClshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly9zZWN1cmUudHJhdmlzLWNpLm9yZy9hamF4b3JnL2FjZS5wbmcpXShodHRwOi8vdHJhdmlzLWNpLm9yZy9hamF4b3JnL2FjZSkNCg0KQ29udHJpYnV0aW5nDQotLS0tLS0tLS0tLS0NCg0KQWNlIHdvdWxkbid0IGJlIHdoYXQgaXQgaXMgd2l0aG91dCBjb250cmlidXRpb25zISBGZWVsIGZyZWUgdG8gZm9yayBhbmQgaW1wcm92ZS9lbmhhbmNlIEFjZSBhbnkgd2F5IHlvdSB3YW50LiBJZiB5b3UgZmVlbCB0aGF0IHRoZSBlZGl0b3Igb3IgdGhlIEFjZSBjb21tdW5pdHkgd2lsbCBiZW5lZml0IGZyb20geW91ciBjaGFuZ2VzLCBwbGVhc2Ugb3BlbiBhIHB1bGwgcmVxdWVzdC4gVG8gcHJvdGVjdCB0aGUgaW50ZXJlc3RzIG9mIHRoZSBBY2UgY29udHJpYnV0b3JzIGFuZCB1c2VycyB3ZSByZXF1aXJlIGNvbnRyaWJ1dG9ycyB0byBzaWduIGEgQ29udHJpYnV0b3JzIExpY2Vuc2UgQWdyZWVtZW50IChDTEEpIGJlZm9yZSB3ZSBwdWxsIHRoZSBjaGFuZ2VzIGludG8gdGhlIG1haW4gcmVwb3NpdG9yeS4gT3VyIENMQSBpcyB0aGUgc2ltcGxlc3Qgb2YgYWdyZWVtZW50cywgcmVxdWlyaW5nIHRoYXQgdGhlIGNvbnRyaWJ1dGlvbnMgeW91IG1ha2UgdG8gYW4gYWpheC5vcmcgcHJvamVjdCBhcmUgb25seSB0aG9zZSB5b3UncmUgYWxsb3dlZCB0byBtYWtlLiBUaGlzIGhlbHBzIHVzIHNpZ25pZmljYW50bHkgcmVkdWNlIGZ1dHVyZSBsZWdhbCByaXNrIGZvciBldmVyeW9uZSBpbnZvbHZlZC4gSXQgaXMgZWFzeSwgaGVscHMgZXZlcnlvbmUsIHRha2VzIHRlbiBtaW51dGVzLCBhbmQgb25seSBuZWVkcyB0byBiZSBjb21wbGV0ZWQgb25jZS4gIFRoZXJlIGFyZSB0d28gdmVyc2lvbnMgb2YgdGhlIGFncmVlbWVudDoNCg0KMS4gW1RoZSBJbmRpdmlkdWFsIENMQV0oaHR0cHM6Ly9naXRodWIuY29tL2FqYXhvcmcvYWNlL3Jhdy9tYXN0ZXIvZG9jL0NvbnRyaWJ1dG9yX0xpY2Vuc2VfQWdyZWVtZW50LXYyLnBkZik6IHVzZSB0aGlzIHZlcnNpb24gaWYgeW91J3JlIHdvcmtpbmcgb24gYW4gYWpheC5vcmcgaW4geW91ciBzcGFyZSB0aW1lLCBvciBjYW4gY2xlYXJseSBjbGFpbSBvd25lcnNoaXAgb2YgY29weXJpZ2h0IGluIHdoYXQgeW91J2xsIGJlIHN1Ym1pdHRpbmcuDQoyLiBbVGhlIENvcnBvcmF0ZSBDTEFdKGh0dHBzOi8vZ2l0aHViLmNvbS9hamF4b3JnL2FjZS9yYXcvbWFzdGVyL2RvYy9Db3Jwb3JhdGVfQ29udHJpYnV0b3JfTGljZW5zZV9BZ3JlZW1lbnQtdjIucGRmKTogaGF2ZSB5b3VyIGNvcnBvcmF0ZSBsYXd5ZXIgcmV2aWV3IGFuZCBzdWJtaXQgdGhpcyBpZiB5b3VyIGNvbXBhbnkgaXMgZ29pbmcgdG8gYmUgY29udHJpYnV0aW5nIHRvIGFqYXgub3JnICBwcm9qZWN0cw0KDQpJZiB5b3Ugd2FudCB0byBjb250cmlidXRlIHRvIGFuIGFqYXgub3JnIHByb2plY3QgcGxlYXNlIHByaW50IHRoZSBDTEEgYW5kIGZpbGwgaXQgb3V0IGFuZCBzaWduIGl0LiBUaGVuIGVpdGhlciBzZW5kIGl0IGJ5IHNuYWlsIG1haWwgb3IgZmF4IHRvIHVzIG9yIHNlbmQgaXQgYmFjayBzY2FubmVkIChvciBhcyBhIHBob3RvKSBieSBlbWFpbC4NCg0KRW1haWw6IGZhYmlhbi5qYWtvYnNAd2ViLmRlDQoNCkZheDogKzMxICgwKSAyMDYzODg5NTMNCg0KQWRkcmVzczogQWpheC5vcmcgQi5WLg0KICBLZWl6ZXJzZ3JhY2h0IDI0MQ0KICAxMDE2IEVBLCBBbXN0ZXJkYW0NCiAgdGhlIE5ldGhlcmxhbmRz]]></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[LyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ3BpbG90L2luZGV4JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdwaWxvdC9icm93c2VyX2ZvY3VzJywgJ3BpbG90L2RvbScsICdwaWxvdC9ldmVudCcsICdwaWxvdC9ldmVudF9lbWl0dGVyJywgJ3BpbG90L2ZpeG9sZGJyb3dzZXJzJywgJ3BpbG90L2tleXMnLCAncGlsb3QvbGFuZycsICdwaWxvdC9vb3AnLCAncGlsb3QvdXNlcmFnZW50JywgJ3BpbG90L2Nhbm9uJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KICAgIHJlcXVpcmUoInBpbG90L2Jyb3dzZXJfZm9jdXMiKTsNCiAgICByZXF1aXJlKCJwaWxvdC9kb20iKTsNCiAgICByZXF1aXJlKCJwaWxvdC9ldmVudCIpOw0KICAgIHJlcXVpcmUoInBpbG90L2V2ZW50X2VtaXR0ZXIiKTsNCiAgICByZXF1aXJlKCJwaWxvdC9maXhvbGRicm93c2VycyIpOw0KICAgIHJlcXVpcmUoInBpbG90L2tleXMiKTsNCiAgICByZXF1aXJlKCJwaWxvdC9sYW5nIik7DQogICAgcmVxdWlyZSgicGlsb3Qvb29wIik7DQogICAgcmVxdWlyZSgicGlsb3QvdXNlcmFnZW50Iik7DQogICAgcmVxdWlyZSgicGlsb3QvY2Fub24iKTsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ3BpbG90L2Jyb3dzZXJfZm9jdXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvYnJvd3Nlcl9mb2N1cyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiAgICBjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdwaWxvdC9icm93c2VyX2ZvY3VzJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2FjZS9saWIvYnJvd3Nlcl9mb2N1cycgaW5zdGVhZCIpOw0KICAgIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiYWNlL2xpYi9icm93c2VyX2ZvY3VzIik7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdwaWxvdC9kb20nLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZG9tJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KICAgIGNvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L2RvbScgaXMgZGVwcmVjYXRlZC4gVXNlICdhY2UvbGliL2RvbScgaW5zdGVhZCIpOw0KICAgIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiYWNlL2xpYi9kb20iKTsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ3BpbG90L2V2ZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2V2ZW50J10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KICAgIGNvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L2V2ZW50JyBpcyBkZXByZWNhdGVkLiBVc2UgJ2FjZS9saWIvZXZlbnQnIGluc3RlYWQiKTsNCiAgICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoImFjZS9saWIvZXZlbnQiKTsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ3BpbG90L2V2ZW50X2VtaXR0ZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiAgICBjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdwaWxvdC9ldmVudF9lbWl0dGVyJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicgaW5zdGVhZCIpOw0KICAgIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiYWNlL2xpYi9ldmVudF9lbWl0dGVyIik7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdwaWxvdC9maXhvbGRicm93c2VycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9maXhvbGRicm93c2VycyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiAgICBjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdwaWxvdC9maXhvbGRicm93c2VycycgaXMgZGVwcmVjYXRlZC4gVXNlICdhY2UvbGliL2ZpeG9sZGJyb3dzZXJzJyBpbnN0ZWFkIik7DQogICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJhY2UvbGliL2ZpeG9sZGJyb3dzZXJzIik7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdwaWxvdC9rZXlzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2tleXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQogICAgY29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3Qva2V5cycgaXMgZGVwcmVjYXRlZC4gVXNlICdhY2UvbGliL2tleXMnIGluc3RlYWQiKTsNCiAgICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoImFjZS9saWIva2V5cyIpOw0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgncGlsb3QvbGFuZycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9sYW5nJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KICAgIGNvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L2xhbmcnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi9sYW5nJyBpbnN0ZWFkIik7DQogICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJhY2UvbGliL2xhbmciKTsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ3BpbG90L29vcCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQogICAgY29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3Qvb29wJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2FjZS9saWIvb29wJyBpbnN0ZWFkIik7DQogICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJhY2UvbGliL29vcCIpOw0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgncGlsb3QvdXNlcmFnZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL3VzZXJhZ2VudCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiAgICBjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdwaWxvdC91c2VyYWdlbnQnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi91c2VyYWdlbnQnIGluc3RlYWQiKTsNCiAgICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoImFjZS9saWIvdXNlcmFnZW50Iik7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdwaWxvdC9jYW5vbicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQogICAgY29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3QvY2Fub24nIGlzIGRlcHJlY2F0ZWQuIik7DQogICAgLy9yZXR1cm4gcmVxdWlyZSgiYWNlL2xpYi9kb20iKTsNCiAgICANCiAgICBleHBvcnRzLmFkZENvbW1hbmQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgY29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAnY2Fub24uYWRkQ29tbWFuZCgpJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2VkaXRvci5jb21tYW5kcy5hZGRDb21tYW5kKGNvbW1hbmQpJyBpbnN0ZWFkLiIpOw0KICAgICAgICBjb25zb2xlLnRyYWNlKCk7DQogICAgfQ0KICAgIA0KICAgIGV4cG9ydHMucmVtb3ZlQ29tbWFuZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdjYW5vbi5yZW1vdmVDb21tYW5kKCknIGlzIGRlcHJlY2F0ZWQuIFVzZSAnZWRpdG9yLmNvbW1hbmRzLnJlbW92ZUNvbW1hbmQoY29tbWFuZCknIGluc3RlYWQuIik7DQogICAgICAgIGNvbnNvbGUudHJhY2UoKTsNCiAgICB9DQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCi8qKg0KICogRGVmaW5lIGEgbW9kdWxlIGFsb25nIHdpdGggYSBwYXlsb2FkDQogKiBAcGFyYW0gbW9kdWxlIGEgbmFtZSBmb3IgdGhlIHBheWxvYWQNCiAqIEBwYXJhbSBwYXlsb2FkIGEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHBhcmFtcw0KICovDQogDQooZnVuY3Rpb24oKSB7DQoNCnZhciBBQ0VfTkFNRVNQQUNFID0gIiI7DQoNCnZhciBnbG9iYWwgPSAoZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXM7DQp9KSgpOw0KDQppZiAodHlwZW9mIHJlcXVpcmVqcyAhPT0gInVuZGVmaW5lZCIpDQogICAgcmV0dXJuOw0KDQp2YXIgX2RlZmluZSA9IGZ1bmN0aW9uKG1vZHVsZSwgZGVwcywgcGF5bG9hZCkgew0KICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAnc3RyaW5nJykgew0KICAgICAgICBpZiAoX2RlZmluZS5vcmlnaW5hbCkNCiAgICAgICAgICAgIF9kZWZpbmUub3JpZ2luYWwuYXBwbHkod2luZG93LCBhcmd1bWVudHMpOw0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Ryb3BwaW5nIG1vZHVsZSBiZWNhdXNlIGRlZmluZSB3YXNuXCd0IGEgc3RyaW5nLicpOw0KICAgICAgICAgICAgY29uc29sZS50cmFjZSgpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKQ0KICAgICAgICBwYXlsb2FkID0gZGVwczsNCg0KICAgIGlmICghX2RlZmluZS5tb2R1bGVzKQ0KICAgICAgICBfZGVmaW5lLm1vZHVsZXMgPSB7fTsNCiAgICAgICAgDQogICAgX2RlZmluZS5tb2R1bGVzW21vZHVsZV0gPSBwYXlsb2FkOw0KfTsNCg0KLyoqDQogKiBHZXQgYXQgZnVuY3Rpb25hbGl0eSBkZWZpbmUoKWVkIHVzaW5nIHRoZSBmdW5jdGlvbiBhYm92ZQ0KICovDQp2YXIgX3JlcXVpcmUgPSBmdW5jdGlvbihwYXJlbnRJZCwgbW9kdWxlLCBjYWxsYmFjaykgew0KICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobW9kdWxlKSA9PT0gIltvYmplY3QgQXJyYXldIikgew0KICAgICAgICB2YXIgcGFyYW1zID0gW107DQogICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbW9kdWxlLmxlbmd0aDsgaSA8IGw7ICsraSkgew0KICAgICAgICAgICAgdmFyIGRlcCA9IGxvb2t1cChwYXJlbnRJZCwgbW9kdWxlW2ldKTsNCiAgICAgICAgICAgIGlmICghZGVwICYmIF9yZXF1aXJlLm9yaWdpbmFsKQ0KICAgICAgICAgICAgICAgIHJldHVybiBfcmVxdWlyZS5vcmlnaW5hbC5hcHBseSh3aW5kb3csIGFyZ3VtZW50cyk7DQogICAgICAgICAgICBwYXJhbXMucHVzaChkZXApOw0KICAgICAgICB9DQogICAgICAgIGlmIChjYWxsYmFjaykgew0KICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgcGFyYW1zKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSAnc3RyaW5nJykgew0KICAgICAgICB2YXIgcGF5bG9hZCA9IGxvb2t1cChwYXJlbnRJZCwgbW9kdWxlKTsNCiAgICAgICAgaWYgKCFwYXlsb2FkICYmIF9yZXF1aXJlLm9yaWdpbmFsKQ0KICAgICAgICAgICAgcmV0dXJuIF9yZXF1aXJlLm9yaWdpbmFsLmFwcGx5KHdpbmRvdywgYXJndW1lbnRzKTsNCiAgICAgICAgDQogICAgICAgIGlmIChjYWxsYmFjaykgew0KICAgICAgICAgICAgY2FsbGJhY2soKTsNCiAgICAgICAgfQ0KICAgIA0KICAgICAgICByZXR1cm4gcGF5bG9hZDsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIGlmIChfcmVxdWlyZS5vcmlnaW5hbCkNCiAgICAgICAgICAgIHJldHVybiBfcmVxdWlyZS5vcmlnaW5hbC5hcHBseSh3aW5kb3csIGFyZ3VtZW50cyk7DQogICAgfQ0KfTsNCg0KdmFyIG5vcm1hbGl6ZU1vZHVsZSA9IGZ1bmN0aW9uKHBhcmVudElkLCBtb2R1bGVOYW1lKSB7DQogICAgLy8gbm9ybWFsaXplIHBsdWdpbiByZXF1aXJlcw0KICAgIGlmIChtb2R1bGVOYW1lLmluZGV4T2YoIiEiKSAhPT0gLTEpIHsNCiAgICAgICAgdmFyIGNodW5rcyA9IG1vZHVsZU5hbWUuc3BsaXQoIiEiKTsNCiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZU1vZHVsZShwYXJlbnRJZCwgY2h1bmtzWzBdKSArICIhIiArIG5vcm1hbGl6ZU1vZHVsZShwYXJlbnRJZCwgY2h1bmtzWzFdKTsNCiAgICB9DQogICAgLy8gbm9ybWFsaXplIHJlbGF0aXZlIHJlcXVpcmVzDQogICAgaWYgKG1vZHVsZU5hbWUuY2hhckF0KDApID09ICIuIikgew0KICAgICAgICB2YXIgYmFzZSA9IHBhcmVudElkLnNwbGl0KCIvIikuc2xpY2UoMCwgLTEpLmpvaW4oIi8iKTsNCiAgICAgICAgbW9kdWxlTmFtZSA9IGJhc2UgKyAiLyIgKyBtb2R1bGVOYW1lOw0KICAgICAgICANCiAgICAgICAgd2hpbGUobW9kdWxlTmFtZS5pbmRleE9mKCIuIikgIT09IC0xICYmIHByZXZpb3VzICE9IG1vZHVsZU5hbWUpIHsNCiAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IG1vZHVsZU5hbWU7DQogICAgICAgICAgICBtb2R1bGVOYW1lID0gbW9kdWxlTmFtZS5yZXBsYWNlKC9cL1wuXC8vLCAiLyIpLnJlcGxhY2UoL1teXC9dK1wvXC5cLlwvLywgIiIpOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIHJldHVybiBtb2R1bGVOYW1lOw0KfTsNCg0KLyoqDQogKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBsb29rdXAgbW9kdWxlTmFtZXMgYW5kIHJlc29sdmUgdGhlbSBieSBjYWxsaW5nIHRoZQ0KICogZGVmaW5pdGlvbiBmdW5jdGlvbiBpZiBuZWVkZWQuDQogKi8NCnZhciBsb29rdXAgPSBmdW5jdGlvbihwYXJlbnRJZCwgbW9kdWxlTmFtZSkgew0KDQogICAgbW9kdWxlTmFtZSA9IG5vcm1hbGl6ZU1vZHVsZShwYXJlbnRJZCwgbW9kdWxlTmFtZSk7DQoNCiAgICB2YXIgbW9kdWxlID0gX2RlZmluZS5tb2R1bGVzW21vZHVsZU5hbWVdOw0KICAgIGlmICghbW9kdWxlKSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH0NCg0KICAgIGlmICh0eXBlb2YgbW9kdWxlID09PSAnZnVuY3Rpb24nKSB7DQogICAgICAgIHZhciBleHBvcnRzID0ge307DQogICAgICAgIHZhciBtb2QgPSB7DQogICAgICAgICAgICBpZDogbW9kdWxlTmFtZSwgDQogICAgICAgICAgICB1cmk6ICcnLA0KICAgICAgICAgICAgZXhwb3J0czogZXhwb3J0cywNCiAgICAgICAgICAgIHBhY2thZ2VkOiB0cnVlDQogICAgICAgIH07DQogICAgICAgIA0KICAgICAgICB2YXIgcmVxID0gZnVuY3Rpb24obW9kdWxlLCBjYWxsYmFjaykgew0KICAgICAgICAgICAgcmV0dXJuIF9yZXF1aXJlKG1vZHVsZU5hbWUsIG1vZHVsZSwgY2FsbGJhY2spOw0KICAgICAgICB9Ow0KICAgICAgICANCiAgICAgICAgdmFyIHJldHVyblZhbHVlID0gbW9kdWxlKHJlcSwgZXhwb3J0cywgbW9kKTsNCiAgICAgICAgZXhwb3J0cyA9IHJldHVyblZhbHVlIHx8IG1vZC5leHBvcnRzOw0KICAgICAgICAgICAgDQogICAgICAgIC8vIGNhY2hlIHRoZSByZXN1bHRpbmcgbW9kdWxlIG9iamVjdCBmb3IgbmV4dCB0aW1lDQogICAgICAgIF9kZWZpbmUubW9kdWxlc1ttb2R1bGVOYW1lXSA9IGV4cG9ydHM7DQogICAgICAgIHJldHVybiBleHBvcnRzOw0KICAgIH0NCg0KICAgIHJldHVybiBtb2R1bGU7DQp9Ow0KDQpmdW5jdGlvbiBleHBvcnRBY2UobnMpIHsNCiAgICB2YXIgcmVxdWlyZSA9IGZ1bmN0aW9uKG1vZHVsZSwgY2FsbGJhY2spIHsNCiAgICAgICAgcmV0dXJuIF9yZXF1aXJlKCIiLCBtb2R1bGUsIGNhbGxiYWNrKTsNCiAgICB9Ow0KICAgIHJlcXVpcmUucGFja2FnZWQgPSB0cnVlOw0KICAgIA0KICAgIHZhciByb290ID0gZ2xvYmFsOw0KICAgIGlmIChucykgew0KICAgICAgICBpZiAoIWdsb2JhbFtuc10pDQogICAgICAgICAgICBnbG9iYWxbbnNdID0ge307DQogICAgICAgIHJvb3QgPSBnbG9iYWxbbnNdOw0KICAgIH0NCiAgICAgICAgDQogICAgaWYgKHJvb3QuZGVmaW5lKQ0KICAgICAgICBfZGVmaW5lLm9yaWdpbmFsID0gcm9vdC5kZWZpbmU7DQogICAgDQogICAgcm9vdC5kZWZpbmUgPSBfZGVmaW5lOw0KDQogICAgaWYgKHJvb3QucmVxdWlyZSkNCiAgICAgICAgX3JlcXVpcmUub3JpZ2luYWwgPSByb290LnJlcXVpcmU7DQogICAgDQogICAgcm9vdC5yZXF1aXJlID0gcmVxdWlyZTsNCn0NCg0KZXhwb3J0QWNlKEFDRV9OQU1FU1BBQ0UpOw0KDQp9KSgpOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFNreXdyaXRlci4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIE1vemlsbGEuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDA5DQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEtldmluIERhbmdvb3IgKGtkYW5nb29yQG1vemlsbGEuY29tKQ0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2FjZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9maXhvbGRicm93c2VycycsICdhY2UvbGliL2RvbScsICdhY2UvbGliL2V2ZW50JywgJ2FjZS9lZGl0b3InLCAnYWNlL2VkaXRfc2Vzc2lvbicsICdhY2UvdW5kb21hbmFnZXInLCAnYWNlL3ZpcnR1YWxfcmVuZGVyZXInLCAnYWNlL3RoZW1lL3RleHRtYXRlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQpyZXF1aXJlKCIuL2xpYi9maXhvbGRicm93c2VycyIpOw0KDQp2YXIgRG9tID0gcmVxdWlyZSgiLi9saWIvZG9tIik7DQp2YXIgRXZlbnQgPSByZXF1aXJlKCIuL2xpYi9ldmVudCIpOw0KDQp2YXIgRWRpdG9yID0gcmVxdWlyZSgiLi9lZGl0b3IiKS5FZGl0b3I7DQp2YXIgRWRpdFNlc3Npb24gPSByZXF1aXJlKCIuL2VkaXRfc2Vzc2lvbiIpLkVkaXRTZXNzaW9uOw0KdmFyIFVuZG9NYW5hZ2VyID0gcmVxdWlyZSgiLi91bmRvbWFuYWdlciIpLlVuZG9NYW5hZ2VyOw0KdmFyIFJlbmRlcmVyID0gcmVxdWlyZSgiLi92aXJ0dWFsX3JlbmRlcmVyIikuVmlydHVhbFJlbmRlcmVyOw0KDQpleHBvcnRzLmVkaXQgPSBmdW5jdGlvbihlbCkgew0KICAgIGlmICh0eXBlb2YoZWwpID09ICJzdHJpbmciKSB7DQogICAgICAgIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwpOw0KICAgIH0NCg0KICAgIHZhciBkb2MgPSBuZXcgRWRpdFNlc3Npb24oRG9tLmdldElubmVyVGV4dChlbCkpOw0KICAgIGRvYy5zZXRVbmRvTWFuYWdlcihuZXcgVW5kb01hbmFnZXIoKSk7DQogICAgZWwuaW5uZXJIVE1MID0gJyc7DQoNCiAgICB2YXIgZWRpdG9yID0gbmV3IEVkaXRvcihuZXcgUmVuZGVyZXIoZWwsIHJlcXVpcmUoIi4vdGhlbWUvdGV4dG1hdGUiKSkpOw0KICAgIGVkaXRvci5zZXRTZXNzaW9uKGRvYyk7DQoNCiAgICB2YXIgZW52ID0ge307DQogICAgZW52LmRvY3VtZW50ID0gZG9jOw0KICAgIGVudi5lZGl0b3IgPSBlZGl0b3I7DQogICAgZWRpdG9yLnJlc2l6ZSgpOw0KICAgIEV2ZW50LmFkZExpc3RlbmVyKHdpbmRvdywgInJlc2l6ZSIsIGZ1bmN0aW9uKCkgew0KICAgICAgICBlZGl0b3IucmVzaXplKCk7DQogICAgfSk7DQogICAgZWwuZW52ID0gZW52Ow0KICAgIC8vIFN0b3JlIGVudiBvbiBlZGl0b3Igc3VjaCB0aGF0IGl0IGNhbiBiZSBhY2Nlc3NlZCBsYXRlciBvbiBmcm9tDQogICAgLy8gdGhlIHJldHVybmVkIG9iamVjdC4NCiAgICBlZGl0b3IuZW52ID0gZW52Ow0KICAgIHJldHVybiBlZGl0b3I7DQp9Ow0KDQp9KTsvLyB2aW06c2V0IHRzPTQgc3RzPTQgc3c9NCBzdDoNCi8vIC0tIGtyaXNrb3dhbCBLcmlzIEtvd2FsIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlDQovLyAtLSB0bHJvYmluc29uIFRvbSBSb2JpbnNvbiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBNSVQgTGljZW5zZSAoTmFyd2hhbCBQcm9qZWN0KQ0KLy8gLS0gZGFudG1hbiBEYW5pZWwgRnJpZXNlbiBDb3B5cmlnaHQoQykgMjAxMCBYWFggTm8gTGljZW5zZSBTcGVjaWZpZWQNCi8vIC0tIGZzY2hhZWZlciBGbG9yaWFuIFNjaMOkZmVyIENvcHlyaWdodCAoQykgMjAxMCBNSVQgTGljZW5zZQ0KLy8gLS0gSXJha2xpIEdvemFsaXNodmlsaSBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCg0KLyohDQogICAgQ29weXJpZ2h0IChjKSAyMDA5LCAyODAgTm9ydGggSW5jLiBodHRwOi8vMjgwbm9ydGguY29tLw0KICAgIE1JVCBMaWNlbnNlLiBodHRwOi8vZ2l0aHViLmNvbS8yODBub3J0aC9uYXJ3aGFsL2Jsb2IvbWFzdGVyL1JFQURNRS5tZA0KKi8NCg0KZGVmaW5lKCdhY2UvbGliL2ZpeG9sZGJyb3dzZXJzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL3JlZ2V4cCcsICdhY2UvbGliL2VzNS1zaGltJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQpyZXF1aXJlKCIuL3JlZ2V4cCIpOw0KcmVxdWlyZSgiLi9lczUtc2hpbSIpOw0KDQp9KTsvKioNCiAqICBCYXNlZCBvbiBjb2RlIGZyb206DQogKg0KICogWFJlZ0V4cCAxLjUuMA0KICogKGMpIDIwMDctMjAxMCBTdGV2ZW4gTGV2aXRoYW4NCiAqIE1JVCBMaWNlbnNlDQogKiA8aHR0cDovL3hyZWdleHAuY29tPg0KICogUHJvdmlkZXMgYW4gYXVnbWVudGVkLCBleHRlbnNpYmxlLCBjcm9zcy1icm93c2VyIGltcGxlbWVudGF0aW9uIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsDQogKiBpbmNsdWRpbmcgc3VwcG9ydCBmb3IgYWRkaXRpb25hbCBzeW50YXgsIGZsYWdzLCBhbmQgbWV0aG9kcw0KICovDQogDQpkZWZpbmUoJ2FjZS9saWIvcmVnZXhwJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gIFByaXZhdGUgdmFyaWFibGVzDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgIHZhciByZWFsID0gew0KICAgICAgICAgICAgZXhlYzogUmVnRXhwLnByb3RvdHlwZS5leGVjLA0KICAgICAgICAgICAgdGVzdDogUmVnRXhwLnByb3RvdHlwZS50ZXN0LA0KICAgICAgICAgICAgbWF0Y2g6IFN0cmluZy5wcm90b3R5cGUubWF0Y2gsDQogICAgICAgICAgICByZXBsYWNlOiBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UsDQogICAgICAgICAgICBzcGxpdDogU3RyaW5nLnByb3RvdHlwZS5zcGxpdA0KICAgICAgICB9LA0KICAgICAgICBjb21wbGlhbnRFeGVjTnBjZyA9IHJlYWwuZXhlYy5jYWxsKC8oKT8/LywgIiIpWzFdID09PSB1bmRlZmluZWQsIC8vIGNoZWNrIGBleGVjYCBoYW5kbGluZyBvZiBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cHMNCiAgICAgICAgY29tcGxpYW50TGFzdEluZGV4SW5jcmVtZW50ID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHggPSAvXi9nOw0KICAgICAgICAgICAgcmVhbC50ZXN0LmNhbGwoeCwgIiIpOw0KICAgICAgICAgICAgcmV0dXJuICF4Lmxhc3RJbmRleDsNCiAgICAgICAgfSgpOw0KDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAvLyAgT3ZlcnJpZGVuIG5hdGl2ZSBtZXRob2RzDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgIC8vIEFkZHMgbmFtZWQgY2FwdHVyZSBzdXBwb3J0ICh3aXRoIGJhY2tyZWZlcmVuY2VzIHJldHVybmVkIGFzIGByZXN1bHQubmFtZWApLCBhbmQgZml4ZXMgdHdvDQogICAgLy8gY3Jvc3MtYnJvd3NlciBpc3N1ZXMgcGVyIEVTMzoNCiAgICAvLyAtIENhcHR1cmVkIHZhbHVlcyBmb3Igbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzIHNob3VsZCBiZSByZXR1cm5lZCBhcyBgdW5kZWZpbmVkYCwNCiAgICAvLyAgIHJhdGhlciB0aGFuIHRoZSBlbXB0eSBzdHJpbmcuDQogICAgLy8gLSBgbGFzdEluZGV4YCBzaG91bGQgbm90IGJlIGluY3JlbWVudGVkIGFmdGVyIHplcm8tbGVuZ3RoIG1hdGNoZXMuDQogICAgUmVnRXhwLnByb3RvdHlwZS5leGVjID0gZnVuY3Rpb24gKHN0cikgew0KICAgICAgICB2YXIgbWF0Y2ggPSByZWFsLmV4ZWMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwNCiAgICAgICAgICAgIG5hbWUsIHIyOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIC8vIEZpeCBicm93c2VycyB3aG9zZSBgZXhlY2AgbWV0aG9kcyBkb24ndCBjb25zaXN0ZW50bHkgcmV0dXJuIGB1bmRlZmluZWRgIGZvcg0KICAgICAgICAgICAgLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzDQogICAgICAgICAgICBpZiAoIWNvbXBsaWFudEV4ZWNOcGNnICYmIG1hdGNoLmxlbmd0aCA+IDEgJiYgaW5kZXhPZihtYXRjaCwgIiIpID4gLTEpIHsNCiAgICAgICAgICAgICAgICByMiA9IFJlZ0V4cCh0aGlzLnNvdXJjZSwgcmVhbC5yZXBsYWNlLmNhbGwoZ2V0TmF0aXZlRmxhZ3ModGhpcyksICJnIiwgIiIpKTsNCiAgICAgICAgICAgICAgICAvLyBVc2luZyBgc3RyLnNsaWNlKG1hdGNoLmluZGV4KWAgcmF0aGVyIHRoYW4gYG1hdGNoWzBdYCBpbiBjYXNlIGxvb2thaGVhZCBhbGxvd2VkDQogICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgZHVlIHRvIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGUgbWF0Y2gNCiAgICAgICAgICAgICAgICByZWFsLnJlcGxhY2UuY2FsbChzdHIuc2xpY2UobWF0Y2guaW5kZXgpLCByMiwgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAyOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHNbaV0gPT09IHVuZGVmaW5lZCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFtpXSA9IHVuZGVmaW5lZDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gQXR0YWNoIG5hbWVkIGNhcHR1cmUgcHJvcGVydGllcw0KICAgICAgICAgICAgaWYgKHRoaXMuX3hyZWdleHAgJiYgdGhpcy5feHJlZ2V4cC5jYXB0dXJlTmFtZXMpIHsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IG1hdGNoLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lc1tpIC0gMV07DQogICAgICAgICAgICAgICAgICAgIGlmIChuYW1lKQ0KICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFtuYW1lXSA9IG1hdGNoW2ldOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIEZpeCBicm93c2VycyB0aGF0IGluY3JlbWVudCBgbGFzdEluZGV4YCBhZnRlciB6ZXJvLWxlbmd0aCBtYXRjaGVzDQogICAgICAgICAgICBpZiAoIWNvbXBsaWFudExhc3RJbmRleEluY3JlbWVudCAmJiB0aGlzLmdsb2JhbCAmJiAhbWF0Y2hbMF0ubGVuZ3RoICYmICh0aGlzLmxhc3RJbmRleCA+IG1hdGNoLmluZGV4KSkNCiAgICAgICAgICAgICAgICB0aGlzLmxhc3RJbmRleC0tOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBtYXRjaDsNCiAgICB9Ow0KDQogICAgLy8gRG9uJ3Qgb3ZlcnJpZGUgYHRlc3RgIGlmIGl0IHdvbid0IGNoYW5nZSBhbnl0aGluZw0KICAgIGlmICghY29tcGxpYW50TGFzdEluZGV4SW5jcmVtZW50KSB7DQogICAgICAgIC8vIEZpeCBicm93c2VyIGJ1ZyBpbiBuYXRpdmUgbWV0aG9kDQogICAgICAgIFJlZ0V4cC5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uIChzdHIpIHsNCiAgICAgICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIGBleGVjYCB0byBza2lwIHNvbWUgcHJvY2Vzc2luZyBvdmVyaGVhZCwgZXZlbiB0aG91Z2ggdGhlIG92ZXJyaWRlbg0KICAgICAgICAgICAgLy8gYGV4ZWNgIHdvdWxkIHRha2UgY2FyZSBvZiB0aGUgYGxhc3RJbmRleGAgZml4DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSByZWFsLmV4ZWMuY2FsbCh0aGlzLCBzdHIpOw0KICAgICAgICAgICAgLy8gRml4IGJyb3dzZXJzIHRoYXQgaW5jcmVtZW50IGBsYXN0SW5kZXhgIGFmdGVyIHplcm8tbGVuZ3RoIG1hdGNoZXMNCiAgICAgICAgICAgIGlmIChtYXRjaCAmJiB0aGlzLmdsb2JhbCAmJiAhbWF0Y2hbMF0ubGVuZ3RoICYmICh0aGlzLmxhc3RJbmRleCA+IG1hdGNoLmluZGV4KSkNCiAgICAgICAgICAgICAgICB0aGlzLmxhc3RJbmRleC0tOw0KICAgICAgICAgICAgcmV0dXJuICEhbWF0Y2g7DQogICAgICAgIH07DQogICAgfQ0KDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAvLyAgUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb25zDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgIGZ1bmN0aW9uIGdldE5hdGl2ZUZsYWdzIChyZWdleCkgew0KICAgICAgICByZXR1cm4gKHJlZ2V4Lmdsb2JhbCAgICAgPyAiZyIgOiAiIikgKw0KICAgICAgICAgICAgICAgKHJlZ2V4Lmlnbm9yZUNhc2UgPyAiaSIgOiAiIikgKw0KICAgICAgICAgICAgICAgKHJlZ2V4Lm11bHRpbGluZSAgPyAibSIgOiAiIikgKw0KICAgICAgICAgICAgICAgKHJlZ2V4LmV4dGVuZGVkICAgPyAieCIgOiAiIikgKyAvLyBQcm9wb3NlZCBmb3IgRVM0OyBpbmNsdWRlZCBpbiBBUzMNCiAgICAgICAgICAgICAgIChyZWdleC5zdGlja3kgICAgID8gInkiIDogIiIpOw0KICAgIH07DQoNCiAgICBmdW5jdGlvbiBpbmRleE9mIChhcnJheSwgaXRlbSwgZnJvbSkgew0KICAgICAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIC8vIFVzZSB0aGUgbmF0aXZlIGFycmF5IG1ldGhvZCBpZiBhdmFpbGFibGUNCiAgICAgICAgICAgIHJldHVybiBhcnJheS5pbmRleE9mKGl0ZW0sIGZyb20pOw0KICAgICAgICBmb3IgKHZhciBpID0gZnJvbSB8fCAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PT0gaXRlbSkNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCg0KfSk7Ly8gdmltOiB0cz00IHN0cz00IHN3PTQgZXhwYW5kdGFiDQovLyAtLSBrcmlza293YWwgS3JpcyBLb3dhbCBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0gdGxyb2JpbnNvbiBUb20gUm9iaW5zb24gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTUlUIExpY2Vuc2UgKE5hcndoYWwgUHJvamVjdCkNCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0IChDKSAyMDEwIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBmc2NoYWVmZXIgRmxvcmlhbiBTY2jDpGZlciBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIEdvemFsYSBJcmFrbGkgR296YWxpc2h2aWxpIENvcHlyaWdodCAoQykgMjAxMCBNSVQgTGljZW5zZQ0KLy8gLS0ga2l0Y2FtYnJpZGdlIEtpdCBDYW1icmlkZ2UgQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbnNlDQovLyAtLSBrb3Nzbm9jb3JwIFNhc2hhIEtvc3MgWFhYIFRPRE8gTGljZW5zZSBvciBDTEENCi8vIC0tIGJyeWFuZm9yYmVzIEJyeWFuIEZvcmJlcyBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQ0KLy8gLS0ga2lsbGRyZWFtIFF1aWxkcmVlbiBNb3R0YSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2VuY2UNCi8vIC0tIG1pY2hhZWxmaWNhcnJhIE1pY2hhZWwgRmljYXJyYSBDb3B5cmlnaHQgKEMpIDIwMTEgMy1jbGF1c2UgQlNEIExpY2Vuc2UNCi8vIC0tIHNoYXJrYnJhaW5ndXkgR2VyYXJkIFBhYXB1IENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0gYmJxc3JjIEJyZW5kYW4gTW9sbG95IChDKSAyMDExIENyZWF0aXZlIENvbW1vbnMgWmVybyAocHVibGljIGRvbWFpbikNCi8vIC0tIGl3eWcgWFhYIFRPRE8gTGljZW5zZSBvciBDTEENCi8vIC0tIERvbWVuaWNEZW5pY29sYSBEb21lbmljIERlbmljb2xhIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0geGF2aWVybTAyIE1vbnRpbGxldCBYYXZpZXIgWFhYIFRPRE8gTGljZW5zZSBvciBDTEENCi8vIC0tIFJheW5vcyBSYXlub3MgWFhYIFRPRE8gTGljZW5zZSBvciBDTEENCi8vIC0tIHNhbXNvbmpzIFNhbWkgU2FtaHVyaSBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIHJ3bGRybiBSaWNrIFdhbGRyb24gQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbnNlDQovLyAtLSBsZXhlciBBbGV4ZXkgWmFraGFyb3YgWFhYIFRPRE8gTGljZW5zZSBvciBDTEENCg0KLyohDQogICAgQ29weXJpZ2h0IChjKSAyMDA5LCAyODAgTm9ydGggSW5jLiBodHRwOi8vMjgwbm9ydGguY29tLw0KICAgIE1JVCBMaWNlbnNlLiBodHRwOi8vZ2l0aHViLmNvbS8yODBub3J0aC9uYXJ3aGFsL2Jsb2IvbWFzdGVyL1JFQURNRS5tZA0KKi8NCg0KZGVmaW5lKCdhY2UvbGliL2VzNS1zaGltJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KLyoqDQogKiBCcmluZ3MgYW4gZW52aXJvbm1lbnQgYXMgY2xvc2UgdG8gRUNNQVNjcmlwdCA1IGNvbXBsaWFuY2UNCiAqIGFzIGlzIHBvc3NpYmxlIHdpdGggdGhlIGZhY2lsaXRpZXMgb2YgZXJzdHdoaWxlIGVuZ2luZXMuDQogKg0KICogQW5ub3RhdGVkIEVTNTogaHR0cDovL2VzNS5naXRodWIuY29tLyAoc3BlY2lmaWMgbGlua3MgYmVsb3cpDQogKiBFUzUgU3BlYzogaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9maWxlcy9FQ01BLVNUL0VjbWEtMjYyLnBkZg0KICoNCiAqIEBtb2R1bGUNCiAqLw0KDQovKndoYXRzdXBkb2MqLw0KDQovLw0KLy8gRnVuY3Rpb24NCi8vID09PT09PT09DQovLw0KDQovLyBFUy01IDE1LjMuNC41DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4zLjQuNQ0KDQppZiAoIUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kKSB7DQogICAgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiBiaW5kKHRoYXQpIHsgLy8gLmxlbmd0aCBpcyAxDQogICAgICAgIC8vIDEuIExldCBUYXJnZXQgYmUgdGhlIHRoaXMgdmFsdWUuDQogICAgICAgIHZhciB0YXJnZXQgPSB0aGlzOw0KICAgICAgICAvLyAyLiBJZiBJc0NhbGxhYmxlKFRhcmdldCkgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgIT0gImZ1bmN0aW9uIikNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIC8vIDMuIExldCBBIGJlIGEgbmV3IChwb3NzaWJseSBlbXB0eSkgaW50ZXJuYWwgbGlzdCBvZiBhbGwgb2YgdGhlDQogICAgICAgIC8vICAgYXJndW1lbnQgdmFsdWVzIHByb3ZpZGVkIGFmdGVyIHRoaXNBcmcgKGFyZzEsIGFyZzIgZXRjKSwgaW4gb3JkZXIuDQogICAgICAgIC8vIFhYWCBzbGljZWRBcmdzIHdpbGwgc3RhbmQgaW4gZm9yICJBIiBpZiB1c2VkDQogICAgICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOyAvLyBmb3Igbm9ybWFsIGNhbGwNCiAgICAgICAgLy8gNC4gTGV0IEYgYmUgYSBuZXcgbmF0aXZlIEVDTUFTY3JpcHQgb2JqZWN0Lg0KICAgICAgICAvLyAxMS4gU2V0IHRoZSBbW1Byb3RvdHlwZV1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgdG8gdGhlIHN0YW5kYXJkDQogICAgICAgIC8vICAgYnVpbHQtaW4gRnVuY3Rpb24gcHJvdG90eXBlIG9iamVjdCBhcyBzcGVjaWZpZWQgaW4gMTUuMy4zLjEuDQogICAgICAgIC8vIDEyLiBTZXQgdGhlIFtbQ2FsbF1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgYXMgZGVzY3JpYmVkIGluDQogICAgICAgIC8vICAgMTUuMy40LjUuMS4NCiAgICAgICAgLy8gMTMuIFNldCB0aGUgW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbg0KICAgICAgICAvLyAgIDE1LjMuNC41LjIuDQogICAgICAgIC8vIDE0LiBTZXQgdGhlIFtbSGFzSW5zdGFuY2VdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbg0KICAgICAgICAvLyAgIDE1LjMuNC41LjMuDQogICAgICAgIHZhciBib3VuZCA9IGZ1bmN0aW9uICgpIHsNCg0KICAgICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkgew0KICAgICAgICAgICAgICAgIC8vIDE1LjMuNC41LjIgW1tDb25zdHJ1Y3RdXQ0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kIG9mIGEgZnVuY3Rpb24gb2JqZWN0LA0KICAgICAgICAgICAgICAgIC8vIEYgdGhhdCB3YXMgY3JlYXRlZCB1c2luZyB0aGUgYmluZCBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhDQogICAgICAgICAgICAgICAgLy8gbGlzdCBvZiBhcmd1bWVudHMgRXh0cmFBcmdzLCB0aGUgZm9sbG93aW5nIHN0ZXBzIGFyZSB0YWtlbjoNCiAgICAgICAgICAgICAgICAvLyAxLiBMZXQgdGFyZ2V0IGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tUYXJnZXRGdW5jdGlvbl1dDQogICAgICAgICAgICAgICAgLy8gICBpbnRlcm5hbCBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyAyLiBJZiB0YXJnZXQgaGFzIG5vIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kLCBhDQogICAgICAgICAgICAgICAgLy8gICBUeXBlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi4NCiAgICAgICAgICAgICAgICAvLyAzLiBMZXQgYm91bmRBcmdzIGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tCb3VuZEFyZ3NdXSBpbnRlcm5hbA0KICAgICAgICAgICAgICAgIC8vICAgcHJvcGVydHkuDQogICAgICAgICAgICAgICAgLy8gNC4gTGV0IGFyZ3MgYmUgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUNCiAgICAgICAgICAgICAgICAvLyAgIGxpc3QgYm91bmRBcmdzIGluIHRoZSBzYW1lIG9yZGVyIGZvbGxvd2VkIGJ5IHRoZSBzYW1lDQogICAgICAgICAgICAgICAgLy8gICB2YWx1ZXMgYXMgdGhlIGxpc3QgRXh0cmFBcmdzIGluIHRoZSBzYW1lIG9yZGVyLg0KICAgICAgICAgICAgICAgIC8vIDUuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgDQogICAgICAgICAgICAgICAgLy8gICBtZXRob2Qgb2YgdGFyZ2V0IHByb3ZpZGluZyBhcmdzIGFzIHRoZSBhcmd1bWVudHMuDQoNCiAgICAgICAgICAgICAgICB2YXIgRiA9IGZ1bmN0aW9uKCl7fTsNCiAgICAgICAgICAgICAgICBGLnByb3RvdHlwZSA9IHRhcmdldC5wcm90b3R5cGU7DQogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSBuZXcgRjsNCg0KICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0YXJnZXQuYXBwbHkoDQogICAgICAgICAgICAgICAgICAgIHNlbGYsDQogICAgICAgICAgICAgICAgICAgIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgT2JqZWN0KHJlc3VsdCkgPT09IHJlc3VsdCkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjsNCg0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAvLyAxNS4zLjQuNS4xIFtbQ2FsbF1dDQogICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgW1tDYWxsXV0gaW50ZXJuYWwgbWV0aG9kIG9mIGEgZnVuY3Rpb24gb2JqZWN0LCBGLA0KICAgICAgICAgICAgICAgIC8vIHdoaWNoIHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBiaW5kIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGENCiAgICAgICAgICAgICAgICAvLyB0aGlzIHZhbHVlIGFuZCBhIGxpc3Qgb2YgYXJndW1lbnRzIEV4dHJhQXJncywgdGhlIGZvbGxvd2luZw0KICAgICAgICAgICAgICAgIC8vIHN0ZXBzIGFyZSB0YWtlbjoNCiAgICAgICAgICAgICAgICAvLyAxLiBMZXQgYm91bmRBcmdzIGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tCb3VuZEFyZ3NdXSBpbnRlcm5hbA0KICAgICAgICAgICAgICAgIC8vICAgcHJvcGVydHkuDQogICAgICAgICAgICAgICAgLy8gMi4gTGV0IGJvdW5kVGhpcyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRUaGlzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDMuIExldCB0YXJnZXQgYmUgdGhlIHZhbHVlIG9mIEYncyBbW1RhcmdldEZ1bmN0aW9uXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDQuIExldCBhcmdzIGJlIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlIA0KICAgICAgICAgICAgICAgIC8vICAgbGlzdCBib3VuZEFyZ3MgaW4gdGhlIHNhbWUgb3JkZXIgZm9sbG93ZWQgYnkgdGhlIHNhbWUgDQogICAgICAgICAgICAgICAgLy8gICB2YWx1ZXMgYXMgdGhlIGxpc3QgRXh0cmFBcmdzIGluIHRoZSBzYW1lIG9yZGVyLg0KICAgICAgICAgICAgICAgIC8vIDUuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCANCiAgICAgICAgICAgICAgICAvLyAgIG9mIHRhcmdldCBwcm92aWRpbmcgYm91bmRUaGlzIGFzIHRoZSB0aGlzIHZhbHVlIGFuZCANCiAgICAgICAgICAgICAgICAvLyAgIHByb3ZpZGluZyBhcmdzIGFzIHRoZSBhcmd1bWVudHMuDQoNCiAgICAgICAgICAgICAgICAvLyBlcXVpdjogdGFyZ2V0LmNhbGwodGhpcywgLi4uYm91bmRBcmdzLCAuLi5hcmdzKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQuYXBwbHkoDQogICAgICAgICAgICAgICAgICAgIHRoYXQsDQogICAgICAgICAgICAgICAgICAgIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkNCiAgICAgICAgICAgICAgICApOw0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgfTsNCiAgICAgICAgLy8gWFhYIGJvdW5kLmxlbmd0aCBpcyBuZXZlciB3cml0YWJsZSwgc28gZG9uJ3QgZXZlbiB0cnkNCiAgICAgICAgLy8NCiAgICAgICAgLy8gMTUuIElmIHRoZSBbW0NsYXNzXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgVGFyZ2V0IGlzICJGdW5jdGlvbiIsIHRoZW4NCiAgICAgICAgLy8gICAgIGEuIExldCBMIGJlIHRoZSBsZW5ndGggcHJvcGVydHkgb2YgVGFyZ2V0IG1pbnVzIHRoZSBsZW5ndGggb2YgQS4NCiAgICAgICAgLy8gICAgIGIuIFNldCB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIGVpdGhlciAwIG9yIEwsIHdoaWNoZXZlciBpcyANCiAgICAgICAgLy8gICAgICAgbGFyZ2VyLg0KICAgICAgICAvLyAxNi4gRWxzZSBzZXQgdGhlIGxlbmd0aCBvd24gcHJvcGVydHkgb2YgRiB0byAwLg0KICAgICAgICAvLyAxNy4gU2V0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBsZW5ndGggb3duIHByb3BlcnR5IG9mIEYgdG8gdGhlIHZhbHVlcw0KICAgICAgICAvLyAgIHNwZWNpZmllZCBpbiAxNS4zLjUuMS4NCg0KICAgICAgICAvLyBUT0RPDQogICAgICAgIC8vIDE4LiBTZXQgdGhlIFtbRXh0ZW5zaWJsZV1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgdG8gdHJ1ZS4NCiAgICAgICAgDQogICAgICAgIC8vIFRPRE8NCiAgICAgICAgLy8gMTkuIExldCB0aHJvd2VyIGJlIHRoZSBbW1Rocm93VHlwZUVycm9yXV0gZnVuY3Rpb24gT2JqZWN0ICgxMy4yLjMpLg0KICAgICAgICAvLyAyMC4gQ2FsbCB0aGUgW1tEZWZpbmVPd25Qcm9wZXJ0eV1dIGludGVybmFsIG1ldGhvZCBvZiBGIHdpdGggDQogICAgICAgIC8vICAgYXJndW1lbnRzICJjYWxsZXIiLCBQcm9wZXJ0eURlc2NyaXB0b3Ige1tbR2V0XV06IHRocm93ZXIsIFtbU2V0XV06DQogICAgICAgIC8vICAgdGhyb3dlciwgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiBmYWxzZX0sIGFuZCANCiAgICAgICAgLy8gICBmYWxzZS4NCiAgICAgICAgLy8gMjEuIENhbGwgdGhlIFtbRGVmaW5lT3duUHJvcGVydHldXSBpbnRlcm5hbCBtZXRob2Qgb2YgRiB3aXRoIA0KICAgICAgICAvLyAgIGFyZ3VtZW50cyAiYXJndW1lbnRzIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCANCiAgICAgICAgLy8gICBbW1NldF1dOiB0aHJvd2VyLCBbW0VudW1lcmFibGVdXTogZmFsc2UsIFtbQ29uZmlndXJhYmxlXV06IGZhbHNlfSwNCiAgICAgICAgLy8gICBhbmQgZmFsc2UuDQoNCiAgICAgICAgLy8gVE9ETw0KICAgICAgICAvLyBOT1RFIEZ1bmN0aW9uIG9iamVjdHMgY3JlYXRlZCB1c2luZyBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBkbyBub3QgDQogICAgICAgIC8vIGhhdmUgYSBwcm90b3R5cGUgcHJvcGVydHkgb3IgdGhlIFtbQ29kZV1dLCBbW0Zvcm1hbFBhcmFtZXRlcnNdXSwgYW5kDQogICAgICAgIC8vIFtbU2NvcGVdXSBpbnRlcm5hbCBwcm9wZXJ0aWVzLg0KICAgICAgICAvLyBYWFggY2FuJ3QgZGVsZXRlIHByb3RvdHlwZSBpbiBwdXJlLWpzLg0KDQogICAgICAgIC8vIDIyLiBSZXR1cm4gRi4NCiAgICAgICAgcmV0dXJuIGJvdW5kOw0KICAgIH07DQp9DQoNCi8vIFNob3J0Y3V0IHRvIGFuIG9mdGVuIGFjY2Vzc2VkIHByb3BlcnRpZXMsIGluIG9yZGVyIHRvIGF2b2lkIG11bHRpcGxlDQovLyBkZXJlZmVyZW5jZSB0aGF0IGNvc3RzIHVuaXZlcnNhbGx5Lg0KLy8gX1BsZWFzZSBub3RlOiBTaG9ydGN1dHMgYXJlIGRlZmluZWQgYWZ0ZXIgYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYCBhcyB3ZQ0KLy8gdXMgaXQgaW4gZGVmaW5pbmcgc2hvcnRjdXRzLg0KdmFyIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDsNCnZhciBwcm90b3R5cGVPZkFycmF5ID0gQXJyYXkucHJvdG90eXBlOw0KdmFyIHByb3RvdHlwZU9mT2JqZWN0ID0gT2JqZWN0LnByb3RvdHlwZTsNCnZhciBzbGljZSA9IHByb3RvdHlwZU9mQXJyYXkuc2xpY2U7DQp2YXIgdG9TdHJpbmcgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QudG9TdHJpbmcpOw0KdmFyIG93bnMgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuaGFzT3duUHJvcGVydHkpOw0KDQovLyBJZiBKUyBlbmdpbmUgc3VwcG9ydHMgYWNjZXNzb3JzIGNyZWF0aW5nIHNob3J0Y3V0cy4NCnZhciBkZWZpbmVHZXR0ZXI7DQp2YXIgZGVmaW5lU2V0dGVyOw0KdmFyIGxvb2t1cEdldHRlcjsNCnZhciBsb29rdXBTZXR0ZXI7DQp2YXIgc3VwcG9ydHNBY2Nlc3NvcnM7DQppZiAoKHN1cHBvcnRzQWNjZXNzb3JzID0gb3ducyhwcm90b3R5cGVPZk9iamVjdCwgIl9fZGVmaW5lR2V0dGVyX18iKSkpIHsNCiAgICBkZWZpbmVHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19kZWZpbmVHZXR0ZXJfXyk7DQogICAgZGVmaW5lU2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fZGVmaW5lU2V0dGVyX18pOw0KICAgIGxvb2t1cEdldHRlciA9IGNhbGwuYmluZChwcm90b3R5cGVPZk9iamVjdC5fX2xvb2t1cEdldHRlcl9fKTsNCiAgICBsb29rdXBTZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBTZXR0ZXJfXyk7DQp9DQoNCi8vDQovLyBBcnJheQ0KLy8gPT09PT0NCi8vDQoNCi8vIEVTNSAxNS40LjMuMg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC4zLjINCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2lzQXJyYXkNCmlmICghQXJyYXkuaXNBcnJheSkgew0KICAgIEFycmF5LmlzQXJyYXkgPSBmdW5jdGlvbiBpc0FycmF5KG9iaikgew0KICAgICAgICByZXR1cm4gdG9TdHJpbmcob2JqKSA9PSAiW29iamVjdCBBcnJheV0iOw0KICAgIH07DQp9DQoNCi8vIFRoZSBJc0NhbGxhYmxlKCkgY2hlY2sgaW4gdGhlIEFycmF5IGZ1bmN0aW9ucw0KLy8gaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhIHN0cmljdCBjaGVjayBvbiB0aGUNCi8vIGludGVybmFsIGNsYXNzIG9mIHRoZSBvYmplY3QgdG8gdHJhcCBjYXNlcyB3aGVyZQ0KLy8gdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHdhcyBhY3R1YWxseSBhIHJlZ3VsYXINCi8vIGV4cHJlc3Npb24gbGl0ZXJhbCwgd2hpY2ggaW4gVjggYW5kDQovLyBKYXZhU2NyaXB0Q29yZSBpcyBhIHR5cGVvZiAiZnVuY3Rpb24iLiAgT25seSBpbg0KLy8gVjggYXJlIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFscyBwZXJtaXR0ZWQgYXMNCi8vIHJlZHVjZSBwYXJhbWV0ZXJzLCBzbyBpdCBpcyBkZXNpcmFibGUgaW4gdGhlDQovLyBnZW5lcmFsIGNhc2UgZm9yIHRoZSBzaGltIHRvIG1hdGNoIHRoZSBtb3JlDQovLyBzdHJpY3QgYW5kIGNvbW1vbiBiZWhhdmlvciBvZiByZWplY3RpbmcgcmVndWxhcg0KLy8gZXhwcmVzc2lvbnMuDQoNCi8vIEVTNSAxNS40LjQuMTgNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xOA0KLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvYXJyYXkvZm9yRWFjaA0KaWYgKCFBcnJheS5wcm90b3R5cGUuZm9yRWFjaCkgew0KICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gZm9yRWFjaChmdW4gLyosIHRoaXNwKi8pIHsNCiAgICAgICAgdmFyIHNlbGYgPSB0b09iamVjdCh0aGlzKSwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdLA0KICAgICAgICAgICAgaSA9IDAsDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMDsNCg0KICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvbg0KICAgICAgICBpZiAodG9TdHJpbmcoZnVuKSAhPSAiW29iamVjdCBGdW5jdGlvbl0iKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICB9DQoNCiAgICAgICAgd2hpbGUgKGkgPCBsZW5ndGgpIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAvLyBJbnZva2UgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggY2FsbCwgcGFzc2luZyBhcmd1bWVudHM6DQogICAgICAgICAgICAgICAgLy8gY29udGV4dCwgcHJvcGVydHkgdmFsdWUsIHByb3BlcnR5IGtleSwgdGhpc0FyZyBvYmplY3QgY29udGV4dA0KICAgICAgICAgICAgICAgIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGkrKzsNCiAgICAgICAgfQ0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS40LjQuMTkNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xOQ0KLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2UvT2JqZWN0cy9BcnJheS9tYXANCmlmICghQXJyYXkucHJvdG90eXBlLm1hcCkgew0KICAgIEFycmF5LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiBtYXAoZnVuIC8qLCB0aGlzcCovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCksDQogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXTsNCg0KICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvbg0KICAgICAgICBpZiAodG9TdHJpbmcoZnVuKSAhPSAiW29iamVjdCBGdW5jdGlvbl0iKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICB9DQoNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikNCiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjIwDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMjANCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvZmlsdGVyDQppZiAoIUFycmF5LnByb3RvdHlwZS5maWx0ZXIpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24gZmlsdGVyKGZ1biAvKiwgdGhpc3AgKi8pIHsNCiAgICAgICAgdmFyIHNlbGYgPSB0b09iamVjdCh0aGlzKSwNCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwLA0KICAgICAgICAgICAgcmVzdWx0ID0gW10sDQogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXTsNCg0KICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvbg0KICAgICAgICBpZiAodG9TdHJpbmcoZnVuKSAhPSAiW29iamVjdCBGdW5jdGlvbl0iKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICB9DQoNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiBmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZikpDQogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc2VsZltpXSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjE2DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTYNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2V2ZXJ5DQppZiAoIUFycmF5LnByb3RvdHlwZS5ldmVyeSkgew0KICAgIEFycmF5LnByb3RvdHlwZS5ldmVyeSA9IGZ1bmN0aW9uIGV2ZXJ5KGZ1biAvKiwgdGhpc3AgKi8pIHsNCiAgICAgICAgdmFyIHNlbGYgPSB0b09iamVjdCh0aGlzKSwNCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgIWZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKSkNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNw0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE3DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9zb21lDQppZiAoIUFycmF5LnByb3RvdHlwZS5zb21lKSB7DQogICAgQXJyYXkucHJvdG90eXBlLnNvbWUgPSBmdW5jdGlvbiBzb21lKGZ1biAvKiwgdGhpc3AgKi8pIHsNCiAgICAgICAgdmFyIHNlbGYgPSB0b09iamVjdCh0aGlzKSwNCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjIxDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMjENCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvcmVkdWNlDQppZiAoIUFycmF5LnByb3RvdHlwZS5yZWR1Y2UpIHsNCiAgICBBcnJheS5wcm90b3R5cGUucmVkdWNlID0gZnVuY3Rpb24gcmVkdWNlKGZ1biAvKiwgaW5pdGlhbCovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMDsNCg0KICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvbg0KICAgICAgICBpZiAodG9TdHJpbmcoZnVuKSAhPSAiW29iamVjdCBGdW5jdGlvbl0iKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gbm8gdmFsdWUgdG8gcmV0dXJuIGlmIG5vIGluaXRpYWwgdmFsdWUgYW5kIGFuIGVtcHR5IGFycmF5DQogICAgICAgIGlmICghbGVuZ3RoICYmIGFyZ3VtZW50cy5sZW5ndGggPT0gMSkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQoNCiAgICAgICAgdmFyIGkgPSAwOw0KICAgICAgICB2YXIgcmVzdWx0Ow0KICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAyKSB7DQogICAgICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbMV07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmW2krK107DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIGlmIGFycmF5IGNvbnRhaW5zIG5vIHZhbHVlcywgbm8gaW5pdGlhbCB2YWx1ZSB0byByZXR1cm4NCiAgICAgICAgICAgICAgICBpZiAoKytpID49IGxlbmd0aCkNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOw0KICAgICAgICB9DQoNCiAgICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikNCiAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW4uY2FsbCh2b2lkIDAsIHJlc3VsdCwgc2VsZltpXSwgaSwgc2VsZik7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS40LjQuMjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4yMg0KLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2UvT2JqZWN0cy9BcnJheS9yZWR1Y2VSaWdodA0KaWYgKCFBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQpIHsNCiAgICBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQgPSBmdW5jdGlvbiByZWR1Y2VSaWdodChmdW4gLyosIGluaXRpYWwqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlLCBlbXB0eSBhcnJheQ0KICAgICAgICBpZiAoIWxlbmd0aCAmJiBhcmd1bWVudHMubGVuZ3RoID09IDEpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KDQogICAgICAgIHZhciByZXN1bHQsIGkgPSBsZW5ndGggLSAxOw0KICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAyKSB7DQogICAgICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbMV07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmW2ktLV07DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIGlmIGFycmF5IGNvbnRhaW5zIG5vIHZhbHVlcywgbm8gaW5pdGlhbCB2YWx1ZSB0byByZXR1cm4NCiAgICAgICAgICAgICAgICBpZiAoLS1pIDwgMCkNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOw0KICAgICAgICB9DQoNCiAgICAgICAgZG8gew0KICAgICAgICAgICAgaWYgKGkgaW4gdGhpcykNCiAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW4uY2FsbCh2b2lkIDAsIHJlc3VsdCwgc2VsZltpXSwgaSwgc2VsZik7DQogICAgICAgIH0gd2hpbGUgKGktLSk7DQoNCiAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjE0DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTQNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2luZGV4T2YNCmlmICghQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2Yoc291Z2h0IC8qLCBmcm9tSW5kZXggKi8gKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMDsNCg0KICAgICAgICBpZiAoIWxlbmd0aCkNCiAgICAgICAgICAgIHJldHVybiAtMTsNCg0KICAgICAgICB2YXIgaSA9IDA7DQogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkNCiAgICAgICAgICAgIGkgPSB0b0ludGVnZXIoYXJndW1lbnRzWzFdKTsNCg0KICAgICAgICAvLyBoYW5kbGUgbmVnYXRpdmUgaW5kaWNlcw0KICAgICAgICBpID0gaSA+PSAwID8gaSA6IE1hdGgubWF4KDAsIGxlbmd0aCArIGkpOw0KICAgICAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIHNlbGZbaV0gPT09IHNvdWdodCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjE1DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTUNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2xhc3RJbmRleE9mDQppZiAoIUFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZikgew0KICAgIEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNvdWdodCAvKiwgZnJvbUluZGV4ICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMDsNCg0KICAgICAgICBpZiAoIWxlbmd0aCkNCiAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgdmFyIGkgPSBsZW5ndGggLSAxOw0KICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpDQogICAgICAgICAgICBpID0gTWF0aC5taW4oaSwgdG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSkpOw0KICAgICAgICAvLyBoYW5kbGUgbmVnYXRpdmUgaW5kaWNlcw0KICAgICAgICBpID0gaSA+PSAwID8gaSA6IGxlbmd0aCAtIE1hdGguYWJzKGkpOw0KICAgICAgICBmb3IgKDsgaSA+PSAwOyBpLS0pIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgc291Z2h0ID09PSBzZWxmW2ldKQ0KICAgICAgICAgICAgICAgIHJldHVybiBpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9Ow0KfQ0KDQovLw0KLy8gT2JqZWN0DQovLyA9PT09PT0NCi8vDQoNCi8vIEVTNSAxNS4yLjMuMg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjINCmlmICghT2JqZWN0LmdldFByb3RvdHlwZU9mKSB7DQogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9lczUtc2hpbS9pc3N1ZXMjaXNzdWUvMg0KICAgIC8vIGh0dHA6Ly9lam9obi5vcmcvYmxvZy9vYmplY3RnZXRwcm90b3R5cGVvZi8NCiAgICAvLyByZWNvbW1lbmRlZCBieSBmc2NoYWVmZXIgb24gZ2l0aHViDQogICAgT2JqZWN0LmdldFByb3RvdHlwZU9mID0gZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2Yob2JqZWN0KSB7DQogICAgICAgIHJldHVybiBvYmplY3QuX19wcm90b19fIHx8ICgNCiAgICAgICAgICAgIG9iamVjdC5jb25zdHJ1Y3RvciA/DQogICAgICAgICAgICBvYmplY3QuY29uc3RydWN0b3IucHJvdG90eXBlIDoNCiAgICAgICAgICAgIHByb3RvdHlwZU9mT2JqZWN0DQogICAgICAgICk7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy4zDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMw0KaWYgKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKSB7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUID0gIk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgY2FsbGVkIG9uIGEgIiArDQogICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1vYmplY3Q6ICI7DQogICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSB7DQogICAgICAgIGlmICgodHlwZW9mIG9iamVjdCAhPSAib2JqZWN0IiAmJiB0eXBlb2Ygb2JqZWN0ICE9ICJmdW5jdGlvbiIpIHx8IG9iamVjdCA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX05PTl9PQkpFQ1QgKyBvYmplY3QpOw0KICAgICAgICAvLyBJZiBvYmplY3QgZG9lcyBub3Qgb3ducyBwcm9wZXJ0eSByZXR1cm4gdW5kZWZpbmVkIGltbWVkaWF0ZWx5Lg0KICAgICAgICBpZiAoIW93bnMob2JqZWN0LCBwcm9wZXJ0eSkpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGRlc2NyaXB0b3IsIGdldHRlciwgc2V0dGVyOw0KDQogICAgICAgIC8vIElmIG9iamVjdCBoYXMgYSBwcm9wZXJ0eSB0aGVuIGl0J3MgZm9yIHN1cmUgYm90aCBgZW51bWVyYWJsZWAgYW5kDQogICAgICAgIC8vIGBjb25maWd1cmFibGVgLg0KICAgICAgICBkZXNjcmlwdG9yID0gIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH07DQoNCiAgICAgICAgLy8gSWYgSlMgZW5naW5lIHN1cHBvcnRzIGFjY2Vzc29yIHByb3BlcnRpZXMgdGhlbiBwcm9wZXJ0eSBtYXkgYmUgYQ0KICAgICAgICAvLyBnZXR0ZXIgb3Igc2V0dGVyLg0KICAgICAgICBpZiAoc3VwcG9ydHNBY2Nlc3NvcnMpIHsNCiAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHkgYF9fbG9va3VwR2V0dGVyX19gIHdpbGwgcmV0dXJuIGEgZ2V0dGVyIGV2ZW4NCiAgICAgICAgICAgIC8vIGlmIG9iamVjdCBoYXMgb3duIG5vbiBnZXR0ZXIgcHJvcGVydHkgYWxvbmcgd2l0aCBhIHNhbWUgbmFtZWQNCiAgICAgICAgICAgIC8vIGluaGVyaXRlZCBnZXR0ZXIuIFRvIGF2b2lkIG1pc2JlaGF2aW9yIHdlIHRlbXBvcmFyeSByZW1vdmUNCiAgICAgICAgICAgIC8vIGBfX3Byb3RvX19gIHNvIHRoYXQgYF9fbG9va3VwR2V0dGVyX19gIHdpbGwgcmV0dXJuIGdldHRlciBvbmx5DQogICAgICAgICAgICAvLyBpZiBpdCdzIG93bmVkIGJ5IGFuIG9iamVjdC4NCiAgICAgICAgICAgIHZhciBwcm90b3R5cGUgPSBvYmplY3QuX19wcm90b19fOw0KICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZU9mT2JqZWN0Ow0KDQogICAgICAgICAgICB2YXIgZ2V0dGVyID0gbG9va3VwR2V0dGVyKG9iamVjdCwgcHJvcGVydHkpOw0KICAgICAgICAgICAgdmFyIHNldHRlciA9IGxvb2t1cFNldHRlcihvYmplY3QsIHByb3BlcnR5KTsNCg0KICAgICAgICAgICAgLy8gT25jZSB3ZSBoYXZlIGdldHRlciBhbmQgc2V0dGVyIHdlIGNhbiBwdXQgdmFsdWVzIGJhY2suDQogICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KDQogICAgICAgICAgICBpZiAoZ2V0dGVyIHx8IHNldHRlcikgew0KICAgICAgICAgICAgICAgIGlmIChnZXR0ZXIpIGRlc2NyaXB0b3IuZ2V0ID0gZ2V0dGVyOw0KICAgICAgICAgICAgICAgIGlmIChzZXR0ZXIpIGRlc2NyaXB0b3Iuc2V0ID0gc2V0dGVyOw0KDQogICAgICAgICAgICAgICAgLy8gSWYgaXQgd2FzIGFjY2Vzc29yIHByb3BlcnR5IHdlJ3JlIGRvbmUgYW5kIHJldHVybiBoZXJlDQogICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gYXZvaWQgYWRkaW5nIGB2YWx1ZWAgdG8gdGhlIGRlc2NyaXB0b3IuDQogICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgd2Uga25vdyB0aGF0IG9iamVjdCBoYXMgYW4gb3duIHByb3BlcnR5IHRoYXQgaXMNCiAgICAgICAgLy8gbm90IGFuIGFjY2Vzc29yIHNvIHdlIHNldCBpdCBhcyBhIHZhbHVlIGFuZCByZXR1cm4gZGVzY3JpcHRvci4NCiAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IG9iamVjdFtwcm9wZXJ0eV07DQogICAgICAgIHJldHVybiBkZXNjcmlwdG9yOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjQNCmlmICghT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMpIHsNCiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KSB7DQogICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjUNCmlmICghT2JqZWN0LmNyZWF0ZSkgew0KICAgIE9iamVjdC5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlLCBwcm9wZXJ0aWVzKSB7DQogICAgICAgIHZhciBvYmplY3Q7DQogICAgICAgIGlmIChwcm90b3R5cGUgPT09IG51bGwpIHsNCiAgICAgICAgICAgIG9iamVjdCA9IHsgIl9fcHJvdG9fXyI6IG51bGwgfTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvdG90eXBlICE9ICJvYmplY3QiKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoInR5cGVvZiBwcm90b3R5cGVbIisodHlwZW9mIHByb3RvdHlwZSkrIl0gIT0gJ29iamVjdCciKTsNCiAgICAgICAgICAgIHZhciBUeXBlID0gZnVuY3Rpb24gKCkge307DQogICAgICAgICAgICBUeXBlLnByb3RvdHlwZSA9IHByb3RvdHlwZTsNCiAgICAgICAgICAgIG9iamVjdCA9IG5ldyBUeXBlKCk7DQogICAgICAgICAgICAvLyBJRSBoYXMgbm8gYnVpbHQtaW4gaW1wbGVtZW50YXRpb24gb2YgYE9iamVjdC5nZXRQcm90b3R5cGVPZmANCiAgICAgICAgICAgIC8vIG5laXRoZXIgYF9fcHJvdG9fX2AsIGJ1dCB0aGlzIG1hbnVhbGx5IHNldHRpbmcgYF9fcHJvdG9fX2Agd2lsbA0KICAgICAgICAgICAgLy8gZ3VhcmFudGVlIHRoYXQgYE9iamVjdC5nZXRQcm90b3R5cGVPZmAgd2lsbCB3b3JrIGFzIGV4cGVjdGVkIHdpdGgNCiAgICAgICAgICAgIC8vIG9iamVjdHMgY3JlYXRlZCB1c2luZyBgT2JqZWN0LmNyZWF0ZWANCiAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGU7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHByb3BlcnRpZXMgIT09IHZvaWQgMCkNCiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG9iamVjdCwgcHJvcGVydGllcyk7DQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy42DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNg0KDQovLyBQYXRjaCBmb3IgV2ViS2l0IGFuZCBJRTggc3RhbmRhcmQgbW9kZQ0KLy8gRGVzaWduZWQgYnkgaGF4IDxoYXguZ2l0aHViLmNvbT4NCi8vIHJlbGF0ZWQgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvZXM1LXNoaW0vaXNzdWVzI2lzc3VlLzUNCi8vIElFOCBSZWZlcmVuY2U6DQovLyAgICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMjgyOTAwLmFzcHgNCi8vICAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGQyMjk5MTYuYXNweA0KLy8gV2ViS2l0IEJ1Z3M6DQovLyAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM2NDIzDQoNCmZ1bmN0aW9uIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsob2JqZWN0KSB7DQogICAgdHJ5IHsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgInNlbnRpbmVsIiwge30pOw0KICAgICAgICByZXR1cm4gInNlbnRpbmVsIiBpbiBvYmplY3Q7DQogICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7DQogICAgICAgIC8vIHJldHVybnMgZmFsc3kNCiAgICB9DQp9DQoNCi8vIGNoZWNrIHdoZXRoZXIgZGVmaW5lUHJvcGVydHkgd29ya3MgaWYgaXQncyBnaXZlbi4gT3RoZXJ3aXNlLA0KLy8gc2hpbSBwYXJ0aWFsbHkuDQppZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7DQogICAgdmFyIGRlZmluZVByb3BlcnR5V29ya3NPbk9iamVjdCA9IGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoe30pOw0KICAgIHZhciBkZWZpbmVQcm9wZXJ0eVdvcmtzT25Eb20gPSB0eXBlb2YgZG9jdW1lbnQgPT0gInVuZGVmaW5lZCIgfHwNCiAgICAgICAgZG9lc0RlZmluZVByb3BlcnR5V29yayhkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7DQogICAgaWYgKCFkZWZpbmVQcm9wZXJ0eVdvcmtzT25PYmplY3QgfHwgIWRlZmluZVByb3BlcnR5V29ya3NPbkRvbSkgew0KICAgICAgICB2YXIgZGVmaW5lUHJvcGVydHlGYWxsYmFjayA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsNCiAgICB9DQp9DQoNCmlmICghT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGRlZmluZVByb3BlcnR5RmFsbGJhY2spIHsNCiAgICB2YXIgRVJSX05PTl9PQkpFQ1RfREVTQ1JJUFRPUiA9ICJQcm9wZXJ0eSBkZXNjcmlwdGlvbiBtdXN0IGJlIGFuIG9iamVjdDogIjsNCiAgICB2YXIgRVJSX05PTl9PQkpFQ1RfVEFSR0VUID0gIk9iamVjdC5kZWZpbmVQcm9wZXJ0eSBjYWxsZWQgb24gbm9uLW9iamVjdDogIg0KICAgIHZhciBFUlJfQUNDRVNTT1JTX05PVF9TVVBQT1JURUQgPSAiZ2V0dGVycyAmIHNldHRlcnMgY2FuIG5vdCBiZSBkZWZpbmVkICIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib24gdGhpcyBqYXZhc2NyaXB0IGVuZ2luZSI7DQoNCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBkZXNjcmlwdG9yKSB7DQogICAgICAgIGlmICgodHlwZW9mIG9iamVjdCAhPSAib2JqZWN0IiAmJiB0eXBlb2Ygb2JqZWN0ICE9ICJmdW5jdGlvbiIpIHx8IG9iamVjdCA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX05PTl9PQkpFQ1RfVEFSR0VUICsgb2JqZWN0KTsNCiAgICAgICAgaWYgKCh0eXBlb2YgZGVzY3JpcHRvciAhPSAib2JqZWN0IiAmJiB0eXBlb2YgZGVzY3JpcHRvciAhPSAiZnVuY3Rpb24iKSB8fCBkZXNjcmlwdG9yID09PSBudWxsKQ0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfTk9OX09CSkVDVF9ERVNDUklQVE9SICsgZGVzY3JpcHRvcik7DQoNCiAgICAgICAgLy8gbWFrZSBhIHZhbGlhbnQgYXR0ZW1wdCB0byB1c2UgdGhlIHJlYWwgZGVmaW5lUHJvcGVydHkNCiAgICAgICAgLy8gZm9yIEk4J3MgRE9NIGVsZW1lbnRzLg0KICAgICAgICBpZiAoZGVmaW5lUHJvcGVydHlGYWxsYmFjaykgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHlGYWxsYmFjay5jYWxsKE9iamVjdCwgb2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcik7DQogICAgICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHsNCiAgICAgICAgICAgICAgICAvLyB0cnkgdGhlIHNoaW0gaWYgdGhlIHJlYWwgb25lIGRvZXNuJ3Qgd29yaw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gSWYgaXQncyBhIGRhdGEgcHJvcGVydHkuDQogICAgICAgIGlmIChvd25zKGRlc2NyaXB0b3IsICJ2YWx1ZSIpKSB7DQogICAgICAgICAgICAvLyBmYWlsIHNpbGVudGx5IGlmICJ3cml0YWJsZSIsICJlbnVtZXJhYmxlIiwgb3IgImNvbmZpZ3VyYWJsZSINCiAgICAgICAgICAgIC8vIGFyZSByZXF1ZXN0ZWQgYnV0IG5vdCBzdXBwb3J0ZWQNCiAgICAgICAgICAgIC8qDQogICAgICAgICAgICAvLyBhbHRlcm5hdGUgYXBwcm9hY2g6DQogICAgICAgICAgICBpZiAoIC8vIGNhbid0IGltcGxlbWVudCB0aGVzZSBmZWF0dXJlczsgYWxsb3cgZmFsc2UgYnV0IG5vdCB0cnVlDQogICAgICAgICAgICAgICAgIShvd25zKGRlc2NyaXB0b3IsICJ3cml0YWJsZSIpID8gZGVzY3JpcHRvci53cml0YWJsZSA6IHRydWUpIHx8DQogICAgICAgICAgICAgICAgIShvd25zKGRlc2NyaXB0b3IsICJlbnVtZXJhYmxlIikgPyBkZXNjcmlwdG9yLmVudW1lcmFibGUgOiB0cnVlKSB8fA0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiY29uZmlndXJhYmxlIikgPyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA6IHRydWUpDQogICAgICAgICAgICApDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoDQogICAgICAgICAgICAgICAgICAgICJUaGlzIGltcGxlbWVudGF0aW9uIG9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBkb2VzIG5vdCAiICsNCiAgICAgICAgICAgICAgICAgICAgInN1cHBvcnQgY29uZmlndXJhYmxlLCBlbnVtZXJhYmxlLCBvciB3cml0YWJsZS4iDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICovDQoNCiAgICAgICAgICAgIGlmIChzdXBwb3J0c0FjY2Vzc29ycyAmJiAobG9va3VwR2V0dGVyKG9iamVjdCwgcHJvcGVydHkpIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFNldHRlcihvYmplY3QsIHByb3BlcnR5KSkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgLy8gQXMgYWNjZXNzb3JzIGFyZSBzdXBwb3J0ZWQgb25seSBvbiBlbmdpbmVzIGltcGxlbWVudGluZw0KICAgICAgICAgICAgICAgIC8vIGBfX3Byb3RvX19gIHdlIGNhbiBzYWZlbHkgb3ZlcnJpZGUgYF9fcHJvdG9fX2Agd2hpbGUgZGVmaW5pbmcNCiAgICAgICAgICAgICAgICAvLyBhIHByb3BlcnR5IHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGhpdCBhbiBpbmhlcml0ZWQNCiAgICAgICAgICAgICAgICAvLyBhY2Nlc3Nvci4NCiAgICAgICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gb2JqZWN0Ll9fcHJvdG9fXzsNCiAgICAgICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlT2ZPYmplY3Q7DQogICAgICAgICAgICAgICAgLy8gRGVsZXRpbmcgYSBwcm9wZXJ0eSBhbnl3YXkgc2luY2UgZ2V0dGVyIC8gc2V0dGVyIG1heSBiZQ0KICAgICAgICAgICAgICAgIC8vIGRlZmluZWQgb24gb2JqZWN0IGl0c2VsZi4NCiAgICAgICAgICAgICAgICBkZWxldGUgb2JqZWN0W3Byb3BlcnR5XTsNCiAgICAgICAgICAgICAgICBvYmplY3RbcHJvcGVydHldID0gZGVzY3JpcHRvci52YWx1ZTsNCiAgICAgICAgICAgICAgICAvLyBTZXR0aW5nIG9yaWdpbmFsIGBfX3Byb3RvX19gIGJhY2sgbm93Lg0KICAgICAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGU7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIG9iamVjdFtwcm9wZXJ0eV0gPSBkZXNjcmlwdG9yLnZhbHVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaWYgKCFzdXBwb3J0c0FjY2Vzc29ycykNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9BQ0NFU1NPUlNfTk9UX1NVUFBPUlRFRCk7DQogICAgICAgICAgICAvLyBJZiB3ZSBnb3QgdGhhdCBmYXIgdGhlbiBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGNhbiBiZSBkZWZpbmVkICEhDQogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAiZ2V0IikpDQogICAgICAgICAgICAgICAgZGVmaW5lR2V0dGVyKG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3IuZ2V0KTsNCiAgICAgICAgICAgIGlmIChvd25zKGRlc2NyaXB0b3IsICJzZXQiKSkNCiAgICAgICAgICAgICAgICBkZWZpbmVTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvci5zZXQpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIG9iamVjdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjcNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy43DQppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKSB7DQogICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKG9iamVjdCwgcHJvcGVydGllcykgew0KICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKSB7DQogICAgICAgICAgICBpZiAob3ducyhwcm9wZXJ0aWVzLCBwcm9wZXJ0eSkpDQogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIHByb3BlcnRpZXNbcHJvcGVydHldKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuOA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjgNCmlmICghT2JqZWN0LnNlYWwpIHsNCiAgICBPYmplY3Quc2VhbCA9IGZ1bmN0aW9uIHNlYWwob2JqZWN0KSB7DQogICAgICAgIC8vIHRoaXMgaXMgbWlzbGVhZGluZyBhbmQgYnJlYWtzIGZlYXR1cmUtZGV0ZWN0aW9uLCBidXQNCiAgICAgICAgLy8gYWxsb3dzICJzZWN1cmFibGUiIGNvZGUgdG8gImdyYWNlZnVsbHkiIGRlZ3JhZGUgdG8gd29ya2luZw0KICAgICAgICAvLyBidXQgaW5zZWN1cmUgY29kZS4NCiAgICAgICAgcmV0dXJuIG9iamVjdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjkNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy45DQppZiAoIU9iamVjdC5mcmVlemUpIHsNCiAgICBPYmplY3QuZnJlZXplID0gZnVuY3Rpb24gZnJlZXplKG9iamVjdCkgew0KICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0DQogICAgICAgIC8vIGFsbG93cyAic2VjdXJhYmxlIiBjb2RlIHRvICJncmFjZWZ1bGx5IiBkZWdyYWRlIHRvIHdvcmtpbmcNCiAgICAgICAgLy8gYnV0IGluc2VjdXJlIGNvZGUuDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gZGV0ZWN0IGEgUmhpbm8gYnVnIGFuZCBwYXRjaCBpdA0KdHJ5IHsNCiAgICBPYmplY3QuZnJlZXplKGZ1bmN0aW9uICgpIHt9KTsNCn0gY2F0Y2ggKGV4Y2VwdGlvbikgew0KICAgIE9iamVjdC5mcmVlemUgPSAoZnVuY3Rpb24gZnJlZXplKGZyZWV6ZU9iamVjdCkgew0KICAgICAgICByZXR1cm4gZnVuY3Rpb24gZnJlZXplKG9iamVjdCkgew0KICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QgPT0gImZ1bmN0aW9uIikgew0KICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBmcmVlemVPYmplY3Qob2JqZWN0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICB9KShPYmplY3QuZnJlZXplKTsNCn0NCg0KLy8gRVM1IDE1LjIuMy4xMA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjEwDQppZiAoIU9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucykgew0KICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyA9IGZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKG9iamVjdCkgew0KICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0DQogICAgICAgIC8vIGFsbG93cyAic2VjdXJhYmxlIiBjb2RlIHRvICJncmFjZWZ1bGx5IiBkZWdyYWRlIHRvIHdvcmtpbmcNCiAgICAgICAgLy8gYnV0IGluc2VjdXJlIGNvZGUuDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy4xMQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjExDQppZiAoIU9iamVjdC5pc1NlYWxlZCkgew0KICAgIE9iamVjdC5pc1NlYWxlZCA9IGZ1bmN0aW9uIGlzU2VhbGVkKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy4xMg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjEyDQppZiAoIU9iamVjdC5pc0Zyb3plbikgew0KICAgIE9iamVjdC5pc0Zyb3plbiA9IGZ1bmN0aW9uIGlzRnJvemVuKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy4xMw0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjEzDQppZiAoIU9iamVjdC5pc0V4dGVuc2libGUpIHsNCiAgICBPYmplY3QuaXNFeHRlbnNpYmxlID0gZnVuY3Rpb24gaXNFeHRlbnNpYmxlKG9iamVjdCkgew0KICAgICAgICAvLyAxLiBJZiBUeXBlKE8pIGlzIG5vdCBPYmplY3QgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLg0KICAgICAgICBpZiAoT2JqZWN0KG9iamVjdCkgPT09IG9iamVjdCkgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KICAgICAgICAvLyAyLiBSZXR1cm4gdGhlIEJvb2xlYW4gdmFsdWUgb2YgdGhlIFtbRXh0ZW5zaWJsZV1dIGludGVybmFsIHByb3BlcnR5IG9mIE8uDQogICAgICAgIHZhciBuYW1lID0gJyc7DQogICAgICAgIHdoaWxlIChvd25zKG9iamVjdCwgbmFtZSkpIHsNCiAgICAgICAgICAgIG5hbWUgKz0gJz8nOw0KICAgICAgICB9DQogICAgICAgIG9iamVjdFtuYW1lXSA9IHRydWU7DQogICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IG93bnMob2JqZWN0LCBuYW1lKTsNCiAgICAgICAgZGVsZXRlIG9iamVjdFtuYW1lXTsNCiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xNA0KaWYgKCFPYmplY3Qua2V5cykgew0KICAgIC8vIGh0dHA6Ly93aGF0dGhlaGVhZHNhaWQuY29tLzIwMTAvMTAvYS1zYWZlci1vYmplY3Qta2V5cy1jb21wYXRpYmlsaXR5LWltcGxlbWVudGF0aW9uDQogICAgdmFyIGhhc0RvbnRFbnVtQnVnID0gdHJ1ZSwNCiAgICAgICAgZG9udEVudW1zID0gWw0KICAgICAgICAgICAgInRvU3RyaW5nIiwNCiAgICAgICAgICAgICJ0b0xvY2FsZVN0cmluZyIsDQogICAgICAgICAgICAidmFsdWVPZiIsDQogICAgICAgICAgICAiaGFzT3duUHJvcGVydHkiLA0KICAgICAgICAgICAgImlzUHJvdG90eXBlT2YiLA0KICAgICAgICAgICAgInByb3BlcnR5SXNFbnVtZXJhYmxlIiwNCiAgICAgICAgICAgICJjb25zdHJ1Y3RvciINCiAgICAgICAgXSwNCiAgICAgICAgZG9udEVudW1zTGVuZ3RoID0gZG9udEVudW1zLmxlbmd0aDsNCg0KICAgIGZvciAodmFyIGtleSBpbiB7InRvU3RyaW5nIjogbnVsbH0pDQogICAgICAgIGhhc0RvbnRFbnVtQnVnID0gZmFsc2U7DQoNCiAgICBPYmplY3Qua2V5cyA9IGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7DQoNCiAgICAgICAgaWYgKCh0eXBlb2Ygb2JqZWN0ICE9ICJvYmplY3QiICYmIHR5cGVvZiBvYmplY3QgIT0gImZ1bmN0aW9uIikgfHwgb2JqZWN0ID09PSBudWxsKQ0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0LmtleXMgY2FsbGVkIG9uIGEgbm9uLW9iamVjdCIpOw0KDQogICAgICAgIHZhciBrZXlzID0gW107DQogICAgICAgIGZvciAodmFyIG5hbWUgaW4gb2JqZWN0KSB7DQogICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIG5hbWUpKSB7DQogICAgICAgICAgICAgICAga2V5cy5wdXNoKG5hbWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGhhc0RvbnRFbnVtQnVnKSB7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBkb250RW51bXNMZW5ndGg7IGkgPCBpaTsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIGRvbnRFbnVtID0gZG9udEVudW1zW2ldOw0KICAgICAgICAgICAgICAgIGlmIChvd25zKG9iamVjdCwgZG9udEVudW0pKSB7DQogICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChkb250RW51bSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGtleXM7DQogICAgfTsNCg0KfQ0KDQovLw0KLy8gRGF0ZQ0KLy8gPT09PQ0KLy8NCg0KLy8gRVM1IDE1LjkuNS40Mw0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuOS41LjQzDQovLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBTdHJpbmcgdmFsdWUgcmVwcmVzZW50IHRoZSBpbnN0YW5jZSBpbiB0aW1lIA0KLy8gcmVwcmVzZW50ZWQgYnkgdGhpcyBEYXRlIG9iamVjdC4gVGhlIGZvcm1hdCBvZiB0aGUgU3RyaW5nIGlzIHRoZSBEYXRlIFRpbWUgDQovLyBzdHJpbmcgZm9ybWF0IGRlZmluZWQgaW4gMTUuOS4xLjE1LiBBbGwgZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBTdHJpbmcuIA0KLy8gVGhlIHRpbWUgem9uZSBpcyBhbHdheXMgVVRDLCBkZW5vdGVkIGJ5IHRoZSBzdWZmaXggWi4gSWYgdGhlIHRpbWUgdmFsdWUgb2YgDQovLyB0aGlzIG9iamVjdCBpcyBub3QgYSBmaW5pdGUgTnVtYmVyIGEgUmFuZ2VFcnJvciBleGNlcHRpb24gaXMgdGhyb3duLg0KaWYgKCFEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyB8fCAobmV3IERhdGUoLTYyMTk4NzU1MjAwMDAwKS50b0lTT1N0cmluZygpLmluZGV4T2YoJy0wMDAwMDEnKSA9PT0gLTEpKSB7DQogICAgRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgPSBmdW5jdGlvbiB0b0lTT1N0cmluZygpIHsNCiAgICAgICAgdmFyIHJlc3VsdCwgbGVuZ3RoLCB2YWx1ZSwgeWVhcjsNCiAgICAgICAgaWYgKCFpc0Zpbml0ZSh0aGlzKSkNCiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yOw0KDQogICAgICAgIC8vIHRoZSBkYXRlIHRpbWUgc3RyaW5nIGZvcm1hdCBpcyBzcGVjaWZpZWQgaW4gMTUuOS4xLjE1Lg0KICAgICAgICByZXN1bHQgPSBbdGhpcy5nZXRVVENNb250aCgpICsgMSwgdGhpcy5nZXRVVENEYXRlKCksDQogICAgICAgICAgICB0aGlzLmdldFVUQ0hvdXJzKCksIHRoaXMuZ2V0VVRDTWludXRlcygpLCB0aGlzLmdldFVUQ1NlY29uZHMoKV07DQogICAgICAgIHllYXIgPSB0aGlzLmdldFVUQ0Z1bGxZZWFyKCk7DQogICAgICAgIHllYXIgPSAoeWVhciA8IDAgPyAnLScgOiAoeWVhciA+IDk5OTkgPyAnKycgOiAnJykpICsgKCcwMDAwMCcgKyBNYXRoLmFicyh5ZWFyKSkuc2xpY2UoMCA8PSB5ZWFyICYmIHllYXIgPD0gOTk5OSA/IC00IDogLTYpOw0KDQogICAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7DQogICAgICAgIHdoaWxlIChsZW5ndGgtLSkgew0KICAgICAgICAgICAgdmFsdWUgPSByZXN1bHRbbGVuZ3RoXTsNCiAgICAgICAgICAgIC8vIHBhZCBtb250aHMsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBhbmQgc2Vjb25kcyB0byBoYXZlIHR3byBkaWdpdHMuDQogICAgICAgICAgICBpZiAodmFsdWUgPCAxMCkNCiAgICAgICAgICAgICAgICByZXN1bHRbbGVuZ3RoXSA9ICIwIiArIHZhbHVlOw0KICAgICAgICB9DQogICAgICAgIC8vIHBhZCBtaWxsaXNlY29uZHMgdG8gaGF2ZSB0aHJlZSBkaWdpdHMuDQogICAgICAgIHJldHVybiB5ZWFyICsgIi0iICsgcmVzdWx0LnNsaWNlKDAsIDIpLmpvaW4oIi0iKSArICJUIiArIHJlc3VsdC5zbGljZSgyKS5qb2luKCI6IikgKyAiLiIgKw0KICAgICAgICAgICAgKCIwMDAiICsgdGhpcy5nZXRVVENNaWxsaXNlY29uZHMoKSkuc2xpY2UoLTMpICsgIloiOw0KICAgIH0NCn0NCg0KLy8gRVM1IDE1LjkuNC40DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjQuNA0KaWYgKCFEYXRlLm5vdykgew0KICAgIERhdGUubm93ID0gZnVuY3Rpb24gbm93KCkgew0KICAgICAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjkuNS40NA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuOS41LjQ0DQovLyBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgRGF0ZSBvYmplY3QgZm9yIHVzZSBieSANCi8vIEpTT04uc3RyaW5naWZ5ICgxNS4xMi4zKS4NCmlmICghRGF0ZS5wcm90b3R5cGUudG9KU09OKSB7DQogICAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKGtleSkgew0KICAgICAgICAvLyBXaGVuIHRoZSB0b0pTT04gbWV0aG9kIGlzIGNhbGxlZCB3aXRoIGFyZ3VtZW50IGtleSwgdGhlIGZvbGxvd2luZyANCiAgICAgICAgLy8gc3RlcHMgYXJlIHRha2VuOg0KDQogICAgICAgIC8vIDEuICBMZXQgTyBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgVG9PYmplY3QsIGdpdmluZyBpdCB0aGUgdGhpcw0KICAgICAgICAvLyB2YWx1ZSBhcyBpdHMgYXJndW1lbnQuDQogICAgICAgIC8vIDIuIExldCB0diBiZSBUb1ByaW1pdGl2ZShPLCBoaW50IE51bWJlcikuDQogICAgICAgIC8vIDMuIElmIHR2IGlzIGEgTnVtYmVyIGFuZCBpcyBub3QgZmluaXRlLCByZXR1cm4gbnVsbC4NCiAgICAgICAgLy8gWFhYDQogICAgICAgIC8vIDQuIExldCB0b0lTTyBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbR2V0XV0gaW50ZXJuYWwgbWV0aG9kIG9mDQogICAgICAgIC8vIE8gd2l0aCBhcmd1bWVudCAidG9JU09TdHJpbmciLg0KICAgICAgICAvLyA1LiBJZiBJc0NhbGxhYmxlKHRvSVNPKSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLg0KICAgICAgICBpZiAodHlwZW9mIHRoaXMudG9JU09TdHJpbmcgIT0gImZ1bmN0aW9uIikNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIC8vIDYuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCBvZg0KICAgICAgICAvLyAgdG9JU08gd2l0aCBPIGFzIHRoZSB0aGlzIHZhbHVlIGFuZCBhbiBlbXB0eSBhcmd1bWVudCBsaXN0Lg0KICAgICAgICByZXR1cm4gdGhpcy50b0lTT1N0cmluZygpOw0KDQogICAgICAgIC8vIE5PVEUgMSBUaGUgYXJndW1lbnQgaXMgaWdub3JlZC4NCg0KICAgICAgICAvLyBOT1RFIDIgVGhlIHRvSlNPTiBmdW5jdGlvbiBpcyBpbnRlbnRpb25hbGx5IGdlbmVyaWM7IGl0IGRvZXMgbm90DQogICAgICAgIC8vIHJlcXVpcmUgdGhhdCBpdHMgdGhpcyB2YWx1ZSBiZSBhIERhdGUgb2JqZWN0LiBUaGVyZWZvcmUsIGl0IGNhbiBiZQ0KICAgICAgICAvLyB0cmFuc2ZlcnJlZCB0byBvdGhlciBraW5kcyBvZiBvYmplY3RzIGZvciB1c2UgYXMgYSBtZXRob2QuIEhvd2V2ZXIsDQogICAgICAgIC8vIGl0IGRvZXMgcmVxdWlyZSB0aGF0IGFueSBzdWNoIG9iamVjdCBoYXZlIGEgdG9JU09TdHJpbmcgbWV0aG9kLiBBbg0KICAgICAgICAvLyBvYmplY3QgaXMgZnJlZSB0byB1c2UgdGhlIGFyZ3VtZW50IGtleSB0byBmaWx0ZXIgaXRzDQogICAgICAgIC8vIHN0cmluZ2lmaWNhdGlvbi4NCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuOS40LjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNC4yDQovLyBiYXNlZCBvbiB3b3JrIHNoYXJlZCBieSBEYW5pZWwgRnJpZXNlbiAoZGFudG1hbikNCi8vIGh0dHA6Ly9naXN0LmdpdGh1Yi5jb20vMzAzMjQ5DQppZiAoRGF0ZS5wYXJzZSgiKzI3NTc2MC0wOS0xM1QwMDowMDowMC4wMDBaIikgIT09IDguNjRlMTUpIHsNCiAgICAvLyBYWFggZ2xvYmFsIGFzc2lnbm1lbnQgd29uJ3Qgd29yayBpbiBlbWJlZGRpbmdzIHRoYXQgdXNlDQogICAgLy8gYW4gYWx0ZXJuYXRlIG9iamVjdCBmb3IgdGhlIGNvbnRleHQuDQogICAgRGF0ZSA9IChmdW5jdGlvbihOYXRpdmVEYXRlKSB7DQoNCiAgICAgICAgLy8gRGF0ZS5sZW5ndGggPT09IDcNCiAgICAgICAgdmFyIERhdGUgPSBmdW5jdGlvbiBEYXRlKFksIE0sIEQsIGgsIG0sIHMsIG1zKSB7DQogICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsNCiAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgTmF0aXZlRGF0ZSkgew0KICAgICAgICAgICAgICAgIHZhciBkYXRlID0gbGVuZ3RoID09IDEgJiYgU3RyaW5nKFkpID09PSBZID8gLy8gaXNTdHJpbmcoWSkNCiAgICAgICAgICAgICAgICAgICAgLy8gV2UgZXhwbGljaXRseSBwYXNzIGl0IHRocm91Z2ggcGFyc2U6DQogICAgICAgICAgICAgICAgICAgIG5ldyBOYXRpdmVEYXRlKERhdGUucGFyc2UoWSkpIDoNCiAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBtYW51YWxseSBtYWtlIGNhbGxzIGRlcGVuZGluZyBvbiBhcmd1bWVudA0KICAgICAgICAgICAgICAgICAgICAvLyBsZW5ndGggaGVyZQ0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gNyA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQsIGgsIG0sIHMsIG1zKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA2ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCwgbSwgcykgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gNSA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQsIGgsIG0pIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDQgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAzID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCkgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gMiA/IG5ldyBOYXRpdmVEYXRlKFksIE0pIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDEgPyBuZXcgTmF0aXZlRGF0ZShZKSA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5hdGl2ZURhdGUoKTsNCiAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IG1peHVwcyB3aXRoIHVuZml4ZWQgRGF0ZSBvYmplY3QNCiAgICAgICAgICAgICAgICBkYXRlLmNvbnN0cnVjdG9yID0gRGF0ZTsNCiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBOYXRpdmVEYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogICAgICAgIH07DQoNCiAgICAgICAgLy8gMTUuOS4xLjE1IERhdGUgVGltZSBTdHJpbmcgRm9ybWF0Lg0KICAgICAgICB2YXIgaXNvRGF0ZUV4cHJlc3Npb24gPSBuZXcgUmVnRXhwKCJeIiArDQogICAgICAgICAgICAiKFxcZHs0fXxbXCtcLV1cXGR7Nn0pIiArIC8vIGZvdXItZGlnaXQgeWVhciBjYXB0dXJlIG9yIHNpZ24gKyA2LWRpZ2l0IGV4dGVuZGVkIHllYXINCiAgICAgICAgICAgICIoPzotKFxcZHsyfSkiICsgLy8gb3B0aW9uYWwgbW9udGggY2FwdHVyZQ0KICAgICAgICAgICAgIig/Oi0oXFxkezJ9KSIgKyAvLyBvcHRpb25hbCBkYXkgY2FwdHVyZQ0KICAgICAgICAgICAgIig/OiIgKyAvLyBjYXB0dXJlIGhvdXJzOm1pbnV0ZXM6c2Vjb25kcy5taWxsaXNlY29uZHMNCiAgICAgICAgICAgICAgICAiVChcXGR7Mn0pIiArIC8vIGhvdXJzIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIG1pbnV0ZXMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIoPzoiICsgLy8gb3B0aW9uYWwgOnNlY29uZHMubWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgICAgICI6KFxcZHsyfSkiICsgLy8gc2Vjb25kcyBjYXB0dXJlDQogICAgICAgICAgICAgICAgICAgICIoPzpcXC4oXFxkezN9KSk/IiArIC8vIG1pbGxpc2Vjb25kcyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIik/IiArDQogICAgICAgICAgICAiKD86IiArIC8vIGNhcHR1cmUgVVRDIG9mZnNldCBjb21wb25lbnQNCiAgICAgICAgICAgICAgICAiWnwiICsgLy8gVVRDIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAiKD86IiArIC8vIG9mZnNldCBzcGVjaWZpZXIgKy8taG91cnM6bWludXRlcw0KICAgICAgICAgICAgICAgICAgICAiKFstK10pIiArIC8vIHNpZ24gY2FwdHVyZQ0KICAgICAgICAgICAgICAgICAgICAiKFxcZHsyfSkiICsgLy8gaG91cnMgb2Zmc2V0IGNhcHR1cmUNCiAgICAgICAgICAgICAgICAgICAgIjooXFxkezJ9KSIgKyAvLyBtaW51dGVzIG9mZnNldCBjYXB0dXJlDQogICAgICAgICAgICAgICAgIikiICsNCiAgICAgICAgICAgICIpPyk/KT8pPyIgKw0KICAgICAgICAiJCIpOw0KDQogICAgICAgIC8vIENvcHkgYW55IGN1c3RvbSBtZXRob2RzIGEgM3JkIHBhcnR5IGxpYnJhcnkgbWF5IGhhdmUgYWRkZWQNCiAgICAgICAgZm9yICh2YXIga2V5IGluIE5hdGl2ZURhdGUpDQogICAgICAgICAgICBEYXRlW2tleV0gPSBOYXRpdmVEYXRlW2tleV07DQoNCiAgICAgICAgLy8gQ29weSAibmF0aXZlIiBtZXRob2RzIGV4cGxpY2l0bHk7IHRoZXkgbWF5IGJlIG5vbi1lbnVtZXJhYmxlDQogICAgICAgIERhdGUubm93ID0gTmF0aXZlRGF0ZS5ub3c7DQogICAgICAgIERhdGUuVVRDID0gTmF0aXZlRGF0ZS5VVEM7DQogICAgICAgIERhdGUucHJvdG90eXBlID0gTmF0aXZlRGF0ZS5wcm90b3R5cGU7DQogICAgICAgIERhdGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGF0ZTsNCg0KICAgICAgICAvLyBVcGdyYWRlIERhdGUucGFyc2UgdG8gaGFuZGxlIHNpbXBsaWZpZWQgSVNPIDg2MDEgc3RyaW5ncw0KICAgICAgICBEYXRlLnBhcnNlID0gZnVuY3Rpb24gcGFyc2Uoc3RyaW5nKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBpc29EYXRlRXhwcmVzc2lvbi5leGVjKHN0cmluZyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICBtYXRjaC5zaGlmdCgpOyAvLyBraWxsIG1hdGNoWzBdLCB0aGUgZnVsbCBtYXRjaA0KICAgICAgICAgICAgICAgIC8vIHBhcnNlIG1vbnRocywgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBtaWxsaXNlY29uZHMNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IDc7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAvLyBwcm92aWRlIGRlZmF1bHQgdmFsdWVzIGlmIG5lY2Vzc2FyeQ0KICAgICAgICAgICAgICAgICAgICBtYXRjaFtpXSA9ICsobWF0Y2hbaV0gfHwgKGkgPCAzID8gMSA6IDApKTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hbMV0gaXMgdGhlIG1vbnRoLiBNb250aHMgYXJlIDAtMTEgaW4gSmF2YVNjcmlwdA0KICAgICAgICAgICAgICAgICAgICAvLyBgRGF0ZWAgb2JqZWN0cywgYnV0IDEtMTIgaW4gSVNPIG5vdGF0aW9uLCBzbyB3ZQ0KICAgICAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQuDQogICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEpDQogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFtpXS0tOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIHBhcnNlIHRoZSBVVEMgb2Zmc2V0IGNvbXBvbmVudA0KICAgICAgICAgICAgICAgIHZhciBtaW51dGVPZmZzZXQgPSArbWF0Y2gucG9wKCksIGhvdXJPZmZzZXQgPSArbWF0Y2gucG9wKCksIHNpZ24gPSBtYXRjaC5wb3AoKTsNCg0KICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIGV4cGxpY2l0IHRpbWUgem9uZSBvZmZzZXQgaWYgc3BlY2lmaWVkDQogICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7DQogICAgICAgICAgICAgICAgaWYgKHNpZ24pIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gZGV0ZWN0IGludmFsaWQgb2Zmc2V0cyBhbmQgcmV0dXJuIGVhcmx5DQogICAgICAgICAgICAgICAgICAgIGlmIChob3VyT2Zmc2V0ID4gMjMgfHwgbWludXRlT2Zmc2V0ID4gNTkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmFOOw0KDQogICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3MgdGhlIHByb3ZpZGVkIHRpbWUgem9uZSBvZmZzZXQgaW4gbWludXRlcy4gVGhlIG9mZnNldCBpcw0KICAgICAgICAgICAgICAgICAgICAvLyBuZWdhdGl2ZSBmb3IgdGltZSB6b25lcyB3ZXN0IG9mIFVUQzsgcG9zaXRpdmUgb3RoZXJ3aXNlLg0KICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAoaG91ck9mZnNldCAqIDYwICsgbWludXRlT2Zmc2V0KSAqIDZlNCAqIChzaWduID09ICIrIiA/IC0xIDogMSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gRGF0ZS5VVEMgZm9yIHllYXJzIGJldHdlZW4gMCBhbmQgOTkgY29udmVydHMgeWVhciB0byAxOTAwICsgeWVhcg0KICAgICAgICAgICAgICAgIC8vIFRoZSBHcmVnb3JpYW4gY2FsZW5kYXIgaGFzIGEgNDAwLXllYXIgY3ljbGUsIHNvIA0KICAgICAgICAgICAgICAgIC8vIHRvIERhdGUuVVRDKHllYXIgKyA0MDAsIC4uLi4gKSAtIDEyNjIyNzgwODAwMDAwID09IERhdGUuVVRDKHllYXIsIC4uLiksDQogICAgICAgICAgICAgICAgLy8gd2hlcmUgMTI2MjI3ODA4MDAwMDAgLSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIEdyZWdvcmlhbiBjYWxlbmRhciA0MDAgeWVhcnMNCiAgICAgICAgICAgICAgICB2YXIgeWVhciA9ICttYXRjaFswXTsNCiAgICAgICAgICAgICAgICBpZiAoMCA8PSB5ZWFyICYmIHllYXIgPD0gOTkpIHsNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMF0gPSB5ZWFyICsgNDAwOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5VVEMuYXBwbHkodGhpcywgbWF0Y2gpICsgb2Zmc2V0IC0gMTI2MjI3ODA4MDAwMDA7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBhIG5ldyBVVEMgZGF0ZSB2YWx1ZSwgYWNjb3VudGluZyBmb3IgdGhlIG9wdGlvbmFsIG9mZnNldA0KICAgICAgICAgICAgICAgIHJldHVybiBOYXRpdmVEYXRlLlVUQy5hcHBseSh0aGlzLCBtYXRjaCkgKyBvZmZzZXQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5wYXJzZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICB9Ow0KDQogICAgICAgIHJldHVybiBEYXRlOw0KICAgIH0pKERhdGUpOw0KfQ0KDQovLw0KLy8gU3RyaW5nDQovLyA9PT09PT0NCi8vDQoNCi8vIEVTNSAxNS41LjQuMjANCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjUuNC4yMA0KdmFyIHdzID0gIlx4MDlceDBBXHgwQlx4MENceDBEXHgyMFx4QTBcdTE2ODBcdTE4MEVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDMiICsNCiAgICAiXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBBXHUyMDJGXHUyMDVGXHUzMDAwXHUyMDI4IiArDQogICAgIlx1MjAyOVx1RkVGRiI7DQppZiAoIVN0cmluZy5wcm90b3R5cGUudHJpbSB8fCB3cy50cmltKCkpIHsNCiAgICAvLyBodHRwOi8vYmxvZy5zdGV2ZW5sZXZpdGhhbi5jb20vYXJjaGl2ZXMvZmFzdGVyLXRyaW0tamF2YXNjcmlwdA0KICAgIC8vIGh0dHA6Ly9wZXJmZWN0aW9ua2lsbHMuY29tL3doaXRlc3BhY2UtZGV2aWF0aW9ucy8NCiAgICB3cyA9ICJbIiArIHdzICsgIl0iOw0KICAgIHZhciB0cmltQmVnaW5SZWdleHAgPSBuZXcgUmVnRXhwKCJeIiArIHdzICsgd3MgKyAiKiIpLA0KICAgICAgICB0cmltRW5kUmVnZXhwID0gbmV3IFJlZ0V4cCh3cyArIHdzICsgIiokIik7DQogICAgU3RyaW5nLnByb3RvdHlwZS50cmltID0gZnVuY3Rpb24gdHJpbSgpIHsNCiAgICAgICAgcmV0dXJuIFN0cmluZyh0aGlzKS5yZXBsYWNlKHRyaW1CZWdpblJlZ2V4cCwgIiIpLnJlcGxhY2UodHJpbUVuZFJlZ2V4cCwgIiIpOw0KICAgIH07DQp9DQoNCi8vDQovLyBVdGlsDQovLyA9PT09PT0NCi8vDQoNCi8vIEVTNSA5LjQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuNA0KLy8gaHR0cDovL2pzcGVyZi5jb20vdG8taW50ZWdlcg0KdmFyIHRvSW50ZWdlciA9IGZ1bmN0aW9uIChuKSB7DQogICAgbiA9ICtuOw0KICAgIGlmIChuICE9PSBuKSAvLyBpc05hTg0KICAgICAgICBuID0gMDsNCiAgICBlbHNlIGlmIChuICE9PSAwICYmIG4gIT09ICgxLzApICYmIG4gIT09IC0oMS8wKSkNCiAgICAgICAgbiA9IChuID4gMCB8fCAtMSkgKiBNYXRoLmZsb29yKE1hdGguYWJzKG4pKTsNCiAgICByZXR1cm4gbjsNCn07DQoNCnZhciBwcmVwYXJlU3RyaW5nID0gImEiWzBdICE9ICJhIiwNCiAgICAvLyBFUzUgOS45DQogICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4OS45DQogICAgdG9PYmplY3QgPSBmdW5jdGlvbiAobykgew0KICAgICAgICBpZiAobyA9PSBudWxsKSB7IC8vIHRoaXMgbWF0Y2hlcyBib3RoIG51bGwgYW5kIHVuZGVmaW5lZA0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KICAgICAgICAvLyBJZiB0aGUgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0IGJ5LWluZGV4IGFjY2VzcyBvZg0KICAgICAgICAvLyBzdHJpbmcgY2hhcmFjdGVycyAoZXguIElFIDwgNyksIHNwbGl0IHRoZSBzdHJpbmcNCiAgICAgICAgaWYgKHByZXBhcmVTdHJpbmcgJiYgdHlwZW9mIG8gPT0gInN0cmluZyIgJiYgbykgew0KICAgICAgICAgICAgcmV0dXJuIG8uc3BsaXQoIiIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBPYmplY3Qobyk7DQogICAgfTsNCn0pOy8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBBVCBzdWNhbiBBVCBnbWFpbCBPRFQgY29tPg0KICogICAgICBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPiAoaHR0cDovL2plZGl0b29sa2l0LmNvbSkNCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvZG9tJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFhIVE1MX05TID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOw0KDQpleHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbih0YWcsIG5zKSB7DQogICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyA/DQogICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhucyB8fCBYSFRNTF9OUywgdGFnKSA6DQogICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsNCn07DQoNCmV4cG9ydHMuc2V0VGV4dCA9IGZ1bmN0aW9uKGVsZW0sIHRleHQpIHsNCiAgICBpZiAoZWxlbS5pbm5lclRleHQgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICBlbGVtLmlubmVyVGV4dCA9IHRleHQ7DQogICAgfQ0KICAgIGlmIChlbGVtLnRleHRDb250ZW50ICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgZWxlbS50ZXh0Q29udGVudCA9IHRleHQ7DQogICAgfQ0KfTsNCg0KZXhwb3J0cy5oYXNDc3NDbGFzcyA9IGZ1bmN0aW9uKGVsLCBuYW1lKSB7DQogICAgdmFyIGNsYXNzZXMgPSBlbC5jbGFzc05hbWUuc3BsaXQoL1xzKy9nKTsNCiAgICByZXR1cm4gY2xhc3Nlcy5pbmRleE9mKG5hbWUpICE9PSAtMTsNCn07DQoNCi8qKg0KKiBBZGQgYSBDU1MgY2xhc3MgdG8gdGhlIGxpc3Qgb2YgY2xhc3NlcyBvbiB0aGUgZ2l2ZW4gbm9kZQ0KKi8NCmV4cG9ydHMuYWRkQ3NzQ2xhc3MgPSBmdW5jdGlvbihlbCwgbmFtZSkgew0KICAgIGlmICghZXhwb3J0cy5oYXNDc3NDbGFzcyhlbCwgbmFtZSkpIHsNCiAgICAgICAgZWwuY2xhc3NOYW1lICs9ICIgIiArIG5hbWU7DQogICAgfQ0KfTsNCg0KLyoqDQoqIFJlbW92ZSBhIENTUyBjbGFzcyBmcm9tIHRoZSBsaXN0IG9mIGNsYXNzZXMgb24gdGhlIGdpdmVuIG5vZGUNCiovDQpleHBvcnRzLnJlbW92ZUNzc0NsYXNzID0gZnVuY3Rpb24oZWwsIG5hbWUpIHsNCiAgICB2YXIgY2xhc3NlcyA9IGVsLmNsYXNzTmFtZS5zcGxpdCgvXHMrL2cpOw0KICAgIHdoaWxlICh0cnVlKSB7DQogICAgICAgIHZhciBpbmRleCA9IGNsYXNzZXMuaW5kZXhPZihuYW1lKTsNCiAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgICBjbGFzc2VzLnNwbGljZShpbmRleCwgMSk7DQogICAgfQ0KICAgIGVsLmNsYXNzTmFtZSA9IGNsYXNzZXMuam9pbigiICIpOw0KfTsNCg0KZXhwb3J0cy50b2dnbGVDc3NDbGFzcyA9IGZ1bmN0aW9uKGVsLCBuYW1lKSB7DQogICAgdmFyIGNsYXNzZXMgPSBlbC5jbGFzc05hbWUuc3BsaXQoL1xzKy9nKSwgYWRkID0gdHJ1ZTsNCiAgICB3aGlsZSAodHJ1ZSkgew0KICAgICAgICB2YXIgaW5kZXggPSBjbGFzc2VzLmluZGV4T2YobmFtZSk7DQogICAgICAgIGlmIChpbmRleCA9PSAtMSkgew0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgYWRkID0gZmFsc2U7DQogICAgICAgIGNsYXNzZXMuc3BsaWNlKGluZGV4LCAxKTsNCiAgICB9DQogICAgaWYoYWRkKQ0KICAgICAgICBjbGFzc2VzLnB1c2gobmFtZSk7DQoNCiAgICBlbC5jbGFzc05hbWUgPSBjbGFzc2VzLmpvaW4oIiAiKTsNCiAgICByZXR1cm4gYWRkOw0KfTsNCg0KLyoqDQogKiBBZGQgb3IgcmVtb3ZlIGEgQ1NTIGNsYXNzIGZyb20gdGhlIGxpc3Qgb2YgY2xhc3NlcyBvbiB0aGUgZ2l2ZW4gbm9kZQ0KICogZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiA8dHQ+aW5jbHVkZTwvdHQ+DQogKi8NCmV4cG9ydHMuc2V0Q3NzQ2xhc3MgPSBmdW5jdGlvbihub2RlLCBjbGFzc05hbWUsIGluY2x1ZGUpIHsNCiAgICBpZiAoaW5jbHVkZSkgew0KICAgICAgICBleHBvcnRzLmFkZENzc0NsYXNzKG5vZGUsIGNsYXNzTmFtZSk7DQogICAgfSBlbHNlIHsNCiAgICAgICAgZXhwb3J0cy5yZW1vdmVDc3NDbGFzcyhub2RlLCBjbGFzc05hbWUpOw0KICAgIH0NCn07DQoNCmV4cG9ydHMuaGFzQ3NzU3RyaW5nID0gZnVuY3Rpb24oaWQsIGRvYykgew0KICAgIHZhciBpbmRleCA9IDAsIHNoZWV0czsNCiAgICBkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7DQoNCiAgICBpZiAoZG9jLmNyZWF0ZVN0eWxlU2hlZXQgJiYgKHNoZWV0cyA9IGRvYy5zdHlsZVNoZWV0cykpIHsNCiAgICAgICAgd2hpbGUgKGluZGV4IDwgc2hlZXRzLmxlbmd0aCkNCiAgICAgICAgICAgIGlmIChzaGVldHNbaW5kZXgrK10udGl0bGUgPT09IGlkKSByZXR1cm4gdHJ1ZTsNCiAgICB9IGVsc2UgaWYgKChzaGVldHMgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN0eWxlIikpKSB7DQogICAgICAgIHdoaWxlIChpbmRleCA8IHNoZWV0cy5sZW5ndGgpDQogICAgICAgICAgICBpZiAoc2hlZXRzW2luZGV4KytdLmlkID09PSBpZCkgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgcmV0dXJuIGZhbHNlOw0KfTsNCg0KZXhwb3J0cy5pbXBvcnRDc3NTdHJpbmcgPSBmdW5jdGlvbiBpbXBvcnRDc3NTdHJpbmcoY3NzVGV4dCwgaWQsIGRvYykgew0KICAgIGRvYyA9IGRvYyB8fCBkb2N1bWVudDsNCiAgICAvLyBJZiBzdHlsZSBpcyBhbHJlYWR5IGltcG9ydGVkIHJldHVybiBpbW1lZGlhdGVseS4NCiAgICBpZiAoaWQgJiYgZXhwb3J0cy5oYXNDc3NTdHJpbmcoaWQsIGRvYykpDQogICAgICAgIHJldHVybiBudWxsOw0KICAgIA0KICAgIHZhciBzdHlsZTsNCiAgICANCiAgICBpZiAoZG9jLmNyZWF0ZVN0eWxlU2hlZXQpIHsNCiAgICAgICAgc3R5bGUgPSBkb2MuY3JlYXRlU3R5bGVTaGVldCgpOw0KICAgICAgICBzdHlsZS5jc3NUZXh0ID0gY3NzVGV4dDsNCiAgICAgICAgaWYgKGlkKQ0KICAgICAgICAgICAgc3R5bGUudGl0bGUgPSBpZDsNCiAgICB9IGVsc2Ugew0KICAgICAgICBzdHlsZSA9IGRvYy5jcmVhdGVFbGVtZW50TlMNCiAgICAgICAgICAgID8gZG9jLmNyZWF0ZUVsZW1lbnROUyhYSFRNTF9OUywgInN0eWxlIikNCiAgICAgICAgICAgIDogZG9jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7DQoNCiAgICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKGNzc1RleHQpKTsNCiAgICAgICAgaWYgKGlkKQ0KICAgICAgICAgICAgc3R5bGUuaWQgPSBpZDsNCg0KICAgICAgICB2YXIgaGVhZCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdIHx8IGRvYy5kb2N1bWVudEVsZW1lbnQ7DQogICAgICAgIGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOw0KICAgIH0NCn07DQoNCmV4cG9ydHMuaW1wb3J0Q3NzU3R5bHNoZWV0ID0gZnVuY3Rpb24odXJpLCBkb2MpIHsNCiAgICBpZiAoZG9jLmNyZWF0ZVN0eWxlU2hlZXQpIHsNCiAgICAgICAgZG9jLmNyZWF0ZVN0eWxlU2hlZXQodXJpKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICB2YXIgbGluayA9IGV4cG9ydHMuY3JlYXRlRWxlbWVudCgnbGluaycpOw0KICAgICAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JzsNCiAgICAgICAgbGluay5ocmVmID0gdXJpOw0KDQogICAgICAgIHZhciBoZWFkID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0gfHwgZG9jLmRvY3VtZW50RWxlbWVudDsNCiAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChsaW5rKTsNCiAgICB9DQp9Ow0KDQpleHBvcnRzLmdldElubmVyV2lkdGggPSBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgcmV0dXJuICgNCiAgICAgICAgcGFyc2VJbnQoZXhwb3J0cy5jb21wdXRlZFN0eWxlKGVsZW1lbnQsICJwYWRkaW5nTGVmdCIpLCAxMCkgKw0KICAgICAgICBwYXJzZUludChleHBvcnRzLmNvbXB1dGVkU3R5bGUoZWxlbWVudCwgInBhZGRpbmdSaWdodCIpLCAxMCkgKyANCiAgICAgICAgZWxlbWVudC5jbGllbnRXaWR0aA0KICAgICk7DQp9Ow0KDQpleHBvcnRzLmdldElubmVySGVpZ2h0ID0gZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIHJldHVybiAoDQogICAgICAgIHBhcnNlSW50KGV4cG9ydHMuY29tcHV0ZWRTdHlsZShlbGVtZW50LCAicGFkZGluZ1RvcCIpLCAxMCkgKw0KICAgICAgICBwYXJzZUludChleHBvcnRzLmNvbXB1dGVkU3R5bGUoZWxlbWVudCwgInBhZGRpbmdCb3R0b20iKSwgMTApICsNCiAgICAgICAgZWxlbWVudC5jbGllbnRIZWlnaHQNCiAgICApOw0KfTsNCg0KaWYgKHdpbmRvdy5wYWdlWU9mZnNldCAhPT0gdW5kZWZpbmVkKSB7DQogICAgZXhwb3J0cy5nZXRQYWdlU2Nyb2xsVG9wID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB3aW5kb3cucGFnZVlPZmZzZXQ7DQogICAgfTsNCg0KICAgIGV4cG9ydHMuZ2V0UGFnZVNjcm9sbExlZnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHdpbmRvdy5wYWdlWE9mZnNldDsNCiAgICB9Ow0KfQ0KZWxzZSB7DQogICAgZXhwb3J0cy5nZXRQYWdlU2Nyb2xsVG9wID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDsNCiAgICB9Ow0KDQogICAgZXhwb3J0cy5nZXRQYWdlU2Nyb2xsTGVmdCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0Ow0KICAgIH07DQp9DQoNCmlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkNCiAgICBleHBvcnRzLmNvbXB1dGVkU3R5bGUgPSBmdW5jdGlvbihlbGVtZW50LCBzdHlsZSkgew0KICAgICAgICBpZiAoc3R5bGUpDQogICAgICAgICAgICByZXR1cm4gKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsICIiKSB8fCB7fSlbc3R5bGVdIHx8ICIiOw0KICAgICAgICByZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgIiIpIHx8IHt9Ow0KICAgIH07DQplbHNlDQogICAgZXhwb3J0cy5jb21wdXRlZFN0eWxlID0gZnVuY3Rpb24oZWxlbWVudCwgc3R5bGUpIHsNCiAgICAgICAgaWYgKHN0eWxlKQ0KICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY3VycmVudFN0eWxlW3N0eWxlXTsNCiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY3VycmVudFN0eWxlOw0KICAgIH07DQoNCmV4cG9ydHMuc2Nyb2xsYmFyV2lkdGggPSBmdW5jdGlvbihkb2N1bWVudCkgew0KDQogICAgdmFyIGlubmVyID0gZXhwb3J0cy5jcmVhdGVFbGVtZW50KCJwIik7DQogICAgaW5uZXIuc3R5bGUud2lkdGggPSAiMTAwJSI7DQogICAgaW5uZXIuc3R5bGUubWluV2lkdGggPSAiMHB4IjsNCiAgICBpbm5lci5zdHlsZS5oZWlnaHQgPSAiMjAwcHgiOw0KDQogICAgdmFyIG91dGVyID0gZXhwb3J0cy5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICB2YXIgc3R5bGUgPSBvdXRlci5zdHlsZTsNCg0KICAgIHN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsNCiAgICBzdHlsZS5sZWZ0ID0gIi0xMDAwMHB4IjsNCiAgICBzdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOw0KICAgIHN0eWxlLndpZHRoID0gIjIwMHB4IjsNCiAgICBzdHlsZS5taW5XaWR0aCA9ICIwcHgiOw0KICAgIHN0eWxlLmhlaWdodCA9ICIxNTBweCI7DQoNCiAgICBvdXRlci5hcHBlbmRDaGlsZChpbm5lcik7DQoNCiAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHkgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ow0KICAgIGJvZHkuYXBwZW5kQ2hpbGQob3V0ZXIpOw0KDQogICAgdmFyIG5vU2Nyb2xsYmFyID0gaW5uZXIub2Zmc2V0V2lkdGg7DQoNCiAgICBzdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiOw0KICAgIHZhciB3aXRoU2Nyb2xsYmFyID0gaW5uZXIub2Zmc2V0V2lkdGg7DQoNCiAgICBpZiAobm9TY3JvbGxiYXIgPT0gd2l0aFNjcm9sbGJhcikgew0KICAgICAgICB3aXRoU2Nyb2xsYmFyID0gb3V0ZXIuY2xpZW50V2lkdGg7DQogICAgfQ0KDQogICAgYm9keS5yZW1vdmVDaGlsZChvdXRlcik7DQoNCiAgICByZXR1cm4gbm9TY3JvbGxiYXItd2l0aFNjcm9sbGJhcjsNCn07DQoNCi8qKg0KICogT3B0aW1pemVkIHNldCBpbm5lckhUTUwuIFRoaXMgaXMgZmFzdGVyIHRoYW4gcGxhaW4gaW5uZXJIVE1MIGlmIHRoZSBlbGVtZW50DQogKiBhbHJlYWR5IGNvbnRhaW5zIGEgbG90IG9mIGNoaWxkIGVsZW1lbnRzLg0KICoNCiAqIFNlZSBodHRwOi8vYmxvZy5zdGV2ZW5sZXZpdGhhbi5jb20vYXJjaGl2ZXMvZmFzdGVyLXRoYW4taW5uZXJodG1sIGZvciBkZXRhaWxzDQogKi8NCmV4cG9ydHMuc2V0SW5uZXJIdG1sID0gZnVuY3Rpb24oZWwsIGlubmVySHRtbCkgew0KICAgIHZhciBlbGVtZW50ID0gZWwuY2xvbmVOb2RlKGZhbHNlKTsvL2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gaW5uZXJIdG1sOw0KICAgIGVsLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGVsZW1lbnQsIGVsKTsNCiAgICByZXR1cm4gZWxlbWVudDsNCn07DQoNCmV4cG9ydHMuc2V0SW5uZXJUZXh0ID0gZnVuY3Rpb24oZWwsIGlubmVyVGV4dCkgew0KICAgIHZhciBkb2N1bWVudCA9IGVsLm93bmVyRG9jdW1lbnQ7DQogICAgaWYgKGRvY3VtZW50LmJvZHkgJiYgInRleHRDb250ZW50IiBpbiBkb2N1bWVudC5ib2R5KQ0KICAgICAgICBlbC50ZXh0Q29udGVudCA9IGlubmVyVGV4dDsNCiAgICBlbHNlDQogICAgICAgIGVsLmlubmVyVGV4dCA9IGlubmVyVGV4dDsNCg0KfTsNCg0KZXhwb3J0cy5nZXRJbm5lclRleHQgPSBmdW5jdGlvbihlbCkgew0KICAgIHZhciBkb2N1bWVudCA9IGVsLm93bmVyRG9jdW1lbnQ7DQogICAgaWYgKGRvY3VtZW50LmJvZHkgJiYgInRleHRDb250ZW50IiBpbiBkb2N1bWVudC5ib2R5KQ0KICAgICAgICByZXR1cm4gZWwudGV4dENvbnRlbnQ7DQogICAgZWxzZQ0KICAgICAgICAgcmV0dXJuIGVsLmlubmVyVGV4dCB8fCBlbC50ZXh0Q29udGVudCB8fCAiIjsNCn07DQoNCmV4cG9ydHMuZ2V0UGFyZW50V2luZG93ID0gZnVuY3Rpb24oZG9jdW1lbnQpIHsNCiAgICByZXR1cm4gZG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgZG9jdW1lbnQucGFyZW50V2luZG93Ow0KfTsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbGliL2V2ZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2tleXMnLCAnYWNlL2xpYi91c2VyYWdlbnQnLCAnYWNlL2xpYi9kb20nXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBrZXlzID0gcmVxdWlyZSgiLi9rZXlzIik7DQp2YXIgdXNlcmFnZW50ID0gcmVxdWlyZSgiLi91c2VyYWdlbnQiKTsNCnZhciBkb20gPSByZXF1aXJlKCIuL2RvbSIpOw0KDQpleHBvcnRzLmFkZExpc3RlbmVyID0gZnVuY3Rpb24oZWxlbSwgdHlwZSwgY2FsbGJhY2spIHsNCiAgICBpZiAoZWxlbS5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICAgIHJldHVybiBlbGVtLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2ssIGZhbHNlKTsNCiAgICB9DQogICAgaWYgKGVsZW0uYXR0YWNoRXZlbnQpIHsNCiAgICAgICAgdmFyIHdyYXBwZXIgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGNhbGxiYWNrKHdpbmRvdy5ldmVudCk7DQogICAgICAgIH07DQogICAgICAgIGNhbGxiYWNrLl93cmFwcGVyID0gd3JhcHBlcjsNCiAgICAgICAgZWxlbS5hdHRhY2hFdmVudCgib24iICsgdHlwZSwgd3JhcHBlcik7DQogICAgfQ0KfTsNCg0KZXhwb3J0cy5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKGVsZW0sIHR5cGUsIGNhbGxiYWNrKSB7DQogICAgaWYgKGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcikgew0KICAgICAgICByZXR1cm4gZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrLCBmYWxzZSk7DQogICAgfQ0KICAgIGlmIChlbGVtLmRldGFjaEV2ZW50KSB7DQogICAgICAgIGVsZW0uZGV0YWNoRXZlbnQoIm9uIiArIHR5cGUsIGNhbGxiYWNrLl93cmFwcGVyIHx8IGNhbGxiYWNrKTsNCiAgICB9DQp9Ow0KDQovKioNCiogUHJldmVudHMgcHJvcGFnYXRpb24gYW5kIGNsb2JiZXJzIHRoZSBkZWZhdWx0IGFjdGlvbiBvZiB0aGUgcGFzc2VkIGV2ZW50DQoqLw0KZXhwb3J0cy5zdG9wRXZlbnQgPSBmdW5jdGlvbihlKSB7DQogICAgZXhwb3J0cy5zdG9wUHJvcGFnYXRpb24oZSk7DQogICAgZXhwb3J0cy5wcmV2ZW50RGVmYXVsdChlKTsNCiAgICByZXR1cm4gZmFsc2U7DQp9Ow0KDQpleHBvcnRzLnN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uKGUpIHsNCiAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pDQogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7DQogICAgZWxzZQ0KICAgICAgICBlLmNhbmNlbEJ1YmJsZSA9IHRydWU7DQp9Ow0KDQpleHBvcnRzLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oZSkgew0KICAgIGlmIChlLnByZXZlbnREZWZhdWx0KQ0KICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgZWxzZQ0KICAgICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7DQp9Ow0KDQpleHBvcnRzLmdldERvY3VtZW50WCA9IGZ1bmN0aW9uKGUpIHsNCiAgICBpZiAoZS5jbGllbnRYKSB7DQogICAgICAgIHJldHVybiBlLmNsaWVudFggKyBkb20uZ2V0UGFnZVNjcm9sbExlZnQoKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gZS5wYWdlWDsNCiAgICB9DQp9Ow0KDQpleHBvcnRzLmdldERvY3VtZW50WSA9IGZ1bmN0aW9uKGUpIHsNCiAgICBpZiAoZS5jbGllbnRZKSB7DQogICAgICAgIHJldHVybiBlLmNsaWVudFkgKyBkb20uZ2V0UGFnZVNjcm9sbFRvcCgpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiBlLnBhZ2VZOw0KICAgIH0NCn07DQoNCi8qKg0KICogQHJldHVybiB7TnVtYmVyfSAwIGZvciBsZWZ0IGJ1dHRvbiwgMSBmb3IgbWlkZGxlIGJ1dHRvbiwgMiBmb3IgcmlnaHQgYnV0dG9uDQogKi8NCmV4cG9ydHMuZ2V0QnV0dG9uID0gZnVuY3Rpb24oZSkgew0KICAgIGlmIChlLnR5cGUgPT0gImRibGNsaWNrIikNCiAgICAgICAgcmV0dXJuIDA7DQogICAgZWxzZSBpZiAoZS50eXBlID09ICJjb250ZXh0bWVudSIpDQogICAgICAgIHJldHVybiAyOw0KDQogICAgLy8gRE9NIEV2ZW50DQogICAgaWYgKGUucHJldmVudERlZmF1bHQpIHsNCiAgICAgICAgcmV0dXJuIGUuYnV0dG9uOw0KICAgIH0NCiAgICAvLyBvbGQgSUUNCiAgICBlbHNlIHsNCiAgICAgICAgcmV0dXJuIHsxOjAsIDI6MiwgNDoxfVtlLmJ1dHRvbl07DQogICAgfQ0KfTsNCg0KaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zZXRDYXB0dXJlKSB7DQogICAgZXhwb3J0cy5jYXB0dXJlID0gZnVuY3Rpb24oZWwsIGV2ZW50SGFuZGxlciwgcmVsZWFzZUNhcHR1cmVIYW5kbGVyKSB7DQogICAgICAgIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGUpIHsNCiAgICAgICAgICAgIGV2ZW50SGFuZGxlcihlKTsNCiAgICAgICAgICAgIHJldHVybiBleHBvcnRzLnN0b3BQcm9wYWdhdGlvbihlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBjYWxsZWQgPSBmYWxzZTsNCiAgICAgICAgZnVuY3Rpb24gb25SZWxlYXNlQ2FwdHVyZShlKSB7DQogICAgICAgICAgICBldmVudEhhbmRsZXIoZSk7DQoNCiAgICAgICAgICAgIGlmICghY2FsbGVkKSB7DQogICAgICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICByZWxlYXNlQ2FwdHVyZUhhbmRsZXIoZSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGV4cG9ydHMucmVtb3ZlTGlzdGVuZXIoZWwsICJtb3VzZW1vdmUiLCBldmVudEhhbmRsZXIpOw0KICAgICAgICAgICAgZXhwb3J0cy5yZW1vdmVMaXN0ZW5lcihlbCwgIm1vdXNldXAiLCBvblJlbGVhc2VDYXB0dXJlKTsNCiAgICAgICAgICAgIGV4cG9ydHMucmVtb3ZlTGlzdGVuZXIoZWwsICJsb3NlY2FwdHVyZSIsIG9uUmVsZWFzZUNhcHR1cmUpOw0KDQogICAgICAgICAgICBlbC5yZWxlYXNlQ2FwdHVyZSgpOw0KICAgICAgICB9DQoNCiAgICAgICAgZXhwb3J0cy5hZGRMaXN0ZW5lcihlbCwgIm1vdXNlbW92ZSIsIGV2ZW50SGFuZGxlcik7DQogICAgICAgIGV4cG9ydHMuYWRkTGlzdGVuZXIoZWwsICJtb3VzZXVwIiwgb25SZWxlYXNlQ2FwdHVyZSk7DQogICAgICAgIGV4cG9ydHMuYWRkTGlzdGVuZXIoZWwsICJsb3NlY2FwdHVyZSIsIG9uUmVsZWFzZUNhcHR1cmUpOw0KICAgICAgICBlbC5zZXRDYXB0dXJlKCk7DQogICAgfTsNCn0NCmVsc2Ugew0KICAgIGV4cG9ydHMuY2FwdHVyZSA9IGZ1bmN0aW9uKGVsLCBldmVudEhhbmRsZXIsIHJlbGVhc2VDYXB0dXJlSGFuZGxlcikgew0KICAgICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7DQogICAgICAgICAgICBldmVudEhhbmRsZXIoZSk7DQogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gb25Nb3VzZVVwKGUpIHsNCiAgICAgICAgICAgIGV2ZW50SGFuZGxlciAmJiBldmVudEhhbmRsZXIoZSk7DQogICAgICAgICAgICByZWxlYXNlQ2FwdHVyZUhhbmRsZXIgJiYgcmVsZWFzZUNhcHR1cmVIYW5kbGVyKGUpOw0KDQogICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgdHJ1ZSk7DQogICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgb25Nb3VzZVVwLCB0cnVlKTsNCg0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIG9uTW91c2VNb3ZlLCB0cnVlKTsNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIG9uTW91c2VVcCwgdHJ1ZSk7DQogICAgfTsNCn0NCg0KZXhwb3J0cy5hZGRNb3VzZVdoZWVsTGlzdGVuZXIgPSBmdW5jdGlvbihlbCwgY2FsbGJhY2spIHsNCiAgICB2YXIgbWF4ID0gMDsNCiAgICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIGlmIChlLndoZWVsRGVsdGEgIT09IHVuZGVmaW5lZCkgew0KDQogICAgICAgICAgICAvLyBzb21lIHZlcnNpb25zIG9mIFNhZmFyaSAoZS5nLiA1LjAuNSkgcmVwb3J0IGluc2FuZWx5IGhpZ2gNCiAgICAgICAgICAgIC8vIHNjcm9sbCB2YWx1ZXMuIFRoZXNlIGJyb3dzZXJzIHJlcXVpcmUgYSBoaWdoZXIgZmFjdG9yDQogICAgICAgICAgICBpZiAoTWF0aC5hYnMoZS53aGVlbERlbHRhWSkgPiBtYXgpDQogICAgICAgICAgICAgICAgbWF4ID0gTWF0aC5hYnMoZS53aGVlbERlbHRhWSk7DQoNCiAgICAgICAgICAgIGlmIChtYXggPiA1MDAwKQ0KICAgICAgICAgICAgICAgIHZhciBmYWN0b3IgPSA0MDA7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgdmFyIGZhY3RvciA9IDg7DQoNCiAgICAgICAgICAgIGlmIChlLndoZWVsRGVsdGFYICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICBlLndoZWVsWCA9IC1lLndoZWVsRGVsdGFYIC8gZmFjdG9yOw0KICAgICAgICAgICAgICAgIGUud2hlZWxZID0gLWUud2hlZWxEZWx0YVkgLyBmYWN0b3I7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGUud2hlZWxYID0gMDsNCiAgICAgICAgICAgICAgICBlLndoZWVsWSA9IC1lLndoZWVsRGVsdGEgLyBmYWN0b3I7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBpZiAoZS5heGlzICYmIGUuYXhpcyA9PSBlLkhPUklaT05UQUxfQVhJUykgew0KICAgICAgICAgICAgICAgIGUud2hlZWxYID0gKGUuZGV0YWlsIHx8IDApICogNTsNCiAgICAgICAgICAgICAgICBlLndoZWVsWSA9IDA7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGUud2hlZWxYID0gMDsNCiAgICAgICAgICAgICAgICBlLndoZWVsWSA9IChlLmRldGFpbCB8fCAwKSAqIDU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgY2FsbGJhY2soZSk7DQogICAgfTsNCiAgICBleHBvcnRzLmFkZExpc3RlbmVyKGVsLCAiRE9NTW91c2VTY3JvbGwiLCBsaXN0ZW5lcik7DQogICAgZXhwb3J0cy5hZGRMaXN0ZW5lcihlbCwgIm1vdXNld2hlZWwiLCBsaXN0ZW5lcik7DQp9Ow0KDQpleHBvcnRzLmFkZE11bHRpTW91c2VEb3duTGlzdGVuZXIgPSBmdW5jdGlvbihlbCwgYnV0dG9uLCBjb3VudCwgdGltZW91dCwgY2FsbGJhY2spIHsNCiAgICB2YXIgY2xpY2tzID0gMDsNCiAgICB2YXIgc3RhcnRYLCBzdGFydFk7DQoNCiAgICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIGNsaWNrcyArPSAxOw0KICAgICAgICBpZiAoY2xpY2tzID09IDEpIHsNCiAgICAgICAgICAgIHN0YXJ0WCA9IGUuY2xpZW50WDsNCiAgICAgICAgICAgIHN0YXJ0WSA9IGUuY2xpZW50WTsNCg0KICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICBjbGlja3MgPSAwOw0KICAgICAgICAgICAgfSwgdGltZW91dCB8fCA2MDApOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGlzQnV0dG9uID0gZXhwb3J0cy5nZXRCdXR0b24oZSkgPT0gYnV0dG9uOw0KICAgICAgICBpZiAoIWlzQnV0dG9uIHx8IE1hdGguYWJzKGUuY2xpZW50WCAtIHN0YXJ0WCkgPiA1IHx8IE1hdGguYWJzKGUuY2xpZW50WSAtIHN0YXJ0WSkgPiA1KQ0KICAgICAgICAgICAgY2xpY2tzID0gMDsNCg0KICAgICAgICBpZiAoY2xpY2tzID09IGNvdW50KSB7DQogICAgICAgICAgICBjbGlja3MgPSAwOw0KICAgICAgICAgICAgY2FsbGJhY2soZSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoaXNCdXR0b24pDQogICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5wcmV2ZW50RGVmYXVsdChlKTsNCiAgICB9Ow0KDQogICAgZXhwb3J0cy5hZGRMaXN0ZW5lcihlbCwgIm1vdXNlZG93biIsIGxpc3RlbmVyKTsNCiAgICB1c2VyYWdlbnQuaXNPbGRJRSAmJiBleHBvcnRzLmFkZExpc3RlbmVyKGVsLCAiZGJsY2xpY2siLCBsaXN0ZW5lcik7DQp9Ow0KDQpmdW5jdGlvbiBub3JtYWxpemVDb21tYW5kS2V5cyhjYWxsYmFjaywgZSwga2V5Q29kZSkgew0KICAgIHZhciBoYXNoSWQgPSAwOw0KICAgIGlmICh1c2VyYWdlbnQuaXNPcGVyYSAmJiB1c2VyYWdlbnQuaXNNYWMpIHsNCiAgICAgICAgaGFzaElkID0gMCB8IChlLm1ldGFLZXkgPyAxIDogMCkgfCAoZS5hbHRLZXkgPyAyIDogMCkNCiAgICAgICAgICAgIHwgKGUuc2hpZnRLZXkgPyA0IDogMCkgfCAoZS5jdHJsS2V5ID8gOCA6IDApOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGhhc2hJZCA9IDAgfCAoZS5jdHJsS2V5ID8gMSA6IDApIHwgKGUuYWx0S2V5ID8gMiA6IDApDQogICAgICAgICAgICB8IChlLnNoaWZ0S2V5ID8gNCA6IDApIHwgKGUubWV0YUtleSA/IDggOiAwKTsNCiAgICB9DQoNCiAgICBpZiAoa2V5Q29kZSBpbiBrZXlzLk1PRElGSUVSX0tFWVMpIHsNCiAgICAgICAgc3dpdGNoIChrZXlzLk1PRElGSUVSX0tFWVNba2V5Q29kZV0pIHsNCiAgICAgICAgICAgIGNhc2UgIkFsdCI6DQogICAgICAgICAgICAgICAgaGFzaElkID0gMjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgIlNoaWZ0IjoNCiAgICAgICAgICAgICAgICBoYXNoSWQgPSA0Ow0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAiQ3RybCI6DQogICAgICAgICAgICAgICAgaGFzaElkID0gMTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgaGFzaElkID0gODsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgICBrZXlDb2RlID0gMDsNCiAgICB9DQoNCiAgICBpZiAoaGFzaElkICYgOCAmJiAoa2V5Q29kZSA9PSA5MSB8fCBrZXlDb2RlID09IDkzKSkgew0KICAgICAgICBrZXlDb2RlID0gMDsNCiAgICB9DQoNCiAgICAvLyBJZiB0aGVyZSBpcyBubyBoYXNoSUQgYW5kIHRoZSBrZXlDb2RlIGlzIG5vdCBhIGZ1bmN0aW9uIGtleSwgdGhlbg0KICAgIC8vIHdlIGRvbid0IGNhbGwgdGhlIGNhbGxiYWNrIGFzIHdlIGRvbid0IGhhbmRsZSBhIGNvbW1hbmQga2V5IGhlcmUNCiAgICAvLyAoaXQncyBhIG5vcm1hbCBrZXkvY2hhcmFjdGVyIGlucHV0KS4NCiAgICBpZiAoIWhhc2hJZCAmJiAhKGtleUNvZGUgaW4ga2V5cy5GVU5DVElPTl9LRVlTKSAmJiAhKGtleUNvZGUgaW4ga2V5cy5QUklOVEFCTEVfS0VZUykpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCiAgICByZXR1cm4gY2FsbGJhY2soZSwgaGFzaElkLCBrZXlDb2RlKTsNCn0NCg0KZXhwb3J0cy5hZGRDb21tYW5kS2V5TGlzdGVuZXIgPSBmdW5jdGlvbihlbCwgY2FsbGJhY2spIHsNCiAgICB2YXIgYWRkTGlzdGVuZXIgPSBleHBvcnRzLmFkZExpc3RlbmVyOw0KICAgIGlmICh1c2VyYWdlbnQuaXNPbGRHZWNrbyB8fCB1c2VyYWdlbnQuaXNPcGVyYSkgew0KICAgICAgICAvLyBPbGQgdmVyc2lvbnMgb2YgR2Vja28gYWthLiBGaXJlZm94IDwgNC4wIGRpZG4ndCByZXBlYXQgdGhlIGtleWRvd24NCiAgICAgICAgLy8gZXZlbnQgaWYgdGhlIHVzZXIgcHJlc3NlZCB0aGUga2V5IGZvciBhIGxvbmdlciB0aW1lLiBJbnN0ZWFkLCB0aGUNCiAgICAgICAgLy8ga2V5ZG93biBldmVudCB3YXMgZmlyZWQgb25jZSBhbmQgbGF0ZXIgb24gb25seSB0aGUga2V5cHJlc3MgZXZlbnQuDQogICAgICAgIC8vIFRvIGVtdWxhdGUgdGhlICdyaWdodCcga2V5ZG93biBiZWhhdmlvciwgdGhlIGtleUNvZGUgb2YgdGhlIGluaXRpYWwNCiAgICAgICAgLy8ga2V5RG93biBldmVudCBpcyBzdG9yZWQgYW5kIGluIHRoZSBmb2xsb3dpbmcga2V5cHJlc3MgZXZlbnRzIHRoZQ0KICAgICAgICAvLyBzdG9yZXMga2V5Q29kZSBpcyB1c2VkIHRvIGVtdWxhdGUgYSBrZXlEb3duIGV2ZW50Lg0KICAgICAgICB2YXIgbGFzdEtleURvd25LZXlDb2RlID0gbnVsbDsNCiAgICAgICAgYWRkTGlzdGVuZXIoZWwsICJrZXlkb3duIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgbGFzdEtleURvd25LZXlDb2RlID0gZS5rZXlDb2RlOw0KICAgICAgICB9KTsNCiAgICAgICAgYWRkTGlzdGVuZXIoZWwsICJrZXlwcmVzcyIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVDb21tYW5kS2V5cyhjYWxsYmFjaywgZSwgbGFzdEtleURvd25LZXlDb2RlKTsNCiAgICAgICAgfSk7DQogICAgfSBlbHNlIHsNCiAgICAgICAgdmFyIGxhc3REb3duID0gbnVsbDsNCg0KICAgICAgICBhZGRMaXN0ZW5lcihlbCwgImtleWRvd24iLCBmdW5jdGlvbihlKSB7DQogICAgICAgICAgICBsYXN0RG93biA9IGUua2V5SWRlbnRpZmllciB8fCBlLmtleUNvZGU7DQogICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplQ29tbWFuZEtleXMoY2FsbGJhY2ssIGUsIGUua2V5Q29kZSk7DQogICAgICAgIH0pOw0KICAgIH0NCn07DQoNCmlmICh3aW5kb3cucG9zdE1lc3NhZ2UpIHsNCiAgICB2YXIgcG9zdE1lc3NhZ2VJZCA9IDE7DQogICAgZXhwb3J0cy5uZXh0VGljayA9IGZ1bmN0aW9uKGNhbGxiYWNrLCB3aW4pIHsNCiAgICAgICAgd2luID0gd2luIHx8IHdpbmRvdzsNCiAgICAgICAgdmFyIG1lc3NhZ2VOYW1lID0gInplcm8tdGltZW91dC1tZXNzYWdlLSIgKyBwb3N0TWVzc2FnZUlkOyAgICAgICAgICAgIA0KICAgICAgICBleHBvcnRzLmFkZExpc3RlbmVyKHdpbiwgIm1lc3NhZ2UiLCBmdW5jdGlvbiBsaXN0ZW5lcihlKSB7DQogICAgICAgICAgICBpZiAoZS5kYXRhID09IG1lc3NhZ2VOYW1lKSB7DQogICAgICAgICAgICAgICAgZXhwb3J0cy5zdG9wUHJvcGFnYXRpb24oZSk7DQogICAgICAgICAgICAgICAgZXhwb3J0cy5yZW1vdmVMaXN0ZW5lcih3aW4sICJtZXNzYWdlIiwgbGlzdGVuZXIpOw0KICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICB3aW4ucG9zdE1lc3NhZ2UobWVzc2FnZU5hbWUsICIqIik7DQogICAgfTsNCn0NCmVsc2Ugew0KICAgIGV4cG9ydHMubmV4dFRpY2sgPSBmdW5jdGlvbihjYWxsYmFjaywgd2luKSB7DQogICAgICAgIHdpbiA9IHdpbiB8fCB3aW5kb3c7DQogICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCAwKTsNCiAgICB9Ow0KfQ0KDQp9KTsNCi8qISBAbGljZW5zZQ0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClNwcm91dENvcmUgLS0gSmF2YVNjcmlwdCBBcHBsaWNhdGlvbiBGcmFtZXdvcmsNCmNvcHlyaWdodCAyMDA2LTIwMDksIFNwcm91dCBTeXN0ZW1zIEluYy4sIEFwcGxlIEluYy4gYW5kIGNvbnRyaWJ1dG9ycy4NCg0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGENCmNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksDQp0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uDQp0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwNCmFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQ0KU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4NCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KDQpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQpGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HDQpGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSDQpERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQoNClNwcm91dENvcmUgYW5kIHRoZSBTcHJvdXRDb3JlIGxvZ28gYXJlIHRyYWRlbWFya3Mgb2YgU3Byb3V0IFN5c3RlbXMsIEluYy4NCg0KRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgU3Byb3V0Q29yZSwgdmlzaXQgaHR0cDovL3d3dy5zcHJvdXRjb3JlLmNvbQ0KDQoNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpAbGljZW5zZSAqLw0KDQovLyBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgY29kZSBpcyB0YWtlbiBmcm9tIFNwcm91dENvcmUgd2l0aCBhIGZldyBjaGFuZ2VzLg0KDQpkZWZpbmUoJ2FjZS9saWIva2V5cycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuL29vcCIpOw0KDQovKioNCiAqIEhlbHBlciBmdW5jdGlvbnMgYW5kIGhhc2hlcyBmb3Iga2V5IGhhbmRsaW5nLg0KICovDQp2YXIgS2V5cyA9IChmdW5jdGlvbigpIHsNCiAgICB2YXIgcmV0ID0gew0KICAgICAgICBNT0RJRklFUl9LRVlTOiB7DQogICAgICAgICAgICAxNjogJ1NoaWZ0JywgMTc6ICdDdHJsJywgMTg6ICdBbHQnLCAyMjQ6ICdNZXRhJw0KICAgICAgICB9LA0KDQogICAgICAgIEtFWV9NT0RTOiB7DQogICAgICAgICAgICAiY3RybCI6IDEsICJhbHQiOiAyLCAib3B0aW9uIiA6IDIsDQogICAgICAgICAgICAic2hpZnQiOiA0LCAibWV0YSI6IDgsICJjb21tYW5kIjogOA0KICAgICAgICB9LA0KDQogICAgICAgIEZVTkNUSU9OX0tFWVMgOiB7DQogICAgICAgICAgICA4ICA6ICJCYWNrc3BhY2UiLA0KICAgICAgICAgICAgOSAgOiAiVGFiIiwNCiAgICAgICAgICAgIDEzIDogIlJldHVybiIsDQogICAgICAgICAgICAxOSA6ICJQYXVzZSIsDQogICAgICAgICAgICAyNyA6ICJFc2MiLA0KICAgICAgICAgICAgMzIgOiAiU3BhY2UiLA0KICAgICAgICAgICAgMzMgOiAiUGFnZVVwIiwNCiAgICAgICAgICAgIDM0IDogIlBhZ2VEb3duIiwNCiAgICAgICAgICAgIDM1IDogIkVuZCIsDQogICAgICAgICAgICAzNiA6ICJIb21lIiwNCiAgICAgICAgICAgIDM3IDogIkxlZnQiLA0KICAgICAgICAgICAgMzggOiAiVXAiLA0KICAgICAgICAgICAgMzkgOiAiUmlnaHQiLA0KICAgICAgICAgICAgNDAgOiAiRG93biIsDQogICAgICAgICAgICA0NCA6ICJQcmludCIsDQogICAgICAgICAgICA0NSA6ICJJbnNlcnQiLA0KICAgICAgICAgICAgNDYgOiAiRGVsZXRlIiwNCiAgICAgICAgICAgIDk2IDogIk51bXBhZDAiLA0KICAgICAgICAgICAgOTcgOiAiTnVtcGFkMSIsDQogICAgICAgICAgICA5OCA6ICJOdW1wYWQyIiwNCiAgICAgICAgICAgIDk5IDogIk51bXBhZDMiLA0KICAgICAgICAgICAgMTAwOiAiTnVtcGFkNCIsDQogICAgICAgICAgICAxMDE6ICJOdW1wYWQ1IiwNCiAgICAgICAgICAgIDEwMjogIk51bXBhZDYiLA0KICAgICAgICAgICAgMTAzOiAiTnVtcGFkNyIsDQogICAgICAgICAgICAxMDQ6ICJOdW1wYWQ4IiwNCiAgICAgICAgICAgIDEwNTogIk51bXBhZDkiLA0KICAgICAgICAgICAgMTEyOiAiRjEiLA0KICAgICAgICAgICAgMTEzOiAiRjIiLA0KICAgICAgICAgICAgMTE0OiAiRjMiLA0KICAgICAgICAgICAgMTE1OiAiRjQiLA0KICAgICAgICAgICAgMTE2OiAiRjUiLA0KICAgICAgICAgICAgMTE3OiAiRjYiLA0KICAgICAgICAgICAgMTE4OiAiRjciLA0KICAgICAgICAgICAgMTE5OiAiRjgiLA0KICAgICAgICAgICAgMTIwOiAiRjkiLA0KICAgICAgICAgICAgMTIxOiAiRjEwIiwNCiAgICAgICAgICAgIDEyMjogIkYxMSIsDQogICAgICAgICAgICAxMjM6ICJGMTIiLA0KICAgICAgICAgICAgMTQ0OiAiTnVtbG9jayIsDQogICAgICAgICAgICAxNDU6ICJTY3JvbGxsb2NrIg0KICAgICAgICB9LA0KDQogICAgICAgIFBSSU5UQUJMRV9LRVlTOiB7DQogICAgICAgICAgIDMyOiAnICcsICA0ODogJzAnLCAgNDk6ICcxJywgIDUwOiAnMicsICA1MTogJzMnLCAgNTI6ICc0JywgNTM6ICAnNScsDQogICAgICAgICAgIDU0OiAnNicsICA1NTogJzcnLCAgNTY6ICc4JywgIDU3OiAnOScsICA1OTogJzsnLCAgNjE6ICc9JywgNjU6ICAnYScsDQogICAgICAgICAgIDY2OiAnYicsICA2NzogJ2MnLCAgNjg6ICdkJywgIDY5OiAnZScsICA3MDogJ2YnLCAgNzE6ICdnJywgNzI6ICAnaCcsDQogICAgICAgICAgIDczOiAnaScsICA3NDogJ2onLCAgNzU6ICdrJywgIDc2OiAnbCcsICA3NzogJ20nLCAgNzg6ICduJywgNzk6ICAnbycsDQogICAgICAgICAgIDgwOiAncCcsICA4MTogJ3EnLCAgODI6ICdyJywgIDgzOiAncycsICA4NDogJ3QnLCAgODU6ICd1JywgODY6ICAndicsDQogICAgICAgICAgIDg3OiAndycsICA4ODogJ3gnLCAgODk6ICd5JywgIDkwOiAneicsIDEwNzogJysnLCAxMDk6ICctJywgMTEwOiAnLicsDQogICAgICAgICAgMTg4OiAnLCcsIDE5MDogJy4nLCAxOTE6ICcvJywgMTkyOiAnYCcsIDIxOTogJ1snLCAyMjA6ICdcXCcsDQogICAgICAgICAgMjIxOiAnXScsIDIyMjogJ1wiJw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIC8vIEEgcmV2ZXJzZSBtYXAgb2YgRlVOQ1RJT05fS0VZUw0KICAgIGZvciAodmFyIGkgaW4gcmV0LkZVTkNUSU9OX0tFWVMpIHsNCiAgICAgICAgdmFyIG5hbWUgPSByZXQuRlVOQ1RJT05fS0VZU1tpXS50b1VwcGVyQ2FzZSgpOw0KICAgICAgICByZXRbbmFtZV0gPSBwYXJzZUludChpLCAxMCk7DQogICAgfQ0KDQogICAgLy8gQWRkIHRoZSBNT0RJRklFUl9LRVlTLCBGVU5DVElPTl9LRVlTIGFuZCBQUklOVEFCTEVfS0VZUyB0byB0aGUgS0VZDQogICAgLy8gdmFyaWFibGVzIGFzIHdlbGwuDQogICAgb29wLm1peGluKHJldCwgcmV0Lk1PRElGSUVSX0tFWVMpOw0KICAgIG9vcC5taXhpbihyZXQsIHJldC5QUklOVEFCTEVfS0VZUyk7DQogICAgb29wLm1peGluKHJldCwgcmV0LkZVTkNUSU9OX0tFWVMpOw0KDQogICAgcmV0dXJuIHJldDsNCn0pKCk7DQpvb3AubWl4aW4oZXhwb3J0cywgS2V5cyk7DQoNCmV4cG9ydHMua2V5Q29kZVRvU3RyaW5nID0gZnVuY3Rpb24oa2V5Q29kZSkgew0KICAgIHJldHVybiAoS2V5c1trZXlDb2RlXSB8fCBTdHJpbmcuZnJvbUNoYXJDb2RlKGtleUNvZGUpKS50b0xvd2VyQ2FzZSgpOw0KfQ0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbGliL29vcCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCmV4cG9ydHMuaW5oZXJpdHMgPSAoZnVuY3Rpb24oKSB7DQogICAgdmFyIHRlbXBDdG9yID0gZnVuY3Rpb24oKSB7fTsNCiAgICByZXR1cm4gZnVuY3Rpb24oY3Rvciwgc3VwZXJDdG9yKSB7DQogICAgICAgIHRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGU7DQogICAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yLnByb3RvdHlwZTsNCiAgICAgICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgdGVtcEN0b3IoKTsNCiAgICAgICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yOw0KICAgIH07DQp9KCkpOw0KDQpleHBvcnRzLm1peGluID0gZnVuY3Rpb24ob2JqLCBtaXhpbikgew0KICAgIGZvciAodmFyIGtleSBpbiBtaXhpbikgew0KICAgICAgICBvYmpba2V5XSA9IG1peGluW2tleV07DQogICAgfQ0KfTsNCg0KZXhwb3J0cy5pbXBsZW1lbnQgPSBmdW5jdGlvbihwcm90bywgbWl4aW4pIHsNCiAgICBleHBvcnRzLm1peGluKHByb3RvLCBtaXhpbik7DQp9Ow0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvdXNlcmFnZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9zID0gKG5hdmlnYXRvci5wbGF0Zm9ybS5tYXRjaCgvbWFjfHdpbnxsaW51eC9pKSB8fCBbIm90aGVyIl0pWzBdLnRvTG93ZXJDYXNlKCk7DQp2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50Ow0KDQovKiogSXMgdGhlIHVzZXIgdXNpbmcgYSBicm93c2VyIHRoYXQgaWRlbnRpZmllcyBpdHNlbGYgYXMgV2luZG93cyAqLw0KZXhwb3J0cy5pc1dpbiA9IChvcyA9PSAid2luIik7DQoNCi8qKiBJcyB0aGUgdXNlciB1c2luZyBhIGJyb3dzZXIgdGhhdCBpZGVudGlmaWVzIGl0c2VsZiBhcyBNYWMgT1MgKi8NCmV4cG9ydHMuaXNNYWMgPSAob3MgPT0gIm1hYyIpOw0KDQovKiogSXMgdGhlIHVzZXIgdXNpbmcgYSBicm93c2VyIHRoYXQgaWRlbnRpZmllcyBpdHNlbGYgYXMgTGludXggKi8NCmV4cG9ydHMuaXNMaW51eCA9IChvcyA9PSAibGludXgiKTsNCg0KZXhwb3J0cy5pc0lFID0gDQogICAgbmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciINCiAgICAmJiBwYXJzZUZsb2F0KG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01TSUUgKFswLTldK1tcLjAtOV0rKS8pWzFdKTsNCiAgICANCmV4cG9ydHMuaXNPbGRJRSA9IGV4cG9ydHMuaXNJRSAmJiBleHBvcnRzLmlzSUUgPCA5Ow0KDQovKiogSXMgdGhpcyBGaXJlZm94IG9yIHJlbGF0ZWQ/ICovDQpleHBvcnRzLmlzR2Vja28gPSBleHBvcnRzLmlzTW96aWxsYSA9IHdpbmRvdy5jb250cm9sbGVycyAmJiB3aW5kb3cubmF2aWdhdG9yLnByb2R1Y3QgPT09ICJHZWNrbyI7DQoNCi8qKiBvbGRHZWNrbyA9PSByZXYgPCAyLjAgKiovDQpleHBvcnRzLmlzT2xkR2Vja28gPSBleHBvcnRzLmlzR2Vja28gJiYgcGFyc2VJbnQoKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL3J2XDooXGQrKS8pfHxbXSlbMV0sIDEwKSA8IDQ7DQoNCi8qKiBJcyB0aGlzIE9wZXJhICovDQpleHBvcnRzLmlzT3BlcmEgPSB3aW5kb3cub3BlcmEgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdy5vcGVyYSkgPT0gIltvYmplY3QgT3BlcmFdIjsNCg0KLyoqIElzIHRoZSB1c2VyIHVzaW5nIGEgYnJvd3NlciB0aGF0IGlkZW50aWZpZXMgaXRzZWxmIGFzIFdlYktpdCAqLw0KZXhwb3J0cy5pc1dlYktpdCA9IHBhcnNlRmxvYXQodWEuc3BsaXQoIldlYktpdC8iKVsxXSkgfHwgdW5kZWZpbmVkOw0KDQpleHBvcnRzLmlzQ2hyb21lID0gcGFyc2VGbG9hdCh1YS5zcGxpdCgiIENocm9tZS8iKVsxXSkgfHwgdW5kZWZpbmVkOw0KDQpleHBvcnRzLmlzQUlSID0gdWEuaW5kZXhPZigiQWRvYmVBSVIiKSA+PSAwOw0KDQpleHBvcnRzLmlzSVBhZCA9IHVhLmluZGV4T2YoImlQYWQiKSA+PSAwOw0KDQpleHBvcnRzLmlzVG91Y2hQYWQgPSB1YS5pbmRleE9mKCJUb3VjaFBhZCIpID49IDA7DQoNCi8qKg0KICogSSBoYXRlIGRvaW5nIHRoaXMsIGJ1dCB3ZSBuZWVkIHNvbWUgd2F5IHRvIGRldGVybWluZSBpZiB0aGUgdXNlciBpcyBvbiBhIE1hYw0KICogVGhlIHJlYXNvbiBpcyB0aGF0IHVzZXJzIGhhdmUgZGlmZmVyZW50IGV4cGVjdGF0aW9ucyBvZiB0aGVpciBrZXkgY29tYmluYXRpb25zLg0KICoNCiAqIFRha2UgY29weSBhcyBhbiBleGFtcGxlLCBNYWMgcGVvcGxlIGV4cGVjdCB0byB1c2UgQ01EIG9yIEFQUExFICsgQw0KICogV2luZG93cyBmb2xrcyBleHBlY3QgdG8gdXNlIENUUkwgKyBDDQogKi8NCmV4cG9ydHMuT1MgPSB7DQogICAgTElOVVg6ICJMSU5VWCIsDQogICAgTUFDOiAiTUFDIiwNCiAgICBXSU5ET1dTOiAiV0lORE9XUyINCn07DQoNCi8qKg0KICogUmV0dXJuIGFuIGV4cG9ydHMuT1MgY29uc3RhbnQNCiAqLw0KZXhwb3J0cy5nZXRPUyA9IGZ1bmN0aW9uKCkgew0KICAgIGlmIChleHBvcnRzLmlzTWFjKSB7DQogICAgICAgIHJldHVybiBleHBvcnRzLk9TLk1BQzsNCiAgICB9IGVsc2UgaWYgKGV4cG9ydHMuaXNMaW51eCkgew0KICAgICAgICByZXR1cm4gZXhwb3J0cy5PUy5MSU5VWDsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gZXhwb3J0cy5PUy5XSU5ET1dTOw0KICAgIH0NCn07DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgSXJha2xpIEdvemFsaXNodmlsaSA8cmZvYmljQGdtYWlsLmNvbT4gKGh0dHA6Ly9qZWRpdG9vbGtpdC5jb20pDQogKiAgICAgIEp1bGlhbiBWaWVyZWNrIDxqdWxpYW4udmllcmVja0BnbWFpbC5jb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvZWRpdG9yJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2ZpeG9sZGJyb3dzZXJzJywgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbGliL3VzZXJhZ2VudCcsICdhY2Uva2V5Ym9hcmQvdGV4dGlucHV0JywgJ2FjZS9tb3VzZS9tb3VzZV9oYW5kbGVyJywgJ2FjZS9tb3VzZS9mb2xkX2hhbmRsZXInLCAnYWNlL2tleWJvYXJkL2tleWJpbmRpbmcnLCAnYWNlL2VkaXRfc2Vzc2lvbicsICdhY2Uvc2VhcmNoJywgJ2FjZS9yYW5nZScsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInLCAnYWNlL2NvbW1hbmRzL2NvbW1hbmRfbWFuYWdlcicsICdhY2UvY29tbWFuZHMvZGVmYXVsdF9jb21tYW5kcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KcmVxdWlyZSgiLi9saWIvZml4b2xkYnJvd3NlcnMiKTsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuL2xpYi9sYW5nIik7DQp2YXIgdXNlcmFnZW50ID0gcmVxdWlyZSgiLi9saWIvdXNlcmFnZW50Iik7DQp2YXIgVGV4dElucHV0ID0gcmVxdWlyZSgiLi9rZXlib2FyZC90ZXh0aW5wdXQiKS5UZXh0SW5wdXQ7DQp2YXIgTW91c2VIYW5kbGVyID0gcmVxdWlyZSgiLi9tb3VzZS9tb3VzZV9oYW5kbGVyIikuTW91c2VIYW5kbGVyOw0KdmFyIEZvbGRIYW5kbGVyID0gcmVxdWlyZSgiLi9tb3VzZS9mb2xkX2hhbmRsZXIiKS5Gb2xkSGFuZGxlcjsNCi8vdmFyIFRvdWNoSGFuZGxlciA9IHJlcXVpcmUoIi4vdG91Y2hfaGFuZGxlciIpLlRvdWNoSGFuZGxlcjsNCnZhciBLZXlCaW5kaW5nID0gcmVxdWlyZSgiLi9rZXlib2FyZC9rZXliaW5kaW5nIikuS2V5QmluZGluZzsNCnZhciBFZGl0U2Vzc2lvbiA9IHJlcXVpcmUoIi4vZWRpdF9zZXNzaW9uIikuRWRpdFNlc3Npb247DQp2YXIgU2VhcmNoID0gcmVxdWlyZSgiLi9zZWFyY2giKS5TZWFyY2g7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuL3JhbmdlIikuUmFuZ2U7DQp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsNCnZhciBDb21tYW5kTWFuYWdlciA9IHJlcXVpcmUoIi4vY29tbWFuZHMvY29tbWFuZF9tYW5hZ2VyIikuQ29tbWFuZE1hbmFnZXI7DQp2YXIgZGVmYXVsdENvbW1hbmRzID0gcmVxdWlyZSgiLi9jb21tYW5kcy9kZWZhdWx0X2NvbW1hbmRzIikuY29tbWFuZHM7DQoNCnZhciBFZGl0b3IgPSBmdW5jdGlvbihyZW5kZXJlciwgc2Vzc2lvbikgew0KICAgIHZhciBjb250YWluZXIgPSByZW5kZXJlci5nZXRDb250YWluZXJFbGVtZW50KCk7DQogICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7DQogICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyOw0KICAgIA0KICAgIHRoaXMudGV4dElucHV0ICA9IG5ldyBUZXh0SW5wdXQocmVuZGVyZXIuZ2V0VGV4dEFyZWFDb250YWluZXIoKSwgdGhpcyk7DQogICAgdGhpcy5rZXlCaW5kaW5nID0gbmV3IEtleUJpbmRpbmcodGhpcyk7DQoNCiAgICAvLyBUT0RPIGRldGVjdCB0b3VjaCBldmVudCBzdXBwb3J0DQogICAgaWYgKHVzZXJhZ2VudC5pc0lQYWQpIHsNCiAgICAgICAgLy90aGlzLiRtb3VzZUhhbmRsZXIgPSBuZXcgVG91Y2hIYW5kbGVyKHRoaXMpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuJG1vdXNlSGFuZGxlciA9IG5ldyBNb3VzZUhhbmRsZXIodGhpcyk7DQogICAgICAgIG5ldyBGb2xkSGFuZGxlcih0aGlzKTsNCiAgICB9DQoNCiAgICB0aGlzLiRibG9ja1Njcm9sbGluZyA9IDA7DQogICAgdGhpcy4kc2VhcmNoID0gbmV3IFNlYXJjaCgpLnNldCh7DQogICAgICAgIHdyYXA6IHRydWUNCiAgICB9KTsNCg0KICAgIHRoaXMuY29tbWFuZHMgPSBuZXcgQ29tbWFuZE1hbmFnZXIodXNlcmFnZW50LmlzTWFjID8gIm1hYyIgOiAid2luIiwgZGVmYXVsdENvbW1hbmRzKTsNCiAgICB0aGlzLnNldFNlc3Npb24oc2Vzc2lvbiB8fCBuZXcgRWRpdFNlc3Npb24oIiIpKTsNCn07DQoNCihmdW5jdGlvbigpew0KDQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KDQogICAgdGhpcy5zZXRLZXlib2FyZEhhbmRsZXIgPSBmdW5jdGlvbihrZXlib2FyZEhhbmRsZXIpIHsNCiAgICAgICAgdGhpcy5rZXlCaW5kaW5nLnNldEtleWJvYXJkSGFuZGxlcihrZXlib2FyZEhhbmRsZXIpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldEtleWJvYXJkSGFuZGxlciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5rZXlCaW5kaW5nLmdldEtleWJvYXJkSGFuZGxlcigpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldFNlc3Npb24gPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIGlmICh0aGlzLnNlc3Npb24gPT0gc2Vzc2lvbikNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICBpZiAodGhpcy5zZXNzaW9uKSB7DQogICAgICAgICAgICB2YXIgb2xkU2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbjsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLiRvbkRvY3VtZW50Q2hhbmdlKTsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VNb2RlIiwgdGhpcy4kb25DaGFuZ2VNb2RlKTsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b2tlbml6ZXJVcGRhdGUiLCB0aGlzLiRvblRva2VuaXplclVwZGF0ZSk7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlVGFiU2l6ZSIsIHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZSk7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlV3JhcExpbWl0IiwgdGhpcy4kb25DaGFuZ2VXcmFwTGltaXQpOw0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZVdyYXBNb2RlIiwgdGhpcy4kb25DaGFuZ2VXcmFwTW9kZSk7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigib25DaGFuZ2VGb2xkIiwgdGhpcy4kb25DaGFuZ2VGb2xkKTsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VGcm9udE1hcmtlciIsIHRoaXMuJG9uQ2hhbmdlRnJvbnRNYXJrZXIpOw0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZUJhY2tNYXJrZXIiLCB0aGlzLiRvbkNoYW5nZUJhY2tNYXJrZXIpOw0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZUJyZWFrcG9pbnQiLCB0aGlzLiRvbkNoYW5nZUJyZWFrcG9pbnQpOw0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZUFubm90YXRpb24iLCB0aGlzLiRvbkNoYW5nZUFubm90YXRpb24pOw0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZU92ZXJ3cml0ZSIsIHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKTsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VTY3JvbGxUb3AiLCB0aGlzLiRvblNjcm9sbFRvcENoYW5nZSk7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlTGVmdFRvcCIsIHRoaXMuJG9uU2Nyb2xsTGVmdENoYW5nZSk7DQoNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLnNlc3Npb24uZ2V0U2VsZWN0aW9uKCk7DQogICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlQ3Vyc29yIiwgdGhpcy4kb25DdXJzb3JDaGFuZ2UpOw0KICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZVNlbGVjdGlvbiIsIHRoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247DQoNCiAgICAgICAgdGhpcy4kb25Eb2N1bWVudENoYW5nZSA9IHRoaXMub25Eb2N1bWVudENoYW5nZS5iaW5kKHRoaXMpOw0KICAgICAgICBzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIHRoaXMuJG9uRG9jdW1lbnRDaGFuZ2UpOw0KICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFNlc3Npb24oc2Vzc2lvbik7DQoNCiAgICAgICAgdGhpcy4kb25DaGFuZ2VNb2RlID0gdGhpcy5vbkNoYW5nZU1vZGUuYmluZCh0aGlzKTsNCiAgICAgICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VNb2RlIiwgdGhpcy4kb25DaGFuZ2VNb2RlKTsNCg0KICAgICAgICB0aGlzLiRvblRva2VuaXplclVwZGF0ZSA9IHRoaXMub25Ub2tlbml6ZXJVcGRhdGUuYmluZCh0aGlzKTsNCiAgICAgICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJ0b2tlbml6ZXJVcGRhdGUiLCB0aGlzLiRvblRva2VuaXplclVwZGF0ZSk7DQoNCiAgICAgICAgdGhpcy4kb25DaGFuZ2VUYWJTaXplID0gdGhpcy5yZW5kZXJlci51cGRhdGVUZXh0LmJpbmQodGhpcy5yZW5kZXJlcik7DQogICAgICAgIHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlVGFiU2l6ZSIsIHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZSk7DQoNCiAgICAgICAgdGhpcy4kb25DaGFuZ2VXcmFwTGltaXQgPSB0aGlzLm9uQ2hhbmdlV3JhcExpbWl0LmJpbmQodGhpcyk7DQogICAgICAgIHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlV3JhcExpbWl0IiwgdGhpcy4kb25DaGFuZ2VXcmFwTGltaXQpOw0KDQogICAgICAgIHRoaXMuJG9uQ2hhbmdlV3JhcE1vZGUgPSB0aGlzLm9uQ2hhbmdlV3JhcE1vZGUuYmluZCh0aGlzKTsNCiAgICAgICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VXcmFwTW9kZSIsIHRoaXMuJG9uQ2hhbmdlV3JhcE1vZGUpOw0KDQogICAgICAgIHRoaXMuJG9uQ2hhbmdlRm9sZCA9IHRoaXMub25DaGFuZ2VGb2xkLmJpbmQodGhpcyk7DQogICAgICAgIHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlRm9sZCIsIHRoaXMuJG9uQ2hhbmdlRm9sZCk7DQoNCiAgICAgICAgdGhpcy4kb25DaGFuZ2VGcm9udE1hcmtlciA9IHRoaXMub25DaGFuZ2VGcm9udE1hcmtlci5iaW5kKHRoaXMpOw0KICAgICAgICB0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlRnJvbnRNYXJrZXIiLCB0aGlzLiRvbkNoYW5nZUZyb250TWFya2VyKTsNCg0KICAgICAgICB0aGlzLiRvbkNoYW5nZUJhY2tNYXJrZXIgPSB0aGlzLm9uQ2hhbmdlQmFja01hcmtlci5iaW5kKHRoaXMpOw0KICAgICAgICB0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlQmFja01hcmtlciIsIHRoaXMuJG9uQ2hhbmdlQmFja01hcmtlcik7DQoNCiAgICAgICAgdGhpcy4kb25DaGFuZ2VCcmVha3BvaW50ID0gdGhpcy5vbkNoYW5nZUJyZWFrcG9pbnQuYmluZCh0aGlzKTsNCiAgICAgICAgdGhpcy5zZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZUJyZWFrcG9pbnQiLCB0aGlzLiRvbkNoYW5nZUJyZWFrcG9pbnQpOw0KDQogICAgICAgIHRoaXMuJG9uQ2hhbmdlQW5ub3RhdGlvbiA9IHRoaXMub25DaGFuZ2VBbm5vdGF0aW9uLmJpbmQodGhpcyk7DQogICAgICAgIHRoaXMuc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VBbm5vdGF0aW9uIiwgdGhpcy4kb25DaGFuZ2VBbm5vdGF0aW9uKTsNCg0KICAgICAgICB0aGlzLiRvbkN1cnNvckNoYW5nZSA9IHRoaXMub25DdXJzb3JDaGFuZ2UuYmluZCh0aGlzKTsNCiAgICAgICAgdGhpcy5zZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZU92ZXJ3cml0ZSIsIHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKTsNCg0KICAgICAgICB0aGlzLiRvblNjcm9sbFRvcENoYW5nZSA9IHRoaXMub25TY3JvbGxUb3BDaGFuZ2UuYmluZCh0aGlzKTsNCiAgICAgICAgdGhpcy5zZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZVNjcm9sbFRvcCIsIHRoaXMuJG9uU2Nyb2xsVG9wQ2hhbmdlKTsNCg0KICAgICAgICB0aGlzLiRvblNjcm9sbExlZnRDaGFuZ2UgPSB0aGlzLm9uU2Nyb2xsTGVmdENoYW5nZS5iaW5kKHRoaXMpOw0KICAgICAgICB0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlU2Nyb2xsTGVmdCIsIHRoaXMuJG9uU2Nyb2xsTGVmdENoYW5nZSk7DQoNCiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZXNzaW9uLmdldFNlbGVjdGlvbigpOw0KICAgICAgICB0aGlzLnNlbGVjdGlvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VDdXJzb3IiLCB0aGlzLiRvbkN1cnNvckNoYW5nZSk7DQoNCiAgICAgICAgdGhpcy4kb25TZWxlY3Rpb25DaGFuZ2UgPSB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcyk7DQogICAgICAgIHRoaXMuc2VsZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZVNlbGVjdGlvbiIsIHRoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlKTsNCg0KICAgICAgICB0aGlzLm9uQ2hhbmdlTW9kZSgpOw0KDQogICAgICAgIHRoaXMuJGJsb2NrU2Nyb2xsaW5nICs9IDE7DQogICAgICAgIHRoaXMub25DdXJzb3JDaGFuZ2UoKTsNCiAgICAgICAgdGhpcy4kYmxvY2tTY3JvbGxpbmcgLT0gMTsNCg0KICAgICAgICB0aGlzLm9uU2Nyb2xsVG9wQ2hhbmdlKCk7DQogICAgICAgIHRoaXMub25TY3JvbGxMZWZ0Q2hhbmdlKCk7DQogICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTsNCiAgICAgICAgdGhpcy5vbkNoYW5nZUZyb250TWFya2VyKCk7DQogICAgICAgIHRoaXMub25DaGFuZ2VCYWNrTWFya2VyKCk7DQogICAgICAgIHRoaXMub25DaGFuZ2VCcmVha3BvaW50KCk7DQogICAgICAgIHRoaXMub25DaGFuZ2VBbm5vdGF0aW9uKCk7DQogICAgICAgIHRoaXMuc2Vzc2lvbi5nZXRVc2VXcmFwTW9kZSgpICYmIHRoaXMucmVuZGVyZXIuYWRqdXN0V3JhcExpbWl0KCk7DQogICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlRnVsbCgpOw0KDQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZVNlc3Npb24iLCB7DQogICAgICAgICAgICBzZXNzaW9uOiBzZXNzaW9uLA0KICAgICAgICAgICAgb2xkU2Vzc2lvbjogb2xkU2Vzc2lvbg0KICAgICAgICB9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRTZXNzaW9uID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnNlc3Npb247DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbjsNCiAgICB9Ow0KDQogICAgdGhpcy5yZXNpemUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci5vblJlc2l6ZSgpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldFRoZW1lID0gZnVuY3Rpb24odGhlbWUpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRUaGVtZSh0aGVtZSk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0VGhlbWUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0VGhlbWUoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRTdHlsZSA9IGZ1bmN0aW9uKHN0eWxlKSB7DQogICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoc3R5bGUpOw0KICAgIH07DQoNCiAgICB0aGlzLnVuc2V0U3R5bGUgPSBmdW5jdGlvbihzdHlsZSkgew0KICAgICAgICB0aGlzLnJlbmRlcmVyLnVuc2V0U3R5bGUoc3R5bGUpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldEZvbnRTaXplID0gZnVuY3Rpb24oc2l6ZSkgew0KICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5mb250U2l6ZSA9IHNpemU7DQogICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlRm9udFNpemUoKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kaGlnaGxpZ2h0QnJhY2tldHMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbi4kYnJhY2tldEhpZ2hsaWdodCkgew0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZU1hcmtlcih0aGlzLnNlc3Npb24uJGJyYWNrZXRIaWdobGlnaHQpOw0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLiRicmFja2V0SGlnaGxpZ2h0ID0gbnVsbDsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0aGlzLiRoaWdobGlnaHRQZW5kaW5nKSB7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICAvLyBwZXJmb3JtIGhpZ2hsaWdodCBhc3luYyB0byBub3QgYmxvY2sgdGhlIGJyb3dzZXIgZHVyaW5nIG5hdmlnYXRpb24NCiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOw0KICAgICAgICB0aGlzLiRoaWdobGlnaHRQZW5kaW5nID0gdHJ1ZTsNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHNlbGYuJGhpZ2hsaWdodFBlbmRpbmcgPSBmYWxzZTsNCg0KICAgICAgICAgICAgdmFyIHBvcyA9IHNlbGYuc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHNlbGYuZ2V0Q3Vyc29yUG9zaXRpb24oKSk7DQogICAgICAgICAgICBpZiAocG9zKSB7DQogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKHBvcy5yb3csIHBvcy5jb2x1bW4sIHBvcy5yb3csIHBvcy5jb2x1bW4rMSk7DQogICAgICAgICAgICAgICAgc2VsZi5zZXNzaW9uLiRicmFja2V0SGlnaGxpZ2h0ID0gc2VsZi5zZXNzaW9uLmFkZE1hcmtlcihyYW5nZSwgImFjZV9icmFja2V0IiwgInRleHQiKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwgMTApOw0KICAgIH07DQoNCiAgICB0aGlzLmZvY3VzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIC8vIFNhZmFyaSBuZWVkcyB0aGUgdGltZW91dA0KICAgICAgICAvLyBpT1MgYW5kIEZpcmVmb3ggbmVlZCBpdCBjYWxsZWQgaW1tZWRpYXRlbHkNCiAgICAgICAgLy8gdG8gYmUgb24gdGhlIHNhdmUgc2lkZSB3ZSBkbyBib3RoDQogICAgICAgIHZhciBfc2VsZiA9IHRoaXM7DQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBfc2VsZi50ZXh0SW5wdXQuZm9jdXMoKTsNCiAgICAgICAgfSk7DQogICAgICAgIHRoaXMudGV4dElucHV0LmZvY3VzKCk7DQogICAgfTsNCg0KICAgIHRoaXMuaXNGb2N1c2VkID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnRleHRJbnB1dC5pc0ZvY3VzZWQoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5ibHVyID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMudGV4dElucHV0LmJsdXIoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5vbkZvY3VzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMucmVuZGVyZXIuc2hvd0N1cnNvcigpOw0KICAgICAgICB0aGlzLnJlbmRlcmVyLnZpc3VhbGl6ZUZvY3VzKCk7DQogICAgICAgIHRoaXMuX2VtaXQoImZvY3VzIik7DQogICAgfTsNCg0KICAgIHRoaXMub25CbHVyID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUN1cnNvcigpOw0KICAgICAgICB0aGlzLnJlbmRlcmVyLnZpc3VhbGl6ZUJsdXIoKTsNCiAgICAgICAgdGhpcy5fZW1pdCgiYmx1ciIpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uRG9jdW1lbnRDaGFuZ2UgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIHZhciBkZWx0YSA9IGUuZGF0YTsNCiAgICAgICAgdmFyIHJhbmdlID0gZGVsdGEucmFuZ2U7DQogICAgICAgIHZhciBsYXN0Um93Ow0KDQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcmFuZ2UuZW5kLnJvdyAmJiBkZWx0YS5hY3Rpb24gIT0gImluc2VydExpbmVzIiAmJiBkZWx0YS5hY3Rpb24gIT0gInJlbW92ZUxpbmVzIikNCiAgICAgICAgICAgIGxhc3RSb3cgPSByYW5nZS5lbmQucm93Ow0KICAgICAgICBlbHNlDQogICAgICAgICAgICBsYXN0Um93ID0gSW5maW5pdHk7DQogICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlTGluZXMocmFuZ2Uuc3RhcnQucm93LCBsYXN0Um93KTsNCg0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCBlKTsNCg0KICAgICAgICAvLyB1cGRhdGUgY3Vyc29yIGJlY2F1c2UgdGFiIGNoYXJhY3RlcnMgY2FuIGluZmx1ZW5jZSB0aGUgY3Vyc29yIHBvc2l0aW9uDQogICAgICAgIHRoaXMub25DdXJzb3JDaGFuZ2UoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5vblRva2VuaXplclVwZGF0ZSA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIHJvd3MgPSBlLmRhdGE7DQogICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlTGluZXMocm93cy5maXJzdCwgcm93cy5sYXN0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5vblNjcm9sbFRvcENoYW5nZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnJlbmRlcmVyLnNjcm9sbFRvWSh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uU2Nyb2xsTGVmdENoYW5nZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnJlbmRlcmVyLnNjcm9sbFRvWCh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsTGVmdCgpKTsNCiAgICB9Ow0KDQogICAgdGhpcy5vbkN1cnNvckNoYW5nZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpOw0KDQogICAgICAgIGlmICghdGhpcy4kYmxvY2tTY3JvbGxpbmcpIHsNCiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIG1vdmUgdGV4dCBpbnB1dCBvdmVyIHRoZSBjdXJzb3INCiAgICAgICAgLy8gdGhpcyBpcyByZXF1aXJlZCBmb3IgaU9TIGFuZCBJTUUNCiAgICAgICAgdGhpcy5yZW5kZXJlci5tb3ZlVGV4dEFyZWFUb0N1cnNvcih0aGlzLnRleHRJbnB1dC5nZXRFbGVtZW50KCkpOw0KDQogICAgICAgIHRoaXMuJGhpZ2hsaWdodEJyYWNrZXRzKCk7DQogICAgICAgIHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgc2Vzc2lvbiA9IHRoaXMuZ2V0U2Vzc2lvbigpOw0KDQogICAgICAgIGlmIChzZXNzaW9uLiRoaWdobGlnaHRMaW5lTWFya2VyKSB7DQogICAgICAgICAgICBzZXNzaW9uLnJlbW92ZU1hcmtlcihzZXNzaW9uLiRoaWdobGlnaHRMaW5lTWFya2VyKTsNCiAgICAgICAgfQ0KICAgICAgICBzZXNzaW9uLiRoaWdobGlnaHRMaW5lTWFya2VyID0gbnVsbDsNCg0KICAgICAgICBpZiAodGhpcy5nZXRIaWdobGlnaHRBY3RpdmVMaW5lKCkgJiYgKHRoaXMuZ2V0U2VsZWN0aW9uU3R5bGUoKSAhPSAibGluZSIgfHwgIXRoaXMuc2VsZWN0aW9uLmlzTXVsdGlMaW5lKCkpKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLA0KICAgICAgICAgICAgICAgIGZvbGRMaW5lID0gdGhpcy5zZXNzaW9uLmdldEZvbGRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJhbmdlOw0KICAgICAgICAgICAgaWYgKGZvbGRMaW5lKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UgPSBuZXcgUmFuZ2UoZm9sZExpbmUuc3RhcnQucm93LCAwLCBmb2xkTGluZS5lbmQucm93ICsgMSwgMCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJhbmdlID0gbmV3IFJhbmdlKGN1cnNvci5yb3csIDAsIGN1cnNvci5yb3crMSwgMCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzZXNzaW9uLiRoaWdobGlnaHRMaW5lTWFya2VyID0gc2Vzc2lvbi5hZGRNYXJrZXIocmFuZ2UsICJhY2VfYWN0aXZlX2xpbmUiLCAiYmFja2dyb3VuZCIpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIHZhciBzZXNzaW9uID0gdGhpcy5nZXRTZXNzaW9uKCk7DQoNCiAgICAgICAgaWYgKHNlc3Npb24uJHNlbGVjdGlvbk1hcmtlcikgew0KICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVNYXJrZXIoc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2VyKTsNCiAgICAgICAgfQ0KICAgICAgICBzZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXIgPSBudWxsOw0KDQogICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKSB7DQogICAgICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5nZXRTZWxlY3Rpb25TdHlsZSgpOw0KICAgICAgICAgICAgc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2VyID0gc2Vzc2lvbi5hZGRNYXJrZXIocmFuZ2UsICJhY2Vfc2VsZWN0aW9uIiwgc3R5bGUpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoaXMuJGhpZ2hsaWdodFNlbGVjdGVkV29yZCkNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5nZXRNb2RlKCkuaGlnaGxpZ2h0U2VsZWN0aW9uKHRoaXMpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uQ2hhbmdlRnJvbnRNYXJrZXIgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVGcm9udE1hcmtlcnMoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5vbkNoYW5nZUJhY2tNYXJrZXIgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uQ2hhbmdlQnJlYWtwb2ludCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEJyZWFrcG9pbnRzKHRoaXMuc2Vzc2lvbi5nZXRCcmVha3BvaW50cygpKTsNCiAgICB9Ow0KDQogICAgdGhpcy5vbkNoYW5nZUFubm90YXRpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBbm5vdGF0aW9ucyh0aGlzLnNlc3Npb24uZ2V0QW5ub3RhdGlvbnMoKSk7DQogICAgfTsNCg0KICAgIHRoaXMub25DaGFuZ2VNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlVGV4dCgpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uQ2hhbmdlV3JhcExpbWl0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlRnVsbCgpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uQ2hhbmdlV3JhcE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci5vblJlc2l6ZSh0cnVlKTsNCiAgICB9Ow0KDQogICAgdGhpcy5vbkNoYW5nZUZvbGQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgLy8gVXBkYXRlIHRoZSBhY3RpdmUgbGluZSBtYXJrZXIgYXMgZHVlIHRvIGZvbGRpbmcgY2hhbmdlcyB0aGUgY3VycmVudA0KICAgICAgICAvLyBsaW5lIHJhbmdlIG9uIHRoZSBzY3JlZW4gbWlnaHQgaGF2ZSBjaGFuZ2VkLg0KICAgICAgICB0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lKCk7DQogICAgICAgIC8vIFRPRE86IFRoaXMgbWlnaHQgYmUgdG9vIG11Y2ggdXBkYXRpbmcuIE9rYXkgZm9yIG5vdy4NCiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0Q29weVRleHQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHRleHQgPSAiIjsNCiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpDQogICAgICAgICAgICB0ZXh0ID0gdGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpOw0KDQogICAgICAgIHRoaXMuX2VtaXQoImNvcHkiLCB0ZXh0KTsNCiAgICAgICAgcmV0dXJuIHRleHQ7DQogICAgfTsNCg0KICAgIHRoaXMub25DdXQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuJHJlYWRPbmx5KQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciByYW5nZSA9IHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY3V0IiwgcmFuZ2UpOw0KDQogICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKSB7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlKHJhbmdlKTsNCiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmluc2VydCA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICAgICAgdmFyIHNlc3Npb24gPSB0aGlzLnNlc3Npb247DQogICAgICAgIHZhciBtb2RlID0gc2Vzc2lvbi5nZXRNb2RlKCk7DQoNCiAgICAgICAgdmFyIGN1cnNvciA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCg0KICAgICAgICBpZiAodGhpcy5nZXRCZWhhdmlvdXJzRW5hYmxlZCgpKSB7DQogICAgICAgICAgICAvLyBHZXQgYSB0cmFuc2Zvcm0gaWYgdGhlIGN1cnJlbnQgbW9kZSB3YW50cyBvbmUuDQogICAgICAgICAgICB2YXIgdHJhbnNmb3JtID0gbW9kZS50cmFuc2Zvcm1BY3Rpb24oc2Vzc2lvbi5nZXRTdGF0ZShjdXJzb3Iucm93KSwgJ2luc2VydGlvbicsIHRoaXMsIHNlc3Npb24sIHRleHQpOw0KICAgICAgICAgICAgaWYgKHRyYW5zZm9ybSkNCiAgICAgICAgICAgICAgICB0ZXh0ID0gdHJhbnNmb3JtLnRleHQ7DQogICAgICAgIH0NCg0KICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCJcdCIsIHRoaXMuc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7DQoNCiAgICAgICAgLy8gcmVtb3ZlIHNlbGVjdGVkIHRleHQNCiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCiAgICAgICAgICAgIGN1cnNvciA9IHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKTsNCiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmICh0aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCkpIHsNCiAgICAgICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZS5mcm9tUG9pbnRzKGN1cnNvciwgY3Vyc29yKTsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gKz0gdGV4dC5sZW5ndGg7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlKHJhbmdlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsNCg0KICAgICAgICB2YXIgc3RhcnQgPSBjdXJzb3IuY29sdW1uOw0KICAgICAgICB2YXIgbGluZVN0YXRlID0gc2Vzc2lvbi5nZXRTdGF0ZShjdXJzb3Iucm93KTsNCiAgICAgICAgdmFyIHNob3VsZE91dGRlbnQgPSBtb2RlLmNoZWNrT3V0ZGVudChsaW5lU3RhdGUsIHNlc3Npb24uZ2V0TGluZShjdXJzb3Iucm93KSwgdGV4dCk7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICB2YXIgbGluZUluZGVudCA9IG1vZGUuZ2V0TmV4dExpbmVJbmRlbnQobGluZVN0YXRlLCBsaW5lLnNsaWNlKDAsIGN1cnNvci5jb2x1bW4pLCBzZXNzaW9uLmdldFRhYlN0cmluZygpKTsNCiAgICAgICAgdmFyIGVuZCA9IHNlc3Npb24uaW5zZXJ0KGN1cnNvciwgdGV4dCk7DQoNCiAgICAgICAgaWYgKHRyYW5zZm9ybSAmJiB0cmFuc2Zvcm0uc2VsZWN0aW9uKSB7DQogICAgICAgICAgICBpZiAodHJhbnNmb3JtLnNlbGVjdGlvbi5sZW5ndGggPT0gMikgeyAvLyBUcmFuc2Zvcm0gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgY29sdW1uDQogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoDQogICAgICAgICAgICAgICAgICAgIG5ldyBSYW5nZShjdXJzb3Iucm93LCBzdGFydCArIHRyYW5zZm9ybS5zZWxlY3Rpb25bMF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3Iucm93LCBzdGFydCArIHRyYW5zZm9ybS5zZWxlY3Rpb25bMV0pKTsNCiAgICAgICAgICAgIH0gZWxzZSB7IC8vIFRyYW5zZm9ybSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCByb3cuDQogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoDQogICAgICAgICAgICAgICAgICAgIG5ldyBSYW5nZShjdXJzb3Iucm93ICsgdHJhbnNmb3JtLnNlbGVjdGlvblswXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybS5zZWxlY3Rpb25bMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3Iucm93ICsgdHJhbnNmb3JtLnNlbGVjdGlvblsyXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybS5zZWxlY3Rpb25bM10pKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBsaW5lU3RhdGUgPSBzZXNzaW9uLmdldFN0YXRlKGN1cnNvci5yb3cpOw0KDQogICAgICAgIC8vIFRPRE8gZGlzYWJsZWQgbXVsdGlsaW5lIGF1dG8gaW5kZW50DQogICAgICAgIC8vIHBvc3NpYmx5IGRvaW5nIHRoZSBpbmRlbnQgYmVmb3JlIGluc2VydGluZyB0aGUgdGV4dA0KICAgICAgICAvLyBpZiAoY3Vyc29yLnJvdyAhPT0gZW5kLnJvdykgew0KICAgICAgICBpZiAoc2Vzc2lvbi5nZXREb2N1bWVudCgpLmlzTmV3TGluZSh0ZXh0KSkgew0KICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8oY3Vyc29yLnJvdysxLCAwKTsNCg0KICAgICAgICAgICAgdmFyIHNpemUgPSBzZXNzaW9uLmdldFRhYlNpemUoKTsNCiAgICAgICAgICAgIHZhciBtaW5JbmRlbnQgPSBOdW1iZXIuTUFYX1ZBTFVFOw0KDQogICAgICAgICAgICBmb3IgKHZhciByb3cgPSBjdXJzb3Iucm93ICsgMTsgcm93IDw9IGVuZC5yb3c7ICsrcm93KSB7DQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IDA7DQoNCiAgICAgICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgKytpKQ0KICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5jaGFyQXQoaSkgPT0gJ1x0JykNCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCArPSBzaXplOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsaW5lLmNoYXJBdChpKSA9PSAnICcpDQogICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgaWYgKC9bXlxzXS8udGVzdChsaW5lKSkNCiAgICAgICAgICAgICAgICAgICAgbWluSW5kZW50ID0gTWF0aC5taW4oaW5kZW50LCBtaW5JbmRlbnQpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmb3IgKHZhciByb3cgPSBjdXJzb3Iucm93ICsgMTsgcm93IDw9IGVuZC5yb3c7ICsrcm93KSB7DQogICAgICAgICAgICAgICAgdmFyIG91dGRlbnQgPSBtaW5JbmRlbnQ7DQoNCiAgICAgICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAmJiBvdXRkZW50ID4gMDsgKytpKQ0KICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5jaGFyQXQoaSkgPT0gJ1x0JykNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dGRlbnQgLT0gc2l6ZTsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGluZS5jaGFyQXQoaSkgPT0gJyAnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGVudCAtPSAxOw0KICAgICAgICAgICAgICAgIHNlc3Npb24ucmVtb3ZlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgaSkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2Vzc2lvbi5pbmRlbnRSb3dzKGN1cnNvci5yb3cgKyAxLCBlbmQucm93LCBsaW5lSW5kZW50KTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoc2hvdWxkT3V0ZGVudCkNCiAgICAgICAgICAgIG1vZGUuYXV0b091dGRlbnQobGluZVN0YXRlLCBzZXNzaW9uLCBjdXJzb3Iucm93KTsNCiAgICB9Ow0KDQogICAgdGhpcy5vblRleHRJbnB1dCA9IGZ1bmN0aW9uKHRleHQsIHBhc3RlZCkgew0KICAgICAgICBpZiAocGFzdGVkKQ0KICAgICAgICAgICAgdGhpcy5fZW1pdCgicGFzdGUiLCB0ZXh0KTsNCg0KICAgICAgICB0aGlzLmtleUJpbmRpbmcub25UZXh0SW5wdXQodGV4dCwgcGFzdGVkKTsNCiAgICB9Ow0KDQogICAgdGhpcy5vbkNvbW1hbmRLZXkgPSBmdW5jdGlvbihlLCBoYXNoSWQsIGtleUNvZGUpIHsNCiAgICAgICAgdGhpcy5rZXlCaW5kaW5nLm9uQ29tbWFuZEtleShlLCBoYXNoSWQsIGtleUNvZGUpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldE92ZXJ3cml0ZSA9IGZ1bmN0aW9uKG92ZXJ3cml0ZSkgew0KICAgICAgICB0aGlzLnNlc3Npb24uc2V0T3ZlcndyaXRlKG92ZXJ3cml0ZSk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0T3ZlcndyaXRlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCk7DQogICAgfTsNCg0KICAgIHRoaXMudG9nZ2xlT3ZlcndyaXRlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuc2Vzc2lvbi50b2dnbGVPdmVyd3JpdGUoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRTY3JvbGxTcGVlZCA9IGZ1bmN0aW9uKHNwZWVkKSB7DQogICAgICAgIHRoaXMuJG1vdXNlSGFuZGxlci5zZXRTY3JvbGxTcGVlZChzcGVlZCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2Nyb2xsU3BlZWQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG1vdXNlSGFuZGxlci5nZXRTY3JvbGxTcGVlZCgpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldERyYWdEZWxheSA9IGZ1bmN0aW9uKGRyYWdEZWxheSkgew0KICAgICAgICB0aGlzLiRtb3VzZUhhbmRsZXIuc2V0RHJhZ0RlbGF5KGRyYWdEZWxheSk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0RHJhZ0RlbGF5ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRtb3VzZUhhbmRsZXIuZ2V0RHJhZ0RlbGF5KCk7DQogICAgfTsNCg0KICAgIHRoaXMuJHNlbGVjdGlvblN0eWxlID0gImxpbmUiOw0KICAgIHRoaXMuc2V0U2VsZWN0aW9uU3R5bGUgPSBmdW5jdGlvbihzdHlsZSkgew0KICAgICAgICBpZiAodGhpcy4kc2VsZWN0aW9uU3R5bGUgPT0gc3R5bGUpIHJldHVybjsNCg0KICAgICAgICB0aGlzLiRzZWxlY3Rpb25TdHlsZSA9IHN0eWxlOw0KICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZVNlbGVjdGlvblN0eWxlIiwge2RhdGE6IHN0eWxlfSk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2VsZWN0aW9uU3R5bGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHNlbGVjdGlvblN0eWxlOw0KICAgIH07DQoNCiAgICB0aGlzLiRoaWdobGlnaHRBY3RpdmVMaW5lID0gdHJ1ZTsNCiAgICB0aGlzLnNldEhpZ2hsaWdodEFjdGl2ZUxpbmUgPSBmdW5jdGlvbihzaG91bGRIaWdobGlnaHQpIHsNCiAgICAgICAgaWYgKHRoaXMuJGhpZ2hsaWdodEFjdGl2ZUxpbmUgPT0gc2hvdWxkSGlnaGxpZ2h0KSByZXR1cm47DQoNCiAgICAgICAgdGhpcy4kaGlnaGxpZ2h0QWN0aXZlTGluZSA9IHNob3VsZEhpZ2hsaWdodDsNCiAgICAgICAgdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldEhpZ2hsaWdodEFjdGl2ZUxpbmUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGhpZ2hsaWdodEFjdGl2ZUxpbmU7DQogICAgfTsNCg0KICAgIHRoaXMuJGhpZ2hsaWdodFNlbGVjdGVkV29yZCA9IHRydWU7DQogICAgdGhpcy5zZXRIaWdobGlnaHRTZWxlY3RlZFdvcmQgPSBmdW5jdGlvbihzaG91bGRIaWdobGlnaHQpIHsNCiAgICAgICAgaWYgKHRoaXMuJGhpZ2hsaWdodFNlbGVjdGVkV29yZCA9PSBzaG91bGRIaWdobGlnaHQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdGhpcy4kaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkID0gc2hvdWxkSGlnaGxpZ2h0Ow0KICAgICAgICBpZiAoc2hvdWxkSGlnaGxpZ2h0KQ0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmdldE1vZGUoKS5oaWdobGlnaHRTZWxlY3Rpb24odGhpcyk7DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5nZXRNb2RlKCkuY2xlYXJTZWxlY3Rpb25IaWdobGlnaHQodGhpcyk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0SGlnaGxpZ2h0U2VsZWN0ZWRXb3JkID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRoaWdobGlnaHRTZWxlY3RlZFdvcmQ7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0U2hvd0ludmlzaWJsZXMgPSBmdW5jdGlvbihzaG93SW52aXNpYmxlcykgew0KICAgICAgICBpZiAodGhpcy5nZXRTaG93SW52aXNpYmxlcygpID09IHNob3dJbnZpc2libGVzKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U2hvd0ludmlzaWJsZXMoc2hvd0ludmlzaWJsZXMpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFNob3dJbnZpc2libGVzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmdldFNob3dJbnZpc2libGVzKCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0U2hvd1ByaW50TWFyZ2luID0gZnVuY3Rpb24oc2hvd1ByaW50TWFyZ2luKSB7DQogICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U2hvd1ByaW50TWFyZ2luKHNob3dQcmludE1hcmdpbik7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2hvd1ByaW50TWFyZ2luID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmdldFNob3dQcmludE1hcmdpbigpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldFByaW50TWFyZ2luQ29sdW1uID0gZnVuY3Rpb24oc2hvd1ByaW50TWFyZ2luKSB7DQogICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJpbnRNYXJnaW5Db2x1bW4oc2hvd1ByaW50TWFyZ2luKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRQcmludE1hcmdpbkNvbHVtbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRQcmludE1hcmdpbkNvbHVtbigpOw0KICAgIH07DQoNCiAgICB0aGlzLiRyZWFkT25seSA9IGZhbHNlOw0KICAgIHRoaXMuc2V0UmVhZE9ubHkgPSBmdW5jdGlvbihyZWFkT25seSkgew0KICAgICAgICB0aGlzLiRyZWFkT25seSA9IHJlYWRPbmx5Ow0KICAgIH07DQoNCiAgICB0aGlzLmdldFJlYWRPbmx5ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRyZWFkT25seTsNCiAgICB9Ow0KDQogICAgdGhpcy4kbW9kZUJlaGF2aW91cnMgPSB0cnVlOw0KICAgIHRoaXMuc2V0QmVoYXZpb3Vyc0VuYWJsZWQgPSBmdW5jdGlvbiAoZW5hYmxlZCkgew0KICAgICAgICB0aGlzLiRtb2RlQmVoYXZpb3VycyA9IGVuYWJsZWQ7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0QmVoYXZpb3Vyc0VuYWJsZWQgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRtb2RlQmVoYXZpb3VyczsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRTaG93Rm9sZFdpZGdldHMgPSBmdW5jdGlvbihzaG93KSB7DQogICAgICAgIHZhciBndXR0ZXIgPSB0aGlzLnJlbmRlcmVyLiRndXR0ZXJMYXllcjsNCiAgICAgICAgaWYgKGd1dHRlci5nZXRTaG93Rm9sZFdpZGdldHMoKSA9PSBzaG93KQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHRoaXMucmVuZGVyZXIuJGd1dHRlckxheWVyLnNldFNob3dGb2xkV2lkZ2V0cyhzaG93KTsNCiAgICAgICAgdGhpcy4kc2hvd0ZvbGRXaWRnZXRzID0gc2hvdzsNCiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldFNob3dGb2xkV2lkZ2V0cyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuZ2V0U2hvd0ZvbGRXaWRnZXRzKCk7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlID0gZnVuY3Rpb24oZGlyKSB7DQogICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpew0KICAgICAgICAgICAgaWYoZGlyID09ICJsZWZ0IikNCiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RMZWZ0KCk7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0UmlnaHQoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciByYW5nZSA9IHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgaWYgKHRoaXMuZ2V0QmVoYXZpb3Vyc0VuYWJsZWQoKSkgew0KICAgICAgICAgICAgdmFyIHNlc3Npb24gPSB0aGlzLnNlc3Npb247DQogICAgICAgICAgICB2YXIgc3RhdGUgPSBzZXNzaW9uLmdldFN0YXRlKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgbmV3X3JhbmdlID0gc2Vzc2lvbi5nZXRNb2RlKCkudHJhbnNmb3JtQWN0aW9uKHN0YXRlLCAnZGVsZXRpb24nLCB0aGlzLCBzZXNzaW9uLCByYW5nZSk7DQogICAgICAgICAgICBpZiAobmV3X3JhbmdlKQ0KICAgICAgICAgICAgICAgIHJhbmdlID0gbmV3X3JhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZShyYW5nZSk7DQogICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmVXb3JkUmlnaHQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSkNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmRSaWdodCgpOw0KDQogICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKTsNCiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgIH07DQoNCiAgICB0aGlzLnJlbW92ZVdvcmRMZWZ0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpDQogICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkTGVmdCgpOw0KDQogICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKTsNCiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgIH07DQoNCiAgICB0aGlzLnJlbW92ZVRvTGluZVN0YXJ0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpDQogICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RMaW5lU3RhcnQoKTsNCg0KICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSk7DQogICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmVUb0xpbmVFbmQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSkNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdExpbmVFbmQoKTsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgIGlmIChyYW5nZS5zdGFydC5jb2x1bW4gPT0gcmFuZ2UuZW5kLmNvbHVtbiAmJiByYW5nZS5zdGFydC5yb3cgPT0gcmFuZ2UuZW5kLnJvdykgew0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiA9IDA7DQogICAgICAgICAgICByYW5nZS5lbmQucm93Kys7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlKHJhbmdlKTsNCiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgIH07DQoNCiAgICB0aGlzLnNwbGl0TGluZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSkgew0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpOw0KICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGN1cnNvciA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgdGhpcy5pbnNlcnQoIlxuIik7DQogICAgICAgIHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24oY3Vyc29yKTsNCiAgICB9Ow0KDQogICAgdGhpcy50cmFuc3Bvc2VMZXR0ZXJzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKSB7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgY3Vyc29yID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICB2YXIgY29sdW1uID0gY3Vyc29yLmNvbHVtbjsNCiAgICAgICAgaWYgKGNvbHVtbiA9PT0gMCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuc2Vzc2lvbi5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICB2YXIgc3dhcCwgcmFuZ2U7DQogICAgICAgIGlmIChjb2x1bW4gPCBsaW5lLmxlbmd0aCkgew0KICAgICAgICAgICAgc3dhcCA9IGxpbmUuY2hhckF0KGNvbHVtbikgKyBsaW5lLmNoYXJBdChjb2x1bW4tMSk7DQogICAgICAgICAgICByYW5nZSA9IG5ldyBSYW5nZShjdXJzb3Iucm93LCBjb2x1bW4tMSwgY3Vyc29yLnJvdywgY29sdW1uKzEpOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgc3dhcCA9IGxpbmUuY2hhckF0KGNvbHVtbi0xKSArIGxpbmUuY2hhckF0KGNvbHVtbi0yKTsNCiAgICAgICAgICAgIHJhbmdlID0gbmV3IFJhbmdlKGN1cnNvci5yb3csIGNvbHVtbi0yLCBjdXJzb3Iucm93LCBjb2x1bW4pOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuc2Vzc2lvbi5yZXBsYWNlKHJhbmdlLCBzd2FwKTsNCiAgICB9Ow0KDQogICAgdGhpcy50b0xvd2VyQ2FzZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgb3JpZ2luYWxSYW5nZSA9IHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSkgew0KICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICB2YXIgdGV4dCA9IHRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICB0aGlzLnNlc3Npb24ucmVwbGFjZShyYW5nZSwgdGV4dC50b0xvd2VyQ2FzZSgpKTsNCiAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2Uob3JpZ2luYWxSYW5nZSk7DQogICAgfTsNCg0KICAgIHRoaXMudG9VcHBlckNhc2UgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIG9yaWdpbmFsUmFuZ2UgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciByYW5nZSA9IHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgdmFyIHRleHQgPSB0aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgdGhpcy5zZXNzaW9uLnJlcGxhY2UocmFuZ2UsIHRleHQudG9VcHBlckNhc2UoKSk7DQogICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKG9yaWdpbmFsUmFuZ2UpOw0KICAgIH07DQoNCiAgICB0aGlzLmluZGVudCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgc2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbjsNCiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KDQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPCByYW5nZS5lbmQucm93IHx8IHJhbmdlLnN0YXJ0LmNvbHVtbiA8IHJhbmdlLmVuZC5jb2x1bW4pIHsNCiAgICAgICAgICAgIHZhciByb3dzID0gdGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCk7DQogICAgICAgICAgICBzZXNzaW9uLmluZGVudFJvd3Mocm93cy5maXJzdCwgcm93cy5sYXN0LCAiXHQiKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHZhciBpbmRlbnRTdHJpbmc7DQoNCiAgICAgICAgICAgIGlmICh0aGlzLnNlc3Npb24uZ2V0VXNlU29mdFRhYnMoKSkgew0KICAgICAgICAgICAgICAgIHZhciBzaXplICAgICAgICA9IHNlc3Npb24uZ2V0VGFiU2l6ZSgpLA0KICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiAgICA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSwNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uICAgICAgPSBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Db2x1bW4ocG9zaXRpb24ucm93LCBwb3NpdGlvbi5jb2x1bW4pLA0KICAgICAgICAgICAgICAgICAgICBjb3VudCAgICAgICA9IChzaXplIC0gY29sdW1uICUgc2l6ZSk7DQoNCiAgICAgICAgICAgICAgICBpbmRlbnRTdHJpbmcgPSBsYW5nLnN0cmluZ1JlcGVhdCgiICIsIGNvdW50KTsNCiAgICAgICAgICAgIH0gZWxzZQ0KICAgICAgICAgICAgICAgIGluZGVudFN0cmluZyA9ICJcdCI7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnQoaW5kZW50U3RyaW5nKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmJsb2NrT3V0ZGVudCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgc2VsZWN0aW9uID0gdGhpcy5zZXNzaW9uLmdldFNlbGVjdGlvbigpOw0KICAgICAgICB0aGlzLnNlc3Npb24ub3V0ZGVudFJvd3Moc2VsZWN0aW9uLmdldFJhbmdlKCkpOw0KICAgIH07DQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnNlc3Npb24uZ2V0U3RhdGUodGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLnJvdyk7DQogICAgICAgIHZhciByb3dzID0gdGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCk7DQogICAgICAgIHRoaXMuc2Vzc2lvbi5nZXRNb2RlKCkudG9nZ2xlQ29tbWVudExpbmVzKHN0YXRlLCB0aGlzLnNlc3Npb24sIHJvd3MuZmlyc3QsIHJvd3MubGFzdCk7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlTGluZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHJvd3MgPSB0aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTsNCiAgICAgICAgdmFyIHJhbmdlOw0KICAgICAgICBpZiAocm93cy5maXJzdCA9PT0gMCB8fCByb3dzLmxhc3QrMSA8IHRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKSkNCiAgICAgICAgICAgIHJhbmdlID0gbmV3IFJhbmdlKHJvd3MuZmlyc3QsIDAsIHJvd3MubGFzdCsxLCAwKTsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgcmFuZ2UgPSBuZXcgUmFuZ2UoDQogICAgICAgICAgICAgICAgcm93cy5maXJzdC0xLCB0aGlzLnNlc3Npb24uZ2V0TGluZShyb3dzLmZpcnN0LTEpLmxlbmd0aCwNCiAgICAgICAgICAgICAgICByb3dzLmxhc3QsIHRoaXMuc2Vzc2lvbi5nZXRMaW5lKHJvd3MubGFzdCkubGVuZ3RoDQogICAgICAgICAgICApOw0KICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlKHJhbmdlKTsNCiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgIH07DQoNCiAgICB0aGlzLm1vdmVMaW5lc0Rvd24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kbW92ZUxpbmVzKGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLm1vdmVMaW5lc0Rvd24oZmlyc3RSb3csIGxhc3RSb3cpOw0KICAgICAgICB9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5tb3ZlTGluZXNVcCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRtb3ZlTGluZXMoZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24ubW92ZUxpbmVzVXAoZmlyc3RSb3csIGxhc3RSb3cpOw0KICAgICAgICB9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5tb3ZlVGV4dCA9IGZ1bmN0aW9uKHJhbmdlLCB0b1Bvc2l0aW9uKSB7DQogICAgICAgIGlmICh0aGlzLiRyZWFkT25seSkNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KDQogICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24ubW92ZVRleHQocmFuZ2UsIHRvUG9zaXRpb24pOw0KICAgIH07DQoNCiAgICB0aGlzLmNvcHlMaW5lc1VwID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJG1vdmVMaW5lcyhmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgew0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmR1cGxpY2F0ZUxpbmVzKGZpcnN0Um93LCBsYXN0Um93KTsNCiAgICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5jb3B5TGluZXNEb3duID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJG1vdmVMaW5lcyhmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5kdXBsaWNhdGVMaW5lcyhmaXJzdFJvdywgbGFzdFJvdyk7DQogICAgICAgIH0pOw0KICAgIH07DQoNCg0KICAgIHRoaXMuJG1vdmVMaW5lcyA9IGZ1bmN0aW9uKG1vdmVyKSB7DQogICAgICAgIHZhciByb3dzID0gdGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCk7DQogICAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbjsNCiAgICAgICAgaWYgKCFzZWxlY3Rpb24uaXNNdWx0aUxpbmUoKSkgew0KICAgICAgICAgICAgdmFyIHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlKCk7DQogICAgICAgICAgICB2YXIgcmV2ZXJzZSA9IHNlbGVjdGlvbi5pc0JhY2t3YXJkcygpOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGxpbmVzTW92ZWQgPSBtb3Zlci5jYWxsKHRoaXMsIHJvd3MuZmlyc3QsIHJvd3MubGFzdCk7DQoNCiAgICAgICAgaWYgKHJhbmdlKSB7DQogICAgICAgICAgICByYW5nZS5zdGFydC5yb3cgKz0gbGluZXNNb3ZlZDsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5yb3cgKz0gbGluZXNNb3ZlZDsNCiAgICAgICAgICAgIHNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShyYW5nZSwgcmV2ZXJzZSk7DQogICAgICAgIH0gDQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgc2VsZWN0aW9uLnNldFNlbGVjdGlvbkFuY2hvcihyb3dzLmxhc3QrbGluZXNNb3ZlZCsxLCAwKTsNCiAgICAgICAgICAgIHNlbGVjdGlvbi4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICBzZWxlY3Rpb24ubW92ZUN1cnNvclRvKHJvd3MuZmlyc3QrbGluZXNNb3ZlZCwgMCk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRTZWxlY3RlZFJvd3MgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLmNvbGxhcHNlUm93cygpOw0KDQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBmaXJzdDogcmFuZ2Uuc3RhcnQucm93LA0KICAgICAgICAgICAgbGFzdDogcmFuZ2UuZW5kLnJvdw0KICAgICAgICB9Ow0KICAgIH07DQoNCiAgICB0aGlzLm9uQ29tcG9zaXRpb25TdGFydCA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci5zaG93Q29tcG9zaXRpb24odGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpKTsNCiAgICB9Ow0KDQogICAgdGhpcy5vbkNvbXBvc2l0aW9uVXBkYXRlID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICB0aGlzLnJlbmRlcmVyLnNldENvbXBvc2l0aW9uVGV4dCh0ZXh0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5vbkNvbXBvc2l0aW9uRW5kID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUNvbXBvc2l0aW9uKCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0Rmlyc3RWaXNpYmxlUm93ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmdldEZpcnN0VmlzaWJsZVJvdygpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldExhc3RWaXNpYmxlUm93ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmdldExhc3RWaXNpYmxlUm93KCk7DQogICAgfTsNCg0KICAgIHRoaXMuaXNSb3dWaXNpYmxlID0gZnVuY3Rpb24ocm93KSB7DQogICAgICAgIHJldHVybiAocm93ID49IHRoaXMuZ2V0Rmlyc3RWaXNpYmxlUm93KCkgJiYgcm93IDw9IHRoaXMuZ2V0TGFzdFZpc2libGVSb3coKSk7DQogICAgfTsNCg0KICAgIHRoaXMuaXNSb3dGdWxseVZpc2libGUgPSBmdW5jdGlvbihyb3cpIHsNCiAgICAgICAgcmV0dXJuIChyb3cgPj0gdGhpcy5yZW5kZXJlci5nZXRGaXJzdEZ1bGx5VmlzaWJsZVJvdygpICYmIHJvdyA8PSB0aGlzLnJlbmRlcmVyLmdldExhc3RGdWxseVZpc2libGVSb3coKSk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldFZpc2libGVSb3dDb3VudCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxCb3R0b21Sb3coKSAtIHRoaXMucmVuZGVyZXIuZ2V0U2Nyb2xsVG9wUm93KCkgKyAxOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRQYWdlRG93blJvdyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxCb3R0b21Sb3coKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0UGFnZVVwUm93ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBmaXJzdFJvdyA9IHRoaXMucmVuZGVyZXIuZ2V0U2Nyb2xsVG9wUm93KCk7DQogICAgICAgIHZhciBsYXN0Um93ID0gdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxCb3R0b21Sb3coKTsNCg0KICAgICAgICByZXR1cm4gZmlyc3RSb3cgLSAobGFzdFJvdyAtIGZpcnN0Um93KTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZWxlY3RQYWdlRG93biA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgcm93ID0gdGhpcy4kZ2V0UGFnZURvd25Sb3coKSArIE1hdGguZmxvb3IodGhpcy4kZ2V0VmlzaWJsZVJvd0NvdW50KCkgLyAyKTsNCg0KICAgICAgICB0aGlzLnNjcm9sbFBhZ2VEb3duKCk7DQoNCiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0aW9uKCk7DQogICAgICAgIHZhciBsZWFkU2NyZWVuUG9zID0gdGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihzZWxlY3Rpb24uZ2V0U2VsZWN0aW9uTGVhZCgpKTsNCiAgICAgICAgdmFyIGRlc3QgPSB0aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKHJvdywgbGVhZFNjcmVlblBvcy5jb2x1bW4pOw0KICAgICAgICBzZWxlY3Rpb24uc2VsZWN0VG8oZGVzdC5yb3csIGRlc3QuY29sdW1uKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZWxlY3RQYWdlVXAgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHZpc2libGVSb3dzID0gdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxUb3BSb3coKSAtIHRoaXMucmVuZGVyZXIuZ2V0U2Nyb2xsQm90dG9tUm93KCk7DQogICAgICAgIHZhciByb3cgPSB0aGlzLiRnZXRQYWdlVXBSb3coKSArIE1hdGgucm91bmQodmlzaWJsZVJvd3MgLyAyKTsNCg0KICAgICAgICB0aGlzLnNjcm9sbFBhZ2VVcCgpOw0KDQogICAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGlvbigpOw0KICAgICAgICB2YXIgbGVhZFNjcmVlblBvcyA9IHRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oc2VsZWN0aW9uLmdldFNlbGVjdGlvbkxlYWQoKSk7DQogICAgICAgIHZhciBkZXN0ID0gdGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihyb3csIGxlYWRTY3JlZW5Qb3MuY29sdW1uKTsNCiAgICAgICAgc2VsZWN0aW9uLnNlbGVjdFRvKGRlc3Qucm93LCBkZXN0LmNvbHVtbik7DQogICAgfTsNCg0KICAgIHRoaXMuZ290b1BhZ2VEb3duID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciByb3cgPSB0aGlzLiRnZXRQYWdlRG93blJvdygpOw0KICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvblNjcmVlbigpLmNvbHVtbjsNCg0KICAgICAgICB0aGlzLnNjcm9sbFRvUm93KHJvdyk7DQogICAgICAgIHRoaXMuZ2V0U2VsZWN0aW9uKCkubW92ZUN1cnNvclRvU2NyZWVuKHJvdywgY29sdW1uKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nb3RvUGFnZVVwID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciByb3cgPSB0aGlzLiRnZXRQYWdlVXBSb3coKTsNCiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb25TY3JlZW4oKS5jb2x1bW47DQoNCiAgICAgICB0aGlzLnNjcm9sbFRvUm93KHJvdyk7DQogICAgICAgdGhpcy5nZXRTZWxlY3Rpb24oKS5tb3ZlQ3Vyc29yVG9TY3JlZW4ocm93LCBjb2x1bW4pOw0KICAgIH07DQoNCiAgICB0aGlzLnNjcm9sbFBhZ2VEb3duID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuc2Nyb2xsVG9Sb3codGhpcy4kZ2V0UGFnZURvd25Sb3coKSk7DQogICAgfTsNCg0KICAgIHRoaXMuc2Nyb2xsUGFnZVVwID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMucmVuZGVyZXIuc2Nyb2xsVG9Sb3codGhpcy4kZ2V0UGFnZVVwUm93KCkpOw0KICAgIH07DQoNCiAgICB0aGlzLnNjcm9sbFRvUm93ID0gZnVuY3Rpb24ocm93KSB7DQogICAgICAgIHRoaXMucmVuZGVyZXIuc2Nyb2xsVG9Sb3cocm93KTsNCiAgICB9Ow0KDQogICAgdGhpcy5zY3JvbGxUb0xpbmUgPSBmdW5jdGlvbihsaW5lLCBjZW50ZXIpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci5zY3JvbGxUb0xpbmUobGluZSwgY2VudGVyKTsNCiAgICB9Ow0KDQogICAgdGhpcy5jZW50ZXJTZWxlY3Rpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICB2YXIgbGluZSA9IE1hdGguZmxvb3IocmFuZ2Uuc3RhcnQucm93ICsgKHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3cpIC8gMik7DQogICAgICAgIHRoaXMucmVuZGVyZXIuc2Nyb2xsVG9MaW5lKGxpbmUsIHRydWUpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldEN1cnNvclBvc2l0aW9uID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5nZXRDdXJzb3IoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRDdXJzb3JQb3NpdGlvblNjcmVlbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmdldEN1cnNvclBvc2l0aW9uKCkpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFNlbGVjdGlvblJhbmdlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpOw0KICAgIH07DQoNCg0KICAgIHRoaXMuc2VsZWN0QWxsID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJGJsb2NrU2Nyb2xsaW5nICs9IDE7DQogICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdEFsbCgpOw0KICAgICAgICB0aGlzLiRibG9ja1Njcm9sbGluZyAtPSAxOw0KICAgIH07DQoNCiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgfTsNCg0KICAgIHRoaXMubW92ZUN1cnNvclRvID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvclRvKHJvdywgY29sdW1uKTsNCiAgICB9Ow0KDQogICAgdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbiA9IGZ1bmN0aW9uKHBvcykgew0KICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihwb3MpOw0KICAgIH07DQoNCiAgICB0aGlzLmp1bXBUb01hdGNoaW5nID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBjdXJzb3IgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgIHZhciBwb3MgPSB0aGlzLnNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldChjdXJzb3IpOw0KICAgICAgICBpZiAoIXBvcykgew0KICAgICAgICAgICAgY3Vyc29yLmNvbHVtbiArPSAxOw0KICAgICAgICAgICAgcG9zID0gdGhpcy5zZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoY3Vyc29yKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIXBvcykgew0KICAgICAgICAgICAgY3Vyc29yLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgcG9zID0gdGhpcy5zZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoY3Vyc29yKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHBvcykgew0KICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8ocG9zLnJvdywgcG9zLmNvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ290b0xpbmUgPSBmdW5jdGlvbihsaW5lTnVtYmVyLCBjb2x1bW4pIHsNCiAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKTsNCiAgICAgICAgdGhpcy5zZXNzaW9uLnVuZm9sZCh7cm93OiBsaW5lTnVtYmVyIC0gMSwgY29sdW1uOiBjb2x1bW4gfHwgMH0pOw0KDQogICAgICAgIHRoaXMuJGJsb2NrU2Nyb2xsaW5nICs9IDE7DQogICAgICAgIHRoaXMubW92ZUN1cnNvclRvKGxpbmVOdW1iZXItMSwgY29sdW1uIHx8IDApOw0KICAgICAgICB0aGlzLiRibG9ja1Njcm9sbGluZyAtPSAxOw0KICAgICAgICBpZiAoIXRoaXMuaXNSb3dGdWxseVZpc2libGUodGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLnJvdykpDQogICAgICAgICAgICB0aGlzLnNjcm9sbFRvTGluZShsaW5lTnVtYmVyLCB0cnVlKTsNCiAgICB9Ow0KDQogICAgdGhpcy5uYXZpZ2F0ZVRvID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhyb3csIGNvbHVtbik7DQogICAgfTsNCg0KICAgIHRoaXMubmF2aWdhdGVVcCA9IGZ1bmN0aW9uKHRpbWVzKSB7DQogICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgICAgIHRpbWVzID0gdGltZXMgfHwgMTsNCiAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckJ5KC10aW1lcywgMCk7DQogICAgfTsNCg0KICAgIHRoaXMubmF2aWdhdGVEb3duID0gZnVuY3Rpb24odGltZXMpIHsNCiAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKTsNCiAgICAgICAgdGltZXMgPSB0aW1lcyB8fCAxOw0KICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yQnkodGltZXMsIDApOw0KICAgIH07DQoNCiAgICB0aGlzLm5hdmlnYXRlTGVmdCA9IGZ1bmN0aW9uKHRpbWVzKSB7DQogICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uU3RhcnQgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkuc3RhcnQ7DQogICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHNlbGVjdGlvblN0YXJ0KTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHRpbWVzID0gdGltZXMgfHwgMTsNCiAgICAgICAgICAgIHdoaWxlICh0aW1lcy0tKSB7DQogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckxlZnQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgfTsNCg0KICAgIHRoaXMubmF2aWdhdGVSaWdodCA9IGZ1bmN0aW9uKHRpbWVzKSB7DQogICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uRW5kID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLmVuZDsNCiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24oc2VsZWN0aW9uRW5kKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHRpbWVzID0gdGltZXMgfHwgMTsNCiAgICAgICAgICAgIHdoaWxlICh0aW1lcy0tKSB7DQogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvclJpZ2h0KCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgIH07DQoNCiAgICB0aGlzLm5hdmlnYXRlTGluZVN0YXJ0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JMaW5lU3RhcnQoKTsNCiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgIH07DQoNCiAgICB0aGlzLm5hdmlnYXRlTGluZUVuZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yTGluZUVuZCgpOw0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgfTsNCg0KICAgIHRoaXMubmF2aWdhdGVGaWxlRW5kID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JGaWxlRW5kKCk7DQogICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsNCiAgICB9Ow0KDQogICAgdGhpcy5uYXZpZ2F0ZUZpbGVTdGFydCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yRmlsZVN0YXJ0KCk7DQogICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsNCiAgICB9Ow0KDQogICAgdGhpcy5uYXZpZ2F0ZVdvcmRSaWdodCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yV29yZFJpZ2h0KCk7DQogICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsNCiAgICB9Ow0KDQogICAgdGhpcy5uYXZpZ2F0ZVdvcmRMZWZ0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JXb3JkTGVmdCgpOw0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgfTsNCg0KICAgIHRoaXMucmVwbGFjZSA9IGZ1bmN0aW9uKHJlcGxhY2VtZW50LCBvcHRpb25zKSB7DQogICAgICAgIGlmIChvcHRpb25zKQ0KICAgICAgICAgICAgdGhpcy4kc2VhcmNoLnNldChvcHRpb25zKTsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLiRzZWFyY2guZmluZCh0aGlzLnNlc3Npb24pOw0KICAgICAgICBpZiAoIXJhbmdlKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHRoaXMuJHRyeVJlcGxhY2UocmFuZ2UsIHJlcGxhY2VtZW50KTsNCiAgICAgICAgaWYgKHJhbmdlICE9PSBudWxsKQ0KICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UocmFuZ2UpOw0KICAgIH07DQoNCiAgICB0aGlzLnJlcGxhY2VBbGwgPSBmdW5jdGlvbihyZXBsYWNlbWVudCwgb3B0aW9ucykgew0KICAgICAgICBpZiAob3B0aW9ucykgew0KICAgICAgICAgICAgdGhpcy4kc2VhcmNoLnNldChvcHRpb25zKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciByYW5nZXMgPSB0aGlzLiRzZWFyY2guZmluZEFsbCh0aGlzLnNlc3Npb24pOw0KICAgICAgICBpZiAoIXJhbmdlcy5sZW5ndGgpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG8oMCwgMCk7DQoNCiAgICAgICAgdGhpcy4kYmxvY2tTY3JvbGxpbmcgKz0gMTsNCiAgICAgICAgZm9yICh2YXIgaSA9IHJhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkNCiAgICAgICAgICAgIHRoaXMuJHRyeVJlcGxhY2UocmFuZ2VzW2ldLCByZXBsYWNlbWVudCk7DQoNCiAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgdGhpcy4kYmxvY2tTY3JvbGxpbmcgLT0gMTsNCiAgICB9Ow0KDQogICAgdGhpcy4kdHJ5UmVwbGFjZSA9IGZ1bmN0aW9uKHJhbmdlLCByZXBsYWNlbWVudCkgew0KICAgICAgICB2YXIgaW5wdXQgPSB0aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgcmVwbGFjZW1lbnQgPSB0aGlzLiRzZWFyY2gucmVwbGFjZShpbnB1dCwgcmVwbGFjZW1lbnQpOw0KICAgICAgICBpZiAocmVwbGFjZW1lbnQgIT09IG51bGwpIHsNCiAgICAgICAgICAgIHJhbmdlLmVuZCA9IHRoaXMuc2Vzc2lvbi5yZXBsYWNlKHJhbmdlLCByZXBsYWNlbWVudCk7DQogICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmdldExhc3RTZWFyY2hPcHRpb25zID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRzZWFyY2guZ2V0T3B0aW9ucygpOw0KICAgIH07DQoNCiAgICB0aGlzLmZpbmQgPSBmdW5jdGlvbihuZWVkbGUsIG9wdGlvbnMpIHsNCiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsNCiAgICAgICAgb3B0aW9ucy5uZWVkbGUgPSBuZWVkbGU7DQogICAgICAgIHRoaXMuJHNlYXJjaC5zZXQob3B0aW9ucyk7DQogICAgICAgIHRoaXMuJGZpbmQoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5maW5kTmV4dCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsNCiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307DQogICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5iYWNrd2FyZHMgPT0gInVuZGVmaW5lZCIpDQogICAgICAgICAgICBvcHRpb25zLmJhY2t3YXJkcyA9IGZhbHNlOw0KICAgICAgICB0aGlzLiRzZWFyY2guc2V0KG9wdGlvbnMpOw0KICAgICAgICB0aGlzLiRmaW5kKCk7DQogICAgfTsNCg0KICAgIHRoaXMuZmluZFByZXZpb3VzID0gZnVuY3Rpb24ob3B0aW9ucykgew0KICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsNCiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmJhY2t3YXJkcyA9PSAidW5kZWZpbmVkIikNCiAgICAgICAgICAgIG9wdGlvbnMuYmFja3dhcmRzID0gdHJ1ZTsNCiAgICAgICAgdGhpcy4kc2VhcmNoLnNldChvcHRpb25zKTsNCiAgICAgICAgdGhpcy4kZmluZCgpOw0KICAgIH07DQoNCiAgICB0aGlzLiRmaW5kID0gZnVuY3Rpb24oYmFja3dhcmRzKSB7DQogICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKQ0KICAgICAgICAgICAgdGhpcy4kc2VhcmNoLnNldCh7bmVlZGxlOiB0aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSl9KTsNCg0KICAgICAgICBpZiAodHlwZW9mIGJhY2t3YXJkcyAhPSAidW5kZWZpbmVkIikNCiAgICAgICAgICAgIHRoaXMuJHNlYXJjaC5zZXQoe2JhY2t3YXJkczogYmFja3dhcmRzfSk7DQoNCiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy4kc2VhcmNoLmZpbmQodGhpcy5zZXNzaW9uKTsNCiAgICAgICAgaWYgKHJhbmdlKSB7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24udW5mb2xkKHJhbmdlKTsNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKHJhbmdlKTsgLy8gdGhpcyBzY3JvbGxzIHNlbGVjdGlvbiBpbnRvIHZpZXcNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLnVuZG8gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5zZXNzaW9uLmdldFVuZG9NYW5hZ2VyKCkudW5kbygpOw0KICAgIH07DQoNCiAgICB0aGlzLnJlZG8gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5zZXNzaW9uLmdldFVuZG9NYW5hZ2VyKCkucmVkbygpOw0KICAgIH07DQoNCiAgICB0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci5kZXN0cm95KCk7DQogICAgfTsNCg0KfSkuY2FsbChFZGl0b3IucHJvdG90eXBlKTsNCg0KDQpleHBvcnRzLkVkaXRvciA9IEVkaXRvcjsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2xpYi9sYW5nJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KZXhwb3J0cy5zdHJpbmdSZXZlcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7DQogICAgcmV0dXJuIHN0cmluZy5zcGxpdCgiIikucmV2ZXJzZSgpLmpvaW4oIiIpOw0KfTsNCg0KZXhwb3J0cy5zdHJpbmdSZXBlYXQgPSBmdW5jdGlvbiAoc3RyaW5nLCBjb3VudCkgew0KICAgICByZXR1cm4gbmV3IEFycmF5KGNvdW50ICsgMSkuam9pbihzdHJpbmcpOw0KfTsNCg0KdmFyIHRyaW1CZWdpblJlZ2V4cCA9IC9eXHNccyovOw0KdmFyIHRyaW1FbmRSZWdleHAgPSAvXHNccyokLzsNCg0KZXhwb3J0cy5zdHJpbmdUcmltTGVmdCA9IGZ1bmN0aW9uIChzdHJpbmcpIHsNCiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UodHJpbUJlZ2luUmVnZXhwLCAnJyk7DQp9Ow0KDQpleHBvcnRzLnN0cmluZ1RyaW1SaWdodCA9IGZ1bmN0aW9uIChzdHJpbmcpIHsNCiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UodHJpbUVuZFJlZ2V4cCwgJycpOw0KfTsNCg0KZXhwb3J0cy5jb3B5T2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7DQogICAgdmFyIGNvcHkgPSB7fTsNCiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7DQogICAgICAgIGNvcHlba2V5XSA9IG9ialtrZXldOw0KICAgIH0NCiAgICByZXR1cm4gY29weTsNCn07DQoNCmV4cG9ydHMuY29weUFycmF5ID0gZnVuY3Rpb24oYXJyYXkpew0KICAgIHZhciBjb3B5ID0gW107DQogICAgZm9yICh2YXIgaT0wLCBsPWFycmF5Lmxlbmd0aDsgaTxsOyBpKyspIHsNCiAgICAgICAgaWYgKGFycmF5W2ldICYmIHR5cGVvZiBhcnJheVtpXSA9PSAib2JqZWN0IikNCiAgICAgICAgICAgIGNvcHlbaV0gPSB0aGlzLmNvcHlPYmplY3QoIGFycmF5W2ldICk7DQogICAgICAgIGVsc2UgDQogICAgICAgICAgICBjb3B5W2ldID0gYXJyYXlbaV07DQogICAgfQ0KICAgIHJldHVybiBjb3B5Ow0KfTsNCg0KZXhwb3J0cy5kZWVwQ29weSA9IGZ1bmN0aW9uIChvYmopIHsNCiAgICBpZiAodHlwZW9mIG9iaiAhPSAib2JqZWN0Iikgew0KICAgICAgICByZXR1cm4gb2JqOw0KICAgIH0NCiAgICANCiAgICB2YXIgY29weSA9IG9iai5jb25zdHJ1Y3RvcigpOw0KICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsNCiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PSAib2JqZWN0Iikgew0KICAgICAgICAgICAgY29weVtrZXldID0gdGhpcy5kZWVwQ29weShvYmpba2V5XSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBjb3B5W2tleV0gPSBvYmpba2V5XTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gY29weTsNCn07DQoNCmV4cG9ydHMuYXJyYXlUb01hcCA9IGZ1bmN0aW9uKGFycikgew0KICAgIHZhciBtYXAgPSB7fTsNCiAgICBmb3IgKHZhciBpPTA7IGk8YXJyLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIG1hcFthcnJbaV1dID0gMTsNCiAgICB9DQogICAgcmV0dXJuIG1hcDsNCg0KfTsNCg0KLyoqDQogKiBzcGxpY2Ugb3V0IG9mICdhcnJheScgYW55dGhpbmcgdGhhdCA9PT0gJ3ZhbHVlJw0KICovDQpleHBvcnRzLmFycmF5UmVtb3ZlID0gZnVuY3Rpb24oYXJyYXksIHZhbHVlKSB7DQogIGZvciAodmFyIGkgPSAwOyBpIDw9IGFycmF5Lmxlbmd0aDsgaSsrKSB7DQogICAgaWYgKHZhbHVlID09PSBhcnJheVtpXSkgew0KICAgICAgYXJyYXkuc3BsaWNlKGksIDEpOw0KICAgIH0NCiAgfQ0KfTsNCg0KZXhwb3J0cy5lc2NhcGVSZWdFeHAgPSBmdW5jdGlvbihzdHIpIHsNCiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbLiorP14ke30oKXxbXF1cL1xcXSkvZywgJ1xcJDEnKTsNCn07DQoNCmV4cG9ydHMuZGVmZXJyZWRDYWxsID0gZnVuY3Rpb24oZmNuKSB7DQoNCiAgICB2YXIgdGltZXIgPSBudWxsOw0KICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aW1lciA9IG51bGw7DQogICAgICAgIGZjbigpOw0KICAgIH07DQoNCiAgICB2YXIgZGVmZXJyZWQgPSBmdW5jdGlvbih0aW1lb3V0KSB7DQogICAgICAgIGRlZmVycmVkLmNhbmNlbCgpOw0KICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIHRpbWVvdXQgfHwgMCk7DQogICAgICAgIHJldHVybiBkZWZlcnJlZDsNCiAgICB9Ow0KDQogICAgZGVmZXJyZWQuc2NoZWR1bGUgPSBkZWZlcnJlZDsNCg0KICAgIGRlZmVycmVkLmNhbGwgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5jYW5jZWwoKTsNCiAgICAgICAgZmNuKCk7DQogICAgICAgIHJldHVybiBkZWZlcnJlZDsNCiAgICB9Ow0KDQogICAgZGVmZXJyZWQuY2FuY2VsID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7DQogICAgICAgIHRpbWVyID0gbnVsbDsNCiAgICAgICAgcmV0dXJuIGRlZmVycmVkOw0KICAgIH07DQoNCiAgICByZXR1cm4gZGVmZXJyZWQ7DQp9Ow0KDQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9rZXlib2FyZC90ZXh0aW5wdXQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZXZlbnQnLCAnYWNlL2xpYi91c2VyYWdlbnQnLCAnYWNlL2xpYi9kb20nXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBldmVudCA9IHJlcXVpcmUoIi4uL2xpYi9ldmVudCIpOw0KdmFyIHVzZXJhZ2VudCA9IHJlcXVpcmUoIi4uL2xpYi91c2VyYWdlbnQiKTsNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQoNCnZhciBUZXh0SW5wdXQgPSBmdW5jdGlvbihwYXJlbnROb2RlLCBob3N0KSB7DQoNCiAgICB2YXIgdGV4dCA9IGRvbS5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpOw0KICAgIGlmICh1c2VyYWdlbnQuaXNUb3VjaFBhZCkNCiAgICAgICAgdGV4dC5zZXRBdHRyaWJ1dGUoIngtcGFsbS1kaXNhYmxlLWF1dG8tY2FwIiwgdHJ1ZSk7DQogICAgICAgIA0KICAgIHRleHQuc3R5bGUubGVmdCA9ICItMTAwMDBweCI7DQogICAgdGV4dC5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7DQogICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGV4dCwgcGFyZW50Tm9kZS5maXJzdENoaWxkKTsNCg0KICAgIHZhciBQTEFDRUhPTERFUiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7DQogICAgc2VuZFRleHQoKTsNCg0KICAgIHZhciBpbkNvbXBvc3Rpb24gPSBmYWxzZTsNCiAgICB2YXIgY29waWVkID0gZmFsc2U7DQogICAgdmFyIHBhc3RlZCA9IGZhbHNlOw0KICAgIHZhciB0ZW1wU3R5bGUgPSAnJzsNCg0KICAgIGZ1bmN0aW9uIHNlbGVjdCgpIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIHRleHQuc2VsZWN0KCk7DQogICAgICAgIH0gY2F0Y2ggKGUpIHt9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2VuZFRleHQodmFsdWVUb1NlbmQpIHsNCiAgICAgICAgaWYgKCFjb3BpZWQpIHsNCiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlVG9TZW5kIHx8IHRleHQudmFsdWU7DQogICAgICAgICAgICBpZiAodmFsdWUpIHsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuY2hhckNvZGVBdCh2YWx1ZS5sZW5ndGgtMSkgPT0gUExBQ0VIT0xERVIuY2hhckNvZGVBdCgwKSkgew0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIC0xKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC5vblRleHRJbnB1dCh2YWx1ZSwgcGFzdGVkKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGhvc3Qub25UZXh0SW5wdXQodmFsdWUsIHBhc3RlZCk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gSWYgZWRpdG9yIGlzIG5vIGxvbmdlciBmb2N1c2VkIHdlIHF1aXQgaW1tZWRpYXRlbHksIHNpbmNlDQogICAgICAgICAgICAgICAgLy8gaXQgbWVhbnMgdGhhdCBzb21ldGhpbmcgZWxzZSBpcyBpbiBjaGFyZ2Ugbm93Lg0KICAgICAgICAgICAgICAgIGlmICghaXNGb2N1c2VkKCkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGNvcGllZCA9IGZhbHNlOw0KICAgICAgICBwYXN0ZWQgPSBmYWxzZTsNCg0KICAgICAgICAvLyBTYWZhcmkgZG9lc24ndCBmaXJlIGNvcHkgZXZlbnRzIGlmIG5vIHRleHQgaXMgc2VsZWN0ZWQNCiAgICAgICAgdGV4dC52YWx1ZSA9IFBMQUNFSE9MREVSOw0KICAgICAgICBzZWxlY3QoKTsNCiAgICB9DQoNCiAgICB2YXIgb25UZXh0SW5wdXQgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgaWYgKCFpbkNvbXBvc3Rpb24pDQogICAgICAgICAgICAgICAgc2VuZFRleHQoZS5kYXRhKTsgICAgICAgICAgICAgICAgDQogICAgICAgIH0sIDApOw0KICAgIH07DQogICAgDQogICAgdmFyIG9uUHJvcGVydHlDaGFuZ2UgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIGlmICh1c2VyYWdlbnQuaXNPbGRJRSAmJiB0ZXh0LnZhbHVlLmNoYXJDb2RlQXQoMCkgPiAxMjgpIHJldHVybjsNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGlmICghaW5Db21wb3N0aW9uKQ0KICAgICAgICAgICAgICAgIHNlbmRUZXh0KCk7DQogICAgICAgIH0sIDApOw0KICAgIH07DQoNCiAgICB2YXIgb25Db21wb3NpdGlvblN0YXJ0ID0gZnVuY3Rpb24oZSkgew0KICAgICAgICBpbkNvbXBvc3Rpb24gPSB0cnVlOw0KICAgICAgICBob3N0Lm9uQ29tcG9zaXRpb25TdGFydCgpOw0KICAgICAgICBpZiAoIXVzZXJhZ2VudC5pc0dlY2tvKSBzZXRUaW1lb3V0KG9uQ29tcG9zaXRpb25VcGRhdGUsIDApOw0KICAgIH07DQoNCiAgICB2YXIgb25Db21wb3NpdGlvblVwZGF0ZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAoIWluQ29tcG9zdGlvbikgcmV0dXJuOw0KICAgICAgICBob3N0Lm9uQ29tcG9zaXRpb25VcGRhdGUodGV4dC52YWx1ZSk7DQogICAgfTsNCg0KICAgIHZhciBvbkNvbXBvc2l0aW9uRW5kID0gZnVuY3Rpb24oZSkgew0KICAgICAgICBpbkNvbXBvc3Rpb24gPSBmYWxzZTsNCiAgICAgICAgaG9zdC5vbkNvbXBvc2l0aW9uRW5kKCk7DQogICAgfTsNCg0KICAgIHZhciBvbkNvcHkgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIGNvcGllZCA9IHRydWU7DQogICAgICAgIHZhciBjb3B5VGV4dCA9IGhvc3QuZ2V0Q29weVRleHQoKTsNCiAgICAgICAgaWYoY29weVRleHQpDQogICAgICAgICAgICB0ZXh0LnZhbHVlID0gY29weVRleHQ7DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgc2VsZWN0KCk7DQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgc2VuZFRleHQoKTsNCiAgICAgICAgfSwgMCk7DQogICAgfTsNCiAgICANCiAgICB2YXIgb25DdXQgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIGNvcGllZCA9IHRydWU7DQogICAgICAgIHZhciBjb3B5VGV4dCA9IGhvc3QuZ2V0Q29weVRleHQoKTsNCiAgICAgICAgaWYoY29weVRleHQpIHsNCiAgICAgICAgICAgIHRleHQudmFsdWUgPSBjb3B5VGV4dDsNCiAgICAgICAgICAgIGhvc3Qub25DdXQoKTsNCiAgICAgICAgfSBlbHNlDQogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgIHNlbGVjdCgpOw0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHNlbmRUZXh0KCk7DQogICAgICAgIH0sIDApOw0KICAgIH07DQoNCiAgICBldmVudC5hZGRDb21tYW5kS2V5TGlzdGVuZXIodGV4dCwgaG9zdC5vbkNvbW1hbmRLZXkuYmluZChob3N0KSk7DQogICAgaWYgKHVzZXJhZ2VudC5pc09sZElFKSB7DQogICAgICAgIHZhciBrZXl0YWJsZSA9IHsgMTM6MSwgMjc6MSB9Ow0KICAgICAgICBldmVudC5hZGRMaXN0ZW5lcih0ZXh0LCAia2V5dXAiLCBmdW5jdGlvbiAoZSkgew0KICAgICAgICAgICAgaWYgKGluQ29tcG9zdGlvbiAmJiAoIXRleHQudmFsdWUgfHwga2V5dGFibGVbZS5rZXlDb2RlXSkpDQogICAgICAgICAgICAgICAgc2V0VGltZW91dChvbkNvbXBvc2l0aW9uRW5kLCAwKTsNCiAgICAgICAgICAgIGlmICgodGV4dC52YWx1ZS5jaGFyQ29kZUF0KDApfDApIDwgMTI5KSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaW5Db21wb3N0aW9uID8gb25Db21wb3NpdGlvblVwZGF0ZSgpIDogb25Db21wb3NpdGlvblN0YXJ0KCk7DQogICAgICAgIH0pOw0KICAgIH0NCiAgICANCiAgICBpZiAoIm9ucHJvcGVydHljaGFuZ2UiIGluIHRleHQgJiYgISgib25pbnB1dCIgaW4gdGV4dCkpDQogICAgICAgIGV2ZW50LmFkZExpc3RlbmVyKHRleHQsICJwcm9wZXJ0eWNoYW5nZSIsIG9uUHJvcGVydHlDaGFuZ2UpOw0KICAgIGVsc2UNCiAgICAgICAgZXZlbnQuYWRkTGlzdGVuZXIodGV4dCwgImlucHV0Iiwgb25UZXh0SW5wdXQpOw0KICAgIA0KICAgIGV2ZW50LmFkZExpc3RlbmVyKHRleHQsICJwYXN0ZSIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgLy8gTWFyayB0aGF0IHRoZSBuZXh0IGlucHV0IHRleHQgY29tZXMgZnJvbSBwYXN0Lg0KICAgICAgICBwYXN0ZWQgPSB0cnVlOw0KICAgICAgICAvLyBTb21lIGJyb3dzZXJzIHN1cHBvcnQgdGhlIGV2ZW50LmNsaXBib2FyZERhdGEgQVBJLiBVc2UgdGhpcyB0byBnZXQNCiAgICAgICAgLy8gdGhlIHBhc3RlZCBjb250ZW50IHdoaWNoIGluY3JlYXNlcyBzcGVlZCBpZiBwYXN0aW5nIGEgbG90IG9mIGxpbmVzLg0KICAgICAgICBpZiAoZS5jbGlwYm9hcmREYXRhICYmIGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKSB7DQogICAgICAgICAgICBzZW5kVGV4dChlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgidGV4dC9wbGFpbiIpKTsNCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgfSANCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAvLyBJZiBhIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGFueSBvZiB0aGUgdGhpbmdzIGFib3ZlLCB1c2UgdGhlIHJlZ3VsYXINCiAgICAgICAgICAgIC8vIG1ldGhvZCB0byBkZXRlY3QgdGhlIHBhc3RlZCBpbnB1dC4NCiAgICAgICAgICAgIG9uUHJvcGVydHlDaGFuZ2UoKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgaWYgKCJvbmJlZm9yZWNvcHkiIGluIHRleHQgJiYgdHlwZW9mIGNsaXBib2FyZERhdGEgIT09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgIGV2ZW50LmFkZExpc3RlbmVyKHRleHQsICJiZWZvcmVjb3B5IiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgdmFyIGNvcHlUZXh0ID0gaG9zdC5nZXRDb3B5VGV4dCgpOw0KICAgICAgICAgICAgaWYgKGNvcHlUZXh0KQ0KICAgICAgICAgICAgICAgIGNsaXBib2FyZERhdGEuc2V0RGF0YSgiVGV4dCIsIGNvcHlUZXh0KTsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgIH0pOw0KICAgICAgICBldmVudC5hZGRMaXN0ZW5lcihwYXJlbnROb2RlLCAia2V5ZG93biIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIGlmIChlLmN0cmxLZXkgJiYgZS5rZXlDb2RlID09IDg4KSB7DQogICAgICAgICAgICAgICAgdmFyIGNvcHlUZXh0ID0gaG9zdC5nZXRDb3B5VGV4dCgpOw0KICAgICAgICAgICAgICAgIGlmIChjb3B5VGV4dCkgew0KICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmREYXRhLnNldERhdGEoIlRleHQiLCBjb3B5VGV4dCk7DQogICAgICAgICAgICAgICAgICAgIGhvc3Qub25DdXQoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgZXZlbnQuYWRkTGlzdGVuZXIodGV4dCwgImNvcHkiLCBvbkNvcHkpOw0KICAgICAgICBldmVudC5hZGRMaXN0ZW5lcih0ZXh0LCAiY3V0Iiwgb25DdXQpOw0KICAgIH0NCg0KICAgIGV2ZW50LmFkZExpc3RlbmVyKHRleHQsICJjb21wb3NpdGlvbnN0YXJ0Iiwgb25Db21wb3NpdGlvblN0YXJ0KTsNCiAgICBpZiAodXNlcmFnZW50LmlzR2Vja28pIHsNCiAgICAgICAgZXZlbnQuYWRkTGlzdGVuZXIodGV4dCwgInRleHQiLCBvbkNvbXBvc2l0aW9uVXBkYXRlKTsNCiAgICB9DQogICAgaWYgKHVzZXJhZ2VudC5pc1dlYktpdCkgew0KICAgICAgICBldmVudC5hZGRMaXN0ZW5lcih0ZXh0LCAia2V5dXAiLCBvbkNvbXBvc2l0aW9uVXBkYXRlKTsNCiAgICB9DQogICAgZXZlbnQuYWRkTGlzdGVuZXIodGV4dCwgImNvbXBvc2l0aW9uZW5kIiwgb25Db21wb3NpdGlvbkVuZCk7DQoNCiAgICBldmVudC5hZGRMaXN0ZW5lcih0ZXh0LCAiYmx1ciIsIGZ1bmN0aW9uKCkgew0KICAgICAgICBob3N0Lm9uQmx1cigpOw0KICAgIH0pOw0KDQogICAgZXZlbnQuYWRkTGlzdGVuZXIodGV4dCwgImZvY3VzIiwgZnVuY3Rpb24oKSB7DQogICAgICAgIGhvc3Qub25Gb2N1cygpOw0KICAgICAgICBzZWxlY3QoKTsNCiAgICB9KTsNCg0KICAgIHRoaXMuZm9jdXMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaG9zdC5vbkZvY3VzKCk7DQogICAgICAgIHNlbGVjdCgpOw0KICAgICAgICB0ZXh0LmZvY3VzKCk7DQogICAgfTsNCg0KICAgIHRoaXMuYmx1ciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0ZXh0LmJsdXIoKTsNCiAgICB9Ow0KDQogICAgZnVuY3Rpb24gaXNGb2N1c2VkKCkgew0KICAgICAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGV4dDsNCiAgICB9DQogICAgdGhpcy5pc0ZvY3VzZWQgPSBpc0ZvY3VzZWQ7DQoNCiAgICB0aGlzLmdldEVsZW1lbnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRleHQ7DQogICAgfTsNCg0KICAgIHRoaXMub25Db250ZXh0TWVudSA9IGZ1bmN0aW9uKG1vdXNlUG9zLCBpc0VtcHR5KXsNCiAgICAgICAgaWYgKG1vdXNlUG9zKSB7DQogICAgICAgICAgICBpZiAoIXRlbXBTdHlsZSkNCiAgICAgICAgICAgICAgICB0ZW1wU3R5bGUgPSB0ZXh0LnN0eWxlLmNzc1RleHQ7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICB0ZXh0LnN0eWxlLmNzc1RleHQgPSANCiAgICAgICAgICAgICAgICAncG9zaXRpb246Zml4ZWQ7IHotaW5kZXg6MTAwMDsnICsNCiAgICAgICAgICAgICAgICAnbGVmdDonICsgKG1vdXNlUG9zLnggLSAyKSArICdweDsgdG9wOicgKyAobW91c2VQb3MueSAtIDIpICsgJ3B4Oyc7DQoNCiAgICAgICAgfQ0KICAgICAgICBpZiAoaXNFbXB0eSkNCiAgICAgICAgICAgIHRleHQudmFsdWU9Jyc7DQogICAgfTsNCg0KICAgIHRoaXMub25Db250ZXh0TWVudUNsb3NlID0gZnVuY3Rpb24oKXsNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBpZiAodGVtcFN0eWxlKSB7DQogICAgICAgICAgICAgICAgdGV4dC5zdHlsZS5jc3NUZXh0ID0gdGVtcFN0eWxlOw0KICAgICAgICAgICAgICAgIHRlbXBTdHlsZSA9ICcnOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2VuZFRleHQoKTsNCiAgICAgICAgfSwgMCk7DQogICAgfTsNCn07DQoNCmV4cG9ydHMuVGV4dElucHV0ID0gVGV4dElucHV0Ow0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBNaWhhaSBTdWNhbiA8bWloYWkgRE9UIHN1Y2FuIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW91c2UvbW91c2VfaGFuZGxlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9ldmVudCcsICdhY2UvbW91c2UvZGVmYXVsdF9oYW5kbGVycycsICdhY2UvbW91c2UvZGVmYXVsdF9ndXR0ZXJfaGFuZGxlcicsICdhY2UvbW91c2UvbW91c2VfZXZlbnQnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBldmVudCA9IHJlcXVpcmUoIi4uL2xpYi9ldmVudCIpOw0KdmFyIERlZmF1bHRIYW5kbGVycyA9IHJlcXVpcmUoIi4vZGVmYXVsdF9oYW5kbGVycyIpLkRlZmF1bHRIYW5kbGVyczsNCnZhciBEZWZhdWx0R3V0dGVySGFuZGxlciA9IHJlcXVpcmUoIi4vZGVmYXVsdF9ndXR0ZXJfaGFuZGxlciIpLkd1dHRlckhhbmRsZXI7DQp2YXIgTW91c2VFdmVudCA9IHJlcXVpcmUoIi4vbW91c2VfZXZlbnQiKS5Nb3VzZUV2ZW50Ow0KDQp2YXIgTW91c2VIYW5kbGVyID0gZnVuY3Rpb24oZWRpdG9yKSB7DQogICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7DQogICAgDQogICAgbmV3IERlZmF1bHRIYW5kbGVycyhlZGl0b3IpOw0KICAgIG5ldyBEZWZhdWx0R3V0dGVySGFuZGxlcihlZGl0b3IpOw0KICAgIA0KICAgIGV2ZW50LmFkZExpc3RlbmVyKGVkaXRvci5jb250YWluZXIsICJtb3VzZWRvd24iLCBmdW5jdGlvbihlKSB7DQogICAgICAgIGVkaXRvci5mb2N1cygpOw0KICAgICAgICByZXR1cm4gZXZlbnQucHJldmVudERlZmF1bHQoZSk7DQogICAgfSk7DQogICAgZXZlbnQuYWRkTGlzdGVuZXIoZWRpdG9yLmNvbnRhaW5lciwgInNlbGVjdHN0YXJ0IiwgZnVuY3Rpb24oZSkgew0KICAgICAgICByZXR1cm4gZXZlbnQucHJldmVudERlZmF1bHQoZSk7DQogICAgfSk7DQoNCiAgICB2YXIgbW91c2VUYXJnZXQgPSBlZGl0b3IucmVuZGVyZXIuZ2V0TW91c2VFdmVudFRhcmdldCgpOw0KICAgIGV2ZW50LmFkZExpc3RlbmVyKG1vdXNlVGFyZ2V0LCAibW91c2Vkb3duIiwgdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCAibW91c2Vkb3duIikpOw0KICAgIGV2ZW50LmFkZExpc3RlbmVyKG1vdXNlVGFyZ2V0LCAiY2xpY2siLCB0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsICJjbGljayIpKTsNCiAgICBldmVudC5hZGRMaXN0ZW5lcihtb3VzZVRhcmdldCwgIm1vdXNlbW92ZSIsIHRoaXMub25Nb3VzZU1vdmUuYmluZCh0aGlzLCAibW91c2Vtb3ZlIikpOw0KICAgIGV2ZW50LmFkZE11bHRpTW91c2VEb3duTGlzdGVuZXIobW91c2VUYXJnZXQsIDAsIDIsIDUwMCwgdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCAiZGJsY2xpY2siKSk7DQogICAgZXZlbnQuYWRkTXVsdGlNb3VzZURvd25MaXN0ZW5lcihtb3VzZVRhcmdldCwgMCwgMywgNjAwLCB0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsICJ0cmlwbGVjbGljayIpKTsNCiAgICBldmVudC5hZGRNdWx0aU1vdXNlRG93bkxpc3RlbmVyKG1vdXNlVGFyZ2V0LCAwLCA0LCA2MDAsIHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywgInF1YWRjbGljayIpKTsNCiAgICBldmVudC5hZGRNb3VzZVdoZWVsTGlzdGVuZXIoZWRpdG9yLmNvbnRhaW5lciwgdGhpcy5vbk1vdXNlV2hlZWwuYmluZCh0aGlzLCAibW91c2V3aGVlbCIpKTsNCiAgICANCiAgICB2YXIgZ3V0dGVyRWwgPSBlZGl0b3IucmVuZGVyZXIuJGd1dHRlcjsNCiAgICBldmVudC5hZGRMaXN0ZW5lcihndXR0ZXJFbCwgIm1vdXNlZG93biIsIHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywgImd1dHRlcm1vdXNlZG93biIpKTsNCiAgICBldmVudC5hZGRMaXN0ZW5lcihndXR0ZXJFbCwgImNsaWNrIiwgdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCAiZ3V0dGVyY2xpY2siKSk7DQogICAgZXZlbnQuYWRkTGlzdGVuZXIoZ3V0dGVyRWwsICJkYmxjbGljayIsIHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywgImd1dHRlcmRibGNsaWNrIikpOw0KICAgIGV2ZW50LmFkZExpc3RlbmVyKGd1dHRlckVsLCAibW91c2Vtb3ZlIiwgdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMsICJndXR0ZXIiKSk7DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLiRzY3JvbGxTcGVlZCA9IDE7DQogICAgdGhpcy5zZXRTY3JvbGxTcGVlZCA9IGZ1bmN0aW9uKHNwZWVkKSB7DQogICAgICAgIHRoaXMuJHNjcm9sbFNwZWVkID0gc3BlZWQ7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2Nyb2xsU3BlZWQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHNjcm9sbFNwZWVkOw0KICAgIH07DQoNCiAgICB0aGlzLm9uTW91c2VFdmVudCA9IGZ1bmN0aW9uKG5hbWUsIGUpIHsNCiAgICAgICAgdGhpcy5lZGl0b3IuX2VtaXQobmFtZSwgbmV3IE1vdXNlRXZlbnQoZSwgdGhpcy5lZGl0b3IpKTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuJGRyYWdEZWxheSA9IDI1MDsNCiAgICB0aGlzLnNldERyYWdEZWxheSA9IGZ1bmN0aW9uKGRyYWdEZWxheSkgew0KICAgICAgICB0aGlzLiRkcmFnRGVsYXkgPSBkcmFnRGVsYXk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0RHJhZ0RlbGF5ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRkcmFnRGVsYXk7DQogICAgfTsNCg0KICAgIHRoaXMub25Nb3VzZU1vdmUgPSBmdW5jdGlvbihuYW1lLCBlKSB7DQogICAgICAgIC8vIG9wdGltaXphdGlvbiwgYmVjYXVzZSBtb3VzZW1vdmUgZG9lc24ndCBoYXZlIGEgZGVmYXVsdCBoYW5kbGVyLg0KICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5lZGl0b3IuX2V2ZW50UmVnaXN0cnkgJiYgdGhpcy5lZGl0b3IuX2V2ZW50UmVnaXN0cnkubW91c2Vtb3ZlOw0KICAgICAgICBpZiAoIWxpc3RlbmVycyB8fCAhbGlzdGVuZXJzLmxlbmd0aCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB0aGlzLmVkaXRvci5fZW1pdChuYW1lLCBuZXcgTW91c2VFdmVudChlLCB0aGlzLmVkaXRvcikpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uTW91c2VXaGVlbCA9IGZ1bmN0aW9uKG5hbWUsIGUpIHsNCiAgICAgICAgdmFyIG1vdXNlRXZlbnQgPSBuZXcgTW91c2VFdmVudChlLCB0aGlzLmVkaXRvcik7DQogICAgICAgIG1vdXNlRXZlbnQuc3BlZWQgPSB0aGlzLiRzY3JvbGxTcGVlZCAqIDI7DQogICAgICAgIG1vdXNlRXZlbnQud2hlZWxYID0gZS53aGVlbFg7DQogICAgICAgIG1vdXNlRXZlbnQud2hlZWxZID0gZS53aGVlbFk7DQogICAgICAgIA0KICAgICAgICB0aGlzLmVkaXRvci5fZW1pdChuYW1lLCBtb3VzZUV2ZW50KTsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vdXNlSGFuZGxlci5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vdXNlSGFuZGxlciA9IE1vdXNlSGFuZGxlcjsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgTWlrZSBkZSBCb2VyIDxtaWtlIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb3VzZS9kZWZhdWx0X2hhbmRsZXJzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2V2ZW50JywgJ2FjZS9saWIvZG9tJywgJ2FjZS9saWIvYnJvd3Nlcl9mb2N1cyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIGV2ZW50ID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50Iik7DQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KdmFyIEJyb3dzZXJGb2N1cyA9IHJlcXVpcmUoIi4uL2xpYi9icm93c2VyX2ZvY3VzIikuQnJvd3NlckZvY3VzOw0KDQp2YXIgU1RBVEVfVU5LTk9XTiA9IDA7DQp2YXIgU1RBVEVfU0VMRUNUID0gMTsNCnZhciBTVEFURV9EUkFHID0gMjsNCg0KdmFyIERSQUdfT0ZGU0VUID0gNTsgLy8gcGl4ZWxzDQoNCmZ1bmN0aW9uIERlZmF1bHRIYW5kbGVycyhlZGl0b3IpIHsNCiAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjsNCiAgICB0aGlzLiRjbGlja1NlbGVjdGlvbiA9IG51bGw7DQogICAgdGhpcy5icm93c2VyRm9jdXMgPSBuZXcgQnJvd3NlckZvY3VzKCk7DQoNCiAgICBlZGl0b3Iuc2V0RGVmYXVsdEhhbmRsZXIoIm1vdXNlZG93biIsIHRoaXMub25Nb3VzZURvd24uYmluZCh0aGlzKSk7DQogICAgZWRpdG9yLnNldERlZmF1bHRIYW5kbGVyKCJkYmxjbGljayIsIHRoaXMub25Eb3VibGVDbGljay5iaW5kKHRoaXMpKTsNCiAgICBlZGl0b3Iuc2V0RGVmYXVsdEhhbmRsZXIoInRyaXBsZWNsaWNrIiwgdGhpcy5vblRyaXBsZUNsaWNrLmJpbmQodGhpcykpOw0KICAgIGVkaXRvci5zZXREZWZhdWx0SGFuZGxlcigicXVhZGNsaWNrIiwgdGhpcy5vblF1YWRDbGljay5iaW5kKHRoaXMpKTsNCiAgICBlZGl0b3Iuc2V0RGVmYXVsdEhhbmRsZXIoIm1vdXNld2hlZWwiLCB0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcykpOw0KfQ0KDQooZnVuY3Rpb24oKSB7DQogICAgDQogICAgdGhpcy5vbk1vdXNlRG93biA9IGZ1bmN0aW9uKGV2KSB7DQogICAgICAgIHZhciBpblNlbGVjdGlvbiA9IGV2LmluU2VsZWN0aW9uKCk7DQogICAgICAgIHZhciBwYWdlWCA9IGV2LnBhZ2VYOw0KICAgICAgICB2YXIgcGFnZVkgPSBldi5wYWdlWTsNCiAgICAgICAgdmFyIHBvcyA9IGV2LmdldERvY3VtZW50UG9zaXRpb24oKTsNCiAgICAgICAgdmFyIGVkaXRvciA9IHRoaXMuZWRpdG9yOw0KICAgICAgICB2YXIgX3NlbGYgPSB0aGlzOw0KICAgICAgICANCiAgICAgICAgdmFyIHNlbGVjdGlvblJhbmdlID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgIHZhciBzZWxlY3Rpb25FbXB0eSA9IHNlbGVjdGlvblJhbmdlLmlzRW1wdHkoKTsNCiAgICAgICAgdmFyIHN0YXRlID0gU1RBVEVfVU5LTk9XTjsNCiAgICAgICAgDQogICAgICAgIC8vIGlmIHRoaXMgY2xpY2sgY2F1c2VkIHRoZSBlZGl0b3IgdG8gYmUgZm9jdXNlZCBzaG91bGQgbm90IGNsZWFyIHRoZQ0KICAgICAgICAvLyBzZWxlY3Rpb24NCiAgICAgICAgaWYgKA0KICAgICAgICAgICAgaW5TZWxlY3Rpb24gJiYgKA0KICAgICAgICAgICAgICAgICF0aGlzLmJyb3dzZXJGb2N1cy5pc0ZvY3VzZWQoKQ0KICAgICAgICAgICAgICAgIHx8IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdGhpcy5icm93c2VyRm9jdXMubGFzdEZvY3VzIDwgMjANCiAgICAgICAgICAgICAgICB8fCAhZWRpdG9yLmlzRm9jdXNlZCgpDQogICAgICAgICAgICApDQogICAgICAgICkgew0KICAgICAgICAgICAgZWRpdG9yLmZvY3VzKCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgYnV0dG9uID0gZXYuZ2V0QnV0dG9uKCk7DQogICAgICAgIGlmIChidXR0b24gIT09IDApIHsNCiAgICAgICAgICAgIGlmIChzZWxlY3Rpb25FbXB0eSkgew0KICAgICAgICAgICAgICAgIGVkaXRvci5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihwb3MpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGJ1dHRvbiA9PSAyKSB7DQogICAgICAgICAgICAgICAgZWRpdG9yLnRleHRJbnB1dC5vbkNvbnRleHRNZW51KHt4OiBldi5jbGllbnRYLCB5OiBldi5jbGllbnRZfSwgc2VsZWN0aW9uRW1wdHkpOw0KICAgICAgICAgICAgICAgIGV2ZW50LmNhcHR1cmUoZWRpdG9yLmNvbnRhaW5lciwgZnVuY3Rpb24oKXt9LCBlZGl0b3IudGV4dElucHV0Lm9uQ29udGV4dE1lbnVDbG9zZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoIWluU2VsZWN0aW9uKSB7DQogICAgICAgICAgICAvLyBEaXJlY3RseSBwaWNrIFNUQVRFX1NFTEVDVCwgc2luY2UgdGhlIHVzZXIgaXMgbm90IGNsaWNraW5nIGluc2lkZQ0KICAgICAgICAgICAgLy8gYSBzZWxlY3Rpb24uDQogICAgICAgICAgICBvblN0YXJ0U2VsZWN0KHBvcyk7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgbW91c2VQYWdlWCA9IHBhZ2VYLCBtb3VzZVBhZ2VZID0gcGFnZVk7DQogICAgICAgIHZhciBtb3VzZWRvd25UaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsNCiAgICAgICAgdmFyIGRyYWdDdXJzb3IsIGRyYWdSYW5nZSwgZHJhZ1NlbGVjdGlvbk1hcmtlcjsNCg0KICAgICAgICB2YXIgb25Nb3VzZVNlbGVjdGlvbiA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIG1vdXNlUGFnZVggPSBldmVudC5nZXREb2N1bWVudFgoZSk7DQogICAgICAgICAgICBtb3VzZVBhZ2VZID0gZXZlbnQuZ2V0RG9jdW1lbnRZKGUpOw0KICAgICAgICB9Ow0KDQogICAgICAgIHZhciBvbk1vdXNlU2VsZWN0aW9uRW5kID0gZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcklkKTsNCiAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTVEFURV9VTktOT1dOKQ0KICAgICAgICAgICAgICAgIG9uU3RhcnRTZWxlY3QocG9zKTsNCiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlID09IFNUQVRFX0RSQUcpDQogICAgICAgICAgICAgICAgb25Nb3VzZURyYWdTZWxlY3Rpb25FbmQoZSk7DQoNCiAgICAgICAgICAgIF9zZWxmLiRjbGlja1NlbGVjdGlvbiA9IG51bGw7DQogICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1VOS05PV047DQogICAgICAgIH07DQoNCiAgICAgICAgdmFyIG9uTW91c2VEcmFnU2VsZWN0aW9uRW5kID0gZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgZG9tLnJlbW92ZUNzc0NsYXNzKGVkaXRvci5jb250YWluZXIsICJhY2VfZHJhZ2dpbmciKTsNCiAgICAgICAgICAgIGVkaXRvci5zZXNzaW9uLnJlbW92ZU1hcmtlcihkcmFnU2VsZWN0aW9uTWFya2VyKTsNCg0KICAgICAgICAgICAgaWYgKCFlZGl0b3IuJG1vdXNlSGFuZGxlci4kY2xpY2tTZWxlY3Rpb24pIHsNCiAgICAgICAgICAgICAgICBpZiAoIWRyYWdDdXJzb3IpIHsNCiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHBvcyk7DQogICAgICAgICAgICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24ocG9zLnJvdywgcG9zLmNvbHVtbik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoIWRyYWdDdXJzb3IpDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICBpZiAoZHJhZ1JhbmdlLmNvbnRhaW5zKGRyYWdDdXJzb3Iucm93LCBkcmFnQ3Vyc29yLmNvbHVtbikpIHsNCiAgICAgICAgICAgICAgICBkcmFnQ3Vyc29yID0gbnVsbDsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGVkaXRvci5jbGVhclNlbGVjdGlvbigpOw0KICAgICAgICAgICAgaWYgKGUgJiYgKGUuY3RybEtleSB8fCBlLmFsdEtleSkpIHsNCiAgICAgICAgICAgICAgICB2YXIgc2Vzc2lvbiA9IGVkaXRvci5zZXNzaW9uOw0KICAgICAgICAgICAgICAgIHZhciBuZXdSYW5nZSA9IHNlc3Npb24uaW5zZXJ0KGRyYWdDdXJzb3IsIHNlc3Npb24uZ2V0VGV4dFJhbmdlKGRyYWdSYW5nZSkpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgbmV3UmFuZ2UgPSBlZGl0b3IubW92ZVRleHQoZHJhZ1JhbmdlLCBkcmFnQ3Vyc29yKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICghbmV3UmFuZ2UpIHsNCiAgICAgICAgICAgICAgICBkcmFnQ3Vyc29yID0gbnVsbDsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UobmV3UmFuZ2UpOw0KICAgICAgICB9Ow0KDQogICAgICAgIHZhciBvblNlbGVjdGlvbkludGVydmFsID0gZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfVU5LTk9XTikgew0KICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IGNhbGNEaXN0YW5jZShwYWdlWCwgcGFnZVksIG1vdXNlUGFnZVgsIG1vdXNlUGFnZVkpOw0KICAgICAgICAgICAgICAgIHZhciB0aW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsNCg0KICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA+IERSQUdfT0ZGU0VUKSB7DQogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfU0VMRUNUOw0KICAgICAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKG1vdXNlUGFnZVgsIG1vdXNlUGFnZVkpOw0KICAgICAgICAgICAgICAgICAgICBjdXJzb3Iucm93ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oY3Vyc29yLnJvdywgZWRpdG9yLnNlc3Npb24uZ2V0TGVuZ3RoKCktMSkpOw0KICAgICAgICAgICAgICAgICAgICBvblN0YXJ0U2VsZWN0KGN1cnNvcik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCh0aW1lIC0gbW91c2Vkb3duVGltZSkgPiBlZGl0b3IuZ2V0RHJhZ0RlbGF5KCkpIHsNCiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9EUkFHOw0KICAgICAgICAgICAgICAgICAgICBkcmFnUmFuZ2UgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0eWxlID0gZWRpdG9yLmdldFNlbGVjdGlvblN0eWxlKCk7DQogICAgICAgICAgICAgICAgICAgIGRyYWdTZWxlY3Rpb25NYXJrZXIgPSBlZGl0b3Iuc2Vzc2lvbi5hZGRNYXJrZXIoZHJhZ1JhbmdlLCAiYWNlX3NlbGVjdGlvbiIsIHN0eWxlKTsNCiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgICAgICAgICAgICAgICAgIGRvbS5hZGRDc3NDbGFzcyhlZGl0b3IuY29udGFpbmVyLCAiYWNlX2RyYWdnaW5nIik7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTVEFURV9EUkFHKQ0KICAgICAgICAgICAgICAgIG9uRHJhZ1NlbGVjdGlvbkludGVydmFsKCk7DQogICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PSBTVEFURV9TRUxFQ1QpDQogICAgICAgICAgICAgICAgb25VcGRhdGVTZWxlY3Rpb25JbnRlcnZhbCgpOw0KICAgICAgICB9Ow0KDQogICAgICAgIGZ1bmN0aW9uIG9uU3RhcnRTZWxlY3QocG9zKSB7DQogICAgICAgICAgICBpZiAoZXYuZ2V0U2hpZnRLZXkoKSkgew0KICAgICAgICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb24uc2VsZWN0VG9Qb3NpdGlvbihwb3MpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgaWYgKCFfc2VsZi4kY2xpY2tTZWxlY3Rpb24pIHsNCiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHBvcyk7DQogICAgICAgICAgICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24ocG9zLnJvdywgcG9zLmNvbHVtbik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9TRUxFQ1Q7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgb25VcGRhdGVTZWxlY3Rpb25JbnRlcnZhbCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdmFyIGFuY2hvcjsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXMobW91c2VQYWdlWCwgbW91c2VQYWdlWSk7DQogICAgICAgICAgICBjdXJzb3Iucm93ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oY3Vyc29yLnJvdywgZWRpdG9yLnNlc3Npb24uZ2V0TGVuZ3RoKCktMSkpOw0KDQogICAgICAgICAgICBpZiAoX3NlbGYuJGNsaWNrU2VsZWN0aW9uKSB7DQogICAgICAgICAgICAgICAgaWYgKF9zZWxmLiRjbGlja1NlbGVjdGlvbi5jb250YWlucyhjdXJzb3Iucm93LCBjdXJzb3IuY29sdW1uKSkgew0KICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKF9zZWxmLiRjbGlja1NlbGVjdGlvbik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBpZiAoX3NlbGYuJGNsaWNrU2VsZWN0aW9uLmNvbXBhcmUoY3Vyc29yLnJvdywgY3Vyc29yLmNvbHVtbikgPT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvciA9IF9zZWxmLiRjbGlja1NlbGVjdGlvbi5lbmQ7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhbmNob3IgPSBfc2VsZi4kY2xpY2tTZWxlY3Rpb24uc3RhcnQ7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25BbmNob3IoYW5jaG9yLnJvdywgYW5jaG9yLmNvbHVtbik7DQogICAgICAgICAgICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb24uc2VsZWN0VG9Qb3NpdGlvbihjdXJzb3IpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb24uc2VsZWN0VG9Qb3NpdGlvbihjdXJzb3IpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBlZGl0b3IucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKTsNCiAgICAgICAgfTsNCg0KICAgICAgICB2YXIgb25EcmFnU2VsZWN0aW9uSW50ZXJ2YWwgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGRyYWdDdXJzb3IgPSBlZGl0b3IucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXMobW91c2VQYWdlWCwgbW91c2VQYWdlWSk7DQogICAgICAgICAgICBkcmFnQ3Vyc29yLnJvdyA9IE1hdGgubWF4KDAsIE1hdGgubWluKGRyYWdDdXJzb3Iucm93LCBlZGl0b3Iuc2Vzc2lvbi5nZXRMZW5ndGgoKSAtIDEpKTsNCg0KICAgICAgICAgICAgZWRpdG9yLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGRyYWdDdXJzb3IpOw0KICAgICAgICB9Ow0KDQogICAgICAgIGV2ZW50LmNhcHR1cmUoZWRpdG9yLmNvbnRhaW5lciwgb25Nb3VzZVNlbGVjdGlvbiwgb25Nb3VzZVNlbGVjdGlvbkVuZCk7DQogICAgICAgIHZhciB0aW1lcklkID0gc2V0SW50ZXJ2YWwob25TZWxlY3Rpb25JbnRlcnZhbCwgMjApOw0KDQogICAgICAgIHJldHVybiBldi5wcmV2ZW50RGVmYXVsdCgpOw0KICAgIH07DQogICAgDQogICAgdGhpcy5vbkRvdWJsZUNsaWNrID0gZnVuY3Rpb24oZXYpIHsNCiAgICAgICAgdmFyIHBvcyA9IGV2LmdldERvY3VtZW50UG9zaXRpb24oKTsNCiAgICAgICAgdmFyIGVkaXRvciA9IHRoaXMuZWRpdG9yOw0KICAgICAgICANCiAgICAgICAgZWRpdG9yLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHBvcyk7DQogICAgICAgIGVkaXRvci5zZWxlY3Rpb24uc2VsZWN0V29yZCgpOw0KICAgICAgICB0aGlzLiRjbGlja1NlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgIH07DQogICAgDQogICAgdGhpcy5vblRyaXBsZUNsaWNrID0gZnVuY3Rpb24oZXYpIHsNCiAgICAgICAgdmFyIHBvcyA9IGV2LmdldERvY3VtZW50UG9zaXRpb24oKTsNCiAgICAgICAgdmFyIGVkaXRvciA9IHRoaXMuZWRpdG9yOw0KICAgICAgICANCiAgICAgICAgZWRpdG9yLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHBvcyk7DQogICAgICAgIGVkaXRvci5zZWxlY3Rpb24uc2VsZWN0TGluZSgpOw0KICAgICAgICB0aGlzLiRjbGlja1NlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgIH07DQogICAgDQogICAgdGhpcy5vblF1YWRDbGljayA9IGZ1bmN0aW9uKGV2KSB7DQogICAgICAgIHZhciBlZGl0b3IgPSB0aGlzLmVkaXRvcjsNCiAgICAgICAgDQogICAgICAgIGVkaXRvci5zZWxlY3RBbGwoKTsNCiAgICAgICAgdGhpcy4kY2xpY2tTZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMub25TY3JvbGwgPSBmdW5jdGlvbihldikgew0KICAgICAgICB2YXIgZWRpdG9yID0gdGhpcy5lZGl0b3I7DQogICAgICAgIA0KICAgICAgICBlZGl0b3IucmVuZGVyZXIuc2Nyb2xsQnkoZXYud2hlZWxYICogZXYuc3BlZWQsIGV2LndoZWVsWSAqIGV2LnNwZWVkKTsNCiAgICAgICAgaWYgKGVkaXRvci5yZW5kZXJlci5pc1Njcm9sbGFibGVCeShldi53aGVlbFggKiBldi5zcGVlZCwgZXYud2hlZWxZICogZXYuc3BlZWQpKQ0KICAgICAgICAgICAgcmV0dXJuIGV2LnByZXZlbnREZWZhdWx0KCk7DQogICAgfTsNCiAgICANCn0pLmNhbGwoRGVmYXVsdEhhbmRsZXJzLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuRGVmYXVsdEhhbmRsZXJzID0gRGVmYXVsdEhhbmRsZXJzOw0KDQpmdW5jdGlvbiBjYWxjRGlzdGFuY2UoYXgsIGF5LCBieCwgYnkpIHsNCiAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KGJ4IC0gYXgsIDIpICsgTWF0aC5wb3coYnkgLSBheSwgMikpOw0KfQ0KDQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIElyYWtsaSBHb3phbGlzaHZpbGkgPHJmb2JpY0BnbWFpbC5jb20+IChodHRwOi8vamVkaXRvb2xraXQuY29tKQ0KICogICAgICBKdWxpYW4gVmllcmVjayA8anVsaWFuLnZpZXJlY2tAZ21haWwuY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2xpYi9icm93c2VyX2ZvY3VzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50JywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4vb29wIik7DQp2YXIgZXZlbnQgPSByZXF1aXJlKCIuL2V2ZW50Iik7DQp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KDQovKioNCiAqIFRoaXMgY2xhc3Mga2VlcHMgdHJhY2sgb2YgdGhlIGZvY3VzIHN0YXRlIG9mIHRoZSBnaXZlbiB3aW5kb3cuDQogKiBGb2N1cyBjaGFuZ2VzIGZvciBleGFtcGxlIHdoZW4gdGhlIHVzZXIgc3dpdGNoZXMgYSBicm93c2VyIHRhYiwNCiAqIGdvZXMgdG8gdGhlIGxvY2F0aW9uIGJhciBvciBzd2l0Y2hlcyB0byBhbm90aGVyIGFwcGxpY2F0aW9uLg0KICovIA0KdmFyIEJyb3dzZXJGb2N1cyA9IGZ1bmN0aW9uKHdpbikgew0KICAgIHdpbiA9IHdpbiB8fCB3aW5kb3c7DQogICAgDQogICAgdGhpcy5sYXN0Rm9jdXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsNCiAgICB0aGlzLl9pc0ZvY3VzZWQgPSB0cnVlOw0KICAgIA0KICAgIHZhciBfc2VsZiA9IHRoaXM7DQoNCiAgICAvLyBJRSA8IDkgc3VwcG9ydHMgZm9jdXNpbiBhbmQgZm9jdXNvdXQgZXZlbnRzDQogICAgaWYgKCJvbmZvY3VzaW4iIGluIHdpbi5kb2N1bWVudCkgew0KICAgICAgICBldmVudC5hZGRMaXN0ZW5lcih3aW4uZG9jdW1lbnQsICJmb2N1c2luIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgX3NlbGYuX3NldEZvY3VzZWQodHJ1ZSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGV2ZW50LmFkZExpc3RlbmVyKHdpbi5kb2N1bWVudCwgImZvY3Vzb3V0IiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgX3NlbGYuX3NldEZvY3VzZWQoISFlLnRvRWxlbWVudCk7DQogICAgICAgIH0pOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgZXZlbnQuYWRkTGlzdGVuZXIod2luLCAiYmx1ciIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIF9zZWxmLl9zZXRGb2N1c2VkKGZhbHNlKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgZXZlbnQuYWRkTGlzdGVuZXIod2luLCAiZm9jdXMiLCBmdW5jdGlvbihlKSB7DQogICAgICAgICAgICBfc2VsZi5fc2V0Rm9jdXNlZCh0cnVlKTsNCiAgICAgICAgfSk7DQogICAgfQ0KfTsNCg0KKGZ1bmN0aW9uKCl7DQoNCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7DQogICAgDQogICAgdGhpcy5pc0ZvY3VzZWQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRm9jdXNlZDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX3NldEZvY3VzZWQgPSBmdW5jdGlvbihpc0ZvY3VzZWQpIHsNCiAgICAgICAgaWYgKHRoaXMuX2lzRm9jdXNlZCA9PSBpc0ZvY3VzZWQpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgaWYgKGlzRm9jdXNlZCkNCiAgICAgICAgICAgIHRoaXMubGFzdEZvY3VzID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7DQogICAgICAgICAgICANCiAgICAgICAgdGhpcy5faXNGb2N1c2VkID0gaXNGb2N1c2VkOw0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VGb2N1cyIpOw0KICAgIH07DQoNCn0pLmNhbGwoQnJvd3NlckZvY3VzLnByb3RvdHlwZSk7DQoNCg0KZXhwb3J0cy5Ccm93c2VyRm9jdXMgPSBCcm93c2VyRm9jdXM7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIElyYWtsaSBHb3phbGlzaHZpbGkgPHJmb2JpY0BnbWFpbC5jb20+IChodHRwOi8vamVkaXRvb2xraXQuY29tKQ0KICogICAgICBNaWtlIGRlIEJvZXIgPG1pa2UgQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2xpYi9ldmVudF9lbWl0dGVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIEV2ZW50RW1pdHRlciA9IHt9Ow0KDQpFdmVudEVtaXR0ZXIuX2VtaXQgPQ0KRXZlbnRFbWl0dGVyLl9kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24oZXZlbnROYW1lLCBlKSB7DQogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307DQogICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzIHx8IHt9Ow0KDQogICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSB8fCBbXTsNCiAgICB2YXIgZGVmYXVsdEhhbmRsZXIgPSB0aGlzLl9kZWZhdWx0SGFuZGxlcnNbZXZlbnROYW1lXTsNCiAgICBpZiAoIWxpc3RlbmVycy5sZW5ndGggJiYgIWRlZmF1bHRIYW5kbGVyKQ0KICAgICAgICByZXR1cm47DQoNCiAgICBlID0gZSB8fCB7fTsNCiAgICBlLnR5cGUgPSBldmVudE5hbWU7DQogICAgDQogICAgaWYgKCFlLnN0b3BQcm9wYWdhdGlvbikgew0KICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGlvblN0b3BwZWQgPSB0cnVlOw0KICAgICAgICB9Ow0KICAgIH0NCiAgICANCiAgICBpZiAoIWUucHJldmVudERlZmF1bHQpIHsNCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTsNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICBmb3IgKHZhciBpPTA7IGk8bGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGxpc3RlbmVyc1tpXShlKTsNCiAgICAgICAgaWYgKGUucHJvcGFnYXRpb25TdG9wcGVkKQ0KICAgICAgICAgICAgYnJlYWs7DQogICAgfQ0KICAgIA0KICAgIGlmIChkZWZhdWx0SGFuZGxlciAmJiAhZS5kZWZhdWx0UHJldmVudGVkKQ0KICAgICAgICBkZWZhdWx0SGFuZGxlcihlKTsNCn07DQoNCkV2ZW50RW1pdHRlci5zZXREZWZhdWx0SGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsNCiAgICB0aGlzLl9kZWZhdWx0SGFuZGxlcnMgPSB0aGlzLl9kZWZhdWx0SGFuZGxlcnMgfHwge307DQogICAgDQogICAgaWYgKHRoaXMuX2RlZmF1bHRIYW5kbGVyc1tldmVudE5hbWVdKQ0KICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSBkZWZhdWx0IGhhbmRsZXIgZm9yICciICsgZXZlbnROYW1lICsgIicgaXMgYWxyZWFkeSBzZXQiKTsNCiAgICAgICAgDQogICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzW2V2ZW50TmFtZV0gPSBjYWxsYmFjazsNCn07DQoNCkV2ZW50RW1pdHRlci5vbiA9DQpFdmVudEVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsNCiAgICB0aGlzLl9ldmVudFJlZ2lzdHJ5ID0gdGhpcy5fZXZlbnRSZWdpc3RyeSB8fCB7fTsNCg0KICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV07DQogICAgaWYgKCFsaXN0ZW5lcnMpDQogICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV0gPSBbXTsNCg0KICAgIGlmIChsaXN0ZW5lcnMuaW5kZXhPZihjYWxsYmFjaykgPT0gLTEpDQogICAgICAgIGxpc3RlbmVycy5wdXNoKGNhbGxiYWNrKTsNCn07DQoNCkV2ZW50RW1pdHRlci5yZW1vdmVMaXN0ZW5lciA9DQpFdmVudEVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsNCiAgICB0aGlzLl9ldmVudFJlZ2lzdHJ5ID0gdGhpcy5fZXZlbnRSZWdpc3RyeSB8fCB7fTsNCg0KICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV07DQogICAgaWYgKCFsaXN0ZW5lcnMpDQogICAgICAgIHJldHVybjsNCg0KICAgIHZhciBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGNhbGxiYWNrKTsNCiAgICBpZiAoaW5kZXggIT09IC0xKQ0KICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTsNCn07DQoNCkV2ZW50RW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbihldmVudE5hbWUpIHsNCiAgICBpZiAodGhpcy5fZXZlbnRSZWdpc3RyeSkgdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdID0gW107DQp9Ow0KDQpleHBvcnRzLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjsNCg0KfSk7LyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb3VzZS9kZWZhdWx0X2d1dHRlcl9oYW5kbGVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KZnVuY3Rpb24gR3V0dGVySGFuZGxlcihlZGl0b3IpIHsNCiAgICBlZGl0b3Iuc2V0RGVmYXVsdEhhbmRsZXIoImd1dHRlcmNsaWNrIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICB2YXIgcm93ID0gZS5nZXREb2N1bWVudFBvc2l0aW9uKCkucm93Ow0KICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLnNlc3Npb24uc2VsZWN0aW9uOw0KICAgICAgICANCiAgICAgICAgc2VsZWN0aW9uLm1vdmVDdXJzb3JUbyhyb3csIDApOw0KICAgICAgICBzZWxlY3Rpb24uc2VsZWN0TGluZSgpOw0KICAgIH0pOw0KfQ0KDQpleHBvcnRzLkd1dHRlckhhbmRsZXIgPSBHdXR0ZXJIYW5kbGVyOw0KDQp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vdXNlL21vdXNlX2V2ZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2V2ZW50J10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgZXZlbnQgPSByZXF1aXJlKCIuLi9saWIvZXZlbnQiKTsNCg0KLyoqDQogKiBDdXN0b20gQWNlIG1vdXNlIGV2ZW50DQogKi8NCnZhciBNb3VzZUV2ZW50ID0gZXhwb3J0cy5Nb3VzZUV2ZW50ID0gZnVuY3Rpb24oZG9tRXZlbnQsIGVkaXRvcikgew0KICAgIHRoaXMuZG9tRXZlbnQgPSBkb21FdmVudDsNCiAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjsNCiAgICANCiAgICB0aGlzLnBhZ2VYID0gZXZlbnQuZ2V0RG9jdW1lbnRYKGRvbUV2ZW50KTsNCiAgICB0aGlzLnBhZ2VZID0gZXZlbnQuZ2V0RG9jdW1lbnRZKGRvbUV2ZW50KTsNCiAgICANCiAgICB0aGlzLmNsaWVudFggPSBkb21FdmVudC5jbGllbnRYOw0KICAgIHRoaXMuY2xpZW50WSA9IGRvbUV2ZW50LmNsaWVudFk7DQoNCiAgICB0aGlzLiRwb3MgPSBudWxsOw0KICAgIHRoaXMuJGluU2VsZWN0aW9uID0gbnVsbDsNCiAgICANCiAgICB0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZCA9IGZhbHNlOw0KICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlOw0KfTsNCg0KKGZ1bmN0aW9uKCkgeyAgDQogICAgDQogICAgdGhpcy5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKHRoaXMuZG9tRXZlbnQpOw0KICAgICAgICB0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7DQogICAgfTsNCiAgICANCiAgICB0aGlzLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KHRoaXMuZG9tRXZlbnQpOw0KICAgICAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOw0KICAgIH07DQogICAgDQogICAgdGhpcy5zdG9wID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7DQogICAgICAgIHRoaXMucHJldmVudERlZmF1bHQoKTsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogR2V0IHRoZSBkb2N1bWVudCBwb3NpdGlvbiBiZWxvdyB0aGUgbW91c2UgY3Vyc29yDQogICAgICogDQogICAgICogQHJldHVybiB7T2JqZWN0fSAncm93JyBhbmQgJ2NvbHVtbicgb2YgdGhlIGRvY3VtZW50IHBvc2l0aW9uDQogICAgICovDQogICAgdGhpcy5nZXREb2N1bWVudFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmICh0aGlzLiRwb3MpDQogICAgICAgICAgICByZXR1cm4gdGhpcy4kcG9zOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciBwYWdlWCA9IGV2ZW50LmdldERvY3VtZW50WCh0aGlzLmRvbUV2ZW50KTsNCiAgICAgICAgdmFyIHBhZ2VZID0gZXZlbnQuZ2V0RG9jdW1lbnRZKHRoaXMuZG9tRXZlbnQpOw0KICAgICAgICB0aGlzLiRwb3MgPSB0aGlzLmVkaXRvci5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyhwYWdlWCwgcGFnZVkpOw0KICAgICAgICB0aGlzLiRwb3Mucm93ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy4kcG9zLnJvdywgdGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRMZW5ndGgoKS0xKSk7DQogICAgICAgIHJldHVybiB0aGlzLiRwb3M7DQogICAgfTsNCiAgICANCiAgICAvKioNCiAgICAgKiBDaGVjayBpZiB0aGUgbW91c2UgY3Vyc29yIGlzIGluc2lkZSBvZiB0aGUgdGV4dCBzZWxlY3Rpb24NCiAgICAgKiANCiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB3aGV0aGVyIHRoZSBtb3VzZSBjdXJzb3IgaXMgaW5zaWRlIG9mIHRoZSBzZWxlY3Rpb24NCiAgICAgKi8NCiAgICB0aGlzLmluU2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmICh0aGlzLiRpblNlbGVjdGlvbiAhPT0gbnVsbCkNCiAgICAgICAgICAgIHJldHVybiB0aGlzLiRpblNlbGVjdGlvbjsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgZWRpdG9yID0gdGhpcy5lZGl0b3I7DQogICAgICAgIA0KICAgICAgICBpZiAoZWRpdG9yLmdldFJlYWRPbmx5KCkpIHsNCiAgICAgICAgICAgIHRoaXMuJGluU2VsZWN0aW9uID0gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uUmFuZ2UgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3Rpb25SYW5nZS5pc0VtcHR5KCkpDQogICAgICAgICAgICAgICAgdGhpcy4kaW5TZWxlY3Rpb24gPSBmYWxzZTsNCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBwb3MgPSB0aGlzLmdldERvY3VtZW50UG9zaXRpb24oKTsNCiAgICAgICAgICAgICAgICB0aGlzLiRpblNlbGVjdGlvbiA9IHNlbGVjdGlvblJhbmdlLmNvbnRhaW5zKHBvcy5yb3csIHBvcy5jb2x1bW4pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzLiRpblNlbGVjdGlvbjsNCiAgICB9Ow0KICAgIA0KICAgIC8qKg0KICAgICAqIEdldCB0aGUgY2xpY2tlZCBtb3VzZSBidXR0b24NCiAgICAgKiANCiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IDAgZm9yIGxlZnQgYnV0dG9uLCAxIGZvciBtaWRkbGUgYnV0dG9uLCAyIGZvciByaWdodCBidXR0b24NCiAgICAgKi8NCiAgICB0aGlzLmdldEJ1dHRvbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gZXZlbnQuZ2V0QnV0dG9uKHRoaXMuZG9tRXZlbnQpOw0KICAgIH07DQogICAgDQogICAgLyoqDQogICAgICogQHJldHVybiB7Qm9vbGVhbn0gd2hldGhlciB0aGUgc2hpZnQga2V5IHdhcyBwcmVzc2VkIHdoZW4gdGhlIGV2ZW50IHdhcyBlbWl0dGVkDQogICAgICovDQogICAgdGhpcy5nZXRTaGlmdEtleSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5kb21FdmVudC5zaGlmdEtleTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0QWNjZWxLZXkgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZG9tRXZlbnQuY3RybEtleSB8fCB0aGlzLmRvbUV2ZW50Lm1ldGFLZXkgOw0KICAgIH07DQogICAgDQp9KS5jYWxsKE1vdXNlRXZlbnQucHJvdG90eXBlKTsNCg0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vdXNlL2ZvbGRfaGFuZGxlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCmZ1bmN0aW9uIEZvbGRIYW5kbGVyKGVkaXRvcikgew0KICAgIA0KICAgIGVkaXRvci5vbigiY2xpY2siLCBmdW5jdGlvbihlKSB7DQogICAgICAgIHZhciBwb3NpdGlvbiA9IGUuZ2V0RG9jdW1lbnRQb3NpdGlvbigpOw0KICAgICAgICB2YXIgc2Vzc2lvbiA9IGVkaXRvci5zZXNzaW9uOw0KICAgICAgICANCiAgICAgICAgLy8gSWYgdGhlIHVzZXIgZGNsaWNrZWQgb24gYSBmb2xkLCB0aGVuIGV4cGFuZCBpdC4NCiAgICAgICAgdmFyIGZvbGQgPSBzZXNzaW9uLmdldEZvbGRBdChwb3NpdGlvbi5yb3csIHBvc2l0aW9uLmNvbHVtbiwgMSk7DQogICAgICAgIGlmIChmb2xkKSB7DQogICAgICAgICAgICBpZiAoZS5nZXRBY2NlbEtleSgpKQ0KICAgICAgICAgICAgICAgIHNlc3Npb24ucmVtb3ZlRm9sZChmb2xkKTsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICBzZXNzaW9uLmV4cGFuZEZvbGQoZm9sZCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICBlLnN0b3AoKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KICAgIA0KICAgIGVkaXRvci5vbigiZ3V0dGVyY2xpY2siLCBmdW5jdGlvbihlKSB7DQogICAgICAgIGlmIChlLmRvbUV2ZW50LnRhcmdldC5jbGFzc05hbWUuaW5kZXhPZigiYWNlX2ZvbGQtd2lkZ2V0IikgIT0gLTEpIHsNCiAgICAgICAgICAgIHZhciByb3cgPSBlLmdldERvY3VtZW50UG9zaXRpb24oKS5yb3c7DQogICAgICAgICAgICBlZGl0b3Iuc2Vzc2lvbi5vbkZvbGRXaWRnZXRDbGljayhyb3csIGUuZG9tRXZlbnQpOw0KICAgICAgICAgICAgZS5zdG9wKCk7DQogICAgICAgIH0NCiAgICB9KTsNCn0NCg0KZXhwb3J0cy5Gb2xkSGFuZGxlciA9IEZvbGRIYW5kbGVyOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIEp1bGlhbiBWaWVyZWNrIDxqdWxpYW4udmllcmVja0BnbWFpbC5jb20+DQogKiAgICAgIEhhcnV0eXVuIEFtaXJqYW55YW4gPGFtaXJqYW55YW5AZ21haWwuY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2tleWJvYXJkL2tleWJpbmRpbmcnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIva2V5cycsICdhY2UvbGliL2V2ZW50JywgJ2FjZS9jb21tYW5kcy9kZWZhdWx0X2NvbW1hbmRzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIga2V5VXRpbCAgPSByZXF1aXJlKCIuLi9saWIva2V5cyIpOw0KdmFyIGV2ZW50ID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50Iik7DQpyZXF1aXJlKCIuLi9jb21tYW5kcy9kZWZhdWx0X2NvbW1hbmRzIik7DQoNCnZhciBLZXlCaW5kaW5nID0gZnVuY3Rpb24oZWRpdG9yKSB7DQogICAgdGhpcy4kZWRpdG9yID0gZWRpdG9yOw0KICAgIHRoaXMuJGRhdGEgPSB7IH07DQogICAgdGhpcy4kaGFuZGxlcnMgPSBbdGhpc107DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQogICAgdGhpcy5zZXRLZXlib2FyZEhhbmRsZXIgPSBmdW5jdGlvbihrZXlib2FyZEhhbmRsZXIpIHsNCiAgICAgICAgaWYgKHRoaXMuJGhhbmRsZXJzW3RoaXMuJGhhbmRsZXJzLmxlbmd0aCAtIDFdID09IGtleWJvYXJkSGFuZGxlcikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgdGhpcy4kZGF0YSA9IHsgfTsNCiAgICAgICAgdGhpcy4kaGFuZGxlcnMgPSBrZXlib2FyZEhhbmRsZXIgPyBbdGhpcywga2V5Ym9hcmRIYW5kbGVyXSA6IFt0aGlzXTsNCiAgICB9Ow0KDQogICAgdGhpcy5hZGRLZXlib2FyZEhhbmRsZXIgPSBmdW5jdGlvbihrZXlib2FyZEhhbmRsZXIpIHsNCiAgICAgICAgdGhpcy5yZW1vdmVLZXlib2FyZEhhbmRsZXIoa2V5Ym9hcmRIYW5kbGVyKTsNCiAgICAgICAgdGhpcy4kaGFuZGxlcnMucHVzaChrZXlib2FyZEhhbmRsZXIpOw0KICAgIH07DQoNCiAgICB0aGlzLnJlbW92ZUtleWJvYXJkSGFuZGxlciA9IGZ1bmN0aW9uKGtleWJvYXJkSGFuZGxlcikgew0KICAgICAgICB2YXIgaSA9IHRoaXMuJGhhbmRsZXJzLmluZGV4T2Yoa2V5Ym9hcmRIYW5kbGVyKTsNCiAgICAgICAgaWYgKGkgPT0gLTEpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIHRoaXMuJGhhbmRsZXJzLnNwbGljZShpLCAxKTsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0S2V5Ym9hcmRIYW5kbGVyID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRoYW5kbGVyc1t0aGlzLiRoYW5kbGVycy5sZW5ndGggLSAxXTsNCiAgICB9Ow0KDQogICAgdGhpcy4kY2FsbEtleWJvYXJkSGFuZGxlcnMgPSBmdW5jdGlvbiAoaGFzaElkLCBrZXlTdHJpbmcsIGtleUNvZGUsIGUpIHsNCiAgICAgICAgdmFyIHRvRXhlY3V0ZTsNCiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuJGhhbmRsZXJzLmxlbmd0aDsgaS0tOykgew0KICAgICAgICAgICAgdG9FeGVjdXRlID0gdGhpcy4kaGFuZGxlcnNbaV0uaGFuZGxlS2V5Ym9hcmQoDQogICAgICAgICAgICAgICAgdGhpcy4kZGF0YSwgaGFzaElkLCBrZXlTdHJpbmcsIGtleUNvZGUsIGUNCiAgICAgICAgICAgICk7DQogICAgICAgICAgICBpZiAodG9FeGVjdXRlICYmIHRvRXhlY3V0ZS5jb21tYW5kKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCF0b0V4ZWN1dGUgfHwgIXRvRXhlY3V0ZS5jb21tYW5kKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHZhciBzdWNjZXNzID0gZmFsc2U7DQogICAgICAgIHZhciBjb21tYW5kcyA9IHRoaXMuJGVkaXRvci5jb21tYW5kczsNCg0KICAgICAgICAvLyBhbGxvdyBrZXlib2FyZEhhbmRsZXIgdG8gY29uc3VtZSBrZXlzDQogICAgICAgIGlmICh0b0V4ZWN1dGUuY29tbWFuZCAhPSAibnVsbCIpDQogICAgICAgICAgICBzdWNjZXNzID0gY29tbWFuZHMuZXhlYyh0b0V4ZWN1dGUuY29tbWFuZCwgdGhpcy4kZWRpdG9yLCB0b0V4ZWN1dGUuYXJncyk7DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOw0KDQogICAgICAgIGlmIChzdWNjZXNzICYmIGUpDQogICAgICAgICAgICBldmVudC5zdG9wRXZlbnQoZSk7DQoNCiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7DQogICAgfTsNCg0KICAgIHRoaXMuaGFuZGxlS2V5Ym9hcmQgPSBmdW5jdGlvbihkYXRhLCBoYXNoSWQsIGtleVN0cmluZykgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgY29tbWFuZDogdGhpcy4kZWRpdG9yLmNvbW1hbmRzLmZpbmRLZXlDb21tYW5kKGhhc2hJZCwga2V5U3RyaW5nKQ0KICAgICAgICB9Ow0KICAgIH07DQoNCiAgICB0aGlzLm9uQ29tbWFuZEtleSA9IGZ1bmN0aW9uKGUsIGhhc2hJZCwga2V5Q29kZSkgew0KICAgICAgICB2YXIga2V5U3RyaW5nID0ga2V5VXRpbC5rZXlDb2RlVG9TdHJpbmcoa2V5Q29kZSk7DQogICAgICAgIHRoaXMuJGNhbGxLZXlib2FyZEhhbmRsZXJzKGhhc2hJZCwga2V5U3RyaW5nLCBrZXlDb2RlLCBlKTsNCiAgICB9Ow0KDQogICAgdGhpcy5vblRleHRJbnB1dCA9IGZ1bmN0aW9uKHRleHQsIHBhc3RlZCkgew0KICAgICAgICB2YXIgc3VjY2VzcyA9IGZhbHNlOw0KICAgICAgICBpZiAoIXBhc3RlZCAmJiB0ZXh0Lmxlbmd0aCA9PSAxKQ0KICAgICAgICAgICAgc3VjY2VzcyA9IHRoaXMuJGNhbGxLZXlib2FyZEhhbmRsZXJzKDAsIHRleHQpOw0KICAgICAgICBpZiAoIXN1Y2Nlc3MpDQogICAgICAgICAgICB0aGlzLiRlZGl0b3IuY29tbWFuZHMuZXhlYygiaW5zZXJ0c3RyaW5nIiwgdGhpcy4kZWRpdG9yLCB0ZXh0KTsNCiAgICB9Ow0KDQp9KS5jYWxsKEtleUJpbmRpbmcucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5LZXlCaW5kaW5nID0gS2V5QmluZGluZzsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgSnVsaWFuIFZpZXJlY2sgPGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbT4NCiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpLnN1Y2FuQGdtYWlsLmNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9jb21tYW5kcy9kZWZhdWx0X2NvbW1hbmRzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2xhbmcnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCg0KZnVuY3Rpb24gYmluZEtleSh3aW4sIG1hYykgew0KICAgIHJldHVybiB7DQogICAgICAgIHdpbjogd2luLA0KICAgICAgICBtYWM6IG1hYw0KICAgIH07DQp9DQoNCmV4cG9ydHMuY29tbWFuZHMgPSBbew0KICAgIG5hbWU6ICJzZWxlY3RhbGwiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtQSIsICJDb21tYW5kLUEiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnNlbGVjdEFsbCgpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogImNlbnRlcnNlbGVjdGlvbiIsDQogICAgYmluZEtleTogYmluZEtleShudWxsLCAiQ3RybC1MIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5jZW50ZXJTZWxlY3Rpb24oKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJnb3RvbGluZSIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1MIiwgIkNvbW1hbmQtTCIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgew0KICAgICAgICB2YXIgbGluZSA9IHBhcnNlSW50KHByb21wdCgiRW50ZXIgbGluZSBudW1iZXI6IiksIDEwKTsNCiAgICAgICAgaWYgKCFpc05hTihsaW5lKSkgew0KICAgICAgICAgICAgZWRpdG9yLmdvdG9MaW5lKGxpbmUpOw0KICAgICAgICB9DQogICAgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJmb2xkIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJBbHQtTCIsICJBbHQtTCIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3Iuc2Vzc2lvbi50b2dnbGVGb2xkKGZhbHNlKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJ1bmZvbGQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkFsdC1TaGlmdC1MIiwgIkFsdC1TaGlmdC1MIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5zZXNzaW9uLnRvZ2dsZUZvbGQodHJ1ZSk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAiZm9sZGFsbCIsDQogICAgYmluZEtleTogYmluZEtleSgiQWx0LTAiLCAiQWx0LTAiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnNlc3Npb24uZm9sZEFsbCgpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogInVuZm9sZGFsbCIsDQogICAgYmluZEtleTogYmluZEtleSgiQWx0LVNoaWZ0LTAiLCAiQWx0LVNoaWZ0LTAiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnNlc3Npb24udW5mb2xkKCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAiZmluZG5leHQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtSyIsICJDb21tYW5kLUciKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmZpbmROZXh0KCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAiZmluZHByZXZpb3VzIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVNoaWZ0LUsiLCAiQ29tbWFuZC1TaGlmdC1HIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5maW5kUHJldmlvdXMoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJmaW5kIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLUYiLCAiQ29tbWFuZC1GIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7DQogICAgICAgIHZhciBuZWVkbGUgPSBwcm9tcHQoIkZpbmQ6IiwgZWRpdG9yLmdldENvcHlUZXh0KCkpOw0KICAgICAgICBlZGl0b3IuZmluZChuZWVkbGUpOw0KICAgIH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAib3ZlcndyaXRlIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJJbnNlcnQiLCAiSW5zZXJ0IiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci50b2dnbGVPdmVyd3JpdGUoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJzZWxlY3R0b3N0YXJ0IiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVNoaWZ0LUhvbWV8QWx0LVNoaWZ0LVVwIiwgIkNvbW1hbmQtU2hpZnQtVXAiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmdldFNlbGVjdGlvbigpLnNlbGVjdEZpbGVTdGFydCgpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogImdvdG9zdGFydCIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1Ib21lfEN0cmwtVXAiLCAiQ29tbWFuZC1Ib21lfENvbW1hbmQtVXAiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLm5hdmlnYXRlRmlsZVN0YXJ0KCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAic2VsZWN0dXAiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIlNoaWZ0LVVwIiwgIlNoaWZ0LVVwIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nZXRTZWxlY3Rpb24oKS5zZWxlY3RVcCgpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogImdvbGluZXVwIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJVcCIsICJVcHxDdHJsLVAiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IsIGFyZ3MpIHsgZWRpdG9yLm5hdmlnYXRlVXAoYXJncy50aW1lcyk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAic2VsZWN0dG9lbmQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtU2hpZnQtRW5kfEFsdC1TaGlmdC1Eb3duIiwgIkNvbW1hbmQtU2hpZnQtRG93biIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0RmlsZUVuZCgpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogImdvdG9lbmQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtRW5kfEN0cmwtRG93biIsICJDb21tYW5kLUVuZHxDb21tYW5kLURvd24iKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLm5hdmlnYXRlRmlsZUVuZCgpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogInNlbGVjdGRvd24iLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIlNoaWZ0LURvd24iLCAiU2hpZnQtRG93biIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0RG93bigpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogImdvbGluZWRvd24iLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkRvd24iLCAiRG93bnxDdHJsLU4iKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IsIGFyZ3MpIHsgZWRpdG9yLm5hdmlnYXRlRG93bihhcmdzLnRpbWVzKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJzZWxlY3R3b3JkbGVmdCIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1TaGlmdC1MZWZ0IiwgIk9wdGlvbi1TaGlmdC1MZWZ0IiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nZXRTZWxlY3Rpb24oKS5zZWxlY3RXb3JkTGVmdCgpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogImdvdG93b3JkbGVmdCIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1MZWZ0IiwgIk9wdGlvbi1MZWZ0IiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5uYXZpZ2F0ZVdvcmRMZWZ0KCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAic2VsZWN0dG9saW5lc3RhcnQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkFsdC1TaGlmdC1MZWZ0IiwgIkNvbW1hbmQtU2hpZnQtTGVmdCIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGluZVN0YXJ0KCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAiZ290b2xpbmVzdGFydCIsDQogICAgYmluZEtleTogYmluZEtleSgiQWx0LUxlZnR8SG9tZSIsICJDb21tYW5kLUxlZnR8SG9tZXxDdHJsLUEiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLm5hdmlnYXRlTGluZVN0YXJ0KCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAic2VsZWN0bGVmdCIsDQogICAgYmluZEtleTogYmluZEtleSgiU2hpZnQtTGVmdCIsICJTaGlmdC1MZWZ0IiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMZWZ0KCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAiZ290b2xlZnQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkxlZnQiLCAiTGVmdHxDdHJsLUIiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IsIGFyZ3MpIHsgZWRpdG9yLm5hdmlnYXRlTGVmdChhcmdzLnRpbWVzKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJzZWxlY3R3b3JkcmlnaHQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtU2hpZnQtUmlnaHQiLCAiT3B0aW9uLVNoaWZ0LVJpZ2h0IiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nZXRTZWxlY3Rpb24oKS5zZWxlY3RXb3JkUmlnaHQoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJnb3Rvd29yZHJpZ2h0IiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVJpZ2h0IiwgIk9wdGlvbi1SaWdodCIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IubmF2aWdhdGVXb3JkUmlnaHQoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJzZWxlY3R0b2xpbmVlbmQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkFsdC1TaGlmdC1SaWdodCIsICJDb21tYW5kLVNoaWZ0LVJpZ2h0IiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMaW5lRW5kKCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAiZ290b2xpbmVlbmQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkFsdC1SaWdodHxFbmQiLCAiQ29tbWFuZC1SaWdodHxFbmR8Q3RybC1FIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5uYXZpZ2F0ZUxpbmVFbmQoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJzZWxlY3RyaWdodCIsDQogICAgYmluZEtleTogYmluZEtleSgiU2hpZnQtUmlnaHQiLCAiU2hpZnQtUmlnaHQiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmdldFNlbGVjdGlvbigpLnNlbGVjdFJpZ2h0KCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAiZ290b3JpZ2h0IiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJSaWdodCIsICJSaWdodHxDdHJsLUYiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IsIGFyZ3MpIHsgZWRpdG9yLm5hdmlnYXRlUmlnaHQoYXJncy50aW1lcyk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAic2VsZWN0cGFnZWRvd24iLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIlNoaWZ0LVBhZ2VEb3duIiwgIlNoaWZ0LVBhZ2VEb3duIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5zZWxlY3RQYWdlRG93bigpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogInBhZ2Vkb3duIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KG51bGwsICJQYWdlRG93biIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3Iuc2Nyb2xsUGFnZURvd24oKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJnb3RvcGFnZWRvd24iLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIlBhZ2VEb3duIiwgIk9wdGlvbi1QYWdlRG93bnxDdHJsLVYiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmdvdG9QYWdlRG93bigpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogInNlbGVjdHBhZ2V1cCIsDQogICAgYmluZEtleTogYmluZEtleSgiU2hpZnQtUGFnZVVwIiwgIlNoaWZ0LVBhZ2VVcCIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3Iuc2VsZWN0UGFnZVVwKCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAicGFnZXVwIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KG51bGwsICJQYWdlVXAiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnNjcm9sbFBhZ2VVcCgpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogImdvdG9wYWdldXAiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIlBhZ2VVcCIsICJPcHRpb24tUGFnZVVwIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nb3RvUGFnZVVwKCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAic2VsZWN0bGluZXN0YXJ0IiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJTaGlmdC1Ib21lIiwgIlNoaWZ0LUhvbWUiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVTdGFydCgpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogInNlbGVjdGxpbmVlbmQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIlNoaWZ0LUVuZCIsICJTaGlmdC1FbmQiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVFbmQoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJ0b2dnbGVyZWNvcmRpbmciLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtQWx0LUUiLCAiQ29tbWFuZC1PcHRpb24tRSIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuY29tbWFuZHMudG9nZ2xlUmVjb3JkaW5nKCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAicmVwbGF5bWFjcm8iLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtU2hpZnQtRSIsICJDb21tYW5kLVNoaWZ0LUUiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmNvbW1hbmRzLnJlcGxheShlZGl0b3IpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogImp1bXB0b21hdGNoaW5nIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVNoaWZ0LVAiLCAiQ3RybC1TaGlmdC1QIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5qdW1wVG9NYXRjaGluZygpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCANCg0KLy8gY29tbWFuZHMgZGlzYWJsZWQgaW4gcmVhZE9ubHkgbW9kZQ0Kew0KICAgIG5hbWU6ICJyZW1vdmVsaW5lIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLUQiLCAiQ29tbWFuZC1EIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5yZW1vdmVMaW5lcygpOyB9DQp9LCB7DQogICAgbmFtZTogInRvZ2dsZWNvbW1lbnQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtNyIsICJDb21tYW5kLTciKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnRvZ2dsZUNvbW1lbnRMaW5lcygpOyB9DQp9LCB7DQogICAgbmFtZTogInJlcGxhY2UiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtUiIsICJDb21tYW5kLU9wdGlvbi1GIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7DQogICAgICAgIHZhciBuZWVkbGUgPSBwcm9tcHQoIkZpbmQ6IiwgZWRpdG9yLmdldENvcHlUZXh0KCkpOw0KICAgICAgICBpZiAoIW5lZWRsZSkNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gcHJvbXB0KCJSZXBsYWNlbWVudDoiKTsNCiAgICAgICAgaWYgKCFyZXBsYWNlbWVudCkNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgZWRpdG9yLnJlcGxhY2UocmVwbGFjZW1lbnQsIHtuZWVkbGU6IG5lZWRsZX0pOw0KICAgIH0NCn0sIHsNCiAgICBuYW1lOiAicmVwbGFjZWFsbCIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1TaGlmdC1SIiwgIkNvbW1hbmQtU2hpZnQtT3B0aW9uLUYiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsNCiAgICAgICAgdmFyIG5lZWRsZSA9IHByb21wdCgiRmluZDoiKTsNCiAgICAgICAgaWYgKCFuZWVkbGUpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIHZhciByZXBsYWNlbWVudCA9IHByb21wdCgiUmVwbGFjZW1lbnQ6Iik7DQogICAgICAgIGlmICghcmVwbGFjZW1lbnQpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIGVkaXRvci5yZXBsYWNlQWxsKHJlcGxhY2VtZW50LCB7bmVlZGxlOiBuZWVkbGV9KTsNCiAgICB9DQp9LCB7DQogICAgbmFtZTogInVuZG8iLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtWiIsICJDb21tYW5kLVoiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnVuZG8oKTsgfQ0KfSwgew0KICAgIG5hbWU6ICJyZWRvIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVNoaWZ0LVp8Q3RybC1ZIiwgIkNvbW1hbmQtU2hpZnQtWnxDb21tYW5kLVkiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnJlZG8oKTsgfQ0KfSwgew0KICAgIG5hbWU6ICJjb3B5bGluZXN1cCIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1BbHQtVXAiLCAiQ29tbWFuZC1PcHRpb24tVXAiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmNvcHlMaW5lc1VwKCk7IH0NCn0sIHsNCiAgICBuYW1lOiAibW92ZWxpbmVzdXAiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkFsdC1VcCIsICJPcHRpb24tVXAiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLm1vdmVMaW5lc1VwKCk7IH0NCn0sIHsNCiAgICBuYW1lOiAiY29weWxpbmVzZG93biIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1BbHQtRG93biIsICJDb21tYW5kLU9wdGlvbi1Eb3duIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5jb3B5TGluZXNEb3duKCk7IH0NCn0sIHsNCiAgICBuYW1lOiAibW92ZWxpbmVzZG93biIsDQogICAgYmluZEtleTogYmluZEtleSgiQWx0LURvd24iLCAiT3B0aW9uLURvd24iKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLm1vdmVMaW5lc0Rvd24oKTsgfQ0KfSwgew0KICAgIG5hbWU6ICJkZWwiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkRlbGV0ZSIsICJEZWxldGV8Q3RybC1EIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5yZW1vdmUoInJpZ2h0Iik7IH0NCn0sIHsNCiAgICBuYW1lOiAiYmFja3NwYWNlIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KA0KICAgICAgICAiQ3RybC1CYWNrc3BhY2V8Q29tbWFuZC1CYWNrc3BhY2V8T3B0aW9uLUJhY2tzcGFjZXxTaGlmdC1CYWNrc3BhY2V8QmFja3NwYWNlIiwNCiAgICAgICAgIkN0cmwtQmFja3NwYWNlfENvbW1hbmQtQmFja3NwYWNlfFNoaWZ0LUJhY2tzcGFjZXxCYWNrc3BhY2V8Q3RybC1IIg0KICAgICksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5yZW1vdmUoImxlZnQiKTsgfQ0KfSwgew0KICAgIG5hbWU6ICJyZW1vdmV0b2xpbmVzdGFydCIsDQogICAgYmluZEtleTogYmluZEtleSgiQWx0LUJhY2tzcGFjZSIsICJPcHRpb24tQmFja3NwYWNlIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5yZW1vdmVUb0xpbmVTdGFydCgpOyB9DQp9LCB7DQogICAgbmFtZTogInJlbW92ZXRvbGluZWVuZCIsDQogICAgYmluZEtleTogYmluZEtleSgiQWx0LURlbGV0ZSIsICJDdHJsLUsiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnJlbW92ZVRvTGluZUVuZCgpOyB9DQp9LCB7DQogICAgbmFtZTogInJlbW92ZXdvcmRsZWZ0IiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLUJhY2tzcGFjZSIsICJBbHQtQmFja3NwYWNlfEN0cmwtQWx0LUJhY2tzcGFjZSIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IucmVtb3ZlV29yZExlZnQoKTsgfQ0KfSwgew0KICAgIG5hbWU6ICJyZW1vdmV3b3JkcmlnaHQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtRGVsZXRlIiwgIkFsdC1EZWxldGUiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnJlbW92ZVdvcmRSaWdodCgpOyB9DQp9LCB7DQogICAgbmFtZTogIm91dGRlbnQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIlNoaWZ0LVRhYiIsICJTaGlmdC1UYWIiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmJsb2NrT3V0ZGVudCgpOyB9DQp9LCB7DQogICAgbmFtZTogImluZGVudCIsDQogICAgYmluZEtleTogYmluZEtleSgiVGFiIiwgIlRhYiIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuaW5kZW50KCk7IH0NCn0sIHsNCiAgICBuYW1lOiAiaW5zZXJ0c3RyaW5nIiwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IsIHN0cikgeyBlZGl0b3IuaW5zZXJ0KHN0cik7IH0NCn0sIHsNCiAgICBuYW1lOiAiaW5zZXJ0dGV4dCIsDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yLCBhcmdzKSB7DQogICAgICAgIGVkaXRvci5pbnNlcnQobGFuZy5zdHJpbmdSZXBlYXQoYXJncy50ZXh0ICB8fCAiIiwgYXJncy50aW1lcyB8fCAxKSk7DQogICAgfQ0KfSwgew0KICAgIG5hbWU6ICJzcGxpdGxpbmUiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkobnVsbCwgIkN0cmwtTyIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3Iuc3BsaXRMaW5lKCk7IH0NCn0sIHsNCiAgICBuYW1lOiAidHJhbnNwb3NlbGV0dGVycyIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1UIiwgIkN0cmwtVCIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IudHJhbnNwb3NlTGV0dGVycygpOyB9DQp9LCB7DQogICAgbmFtZTogInRvdXBwZXJjYXNlIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVUiLCAiQ3RybC1VIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci50b1VwcGVyQ2FzZSgpOyB9DQp9LCB7DQogICAgbmFtZTogInRvbG93ZXJjYXNlIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVNoaWZ0LVUiLCAiQ3RybC1TaGlmdC1VIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci50b0xvd2VyQ2FzZSgpOyB9DQp9XTsNCg0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBNaWhhaSBTdWNhbiA8bWloYWkgRE9UIHN1Y2FuIEFUIGdtYWlsIERPVCBjb20+DQogKiAgICAgIEp1bGlhbiBWaWVyZWNrIDxqdWxpYW4gRE9UIHZpZXJlY2sgQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9lZGl0X3Nlc3Npb24nLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInLCAnYWNlL3NlbGVjdGlvbicsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS9yYW5nZScsICdhY2UvZG9jdW1lbnQnLCAnYWNlL2JhY2tncm91bmRfdG9rZW5pemVyJywgJ2FjZS9lZGl0X3Nlc3Npb24vZm9sZGluZycsICdhY2UvZWRpdF9zZXNzaW9uL2JyYWNrZXRfbWF0Y2gnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuL2xpYi9vb3AiKTsNCnZhciBsYW5nID0gcmVxdWlyZSgiLi9saWIvbGFuZyIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQp2YXIgU2VsZWN0aW9uID0gcmVxdWlyZSgiLi9zZWxlY3Rpb24iKS5TZWxlY3Rpb247DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL21vZGUvdGV4dCIpLk1vZGU7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuL3JhbmdlIikuUmFuZ2U7DQp2YXIgRG9jdW1lbnQgPSByZXF1aXJlKCIuL2RvY3VtZW50IikuRG9jdW1lbnQ7DQp2YXIgQmFja2dyb3VuZFRva2VuaXplciA9IHJlcXVpcmUoIi4vYmFja2dyb3VuZF90b2tlbml6ZXIiKS5CYWNrZ3JvdW5kVG9rZW5pemVyOw0KDQp2YXIgRWRpdFNlc3Npb24gPSBmdW5jdGlvbih0ZXh0LCBtb2RlKSB7DQogICAgdGhpcy4kbW9kaWZpZWQgPSB0cnVlOw0KICAgIHRoaXMuJGJyZWFrcG9pbnRzID0gW107DQogICAgdGhpcy4kZnJvbnRNYXJrZXJzID0ge307DQogICAgdGhpcy4kYmFja01hcmtlcnMgPSB7fTsNCiAgICB0aGlzLiRtYXJrZXJJZCA9IDE7DQogICAgdGhpcy4kcm93Q2FjaGUgPSBbXTsNCiAgICB0aGlzLiR3cmFwRGF0YSA9IFtdOw0KICAgIHRoaXMuJGZvbGREYXRhID0gW107DQogICAgdGhpcy4kdW5kb1NlbGVjdCA9IHRydWU7DQogICAgdGhpcy4kZm9sZERhdGEudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHN0ciA9ICIiOw0KICAgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24oZm9sZExpbmUpIHsNCiAgICAgICAgICAgIHN0ciArPSAiXG4iICsgZm9sZExpbmUudG9TdHJpbmcoKTsNCiAgICAgICAgfSk7DQogICAgICAgIHJldHVybiBzdHI7DQogICAgfQ0KDQogICAgaWYgKHRleHQgaW5zdGFuY2VvZiBEb2N1bWVudCkgew0KICAgICAgICB0aGlzLnNldERvY3VtZW50KHRleHQpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuc2V0RG9jdW1lbnQobmV3IERvY3VtZW50KHRleHQpKTsNCiAgICB9DQoNCiAgICB0aGlzLnNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb24odGhpcyk7DQogICAgaWYgKG1vZGUpDQogICAgICAgIHRoaXMuc2V0TW9kZShtb2RlKTsNCiAgICBlbHNlDQogICAgICAgIHRoaXMuc2V0TW9kZShuZXcgVGV4dE1vZGUoKSk7DQp9Ow0KDQoNCihmdW5jdGlvbigpIHsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCg0KICAgIHRoaXMuc2V0RG9jdW1lbnQgPSBmdW5jdGlvbihkb2MpIHsNCiAgICAgICAgaWYgKHRoaXMuZG9jKQ0KICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJEb2N1bWVudCBpcyBhbHJlYWR5IHNldCIpOw0KDQogICAgICAgIHRoaXMuZG9jID0gZG9jOw0KICAgICAgICBkb2Mub24oImNoYW5nZSIsIHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKSk7DQogICAgICAgIHRoaXMub24oImNoYW5nZUZvbGQiLCB0aGlzLm9uQ2hhbmdlRm9sZC5iaW5kKHRoaXMpKTsNCg0KICAgICAgICBpZiAodGhpcy5iZ1Rva2VuaXplcikgew0KICAgICAgICAgICAgdGhpcy5iZ1Rva2VuaXplci5zZXREb2N1bWVudCh0aGlzLmdldERvY3VtZW50KCkpOw0KICAgICAgICAgICAgdGhpcy5iZ1Rva2VuaXplci5zdGFydCgwKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmdldERvY3VtZW50ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmRvYzsNCiAgICB9Ow0KDQogICAgdGhpcy4kcmVzZXRSb3dDYWNoZSA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICBpZiAocm93ID09IDApIHsNCiAgICAgICAgICAgIHRoaXMuJHJvd0NhY2hlID0gW107DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgdmFyIHJvd0NhY2hlID0gdGhpcy4kcm93Q2FjaGU7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93Q2FjaGUubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChyb3dDYWNoZVtpXS5kb2NSb3cgPj0gcm93KSB7DQogICAgICAgICAgICAgICAgcm93Q2FjaGUuc3BsaWNlKGksIHJvd0NhY2hlLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMub25DaGFuZ2VGb2xkID0gZnVuY3Rpb24oZSkgew0KICAgICAgICB2YXIgZm9sZCA9IGUuZGF0YTsNCiAgICAgICAgdGhpcy4kcmVzZXRSb3dDYWNoZShmb2xkLnN0YXJ0LnJvdyk7DQogICAgfTsNCg0KICAgIHRoaXMub25DaGFuZ2UgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIHZhciBkZWx0YSA9IGUuZGF0YTsNCiAgICAgICAgdGhpcy4kbW9kaWZpZWQgPSB0cnVlOw0KDQogICAgICAgIHRoaXMuJHJlc2V0Um93Q2FjaGUoZGVsdGEucmFuZ2Uuc3RhcnQucm93KTsNCg0KICAgICAgICB2YXIgcmVtb3ZlZEZvbGRzID0gdGhpcy4kdXBkYXRlSW50ZXJuYWxEYXRhT25DaGFuZ2UoZSk7DQogICAgICAgIGlmICghdGhpcy4kZnJvbVVuZG8gJiYgdGhpcy4kdW5kb01hbmFnZXIgJiYgIWRlbHRhLmlnbm9yZSkgew0KICAgICAgICAgICAgdGhpcy4kZGVsdGFzRG9jLnB1c2goZGVsdGEpOw0KICAgICAgICAgICAgaWYgKHJlbW92ZWRGb2xkcyAmJiByZW1vdmVkRm9sZHMubGVuZ3RoICE9IDApIHsNCiAgICAgICAgICAgICAgICB0aGlzLiRkZWx0YXNGb2xkLnB1c2goew0KICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVGb2xkcyIsDQogICAgICAgICAgICAgICAgICAgIGZvbGRzOiAgcmVtb3ZlZEZvbGRzDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRoaXMuJGluZm9ybVVuZG9NYW5hZ2VyLnNjaGVkdWxlKCk7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLmJnVG9rZW5pemVyLnN0YXJ0KGRlbHRhLnJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIGUpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldFZhbHVlID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICB0aGlzLmRvYy5zZXRWYWx1ZSh0ZXh0KTsNCiAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvclRvKDAsIDApOw0KICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpOw0KDQogICAgICAgIHRoaXMuJHJlc2V0Um93Q2FjaGUoMCk7DQogICAgICAgIHRoaXMuJGRlbHRhcyA9IFtdOw0KICAgICAgICB0aGlzLiRkZWx0YXNEb2MgPSBbXTsNCiAgICAgICAgdGhpcy4kZGVsdGFzRm9sZCA9IFtdOw0KICAgICAgICB0aGlzLmdldFVuZG9NYW5hZ2VyKCkucmVzZXQoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRWYWx1ZSA9DQogICAgdGhpcy50b1N0cmluZyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5kb2MuZ2V0VmFsdWUoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRTZWxlY3Rpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFN0YXRlID0gZnVuY3Rpb24ocm93KSB7DQogICAgICAgIHJldHVybiB0aGlzLmJnVG9rZW5pemVyLmdldFN0YXRlKHJvdyk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0VG9rZW5zID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuYmdUb2tlbml6ZXIuZ2V0VG9rZW5zKGZpcnN0Um93LCBsYXN0Um93KTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRUb2tlbkF0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuYmdUb2tlbml6ZXIuZ2V0VG9rZW5zKHJvdywgcm93KVswXS50b2tlbnM7DQogICAgICAgIHZhciB0b2tlbiwgYyA9IDA7DQogICAgICAgIGlmIChjb2x1bW4gPT0gbnVsbCkgew0KICAgICAgICAgICAgaSA9IHRva2Vucy5sZW5ndGggLSAxOw0KICAgICAgICAgICAgYyA9IHRoaXMuZ2V0TGluZShyb3cpLmxlbmd0aDsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgYyArPSB0b2tlbnNbaV0udmFsdWUubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGlmIChjID49IGNvbHVtbikNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV07DQogICAgICAgIGlmICghdG9rZW4pDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgdG9rZW4uaW5kZXggPSBpOw0KICAgICAgICB0b2tlbi5zdGFydCA9IGMgLSB0b2tlbi52YWx1ZS5sZW5ndGg7DQogICAgICAgIHJldHVybiB0b2tlbjsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRVbmRvTWFuYWdlciA9IGZ1bmN0aW9uKHVuZG9NYW5hZ2VyKSB7DQogICAgICAgIHRoaXMuJHVuZG9NYW5hZ2VyID0gdW5kb01hbmFnZXI7DQogICAgICAgIHRoaXMuJHJlc2V0Um93Q2FjaGUoMCk7DQogICAgICAgIHRoaXMuJGRlbHRhcyA9IFtdOw0KICAgICAgICB0aGlzLiRkZWx0YXNEb2MgPSBbXTsNCiAgICAgICAgdGhpcy4kZGVsdGFzRm9sZCA9IFtdOw0KDQogICAgICAgIGlmICh0aGlzLiRpbmZvcm1VbmRvTWFuYWdlcikNCiAgICAgICAgICAgIHRoaXMuJGluZm9ybVVuZG9NYW5hZ2VyLmNhbmNlbCgpOw0KDQogICAgICAgIGlmICh1bmRvTWFuYWdlcikgew0KICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOw0KICAgICAgICAgICAgdGhpcy4kc3luY0luZm9ybVVuZG9NYW5hZ2VyID0gZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgc2VsZi4kaW5mb3JtVW5kb01hbmFnZXIuY2FuY2VsKCk7DQoNCiAgICAgICAgICAgICAgICBpZiAoc2VsZi4kZGVsdGFzRm9sZC5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgc2VsZi4kZGVsdGFzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICJmb2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhczogc2VsZi4kZGVsdGFzRm9sZA0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgc2VsZi4kZGVsdGFzRm9sZCA9IFtdOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChzZWxmLiRkZWx0YXNEb2MubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgIHNlbGYuJGRlbHRhcy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwOiAiZG9jIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhczogc2VsZi4kZGVsdGFzRG9jDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICBzZWxmLiRkZWx0YXNEb2MgPSBbXTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoc2VsZi4kZGVsdGFzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgdW5kb01hbmFnZXIuZXhlY3V0ZSh7DQogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICJhY2V1cGRhdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW3NlbGYuJGRlbHRhcywgc2VsZl0NCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgc2VsZi4kZGVsdGFzID0gW107DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLiRpbmZvcm1VbmRvTWFuYWdlciA9DQogICAgICAgICAgICAgICAgbGFuZy5kZWZlcnJlZENhbGwodGhpcy4kc3luY0luZm9ybVVuZG9NYW5hZ2VyKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLiRkZWZhdWx0VW5kb01hbmFnZXIgPSB7DQogICAgICAgIHVuZG86IGZ1bmN0aW9uKCkge30sDQogICAgICAgIHJlZG86IGZ1bmN0aW9uKCkge30sDQogICAgICAgIHJlc2V0OiBmdW5jdGlvbigpIHt9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0VW5kb01hbmFnZXIgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHVuZG9NYW5hZ2VyIHx8IHRoaXMuJGRlZmF1bHRVbmRvTWFuYWdlcjsNCiAgICB9LA0KDQogICAgdGhpcy5nZXRUYWJTdHJpbmcgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuZ2V0VXNlU29mdFRhYnMoKSkgew0KICAgICAgICAgICAgcmV0dXJuIGxhbmcuc3RyaW5nUmVwZWF0KCIgIiwgdGhpcy5nZXRUYWJTaXplKCkpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuICJcdCI7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy4kdXNlU29mdFRhYnMgPSB0cnVlOw0KICAgIHRoaXMuc2V0VXNlU29mdFRhYnMgPSBmdW5jdGlvbih1c2VTb2Z0VGFicykgew0KICAgICAgICBpZiAodGhpcy4kdXNlU29mdFRhYnMgPT09IHVzZVNvZnRUYWJzKSByZXR1cm47DQoNCiAgICAgICAgdGhpcy4kdXNlU29mdFRhYnMgPSB1c2VTb2Z0VGFiczsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRVc2VTb2Z0VGFicyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kdXNlU29mdFRhYnM7DQogICAgfTsNCg0KICAgIHRoaXMuJHRhYlNpemUgPSA0Ow0KICAgIHRoaXMuc2V0VGFiU2l6ZSA9IGZ1bmN0aW9uKHRhYlNpemUpIHsNCiAgICAgICAgaWYgKGlzTmFOKHRhYlNpemUpIHx8IHRoaXMuJHRhYlNpemUgPT09IHRhYlNpemUpIHJldHVybjsNCg0KICAgICAgICB0aGlzLiRtb2RpZmllZCA9IHRydWU7DQogICAgICAgIHRoaXMuJHRhYlNpemUgPSB0YWJTaXplOw0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VUYWJTaXplIik7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0VGFiU2l6ZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kdGFiU2l6ZTsNCiAgICB9Ow0KDQogICAgdGhpcy5pc1RhYlN0b3AgPSBmdW5jdGlvbihwb3NpdGlvbikgew0KICAgICAgICByZXR1cm4gdGhpcy4kdXNlU29mdFRhYnMgJiYgKHBvc2l0aW9uLmNvbHVtbiAlIHRoaXMuJHRhYlNpemUgPT0gMCk7DQogICAgfTsNCg0KICAgIHRoaXMuJG92ZXJ3cml0ZSA9IGZhbHNlOw0KICAgIHRoaXMuc2V0T3ZlcndyaXRlID0gZnVuY3Rpb24ob3ZlcndyaXRlKSB7DQogICAgICAgIGlmICh0aGlzLiRvdmVyd3JpdGUgPT0gb3ZlcndyaXRlKSByZXR1cm47DQoNCiAgICAgICAgdGhpcy4kb3ZlcndyaXRlID0gb3ZlcndyaXRlOw0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VPdmVyd3JpdGUiKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRPdmVyd3JpdGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG92ZXJ3cml0ZTsNCiAgICB9Ow0KDQogICAgdGhpcy50b2dnbGVPdmVyd3JpdGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5zZXRPdmVyd3JpdGUoIXRoaXMuJG92ZXJ3cml0ZSk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0QnJlYWtwb2ludHMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGJyZWFrcG9pbnRzOw0KICAgIH07DQoNCiAgICB0aGlzLnNldEJyZWFrcG9pbnRzID0gZnVuY3Rpb24ocm93cykgew0KICAgICAgICB0aGlzLiRicmVha3BvaW50cyA9IFtdOw0KICAgICAgICBmb3IgKHZhciBpPTA7IGk8cm93cy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdGhpcy4kYnJlYWtwb2ludHNbcm93c1tpXV0gPSB0cnVlOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUJyZWFrcG9pbnQiLCB7fSk7DQogICAgfTsNCg0KICAgIHRoaXMuY2xlYXJCcmVha3BvaW50cyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRicmVha3BvaW50cyA9IFtdOw0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VCcmVha3BvaW50Iiwge30pOw0KICAgIH07DQoNCiAgICB0aGlzLnNldEJyZWFrcG9pbnQgPSBmdW5jdGlvbihyb3cpIHsNCiAgICAgICAgdGhpcy4kYnJlYWtwb2ludHNbcm93XSA9IHRydWU7DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUJyZWFrcG9pbnQiLCB7fSk7DQogICAgfTsNCg0KICAgIHRoaXMuY2xlYXJCcmVha3BvaW50ID0gZnVuY3Rpb24ocm93KSB7DQogICAgICAgIGRlbGV0ZSB0aGlzLiRicmVha3BvaW50c1tyb3ddOw0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VCcmVha3BvaW50Iiwge30pOw0KICAgIH07DQoNCiAgICB0aGlzLmdldEJyZWFrcG9pbnRzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRicmVha3BvaW50czsNCiAgICB9Ow0KDQogICAgdGhpcy5hZGRNYXJrZXIgPSBmdW5jdGlvbihyYW5nZSwgY2xhenosIHR5cGUsIGluRnJvbnQpIHsNCiAgICAgICAgdmFyIGlkID0gdGhpcy4kbWFya2VySWQrKzsNCg0KICAgICAgICB2YXIgbWFya2VyID0gew0KICAgICAgICAgICAgcmFuZ2UgOiByYW5nZSwNCiAgICAgICAgICAgIHR5cGUgOiB0eXBlIHx8ICJsaW5lIiwNCiAgICAgICAgICAgIHJlbmRlcmVyOiB0eXBlb2YgdHlwZSA9PSAiZnVuY3Rpb24iID8gdHlwZSA6IG51bGwsDQogICAgICAgICAgICBjbGF6eiA6IGNsYXp6LA0KICAgICAgICAgICAgaW5Gcm9udDogISFpbkZyb250DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoaW5Gcm9udCkgew0KICAgICAgICAgICAgdGhpcy4kZnJvbnRNYXJrZXJzW2lkXSA9IG1hcmtlcjsNCiAgICAgICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUZyb250TWFya2VyIikNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMuJGJhY2tNYXJrZXJzW2lkXSA9IG1hcmtlcjsNCiAgICAgICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUJhY2tNYXJrZXIiKQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGlkOw0KICAgIH07DQoNCiAgICB0aGlzLnJlbW92ZU1hcmtlciA9IGZ1bmN0aW9uKG1hcmtlcklkKSB7DQogICAgICAgIHZhciBtYXJrZXIgPSB0aGlzLiRmcm9udE1hcmtlcnNbbWFya2VySWRdIHx8IHRoaXMuJGJhY2tNYXJrZXJzW21hcmtlcklkXTsNCiAgICAgICAgaWYgKCFtYXJrZXIpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIG1hcmtlcnMgPSBtYXJrZXIuaW5Gcm9udCA/IHRoaXMuJGZyb250TWFya2VycyA6IHRoaXMuJGJhY2tNYXJrZXJzOw0KICAgICAgICBpZiAobWFya2VyKSB7DQogICAgICAgICAgICBkZWxldGUgKG1hcmtlcnNbbWFya2VySWRdKTsNCiAgICAgICAgICAgIHRoaXMuX2VtaXQobWFya2VyLmluRnJvbnQgPyAiY2hhbmdlRnJvbnRNYXJrZXIiIDogImNoYW5nZUJhY2tNYXJrZXIiKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmdldE1hcmtlcnMgPSBmdW5jdGlvbihpbkZyb250KSB7DQogICAgICAgIHJldHVybiBpbkZyb250ID8gdGhpcy4kZnJvbnRNYXJrZXJzIDogdGhpcy4kYmFja01hcmtlcnM7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIEVycm9yOg0KICAgICAqICB7DQogICAgICogICAgcm93OiAxMiwNCiAgICAgKiAgICBjb2x1bW46IDIsIC8vY2FuIGJlIHVuZGVmaW5lZA0KICAgICAqICAgIHRleHQ6ICJNaXNzaW5nIGFyZ3VtZW50IiwNCiAgICAgKiAgICB0eXBlOiAiZXJyb3IiIC8vIG9yICJ3YXJuaW5nIiBvciAiaW5mbyINCiAgICAgKiAgfQ0KICAgICAqLw0KICAgIHRoaXMuc2V0QW5ub3RhdGlvbnMgPSBmdW5jdGlvbihhbm5vdGF0aW9ucykgew0KICAgICAgICB0aGlzLiRhbm5vdGF0aW9ucyA9IHt9Ow0KICAgICAgICBmb3IgKHZhciBpPTA7IGk8YW5ub3RhdGlvbnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnNbaV07DQogICAgICAgICAgICB2YXIgcm93ID0gYW5ub3RhdGlvbi5yb3c7DQogICAgICAgICAgICBpZiAodGhpcy4kYW5ub3RhdGlvbnNbcm93XSkNCiAgICAgICAgICAgICAgICB0aGlzLiRhbm5vdGF0aW9uc1tyb3ddLnB1c2goYW5ub3RhdGlvbik7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgdGhpcy4kYW5ub3RhdGlvbnNbcm93XSA9IFthbm5vdGF0aW9uXTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VBbm5vdGF0aW9uIiwge30pOw0KICAgIH07DQoNCiAgICB0aGlzLmdldEFubm90YXRpb25zID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRhbm5vdGF0aW9ucyB8fCB7fTsNCiAgICB9Ow0KDQogICAgdGhpcy5jbGVhckFubm90YXRpb25zID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJGFubm90YXRpb25zID0ge307DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUFubm90YXRpb24iLCB7fSk7DQogICAgfTsNCg0KICAgIHRoaXMuJGRldGVjdE5ld0xpbmUgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgIHZhciBtYXRjaCA9IHRleHQubWF0Y2goL14uKj8oXHI/XG4pL20pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gbWF0Y2hbMV07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLiRhdXRvTmV3TGluZSA9ICJcbiI7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXRXb3JkUmFuZ2UgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuZ2V0TGluZShyb3cpOw0KDQogICAgICAgIHZhciBpblRva2VuID0gZmFsc2U7DQogICAgICAgIGlmIChjb2x1bW4gPiAwKSB7DQogICAgICAgICAgICBpblRva2VuID0gISFsaW5lLmNoYXJBdChjb2x1bW4gLSAxKS5tYXRjaCh0aGlzLnRva2VuUmUpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCFpblRva2VuKSB7DQogICAgICAgICAgICBpblRva2VuID0gISFsaW5lLmNoYXJBdChjb2x1bW4pLm1hdGNoKHRoaXMudG9rZW5SZSk7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgcmUgPSBpblRva2VuID8gdGhpcy50b2tlblJlIDogdGhpcy5ub25Ub2tlblJlOw0KDQogICAgICAgIHZhciBzdGFydCA9IGNvbHVtbjsNCiAgICAgICAgaWYgKHN0YXJ0ID4gMCkgew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIHN0YXJ0LS07DQogICAgICAgICAgICB9DQogICAgICAgICAgICB3aGlsZSAoc3RhcnQgPj0gMCAmJiBsaW5lLmNoYXJBdChzdGFydCkubWF0Y2gocmUpKTsNCiAgICAgICAgICAgIHN0YXJ0Kys7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgZW5kID0gY29sdW1uOw0KICAgICAgICB3aGlsZSAoZW5kIDwgbGluZS5sZW5ndGggJiYgbGluZS5jaGFyQXQoZW5kKS5tYXRjaChyZSkpIHsNCiAgICAgICAgICAgIGVuZCsrOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShyb3csIHN0YXJ0LCByb3csIGVuZCk7DQogICAgfTsNCg0KICAgIC8vIEdldHMgdGhlIHJhbmdlIG9mIGEgd29yZCBpbmNsdWRpbmcgaXRzIHJpZ2h0IHdoaXRlc3BhY2UNCiAgICB0aGlzLmdldEFXb3JkUmFuZ2UgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgd29yZFJhbmdlID0gdGhpcy5nZXRXb3JkUmFuZ2Uocm93LCBjb2x1bW4pOw0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuZ2V0TGluZSh3b3JkUmFuZ2UuZW5kLnJvdyk7DQoNCiAgICAgICAgd2hpbGUgKGxpbmUuY2hhckF0KHdvcmRSYW5nZS5lbmQuY29sdW1uKS5tYXRjaCgvWyBcdF0vKSkgew0KICAgICAgICAgICAgd29yZFJhbmdlLmVuZC5jb2x1bW4gKz0gMTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gd29yZFJhbmdlOw0KICAgIH07DQoNCiAgICB0aGlzLnNldE5ld0xpbmVNb2RlID0gZnVuY3Rpb24obmV3TGluZU1vZGUpIHsNCiAgICAgICAgdGhpcy5kb2Muc2V0TmV3TGluZU1vZGUobmV3TGluZU1vZGUpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldE5ld0xpbmVNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXROZXdMaW5lTW9kZSgpOw0KICAgIH07DQoNCiAgICB0aGlzLiR1c2VXb3JrZXIgPSB0cnVlOw0KICAgIHRoaXMuc2V0VXNlV29ya2VyID0gZnVuY3Rpb24odXNlV29ya2VyKSB7DQogICAgICAgIGlmICh0aGlzLiR1c2VXb3JrZXIgPT0gdXNlV29ya2VyKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHRoaXMuJHVzZVdvcmtlciA9IHVzZVdvcmtlcjsNCg0KICAgICAgICB0aGlzLiRzdG9wV29ya2VyKCk7DQogICAgICAgIGlmICh1c2VXb3JrZXIpDQogICAgICAgICAgICB0aGlzLiRzdGFydFdvcmtlcigpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFVzZVdvcmtlciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kdXNlV29ya2VyOw0KICAgIH07DQoNCiAgICB0aGlzLm9uUmVsb2FkVG9rZW5pemVyID0gZnVuY3Rpb24oZSkgew0KICAgICAgICB2YXIgcm93cyA9IGUuZGF0YTsNCiAgICAgICAgdGhpcy5iZ1Rva2VuaXplci5zdGFydChyb3dzLmZpcnN0KTsNCiAgICAgICAgdGhpcy5fZW1pdCgidG9rZW5pemVyVXBkYXRlIiwgZSk7DQogICAgfTsNCg0KICAgIHRoaXMuJG1vZGUgPSBudWxsOw0KICAgIHRoaXMuc2V0TW9kZSA9IGZ1bmN0aW9uKG1vZGUpIHsNCiAgICAgICAgaWYgKHRoaXMuJG1vZGUgPT09IG1vZGUpIHJldHVybjsNCiAgICAgICAgdGhpcy4kbW9kZSA9IG1vZGU7DQoNCiAgICAgICAgdGhpcy4kc3RvcFdvcmtlcigpOw0KDQogICAgICAgIGlmICh0aGlzLiR1c2VXb3JrZXIpDQogICAgICAgICAgICB0aGlzLiRzdGFydFdvcmtlcigpOw0KDQogICAgICAgIHZhciB0b2tlbml6ZXIgPSBtb2RlLmdldFRva2VuaXplcigpOw0KDQogICAgICAgIGlmKHRva2VuaXplci5hZGRFdmVudExpc3RlbmVyICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgIHZhciBvblJlbG9hZFRva2VuaXplciA9IHRoaXMub25SZWxvYWRUb2tlbml6ZXIuYmluZCh0aGlzKTsNCiAgICAgICAgICAgIHRva2VuaXplci5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGUiLCBvblJlbG9hZFRva2VuaXplcik7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoIXRoaXMuYmdUb2tlbml6ZXIpIHsNCiAgICAgICAgICAgIHRoaXMuYmdUb2tlbml6ZXIgPSBuZXcgQmFja2dyb3VuZFRva2VuaXplcih0b2tlbml6ZXIpOw0KICAgICAgICAgICAgdmFyIF9zZWxmID0gdGhpczsNCiAgICAgICAgICAgIHRoaXMuYmdUb2tlbml6ZXIuYWRkRXZlbnRMaXN0ZW5lcigidXBkYXRlIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgICAgIF9zZWxmLl9lbWl0KCJ0b2tlbml6ZXJVcGRhdGUiLCBlKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhpcy5iZ1Rva2VuaXplci5zZXRUb2tlbml6ZXIodG9rZW5pemVyKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMuYmdUb2tlbml6ZXIuc2V0RG9jdW1lbnQodGhpcy5nZXREb2N1bWVudCgpKTsNCiAgICAgICAgdGhpcy5iZ1Rva2VuaXplci5zdGFydCgwKTsNCg0KICAgICAgICB0aGlzLnRva2VuUmUgPSBtb2RlLnRva2VuUmU7DQogICAgICAgIHRoaXMubm9uVG9rZW5SZSA9IG1vZGUubm9uVG9rZW5SZTsNCg0KICAgICAgICB0aGlzLiRzZXRGb2xkaW5nKG1vZGUuZm9sZGluZ1J1bGVzKTsNCg0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VNb2RlIik7DQogICAgfTsNCg0KICAgIHRoaXMuJHN0b3BXb3JrZXIgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuJHdvcmtlcikNCiAgICAgICAgICAgIHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKTsNCg0KICAgICAgICB0aGlzLiR3b3JrZXIgPSBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLiRzdGFydFdvcmtlciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAodHlwZW9mIFdvcmtlciAhPT0gInVuZGVmaW5lZCIgJiYgIXJlcXVpcmUubm9Xb3JrZXIpIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgdGhpcy4kd29ya2VyID0gdGhpcy4kbW9kZS5jcmVhdGVXb3JrZXIodGhpcyk7DQogICAgICAgICAgICB9IGNhdGNoIChlKSB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkNvdWxkIG5vdCBsb2FkIHdvcmtlciIpOw0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpOw0KICAgICAgICAgICAgICAgIHRoaXMuJHdvcmtlciA9IG51bGw7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgdGhpcy4kd29ya2VyID0gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRtb2RlOw0KICAgIH07DQogICAgDQogICAgdGhpcy4kc2Nyb2xsVG9wID0gMDsNCiAgICB0aGlzLnNldFNjcm9sbFRvcCA9IGZ1bmN0aW9uKHNjcm9sbFRvcCkgew0KICAgICAgICBzY3JvbGxUb3AgPSBNYXRoLnJvdW5kKE1hdGgubWF4KDAsIHNjcm9sbFRvcCkpOw0KICAgICAgICBpZiAodGhpcy4kc2Nyb2xsVG9wID09PSBzY3JvbGxUb3ApDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdGhpcy4kc2Nyb2xsVG9wID0gc2Nyb2xsVG9wOw0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VTY3JvbGxUb3AiLCBzY3JvbGxUb3ApOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFNjcm9sbFRvcCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kc2Nyb2xsVG9wOw0KICAgIH07DQogICAgDQogICAgdGhpcy4kc2Nyb2xsTGVmdCA9IDA7DQogICAgdGhpcy5zZXRTY3JvbGxMZWZ0ID0gZnVuY3Rpb24oc2Nyb2xsTGVmdCkgew0KICAgICAgICBzY3JvbGxMZWZ0ID0gTWF0aC5yb3VuZChNYXRoLm1heCgwLCBzY3JvbGxMZWZ0KSk7DQogICAgICAgIGlmICh0aGlzLiRzY3JvbGxMZWZ0ID09PSBzY3JvbGxMZWZ0KQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHRoaXMuJHNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0Ow0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VTY3JvbGxMZWZ0Iiwgc2Nyb2xsTGVmdCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2Nyb2xsTGVmdCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kc2Nyb2xsTGVmdDsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRXaWR0aCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRjb21wdXRlV2lkdGgoKTsNCiAgICAgICAgcmV0dXJuIHRoaXMud2lkdGg7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2NyZWVuV2lkdGggPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kY29tcHV0ZVdpZHRoKCk7DQogICAgICAgIHJldHVybiB0aGlzLnNjcmVlbldpZHRoOw0KICAgIH07DQoNCiAgICB0aGlzLiRjb21wdXRlV2lkdGggPSBmdW5jdGlvbihmb3JjZSkgew0KICAgICAgICBpZiAodGhpcy4kbW9kaWZpZWQgfHwgZm9yY2UpIHsNCiAgICAgICAgICAgIHRoaXMuJG1vZGlmaWVkID0gZmFsc2U7DQoNCiAgICAgICAgICAgIHZhciBsaW5lcyA9IHRoaXMuZG9jLmdldEFsbExpbmVzKCk7DQogICAgICAgICAgICB2YXIgbG9uZ2VzdExpbmUgPSAwOw0KICAgICAgICAgICAgdmFyIGxvbmdlc3RTY3JlZW5MaW5lID0gMDsNCg0KICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgZm9sZExpbmUgPSB0aGlzLmdldEZvbGRMaW5lKGkpLA0KICAgICAgICAgICAgICAgICAgICBsaW5lLCBsZW47DQoNCiAgICAgICAgICAgICAgICBsaW5lID0gbGluZXNbaV07DQogICAgICAgICAgICAgICAgaWYgKGZvbGRMaW5lKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBlbmQgPSBmb2xkTGluZS5yYW5nZS5lbmQ7DQogICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0aGlzLmdldEZvbGREaXNwbGF5TGluZShmb2xkTGluZSk7DQogICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIGFmdGVyIHRoZSBmb2xkTGluZS5lbmQucm93LiBBbGwgdGhlIGxpbmVzIGluDQogICAgICAgICAgICAgICAgICAgIC8vIGJldHdlZW4gYXJlIGZvbGRlZC4NCiAgICAgICAgICAgICAgICAgICAgaSA9IGVuZC5yb3c7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGxlbiA9IGxpbmUubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGxvbmdlc3RMaW5lID0gTWF0aC5tYXgobG9uZ2VzdExpbmUsIGxlbik7DQogICAgICAgICAgICAgICAgaWYgKCF0aGlzLiR1c2VXcmFwTW9kZSkgew0KICAgICAgICAgICAgICAgICAgICBsb25nZXN0U2NyZWVuTGluZSA9IE1hdGgubWF4KA0KICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ2VzdFNjcmVlbkxpbmUsDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aChsaW5lKVswXQ0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMud2lkdGggPSBsb25nZXN0TGluZTsNCg0KICAgICAgICAgICAgaWYgKHRoaXMuJHVzZVdyYXBNb2RlKSB7DQogICAgICAgICAgICAgICAgdGhpcy5zY3JlZW5XaWR0aCA9IHRoaXMuJHdyYXBMaW1pdDsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdGhpcy5zY3JlZW5XaWR0aCA9IGxvbmdlc3RTY3JlZW5MaW5lOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIEdldCBhIHZlcmJhdGltIGNvcHkgb2YgdGhlIGdpdmVuIGxpbmUgYXMgaXQgaXMgaW4gdGhlIGRvY3VtZW50DQogICAgICovDQogICAgdGhpcy5nZXRMaW5lID0gZnVuY3Rpb24ocm93KSB7DQogICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXRMaW5lKHJvdyk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TGluZXMgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgew0KICAgICAgICByZXR1cm4gdGhpcy5kb2MuZ2V0TGluZXMoZmlyc3RSb3csIGxhc3RSb3cpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldExlbmd0aCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5kb2MuZ2V0TGVuZ3RoKCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0VGV4dFJhbmdlID0gZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgfTsNCg0KICAgIHRoaXMuaW5zZXJ0ID0gZnVuY3Rpb24ocG9zaXRpb24sIHRleHQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmluc2VydChwb3NpdGlvbiwgdGV4dCk7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlID0gZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLnJlbW92ZShyYW5nZSk7DQogICAgfTsNCg0KICAgIHRoaXMudW5kb0NoYW5nZXMgPSBmdW5jdGlvbihkZWx0YXMsIGRvbnRTZWxlY3QpIHsNCiAgICAgICAgaWYgKCFkZWx0YXMubGVuZ3RoKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHRoaXMuJGZyb21VbmRvID0gdHJ1ZTsNCiAgICAgICAgdmFyIGxhc3RVbmRvUmFuZ2UgPSBudWxsOw0KICAgICAgICBmb3IgKHZhciBpID0gZGVsdGFzLmxlbmd0aCAtIDE7IGkgIT0gLTE7IGktLSkgew0KICAgICAgICAgICAgdmFyIGRlbHRhID0gZGVsdGFzW2ldOw0KICAgICAgICAgICAgaWYgKGRlbHRhLmdyb3VwID09ICJkb2MiKSB7DQogICAgICAgICAgICAgICAgdGhpcy5kb2MucmV2ZXJ0RGVsdGFzKGRlbHRhLmRlbHRhcyk7DQogICAgICAgICAgICAgICAgbGFzdFVuZG9SYW5nZSA9DQogICAgICAgICAgICAgICAgICAgIHRoaXMuJGdldFVuZG9TZWxlY3Rpb24oZGVsdGEuZGVsdGFzLCB0cnVlLCBsYXN0VW5kb1JhbmdlKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZGVsdGEuZGVsdGFzLmZvckVhY2goZnVuY3Rpb24oZm9sZERlbHRhKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkRm9sZHMoZm9sZERlbHRhLmZvbGRzKTsNCiAgICAgICAgICAgICAgICB9LCB0aGlzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB0aGlzLiRmcm9tVW5kbyA9IGZhbHNlOw0KICAgICAgICBsYXN0VW5kb1JhbmdlICYmDQogICAgICAgICAgICB0aGlzLiR1bmRvU2VsZWN0ICYmDQogICAgICAgICAgICAhZG9udFNlbGVjdCAmJg0KICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UobGFzdFVuZG9SYW5nZSk7DQogICAgICAgIHJldHVybiBsYXN0VW5kb1JhbmdlOw0KICAgIH07DQoNCiAgICB0aGlzLnJlZG9DaGFuZ2VzID0gZnVuY3Rpb24oZGVsdGFzLCBkb250U2VsZWN0KSB7DQogICAgICAgIGlmICghZGVsdGFzLmxlbmd0aCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB0aGlzLiRmcm9tVW5kbyA9IHRydWU7DQogICAgICAgIHZhciBsYXN0VW5kb1JhbmdlID0gbnVsbDsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBkZWx0YSA9IGRlbHRhc1tpXTsNCiAgICAgICAgICAgIGlmIChkZWx0YS5ncm91cCA9PSAiZG9jIikgew0KICAgICAgICAgICAgICAgIHRoaXMuZG9jLmFwcGx5RGVsdGFzKGRlbHRhLmRlbHRhcyk7DQogICAgICAgICAgICAgICAgbGFzdFVuZG9SYW5nZSA9DQogICAgICAgICAgICAgICAgICAgIHRoaXMuJGdldFVuZG9TZWxlY3Rpb24oZGVsdGEuZGVsdGFzLCBmYWxzZSwgbGFzdFVuZG9SYW5nZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhpcy4kZnJvbVVuZG8gPSBmYWxzZTsNCiAgICAgICAgbGFzdFVuZG9SYW5nZSAmJg0KICAgICAgICAgICAgdGhpcy4kdW5kb1NlbGVjdCAmJg0KICAgICAgICAgICAgIWRvbnRTZWxlY3QgJiYNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGxhc3RVbmRvUmFuZ2UpOw0KICAgICAgICByZXR1cm4gbGFzdFVuZG9SYW5nZTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuc2V0VW5kb1NlbGVjdCA9IGZ1bmN0aW9uKGVuYWJsZSkgew0KICAgICAgICB0aGlzLiR1bmRvU2VsZWN0ID0gZW5hYmxlOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRVbmRvU2VsZWN0aW9uID0gZnVuY3Rpb24oZGVsdGFzLCBpc1VuZG8sIGxhc3RVbmRvUmFuZ2UpIHsNCiAgICAgICAgZnVuY3Rpb24gaXNJbnNlcnQoZGVsdGEpIHsNCiAgICAgICAgICAgIHZhciBpbnNlcnQgPQ0KICAgICAgICAgICAgICAgIGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0VGV4dCIgfHwgZGVsdGEuYWN0aW9uID09ICJpbnNlcnRMaW5lcyI7DQogICAgICAgICAgICByZXR1cm4gaXNVbmRvID8gIWluc2VydCA6IGluc2VydDsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBkZWx0YSA9IGRlbHRhc1swXTsNCiAgICAgICAgdmFyIHJhbmdlLCBwb2ludDsNCiAgICAgICAgdmFyIGxhc3REZWx0YUlzSW5zZXJ0ID0gZmFsc2U7DQogICAgICAgIGlmIChpc0luc2VydChkZWx0YSkpIHsNCiAgICAgICAgICAgIHJhbmdlID0gZGVsdGEucmFuZ2UuY2xvbmUoKTsNCiAgICAgICAgICAgIGxhc3REZWx0YUlzSW5zZXJ0ID0gdHJ1ZTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJhbmdlID0gUmFuZ2UuZnJvbVBvaW50cyhkZWx0YS5yYW5nZS5zdGFydCwgZGVsdGEucmFuZ2Uuc3RhcnQpOw0KICAgICAgICAgICAgbGFzdERlbHRhSXNJbnNlcnQgPSBmYWxzZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBkZWx0YSA9IGRlbHRhc1tpXTsNCiAgICAgICAgICAgIGlmIChpc0luc2VydChkZWx0YSkpIHsNCiAgICAgICAgICAgICAgICBwb2ludCA9IGRlbHRhLnJhbmdlLnN0YXJ0Ow0KICAgICAgICAgICAgICAgIGlmIChyYW5nZS5jb21wYXJlKHBvaW50LnJvdywgcG9pbnQuY29sdW1uKSA9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChkZWx0YS5yYW5nZS5zdGFydCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHBvaW50ID0gZGVsdGEucmFuZ2UuZW5kOw0KICAgICAgICAgICAgICAgIGlmIChyYW5nZS5jb21wYXJlKHBvaW50LnJvdywgcG9pbnQuY29sdW1uKSA9PSAxKSB7DQogICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZChkZWx0YS5yYW5nZS5lbmQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBsYXN0RGVsdGFJc0luc2VydCA9IHRydWU7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHBvaW50ID0gZGVsdGEucmFuZ2Uuc3RhcnQ7DQogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmNvbXBhcmUocG9pbnQucm93LCBwb2ludC5jb2x1bW4pID09IC0xKSB7DQogICAgICAgICAgICAgICAgICAgIHJhbmdlID0NCiAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlLmZyb21Qb2ludHMoZGVsdGEucmFuZ2Uuc3RhcnQsIGRlbHRhLnJhbmdlLnN0YXJ0KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbGFzdERlbHRhSXNJbnNlcnQgPSBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmFuZ2UgYW5kIHRoZSBsYXN0IHVuZG8gcmFuZ2UgaGFzIHNvbWV0aGluZyBpbiBjb21tb24uDQogICAgICAgIC8vIElmIHRydWUsIG1lcmdlIHRoZSByYW5nZXMuDQogICAgICAgIGlmIChsYXN0VW5kb1JhbmdlICE9IG51bGwpIHsNCiAgICAgICAgICAgIHZhciBjbXAgPSBsYXN0VW5kb1JhbmdlLmNvbXBhcmVSYW5nZShyYW5nZSk7DQogICAgICAgICAgICBpZiAoY21wID09IDEpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChsYXN0VW5kb1JhbmdlLnN0YXJ0KTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoY21wID09IC0xKSB7DQogICAgICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kKGxhc3RVbmRvUmFuZ2UuZW5kKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiByYW5nZTsNCiAgICB9LA0KDQogICAgdGhpcy5yZXBsYWNlID0gZnVuY3Rpb24ocmFuZ2UsIHRleHQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLnJlcGxhY2UocmFuZ2UsIHRleHQpOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBNb3ZlIGEgcmFuZ2Ugb2YgdGV4dCBmcm9tIHRoZSBnaXZlbiByYW5nZSB0byB0aGUgZ2l2ZW4gcG9zaXRpb24uDQogICAgICoNCiAgICAgKiBAcGFyYW0gZnJvbVJhbmdlIHtSYW5nZX0gVGhlIHJhbmdlIG9mIHRleHQgeW91IHdhbnQgbW92ZWQgd2l0aGluIHRoZQ0KICAgICAqIGRvY3VtZW50Lg0KICAgICAqIEBwYXJhbSB0b1Bvc2l0aW9uIHtPYmplY3R9IFRoZSBsb2NhdGlvbiAocm93IGFuZCBjb2x1bW4pIHdoZXJlIHlvdSB3YW50DQogICAgICogdG8gbW92ZSB0aGUgdGV4dCB0by4NCiAgICAgKiBAcmV0dXJuIHtSYW5nZX0gVGhlIG5ldyByYW5nZSB3aGVyZSB0aGUgdGV4dCB3YXMgbW92ZWQgdG8uDQogICAgICovDQogICAgdGhpcy5tb3ZlVGV4dCA9IGZ1bmN0aW9uKGZyb21SYW5nZSwgdG9Qb3NpdGlvbikgew0KICAgICAgICB2YXIgdGV4dCA9IHRoaXMuZ2V0VGV4dFJhbmdlKGZyb21SYW5nZSk7DQogICAgICAgIHRoaXMucmVtb3ZlKGZyb21SYW5nZSk7DQoNCiAgICAgICAgdmFyIHRvUm93ID0gdG9Qb3NpdGlvbi5yb3c7DQogICAgICAgIHZhciB0b0NvbHVtbiA9IHRvUG9zaXRpb24uY29sdW1uOw0KDQogICAgICAgIC8vIE1ha2Ugc3VyZSB0byB1cGRhdGUgdGhlIGluc2VydCBsb2NhdGlvbiwgd2hlbiB0ZXh0IGlzIHJlbW92ZWQgaW4NCiAgICAgICAgLy8gZnJvbnQgb2YgdGhlIGNob3NlbiBwb2ludCBvZiBpbnNlcnRpb24uDQogICAgICAgIGlmICghZnJvbVJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgZnJvbVJhbmdlLnN0YXJ0LnJvdyA9PSB0b1JvdyAmJg0KICAgICAgICAgICAgZnJvbVJhbmdlLmVuZC5jb2x1bW4gPCB0b0NvbHVtbikNCiAgICAgICAgICAgIHRvQ29sdW1uIC09IHRleHQubGVuZ3RoOw0KDQogICAgICAgIGlmIChmcm9tUmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBmcm9tUmFuZ2UuZW5kLnJvdyA8IHRvUm93KSB7DQogICAgICAgICAgICB2YXIgbGluZXMgPSB0aGlzLmRvYy4kc3BsaXQodGV4dCk7DQogICAgICAgICAgICB0b1JvdyAtPSBsaW5lcy5sZW5ndGggLSAxOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGVuZFJvdyA9IHRvUm93ICsgZnJvbVJhbmdlLmVuZC5yb3cgLSBmcm9tUmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICB2YXIgZW5kQ29sdW1uID0gZnJvbVJhbmdlLmlzTXVsdGlMaW5lKCkgPw0KICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVJhbmdlLmVuZC5jb2x1bW4gOg0KICAgICAgICAgICAgICAgICAgICAgICAgdG9Db2x1bW4gKyBmcm9tUmFuZ2UuZW5kLmNvbHVtbiAtIGZyb21SYW5nZS5zdGFydC5jb2x1bW47DQoNCiAgICAgICAgdmFyIHRvUmFuZ2UgPSBuZXcgUmFuZ2UodG9Sb3csIHRvQ29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQoNCiAgICAgICAgdGhpcy5pbnNlcnQodG9SYW5nZS5zdGFydCwgdGV4dCk7DQoNCiAgICAgICAgcmV0dXJuIHRvUmFuZ2U7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50Um93cyA9IGZ1bmN0aW9uKHN0YXJ0Um93LCBlbmRSb3csIGluZGVudFN0cmluZykgew0KICAgICAgICBpbmRlbnRTdHJpbmcgPSBpbmRlbnRTdHJpbmcucmVwbGFjZSgvXHQvZywgdGhpcy5nZXRUYWJTdHJpbmcoKSk7DQogICAgICAgIGZvciAodmFyIHJvdz1zdGFydFJvdzsgcm93PD1lbmRSb3c7IHJvdysrKQ0KICAgICAgICAgICAgdGhpcy5pbnNlcnQoe3Jvdzogcm93LCBjb2x1bW46MH0sIGluZGVudFN0cmluZyk7DQogICAgfTsNCg0KICAgIHRoaXMub3V0ZGVudFJvd3MgPSBmdW5jdGlvbiAocmFuZ2UpIHsNCiAgICAgICAgdmFyIHJvd1JhbmdlID0gcmFuZ2UuY29sbGFwc2VSb3dzKCk7DQogICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgdmFyIHNpemUgPSB0aGlzLmdldFRhYlNpemUoKTsNCg0KICAgICAgICBmb3IgKHZhciBpID0gcm93UmFuZ2Uuc3RhcnQucm93OyBpIDw9IHJvd1JhbmdlLmVuZC5yb3c7ICsraSkgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSB0aGlzLmdldExpbmUoaSk7DQoNCiAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2l6ZTsgKytqKQ0KICAgICAgICAgICAgICAgIGlmIChsaW5lLmNoYXJBdChqKSAhPSAnICcpDQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgaWYgKGogPCBzaXplICYmIGxpbmUuY2hhckF0KGopID09ICdcdCcpIHsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5zdGFydC5jb2x1bW4gPSBqOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5jb2x1bW4gPSBqICsgMTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQuY29sdW1uID0gMDsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gajsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMucmVtb3ZlKGRlbGV0ZVJhbmdlKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLm1vdmVMaW5lc1VwID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgaWYgKGZpcnN0Um93IDw9IDApIHJldHVybiAwOw0KDQogICAgICAgIHZhciByZW1vdmVkID0gdGhpcy5kb2MucmVtb3ZlTGluZXMoZmlyc3RSb3csIGxhc3RSb3cpOw0KICAgICAgICB0aGlzLmRvYy5pbnNlcnRMaW5lcyhmaXJzdFJvdyAtIDEsIHJlbW92ZWQpOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCg0KICAgIHRoaXMubW92ZUxpbmVzRG93biA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIGlmIChsYXN0Um93ID49IHRoaXMuZG9jLmdldExlbmd0aCgpLTEpIHJldHVybiAwOw0KDQogICAgICAgIHZhciByZW1vdmVkID0gdGhpcy5kb2MucmVtb3ZlTGluZXMoZmlyc3RSb3csIGxhc3RSb3cpOw0KICAgICAgICB0aGlzLmRvYy5pbnNlcnRMaW5lcyhmaXJzdFJvdysxLCByZW1vdmVkKTsNCiAgICAgICAgcmV0dXJuIDE7DQogICAgfTsNCg0KICAgIHRoaXMuZHVwbGljYXRlTGluZXMgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgew0KICAgICAgICB2YXIgZmlyc3RSb3cgPSB0aGlzLiRjbGlwUm93VG9Eb2N1bWVudChmaXJzdFJvdyk7DQogICAgICAgIHZhciBsYXN0Um93ID0gdGhpcy4kY2xpcFJvd1RvRG9jdW1lbnQobGFzdFJvdyk7DQoNCiAgICAgICAgdmFyIGxpbmVzID0gdGhpcy5nZXRMaW5lcyhmaXJzdFJvdywgbGFzdFJvdyk7DQogICAgICAgIHRoaXMuZG9jLmluc2VydExpbmVzKGZpcnN0Um93LCBsaW5lcyk7DQoNCiAgICAgICAgdmFyIGFkZGVkUm93cyA9IGxhc3RSb3cgLSBmaXJzdFJvdyArIDE7DQogICAgICAgIHJldHVybiBhZGRlZFJvd3M7DQogICAgfTsNCg0KICAgIHRoaXMuJGNsaXBSb3dUb0RvY3VtZW50ID0gZnVuY3Rpb24ocm93KSB7DQogICAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbihyb3csIHRoaXMuZG9jLmdldExlbmd0aCgpLTEpKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kY2xpcENvbHVtblRvUm93ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKGNvbHVtbiA8IDApDQogICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMuZG9jLmdldExpbmUocm93KS5sZW5ndGgsIGNvbHVtbik7DQogICAgfTsNCg0KICAgIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBjb2x1bW4gPSBNYXRoLm1heCgwLCBjb2x1bW4pOw0KDQogICAgICAgIGlmIChyb3cgPCAwKSB7DQogICAgICAgICAgICByb3cgPSAwOw0KICAgICAgICAgICAgY29sdW1uID0gMDsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHZhciBsZW4gPSB0aGlzLmRvYy5nZXRMZW5ndGgoKTsNCiAgICAgICAgICAgIGlmIChyb3cgPj0gbGVuKSB7DQogICAgICAgICAgICAgICAgcm93ID0gbGVuIC0gMTsNCiAgICAgICAgICAgICAgICBjb2x1bW4gPSB0aGlzLmRvYy5nZXRMaW5lKGxlbi0xKS5sZW5ndGg7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGNvbHVtbiA9IE1hdGgubWluKHRoaXMuZG9jLmdldExpbmUocm93KS5sZW5ndGgsIGNvbHVtbik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgcm93OiByb3csDQogICAgICAgICAgICBjb2x1bW46IGNvbHVtbg0KICAgICAgICB9Ow0KICAgIH07DQoNCiAgICB0aGlzLiRjbGlwUmFuZ2VUb0RvY3VtZW50ID0gZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA8IDApIHsNCiAgICAgICAgICAgIHJhbmdlLnN0YXJ0LnJvdyA9IDA7DQogICAgICAgICAgICByYW5nZS5zdGFydC5jb2x1bW4gPSAwDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByYW5nZS5zdGFydC5jb2x1bW4gPSB0aGlzLiRjbGlwQ29sdW1uVG9Sb3coDQogICAgICAgICAgICAgICAgcmFuZ2Uuc3RhcnQucm93LA0KICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0LmNvbHVtbg0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgdmFyIGxlbiA9IHRoaXMuZG9jLmdldExlbmd0aCgpIC0gMTsNCiAgICAgICAgaWYgKHJhbmdlLmVuZC5yb3cgPiBsZW4pIHsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5yb3cgPSBsZW47DQogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uID0gdGhpcy5kb2MuZ2V0TGluZShsZW4pLmxlbmd0aDsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gPSB0aGlzLiRjbGlwQ29sdW1uVG9Sb3coDQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLnJvdywNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uDQogICAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByYW5nZTsNCiAgICB9Ow0KDQogICAgLy8gV1JBUE1PREUNCiAgICB0aGlzLiR3cmFwTGltaXQgPSA4MDsNCiAgICB0aGlzLiR1c2VXcmFwTW9kZSA9IGZhbHNlOw0KICAgIHRoaXMuJHdyYXBMaW1pdFJhbmdlID0gew0KICAgICAgICBtaW4gOiBudWxsLA0KICAgICAgICBtYXggOiBudWxsDQogICAgfTsNCg0KICAgIHRoaXMuc2V0VXNlV3JhcE1vZGUgPSBmdW5jdGlvbih1c2VXcmFwTW9kZSkgew0KICAgICAgICBpZiAodXNlV3JhcE1vZGUgIT0gdGhpcy4kdXNlV3JhcE1vZGUpIHsNCiAgICAgICAgICAgIHRoaXMuJHVzZVdyYXBNb2RlID0gdXNlV3JhcE1vZGU7DQogICAgICAgICAgICB0aGlzLiRtb2RpZmllZCA9IHRydWU7DQogICAgICAgICAgICB0aGlzLiRyZXNldFJvd0NhY2hlKDApOw0KDQogICAgICAgICAgICAvLyBJZiB3cmFwTW9kZSBpcyBhY3RpdmFlZCwgdGhlIHdyYXBEYXRhIGFycmF5IGhhcyB0byBiZSBpbml0aWFsaXplZC4NCiAgICAgICAgICAgIGlmICh1c2VXcmFwTW9kZSkgew0KICAgICAgICAgICAgICAgIHZhciBsZW4gPSB0aGlzLmdldExlbmd0aCgpOw0KICAgICAgICAgICAgICAgIHRoaXMuJHdyYXBEYXRhID0gW107DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLiR3cmFwRGF0YS5wdXNoKFtdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy4kdXBkYXRlV3JhcERhdGEoMCwgbGVuIC0gMSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZVdyYXBNb2RlIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXRVc2VXcmFwTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kdXNlV3JhcE1vZGU7DQogICAgfTsNCg0KICAgIC8vIEFsbG93IHRoZSB3cmFwIGxpbWl0IHRvIG1vdmUgZnJlZWx5IGJldHdlZW4gbWluIGFuZCBtYXguIEVpdGhlcg0KICAgIC8vIHBhcmFtZXRlciBjYW4gYmUgbnVsbCB0byBhbGxvdyB0aGUgd3JhcCBsaW1pdCB0byBiZSB1bmNvbnN0cmFpbmVkDQogICAgLy8gaW4gdGhhdCBkaXJlY3Rpb24uIE9yIHNldCBib3RoIHBhcmFtZXRlcnMgdG8gdGhlIHNhbWUgbnVtYmVyIHRvIHBpbg0KICAgIC8vIHRoZSBsaW1pdCB0byB0aGF0IHZhbHVlLg0KICAgIHRoaXMuc2V0V3JhcExpbWl0UmFuZ2UgPSBmdW5jdGlvbihtaW4sIG1heCkgew0KICAgICAgICBpZiAodGhpcy4kd3JhcExpbWl0UmFuZ2UubWluICE9PSBtaW4gfHwgdGhpcy4kd3JhcExpbWl0UmFuZ2UubWF4ICE9PSBtYXgpIHsNCiAgICAgICAgICAgIHRoaXMuJHdyYXBMaW1pdFJhbmdlLm1pbiA9IG1pbjsNCiAgICAgICAgICAgIHRoaXMuJHdyYXBMaW1pdFJhbmdlLm1heCA9IG1heDsNCiAgICAgICAgICAgIHRoaXMuJG1vZGlmaWVkID0gdHJ1ZTsNCiAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBmb3JjZSBhIHJlY2FsY3VsYXRpb24gb2YgdGhlIHdyYXAgbGltaXQNCiAgICAgICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZVdyYXBNb2RlIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gVGhpcyBzaG91bGQgZ2VuZXJhbGx5IG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSByZW5kZXJlciB3aGVuIGEgcmVzaXplDQogICAgLy8gaXMgZGV0ZWN0ZWQuDQogICAgdGhpcy5hZGp1c3RXcmFwTGltaXQgPSBmdW5jdGlvbihkZXNpcmVkTGltaXQpIHsNCiAgICAgICAgdmFyIHdyYXBMaW1pdCA9IHRoaXMuJGNvbnN0cmFpbldyYXBMaW1pdChkZXNpcmVkTGltaXQpOw0KICAgICAgICBpZiAod3JhcExpbWl0ICE9IHRoaXMuJHdyYXBMaW1pdCAmJiB3cmFwTGltaXQgPiAwKSB7DQogICAgICAgICAgICB0aGlzLiR3cmFwTGltaXQgPSB3cmFwTGltaXQ7DQogICAgICAgICAgICB0aGlzLiRtb2RpZmllZCA9IHRydWU7DQogICAgICAgICAgICBpZiAodGhpcy4kdXNlV3JhcE1vZGUpIHsNCiAgICAgICAgICAgICAgICB0aGlzLiR1cGRhdGVXcmFwRGF0YSgwLCB0aGlzLmdldExlbmd0aCgpIC0gMSk7DQogICAgICAgICAgICAgICAgdGhpcy4kcmVzZXRSb3dDYWNoZSgwKQ0KICAgICAgICAgICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZVdyYXBMaW1pdCIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQoNCiAgICB0aGlzLiRjb25zdHJhaW5XcmFwTGltaXQgPSBmdW5jdGlvbih3cmFwTGltaXQpIHsNCiAgICAgICAgdmFyIG1pbiA9IHRoaXMuJHdyYXBMaW1pdFJhbmdlLm1pbjsNCiAgICAgICAgaWYgKG1pbikNCiAgICAgICAgICAgIHdyYXBMaW1pdCA9IE1hdGgubWF4KG1pbiwgd3JhcExpbWl0KTsNCg0KICAgICAgICB2YXIgbWF4ID0gdGhpcy4kd3JhcExpbWl0UmFuZ2UubWF4Ow0KICAgICAgICBpZiAobWF4KQ0KICAgICAgICAgICAgd3JhcExpbWl0ID0gTWF0aC5taW4obWF4LCB3cmFwTGltaXQpOw0KDQogICAgICAgIC8vIFdoYXQgd291bGQgYSBsaW1pdCBvZiAwIGV2ZW4gbWVhbj8NCiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDEsIHdyYXBMaW1pdCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0V3JhcExpbWl0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiR3cmFwTGltaXQ7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0V3JhcExpbWl0UmFuZ2UgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgLy8gQXZvaWQgdW5leHBlY3RlZCBtdXRhdGlvbiBieSByZXR1cm5pbmcgYSBjb3B5DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBtaW4gOiB0aGlzLiR3cmFwTGltaXRSYW5nZS5taW4sDQogICAgICAgICAgICBtYXggOiB0aGlzLiR3cmFwTGltaXRSYW5nZS5tYXgNCiAgICAgICAgfTsNCiAgICB9Ow0KDQogICAgdGhpcy4kdXBkYXRlSW50ZXJuYWxEYXRhT25DaGFuZ2UgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIHZhciB1c2VXcmFwTW9kZSA9IHRoaXMuJHVzZVdyYXBNb2RlOw0KICAgICAgICB2YXIgbGVuOw0KICAgICAgICB2YXIgYWN0aW9uID0gZS5kYXRhLmFjdGlvbjsNCiAgICAgICAgdmFyIGZpcnN0Um93ID0gZS5kYXRhLnJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgdmFyIGxhc3RSb3cgPSBlLmRhdGEucmFuZ2UuZW5kLnJvdzsNCiAgICAgICAgdmFyIHN0YXJ0ID0gZS5kYXRhLnJhbmdlLnN0YXJ0Ow0KICAgICAgICB2YXIgZW5kID0gZS5kYXRhLnJhbmdlLmVuZDsNCiAgICAgICAgdmFyIHJlbW92ZWRGb2xkcyA9IG51bGw7DQoNCiAgICAgICAgaWYgKGFjdGlvbi5pbmRleE9mKCJMaW5lcyIpICE9IC0xKSB7DQogICAgICAgICAgICBpZiAoYWN0aW9uID09ICJpbnNlcnRMaW5lcyIpIHsNCiAgICAgICAgICAgICAgICBsYXN0Um93ID0gZmlyc3RSb3cgKyAoZS5kYXRhLmxpbmVzLmxlbmd0aCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGxhc3RSb3cgPSBmaXJzdFJvdzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxlbiA9IGUuZGF0YS5saW5lcyA/IGUuZGF0YS5saW5lcy5sZW5ndGggOiBsYXN0Um93IC0gZmlyc3RSb3c7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBsZW4gPSBsYXN0Um93IC0gZmlyc3RSb3c7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAobGVuICE9IDApIHsNCiAgICAgICAgICAgIGlmIChhY3Rpb24uaW5kZXhPZigicmVtb3ZlIikgIT0gLTEpIHsNCiAgICAgICAgICAgICAgICB1c2VXcmFwTW9kZSAmJiB0aGlzLiR3cmFwRGF0YS5zcGxpY2UoZmlyc3RSb3csIGxlbik7DQoNCiAgICAgICAgICAgICAgICB2YXIgZm9sZExpbmVzID0gdGhpcy4kZm9sZERhdGE7DQogICAgICAgICAgICAgICAgcmVtb3ZlZEZvbGRzID0gdGhpcy5nZXRGb2xkc0luUmFuZ2UoZS5kYXRhLnJhbmdlKTsNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZvbGRzKHJlbW92ZWRGb2xkcyk7DQoNCiAgICAgICAgICAgICAgICB2YXIgZm9sZExpbmUgPSB0aGlzLmdldEZvbGRMaW5lKGVuZC5yb3cpOw0KICAgICAgICAgICAgICAgIHZhciBpZHggPSAwOw0KICAgICAgICAgICAgICAgIGlmIChmb2xkTGluZSkgew0KICAgICAgICAgICAgICAgICAgICBmb2xkTGluZS5hZGRSZW1vdmVDaGFycyhlbmQucm93LCBlbmQuY29sdW1uLCBzdGFydC5jb2x1bW4gLSBlbmQuY29sdW1uKTsNCiAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUuc2hpZnRSb3coLWxlbik7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIGZvbGRMaW5lQmVmb3JlID0gdGhpcy5nZXRGb2xkTGluZShmaXJzdFJvdyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChmb2xkTGluZUJlZm9yZSAmJiBmb2xkTGluZUJlZm9yZSAhPT0gZm9sZExpbmUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRMaW5lQmVmb3JlLm1lcmdlKGZvbGRMaW5lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRMaW5lID0gZm9sZExpbmVCZWZvcmU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWR4ID0gZm9sZExpbmVzLmluZGV4T2YoZm9sZExpbmUpICsgMTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBmb3IgKGlkeDsgaWR4IDwgZm9sZExpbmVzLmxlbmd0aDsgaWR4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGZvbGRMaW5lID0gZm9sZExpbmVzW2lkeF07DQogICAgICAgICAgICAgICAgICAgIGlmIChmb2xkTGluZS5zdGFydC5yb3cgPj0gZW5kLnJvdykgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUuc2hpZnRSb3coLWxlbik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBsYXN0Um93ID0gZmlyc3RSb3c7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBhcmdzOw0KICAgICAgICAgICAgICAgIGlmICh1c2VXcmFwTW9kZSkgew0KICAgICAgICAgICAgICAgICAgICBhcmdzID0gW2ZpcnN0Um93LCAwXTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgYXJncy5wdXNoKFtdKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy4kd3JhcERhdGEuc3BsaWNlLmFwcGx5KHRoaXMuJHdyYXBEYXRhLCBhcmdzKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBJZiBzb21lIG5ldyBsaW5lIGlzIGFkZGVkIGluc2lkZSBvZiBhIGZvbGRMaW5lLCB0aGVuIHNwbGl0DQogICAgICAgICAgICAgICAgLy8gdGhlIGZvbGQgbGluZSB1cC4NCiAgICAgICAgICAgICAgICB2YXIgZm9sZExpbmVzID0gdGhpcy4kZm9sZERhdGE7DQogICAgICAgICAgICAgICAgdmFyIGZvbGRMaW5lID0gdGhpcy5nZXRGb2xkTGluZShmaXJzdFJvdyk7DQogICAgICAgICAgICAgICAgdmFyIGlkeCA9IDA7DQogICAgICAgICAgICAgICAgaWYgKGZvbGRMaW5lKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjbXAgPSBmb2xkTGluZS5yYW5nZS5jb21wYXJlSW5zaWRlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uKQ0KICAgICAgICAgICAgICAgICAgICAvLyBJbnNpZGUgb2YgdGhlIGZvbGRMaW5lIHJhbmdlLiBOZWVkIHRvIHNwbGl0IHN0dWZmIHVwLg0KICAgICAgICAgICAgICAgICAgICBpZiAoY21wID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRMaW5lID0gZm9sZExpbmUuc3BsaXQoc3RhcnQucm93LCBzdGFydC5jb2x1bW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUuc2hpZnRSb3cobGVuKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRMaW5lLmFkZFJlbW92ZUNoYXJzKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RSb3csIDAsIGVuZC5jb2x1bW4gLSBzdGFydC5jb2x1bW4pOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UNCiAgICAgICAgICAgICAgICAgICAgLy8gSW5mcm9udCBvZiB0aGUgZm9sZExpbmUgYnV0IHNhbWUgcm93LiBOZWVkIHRvIHNoaWZ0IGNvbHVtbi4NCiAgICAgICAgICAgICAgICAgICAgaWYgKGNtcCA9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUuYWRkUmVtb3ZlQ2hhcnMoZmlyc3RSb3csIDAsIGVuZC5jb2x1bW4gLSBzdGFydC5jb2x1bW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUuc2hpZnRSb3cobGVuKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIHRoZSBpbnNlcnQgaXMgYWZ0ZXIgdGhlIGZvbGRMaW5lLg0KICAgICAgICAgICAgICAgICAgICBpZHggPSBmb2xkTGluZXMuaW5kZXhPZihmb2xkTGluZSkgKyAxOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGZvciAoaWR4OyBpZHggPCBmb2xkTGluZXMubGVuZ3RoOyBpZHgrKykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZm9sZExpbmUgPSBmb2xkTGluZXNbaWR4XTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGRMaW5lLnN0YXJ0LnJvdyA+PSBmaXJzdFJvdykgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUuc2hpZnRSb3cobGVuKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIC8vIFJlYWxpZ24gZm9sZHMuIEUuZy4gaWYgeW91IGFkZCBzb21lIG5ldyBjaGFycyBiZWZvcmUgYSBmb2xkLCB0aGUNCiAgICAgICAgICAgIC8vIGZvbGQgc2hvdWxkICJtb3ZlIiB0byB0aGUgcmlnaHQuDQogICAgICAgICAgICBsZW4gPSBNYXRoLmFicyhlLmRhdGEucmFuZ2Uuc3RhcnQuY29sdW1uIC0gZS5kYXRhLnJhbmdlLmVuZC5jb2x1bW4pOw0KICAgICAgICAgICAgaWYgKGFjdGlvbi5pbmRleE9mKCJyZW1vdmUiKSAhPSAtMSkgew0KICAgICAgICAgICAgICAgIC8vIEdldCBhbGwgdGhlIGZvbGRzIGluIHRoZSBjaGFuZ2UgcmFuZ2UgYW5kIHJlbW92ZSB0aGVtLg0KICAgICAgICAgICAgICAgIHJlbW92ZWRGb2xkcyA9IHRoaXMuZ2V0Rm9sZHNJblJhbmdlKGUuZGF0YS5yYW5nZSk7DQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGb2xkcyhyZW1vdmVkRm9sZHMpOw0KDQogICAgICAgICAgICAgICAgbGVuID0gLWxlbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBmb2xkTGluZSA9IHRoaXMuZ2V0Rm9sZExpbmUoZmlyc3RSb3cpOw0KICAgICAgICAgICAgaWYgKGZvbGRMaW5lKSB7DQogICAgICAgICAgICAgICAgZm9sZExpbmUuYWRkUmVtb3ZlQ2hhcnMoZmlyc3RSb3csIHN0YXJ0LmNvbHVtbiwgbGVuKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh1c2VXcmFwTW9kZSAmJiB0aGlzLiR3cmFwRGF0YS5sZW5ndGggIT0gdGhpcy5kb2MuZ2V0TGVuZ3RoKCkpIHsNCiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoImRvYy5nZXRMZW5ndGgoKSBhbmQgJHdyYXBEYXRhLmxlbmd0aCBoYXZlIHRvIGJlIHRoZSBzYW1lISIpOw0KICAgICAgICB9DQoNCiAgICAgICAgdXNlV3JhcE1vZGUgJiYgdGhpcy4kdXBkYXRlV3JhcERhdGEoZmlyc3RSb3csIGxhc3RSb3cpOw0KDQogICAgICAgIHJldHVybiByZW1vdmVkRm9sZHM7DQogICAgfTsNCg0KICAgIHRoaXMuJHVwZGF0ZVdyYXBEYXRhID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgdmFyIGxpbmVzID0gdGhpcy5kb2MuZ2V0QWxsTGluZXMoKTsNCiAgICAgICAgdmFyIHRhYlNpemUgPSB0aGlzLmdldFRhYlNpemUoKTsNCiAgICAgICAgdmFyIHdyYXBEYXRhID0gdGhpcy4kd3JhcERhdGE7DQogICAgICAgIHZhciB3cmFwTGltaXQgPSB0aGlzLiR3cmFwTGltaXQ7DQogICAgICAgIHZhciB0b2tlbnM7DQogICAgICAgIHZhciBmb2xkTGluZTsNCg0KICAgICAgICB2YXIgcm93ID0gZmlyc3RSb3c7DQogICAgICAgIGxhc3RSb3cgPSBNYXRoLm1pbihsYXN0Um93LCBsaW5lcy5sZW5ndGggLSAxKTsNCiAgICAgICAgd2hpbGUgKHJvdyA8PSBsYXN0Um93KSB7DQogICAgICAgICAgICBmb2xkTGluZSA9IHRoaXMuZ2V0Rm9sZExpbmUocm93LCBmb2xkTGluZSk7DQogICAgICAgICAgICBpZiAoIWZvbGRMaW5lKSB7DQogICAgICAgICAgICAgICAgdG9rZW5zID0gdGhpcy4kZ2V0RGlzcGxheVRva2VucyhsYW5nLnN0cmluZ1RyaW1SaWdodChsaW5lc1tyb3ddKSk7DQogICAgICAgICAgICAgICAgd3JhcERhdGFbcm93XSA9IHRoaXMuJGNvbXB1dGVXcmFwU3BsaXRzKHRva2Vucywgd3JhcExpbWl0LCB0YWJTaXplKTsNCiAgICAgICAgICAgICAgICByb3cgKys7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHRva2VucyA9IFtdOw0KICAgICAgICAgICAgICAgIGZvbGRMaW5lLndhbGsoDQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHBsYWNlaG9sZGVyLCByb3csIGNvbHVtbiwgbGFzdENvbHVtbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdhbGtUb2tlbnM7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxhY2Vob2xkZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrVG9rZW5zID0gdGhpcy4kZ2V0RGlzcGxheVRva2VucygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXIsIHRva2Vucy5sZW5ndGgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtUb2tlbnNbMF0gPSBQTEFDRUhPTERFUl9TVEFSVDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHdhbGtUb2tlbnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa1Rva2Vuc1tpXSA9IFBMQUNFSE9MREVSX0JPRFk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrVG9rZW5zID0gdGhpcy4kZ2V0RGlzcGxheVRva2VucygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbcm93XS5zdWJzdHJpbmcobGFzdENvbHVtbiwgY29sdW1uKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0b2tlbnMuY29uY2F0KHdhbGtUb2tlbnMpOw0KICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksDQogICAgICAgICAgICAgICAgICAgIGZvbGRMaW5lLmVuZC5yb3csDQogICAgICAgICAgICAgICAgICAgIGxpbmVzW2ZvbGRMaW5lLmVuZC5yb3ddLmxlbmd0aCArIDENCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBzcGFjZXMvdGFicyBmcm9tIHRoZSBiYWNrIG9mIHRoZSB0b2tlbiBhcnJheS4NCiAgICAgICAgICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCAhPSAwICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0gPj0gU1BBQ0UpDQogICAgICAgICAgICAgICAgICAgIHRva2Vucy5wb3AoKTsNCg0KICAgICAgICAgICAgICAgIHdyYXBEYXRhW2ZvbGRMaW5lLnN0YXJ0LnJvd10NCiAgICAgICAgICAgICAgICAgICAgPSB0aGlzLiRjb21wdXRlV3JhcFNwbGl0cyh0b2tlbnMsIHdyYXBMaW1pdCwgdGFiU2l6ZSk7DQogICAgICAgICAgICAgICAgcm93ID0gZm9sZExpbmUuZW5kLnJvdyArIDE7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gIlRva2VucyINCiAgICB2YXIgQ0hBUiA9IDEsDQogICAgICAgIENIQVJfRVhUID0gMiwNCiAgICAgICAgUExBQ0VIT0xERVJfU1RBUlQgPSAzLA0KICAgICAgICBQTEFDRUhPTERFUl9CT0RZID0gIDQsDQogICAgICAgIFBVTkNUVUFUSU9OID0gOSwNCiAgICAgICAgU1BBQ0UgPSAxMCwNCiAgICAgICAgVEFCID0gMTEsDQogICAgICAgIFRBQl9TUEFDRSA9IDEyOw0KDQogICAgdGhpcy4kY29tcHV0ZVdyYXBTcGxpdHMgPSBmdW5jdGlvbih0b2tlbnMsIHdyYXBMaW1pdCkgew0KICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PSAwKSB7DQogICAgICAgICAgICByZXR1cm4gW107DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgc3BsaXRzID0gW107DQogICAgICAgIHZhciBkaXNwbGF5TGVuZ3RoID0gdG9rZW5zLmxlbmd0aDsNCiAgICAgICAgdmFyIGxhc3RTcGxpdCA9IDAsIGxhc3REb2NTcGxpdCA9IDA7DQoNCiAgICAgICAgZnVuY3Rpb24gYWRkU3BsaXQoc2NyZWVuUG9zKSB7DQogICAgICAgICAgICB2YXIgZGlzcGxheWVkID0gdG9rZW5zLnNsaWNlKGxhc3RTcGxpdCwgc2NyZWVuUG9zKTsNCg0KICAgICAgICAgICAgLy8gVGhlIGRvY3VtZW50IHNpemUgaXMgdGhlIGN1cnJlbnQgc2l6ZSAtIHRoZSBleHRyYSB3aWR0aCBmb3IgdGFicw0KICAgICAgICAgICAgLy8gYW5kIG11bHRpcGxlV2lkdGggY2hhcmFjdGVycy4NCiAgICAgICAgICAgIHZhciBsZW4gPSBkaXNwbGF5ZWQubGVuZ3RoOw0KICAgICAgICAgICAgZGlzcGxheWVkLmpvaW4oIiIpLg0KICAgICAgICAgICAgICAgIC8vIEdldCBhbGwgdGhlIFRBQl9TUEFDRXMuDQogICAgICAgICAgICAgICAgcmVwbGFjZSgvMTIvZywgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgICAgIGxlbiAtPSAxOw0KICAgICAgICAgICAgICAgIH0pLg0KICAgICAgICAgICAgICAgIC8vIEdldCBhbGwgdGhlIENIQVJfRVhUL211bHRpcGxlV2lkdGggY2hhcmFjdGVycy4NCiAgICAgICAgICAgICAgICByZXBsYWNlKC8yL2csIGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMTsNCiAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgbGFzdERvY1NwbGl0ICs9IGxlbjsNCiAgICAgICAgICAgIHNwbGl0cy5wdXNoKGxhc3REb2NTcGxpdCk7DQogICAgICAgICAgICBsYXN0U3BsaXQgPSBzY3JlZW5Qb3M7DQogICAgICAgIH0NCg0KICAgICAgICB3aGlsZSAoZGlzcGxheUxlbmd0aCAtIGxhc3RTcGxpdCA+IHdyYXBMaW1pdCkgew0KICAgICAgICAgICAgLy8gVGhpcyBpcywgd2hlcmUgdGhlIHNwbGl0IHNob3VsZCBiZS4NCiAgICAgICAgICAgIHZhciBzcGxpdCA9IGxhc3RTcGxpdCArIHdyYXBMaW1pdDsNCg0KICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBzcGFjZSBvciB0YWIgYXQgdGhpcyBzcGxpdCBwb3NpdGlvbiwgdGhlbiBtYWtpbmcNCiAgICAgICAgICAgIC8vIGEgc3BsaXQgaXMgc2ltcGxlLg0KICAgICAgICAgICAgaWYgKHRva2Vuc1tzcGxpdF0gPj0gU1BBQ0UpIHsNCiAgICAgICAgICAgICAgICAvLyBJbmNsdWRlIGFsbCBmb2xsb3dpbmcgc3BhY2VzICsgdGFicyBpbiB0aGlzIHNwbGl0IGFzIHdlbGwuDQogICAgICAgICAgICAgICAgd2hpbGUgKHRva2Vuc1tzcGxpdF0gPj0gU1BBQ0UpIHsNCiAgICAgICAgICAgICAgICAgICAgc3BsaXQgKys7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGFkZFNwbGl0KHNwbGl0KTsNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gPT09IEVMU0UgPT09DQogICAgICAgICAgICAvLyBDaGVjayBpZiBzcGxpdCBpcyBpbnNpZGUgb2YgYSBwbGFjZWhvbGRlci4gUGxhY2Vob2xkZXIgYXJlDQogICAgICAgICAgICAvLyBub3Qgc3BsaXRhYmxlLiBUaGVyZWZvcmUsIHNlZWsgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGxhY2Vob2xkZXINCiAgICAgICAgICAgIC8vIGFuZCB0cnkgdG8gcGxhY2UgdGhlIHNwbGl0IGJlb2ZyZSB0aGUgcGxhY2Vob2xkZXIncyBzdGFydC4NCiAgICAgICAgICAgIGlmICh0b2tlbnNbc3BsaXRdID09IFBMQUNFSE9MREVSX1NUQVJUDQogICAgICAgICAgICAgICAgfHwgdG9rZW5zW3NwbGl0XSA9PSBQTEFDRUhPTERFUl9CT0RZKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIFNlZWsgdGhlIHN0YXJ0IG9mIHRoZSBwbGFjZWhvbGRlciBhbmQgZG8gdGhlIHNwbGl0DQogICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBwbGFjZWhvbGRlci4gQnkgZGVmaW5pdGlvbiB0aGVyZSBhbHdheXMNCiAgICAgICAgICAgICAgICAvLyBhIFBMQUNFSE9MREVSX1NUQVJUIGJldHdlZW4gc3BsaXQgYW5kIGxhc3RTcGxpdC4NCiAgICAgICAgICAgICAgICBmb3IgKHNwbGl0OyBzcGxpdCAhPSBsYXN0U3BsaXQgLSAxOyBzcGxpdC0tKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbc3BsaXRdID09IFBMQUNFSE9MREVSX1NUQVJUKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCsrOyA8PCBObyBpbmNyZW1lbnRhbCBoZXJlIGFzIHdlIHdhbnQgdG8NCiAgICAgICAgICAgICAgICAgICAgICAgIC8vICBoYXZlIHRoZSBwb3NpdGlvbiBiZWZvcmUgdGhlIFBsYWNlaG9sZGVyLg0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgUExBQ0VIT0xERVJfU1RBUlQgaXMgbm90IHRoZSBpbmRleCBvZiB0aGUNCiAgICAgICAgICAgICAgICAvLyBsYXN0IHNwbGl0LCB0aGVuIHdlIGNhbiBkbyB0aGUgc3BsaXQNCiAgICAgICAgICAgICAgICBpZiAoc3BsaXQgPiBsYXN0U3BsaXQpIHsNCiAgICAgICAgICAgICAgICAgICAgYWRkU3BsaXQoc3BsaXQpOw0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgUExBQ0VIT0xERVJfU1RBUlQgSVMgdGhlIGluZGV4IG9mIHRoZSBsYXN0DQogICAgICAgICAgICAgICAgLy8gc3BsaXQsIHRoZW4gd2UgaGF2ZSB0byBwbGFjZSB0aGUgc3BsaXQgYWZ0ZXIgdGhlDQogICAgICAgICAgICAgICAgLy8gcGxhY2Vob2xkZXIuIFNvLCBsZXQncyBzZWVrIGZvciB0aGUgZW5kIG9mIHRoZSBwbGFjZWhvbGRlci4NCiAgICAgICAgICAgICAgICBzcGxpdCA9IGxhc3RTcGxpdCArIHdyYXBMaW1pdDsNCiAgICAgICAgICAgICAgICBmb3IgKHNwbGl0OyBzcGxpdCA8IHRva2Vucy5sZW5ndGg7IHNwbGl0KyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1tzcGxpdF0gIT0gUExBQ0VIT0xERVJfQk9EWSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBJZiBzcGlsdCA9PSB0b2tlbnMubGVuZ3RoLCB0aGVuIHRoZSBwbGFjZWhvbGRlciBpcyB0aGUgbGFzdA0KICAgICAgICAgICAgICAgIC8vIHRoaW5nIGluIHRoZSBsaW5lIGFuZCBhZGRpbmcgYSBuZXcgc3BsaXQgZG9lc24ndCBtYWtlIHNlbnNlLg0KICAgICAgICAgICAgICAgIGlmIChzcGxpdCA9PSB0b2tlbnMubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gQnJlYWtzIHRoZSB3aGlsZS1sb29wLg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIEZpbmFsbHksIGFkZCB0aGUgc3BsaXQuLi4NCiAgICAgICAgICAgICAgICBhZGRTcGxpdChzcGxpdCk7DQogICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vID09PSBFTFNFID09PQ0KICAgICAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgZmlyc3Qgbm9uIHNwYWNlL3RhYi9wbGFjZWhvbGRlci9wdW5jdHVhdGlvbiB0b2tlbiBiYWNrd2FyZHMuDQogICAgICAgICAgICB2YXIgbWluU3BsaXQgPSBNYXRoLm1heChzcGxpdCAtIDEwLCBsYXN0U3BsaXQgLSAxKTsNCiAgICAgICAgICAgIHdoaWxlIChzcGxpdCA+IG1pblNwbGl0ICYmIHRva2Vuc1tzcGxpdF0gPCBQTEFDRUhPTERFUl9TVEFSVCkgew0KICAgICAgICAgICAgICAgIHNwbGl0IC0tOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgd2hpbGUgKHNwbGl0ID4gbWluU3BsaXQgJiYgdG9rZW5zW3NwbGl0XSA9PSBQVU5DVFVBVElPTikgew0KICAgICAgICAgICAgICAgIHNwbGl0IC0tOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gSWYgd2UgZm91bmQgb25lLCB0aGVuIGFkZCB0aGUgc3BsaXQuDQogICAgICAgICAgICBpZiAoc3BsaXQgPiBtaW5TcGxpdCkgew0KICAgICAgICAgICAgICAgIGFkZFNwbGl0KCsrc3BsaXQpOw0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyA9PT0gRUxTRSA9PT0NCiAgICAgICAgICAgIHNwbGl0ID0gbGFzdFNwbGl0ICsgd3JhcExpbWl0Ow0KICAgICAgICAgICAgLy8gVGhlIHNwbGl0IGlzIGluc2lkZSBvZiBhIENIQVIgb3IgQ0hBUl9FWFQgdG9rZW4gYW5kIG5vIHNwYWNlDQogICAgICAgICAgICAvLyBhcm91bmQgLT4gZm9yY2UgYSBzcGxpdC4NCiAgICAgICAgICAgIGFkZFNwbGl0KHNwbGl0KTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gc3BsaXRzOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEBwYXJhbQ0KICAgICAqICAgb2Zmc2V0OiBUaGUgb2Zmc2V0IGluIHNjcmVlbkNvbHVtbiBhdCB3aGljaCBwb3NpdGlvbiBzdHIgc3RhcnRzLg0KICAgICAqICAgICAgICAgICBJbXBvcnRhbnQgZm9yIGNhbGN1bGF0aW5nIHRoZSByZWFsVGFiU2l6ZS4NCiAgICAgKi8NCiAgICB0aGlzLiRnZXREaXNwbGF5VG9rZW5zID0gZnVuY3Rpb24oc3RyLCBvZmZzZXQpIHsNCiAgICAgICAgdmFyIGFyciA9IFtdOw0KICAgICAgICB2YXIgdGFiU2l6ZTsNCiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7DQoNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBjID0gc3RyLmNoYXJDb2RlQXQoaSk7DQogICAgICAgICAgICAvLyBUYWINCiAgICAgICAgICAgIGlmIChjID09IDkpIHsNCiAgICAgICAgICAgICAgICB0YWJTaXplID0gdGhpcy5nZXRTY3JlZW5UYWJTaXplKGFyci5sZW5ndGggKyBvZmZzZXQpOw0KICAgICAgICAgICAgICAgIGFyci5wdXNoKFRBQik7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDE7IG4gPCB0YWJTaXplOyBuKyspIHsNCiAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2goVEFCX1NQQUNFKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBTcGFjZQ0KICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAzMikgew0KICAgICAgICAgICAgICAgIGFyci5wdXNoKFNQQUNFKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZigoYyA+IDM5ICYmIGMgPCA0OCkgfHwgKGMgPiA1NyAmJiBjIDwgNjQpKSB7DQogICAgICAgICAgICAgICAgYXJyLnB1c2goUFVOQ1RVQVRJT04pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gZnVsbCB3aWR0aCBjaGFyYWN0ZXJzDQogICAgICAgICAgICBlbHNlIGlmIChjID49IDB4MTEwMCAmJiBpc0Z1bGxXaWR0aChjKSkgew0KICAgICAgICAgICAgICAgIGFyci5wdXNoKENIQVIsIENIQVJfRVhUKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgYXJyLnB1c2goQ0hBUik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGFycjsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCBvZiB0aGUgYSBzdHJpbmcgb24gdGhlIHNjcmVlbiB3aGlsZSBhc3N1bWluZyB0aGF0DQogICAgICogdGhlIHN0cmluZyBzdGFydHMgYXQgdGhlIGZpcnN0IGNvbHVtbiBvbiB0aGUgc2NyZWVuLg0KICAgICAqDQogICAgICogQHBhcmFtIHN0cmluZyBzdHIgU3RyaW5nIHRvIGNhbGN1bGF0ZSB0aGUgc2NyZWVuIHdpZHRoIG9mDQogICAgICogQHJldHVybiBhcnJheQ0KICAgICAqICAgICAgWzBdOiBudW1iZXIgb2YgY29sdW1ucyBmb3Igc3RyIG9uIHNjcmVlbi4NCiAgICAgKiAgICAgIFsxXTogZG9jQ29sdW1uIHBvc2l0aW9uIHRoYXQgd2FzIHJlYWQgdW50aWwgKHVzZWZ1bCB3aXRoIHNjcmVlbkNvbHVtbikNCiAgICAgKi8NCiAgICB0aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aCA9IGZ1bmN0aW9uKHN0ciwgbWF4U2NyZWVuQ29sdW1uLCBzY3JlZW5Db2x1bW4pIHsNCiAgICAgICAgaWYgKG1heFNjcmVlbkNvbHVtbiA9PSAwKSB7DQogICAgICAgICAgICByZXR1cm4gWzAsIDBdOw0KICAgICAgICB9DQogICAgICAgIGlmIChtYXhTY3JlZW5Db2x1bW4gPT0gbnVsbCkgew0KICAgICAgICAgICAgbWF4U2NyZWVuQ29sdW1uID0gc2NyZWVuQ29sdW1uICsNCiAgICAgICAgICAgICAgICBzdHIubGVuZ3RoICogTWF0aC5tYXgodGhpcy5nZXRUYWJTaXplKCksIDIpOw0KICAgICAgICB9DQogICAgICAgIHNjcmVlbkNvbHVtbiA9IHNjcmVlbkNvbHVtbiB8fCAwOw0KDQogICAgICAgIHZhciBjLCBjb2x1bW47DQogICAgICAgIGZvciAoY29sdW1uID0gMDsgY29sdW1uIDwgc3RyLmxlbmd0aDsgY29sdW1uKyspIHsNCiAgICAgICAgICAgIGMgPSBzdHIuY2hhckNvZGVBdChjb2x1bW4pOw0KICAgICAgICAgICAgLy8gdGFiDQogICAgICAgICAgICBpZiAoYyA9PSA5KSB7DQogICAgICAgICAgICAgICAgc2NyZWVuQ29sdW1uICs9IHRoaXMuZ2V0U2NyZWVuVGFiU2l6ZShzY3JlZW5Db2x1bW4pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gZnVsbCB3aWR0aCBjaGFyYWN0ZXJzDQogICAgICAgICAgICBlbHNlIGlmIChjID49IDB4MTEwMCAmJiBpc0Z1bGxXaWR0aChjKSkgew0KICAgICAgICAgICAgICAgIHNjcmVlbkNvbHVtbiArPSAyOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBzY3JlZW5Db2x1bW4gKz0gMTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChzY3JlZW5Db2x1bW4gPiBtYXhTY3JlZW5Db2x1bW4pIHsNCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIFtzY3JlZW5Db2x1bW4sIGNvbHVtbl07DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgcmVxdWlyZWQgdG8gcmVuZGVyIHRoaXMgcm93IG9uIHRoZSBzY3JlZW4NCiAgICAgKi8NCiAgICB0aGlzLmdldFJvd0xlbmd0aCA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICBpZiAoIXRoaXMuJHVzZVdyYXBNb2RlIHx8ICF0aGlzLiR3cmFwRGF0YVtyb3ddKSB7DQogICAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLiR3cmFwRGF0YVtyb3ddLmxlbmd0aCArIDE7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgaW4gcGl4ZWxzIHJlcXVpcmVkIHRvIHJlbmRlciB0aGlzIHJvdyBvbiB0aGUgc2NyZWVuDQogICAgICoqLw0KICAgIHRoaXMuZ2V0Um93SGVpZ2h0ID0gZnVuY3Rpb24oY29uZmlnLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Um93TGVuZ3RoKHJvdykgKiBjb25maWcubGluZUhlaWdodDsNCiAgICB9DQoNCiAgICB0aGlzLmdldFNjcmVlbkxhc3RSb3dDb2x1bW4gPSBmdW5jdGlvbihzY3JlZW5Sb3cpIHsNCiAgICAgICAgLy9yZXR1cm4gdGhpcy5zY3JlZW5Ub0RvY3VtZW50Q29sdW1uKHNjcmVlblJvdywgTnVtYmVyLk1BWF9WQUxVRSAvIDEwKQ0KICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudFRvU2NyZWVuQ29sdW1uKHNjcmVlblJvdywgdGhpcy5kb2MuZ2V0TGluZShzY3JlZW5Sb3cpLmxlbmd0aCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0RG9jdW1lbnRMYXN0Um93Q29sdW1uID0gZnVuY3Rpb24oZG9jUm93LCBkb2NDb2x1bW4pIHsNCiAgICAgICAgdmFyIHNjcmVlblJvdyA9IHRoaXMuZG9jdW1lbnRUb1NjcmVlblJvdyhkb2NSb3csIGRvY0NvbHVtbik7DQogICAgICAgIHJldHVybiB0aGlzLmdldFNjcmVlbkxhc3RSb3dDb2x1bW4oc2NyZWVuUm93KTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXREb2N1bWVudExhc3RSb3dDb2x1bW5Qb3NpdGlvbiA9IGZ1bmN0aW9uKGRvY1JvdywgZG9jQ29sdW1uKSB7DQogICAgICAgIHZhciBzY3JlZW5Sb3cgPSB0aGlzLmRvY3VtZW50VG9TY3JlZW5Sb3coZG9jUm93LCBkb2NDb2x1bW4pOw0KICAgICAgICByZXR1cm4gdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oc2NyZWVuUm93LCBOdW1iZXIuTUFYX1ZBTFVFIC8gMTApOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFJvd1NwbGl0RGF0YSA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICBpZiAoIXRoaXMuJHVzZVdyYXBNb2RlKSB7DQogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHdyYXBEYXRhW3Jvd107DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogUmV0dXJucyB0aGUgd2lkdGggb2YgYSB0YWIgY2hhcmFjdGVyIGF0IHNjcmVlbkNvbHVtbi4NCiAgICAgKi8NCiAgICB0aGlzLmdldFNjcmVlblRhYlNpemUgPSBmdW5jdGlvbihzY3JlZW5Db2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHRhYlNpemUgLSBzY3JlZW5Db2x1bW4gJSB0aGlzLiR0YWJTaXplOw0KICAgIH07DQoNCiAgICB0aGlzLnNjcmVlblRvRG9jdW1lbnRSb3cgPSBmdW5jdGlvbihzY3JlZW5Sb3csIHNjcmVlbkNvbHVtbikgew0KICAgICAgICByZXR1cm4gdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oc2NyZWVuUm93LCBzY3JlZW5Db2x1bW4pLnJvdzsNCiAgICB9Ow0KDQogICAgdGhpcy5zY3JlZW5Ub0RvY3VtZW50Q29sdW1uID0gZnVuY3Rpb24oc2NyZWVuUm93LCBzY3JlZW5Db2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKHNjcmVlblJvdywgc2NyZWVuQ29sdW1uKS5jb2x1bW47DQogICAgfTsNCg0KICAgIHRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uID0gZnVuY3Rpb24oc2NyZWVuUm93LCBzY3JlZW5Db2x1bW4pIHsNCiAgICAgICAgaWYgKHNjcmVlblJvdyA8IDApIHsNCiAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgcm93OiAwLA0KICAgICAgICAgICAgICAgIGNvbHVtbjogMA0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGxpbmU7DQogICAgICAgIHZhciBkb2NSb3cgPSAwOw0KICAgICAgICB2YXIgZG9jQ29sdW1uID0gMDsNCiAgICAgICAgdmFyIGNvbHVtbjsNCiAgICAgICAgdmFyIHJvdyA9IDA7DQogICAgICAgIHZhciByb3dMZW5ndGggPSAwOw0KDQogICAgICAgIHZhciByb3dDYWNoZSA9IHRoaXMuJHJvd0NhY2hlOw0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd0NhY2hlLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAocm93Q2FjaGVbaV0uc2NyZWVuUm93IDwgc2NyZWVuUm93KSB7DQogICAgICAgICAgICAgICAgcm93ID0gcm93Q2FjaGVbaV0uc2NyZWVuUm93Ow0KICAgICAgICAgICAgICAgIGRvY1JvdyA9IHJvd0NhY2hlW2ldLmRvY1JvdzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHZhciBkb0NhY2hlID0gIXJvd0NhY2hlLmxlbmd0aCB8fCBpID09IHJvd0NhY2hlLmxlbmd0aDsNCg0KICAgICAgICB2YXIgbWF4Um93ID0gdGhpcy5nZXRMZW5ndGgoKSAtIDE7DQogICAgICAgIHZhciBmb2xkTGluZSA9IHRoaXMuZ2V0TmV4dEZvbGRMaW5lKGRvY1Jvdyk7DQogICAgICAgIHZhciBmb2xkU3RhcnQgPSBmb2xkTGluZSA/IGZvbGRMaW5lLnN0YXJ0LnJvdyA6IEluZmluaXR5Ow0KDQogICAgICAgIHdoaWxlIChyb3cgPD0gc2NyZWVuUm93KSB7DQogICAgICAgICAgICByb3dMZW5ndGggPSB0aGlzLmdldFJvd0xlbmd0aChkb2NSb3cpOw0KICAgICAgICAgICAgaWYgKHJvdyArIHJvd0xlbmd0aCAtIDEgPj0gc2NyZWVuUm93IHx8IGRvY1JvdyA+PSBtYXhSb3cpIHsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcm93ICs9IHJvd0xlbmd0aDsNCiAgICAgICAgICAgICAgICBkb2NSb3crKzsNCiAgICAgICAgICAgICAgICBpZiAoZG9jUm93ID4gZm9sZFN0YXJ0KSB7DQogICAgICAgICAgICAgICAgICAgIGRvY1JvdyA9IGZvbGRMaW5lLmVuZC5yb3crMTsNCiAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUgPSB0aGlzLmdldE5leHRGb2xkTGluZShkb2NSb3csIGZvbGRMaW5lKTsNCiAgICAgICAgICAgICAgICAgICAgZm9sZFN0YXJ0ID0gZm9sZExpbmUgPyBmb2xkTGluZS5zdGFydC5yb3cgOiBJbmZpbml0eTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoZG9DYWNoZSkgew0KICAgICAgICAgICAgICAgIHJvd0NhY2hlLnB1c2goew0KICAgICAgICAgICAgICAgICAgICBkb2NSb3c6IGRvY1JvdywNCiAgICAgICAgICAgICAgICAgICAgc2NyZWVuUm93OiByb3cNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChmb2xkTGluZSAmJiBmb2xkTGluZS5zdGFydC5yb3cgPD0gZG9jUm93KSB7DQogICAgICAgICAgICBsaW5lID0gdGhpcy5nZXRGb2xkRGlzcGxheUxpbmUoZm9sZExpbmUpOw0KICAgICAgICAgICAgZG9jUm93ID0gZm9sZExpbmUuc3RhcnQucm93Ow0KICAgICAgICB9IGVsc2UgaWYgKHJvdyArIHJvd0xlbmd0aCA8PSBzY3JlZW5Sb3cgfHwgZG9jUm93ID4gbWF4Um93KSB7DQogICAgICAgICAgICAvLyBjbGlwIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50DQogICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgIHJvdzogbWF4Um93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5nZXRMaW5lKG1heFJvdykubGVuZ3RoDQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBsaW5lID0gdGhpcy5nZXRMaW5lKGRvY1Jvdyk7DQogICAgICAgICAgICBmb2xkTGluZSA9IG51bGw7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy4kdXNlV3JhcE1vZGUpIHsNCiAgICAgICAgICAgIHZhciBzcGxpdHMgPSB0aGlzLiR3cmFwRGF0YVtkb2NSb3ddOw0KICAgICAgICAgICAgaWYgKHNwbGl0cykgew0KICAgICAgICAgICAgICAgIGNvbHVtbiA9IHNwbGl0c1tzY3JlZW5Sb3cgLSByb3ddOw0KICAgICAgICAgICAgICAgIGlmKHNjcmVlblJvdyA+IHJvdyAmJiBzcGxpdHMubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgIGRvY0NvbHVtbiA9IHNwbGl0c1tzY3JlZW5Sb3cgLSByb3cgLSAxXSB8fCBzcGxpdHNbc3BsaXRzLmxlbmd0aCAtIDFdOw0KICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcoZG9jQ29sdW1uKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBkb2NDb2x1bW4gKz0gdGhpcy4kZ2V0U3RyaW5nU2NyZWVuV2lkdGgobGluZSwgc2NyZWVuQ29sdW1uKVsxXTsNCg0KICAgICAgICAvLyBOZWVkIHRvIGRvIHNvbWUgY2xhbXBpbmcgYWN0aW9uIGhlcmUuDQogICAgICAgIGlmICh0aGlzLiR1c2VXcmFwTW9kZSkgew0KICAgICAgICAgICAgaWYgKGRvY0NvbHVtbiA+PSBjb2x1bW4pIHsNCiAgICAgICAgICAgICAgICAvLyBXZSByZW1vdmUgb25lIGNoYXJhY3RlciBhdCB0aGUgZW5kIHN1Y2ggdGhhdCB0aGUgZG9jQ29sdW1uDQogICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gcmV0dXJuZWQgaXMgbm90IGFzc29jaWF0ZWQgdG8gdGhlIG5leHQgcm93IG9uIHRoZQ0KICAgICAgICAgICAgICAgIC8vIHNjcmVlbi4NCiAgICAgICAgICAgICAgICBkb2NDb2x1bW4gPSBjb2x1bW4gLSAxOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG9jQ29sdW1uID0gTWF0aC5taW4oZG9jQ29sdW1uLCBsaW5lLmxlbmd0aCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZm9sZExpbmUpIHsNCiAgICAgICAgICAgIHJldHVybiBmb2xkTGluZS5pZHhUb1Bvc2l0aW9uKGRvY0NvbHVtbik7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgcm93OiBkb2NSb3csDQogICAgICAgICAgICBjb2x1bW46IGRvY0NvbHVtbg0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uID0gZnVuY3Rpb24oZG9jUm93LCBkb2NDb2x1bW4pIHsNCiAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBwYXNzZWQgaW4gYXJndW1lbnRzLg0KICAgICAgICBpZiAodHlwZW9mIGRvY0NvbHVtbiA9PT0gInVuZGVmaW5lZCIpDQogICAgICAgICAgICB2YXIgcG9zID0gdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChkb2NSb3cucm93LCBkb2NSb3cuY29sdW1uKTsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgcG9zID0gdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChkb2NSb3csIGRvY0NvbHVtbik7DQoNCiAgICAgICAgZG9jUm93ID0gcG9zLnJvdzsNCiAgICAgICAgZG9jQ29sdW1uID0gcG9zLmNvbHVtbjsNCg0KICAgICAgICB2YXIgd3JhcERhdGE7DQogICAgICAgIC8vIFNwZWNpYWwgY2FzZSBpbiB3cmFwTW9kZSBpZiB0aGUgZG9jIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50Lg0KICAgICAgICBpZiAodGhpcy4kdXNlV3JhcE1vZGUpIHsNCiAgICAgICAgICAgIHdyYXBEYXRhID0gdGhpcy4kd3JhcERhdGE7DQogICAgICAgICAgICBpZiAoZG9jUm93ID4gd3JhcERhdGEubGVuZ3RoIC0gMSkgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHJvdzogdGhpcy5nZXRTY3JlZW5MZW5ndGgoKSwNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB3cmFwRGF0YS5sZW5ndGggPT0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgPyAwDQogICAgICAgICAgICAgICAgICAgICAgICA6ICh3cmFwRGF0YVt3cmFwRGF0YS5sZW5ndGggLSAxXS5sZW5ndGggLSAxKQ0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgc2NyZWVuUm93ID0gMDsNCiAgICAgICAgdmFyIGZvbGRTdGFydFJvdyA9IG51bGw7DQogICAgICAgIHZhciBmb2xkID0gbnVsbDsNCg0KICAgICAgICAvLyBDbGFtcCB0aGUgZG9jUm93IHBvc2l0aW9uIGluIGNhc2UgaXQncyBpbnNpZGUgb2YgYSBmb2xkZWQgYmxvY2suDQogICAgICAgIGZvbGQgPSB0aGlzLmdldEZvbGRBdChkb2NSb3csIGRvY0NvbHVtbiwgMSk7DQogICAgICAgIGlmIChmb2xkKSB7DQogICAgICAgICAgICBkb2NSb3cgPSBmb2xkLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgIGRvY0NvbHVtbiA9IGZvbGQuc3RhcnQuY29sdW1uOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHJvd0VuZCwgcm93ID0gMDsNCiAgICAgICAgdmFyIHJvd0NhY2hlID0gdGhpcy4kcm93Q2FjaGU7DQoNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dDYWNoZS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKHJvd0NhY2hlW2ldLmRvY1JvdyA8IGRvY1Jvdykgew0KICAgICAgICAgICAgICAgIHNjcmVlblJvdyA9IHJvd0NhY2hlW2ldLnNjcmVlblJvdzsNCiAgICAgICAgICAgICAgICByb3cgPSByb3dDYWNoZVtpXS5kb2NSb3c7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHZhciBkb0NhY2hlID0gIXJvd0NhY2hlLmxlbmd0aCB8fCBpID09IHJvd0NhY2hlLmxlbmd0aDsNCg0KICAgICAgICB2YXIgZm9sZExpbmUgPSB0aGlzLmdldE5leHRGb2xkTGluZShyb3cpOw0KICAgICAgICB2YXIgZm9sZFN0YXJ0ID0gZm9sZExpbmUgP2ZvbGRMaW5lLnN0YXJ0LnJvdyA6SW5maW5pdHk7DQoNCiAgICAgICAgd2hpbGUgKHJvdyA8IGRvY1Jvdykgew0KICAgICAgICAgICAgaWYgKHJvdyA+PSBmb2xkU3RhcnQpIHsNCiAgICAgICAgICAgICAgICByb3dFbmQgPSBmb2xkTGluZS5lbmQucm93ICsgMTsNCiAgICAgICAgICAgICAgICBpZiAocm93RW5kID4gZG9jUm93KQ0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBmb2xkTGluZSA9IHRoaXMuZ2V0TmV4dEZvbGRMaW5lKHJvd0VuZCwgZm9sZExpbmUpOw0KICAgICAgICAgICAgICAgIGZvbGRTdGFydCA9IGZvbGRMaW5lID9mb2xkTGluZS5zdGFydC5yb3cgOkluZmluaXR5Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgcm93RW5kID0gcm93ICsgMTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgc2NyZWVuUm93ICs9IHRoaXMuZ2V0Um93TGVuZ3RoKHJvdyk7DQogICAgICAgICAgICByb3cgPSByb3dFbmQ7DQoNCiAgICAgICAgICAgIGlmIChkb0NhY2hlKSB7DQogICAgICAgICAgICAgICAgcm93Q2FjaGUucHVzaCh7DQogICAgICAgICAgICAgICAgICAgIGRvY1Jvdzogcm93LA0KICAgICAgICAgICAgICAgICAgICBzY3JlZW5Sb3c6IHNjcmVlblJvdw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0ZXh0IGxpbmUgdGhhdCBpcyBkaXNwbGF5ZWQgaW4gZG9jUm93IG9uIHRoZSBzY3JlZW4uDQogICAgICAgIHZhciB0ZXh0TGluZSA9ICIiOw0KICAgICAgICAvLyBDaGVjayBpZiB0aGUgZmluYWwgcm93IHdlIHdhbnQgdG8gcmVhY2ggaXMgaW5zaWRlIG9mIGEgZm9sZC4NCiAgICAgICAgaWYgKGZvbGRMaW5lICYmIHJvdyA+PSBmb2xkU3RhcnQpIHsNCiAgICAgICAgICAgIHRleHRMaW5lID0gdGhpcy5nZXRGb2xkRGlzcGxheUxpbmUoZm9sZExpbmUsIGRvY1JvdywgZG9jQ29sdW1uKTsNCiAgICAgICAgICAgIGZvbGRTdGFydFJvdyA9IGZvbGRMaW5lLnN0YXJ0LnJvdzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRleHRMaW5lID0gdGhpcy5nZXRMaW5lKGRvY1Jvdykuc3Vic3RyaW5nKDAsIGRvY0NvbHVtbik7DQogICAgICAgICAgICBmb2xkU3RhcnRSb3cgPSBkb2NSb3c7DQogICAgICAgIH0NCiAgICAgICAgLy8gQ2xhbXAgdGV4dExpbmUgaWYgaW4gd3JhcE1vZGUuDQogICAgICAgIGlmICh0aGlzLiR1c2VXcmFwTW9kZSkgew0KICAgICAgICAgICAgdmFyIHdyYXBSb3cgPSB3cmFwRGF0YVtmb2xkU3RhcnRSb3ddOw0KICAgICAgICAgICAgdmFyIHNjcmVlblJvd09mZnNldCA9IDA7DQogICAgICAgICAgICB3aGlsZSAodGV4dExpbmUubGVuZ3RoID49IHdyYXBSb3dbc2NyZWVuUm93T2Zmc2V0XSkgew0KICAgICAgICAgICAgICAgIHNjcmVlblJvdyArKzsNCiAgICAgICAgICAgICAgICBzY3JlZW5Sb3dPZmZzZXQrKzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRleHRMaW5lID0gdGV4dExpbmUuc3Vic3RyaW5nKA0KICAgICAgICAgICAgICAgIHdyYXBSb3dbc2NyZWVuUm93T2Zmc2V0IC0gMV0gfHwgMCwgdGV4dExpbmUubGVuZ3RoDQogICAgICAgICAgICApOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHJvdzogc2NyZWVuUm93LA0KICAgICAgICAgICAgY29sdW1uOiB0aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aCh0ZXh0TGluZSlbMF0NCiAgICAgICAgfTsNCiAgICB9Ow0KDQogICAgdGhpcy5kb2N1bWVudFRvU2NyZWVuQ29sdW1uID0gZnVuY3Rpb24ocm93LCBkb2NDb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHJvdywgZG9jQ29sdW1uKS5jb2x1bW47DQogICAgfTsNCg0KICAgIHRoaXMuZG9jdW1lbnRUb1NjcmVlblJvdyA9IGZ1bmN0aW9uKGRvY1JvdywgZG9jQ29sdW1uKSB7DQogICAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihkb2NSb3csIGRvY0NvbHVtbikucm93Ow0KICAgIH07DQoNCiAgICB0aGlzLmdldFNjcmVlbkxlbmd0aCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgc2NyZWVuUm93cyA9IDA7DQogICAgICAgIHZhciBmb2xkID0gbnVsbDsNCiAgICAgICAgaWYgKCF0aGlzLiR1c2VXcmFwTW9kZSkgew0KICAgICAgICAgICAgc2NyZWVuUm93cyA9IHRoaXMuZ2V0TGVuZ3RoKCk7DQoNCiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZm9sZGVkIGxpbmVzIGFnYWluLg0KICAgICAgICAgICAgdmFyIGZvbGREYXRhID0gdGhpcy4kZm9sZERhdGE7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvbGREYXRhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgZm9sZCA9IGZvbGREYXRhW2ldOw0KICAgICAgICAgICAgICAgIHNjcmVlblJvd3MgLT0gZm9sZC5lbmQucm93IC0gZm9sZC5zdGFydC5yb3c7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB2YXIgbGFzdFJvdyA9IHRoaXMuJHdyYXBEYXRhLmxlbmd0aDsNCiAgICAgICAgICAgIHZhciByb3cgPSAwLCBpID0gMDsNCiAgICAgICAgICAgIHZhciBmb2xkID0gdGhpcy4kZm9sZERhdGFbaSsrXTsNCiAgICAgICAgICAgIHZhciBmb2xkU3RhcnQgPSBmb2xkID8gZm9sZC5zdGFydC5yb3cgOkluZmluaXR5Ow0KDQogICAgICAgICAgICB3aGlsZSAocm93IDwgbGFzdFJvdykgew0KICAgICAgICAgICAgICAgIHNjcmVlblJvd3MgKz0gdGhpcy4kd3JhcERhdGFbcm93XS5sZW5ndGggKyAxOw0KICAgICAgICAgICAgICAgIHJvdyArKzsNCiAgICAgICAgICAgICAgICBpZiAocm93ID4gZm9sZFN0YXJ0KSB7DQogICAgICAgICAgICAgICAgICAgIHJvdyA9IGZvbGQuZW5kLnJvdysxOw0KICAgICAgICAgICAgICAgICAgICBmb2xkID0gdGhpcy4kZm9sZERhdGFbaSsrXTsNCiAgICAgICAgICAgICAgICAgICAgZm9sZFN0YXJ0ID0gZm9sZCA/Zm9sZC5zdGFydC5yb3cgOkluZmluaXR5Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBzY3JlZW5Sb3dzOw0KICAgIH0NCg0KICAgIC8vIEZvciBldmVyeSBrZXlzdHJva2UgdGhpcyBnZXRzIGNhbGxlZCBvbmNlIHBlciBjaGFyIGluIHRoZSB3aG9sZSBkb2MhIQ0KICAgIC8vIFdvdWxkbid0IGh1cnQgdG8gbWFrZSBpdCBhIGJpdCBmYXN0ZXIgZm9yIGMgPj0gMHgxMTAwDQogICAgZnVuY3Rpb24gaXNGdWxsV2lkdGgoYykgew0KICAgICAgICBpZiAoYyA8IDB4MTEwMCkNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgcmV0dXJuIGMgPj0gMHgxMTAwICYmIGMgPD0gMHgxMTVGIHx8DQogICAgICAgICAgICAgICBjID49IDB4MTFBMyAmJiBjIDw9IDB4MTFBNyB8fA0KICAgICAgICAgICAgICAgYyA+PSAweDExRkEgJiYgYyA8PSAweDExRkYgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHgyMzI5ICYmIGMgPD0gMHgyMzJBIHx8DQogICAgICAgICAgICAgICBjID49IDB4MkU4MCAmJiBjIDw9IDB4MkU5OSB8fA0KICAgICAgICAgICAgICAgYyA+PSAweDJFOUIgJiYgYyA8PSAweDJFRjMgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHgyRjAwICYmIGMgPD0gMHgyRkQ1IHx8DQogICAgICAgICAgICAgICBjID49IDB4MkZGMCAmJiBjIDw9IDB4MkZGQiB8fA0KICAgICAgICAgICAgICAgYyA+PSAweDMwMDAgJiYgYyA8PSAweDMwM0UgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHgzMDQxICYmIGMgPD0gMHgzMDk2IHx8DQogICAgICAgICAgICAgICBjID49IDB4MzA5OSAmJiBjIDw9IDB4MzBGRiB8fA0KICAgICAgICAgICAgICAgYyA+PSAweDMxMDUgJiYgYyA8PSAweDMxMkQgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHgzMTMxICYmIGMgPD0gMHgzMThFIHx8DQogICAgICAgICAgICAgICBjID49IDB4MzE5MCAmJiBjIDw9IDB4MzFCQSB8fA0KICAgICAgICAgICAgICAgYyA+PSAweDMxQzAgJiYgYyA8PSAweDMxRTMgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHgzMUYwICYmIGMgPD0gMHgzMjFFIHx8DQogICAgICAgICAgICAgICBjID49IDB4MzIyMCAmJiBjIDw9IDB4MzI0NyB8fA0KICAgICAgICAgICAgICAgYyA+PSAweDMyNTAgJiYgYyA8PSAweDMyRkUgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHgzMzAwICYmIGMgPD0gMHg0REJGIHx8DQogICAgICAgICAgICAgICBjID49IDB4NEUwMCAmJiBjIDw9IDB4QTQ4QyB8fA0KICAgICAgICAgICAgICAgYyA+PSAweEE0OTAgJiYgYyA8PSAweEE0QzYgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHhBOTYwICYmIGMgPD0gMHhBOTdDIHx8DQogICAgICAgICAgICAgICBjID49IDB4QUMwMCAmJiBjIDw9IDB4RDdBMyB8fA0KICAgICAgICAgICAgICAgYyA+PSAweEQ3QjAgJiYgYyA8PSAweEQ3QzYgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHhEN0NCICYmIGMgPD0gMHhEN0ZCIHx8DQogICAgICAgICAgICAgICBjID49IDB4RjkwMCAmJiBjIDw9IDB4RkFGRiB8fA0KICAgICAgICAgICAgICAgYyA+PSAweEZFMTAgJiYgYyA8PSAweEZFMTkgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHhGRTMwICYmIGMgPD0gMHhGRTUyIHx8DQogICAgICAgICAgICAgICBjID49IDB4RkU1NCAmJiBjIDw9IDB4RkU2NiB8fA0KICAgICAgICAgICAgICAgYyA+PSAweEZFNjggJiYgYyA8PSAweEZFNkIgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHhGRjAxICYmIGMgPD0gMHhGRjYwIHx8DQogICAgICAgICAgICAgICBjID49IDB4RkZFMCAmJiBjIDw9IDB4RkZFNjsNCiAgICB9Ow0KDQp9KS5jYWxsKEVkaXRTZXNzaW9uLnByb3RvdHlwZSk7DQoNCnJlcXVpcmUoIi4vZWRpdF9zZXNzaW9uL2ZvbGRpbmciKS5Gb2xkaW5nLmNhbGwoRWRpdFNlc3Npb24ucHJvdG90eXBlKTsNCnJlcXVpcmUoIi4vZWRpdF9zZXNzaW9uL2JyYWNrZXRfbWF0Y2giKS5CcmFja2V0TWF0Y2guY2FsbChFZGl0U2Vzc2lvbi5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkVkaXRTZXNzaW9uID0gRWRpdFNlc3Npb247DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgSnVsaWFuIFZpZXJlY2sgPGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9zZWxlY3Rpb24nLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4vbGliL2xhbmciKTsNCnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi9yYW5nZSIpLlJhbmdlOw0KDQovKioNCiAqIEtlZXBzIGN1cnNvciBwb3NpdGlvbiBhbmQgdGhlIHRleHQgc2VsZWN0aW9uIG9mIGFuIGVkaXQgc2Vzc2lvbi4NCiAqDQogKiBUaGUgcm93L2NvbHVtbnMgdXNlZCBpbiB0aGUgc2VsZWN0aW9uIGFyZSBpbiBkb2N1bWVudCBjb29yZGluYXRlcw0KICogcmVwcmVzZW50aW5nIHRocyBjb29yZGluYXRlcyBhcyB0aGV6IGFwcGVhciBpbiB0aGUgZG9jdW1lbnQNCiAqIGJlZm9yZSBhcHBseWluZyBzb2Z0IHdyYXAgYW5kIGZvbGRpbmcuDQogKi8NCnZhciBTZWxlY3Rpb24gPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsNCiAgICB0aGlzLmRvYyA9IHNlc3Npb24uZ2V0RG9jdW1lbnQoKTsNCg0KICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsNCiAgICB0aGlzLnNlbGVjdGlvbkxlYWQgPSB0aGlzLmRvYy5jcmVhdGVBbmNob3IoMCwgMCk7DQogICAgdGhpcy5zZWxlY3Rpb25BbmNob3IgPSB0aGlzLmRvYy5jcmVhdGVBbmNob3IoMCwgMCk7DQoNCiAgICB2YXIgX3NlbGYgPSB0aGlzOw0KICAgIHRoaXMuc2VsZWN0aW9uTGVhZC5vbigiY2hhbmdlIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICBfc2VsZi5fZW1pdCgiY2hhbmdlQ3Vyc29yIik7DQogICAgICAgIGlmICghX3NlbGYuJGlzRW1wdHkpDQogICAgICAgICAgICBfc2VsZi5fZW1pdCgiY2hhbmdlU2VsZWN0aW9uIik7DQogICAgICAgIGlmICghX3NlbGYuJHByZXZlbnRVcGRhdGVEZXNpcmVkQ29sdW1uT25DaGFuZ2UgJiYgZS5vbGQuY29sdW1uICE9IGUudmFsdWUuY29sdW1uKQ0KICAgICAgICAgICAgX3NlbGYuJHVwZGF0ZURlc2lyZWRDb2x1bW4oKTsNCiAgICB9KTsNCg0KICAgIHRoaXMuc2VsZWN0aW9uQW5jaG9yLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKCFfc2VsZi4kaXNFbXB0eSkNCiAgICAgICAgICAgIF9zZWxmLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKTsNCiAgICB9KTsNCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCg0KICAgIHRoaXMuaXNFbXB0eSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gKHRoaXMuJGlzRW1wdHkgfHwgKA0KICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25BbmNob3Iucm93ID09IHRoaXMuc2VsZWN0aW9uTGVhZC5yb3cgJiYNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQW5jaG9yLmNvbHVtbiA9PSB0aGlzLnNlbGVjdGlvbkxlYWQuY29sdW1uDQogICAgICAgICkpOw0KICAgIH07DQoNCiAgICB0aGlzLmlzTXVsdGlMaW5lID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmFuZ2UoKS5pc011bHRpTGluZSgpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldEN1cnNvciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25MZWFkLmdldFBvc2l0aW9uKCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0U2VsZWN0aW9uQW5jaG9yID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgdGhpcy5zZWxlY3Rpb25BbmNob3Iuc2V0UG9zaXRpb24ocm93LCBjb2x1bW4pOw0KDQogICAgICAgIGlmICh0aGlzLiRpc0VtcHR5KSB7DQogICAgICAgICAgICB0aGlzLiRpc0VtcHR5ID0gZmFsc2U7DQogICAgICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmdldFNlbGVjdGlvbkFuY2hvciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAodGhpcy4kaXNFbXB0eSkNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFNlbGVjdGlvbkxlYWQoKQ0KICAgICAgICBlbHNlDQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25BbmNob3IuZ2V0UG9zaXRpb24oKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRTZWxlY3Rpb25MZWFkID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkxlYWQuZ2V0UG9zaXRpb24oKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zaGlmdFNlbGVjdGlvbiA9IGZ1bmN0aW9uKGNvbHVtbnMpIHsNCiAgICAgICAgaWYgKHRoaXMuJGlzRW1wdHkpIHsNCiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvKHRoaXMuc2VsZWN0aW9uTGVhZC5yb3csIHRoaXMuc2VsZWN0aW9uTGVhZC5jb2x1bW4gKyBjb2x1bW5zKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfTsNCg0KICAgICAgICB2YXIgYW5jaG9yID0gdGhpcy5nZXRTZWxlY3Rpb25BbmNob3IoKTsNCiAgICAgICAgdmFyIGxlYWQgPSB0aGlzLmdldFNlbGVjdGlvbkxlYWQoKTsNCg0KICAgICAgICB2YXIgaXNCYWNrd2FyZHMgPSB0aGlzLmlzQmFja3dhcmRzKCk7DQoNCiAgICAgICAgaWYgKCFpc0JhY2t3YXJkcyB8fCBhbmNob3IuY29sdW1uICE9PSAwKQ0KICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25BbmNob3IoYW5jaG9yLnJvdywgYW5jaG9yLmNvbHVtbiArIGNvbHVtbnMpOw0KDQogICAgICAgIGlmIChpc0JhY2t3YXJkcyB8fCBsZWFkLmNvbHVtbiAhPT0gMCkgew0KICAgICAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhsZWFkLnJvdywgbGVhZC5jb2x1bW4gKyBjb2x1bW5zKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuaXNCYWNrd2FyZHMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIGFuY2hvciA9IHRoaXMuc2VsZWN0aW9uQW5jaG9yOw0KICAgICAgICB2YXIgbGVhZCA9IHRoaXMuc2VsZWN0aW9uTGVhZDsNCiAgICAgICAgcmV0dXJuIChhbmNob3Iucm93ID4gbGVhZC5yb3cgfHwgKGFuY2hvci5yb3cgPT0gbGVhZC5yb3cgJiYgYW5jaG9yLmNvbHVtbiA+IGxlYWQuY29sdW1uKSk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0UmFuZ2UgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIGFuY2hvciA9IHRoaXMuc2VsZWN0aW9uQW5jaG9yOw0KICAgICAgICB2YXIgbGVhZCA9IHRoaXMuc2VsZWN0aW9uTGVhZDsNCg0KICAgICAgICBpZiAodGhpcy5pc0VtcHR5KCkpDQogICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhsZWFkLCBsZWFkKTsNCg0KICAgICAgICBpZiAodGhpcy5pc0JhY2t3YXJkcygpKSB7DQogICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhsZWFkLCBhbmNob3IpOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoYW5jaG9yLCBsZWFkKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmICghdGhpcy4kaXNFbXB0eSkgew0KICAgICAgICAgICAgdGhpcy4kaXNFbXB0eSA9IHRydWU7DQogICAgICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLnNlbGVjdEFsbCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgbGFzdFJvdyA9IHRoaXMuZG9jLmdldExlbmd0aCgpIC0gMTsNCiAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25BbmNob3IobGFzdFJvdywgdGhpcy5kb2MuZ2V0TGluZShsYXN0Um93KS5sZW5ndGgpOw0KICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbygwLCAwKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRTZWxlY3Rpb25SYW5nZSA9IGZ1bmN0aW9uKHJhbmdlLCByZXZlcnNlKSB7DQogICAgICAgIGlmIChyZXZlcnNlKSB7DQogICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbkFuY2hvcihyYW5nZS5lbmQucm93LCByYW5nZS5lbmQuY29sdW1uKTsNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0VG8ocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5zdGFydC5jb2x1bW4pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25BbmNob3IocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5zdGFydC5jb2x1bW4pOw0KICAgICAgICAgICAgdGhpcy5zZWxlY3RUbyhyYW5nZS5lbmQucm93LCByYW5nZS5lbmQuY29sdW1uKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLiR1cGRhdGVEZXNpcmVkQ29sdW1uKCk7DQogICAgfTsNCg0KICAgIHRoaXMuJHVwZGF0ZURlc2lyZWRDb2x1bW4gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIGN1cnNvciA9IHRoaXMuZ2V0Q3Vyc29yKCk7DQogICAgICAgIHRoaXMuJGRlc2lyZWRDb2x1bW4gPSB0aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlbkNvbHVtbihjdXJzb3Iucm93LCBjdXJzb3IuY29sdW1uKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kbW92ZVNlbGVjdGlvbiA9IGZ1bmN0aW9uKG1vdmVyKSB7DQogICAgICAgIHZhciBsZWFkID0gdGhpcy5zZWxlY3Rpb25MZWFkOw0KICAgICAgICBpZiAodGhpcy4kaXNFbXB0eSkNCiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uQW5jaG9yKGxlYWQucm93LCBsZWFkLmNvbHVtbik7DQoNCiAgICAgICAgbW92ZXIuY2FsbCh0aGlzKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZWxlY3RUbyA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHRoaXMuJG1vdmVTZWxlY3Rpb24oZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhyb3csIGNvbHVtbik7DQogICAgICAgIH0pOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbGVjdFRvUG9zaXRpb24gPSBmdW5jdGlvbihwb3MpIHsNCiAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24ocG9zKTsNCiAgICAgICAgfSk7DQogICAgfTsNCg0KICAgIHRoaXMuc2VsZWN0VXAgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JVcCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2VsZWN0RG93biA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckRvd24pOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbGVjdFJpZ2h0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yUmlnaHQpOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbGVjdExlZnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JMZWZ0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZWxlY3RMaW5lU3RhcnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JMaW5lU3RhcnQpOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbGVjdExpbmVFbmQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JMaW5lRW5kKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZWxlY3RGaWxlRW5kID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yRmlsZUVuZCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2VsZWN0RmlsZVN0YXJ0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yRmlsZVN0YXJ0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZWxlY3RXb3JkUmlnaHQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JXb3JkUmlnaHQpOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbGVjdFdvcmRMZWZ0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yV29yZExlZnQpOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbGVjdFdvcmQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIGN1cnNvciA9IHRoaXMuZ2V0Q3Vyc29yKCk7DQogICAgICAgIHZhciByYW5nZSAgPSB0aGlzLnNlc3Npb24uZ2V0V29yZFJhbmdlKGN1cnNvci5yb3csIGN1cnNvci5jb2x1bW4pOw0KICAgICAgICB0aGlzLnNldFNlbGVjdGlvblJhbmdlKHJhbmdlKTsNCiAgICB9Ow0KDQogICAgLy8gU2VsZWN0cyBhIHdvcmQgaW5jbHVkaW5nIGl0cyByaWdodCB3aGl0ZXNwYWNlDQogICAgdGhpcy5zZWxlY3RBV29yZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgY3Vyc29yID0gdGhpcy5nZXRDdXJzb3IoKTsNCiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5zZXNzaW9uLmdldEFXb3JkUmFuZ2UoY3Vyc29yLnJvdywgY3Vyc29yLmNvbHVtbik7DQogICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uUmFuZ2UocmFuZ2UpOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbGVjdExpbmUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHJvd1N0YXJ0ID0gdGhpcy5zZWxlY3Rpb25MZWFkLnJvdzsNCiAgICAgICAgdmFyIHJvd0VuZDsNCg0KICAgICAgICB2YXIgZm9sZExpbmUgPSB0aGlzLnNlc3Npb24uZ2V0Rm9sZExpbmUocm93U3RhcnQpOw0KICAgICAgICBpZiAoZm9sZExpbmUpIHsNCiAgICAgICAgICAgIHJvd1N0YXJ0ID0gZm9sZExpbmUuc3RhcnQucm93Ow0KICAgICAgICAgICAgcm93RW5kID0gZm9sZExpbmUuZW5kLnJvdzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJvd0VuZCA9IHJvd1N0YXJ0Ow0KICAgICAgICB9DQogICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uQW5jaG9yKHJvd1N0YXJ0LCAwKTsNCiAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvKHJvd0VuZCArIDEsIDApOw0KICAgICAgICB9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5tb3ZlQ3Vyc29yVXAgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yQnkoLTEsIDApOw0KICAgIH07DQoNCiAgICB0aGlzLm1vdmVDdXJzb3JEb3duID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMubW92ZUN1cnNvckJ5KDEsIDApOw0KICAgIH07DQoNCiAgICB0aGlzLm1vdmVDdXJzb3JMZWZ0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBjdXJzb3IgPSB0aGlzLnNlbGVjdGlvbkxlYWQuZ2V0UG9zaXRpb24oKSwNCiAgICAgICAgICAgIGZvbGQ7DQoNCiAgICAgICAgaWYgKGZvbGQgPSB0aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGN1cnNvci5yb3csIGN1cnNvci5jb2x1bW4sIC0xKSkgew0KICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8oZm9sZC5zdGFydC5yb3csIGZvbGQuc3RhcnQuY29sdW1uKTsNCiAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IuY29sdW1uID09IDApIHsNCiAgICAgICAgICAgIC8vIGN1cnNvciBpcyBhIGxpbmUgKHN0YXJ0DQogICAgICAgICAgICBpZiAoY3Vyc29yLnJvdyA+IDApIHsNCiAgICAgICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhjdXJzb3Iucm93IC0gMSwgdGhpcy5kb2MuZ2V0TGluZShjdXJzb3Iucm93IC0gMSkubGVuZ3RoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHZhciB0YWJTaXplID0gdGhpcy5zZXNzaW9uLmdldFRhYlNpemUoKTsNCiAgICAgICAgICAgIGlmICh0aGlzLnNlc3Npb24uaXNUYWJTdG9wKGN1cnNvcikgJiYgdGhpcy5kb2MuZ2V0TGluZShjdXJzb3Iucm93KS5zbGljZShjdXJzb3IuY29sdW1uLXRhYlNpemUsIGN1cnNvci5jb2x1bW4pLnNwbGl0KCIgIikubGVuZ3RoLTEgPT0gdGFiU2l6ZSkNCiAgICAgICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JCeSgwLCAtdGFiU2l6ZSk7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yQnkoMCwgLTEpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMubW92ZUN1cnNvclJpZ2h0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBjdXJzb3IgPSB0aGlzLnNlbGVjdGlvbkxlYWQuZ2V0UG9zaXRpb24oKSwNCiAgICAgICAgICAgIGZvbGQ7DQogICAgICAgIGlmIChmb2xkID0gdGhpcy5zZXNzaW9uLmdldEZvbGRBdChjdXJzb3Iucm93LCBjdXJzb3IuY29sdW1uLCAxKSkgew0KICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8oZm9sZC5lbmQucm93LCBmb2xkLmVuZC5jb2x1bW4pOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTGVhZC5jb2x1bW4gPT0gdGhpcy5kb2MuZ2V0TGluZSh0aGlzLnNlbGVjdGlvbkxlYWQucm93KS5sZW5ndGgpIHsNCiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkxlYWQucm93IDwgdGhpcy5kb2MuZ2V0TGVuZ3RoKCkgLSAxKSB7DQogICAgICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8odGhpcy5zZWxlY3Rpb25MZWFkLnJvdyArIDEsIDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdmFyIHRhYlNpemUgPSB0aGlzLnNlc3Npb24uZ2V0VGFiU2l6ZSgpOw0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IHRoaXMuc2VsZWN0aW9uTGVhZDsNCiAgICAgICAgICAgIGlmICh0aGlzLnNlc3Npb24uaXNUYWJTdG9wKGN1cnNvcikgJiYgdGhpcy5kb2MuZ2V0TGluZShjdXJzb3Iucm93KS5zbGljZShjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uK3RhYlNpemUpLnNwbGl0KCIgIikubGVuZ3RoLTEgPT0gdGFiU2l6ZSkNCiAgICAgICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JCeSgwLCB0YWJTaXplKTsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JCeSgwLCAxKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLm1vdmVDdXJzb3JMaW5lU3RhcnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHJvdyA9IHRoaXMuc2VsZWN0aW9uTGVhZC5yb3c7DQogICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLnNlbGVjdGlvbkxlYWQuY29sdW1uOw0KICAgICAgICB2YXIgc2NyZWVuUm93ID0gdGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Sb3cocm93LCBjb2x1bW4pOw0KDQogICAgICAgIC8vIERldGVybSB0aGUgZG9jLXBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYXQgdGhlIHNjcmVlbiBsaW5lLg0KICAgICAgICB2YXIgZmlyc3RDb2x1bW5Qb3NpdGlvbiA9IHRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oc2NyZWVuUm93LCAwKTsNCg0KICAgICAgICAvLyBEZXRlcm0gdGhlIGxpbmUNCiAgICAgICAgdmFyIGJlZm9yZUN1cnNvciA9IHRoaXMuc2Vzc2lvbi5nZXREaXNwbGF5TGluZSgNCiAgICAgICAgICAgIHJvdywgbnVsbCwNCiAgICAgICAgICAgIGZpcnN0Q29sdW1uUG9zaXRpb24ucm93LCBmaXJzdENvbHVtblBvc2l0aW9uLmNvbHVtbg0KICAgICAgICApOw0KDQogICAgICAgIHZhciBsZWFkaW5nU3BhY2UgPSBiZWZvcmVDdXJzb3IubWF0Y2goL15ccyovKTsNCiAgICAgICAgaWYgKGxlYWRpbmdTcGFjZVswXS5sZW5ndGggPT0gY29sdW1uKSB7DQogICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbygNCiAgICAgICAgICAgICAgICBmaXJzdENvbHVtblBvc2l0aW9uLnJvdywgZmlyc3RDb2x1bW5Qb3NpdGlvbi5jb2x1bW4NCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbygNCiAgICAgICAgICAgICAgICBmaXJzdENvbHVtblBvc2l0aW9uLnJvdywNCiAgICAgICAgICAgICAgICBmaXJzdENvbHVtblBvc2l0aW9uLmNvbHVtbiArIGxlYWRpbmdTcGFjZVswXS5sZW5ndGgNCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5tb3ZlQ3Vyc29yTGluZUVuZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgbGVhZCA9IHRoaXMuc2VsZWN0aW9uTGVhZDsNCiAgICAgICAgdmFyIGxhc3RSb3dDb2x1bW5Qb3NpdGlvbiA9DQogICAgICAgICAgICB0aGlzLnNlc3Npb24uZ2V0RG9jdW1lbnRMYXN0Um93Q29sdW1uUG9zaXRpb24obGVhZC5yb3csIGxlYWQuY29sdW1uKTsNCiAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8oDQogICAgICAgICAgICBsYXN0Um93Q29sdW1uUG9zaXRpb24ucm93LA0KICAgICAgICAgICAgbGFzdFJvd0NvbHVtblBvc2l0aW9uLmNvbHVtbg0KICAgICAgICApOw0KICAgIH07DQoNCiAgICB0aGlzLm1vdmVDdXJzb3JGaWxlRW5kID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciByb3cgPSB0aGlzLmRvYy5nZXRMZW5ndGgoKSAtIDE7DQogICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmRvYy5nZXRMaW5lKHJvdykubGVuZ3RoOw0KICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhyb3csIGNvbHVtbik7DQogICAgfTsNCg0KICAgIHRoaXMubW92ZUN1cnNvckZpbGVTdGFydCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbygwLCAwKTsNCiAgICB9Ow0KDQogICAgdGhpcy5tb3ZlQ3Vyc29yV29yZFJpZ2h0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciByb3cgPSB0aGlzLnNlbGVjdGlvbkxlYWQucm93Ow0KICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5zZWxlY3Rpb25MZWFkLmNvbHVtbjsNCiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLmRvYy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciByaWdodE9mQ3Vyc29yID0gbGluZS5zdWJzdHJpbmcoY29sdW1uKTsNCg0KICAgICAgICB2YXIgbWF0Y2g7DQogICAgICAgIHRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleCA9IDA7DQogICAgICAgIHRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleCA9IDA7DQoNCiAgICAgICAgLy8gc2tpcCBmb2xkcw0KICAgICAgICB2YXIgZm9sZCA9IHRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQocm93LCBjb2x1bW4sIDEpOw0KICAgICAgICBpZiAoZm9sZCkgew0KICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8oZm9sZC5lbmQucm93LCBmb2xkLmVuZC5jb2x1bW4pOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyBmaXJzdCBza2lwIHNwYWNlDQogICAgICAgIGlmIChtYXRjaCA9IHRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmV4ZWMocmlnaHRPZkN1cnNvcikpIHsNCiAgICAgICAgICAgIGNvbHVtbiArPSB0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXg7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXggPSAwOw0KICAgICAgICAgICAgcmlnaHRPZkN1cnNvciA9IGxpbmUuc3Vic3RyaW5nKGNvbHVtbik7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIGlmIGF0IGxpbmUgZW5kIHByb2NlZWQgd2l0aCBuZXh0IGxpbmUNCiAgICAgICAgaWYgKGNvbHVtbiA+PSBsaW5lLmxlbmd0aCkgew0KICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8ocm93LCBsaW5lLmxlbmd0aCk7DQogICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JSaWdodCgpOw0KICAgICAgICAgICAgaWYgKHJvdyA8IHRoaXMuZG9jLmdldExlbmd0aCgpIC0gMSkNCiAgICAgICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JXb3JkUmlnaHQoKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gYWR2YW5jZSB0byB0aGUgZW5kIG9mIHRoZSBuZXh0IHRva2VuDQogICAgICAgIGlmIChtYXRjaCA9IHRoaXMuc2Vzc2lvbi50b2tlblJlLmV4ZWMocmlnaHRPZkN1cnNvcikpIHsNCiAgICAgICAgICAgIGNvbHVtbiArPSB0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXggPSAwOw0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8ocm93LCBjb2x1bW4pOw0KICAgIH07DQoNCiAgICB0aGlzLm1vdmVDdXJzb3JXb3JkTGVmdCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgcm93ID0gdGhpcy5zZWxlY3Rpb25MZWFkLnJvdzsNCiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuc2VsZWN0aW9uTGVhZC5jb2x1bW47DQoNCiAgICAgICAgLy8gc2tpcCBmb2xkcw0KICAgICAgICB2YXIgZm9sZDsNCiAgICAgICAgaWYgKGZvbGQgPSB0aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KHJvdywgY29sdW1uLCAtMSkpIHsNCiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvKGZvbGQuc3RhcnQucm93LCBmb2xkLnN0YXJ0LmNvbHVtbik7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgc3RyID0gdGhpcy5zZXNzaW9uLmdldEZvbGRTdHJpbmdBdChyb3csIGNvbHVtbiwgLTEpOw0KICAgICAgICBpZiAoc3RyID09IG51bGwpIHsNCiAgICAgICAgICAgIHN0ciA9IHRoaXMuZG9jLmdldExpbmUocm93KS5zdWJzdHJpbmcoMCwgY29sdW1uKQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICB2YXIgbGVmdE9mQ3Vyc29yID0gbGFuZy5zdHJpbmdSZXZlcnNlKHN0cik7DQogICAgICAgIHZhciBtYXRjaDsNCiAgICAgICAgdGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4ID0gMDsNCiAgICAgICAgdGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4ID0gMDsNCiAgICAgICAgDQogICAgICAgIC8vIHNraXAgd2hpdGVzcGFjZQ0KICAgICAgICBpZiAobWF0Y2ggPSB0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5leGVjKGxlZnRPZkN1cnNvcikpIHsNCiAgICAgICAgICAgIGNvbHVtbiAtPSB0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXg7DQogICAgICAgICAgICBsZWZ0T2ZDdXJzb3IgPSBsZWZ0T2ZDdXJzb3Iuc2xpY2UodGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4KTsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleCA9IDA7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIGlmIGF0IGJlZ2luIG9mIHRoZSBsaW5lIHByb2NlZWQgaW4gbGluZSBhYm92ZQ0KICAgICAgICBpZiAoY29sdW1uIDw9IDApIHsNCiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvKHJvdywgMCk7DQogICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JMZWZ0KCk7DQogICAgICAgICAgICBpZiAocm93ID4gMCkNCiAgICAgICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JXb3JkTGVmdCgpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gbW92ZSB0byB0aGUgYmVnaW4gb2YgdGhlIHdvcmQNCiAgICAgICAgaWYgKG1hdGNoID0gdGhpcy5zZXNzaW9uLnRva2VuUmUuZXhlYyhsZWZ0T2ZDdXJzb3IpKSB7DQogICAgICAgICAgICBjb2x1bW4gLT0gdGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4Ow0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4ID0gMDsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMubW92ZUN1cnNvclRvKHJvdywgY29sdW1uKTsNCiAgICB9Ow0KDQogICAgdGhpcy5tb3ZlQ3Vyc29yQnkgPSBmdW5jdGlvbihyb3dzLCBjaGFycykgew0KICAgICAgICB2YXIgc2NyZWVuUG9zID0gdGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbigNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTGVhZC5yb3csDQogICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkxlYWQuY29sdW1uDQogICAgICAgICk7DQoNCiAgICAgICAgdmFyIHNjcmVlbkNvbCA9IChjaGFycyA9PT0gMCAmJiB0aGlzLiRkZXNpcmVkQ29sdW1uKSB8fCBzY3JlZW5Qb3MuY29sdW1uOw0KICAgICAgICB2YXIgZG9jUG9zID0gdGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihzY3JlZW5Qb3Mucm93ICsgcm93cywgc2NyZWVuQ29sKTsNCg0KICAgICAgICAvLyBtb3ZlIHRoZSBjdXJzb3IgYW5kIHVwZGF0ZSB0aGUgZGVzaXJlZCBjb2x1bW4NCiAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8oZG9jUG9zLnJvdywgZG9jUG9zLmNvbHVtbiArIGNoYXJzLCBjaGFycyA9PT0gMCk7DQogICAgfTsNCg0KICAgIHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24gPSBmdW5jdGlvbihwb3NpdGlvbikgew0KICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhwb3NpdGlvbi5yb3csIHBvc2l0aW9uLmNvbHVtbik7DQogICAgfTsNCg0KICAgIHRoaXMubW92ZUN1cnNvclRvID0gZnVuY3Rpb24ocm93LCBjb2x1bW4sIHByZXZlbnRVcGRhdGVEZXNpcmVkQ29sdW1uKSB7DQogICAgICAgIC8vIEVuc3VyZSB0aGUgcm93L2NvbHVtbiBpcyBub3QgaW5zaWRlIG9mIGEgZm9sZC4NCiAgICAgICAgdmFyIGZvbGQgPSB0aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KHJvdywgY29sdW1uLCAxKTsNCiAgICAgICAgaWYgKGZvbGQpIHsNCiAgICAgICAgICAgIHJvdyA9IGZvbGQuc3RhcnQucm93Ow0KICAgICAgICAgICAgY29sdW1uID0gZm9sZC5zdGFydC5jb2x1bW47DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLiRwcmV2ZW50VXBkYXRlRGVzaXJlZENvbHVtbk9uQ2hhbmdlID0gdHJ1ZTsNCiAgICAgICAgdGhpcy5zZWxlY3Rpb25MZWFkLnNldFBvc2l0aW9uKHJvdywgY29sdW1uKTsNCiAgICAgICAgdGhpcy4kcHJldmVudFVwZGF0ZURlc2lyZWRDb2x1bW5PbkNoYW5nZSA9IGZhbHNlOw0KDQogICAgICAgIGlmICghcHJldmVudFVwZGF0ZURlc2lyZWRDb2x1bW4pDQogICAgICAgICAgICB0aGlzLiR1cGRhdGVEZXNpcmVkQ29sdW1uKHRoaXMuc2VsZWN0aW9uTGVhZC5jb2x1bW4pOw0KICAgIH07DQoNCiAgICB0aGlzLm1vdmVDdXJzb3JUb1NjcmVlbiA9IGZ1bmN0aW9uKHJvdywgY29sdW1uLCBwcmV2ZW50VXBkYXRlRGVzaXJlZENvbHVtbikgew0KICAgICAgICB2YXIgcG9zID0gdGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihyb3csIGNvbHVtbik7DQogICAgICAgIHJvdyA9IHBvcy5yb3c7DQogICAgICAgIGNvbHVtbiA9IHBvcy5jb2x1bW47DQogICAgICAgIHRoaXMubW92ZUN1cnNvclRvKHJvdywgY29sdW1uLCBwcmV2ZW50VXBkYXRlRGVzaXJlZENvbHVtbik7DQogICAgfTsNCg0KfSkuY2FsbChTZWxlY3Rpb24ucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5TZWxlY3Rpb24gPSBTZWxlY3Rpb247DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9yYW5nZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pIHsNCiAgICB0aGlzLnN0YXJ0ID0gew0KICAgICAgICByb3c6IHN0YXJ0Um93LA0KICAgICAgICBjb2x1bW46IHN0YXJ0Q29sdW1uDQogICAgfTsNCg0KICAgIHRoaXMuZW5kID0gew0KICAgICAgICByb3c6IGVuZFJvdywNCiAgICAgICAgY29sdW1uOiBlbmRDb2x1bW4NCiAgICB9Ow0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuaXNFZXF1YWwgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT0gcmFuZ2Uuc3RhcnQucm93ICYmDQogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPT0gcmFuZ2UuZW5kLnJvdyAmJg0KICAgICAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gPT0gcmFuZ2Uuc3RhcnQuY29sdW1uICYmDQogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPT0gcmFuZ2UuZW5kLmNvbHVtbg0KICAgIH07DQoNCiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiAoIlJhbmdlOiBbIiArIHRoaXMuc3RhcnQucm93ICsgIi8iICsgdGhpcy5zdGFydC5jb2x1bW4gKw0KICAgICAgICAgICAgIl0gLT4gWyIgKyB0aGlzLmVuZC5yb3cgKyAiLyIgKyB0aGlzLmVuZC5jb2x1bW4gKyAiXSIpOw0KICAgIH07DQoNCiAgICB0aGlzLmNvbnRhaW5zID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMDsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogQ29tcGFyZXMgdGhpcyByYW5nZSAoQSkgd2l0aCBhbm90aGVyIHJhbmdlIChCKSwgd2hlcmUgQiBpcyB0aGUgcGFzc2VkIGluDQogICAgICogcmFuZ2UuDQogICAgICoNCiAgICAgKiBSZXR1cm4gdmFsdWVzOg0KICAgICAqICAtMjogKEIpIGlzIGluZnJvbnQgb2YgKEEpIGFuZCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIChBKQ0KICAgICAqICAtMTogKEIpIGJlZ2lucyBiZWZvcmUgKEEpIGJ1dCBlbmRzIGluc2lkZSBvZiAoQSkNCiAgICAgKiAgIDA6IChCKSBpcyBjb21wbGV0bHkgaW5zaWRlIG9mIChBKSBPUiAoQSkgaXMgY29tcGxldHkgaW5zaWRlIG9mIChCKQ0KICAgICAqICArMTogKEIpIGJlZ2lucyBpbnNpZGUgb2YgKEEpIGJ1dCBlbmRzIG91dHNpZGUgb2YgKEEpDQogICAgICogICsyOiAoQikgaXMgYWZ0ZXIgKEEpIGFuZCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIChBKQ0KICAgICAqDQogICAgICogIDQyOiBGVFcgc3RhdGU6IChCKSBlbmRzIGluIChBKSBidXQgc3RhcnRzIG91dHNpZGUgb2YgKEEpDQogICAgICovDQogICAgdGhpcy5jb21wYXJlUmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICB2YXIgY21wLA0KICAgICAgICAgICAgZW5kID0gcmFuZ2UuZW5kLA0KICAgICAgICAgICAgc3RhcnQgPSByYW5nZS5zdGFydDsNCg0KICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoZW5kLnJvdywgZW5kLmNvbHVtbik7DQogICAgICAgIGlmIChjbXAgPT0gMSkgew0KICAgICAgICAgICAgY21wID0gdGhpcy5jb21wYXJlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uKTsNCiAgICAgICAgICAgIGlmIChjbXAgPT0gMSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAyOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMCkgew0KICAgICAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gLTEpIHsNCiAgICAgICAgICAgIHJldHVybiAtMjsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbik7DQogICAgICAgICAgICBpZiAoY21wID09IC0xKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMSkgew0KICAgICAgICAgICAgICAgIHJldHVybiA0MjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmNvbXBhcmVQb2ludCA9IGZ1bmN0aW9uKHApIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShwLnJvdywgcC5jb2x1bW4pOw0KICAgIH0NCg0KICAgIHRoaXMuY29udGFpbnNSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVQb2ludChyYW5nZS5zdGFydCkgPT0gMCAmJiB0aGlzLmNvbXBhcmVQb2ludChyYW5nZS5lbmQpID09IDA7DQogICAgfQ0KDQogICAgdGhpcy5pc0VuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHJldHVybiB0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW47DQogICAgfQ0KDQogICAgdGhpcy5pc1N0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW47DQogICAgfQ0KDQogICAgdGhpcy5zZXRTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0eXBlb2Ygcm93ID09ICJvYmplY3QiKSB7DQogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IHJvdy5jb2x1bW47DQogICAgICAgICAgICB0aGlzLnN0YXJ0LnJvdyA9IHJvdy5yb3c7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLnN0YXJ0LnJvdyA9IHJvdzsNCiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID0gY29sdW1uOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5zZXRFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodHlwZW9mIHJvdyA9PSAib2JqZWN0Iikgew0KICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uID0gcm93LmNvbHVtbjsNCiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IHJvdy5yb3c7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPSByb3c7DQogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPSBjb2x1bW47DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmluc2lkZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmlzRW5kKHJvdywgY29sdW1uKSB8fCB0aGlzLmlzU3RhcnQocm93LCBjb2x1bW4pKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgdGhpcy5pbnNpZGVTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmlzRW5kKHJvdywgY29sdW1uKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIHRoaXMuaW5zaWRlRW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuaXNTdGFydChyb3csIGNvbHVtbikpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICB0aGlzLmNvbXBhcmUgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAoIXRoaXMuaXNNdWx0aUxpbmUoKSkgew0KICAgICAgICAgICAgaWYgKHJvdyA9PT0gdGhpcy5zdGFydC5yb3cpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uIDwgdGhpcy5zdGFydC5jb2x1bW4gPyAtMSA6IChjb2x1bW4gPiB0aGlzLmVuZC5jb2x1bW4gPyAxIDogMCk7DQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHJvdyA8IHRoaXMuc3RhcnQucm93KQ0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KDQogICAgICAgIGlmIChyb3cgPiB0aGlzLmVuZC5yb3cpDQogICAgICAgICAgICByZXR1cm4gMTsNCg0KICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPT09IHJvdykNCiAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPj0gdGhpcy5zdGFydC5jb2x1bW4gPyAwIDogLTE7DQoNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PT0gcm93KQ0KICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA8PSB0aGlzLmVuZC5jb2x1bW4gPyAwIDogMTsNCg0KICAgICAgICByZXR1cm4gMDsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogTGlrZSAuY29tcGFyZSgpLCBidXQgaWYgaXNTdGFydCBpcyB0cnVlLCByZXR1cm4gLTE7DQogICAgICovDQogICAgdGhpcy5jb21wYXJlU3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbikgew0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBMaWtlIC5jb21wYXJlKCksIGJ1dCBpZiBpc0VuZCBpcyB0cnVlLCByZXR1cm4gMTsNCiAgICAgKi8NCiAgICB0aGlzLmNvbXBhcmVFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5lbmQucm93ID09IHJvdyAmJiB0aGlzLmVuZC5jb2x1bW4gPT0gY29sdW1uKSB7DQogICAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5jb21wYXJlSW5zaWRlID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbikgew0KICAgICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbikgew0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmNsaXBSb3dzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA+IGxhc3RSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBsYXN0Um93KzEsDQogICAgICAgICAgICAgICAgY29sdW1uOiAwDQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID4gbGFzdFJvdykgew0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gew0KICAgICAgICAgICAgICAgIHJvdzogbGFzdFJvdysxLA0KICAgICAgICAgICAgICAgIGNvbHVtbjogMA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA8IGZpcnN0Um93KSB7DQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBmaXJzdFJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IDANCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy5lbmQucm93IDwgZmlyc3RSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBmaXJzdFJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IDANCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQgfHwgdGhpcy5zdGFydCwgZW5kIHx8IHRoaXMuZW5kKTsNCiAgICB9Ow0KDQogICAgdGhpcy5leHRlbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgY21wID0gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsNCg0KICAgICAgICBpZiAoY21wID09IDApDQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgZWxzZSBpZiAoY21wID09IC0xKQ0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn07DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1ufTsNCg0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCB8fCB0aGlzLnN0YXJ0LCBlbmQgfHwgdGhpcy5lbmQpOw0KICAgIH07DQoNCiAgICB0aGlzLmlzRW1wdHkgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuICh0aGlzLnN0YXJ0LnJvdyA9PSB0aGlzLmVuZC5yb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gdGhpcy5lbmQuY29sdW1uKTsNCiAgICB9Ow0KDQogICAgdGhpcy5pc011bHRpTGluZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gKHRoaXMuc3RhcnQucm93ICE9PSB0aGlzLmVuZC5yb3cpOw0KICAgIH07DQoNCiAgICB0aGlzLmNsb25lID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRoaXMuc3RhcnQsIHRoaXMuZW5kKTsNCiAgICB9Ow0KDQogICAgdGhpcy5jb2xsYXBzZVJvd3MgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuZW5kLmNvbHVtbiA9PSAwKQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0LnJvdywgMCwgTWF0aC5tYXgodGhpcy5zdGFydC5yb3csIHRoaXMuZW5kLnJvdy0xKSwgMCkNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0LnJvdywgMCwgdGhpcy5lbmQucm93LCAwKQ0KICAgIH07DQoNCiAgICB0aGlzLnRvU2NyZWVuUmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHZhciBzY3JlZW5Qb3NTdGFydCA9DQogICAgICAgICAgICBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLnN0YXJ0KTsNCiAgICAgICAgdmFyIHNjcmVlblBvc0VuZCA9DQogICAgICAgICAgICBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmVuZCk7DQoNCiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSgNCiAgICAgICAgICAgIHNjcmVlblBvc1N0YXJ0LnJvdywgc2NyZWVuUG9zU3RhcnQuY29sdW1uLA0KICAgICAgICAgICAgc2NyZWVuUG9zRW5kLnJvdywgc2NyZWVuUG9zRW5kLmNvbHVtbg0KICAgICAgICApOw0KICAgIH07DQoNCn0pLmNhbGwoUmFuZ2UucHJvdG90eXBlKTsNCg0KDQpSYW5nZS5mcm9tUG9pbnRzID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnQucm93LCBzdGFydC5jb2x1bW4sIGVuZC5yb3csIGVuZC5jb2x1bW4pOw0KfTsNCg0KZXhwb3J0cy5SYW5nZSA9IFJhbmdlOw0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBNaWhhaSBTdWNhbiA8bWloYWkgRE9UIHN1Y2FuIEFUIGdtYWlsIERPVCBjb20+DQogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvdGV4dCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9iZWhhdmlvdXInLCAnYWNlL3VuaWNvZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ciIpLkJlaGF2aW91cjsNCnZhciB1bmljb2RlID0gcmVxdWlyZSgiLi4vdW5pY29kZSIpOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IFRleHRIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOw0KICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBCZWhhdmlvdXIoKTsNCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMudG9rZW5SZSA9IG5ldyBSZWdFeHAoIl5bIg0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTW4gKyB1bmljb2RlLnBhY2thZ2VzLk1jDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5OZA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuUGMgKyAiXFwkX10rIiwgImciDQogICAgKTsNCiAgICANCiAgICB0aGlzLm5vblRva2VuUmUgPSBuZXcgUmVnRXhwKCJeKD86W14iDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5MDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5NbiArIHVuaWNvZGUucGFja2FnZXMuTWMNCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLk5kDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5QYyArICJcXCRfXXxcc10pKyIsICJnIg0KICAgICk7DQoNCiAgICB0aGlzLmdldFRva2VuaXplciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kdG9rZW5pemVyOw0KICAgIH07DQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaGlnaGxpZ2h0U2VsZWN0aW9uID0gZnVuY3Rpb24oZWRpdG9yKSB7DQogICAgICAgIHZhciBzZXNzaW9uID0gZWRpdG9yLnNlc3Npb247DQogICAgICAgIGlmICghc2Vzc2lvbi4kc2VsZWN0aW9uT2NjdXJyZW5jZXMpDQogICAgICAgICAgICBzZXNzaW9uLiRzZWxlY3Rpb25PY2N1cnJlbmNlcyA9IFtdOw0KDQogICAgICAgIGlmIChzZXNzaW9uLiRzZWxlY3Rpb25PY2N1cnJlbmNlcy5sZW5ndGgpDQogICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uSGlnaGxpZ2h0KGVkaXRvcik7DQoNCiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICBpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSB8fCBzZWxlY3Rpb24uaXNNdWx0aUxpbmUoKSkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgc3RhcnRPdXRlciA9IHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gLSAxOw0KICAgICAgICB2YXIgZW5kT3V0ZXIgPSBzZWxlY3Rpb24uZW5kLmNvbHVtbiArIDE7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHNlbGVjdGlvbi5zdGFydC5yb3cpOw0KICAgICAgICB2YXIgbGluZUNvbHMgPSBsaW5lLmxlbmd0aDsNCiAgICAgICAgdmFyIG5lZWRsZSA9IGxpbmUuc3Vic3RyaW5nKE1hdGgubWF4KHN0YXJ0T3V0ZXIsIDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4oZW5kT3V0ZXIsIGxpbmVDb2xzKSk7DQoNCiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBvdXRlciBjaGFyYWN0ZXJzIGFyZSBub3QgcGFydCBvZiB0aGUgd29yZC4NCiAgICAgICAgaWYgKChzdGFydE91dGVyID49IDAgJiYgL15bXHdcZF0vLnRlc3QobmVlZGxlKSkgfHwNCiAgICAgICAgICAgIChlbmRPdXRlciA8PSBsaW5lQ29scyAmJiAvW1x3XGRdJC8udGVzdChuZWVkbGUpKSkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICBuZWVkbGUgPSBsaW5lLnN1YnN0cmluZyhzZWxlY3Rpb24uc3RhcnQuY29sdW1uLCBzZWxlY3Rpb24uZW5kLmNvbHVtbik7DQogICAgICAgIGlmICghL15bXHdcZF0rJC8udGVzdChuZWVkbGUpKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCg0KICAgICAgICB2YXIgbmV3T3B0aW9ucyA9IHsNCiAgICAgICAgICAgIHdyYXA6IHRydWUsDQogICAgICAgICAgICB3aG9sZVdvcmQ6IHRydWUsDQogICAgICAgICAgICBjYXNlU2Vuc2l0aXZlOiB0cnVlLA0KICAgICAgICAgICAgbmVlZGxlOiBuZWVkbGUNCiAgICAgICAgfTsNCg0KICAgICAgICB2YXIgY3VycmVudE9wdGlvbnMgPSBlZGl0b3IuJHNlYXJjaC5nZXRPcHRpb25zKCk7DQogICAgICAgIGVkaXRvci4kc2VhcmNoLnNldChuZXdPcHRpb25zKTsNCg0KICAgICAgICB2YXIgcmFuZ2VzID0gZWRpdG9yLiRzZWFyY2guZmluZEFsbChzZXNzaW9uKTsNCiAgICAgICAgcmFuZ2VzLmZvckVhY2goZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICAgICAgICAgIGlmICghcmFuZ2UuY29udGFpbnMoY3Vyc29yLnJvdywgY3Vyc29yLmNvbHVtbikpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWFya2VyID0gc2Vzc2lvbi5hZGRNYXJrZXIocmFuZ2UsICJhY2Vfc2VsZWN0ZWRfd29yZCIsICJ0ZXh0Iik7DQogICAgICAgICAgICAgICAgc2Vzc2lvbi4kc2VsZWN0aW9uT2NjdXJyZW5jZXMucHVzaChtYXJrZXIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICBlZGl0b3IuJHNlYXJjaC5zZXQoY3VycmVudE9wdGlvbnMpOw0KICAgIH07DQoNCiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uSGlnaGxpZ2h0ID0gZnVuY3Rpb24oZWRpdG9yKSB7DQogICAgICAgIGlmICghZWRpdG9yLnNlc3Npb24uJHNlbGVjdGlvbk9jY3VycmVuY2VzKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIGVkaXRvci5zZXNzaW9uLiRzZWxlY3Rpb25PY2N1cnJlbmNlcy5mb3JFYWNoKGZ1bmN0aW9uKG1hcmtlcikgew0KICAgICAgICAgICAgZWRpdG9yLnNlc3Npb24ucmVtb3ZlTWFya2VyKG1hcmtlcik7DQogICAgICAgIH0pOw0KDQogICAgICAgIGVkaXRvci5zZXNzaW9uLiRzZWxlY3Rpb25PY2N1cnJlbmNlcyA9IFtdOw0KICAgIH07DQogICAgDQogICAgdGhpcy5jcmVhdGVNb2RlRGVsZWdhdGVzID0gZnVuY3Rpb24gKG1hcHBpbmcpIHsNCiAgICAgICAgaWYgKCF0aGlzLiRlbWJlZHMpIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLiRtb2RlcyA9IHt9Ow0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuJGVtYmVkcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKG1hcHBpbmdbdGhpcy4kZW1iZWRzW2ldXSkgew0KICAgICAgICAgICAgICAgIHRoaXMuJG1vZGVzW3RoaXMuJGVtYmVkc1tpXV0gPSBuZXcgbWFwcGluZ1t0aGlzLiRlbWJlZHNbaV1dKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHZhciBkZWxlZ2F0aW9ucyA9IFsndG9nZ2xlQ29tbWVudExpbmVzJywgJ2dldE5leHRMaW5lSW5kZW50JywgJ2NoZWNrT3V0ZGVudCcsICdhdXRvT3V0ZGVudCcsICd0cmFuc2Zvcm1BY3Rpb24nXTsNCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGVnYXRpb25zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAoZnVuY3Rpb24oc2NvcGUpIHsNCiAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uTmFtZSA9IGRlbGVnYXRpb25zW2ldOw0KICAgICAgICAgICAgICB2YXIgZGVmYXVsdEhhbmRsZXIgPSBzY29wZVtmdW5jdGlvbk5hbWVdOw0KICAgICAgICAgICAgICBzY29wZVtkZWxlZ2F0aW9uc1tpXV0gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRkZWxlZ2F0b3IoZnVuY3Rpb25OYW1lLCBhcmd1bWVudHMsIGRlZmF1bHRIYW5kbGVyKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSAodGhpcykpOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIHRoaXMuJGRlbGVnYXRvciA9IGZ1bmN0aW9uKG1ldGhvZCwgYXJncywgZGVmYXVsdEhhbmRsZXIpIHsNCiAgICAgICAgdmFyIHN0YXRlID0gYXJnc1swXTsNCiAgICAgICAgDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy4kZW1iZWRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXRoaXMuJG1vZGVzW3RoaXMuJGVtYmVkc1tpXV0pIGNvbnRpbnVlOw0KICAgICAgICAgICAgDQogICAgICAgICAgICB2YXIgc3BsaXQgPSBzdGF0ZS5zcGxpdCh0aGlzLiRlbWJlZHNbaV0pOw0KICAgICAgICAgICAgaWYgKCFzcGxpdFswXSAmJiBzcGxpdFsxXSkgew0KICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSBzcGxpdFsxXTsNCiAgICAgICAgICAgICAgICB2YXIgbW9kZSA9IHRoaXMuJG1vZGVzW3RoaXMuJGVtYmVkc1tpXV07DQogICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVbbWV0aG9kXS5hcHBseShtb2RlLCBhcmdzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB2YXIgcmV0ID0gZGVmYXVsdEhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7DQogICAgICAgIHJldHVybiBkZWZhdWx0SGFuZGxlciA/IHJldCA6IHVuZGVmaW5lZDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMudHJhbnNmb3JtQWN0aW9uID0gZnVuY3Rpb24oc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCBwYXJhbSkgew0KICAgICAgICBpZiAodGhpcy4kYmVoYXZpb3VyKSB7DQogICAgICAgICAgICB2YXIgYmVoYXZpb3VycyA9IHRoaXMuJGJlaGF2aW91ci5nZXRCZWhhdmlvdXJzKCk7DQogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYmVoYXZpb3Vycykgew0KICAgICAgICAgICAgICAgIGlmIChiZWhhdmlvdXJzW2tleV1bYWN0aW9uXSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgcmV0ID0gYmVoYXZpb3Vyc1trZXldW2FjdGlvbl0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJldCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICANCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvdG9rZW5pemVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFRva2VuaXplciA9IGZ1bmN0aW9uKHJ1bGVzLCBmbGFnKSB7DQogICAgZmxhZyA9IGZsYWcgPyAiZyIgKyBmbGFnIDogImciOw0KICAgIHRoaXMucnVsZXMgPSBydWxlczsNCg0KICAgIHRoaXMucmVnRXhwcyA9IHt9Ow0KICAgIHRoaXMubWF0Y2hNYXBwaW5ncyA9IHt9Ow0KICAgIGZvciAoIHZhciBrZXkgaW4gdGhpcy5ydWxlcykgew0KICAgICAgICB2YXIgcnVsZSA9IHRoaXMucnVsZXNba2V5XTsNCiAgICAgICAgdmFyIHN0YXRlID0gcnVsZTsNCiAgICAgICAgdmFyIHJ1bGVSZWdFeHBzID0gW107DQogICAgICAgIHZhciBtYXRjaFRvdGFsID0gMDsNCiAgICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLm1hdGNoTWFwcGluZ3Nba2V5XSA9IHt9Ow0KICAgICAgICANCiAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgc3RhdGUubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIC8vIENvdW50IG51bWJlciBvZiBtYXRjaGluZyBncm91cHMuIDIgZXh0cmEgZ3JvdXBzIGZyb20gdGhlIGZ1bGwgbWF0Y2gNCiAgICAgICAgICAgIC8vIEFuZCB0aGUgY2F0Y2gtYWxsIG9uIHRoZSBlbmQgKHVzZWQgdG8gZm9yY2UgYSBtYXRjaCk7DQogICAgICAgICAgICB2YXIgbWF0Y2hjb3VudCA9IG5ldyBSZWdFeHAoIig/OigiICsgc3RhdGVbaV0ucmVnZXggKyAiKXwoLikpIikuZXhlYygiYSIpLmxlbmd0aCAtIDI7DQogICAgICAgIA0KICAgICAgICAgICAgLy8gUmVwbGFjZSBhbnkgYmFja3JlZmVyZW5jZXMgYW5kIG9mZnNldCBhcHByb3ByaWF0ZWx5Lg0KICAgICAgICAgICAgdmFyIGFkanVzdGVkcmVnZXggPSBzdGF0ZVtpXS5yZWdleC5yZXBsYWNlKC9cXChbMC05XSspL2csIGZ1bmN0aW9uIChtYXRjaCwgZGlnaXQpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIlxcIiArIChwYXJzZUludChkaWdpdCwgMTApICsgbWF0Y2hUb3RhbCArIDEpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIG1hcHBpbmdbbWF0Y2hUb3RhbF0gPSB7DQogICAgICAgICAgICAgICAgcnVsZTogaSwNCiAgICAgICAgICAgICAgICBsZW46IG1hdGNoY291bnQNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBtYXRjaFRvdGFsICs9IG1hdGNoY291bnQ7DQogICAgICAgICAgICANCiAgICAgICAgICAgIHJ1bGVSZWdFeHBzLnB1c2goYWRqdXN0ZWRyZWdleCk7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLnJlZ0V4cHNba2V5XSA9IG5ldyBSZWdFeHAoIig/OigiICsgcnVsZVJlZ0V4cHMuam9pbigiKXwoIikgKyAiKXwoLikpIiwgZmxhZyk7DQogICAgfQ0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXRMaW5lVG9rZW5zID0gZnVuY3Rpb24obGluZSwgc3RhcnRTdGF0ZSkgew0KICAgICAgICB2YXIgY3VycmVudFN0YXRlID0gc3RhcnRTdGF0ZTsNCiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5ydWxlc1tjdXJyZW50U3RhdGVdOw0KICAgICAgICB2YXIgbWFwcGluZyA9IHRoaXMubWF0Y2hNYXBwaW5nc1tjdXJyZW50U3RhdGVdOw0KICAgICAgICB2YXIgcmUgPSB0aGlzLnJlZ0V4cHNbY3VycmVudFN0YXRlXTsNCiAgICAgICAgcmUubGFzdEluZGV4ID0gMDsNCiAgICAgICAgDQogICAgICAgIHZhciBtYXRjaCwgdG9rZW5zID0gW107DQogICAgICAgIA0KICAgICAgICB2YXIgbGFzdEluZGV4ID0gMDsNCiAgICAgICAgDQogICAgICAgIHZhciB0b2tlbiA9IHsNCiAgICAgICAgICAgIHR5cGU6IG51bGwsDQogICAgICAgICAgICB2YWx1ZTogIiINCiAgICAgICAgfTsNCiAgICAgICAgDQogICAgICAgIHdoaWxlIChtYXRjaCA9IHJlLmV4ZWMobGluZSkpIHsNCiAgICAgICAgICAgIHZhciB0eXBlID0gInRleHQiOw0KICAgICAgICAgICAgdmFyIHJ1bGUgPSBudWxsOw0KICAgICAgICAgICAgdmFyIHZhbHVlID0gW21hdGNoWzBdXTsNCg0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXRjaC5sZW5ndGgtMjsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoW2kgKyAxXSAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgICAgIHJ1bGUgPSBzdGF0ZVttYXBwaW5nW2ldLnJ1bGVdOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBpbmdbaV0ubGVuID4gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtYXRjaC5zbGljZShpKzIsIGkrMSttYXBwaW5nW2ldLmxlbik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgdG9rZW4gdHlwZQ0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJ1bGUudG9rZW4gPT0gImZ1bmN0aW9uIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBydWxlLnRva2VuLmFwcGx5KHRoaXMsIHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHJ1bGUudG9rZW47DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBydWxlLm5leHQ7ICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgJiYgbmV4dCAhPT0gY3VycmVudFN0YXRlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBuZXh0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSB0aGlzLnJ1bGVzW2N1cnJlbnRTdGF0ZV07DQogICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gdGhpcy5tYXRjaE1hcHBpbmdzW2N1cnJlbnRTdGF0ZV07DQogICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSByZS5sYXN0SW5kZXg7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlID0gdGhpcy5yZWdFeHBzW2N1cnJlbnRTdGF0ZV07DQogICAgICAgICAgICAgICAgICAgICAgICByZS5sYXN0SW5kZXggPSBsYXN0SW5kZXg7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAodmFsdWVbMF0pIHsNCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBbdmFsdWUuam9pbigiIildOw0KICAgICAgICAgICAgICAgICAgICB0eXBlID0gW3R5cGVdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICgoIXJ1bGUgfHwgcnVsZS5tZXJnZSB8fCB0eXBlW2ldID09PSAidGV4dCIpICYmIHRva2VuLnR5cGUgPT09IHR5cGVbaV0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlICs9IHZhbHVlW2ldOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZVtpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVbaV0NCiAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPT0gbGluZS5sZW5ndGgpDQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGxhc3RJbmRleCA9IHJlLmxhc3RJbmRleDsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0b2tlbi50eXBlKQ0KICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pOw0KDQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbnMgOiB0b2tlbnMsDQogICAgICAgICAgICBzdGF0ZSA6IGN1cnJlbnRTdGF0ZQ0KICAgICAgICB9Ow0KICAgIH07DQoNCn0pLmNhbGwoVG9rZW5pemVyLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuVG9rZW5pemVyID0gVG9rZW5pemVyOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9sYW5nJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQoNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcw0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogW3sNCiAgICAgICAgICAgIHRva2VuIDogImVtcHR5X2xpbmUiLA0KICAgICAgICAgICAgcmVnZXggOiAnXiQnDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgIH1dDQogICAgfTsNCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuYWRkUnVsZXMgPSBmdW5jdGlvbihydWxlcywgcHJlZml4KSB7DQogICAgICAgIGZvciAodmFyIGtleSBpbiBydWxlcykgew0KICAgICAgICAgICAgdmFyIHN0YXRlID0gcnVsZXNba2V5XTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxzdGF0ZS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBydWxlID0gc3RhdGVbaV07DQogICAgICAgICAgICAgICAgaWYgKHJ1bGUubmV4dCkgew0KICAgICAgICAgICAgICAgICAgICBydWxlLm5leHQgPSBwcmVmaXggKyBydWxlLm5leHQ7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcnVsZS5uZXh0ID0gcHJlZml4ICsga2V5Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuJHJ1bGVzW3ByZWZpeCArIGtleV0gPSBzdGF0ZTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmdldFJ1bGVzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRydWxlczsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZW1iZWRSdWxlcyA9IGZ1bmN0aW9uIChIaWdobGlnaHRSdWxlcywgcHJlZml4LCBlc2NhcGVSdWxlcywgc3RhdGVzKSB7DQogICAgICAgIHZhciBlbWJlZFJ1bGVzID0gbmV3IEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKTsNCiAgICAgICAgaWYgKHN0YXRlcykgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBzdGF0ZXNbaV0gPSBwcmVmaXggKyBzdGF0ZXNbaV07DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBzdGF0ZXMgPSBbXTsNCiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBlbWJlZFJ1bGVzKSB7DQogICAgICAgICAgICAgICAgc3RhdGVzLnB1c2gocHJlZml4ICsga2V5KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmFkZFJ1bGVzKGVtYmVkUnVsZXMsIHByZWZpeCk7DQogICAgICAgIA0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkodGhpcy4kcnVsZXNbc3RhdGVzW2ldXSwgbGFuZy5kZWVwQ29weShlc2NhcGVSdWxlcykpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoIXRoaXMuJGVtYmVkcykgew0KICAgICAgICAgICAgdGhpcy4kZW1iZWRzID0gW107DQogICAgICAgIH0NCiAgICAgICAgdGhpcy4kZW1iZWRzLnB1c2gocHJlZml4KTsNCiAgICB9DQogICAgDQogICAgdGhpcy5nZXRFbWJlZHMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGVtYmVkczsNCiAgICB9DQoNCn0pLmNhbGwoVGV4dEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuVGV4dEhpZ2hsaWdodFJ1bGVzID0gVGV4dEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91cicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBCZWhhdmlvdXIgPSBmdW5jdGlvbigpIHsNCiAgIHRoaXMuJGJlaGF2aW91cnMgPSB7fTsNCn07DQoNCihmdW5jdGlvbiAoKSB7DQoNCiAgICB0aGlzLmFkZCA9IGZ1bmN0aW9uIChuYW1lLCBhY3Rpb24sIGNhbGxiYWNrKSB7DQogICAgICAgIHN3aXRjaCAodW5kZWZpbmVkKSB7DQogICAgICAgICAgY2FzZSB0aGlzLiRiZWhhdmlvdXJzOg0KICAgICAgICAgICAgICB0aGlzLiRiZWhhdmlvdXJzID0ge307DQogICAgICAgICAgY2FzZSB0aGlzLiRiZWhhdmlvdXJzW25hbWVdOg0KICAgICAgICAgICAgICB0aGlzLiRiZWhhdmlvdXJzW25hbWVdID0ge307DQogICAgICAgIH0NCiAgICAgICAgdGhpcy4kYmVoYXZpb3Vyc1tuYW1lXVthY3Rpb25dID0gY2FsbGJhY2s7DQogICAgfQ0KICAgIA0KICAgIHRoaXMuYWRkQmVoYXZpb3VycyA9IGZ1bmN0aW9uIChiZWhhdmlvdXJzKSB7DQogICAgICAgIGZvciAodmFyIGtleSBpbiBiZWhhdmlvdXJzKSB7DQogICAgICAgICAgICBmb3IgKHZhciBhY3Rpb24gaW4gYmVoYXZpb3Vyc1trZXldKSB7DQogICAgICAgICAgICAgICAgdGhpcy5hZGQoa2V5LCBhY3Rpb24sIGJlaGF2aW91cnNba2V5XVthY3Rpb25dKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICB0aGlzLnJlbW92ZSA9IGZ1bmN0aW9uIChuYW1lKSB7DQogICAgICAgIGlmICh0aGlzLiRiZWhhdmlvdXJzICYmIHRoaXMuJGJlaGF2aW91cnNbbmFtZV0pIHsNCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLiRiZWhhdmlvdXJzW25hbWVdOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIHRoaXMuaW5oZXJpdCA9IGZ1bmN0aW9uIChtb2RlLCBmaWx0ZXIpIHsNCiAgICAgICAgaWYgKHR5cGVvZiBtb2RlID09PSAiZnVuY3Rpb24iKSB7DQogICAgICAgICAgICB2YXIgYmVoYXZpb3VycyA9IG5ldyBtb2RlKCkuZ2V0QmVoYXZpb3VycyhmaWx0ZXIpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdmFyIGJlaGF2aW91cnMgPSBtb2RlLmdldEJlaGF2aW91cnMoZmlsdGVyKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmFkZEJlaGF2aW91cnMoYmVoYXZpb3Vycyk7DQogICAgfQ0KICAgIA0KICAgIHRoaXMuZ2V0QmVoYXZpb3VycyA9IGZ1bmN0aW9uIChmaWx0ZXIpIHsNCiAgICAgICAgaWYgKCFmaWx0ZXIpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLiRiZWhhdmlvdXJzOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdmFyIHJldCA9IHt9DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbHRlci5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGlmICh0aGlzLiRiZWhhdmlvdXJzW2ZpbHRlcltpXV0pIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0W2ZpbHRlcltpXV0gPSB0aGlzLiRiZWhhdmlvdXJzW2ZpbHRlcltpXV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHJldDsNCiAgICAgICAgfQ0KICAgIH0NCg0KfSkuY2FsbChCZWhhdmlvdXIucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5CZWhhdmlvdXIgPSBCZWhhdmlvdXI7DQp9KTtkZWZpbmUoJ2FjZS91bmljb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KLyoNClhSZWdFeHAgVW5pY29kZSBwbHVnaW4gcGFjazogQ2F0ZWdvcmllcyAxLjANCihjKSAyMDEwIFN0ZXZlbiBMZXZpdGhhbg0KTUlUIExpY2Vuc2UNCjxodHRwOi8veHJlZ2V4cC5jb20+DQpVc2VzIHRoZSBVbmljb2RlIDUuMiBjaGFyYWN0ZXIgZGF0YWJhc2UNCg0KVGhpcyBwYWNrYWdlIGZvciB0aGUgWFJlZ0V4cCBVbmljb2RlIHBsdWdpbiBlbmFibGVzIHRoZSBmb2xsb3dpbmcgVW5pY29kZSBjYXRlZ29yaWVzIChha2EgcHJvcGVydGllcyk6DQoNCkwgLSBMZXR0ZXIgKHRoZSB0b3AtbGV2ZWwgTGV0dGVyIGNhdGVnb3J5IGlzIGluY2x1ZGVkIGluIHRoZSBVbmljb2RlIHBsdWdpbiBiYXNlIHNjcmlwdCkNCiAgICBMbCAtIExvd2VyY2FzZSBsZXR0ZXINCiAgICBMdSAtIFVwcGVyY2FzZSBsZXR0ZXINCiAgICBMdCAtIFRpdGxlY2FzZSBsZXR0ZXINCiAgICBMbSAtIE1vZGlmaWVyIGxldHRlcg0KICAgIExvIC0gTGV0dGVyIHdpdGhvdXQgY2FzZQ0KTSAtIE1hcmsNCiAgICBNbiAtIE5vbi1zcGFjaW5nIG1hcmsNCiAgICBNYyAtIFNwYWNpbmcgY29tYmluaW5nIG1hcmsNCiAgICBNZSAtIEVuY2xvc2luZyBtYXJrDQpOIC0gTnVtYmVyDQogICAgTmQgLSBEZWNpbWFsIGRpZ2l0DQogICAgTmwgLSBMZXR0ZXIgbnVtYmVyDQogICAgTm8gLSAgT3RoZXIgbnVtYmVyDQpQIC0gUHVuY3R1YXRpb24NCiAgICBQZCAtIERhc2ggcHVuY3R1YXRpb24NCiAgICBQcyAtIE9wZW4gcHVuY3R1YXRpb24NCiAgICBQZSAtIENsb3NlIHB1bmN0dWF0aW9uDQogICAgUGkgLSBJbml0aWFsIHB1bmN0dWF0aW9uDQogICAgUGYgLSBGaW5hbCBwdW5jdHVhdGlvbg0KICAgIFBjIC0gQ29ubmVjdG9yIHB1bmN0dWF0aW9uDQogICAgUG8gLSBPdGhlciBwdW5jdHVhdGlvbg0KUyAtIFN5bWJvbA0KICAgIFNtIC0gTWF0aCBzeW1ib2wNCiAgICBTYyAtIEN1cnJlbmN5IHN5bWJvbA0KICAgIFNrIC0gTW9kaWZpZXIgc3ltYm9sDQogICAgU28gLSBPdGhlciBzeW1ib2wNClogLSBTZXBhcmF0b3INCiAgICBacyAtIFNwYWNlIHNlcGFyYXRvcg0KICAgIFpsIC0gTGluZSBzZXBhcmF0b3INCiAgICBacCAtIFBhcmFncmFwaCBzZXBhcmF0b3INCkMgLSBPdGhlcg0KICAgIENjIC0gQ29udHJvbA0KICAgIENmIC0gRm9ybWF0DQogICAgQ28gLSBQcml2YXRlIHVzZQ0KICAgIENzIC0gU3Vycm9nYXRlDQogICAgQ24gLSBVbmFzc2lnbmVkDQoNCkV4YW1wbGUgdXNhZ2U6DQoNCiAgICBccHtOfQ0KICAgIFxwe0NufQ0KKi8NCg0KDQovLyB3aWxsIGJlIHBvcHVsYXRlZCBieSBhZGRVbmljb2RlUGFja2FnZQ0KZXhwb3J0cy5wYWNrYWdlcyA9IHt9Ow0KDQphZGRVbmljb2RlUGFja2FnZSh7DQogICAgTDogICIwMDQxLTAwNUEwMDYxLTAwN0EwMEFBMDBCNTAwQkEwMEMwLTAwRDYwMEQ4LTAwRjYwMEY4LTAyQzEwMkM2LTAyRDEwMkUwLTAyRTQwMkVDMDJFRTAzNzAtMDM3NDAzNzYwMzc3MDM3QS0wMzdEMDM4NjAzODgtMDM4QTAzOEMwMzhFLTAzQTEwM0EzLTAzRjUwM0Y3LTA0ODEwNDhBLTA1MjUwNTMxLTA1NTYwNTU5MDU2MS0wNTg3MDVEMC0wNUVBMDVGMC0wNUYyMDYyMS0wNjRBMDY2RTA2NkYwNjcxLTA2RDMwNkQ1MDZFNTA2RTYwNkVFMDZFRjA2RkEtMDZGQzA2RkYwNzEwMDcxMi0wNzJGMDc0RC0wN0E1MDdCMTA3Q0EtMDdFQTA3RjQwN0Y1MDdGQTA4MDAtMDgxNTA4MUEwODI0MDgyODA5MDQtMDkzOTA5M0QwOTUwMDk1OC0wOTYxMDk3MTA5NzIwOTc5LTA5N0YwOTg1LTA5OEMwOThGMDk5MDA5OTMtMDlBODA5QUEtMDlCMDA5QjIwOUI2LTA5QjkwOUJEMDlDRTA5REMwOUREMDlERi0wOUUxMDlGMDA5RjEwQTA1LTBBMEEwQTBGMEExMDBBMTMtMEEyODBBMkEtMEEzMDBBMzIwQTMzMEEzNTBBMzYwQTM4MEEzOTBBNTktMEE1QzBBNUUwQTcyLTBBNzQwQTg1LTBBOEQwQThGLTBBOTEwQTkzLTBBQTgwQUFBLTBBQjAwQUIyMEFCMzBBQjUtMEFCOTBBQkQwQUQwMEFFMDBBRTEwQjA1LTBCMEMwQjBGMEIxMDBCMTMtMEIyODBCMkEtMEIzMDBCMzIwQjMzMEIzNS0wQjM5MEIzRDBCNUMwQjVEMEI1Ri0wQjYxMEI3MTBCODMwQjg1LTBCOEEwQjhFLTBCOTAwQjkyLTBCOTUwQjk5MEI5QTBCOUMwQjlFMEI5RjBCQTMwQkE0MEJBOC0wQkFBMEJBRS0wQkI5MEJEMDBDMDUtMEMwQzBDMEUtMEMxMDBDMTItMEMyODBDMkEtMEMzMzBDMzUtMEMzOTBDM0QwQzU4MEM1OTBDNjAwQzYxMEM4NS0wQzhDMEM4RS0wQzkwMEM5Mi0wQ0E4MENBQS0wQ0IzMENCNS0wQ0I5MENCRDBDREUwQ0UwMENFMTBEMDUtMEQwQzBEMEUtMEQxMDBEMTItMEQyODBEMkEtMEQzOTBEM0QwRDYwMEQ2MTBEN0EtMEQ3RjBEODUtMEQ5NjBEOUEtMERCMTBEQjMtMERCQjBEQkQwREMwLTBEQzYwRTAxLTBFMzAwRTMyMEUzMzBFNDAtMEU0NjBFODEwRTgyMEU4NDBFODcwRTg4MEU4QTBFOEQwRTk0LTBFOTcwRTk5LTBFOUYwRUExLTBFQTMwRUE1MEVBNzBFQUEwRUFCMEVBRC0wRUIwMEVCMjBFQjMwRUJEMEVDMC0wRUM0MEVDNjBFREMwRUREMEYwMDBGNDAtMEY0NzBGNDktMEY2QzBGODgtMEY4QjEwMDAtMTAyQTEwM0YxMDUwLTEwNTUxMDVBLTEwNUQxMDYxMTA2NTEwNjYxMDZFLTEwNzAxMDc1LTEwODExMDhFMTBBMC0xMEM1MTBEMC0xMEZBMTBGQzExMDAtMTI0ODEyNEEtMTI0RDEyNTAtMTI1NjEyNTgxMjVBLTEyNUQxMjYwLTEyODgxMjhBLTEyOEQxMjkwLTEyQjAxMkIyLTEyQjUxMkI4LTEyQkUxMkMwMTJDMi0xMkM1MTJDOC0xMkQ2MTJEOC0xMzEwMTMxMi0xMzE1MTMxOC0xMzVBMTM4MC0xMzhGMTNBMC0xM0Y0MTQwMS0xNjZDMTY2Ri0xNjdGMTY4MS0xNjlBMTZBMC0xNkVBMTcwMC0xNzBDMTcwRS0xNzExMTcyMC0xNzMxMTc0MC0xNzUxMTc2MC0xNzZDMTc2RS0xNzcwMTc4MC0xN0IzMTdENzE3REMxODIwLTE4NzcxODgwLTE4QTgxOEFBMThCMC0xOEY1MTkwMC0xOTFDMTk1MC0xOTZEMTk3MC0xOTc0MTk4MC0xOUFCMTlDMS0xOUM3MUEwMC0xQTE2MUEyMC0xQTU0MUFBNzFCMDUtMUIzMzFCNDUtMUI0QjFCODMtMUJBMDFCQUUxQkFGMUMwMC0xQzIzMUM0RC0xQzRGMUM1QS0xQzdEMUNFOS0xQ0VDMUNFRS0xQ0YxMUQwMC0xREJGMUUwMC0xRjE1MUYxOC0xRjFEMUYyMC0xRjQ1MUY0OC0xRjREMUY1MC0xRjU3MUY1OTFGNUIxRjVEMUY1Ri0xRjdEMUY4MC0xRkI0MUZCNi0xRkJDMUZCRTFGQzItMUZDNDFGQzYtMUZDQzFGRDAtMUZEMzFGRDYtMUZEQjFGRTAtMUZFQzFGRjItMUZGNDFGRjYtMUZGQzIwNzEyMDdGMjA5MC0yMDk0MjEwMjIxMDcyMTBBLTIxMTMyMTE1MjExOS0yMTFEMjEyNDIxMjYyMTI4MjEyQS0yMTJEMjEyRi0yMTM5MjEzQy0yMTNGMjE0NS0yMTQ5MjE0RTIxODMyMTg0MkMwMC0yQzJFMkMzMC0yQzVFMkM2MC0yQ0U0MkNFQi0yQ0VFMkQwMC0yRDI1MkQzMC0yRDY1MkQ2RjJEODAtMkQ5NjJEQTAtMkRBNjJEQTgtMkRBRTJEQjAtMkRCNjJEQjgtMkRCRTJEQzAtMkRDNjJEQzgtMkRDRTJERDAtMkRENjJERDgtMkRERTJFMkYzMDA1MzAwNjMwMzEtMzAzNTMwM0IzMDNDMzA0MS0zMDk2MzA5RC0zMDlGMzBBMS0zMEZBMzBGQy0zMEZGMzEwNS0zMTJEMzEzMS0zMThFMzFBMC0zMUI3MzFGMC0zMUZGMzQwMC00REI1NEUwMC05RkNCQTAwMC1BNDhDQTREMC1BNEZEQTUwMC1BNjBDQTYxMC1BNjFGQTYyQUE2MkJBNjQwLUE2NUZBNjYyLUE2NkVBNjdGLUE2OTdBNkEwLUE2RTVBNzE3LUE3MUZBNzIyLUE3ODhBNzhCQTc4Q0E3RkItQTgwMUE4MDMtQTgwNUE4MDctQTgwQUE4MEMtQTgyMkE4NDAtQTg3M0E4ODItQThCM0E4RjItQThGN0E4RkJBOTBBLUE5MjVBOTMwLUE5NDZBOTYwLUE5N0NBOTg0LUE5QjJBOUNGQUEwMC1BQTI4QUE0MC1BQTQyQUE0NC1BQTRCQUE2MC1BQTc2QUE3QUFBODAtQUFBRkFBQjFBQUI1QUFCNkFBQjktQUFCREFBQzBBQUMyQUFEQi1BQUREQUJDMC1BQkUyQUMwMC1EN0EzRDdCMC1EN0M2RDdDQi1EN0ZCRjkwMC1GQTJERkEzMC1GQTZERkE3MC1GQUQ5RkIwMC1GQjA2RkIxMy1GQjE3RkIxREZCMUYtRkIyOEZCMkEtRkIzNkZCMzgtRkIzQ0ZCM0VGQjQwRkI0MUZCNDNGQjQ0RkI0Ni1GQkIxRkJEMy1GRDNERkQ1MC1GRDhGRkQ5Mi1GREM3RkRGMC1GREZCRkU3MC1GRTc0RkU3Ni1GRUZDRkYyMS1GRjNBRkY0MS1GRjVBRkY2Ni1GRkJFRkZDMi1GRkM3RkZDQS1GRkNGRkZEMi1GRkQ3RkZEQS1GRkRDIiwNCiAgICBMbDogIjAwNjEtMDA3QTAwQUEwMEI1MDBCQTAwREYtMDBGNjAwRjgtMDBGRjAxMDEwMTAzMDEwNTAxMDcwMTA5MDEwQjAxMEQwMTBGMDExMTAxMTMwMTE1MDExNzAxMTkwMTFCMDExRDAxMUYwMTIxMDEyMzAxMjUwMTI3MDEyOTAxMkIwMTJEMDEyRjAxMzEwMTMzMDEzNTAxMzcwMTM4MDEzQTAxM0MwMTNFMDE0MDAxNDIwMTQ0MDE0NjAxNDgwMTQ5MDE0QjAxNEQwMTRGMDE1MTAxNTMwMTU1MDE1NzAxNTkwMTVCMDE1RDAxNUYwMTYxMDE2MzAxNjUwMTY3MDE2OTAxNkIwMTZEMDE2RjAxNzEwMTczMDE3NTAxNzcwMTdBMDE3QzAxN0UtMDE4MDAxODMwMTg1MDE4ODAxOEMwMThEMDE5MjAxOTUwMTk5LTAxOUIwMTlFMDFBMTAxQTMwMUE1MDFBODAxQUEwMUFCMDFBRDAxQjAwMUI0MDFCNjAxQjkwMUJBMDFCRC0wMUJGMDFDNjAxQzkwMUNDMDFDRTAxRDAwMUQyMDFENDAxRDYwMUQ4MDFEQTAxREMwMUREMDFERjAxRTEwMUUzMDFFNTAxRTcwMUU5MDFFQjAxRUQwMUVGMDFGMDAxRjMwMUY1MDFGOTAxRkIwMUZEMDFGRjAyMDEwMjAzMDIwNTAyMDcwMjA5MDIwQjAyMEQwMjBGMDIxMTAyMTMwMjE1MDIxNzAyMTkwMjFCMDIxRDAyMUYwMjIxMDIyMzAyMjUwMjI3MDIyOTAyMkIwMjJEMDIyRjAyMzEwMjMzLTAyMzkwMjNDMDIzRjAyNDAwMjQyMDI0NzAyNDkwMjRCMDI0RDAyNEYtMDI5MzAyOTUtMDJBRjAzNzEwMzczMDM3NzAzN0ItMDM3RDAzOTAwM0FDLTAzQ0UwM0QwMDNEMTAzRDUtMDNENzAzRDkwM0RCMDNERDAzREYwM0UxMDNFMzAzRTUwM0U3MDNFOTAzRUIwM0VEMDNFRi0wM0YzMDNGNTAzRjgwM0ZCMDNGQzA0MzAtMDQ1RjA0NjEwNDYzMDQ2NTA0NjcwNDY5MDQ2QjA0NkQwNDZGMDQ3MTA0NzMwNDc1MDQ3NzA0NzkwNDdCMDQ3RDA0N0YwNDgxMDQ4QjA0OEQwNDhGMDQ5MTA0OTMwNDk1MDQ5NzA0OTkwNDlCMDQ5RDA0OUYwNEExMDRBMzA0QTUwNEE3MDRBOTA0QUIwNEFEMDRBRjA0QjEwNEIzMDRCNTA0QjcwNEI5MDRCQjA0QkQwNEJGMDRDMjA0QzQwNEM2MDRDODA0Q0EwNENDMDRDRTA0Q0YwNEQxMDREMzA0RDUwNEQ3MDREOTA0REIwNEREMDRERjA0RTEwNEUzMDRFNTA0RTcwNEU5MDRFQjA0RUQwNEVGMDRGMTA0RjMwNEY1MDRGNzA0RjkwNEZCMDRGRDA0RkYwNTAxMDUwMzA1MDUwNTA3MDUwOTA1MEIwNTBEMDUwRjA1MTEwNTEzMDUxNTA1MTcwNTE5MDUxQjA1MUQwNTFGMDUyMTA1MjMwNTI1MDU2MS0wNTg3MUQwMC0xRDJCMUQ2Mi0xRDc3MUQ3OS0xRDlBMUUwMTFFMDMxRTA1MUUwNzFFMDkxRTBCMUUwRDFFMEYxRTExMUUxMzFFMTUxRTE3MUUxOTFFMUIxRTFEMUUxRjFFMjExRTIzMUUyNTFFMjcxRTI5MUUyQjFFMkQxRTJGMUUzMTFFMzMxRTM1MUUzNzFFMzkxRTNCMUUzRDFFM0YxRTQxMUU0MzFFNDUxRTQ3MUU0OTFFNEIxRTREMUU0RjFFNTExRTUzMUU1NTFFNTcxRTU5MUU1QjFFNUQxRTVGMUU2MTFFNjMxRTY1MUU2NzFFNjkxRTZCMUU2RDFFNkYxRTcxMUU3MzFFNzUxRTc3MUU3OTFFN0IxRTdEMUU3RjFFODExRTgzMUU4NTFFODcxRTg5MUU4QjFFOEQxRThGMUU5MTFFOTMxRTk1LTFFOUQxRTlGMUVBMTFFQTMxRUE1MUVBNzFFQTkxRUFCMUVBRDFFQUYxRUIxMUVCMzFFQjUxRUI3MUVCOTFFQkIxRUJEMUVCRjFFQzExRUMzMUVDNTFFQzcxRUM5MUVDQjFFQ0QxRUNGMUVEMTFFRDMxRUQ1MUVENzFFRDkxRURCMUVERDFFREYxRUUxMUVFMzFFRTUxRUU3MUVFOTFFRUIxRUVEMUVFRjFFRjExRUYzMUVGNTFFRjcxRUY5MUVGQjFFRkQxRUZGLTFGMDcxRjEwLTFGMTUxRjIwLTFGMjcxRjMwLTFGMzcxRjQwLTFGNDUxRjUwLTFGNTcxRjYwLTFGNjcxRjcwLTFGN0QxRjgwLTFGODcxRjkwLTFGOTcxRkEwLTFGQTcxRkIwLTFGQjQxRkI2MUZCNzFGQkUxRkMyLTFGQzQxRkM2MUZDNzFGRDAtMUZEMzFGRDYxRkQ3MUZFMC0xRkU3MUZGMi0xRkY0MUZGNjFGRjcyMTBBMjEwRTIxMEYyMTEzMjEyRjIxMzQyMTM5MjEzQzIxM0QyMTQ2LTIxNDkyMTRFMjE4NDJDMzAtMkM1RTJDNjEyQzY1MkM2NjJDNjgyQzZBMkM2QzJDNzEyQzczMkM3NDJDNzYtMkM3QzJDODEyQzgzMkM4NTJDODcyQzg5MkM4QjJDOEQyQzhGMkM5MTJDOTMyQzk1MkM5NzJDOTkyQzlCMkM5RDJDOUYyQ0ExMkNBMzJDQTUyQ0E3MkNBOTJDQUIyQ0FEMkNBRjJDQjEyQ0IzMkNCNTJDQjcyQ0I5MkNCQjJDQkQyQ0JGMkNDMTJDQzMyQ0M1MkNDNzJDQzkyQ0NCMkNDRDJDQ0YyQ0QxMkNEMzJDRDUyQ0Q3MkNEOTJDREIyQ0REMkNERjJDRTEyQ0UzMkNFNDJDRUMyQ0VFMkQwMC0yRDI1QTY0MUE2NDNBNjQ1QTY0N0E2NDlBNjRCQTY0REE2NEZBNjUxQTY1M0E2NTVBNjU3QTY1OUE2NUJBNjVEQTY1RkE2NjNBNjY1QTY2N0E2NjlBNjZCQTY2REE2ODFBNjgzQTY4NUE2ODdBNjg5QTY4QkE2OERBNjhGQTY5MUE2OTNBNjk1QTY5N0E3MjNBNzI1QTcyN0E3MjlBNzJCQTcyREE3MkYtQTczMUE3MzNBNzM1QTczN0E3MzlBNzNCQTczREE3M0ZBNzQxQTc0M0E3NDVBNzQ3QTc0OUE3NEJBNzREQTc0RkE3NTFBNzUzQTc1NUE3NTdBNzU5QTc1QkE3NURBNzVGQTc2MUE3NjNBNzY1QTc2N0E3NjlBNzZCQTc2REE3NkZBNzcxLUE3NzhBNzdBQTc3Q0E3N0ZBNzgxQTc4M0E3ODVBNzg3QTc4Q0ZCMDAtRkIwNkZCMTMtRkIxN0ZGNDEtRkY1QSIsDQogICAgTHU6ICIwMDQxLTAwNUEwMEMwLTAwRDYwMEQ4LTAwREUwMTAwMDEwMjAxMDQwMTA2MDEwODAxMEEwMTBDMDEwRTAxMTAwMTEyMDExNDAxMTYwMTE4MDExQTAxMUMwMTFFMDEyMDAxMjIwMTI0MDEyNjAxMjgwMTJBMDEyQzAxMkUwMTMwMDEzMjAxMzQwMTM2MDEzOTAxM0IwMTNEMDEzRjAxNDEwMTQzMDE0NTAxNDcwMTRBMDE0QzAxNEUwMTUwMDE1MjAxNTQwMTU2MDE1ODAxNUEwMTVDMDE1RTAxNjAwMTYyMDE2NDAxNjYwMTY4MDE2QTAxNkMwMTZFMDE3MDAxNzIwMTc0MDE3NjAxNzgwMTc5MDE3QjAxN0QwMTgxMDE4MjAxODQwMTg2MDE4NzAxODktMDE4QjAxOEUtMDE5MTAxOTMwMTk0MDE5Ni0wMTk4MDE5QzAxOUQwMTlGMDFBMDAxQTIwMUE0MDFBNjAxQTcwMUE5MDFBQzAxQUUwMUFGMDFCMS0wMUIzMDFCNTAxQjcwMUI4MDFCQzAxQzQwMUM3MDFDQTAxQ0QwMUNGMDFEMTAxRDMwMUQ1MDFENzAxRDkwMURCMDFERTAxRTAwMUUyMDFFNDAxRTYwMUU4MDFFQTAxRUMwMUVFMDFGMTAxRjQwMUY2LTAxRjgwMUZBMDFGQzAxRkUwMjAwMDIwMjAyMDQwMjA2MDIwODAyMEEwMjBDMDIwRTAyMTAwMjEyMDIxNDAyMTYwMjE4MDIxQTAyMUMwMjFFMDIyMDAyMjIwMjI0MDIyNjAyMjgwMjJBMDIyQzAyMkUwMjMwMDIzMjAyM0EwMjNCMDIzRDAyM0UwMjQxMDI0My0wMjQ2MDI0ODAyNEEwMjRDMDI0RTAzNzAwMzcyMDM3NjAzODYwMzg4LTAzOEEwMzhDMDM4RTAzOEYwMzkxLTAzQTEwM0EzLTAzQUIwM0NGMDNEMi0wM0Q0MDNEODAzREEwM0RDMDNERTAzRTAwM0UyMDNFNDAzRTYwM0U4MDNFQTAzRUMwM0VFMDNGNDAzRjcwM0Y5MDNGQTAzRkQtMDQyRjA0NjAwNDYyMDQ2NDA0NjYwNDY4MDQ2QTA0NkMwNDZFMDQ3MDA0NzIwNDc0MDQ3NjA0NzgwNDdBMDQ3QzA0N0UwNDgwMDQ4QTA0OEMwNDhFMDQ5MDA0OTIwNDk0MDQ5NjA0OTgwNDlBMDQ5QzA0OUUwNEEwMDRBMjA0QTQwNEE2MDRBODA0QUEwNEFDMDRBRTA0QjAwNEIyMDRCNDA0QjYwNEI4MDRCQTA0QkMwNEJFMDRDMDA0QzEwNEMzMDRDNTA0QzcwNEM5MDRDQjA0Q0QwNEQwMDREMjA0RDQwNEQ2MDREODA0REEwNERDMDRERTA0RTAwNEUyMDRFNDA0RTYwNEU4MDRFQTA0RUMwNEVFMDRGMDA0RjIwNEY0MDRGNjA0RjgwNEZBMDRGQzA0RkUwNTAwMDUwMjA1MDQwNTA2MDUwODA1MEEwNTBDMDUwRTA1MTAwNTEyMDUxNDA1MTYwNTE4MDUxQTA1MUMwNTFFMDUyMDA1MjIwNTI0MDUzMS0wNTU2MTBBMC0xMEM1MUUwMDFFMDIxRTA0MUUwNjFFMDgxRTBBMUUwQzFFMEUxRTEwMUUxMjFFMTQxRTE2MUUxODFFMUExRTFDMUUxRTFFMjAxRTIyMUUyNDFFMjYxRTI4MUUyQTFFMkMxRTJFMUUzMDFFMzIxRTM0MUUzNjFFMzgxRTNBMUUzQzFFM0UxRTQwMUU0MjFFNDQxRTQ2MUU0ODFFNEExRTRDMUU0RTFFNTAxRTUyMUU1NDFFNTYxRTU4MUU1QTFFNUMxRTVFMUU2MDFFNjIxRTY0MUU2NjFFNjgxRTZBMUU2QzFFNkUxRTcwMUU3MjFFNzQxRTc2MUU3ODFFN0ExRTdDMUU3RTFFODAxRTgyMUU4NDFFODYxRTg4MUU4QTFFOEMxRThFMUU5MDFFOTIxRTk0MUU5RTFFQTAxRUEyMUVBNDFFQTYxRUE4MUVBQTFFQUMxRUFFMUVCMDFFQjIxRUI0MUVCNjFFQjgxRUJBMUVCQzFFQkUxRUMwMUVDMjFFQzQxRUM2MUVDODFFQ0ExRUNDMUVDRTFFRDAxRUQyMUVENDFFRDYxRUQ4MUVEQTFFREMxRURFMUVFMDFFRTIxRUU0MUVFNjFFRTgxRUVBMUVFQzFFRUUxRUYwMUVGMjFFRjQxRUY2MUVGODFFRkExRUZDMUVGRTFGMDgtMUYwRjFGMTgtMUYxRDFGMjgtMUYyRjFGMzgtMUYzRjFGNDgtMUY0RDFGNTkxRjVCMUY1RDFGNUYxRjY4LTFGNkYxRkI4LTFGQkIxRkM4LTFGQ0IxRkQ4LTFGREIxRkU4LTFGRUMxRkY4LTFGRkIyMTAyMjEwNzIxMEItMjEwRDIxMTAtMjExMjIxMTUyMTE5LTIxMUQyMTI0MjEyNjIxMjgyMTJBLTIxMkQyMTMwLTIxMzMyMTNFMjEzRjIxNDUyMTgzMkMwMC0yQzJFMkM2MDJDNjItMkM2NDJDNjcyQzY5MkM2QjJDNkQtMkM3MDJDNzIyQzc1MkM3RS0yQzgwMkM4MjJDODQyQzg2MkM4ODJDOEEyQzhDMkM4RTJDOTAyQzkyMkM5NDJDOTYyQzk4MkM5QTJDOUMyQzlFMkNBMDJDQTIyQ0E0MkNBNjJDQTgyQ0FBMkNBQzJDQUUyQ0IwMkNCMjJDQjQyQ0I2MkNCODJDQkEyQ0JDMkNCRTJDQzAyQ0MyMkNDNDJDQzYyQ0M4MkNDQTJDQ0MyQ0NFMkNEMDJDRDIyQ0Q0MkNENjJDRDgyQ0RBMkNEQzJDREUyQ0UwMkNFMjJDRUIyQ0VEQTY0MEE2NDJBNjQ0QTY0NkE2NDhBNjRBQTY0Q0E2NEVBNjUwQTY1MkE2NTRBNjU2QTY1OEE2NUFBNjVDQTY1RUE2NjJBNjY0QTY2NkE2NjhBNjZBQTY2Q0E2ODBBNjgyQTY4NEE2ODZBNjg4QTY4QUE2OENBNjhFQTY5MEE2OTJBNjk0QTY5NkE3MjJBNzI0QTcyNkE3MjhBNzJBQTcyQ0E3MkVBNzMyQTczNEE3MzZBNzM4QTczQUE3M0NBNzNFQTc0MEE3NDJBNzQ0QTc0NkE3NDhBNzRBQTc0Q0E3NEVBNzUwQTc1MkE3NTRBNzU2QTc1OEE3NUFBNzVDQTc1RUE3NjBBNzYyQTc2NEE3NjZBNzY4QTc2QUE3NkNBNzZFQTc3OUE3N0JBNzdEQTc3RUE3ODBBNzgyQTc4NEE3ODZBNzhCRkYyMS1GRjNBIiwNCiAgICBMdDogIjAxQzUwMUM4MDFDQjAxRjIxRjg4LTFGOEYxRjk4LTFGOUYxRkE4LTFGQUYxRkJDMUZDQzFGRkMiLA0KICAgIExtOiAiMDJCMC0wMkMxMDJDNi0wMkQxMDJFMC0wMkU0MDJFQzAyRUUwMzc0MDM3QTA1NTkwNjQwMDZFNTA2RTYwN0Y0MDdGNTA3RkEwODFBMDgyNDA4MjgwOTcxMEU0NjBFQzYxMEZDMTdENzE4NDMxQUE3MUM3OC0xQzdEMUQyQy0xRDYxMUQ3ODFEOUItMURCRjIwNzEyMDdGMjA5MC0yMDk0MkM3RDJENkYyRTJGMzAwNTMwMzEtMzAzNTMwM0IzMDlEMzA5RTMwRkMtMzBGRUEwMTVBNEY4LUE0RkRBNjBDQTY3RkE3MTctQTcxRkE3NzBBNzg4QTlDRkFBNzBBQURERkY3MEZGOUVGRjlGIiwNCiAgICBMbzogIjAxQkIwMUMwLTAxQzMwMjk0MDVEMC0wNUVBMDVGMC0wNUYyMDYyMS0wNjNGMDY0MS0wNjRBMDY2RTA2NkYwNjcxLTA2RDMwNkQ1MDZFRTA2RUYwNkZBLTA2RkMwNkZGMDcxMDA3MTItMDcyRjA3NEQtMDdBNTA3QjEwN0NBLTA3RUEwODAwLTA4MTUwOTA0LTA5MzkwOTNEMDk1MDA5NTgtMDk2MTA5NzIwOTc5LTA5N0YwOTg1LTA5OEMwOThGMDk5MDA5OTMtMDlBODA5QUEtMDlCMDA5QjIwOUI2LTA5QjkwOUJEMDlDRTA5REMwOUREMDlERi0wOUUxMDlGMDA5RjEwQTA1LTBBMEEwQTBGMEExMDBBMTMtMEEyODBBMkEtMEEzMDBBMzIwQTMzMEEzNTBBMzYwQTM4MEEzOTBBNTktMEE1QzBBNUUwQTcyLTBBNzQwQTg1LTBBOEQwQThGLTBBOTEwQTkzLTBBQTgwQUFBLTBBQjAwQUIyMEFCMzBBQjUtMEFCOTBBQkQwQUQwMEFFMDBBRTEwQjA1LTBCMEMwQjBGMEIxMDBCMTMtMEIyODBCMkEtMEIzMDBCMzIwQjMzMEIzNS0wQjM5MEIzRDBCNUMwQjVEMEI1Ri0wQjYxMEI3MTBCODMwQjg1LTBCOEEwQjhFLTBCOTAwQjkyLTBCOTUwQjk5MEI5QTBCOUMwQjlFMEI5RjBCQTMwQkE0MEJBOC0wQkFBMEJBRS0wQkI5MEJEMDBDMDUtMEMwQzBDMEUtMEMxMDBDMTItMEMyODBDMkEtMEMzMzBDMzUtMEMzOTBDM0QwQzU4MEM1OTBDNjAwQzYxMEM4NS0wQzhDMEM4RS0wQzkwMEM5Mi0wQ0E4MENBQS0wQ0IzMENCNS0wQ0I5MENCRDBDREUwQ0UwMENFMTBEMDUtMEQwQzBEMEUtMEQxMDBEMTItMEQyODBEMkEtMEQzOTBEM0QwRDYwMEQ2MTBEN0EtMEQ3RjBEODUtMEQ5NjBEOUEtMERCMTBEQjMtMERCQjBEQkQwREMwLTBEQzYwRTAxLTBFMzAwRTMyMEUzMzBFNDAtMEU0NTBFODEwRTgyMEU4NDBFODcwRTg4MEU4QTBFOEQwRTk0LTBFOTcwRTk5LTBFOUYwRUExLTBFQTMwRUE1MEVBNzBFQUEwRUFCMEVBRC0wRUIwMEVCMjBFQjMwRUJEMEVDMC0wRUM0MEVEQzBFREQwRjAwMEY0MC0wRjQ3MEY0OS0wRjZDMEY4OC0wRjhCMTAwMC0xMDJBMTAzRjEwNTAtMTA1NTEwNUEtMTA1RDEwNjExMDY1MTA2NjEwNkUtMTA3MDEwNzUtMTA4MTEwOEUxMEQwLTEwRkExMTAwLTEyNDgxMjRBLTEyNEQxMjUwLTEyNTYxMjU4MTI1QS0xMjVEMTI2MC0xMjg4MTI4QS0xMjhEMTI5MC0xMkIwMTJCMi0xMkI1MTJCOC0xMkJFMTJDMDEyQzItMTJDNTEyQzgtMTJENjEyRDgtMTMxMDEzMTItMTMxNTEzMTgtMTM1QTEzODAtMTM4RjEzQTAtMTNGNDE0MDEtMTY2QzE2NkYtMTY3RjE2ODEtMTY5QTE2QTAtMTZFQTE3MDAtMTcwQzE3MEUtMTcxMTE3MjAtMTczMTE3NDAtMTc1MTE3NjAtMTc2QzE3NkUtMTc3MDE3ODAtMTdCMzE3REMxODIwLTE4NDIxODQ0LTE4NzcxODgwLTE4QTgxOEFBMThCMC0xOEY1MTkwMC0xOTFDMTk1MC0xOTZEMTk3MC0xOTc0MTk4MC0xOUFCMTlDMS0xOUM3MUEwMC0xQTE2MUEyMC0xQTU0MUIwNS0xQjMzMUI0NS0xQjRCMUI4My0xQkEwMUJBRTFCQUYxQzAwLTFDMjMxQzRELTFDNEYxQzVBLTFDNzcxQ0U5LTFDRUMxQ0VFLTFDRjEyMTM1LTIxMzgyRDMwLTJENjUyRDgwLTJEOTYyREEwLTJEQTYyREE4LTJEQUUyREIwLTJEQjYyREI4LTJEQkUyREMwLTJEQzYyREM4LTJEQ0UyREQwLTJERDYyREQ4LTJEREUzMDA2MzAzQzMwNDEtMzA5NjMwOUYzMEExLTMwRkEzMEZGMzEwNS0zMTJEMzEzMS0zMThFMzFBMC0zMUI3MzFGMC0zMUZGMzQwMC00REI1NEUwMC05RkNCQTAwMC1BMDE0QTAxNi1BNDhDQTREMC1BNEY3QTUwMC1BNjBCQTYxMC1BNjFGQTYyQUE2MkJBNjZFQTZBMC1BNkU1QTdGQi1BODAxQTgwMy1BODA1QTgwNy1BODBBQTgwQy1BODIyQTg0MC1BODczQTg4Mi1BOEIzQThGMi1BOEY3QThGQkE5MEEtQTkyNUE5MzAtQTk0NkE5NjAtQTk3Q0E5ODQtQTlCMkFBMDAtQUEyOEFBNDAtQUE0MkFBNDQtQUE0QkFBNjAtQUE2RkFBNzEtQUE3NkFBN0FBQTgwLUFBQUZBQUIxQUFCNUFBQjZBQUI5LUFBQkRBQUMwQUFDMkFBREJBQURDQUJDMC1BQkUyQUMwMC1EN0EzRDdCMC1EN0M2RDdDQi1EN0ZCRjkwMC1GQTJERkEzMC1GQTZERkE3MC1GQUQ5RkIxREZCMUYtRkIyOEZCMkEtRkIzNkZCMzgtRkIzQ0ZCM0VGQjQwRkI0MUZCNDNGQjQ0RkI0Ni1GQkIxRkJEMy1GRDNERkQ1MC1GRDhGRkQ5Mi1GREM3RkRGMC1GREZCRkU3MC1GRTc0RkU3Ni1GRUZDRkY2Ni1GRjZGRkY3MS1GRjlERkZBMC1GRkJFRkZDMi1GRkM3RkZDQS1GRkNGRkZEMi1GRkQ3RkZEQS1GRkRDIiwNCiAgICBNOiAgIjAzMDAtMDM2RjA0ODMtMDQ4OTA1OTEtMDVCRDA1QkYwNUMxMDVDMjA1QzQwNUM1MDVDNzA2MTAtMDYxQTA2NEItMDY1RTA2NzAwNkQ2LTA2REMwNkRFLTA2RTQwNkU3MDZFODA2RUEtMDZFRDA3MTEwNzMwLTA3NEEwN0E2LTA3QjAwN0VCLTA3RjMwODE2LTA4MTkwODFCLTA4MjMwODI1LTA4MjcwODI5LTA4MkQwOTAwLTA5MDMwOTNDMDkzRS0wOTRFMDk1MS0wOTU1MDk2MjA5NjMwOTgxLTA5ODMwOUJDMDlCRS0wOUM0MDlDNzA5QzgwOUNCLTA5Q0QwOUQ3MDlFMjA5RTMwQTAxLTBBMDMwQTNDMEEzRS0wQTQyMEE0NzBBNDgwQTRCLTBBNEQwQTUxMEE3MDBBNzEwQTc1MEE4MS0wQTgzMEFCQzBBQkUtMEFDNTBBQzctMEFDOTBBQ0ItMEFDRDBBRTIwQUUzMEIwMS0wQjAzMEIzQzBCM0UtMEI0NDBCNDcwQjQ4MEI0Qi0wQjREMEI1NjBCNTcwQjYyMEI2MzBCODIwQkJFLTBCQzIwQkM2LTBCQzgwQkNBLTBCQ0QwQkQ3MEMwMS0wQzAzMEMzRS0wQzQ0MEM0Ni0wQzQ4MEM0QS0wQzREMEM1NTBDNTYwQzYyMEM2MzBDODIwQzgzMENCQzBDQkUtMENDNDBDQzYtMENDODBDQ0EtMENDRDBDRDUwQ0Q2MENFMjBDRTMwRDAyMEQwMzBEM0UtMEQ0NDBENDYtMEQ0ODBENEEtMEQ0RDBENTcwRDYyMEQ2MzBEODIwRDgzMERDQTBEQ0YtMERENDBERDYwREQ4LTBEREYwREYyMERGMzBFMzEwRTM0LTBFM0EwRTQ3LTBFNEUwRUIxMEVCNC0wRUI5MEVCQjBFQkMwRUM4LTBFQ0QwRjE4MEYxOTBGMzUwRjM3MEYzOTBGM0UwRjNGMEY3MS0wRjg0MEY4NjBGODcwRjkwLTBGOTcwRjk5LTBGQkMwRkM2MTAyQi0xMDNFMTA1Ni0xMDU5MTA1RS0xMDYwMTA2Mi0xMDY0MTA2Ny0xMDZEMTA3MS0xMDc0MTA4Mi0xMDhEMTA4RjEwOUEtMTA5RDEzNUYxNzEyLTE3MTQxNzMyLTE3MzQxNzUyMTc1MzE3NzIxNzczMTdCNi0xN0QzMTdERDE4MEItMTgwRDE4QTkxOTIwLTE5MkIxOTMwLTE5M0IxOUIwLTE5QzAxOUM4MTlDOTFBMTctMUExQjFBNTUtMUE1RTFBNjAtMUE3QzFBN0YxQjAwLTFCMDQxQjM0LTFCNDQxQjZCLTFCNzMxQjgwLTFCODIxQkExLTFCQUExQzI0LTFDMzcxQ0QwLTFDRDIxQ0Q0LTFDRTgxQ0VEMUNGMjFEQzAtMURFNjFERkQtMURGRjIwRDAtMjBGMDJDRUYtMkNGMTJERTAtMkRGRjMwMkEtMzAyRjMwOTkzMDlBQTY2Ri1BNjcyQTY3Q0E2N0RBNkYwQTZGMUE4MDJBODA2QTgwQkE4MjMtQTgyN0E4ODBBODgxQThCNC1BOEM0QThFMC1BOEYxQTkyNi1BOTJEQTk0Ny1BOTUzQTk4MC1BOTgzQTlCMy1BOUMwQUEyOS1BQTM2QUE0M0FBNENBQTREQUE3QkFBQjBBQUIyLUFBQjRBQUI3QUFCOEFBQkVBQUJGQUFDMUFCRTMtQUJFQUFCRUNBQkVERkIxRUZFMDAtRkUwRkZFMjAtRkUyNiIsDQogICAgTW46ICIwMzAwLTAzNkYwNDgzLTA0ODcwNTkxLTA1QkQwNUJGMDVDMTA1QzIwNUM0MDVDNTA1QzcwNjEwLTA2MUEwNjRCLTA2NUUwNjcwMDZENi0wNkRDMDZERi0wNkU0MDZFNzA2RTgwNkVBLTA2RUQwNzExMDczMC0wNzRBMDdBNi0wN0IwMDdFQi0wN0YzMDgxNi0wODE5MDgxQi0wODIzMDgyNS0wODI3MDgyOS0wODJEMDkwMC0wOTAyMDkzQzA5NDEtMDk0ODA5NEQwOTUxLTA5NTUwOTYyMDk2MzA5ODEwOUJDMDlDMS0wOUM0MDlDRDA5RTIwOUUzMEEwMTBBMDIwQTNDMEE0MTBBNDIwQTQ3MEE0ODBBNEItMEE0RDBBNTEwQTcwMEE3MTBBNzUwQTgxMEE4MjBBQkMwQUMxLTBBQzUwQUM3MEFDODBBQ0QwQUUyMEFFMzBCMDEwQjNDMEIzRjBCNDEtMEI0NDBCNEQwQjU2MEI2MjBCNjMwQjgyMEJDMDBCQ0QwQzNFLTBDNDAwQzQ2LTBDNDgwQzRBLTBDNEQwQzU1MEM1NjBDNjIwQzYzMENCQzBDQkYwQ0M2MENDQzBDQ0QwQ0UyMENFMzBENDEtMEQ0NDBENEQwRDYyMEQ2MzBEQ0EwREQyLTBERDQwREQ2MEUzMTBFMzQtMEUzQTBFNDctMEU0RTBFQjEwRUI0LTBFQjkwRUJCMEVCQzBFQzgtMEVDRDBGMTgwRjE5MEYzNTBGMzcwRjM5MEY3MS0wRjdFMEY4MC0wRjg0MEY4NjBGODcwRjkwLTBGOTcwRjk5LTBGQkMwRkM2MTAyRC0xMDMwMTAzMi0xMDM3MTAzOTEwM0ExMDNEMTAzRTEwNTgxMDU5MTA1RS0xMDYwMTA3MS0xMDc0MTA4MjEwODUxMDg2MTA4RDEwOUQxMzVGMTcxMi0xNzE0MTczMi0xNzM0MTc1MjE3NTMxNzcyMTc3MzE3QjctMTdCRDE3QzYxN0M5LTE3RDMxN0REMTgwQi0xODBEMThBOTE5MjAtMTkyMjE5MjcxOTI4MTkzMjE5MzktMTkzQjFBMTcxQTE4MUE1NjFBNTgtMUE1RTFBNjAxQTYyMUE2NS0xQTZDMUE3My0xQTdDMUE3RjFCMDAtMUIwMzFCMzQxQjM2LTFCM0ExQjNDMUI0MjFCNkItMUI3MzFCODAxQjgxMUJBMi0xQkE1MUJBODFCQTkxQzJDLTFDMzMxQzM2MUMzNzFDRDAtMUNEMjFDRDQtMUNFMDFDRTItMUNFODFDRUQxREMwLTFERTYxREZELTFERkYyMEQwLTIwREMyMEUxMjBFNS0yMEYwMkNFRi0yQ0YxMkRFMC0yREZGMzAyQS0zMDJGMzA5OTMwOUFBNjZGQTY3Q0E2N0RBNkYwQTZGMUE4MDJBODA2QTgwQkE4MjVBODI2QThDNEE4RTAtQThGMUE5MjYtQTkyREE5NDctQTk1MUE5ODAtQTk4MkE5QjNBOUI2LUE5QjlBOUJDQUEyOS1BQTJFQUEzMUFBMzJBQTM1QUEzNkFBNDNBQTRDQUFCMEFBQjItQUFCNEFBQjdBQUI4QUFCRUFBQkZBQUMxQUJFNUFCRThBQkVERkIxRUZFMDAtRkUwRkZFMjAtRkUyNiIsDQogICAgTWM6ICIwOTAzMDkzRS0wOTQwMDk0OS0wOTRDMDk0RTA5ODIwOTgzMDlCRS0wOUMwMDlDNzA5QzgwOUNCMDlDQzA5RDcwQTAzMEEzRS0wQTQwMEE4MzBBQkUtMEFDMDBBQzkwQUNCMEFDQzBCMDIwQjAzMEIzRTBCNDAwQjQ3MEI0ODBCNEIwQjRDMEI1NzBCQkUwQkJGMEJDMTBCQzIwQkM2LTBCQzgwQkNBLTBCQ0MwQkQ3MEMwMS0wQzAzMEM0MS0wQzQ0MEM4MjBDODMwQ0JFMENDMC0wQ0M0MENDNzBDQzgwQ0NBMENDQjBDRDUwQ0Q2MEQwMjBEMDMwRDNFLTBENDAwRDQ2LTBENDgwRDRBLTBENEMwRDU3MEQ4MjBEODMwRENGLTBERDEwREQ4LTBEREYwREYyMERGMzBGM0UwRjNGMEY3RjEwMkIxMDJDMTAzMTEwMzgxMDNCMTAzQzEwNTYxMDU3MTA2Mi0xMDY0MTA2Ny0xMDZEMTA4MzEwODQxMDg3LTEwOEMxMDhGMTA5QS0xMDlDMTdCNjE3QkUtMTdDNTE3QzcxN0M4MTkyMy0xOTI2MTkyOS0xOTJCMTkzMDE5MzExOTMzLTE5MzgxOUIwLTE5QzAxOUM4MTlDOTFBMTktMUExQjFBNTUxQTU3MUE2MTFBNjMxQTY0MUE2RC0xQTcyMUIwNDFCMzUxQjNCMUIzRC0xQjQxMUI0MzFCNDQxQjgyMUJBMTFCQTYxQkE3MUJBQTFDMjQtMUMyQjFDMzQxQzM1MUNFMTFDRjJBODIzQTgyNEE4MjdBODgwQTg4MUE4QjQtQThDM0E5NTJBOTUzQTk4M0E5QjRBOUI1QTlCQUE5QkJBOUJELUE5QzBBQTJGQUEzMEFBMzNBQTM0QUE0REFBN0JBQkUzQUJFNEFCRTZBQkU3QUJFOUFCRUFBQkVDIiwNCiAgICBNZTogIjA0ODgwNDg5MDZERTIwREQtMjBFMDIwRTItMjBFNEE2NzAtQTY3MiIsDQogICAgTjogICIwMDMwLTAwMzkwMEIyMDBCMzAwQjkwMEJDLTAwQkUwNjYwLTA2NjkwNkYwLTA2RjkwN0MwLTA3QzkwOTY2LTA5NkYwOUU2LTA5RUYwOUY0LTA5RjkwQTY2LTBBNkYwQUU2LTBBRUYwQjY2LTBCNkYwQkU2LTBCRjIwQzY2LTBDNkYwQzc4LTBDN0UwQ0U2LTBDRUYwRDY2LTBENzUwRTUwLTBFNTkwRUQwLTBFRDkwRjIwLTBGMzMxMDQwLTEwNDkxMDkwLTEwOTkxMzY5LTEzN0MxNkVFLTE2RjAxN0UwLTE3RTkxN0YwLTE3RjkxODEwLTE4MTkxOTQ2LTE5NEYxOUQwLTE5REExQTgwLTFBODkxQTkwLTFBOTkxQjUwLTFCNTkxQkIwLTFCQjkxQzQwLTFDNDkxQzUwLTFDNTkyMDcwMjA3NC0yMDc5MjA4MC0yMDg5MjE1MC0yMTgyMjE4NS0yMTg5MjQ2MC0yNDlCMjRFQS0yNEZGMjc3Ni0yNzkzMkNGRDMwMDczMDIxLTMwMjkzMDM4LTMwM0EzMTkyLTMxOTUzMjIwLTMyMjkzMjUxLTMyNUYzMjgwLTMyODkzMkIxLTMyQkZBNjIwLUE2MjlBNkU2LUE2RUZBODMwLUE4MzVBOEQwLUE4RDlBOTAwLUE5MDlBOUQwLUE5RDlBQTUwLUFBNTlBQkYwLUFCRjlGRjEwLUZGMTkiLA0KICAgIE5kOiAiMDAzMC0wMDM5MDY2MC0wNjY5MDZGMC0wNkY5MDdDMC0wN0M5MDk2Ni0wOTZGMDlFNi0wOUVGMEE2Ni0wQTZGMEFFNi0wQUVGMEI2Ni0wQjZGMEJFNi0wQkVGMEM2Ni0wQzZGMENFNi0wQ0VGMEQ2Ni0wRDZGMEU1MC0wRTU5MEVEMC0wRUQ5MEYyMC0wRjI5MTA0MC0xMDQ5MTA5MC0xMDk5MTdFMC0xN0U5MTgxMC0xODE5MTk0Ni0xOTRGMTlEMC0xOURBMUE4MC0xQTg5MUE5MC0xQTk5MUI1MC0xQjU5MUJCMC0xQkI5MUM0MC0xQzQ5MUM1MC0xQzU5QTYyMC1BNjI5QThEMC1BOEQ5QTkwMC1BOTA5QTlEMC1BOUQ5QUE1MC1BQTU5QUJGMC1BQkY5RkYxMC1GRjE5IiwNCiAgICBObDogIjE2RUUtMTZGMDIxNjAtMjE4MjIxODUtMjE4ODMwMDczMDIxLTMwMjkzMDM4LTMwM0FBNkU2LUE2RUYiLA0KICAgIE5vOiAiMDBCMjAwQjMwMEI5MDBCQy0wMEJFMDlGNC0wOUY5MEJGMC0wQkYyMEM3OC0wQzdFMEQ3MC0wRDc1MEYyQS0wRjMzMTM2OS0xMzdDMTdGMC0xN0Y5MjA3MDIwNzQtMjA3OTIwODAtMjA4OTIxNTAtMjE1RjIxODkyNDYwLTI0OUIyNEVBLTI0RkYyNzc2LTI3OTMyQ0ZEMzE5Mi0zMTk1MzIyMC0zMjI5MzI1MS0zMjVGMzI4MC0zMjg5MzJCMS0zMkJGQTgzMC1BODM1IiwNCiAgICBQOiAgIjAwMjEtMDAyMzAwMjUtMDAyQTAwMkMtMDAyRjAwM0EwMDNCMDAzRjAwNDAwMDVCLTAwNUQwMDVGMDA3QjAwN0QwMEExMDBBQjAwQjcwMEJCMDBCRjAzN0UwMzg3MDU1QS0wNTVGMDU4OTA1OEEwNUJFMDVDMDA1QzMwNUM2MDVGMzA1RjQwNjA5MDYwQTA2MEMwNjBEMDYxQjA2MUUwNjFGMDY2QS0wNjZEMDZENDA3MDAtMDcwRDA3RjctMDdGOTA4MzAtMDgzRTA5NjQwOTY1MDk3MDBERjQwRTRGMEU1QTBFNUIwRjA0LTBGMTIwRjNBLTBGM0QwRjg1MEZEMC0wRkQ0MTA0QS0xMDRGMTBGQjEzNjEtMTM2ODE0MDAxNjZEMTY2RTE2OUIxNjlDMTZFQi0xNkVEMTczNTE3MzYxN0Q0LTE3RDYxN0Q4LTE3REExODAwLTE4MEExOTQ0MTk0NTE5REUxOURGMUExRTFBMUYxQUEwLTFBQTYxQUE4LTFBQUQxQjVBLTFCNjAxQzNCLTFDM0YxQzdFMUM3RjFDRDMyMDEwLTIwMjcyMDMwLTIwNDMyMDQ1LTIwNTEyMDUzLTIwNUUyMDdEMjA3RTIwOEQyMDhFMjMyOTIzMkEyNzY4LTI3NzUyN0M1MjdDNjI3RTYtMjdFRjI5ODMtMjk5ODI5RDgtMjlEQjI5RkMyOUZEMkNGOS0yQ0ZDMkNGRTJDRkYyRTAwLTJFMkUyRTMwMkUzMTMwMDEtMzAwMzMwMDgtMzAxMTMwMTQtMzAxRjMwMzAzMDNEMzBBMDMwRkJBNEZFQTRGRkE2MEQtQTYwRkE2NzNBNjdFQTZGMi1BNkY3QTg3NC1BODc3QThDRUE4Q0ZBOEY4LUE4RkFBOTJFQTkyRkE5NUZBOUMxLUE5Q0RBOURFQTlERkFBNUMtQUE1RkFBREVBQURGQUJFQkZEM0VGRDNGRkUxMC1GRTE5RkUzMC1GRTUyRkU1NC1GRTYxRkU2M0ZFNjhGRTZBRkU2QkZGMDEtRkYwM0ZGMDUtRkYwQUZGMEMtRkYwRkZGMUFGRjFCRkYxRkZGMjBGRjNCLUZGM0RGRjNGRkY1QkZGNURGRjVGLUZGNjUiLA0KICAgIFBkOiAiMDAyRDA1OEEwNUJFMTQwMDE4MDYyMDEwLTIwMTUyRTE3MkUxQTMwMUMzMDMwMzBBMEZFMzFGRTMyRkU1OEZFNjNGRjBEIiwNCiAgICBQczogIjAwMjgwMDVCMDA3QjBGM0EwRjNDMTY5QjIwMUEyMDFFMjA0NTIwN0QyMDhEMjMyOTI3NjgyNzZBMjc2QzI3NkUyNzcwMjc3MjI3NzQyN0M1MjdFNjI3RTgyN0VBMjdFQzI3RUUyOTgzMjk4NTI5ODcyOTg5Mjk4QjI5OEQyOThGMjk5MTI5OTMyOTk1Mjk5NzI5RDgyOURBMjlGQzJFMjIyRTI0MkUyNjJFMjgzMDA4MzAwQTMwMEMzMDBFMzAxMDMwMTQzMDE2MzAxODMwMUEzMDFERkQzRUZFMTdGRTM1RkUzN0ZFMzlGRTNCRkUzREZFM0ZGRTQxRkU0M0ZFNDdGRTU5RkU1QkZFNURGRjA4RkYzQkZGNUJGRjVGRkY2MiIsDQogICAgUGU6ICIwMDI5MDA1RDAwN0QwRjNCMEYzRDE2OUMyMDQ2MjA3RTIwOEUyMzJBMjc2OTI3NkIyNzZEMjc2RjI3NzEyNzczMjc3NTI3QzYyN0U3MjdFOTI3RUIyN0VEMjdFRjI5ODQyOTg2Mjk4ODI5OEEyOThDMjk4RTI5OTAyOTkyMjk5NDI5OTYyOTk4MjlEOTI5REIyOUZEMkUyMzJFMjUyRTI3MkUyOTMwMDkzMDBCMzAwRDMwMEYzMDExMzAxNTMwMTczMDE5MzAxQjMwMUUzMDFGRkQzRkZFMThGRTM2RkUzOEZFM0FGRTNDRkUzRUZFNDBGRTQyRkU0NEZFNDhGRTVBRkU1Q0ZFNUVGRjA5RkYzREZGNURGRjYwRkY2MyIsDQogICAgUGk6ICIwMEFCMjAxODIwMUIyMDFDMjAxRjIwMzkyRTAyMkUwNDJFMDkyRTBDMkUxQzJFMjAiLA0KICAgIFBmOiAiMDBCQjIwMTkyMDFEMjAzQTJFMDMyRTA1MkUwQTJFMEQyRTFEMkUyMSIsDQogICAgUGM6ICIwMDVGMjAzRjIwNDAyMDU0RkUzM0ZFMzRGRTRELUZFNEZGRjNGIiwNCiAgICBQbzogIjAwMjEtMDAyMzAwMjUtMDAyNzAwMkEwMDJDMDAyRTAwMkYwMDNBMDAzQjAwM0YwMDQwMDA1QzAwQTEwMEI3MDBCRjAzN0UwMzg3MDU1QS0wNTVGMDU4OTA1QzAwNUMzMDVDNjA1RjMwNUY0MDYwOTA2MEEwNjBDMDYwRDA2MUIwNjFFMDYxRjA2NkEtMDY2RDA2RDQwNzAwLTA3MEQwN0Y3LTA3RjkwODMwLTA4M0UwOTY0MDk2NTA5NzAwREY0MEU0RjBFNUEwRTVCMEYwNC0wRjEyMEY4NTBGRDAtMEZENDEwNEEtMTA0RjEwRkIxMzYxLTEzNjgxNjZEMTY2RTE2RUItMTZFRDE3MzUxNzM2MTdENC0xN0Q2MTdEOC0xN0RBMTgwMC0xODA1MTgwNy0xODBBMTk0NDE5NDUxOURFMTlERjFBMUUxQTFGMUFBMC0xQUE2MUFBOC0xQUFEMUI1QS0xQjYwMUMzQi0xQzNGMUM3RTFDN0YxQ0QzMjAxNjIwMTcyMDIwLTIwMjcyMDMwLTIwMzgyMDNCLTIwM0UyMDQxLTIwNDMyMDQ3LTIwNTEyMDUzMjA1NS0yMDVFMkNGOS0yQ0ZDMkNGRTJDRkYyRTAwMkUwMTJFMDYtMkUwODJFMEIyRTBFLTJFMTYyRTE4MkUxOTJFMUIyRTFFMkUxRjJFMkEtMkUyRTJFMzAyRTMxMzAwMS0zMDAzMzAzRDMwRkJBNEZFQTRGRkE2MEQtQTYwRkE2NzNBNjdFQTZGMi1BNkY3QTg3NC1BODc3QThDRUE4Q0ZBOEY4LUE4RkFBOTJFQTkyRkE5NUZBOUMxLUE5Q0RBOURFQTlERkFBNUMtQUE1RkFBREVBQURGQUJFQkZFMTAtRkUxNkZFMTlGRTMwRkU0NUZFNDZGRTQ5LUZFNENGRTUwLUZFNTJGRTU0LUZFNTdGRTVGLUZFNjFGRTY4RkU2QUZFNkJGRjAxLUZGMDNGRjA1LUZGMDdGRjBBRkYwQ0ZGMEVGRjBGRkYxQUZGMUJGRjFGRkYyMEZGM0NGRjYxRkY2NEZGNjUiLA0KICAgIFM6ICAiMDAyNDAwMkIwMDNDLTAwM0UwMDVFMDA2MDAwN0MwMDdFMDBBMi0wMEE5MDBBQzAwQUUtMDBCMTAwQjQwMEI2MDBCODAwRDcwMEY3MDJDMi0wMkM1MDJEMi0wMkRGMDJFNS0wMkVCMDJFRDAyRUYtMDJGRjAzNzUwMzg0MDM4NTAzRjYwNDgyMDYwNi0wNjA4MDYwQjA2MEUwNjBGMDZFOTA2RkQwNkZFMDdGNjA5RjIwOUYzMDlGQTA5RkIwQUYxMEI3MDBCRjMtMEJGQTBDN0YwQ0YxMENGMjBENzkwRTNGMEYwMS0wRjAzMEYxMy0wRjE3MEYxQS0wRjFGMEYzNDBGMzYwRjM4MEZCRS0wRkM1MEZDNy0wRkNDMEZDRTBGQ0YwRkQ1LTBGRDgxMDlFMTA5RjEzNjAxMzkwLTEzOTkxN0RCMTk0MDE5RTAtMTlGRjFCNjEtMUI2QTFCNzQtMUI3QzFGQkQxRkJGLTFGQzExRkNELTFGQ0YxRkRELTFGREYxRkVELTFGRUYxRkZEMUZGRTIwNDQyMDUyMjA3QS0yMDdDMjA4QS0yMDhDMjBBMC0yMEI4MjEwMDIxMDEyMTAzLTIxMDYyMTA4MjEwOTIxMTQyMTE2LTIxMTgyMTFFLTIxMjMyMTI1MjEyNzIxMjkyMTJFMjEzQTIxM0IyMTQwLTIxNDQyMTRBLTIxNEQyMTRGMjE5MC0yMzI4MjMyQi0yM0U4MjQwMC0yNDI2MjQ0MC0yNDRBMjQ5Qy0yNEU5MjUwMC0yNkNEMjZDRi0yNkUxMjZFMzI2RTgtMjZGRjI3MDEtMjcwNDI3MDYtMjcwOTI3MEMtMjcyNzI3MjktMjc0QjI3NEQyNzRGLTI3NTIyNzU2LTI3NUUyNzYxLTI3NjcyNzk0Mjc5OC0yN0FGMjdCMS0yN0JFMjdDMC0yN0M0MjdDNy0yN0NBMjdDQzI3RDAtMjdFNTI3RjAtMjk4MjI5OTktMjlENzI5REMtMjlGQjI5RkUtMkI0QzJCNTAtMkI1OTJDRTUtMkNFQTJFODAtMkU5OTJFOUItMkVGMzJGMDAtMkZENTJGRjAtMkZGQjMwMDQzMDEyMzAxMzMwMjAzMDM2MzAzNzMwM0UzMDNGMzA5QjMwOUMzMTkwMzE5MTMxOTYtMzE5RjMxQzAtMzFFMzMyMDAtMzIxRTMyMkEtMzI1MDMyNjAtMzI3RjMyOEEtMzJCMDMyQzAtMzJGRTMzMDAtMzNGRjREQzAtNERGRkE0OTAtQTRDNkE3MDAtQTcxNkE3MjBBNzIxQTc4OUE3OEFBODI4LUE4MkJBODM2LUE4MzlBQTc3LUFBNzlGQjI5RkRGQ0ZERkRGRTYyRkU2NC1GRTY2RkU2OUZGMDRGRjBCRkYxQy1GRjFFRkYzRUZGNDBGRjVDRkY1RUZGRTAtRkZFNkZGRTgtRkZFRUZGRkNGRkZEIiwNCiAgICBTbTogIjAwMkIwMDNDLTAwM0UwMDdDMDA3RTAwQUMwMEIxMDBENzAwRjcwM0Y2MDYwNi0wNjA4MjA0NDIwNTIyMDdBLTIwN0MyMDhBLTIwOEMyMTQwLTIxNDQyMTRCMjE5MC0yMTk0MjE5QTIxOUIyMUEwMjFBMzIxQTYyMUFFMjFDRTIxQ0YyMUQyMjFENDIxRjQtMjJGRjIzMDgtMjMwQjIzMjAyMzIxMjM3QzIzOUItMjNCMzIzREMtMjNFMTI1QjcyNUMxMjVGOC0yNUZGMjY2RjI3QzAtMjdDNDI3QzctMjdDQTI3Q0MyN0QwLTI3RTUyN0YwLTI3RkYyOTAwLTI5ODIyOTk5LTI5RDcyOURDLTI5RkIyOUZFLTJBRkYyQjMwLTJCNDQyQjQ3LTJCNENGQjI5RkU2MkZFNjQtRkU2NkZGMEJGRjFDLUZGMUVGRjVDRkY1RUZGRTJGRkU5LUZGRUMiLA0KICAgIFNjOiAiMDAyNDAwQTItMDBBNTA2MEIwOUYyMDlGMzA5RkIwQUYxMEJGOTBFM0YxN0RCMjBBMC0yMEI4QTgzOEZERkNGRTY5RkYwNEZGRTBGRkUxRkZFNUZGRTYiLA0KICAgIFNrOiAiMDA1RTAwNjAwMEE4MDBBRjAwQjQwMEI4MDJDMi0wMkM1MDJEMi0wMkRGMDJFNS0wMkVCMDJFRDAyRUYtMDJGRjAzNzUwMzg0MDM4NTFGQkQxRkJGLTFGQzExRkNELTFGQ0YxRkRELTFGREYxRkVELTFGRUYxRkZEMUZGRTMwOUIzMDlDQTcwMC1BNzE2QTcyMEE3MjFBNzg5QTc4QUZGM0VGRjQwRkZFMyIsDQogICAgU286ICIwMEE2MDBBNzAwQTkwMEFFMDBCMDAwQjYwNDgyMDYwRTA2MEYwNkU5MDZGRDA2RkUwN0Y2MDlGQTBCNzAwQkYzLTBCRjgwQkZBMEM3RjBDRjEwQ0YyMEQ3OTBGMDEtMEYwMzBGMTMtMEYxNzBGMUEtMEYxRjBGMzQwRjM2MEYzODBGQkUtMEZDNTBGQzctMEZDQzBGQ0UwRkNGMEZENS0wRkQ4MTA5RTEwOUYxMzYwMTM5MC0xMzk5MTk0MDE5RTAtMTlGRjFCNjEtMUI2QTFCNzQtMUI3QzIxMDAyMTAxMjEwMy0yMTA2MjEwODIxMDkyMTE0MjExNi0yMTE4MjExRS0yMTIzMjEyNTIxMjcyMTI5MjEyRTIxM0EyMTNCMjE0QTIxNEMyMTREMjE0RjIxOTUtMjE5OTIxOUMtMjE5RjIxQTEyMUEyMjFBNDIxQTUyMUE3LTIxQUQyMUFGLTIxQ0QyMUQwMjFEMTIxRDMyMUQ1LTIxRjMyMzAwLTIzMDcyMzBDLTIzMUYyMzIyLTIzMjgyMzJCLTIzN0IyMzdELTIzOUEyM0I0LTIzREIyM0UyLTIzRTgyNDAwLTI0MjYyNDQwLTI0NEEyNDlDLTI0RTkyNTAwLTI1QjYyNUI4LTI1QzAyNUMyLTI1RjcyNjAwLTI2NkUyNjcwLTI2Q0QyNkNGLTI2RTEyNkUzMjZFOC0yNkZGMjcwMS0yNzA0MjcwNi0yNzA5MjcwQy0yNzI3MjcyOS0yNzRCMjc0RDI3NEYtMjc1MjI3NTYtMjc1RTI3NjEtMjc2NzI3OTQyNzk4LTI3QUYyN0IxLTI3QkUyODAwLTI4RkYyQjAwLTJCMkYyQjQ1MkI0NjJCNTAtMkI1OTJDRTUtMkNFQTJFODAtMkU5OTJFOUItMkVGMzJGMDAtMkZENTJGRjAtMkZGQjMwMDQzMDEyMzAxMzMwMjAzMDM2MzAzNzMwM0UzMDNGMzE5MDMxOTEzMTk2LTMxOUYzMUMwLTMxRTMzMjAwLTMyMUUzMjJBLTMyNTAzMjYwLTMyN0YzMjhBLTMyQjAzMkMwLTMyRkUzMzAwLTMzRkY0REMwLTRERkZBNDkwLUE0QzZBODI4LUE4MkJBODM2QTgzN0E4MzlBQTc3LUFBNzlGREZERkZFNEZGRThGRkVERkZFRUZGRkNGRkZEIiwNCiAgICBaOiAgIjAwMjAwMEEwMTY4MDE4MEUyMDAwLTIwMEEyMDI4MjAyOTIwMkYyMDVGMzAwMCIsDQogICAgWnM6ICIwMDIwMDBBMDE2ODAxODBFMjAwMC0yMDBBMjAyRjIwNUYzMDAwIiwNCiAgICBabDogIjIwMjgiLA0KICAgIFpwOiAiMjAyOSIsDQogICAgQzogICIwMDAwLTAwMUYwMDdGLTAwOUYwMEFEMDM3ODAzNzkwMzdGLTAzODMwMzhCMDM4RDAzQTIwNTI2LTA1MzAwNTU3MDU1ODA1NjAwNTg4MDU4Qi0wNTkwMDVDOC0wNUNGMDVFQi0wNUVGMDVGNS0wNjA1MDYxQzA2MUQwNjIwMDY1RjA2REQwNzBFMDcwRjA3NEIwNzRDMDdCMi0wN0JGMDdGQi0wN0ZGMDgyRTA4MkYwODNGLTA4RkYwOTNBMDkzQjA5NEYwOTU2MDk1NzA5NzMtMDk3ODA5ODAwOTg0MDk4RDA5OEUwOTkxMDk5MjA5QTkwOUIxMDlCMy0wOUI1MDlCQTA5QkIwOUM1MDlDNjA5QzkwOUNBMDlDRi0wOUQ2MDlEOC0wOURCMDlERTA5RTQwOUU1MDlGQy0wQTAwMEEwNDBBMEItMEEwRTBBMTEwQTEyMEEyOTBBMzEwQTM0MEEzNzBBM0EwQTNCMEEzRDBBNDMtMEE0NjBBNDkwQTRBMEE0RS0wQTUwMEE1Mi0wQTU4MEE1RDBBNUYtMEE2NTBBNzYtMEE4MDBBODQwQThFMEE5MjBBQTkwQUIxMEFCNDBBQkEwQUJCMEFDNjBBQ0EwQUNFMEFDRjBBRDEtMEFERjBBRTQwQUU1MEFGMDBBRjItMEIwMDBCMDQwQjBEMEIwRTBCMTEwQjEyMEIyOTBCMzEwQjM0MEIzQTBCM0IwQjQ1MEI0NjBCNDkwQjRBMEI0RS0wQjU1MEI1OC0wQjVCMEI1RTBCNjQwQjY1MEI3Mi0wQjgxMEI4NDBCOEItMEI4RDBCOTEwQjk2LTBCOTgwQjlCMEI5RDBCQTAtMEJBMjBCQTUtMEJBNzBCQUItMEJBRDBCQkEtMEJCRDBCQzMtMEJDNTBCQzkwQkNFMEJDRjBCRDEtMEJENjBCRDgtMEJFNTBCRkItMEMwMDBDMDQwQzBEMEMxMTBDMjkwQzM0MEMzQS0wQzNDMEM0NTBDNDkwQzRFLTBDNTQwQzU3MEM1QS0wQzVGMEM2NDBDNjUwQzcwLTBDNzcwQzgwMEM4MTBDODQwQzhEMEM5MTBDQTkwQ0I0MENCQTBDQkIwQ0M1MENDOTBDQ0UtMENENDBDRDctMENERDBDREYwQ0U0MENFNTBDRjAwQ0YzLTBEMDEwRDA0MEQwRDBEMTEwRDI5MEQzQS0wRDNDMEQ0NTBENDkwRDRFLTBENTYwRDU4LTBENUYwRDY0MEQ2NTBENzYtMEQ3ODBEODAwRDgxMEQ4NDBEOTctMEQ5OTBEQjIwREJDMERCRTBEQkYwREM3LTBEQzkwRENCLTBEQ0UwREQ1MERENzBERTAtMERGMTBERjUtMEUwMDBFM0ItMEUzRTBFNUMtMEU4MDBFODMwRTg1MEU4NjBFODkwRThCMEU4QzBFOEUtMEU5MzBFOTgwRUEwMEVBNDBFQTYwRUE4MEVBOTBFQUMwRUJBMEVCRTBFQkYwRUM1MEVDNzBFQ0UwRUNGMEVEQTBFREIwRURFLTBFRkYwRjQ4MEY2RC0wRjcwMEY4Qy0wRjhGMEY5ODBGQkQwRkNEMEZEOS0wRkZGMTBDNi0xMENGMTBGRC0xMEZGMTI0OTEyNEUxMjRGMTI1NzEyNTkxMjVFMTI1RjEyODkxMjhFMTI4RjEyQjExMkI2MTJCNzEyQkYxMkMxMTJDNjEyQzcxMkQ3MTMxMTEzMTYxMzE3MTM1Qi0xMzVFMTM3RC0xMzdGMTM5QS0xMzlGMTNGNS0xM0ZGMTY5RC0xNjlGMTZGMS0xNkZGMTcwRDE3MTUtMTcxRjE3MzctMTczRjE3NTQtMTc1RjE3NkQxNzcxMTc3NC0xNzdGMTdCNDE3QjUxN0RFMTdERjE3RUEtMTdFRjE3RkEtMTdGRjE4MEYxODFBLTE4MUYxODc4LTE4N0YxOEFCLTE4QUYxOEY2LTE4RkYxOTFELTE5MUYxOTJDLTE5MkYxOTNDLTE5M0YxOTQxLTE5NDMxOTZFMTk2RjE5NzUtMTk3RjE5QUMtMTlBRjE5Q0EtMTlDRjE5REItMTlERDFBMUMxQTFEMUE1RjFBN0QxQTdFMUE4QS0xQThGMUE5QS0xQTlGMUFBRS0xQUZGMUI0Qy0xQjRGMUI3RC0xQjdGMUJBQi0xQkFEMUJCQS0xQkZGMUMzOC0xQzNBMUM0QS0xQzRDMUM4MC0xQ0NGMUNGMy0xQ0ZGMURFNy0xREZDMUYxNjFGMTcxRjFFMUYxRjFGNDYxRjQ3MUY0RTFGNEYxRjU4MUY1QTFGNUMxRjVFMUY3RTFGN0YxRkI1MUZDNTFGRDQxRkQ1MUZEQzFGRjAxRkYxMUZGNTFGRkYyMDBCLTIwMEYyMDJBLTIwMkUyMDYwLTIwNkYyMDcyMjA3MzIwOEYyMDk1LTIwOUYyMEI5LTIwQ0YyMEYxLTIwRkYyMThBLTIxOEYyM0U5LTIzRkYyNDI3LTI0M0YyNDRCLTI0NUYyNkNFMjZFMjI2RTQtMjZFNzI3MDAyNzA1MjcwQTI3MEIyNzI4Mjc0QzI3NEUyNzUzLTI3NTUyNzVGMjc2MDI3OTUtMjc5NzI3QjAyN0JGMjdDQjI3Q0QtMjdDRjJCNEQtMkI0RjJCNUEtMkJGRjJDMkYyQzVGMkNGMi0yQ0Y4MkQyNi0yRDJGMkQ2Ni0yRDZFMkQ3MC0yRDdGMkQ5Ny0yRDlGMkRBNzJEQUYyREI3MkRCRjJEQzcyRENGMkRENzJEREYyRTMyLTJFN0YyRTlBMkVGNC0yRUZGMkZENi0yRkVGMkZGQy0yRkZGMzA0MDMwOTczMDk4MzEwMC0zMTA0MzEyRS0zMTMwMzE4RjMxQjgtMzFCRjMxRTQtMzFFRjMyMUYzMkZGNERCNi00REJGOUZDQy05RkZGQTQ4RC1BNDhGQTRDNy1BNENGQTYyQy1BNjNGQTY2MEE2NjFBNjc0LUE2N0JBNjk4LUE2OUZBNkY4LUE2RkZBNzhELUE3RkFBODJDLUE4MkZBODNBLUE4M0ZBODc4LUE4N0ZBOEM1LUE4Q0RBOERBLUE4REZBOEZDLUE4RkZBOTU0LUE5NUVBOTdELUE5N0ZBOUNFQTlEQS1BOUREQTlFMC1BOUZGQUEzNy1BQTNGQUE0RUFBNEZBQTVBQUE1QkFBN0MtQUE3RkFBQzMtQUFEQUFBRTAtQUJCRkFCRUVBQkVGQUJGQS1BQkZGRDdBNC1EN0FGRDdDNy1EN0NBRDdGQy1GOEZGRkEyRUZBMkZGQTZFRkE2RkZBREEtRkFGRkZCMDctRkIxMkZCMTgtRkIxQ0ZCMzdGQjNERkIzRkZCNDJGQjQ1RkJCMi1GQkQyRkQ0MC1GRDRGRkQ5MEZEOTFGREM4LUZERUZGREZFRkRGRkZFMUEtRkUxRkZFMjctRkUyRkZFNTNGRTY3RkU2Qy1GRTZGRkU3NUZFRkQtRkYwMEZGQkYtRkZDMUZGQzhGRkM5RkZEMEZGRDFGRkQ4RkZEOUZGREQtRkZERkZGRTdGRkVGLUZGRkJGRkZFRkZGRiIsDQogICAgQ2M6ICIwMDAwLTAwMUYwMDdGLTAwOUYiLA0KICAgIENmOiAiMDBBRDA2MDAtMDYwMzA2REQwNzBGMTdCNDE3QjUyMDBCLTIwMEYyMDJBLTIwMkUyMDYwLTIwNjQyMDZBLTIwNkZGRUZGRkZGOS1GRkZCIiwNCiAgICBDbzogIkUwMDAtRjhGRiIsDQogICAgQ3M6ICJEODAwLURGRkYiLA0KICAgIENuOiAiMDM3ODAzNzkwMzdGLTAzODMwMzhCMDM4RDAzQTIwNTI2LTA1MzAwNTU3MDU1ODA1NjAwNTg4MDU4Qi0wNTkwMDVDOC0wNUNGMDVFQi0wNUVGMDVGNS0wNUZGMDYwNDA2MDUwNjFDMDYxRDA2MjAwNjVGMDcwRTA3NEIwNzRDMDdCMi0wN0JGMDdGQi0wN0ZGMDgyRTA4MkYwODNGLTA4RkYwOTNBMDkzQjA5NEYwOTU2MDk1NzA5NzMtMDk3ODA5ODAwOTg0MDk4RDA5OEUwOTkxMDk5MjA5QTkwOUIxMDlCMy0wOUI1MDlCQTA5QkIwOUM1MDlDNjA5QzkwOUNBMDlDRi0wOUQ2MDlEOC0wOURCMDlERTA5RTQwOUU1MDlGQy0wQTAwMEEwNDBBMEItMEEwRTBBMTEwQTEyMEEyOTBBMzEwQTM0MEEzNzBBM0EwQTNCMEEzRDBBNDMtMEE0NjBBNDkwQTRBMEE0RS0wQTUwMEE1Mi0wQTU4MEE1RDBBNUYtMEE2NTBBNzYtMEE4MDBBODQwQThFMEE5MjBBQTkwQUIxMEFCNDBBQkEwQUJCMEFDNjBBQ0EwQUNFMEFDRjBBRDEtMEFERjBBRTQwQUU1MEFGMDBBRjItMEIwMDBCMDQwQjBEMEIwRTBCMTEwQjEyMEIyOTBCMzEwQjM0MEIzQTBCM0IwQjQ1MEI0NjBCNDkwQjRBMEI0RS0wQjU1MEI1OC0wQjVCMEI1RTBCNjQwQjY1MEI3Mi0wQjgxMEI4NDBCOEItMEI4RDBCOTEwQjk2LTBCOTgwQjlCMEI5RDBCQTAtMEJBMjBCQTUtMEJBNzBCQUItMEJBRDBCQkEtMEJCRDBCQzMtMEJDNTBCQzkwQkNFMEJDRjBCRDEtMEJENjBCRDgtMEJFNTBCRkItMEMwMDBDMDQwQzBEMEMxMTBDMjkwQzM0MEMzQS0wQzNDMEM0NTBDNDkwQzRFLTBDNTQwQzU3MEM1QS0wQzVGMEM2NDBDNjUwQzcwLTBDNzcwQzgwMEM4MTBDODQwQzhEMEM5MTBDQTkwQ0I0MENCQTBDQkIwQ0M1MENDOTBDQ0UtMENENDBDRDctMENERDBDREYwQ0U0MENFNTBDRjAwQ0YzLTBEMDEwRDA0MEQwRDBEMTEwRDI5MEQzQS0wRDNDMEQ0NTBENDkwRDRFLTBENTYwRDU4LTBENUYwRDY0MEQ2NTBENzYtMEQ3ODBEODAwRDgxMEQ4NDBEOTctMEQ5OTBEQjIwREJDMERCRTBEQkYwREM3LTBEQzkwRENCLTBEQ0UwREQ1MERENzBERTAtMERGMTBERjUtMEUwMDBFM0ItMEUzRTBFNUMtMEU4MDBFODMwRTg1MEU4NjBFODkwRThCMEU4QzBFOEUtMEU5MzBFOTgwRUEwMEVBNDBFQTYwRUE4MEVBOTBFQUMwRUJBMEVCRTBFQkYwRUM1MEVDNzBFQ0UwRUNGMEVEQTBFREIwRURFLTBFRkYwRjQ4MEY2RC0wRjcwMEY4Qy0wRjhGMEY5ODBGQkQwRkNEMEZEOS0wRkZGMTBDNi0xMENGMTBGRC0xMEZGMTI0OTEyNEUxMjRGMTI1NzEyNTkxMjVFMTI1RjEyODkxMjhFMTI4RjEyQjExMkI2MTJCNzEyQkYxMkMxMTJDNjEyQzcxMkQ3MTMxMTEzMTYxMzE3MTM1Qi0xMzVFMTM3RC0xMzdGMTM5QS0xMzlGMTNGNS0xM0ZGMTY5RC0xNjlGMTZGMS0xNkZGMTcwRDE3MTUtMTcxRjE3MzctMTczRjE3NTQtMTc1RjE3NkQxNzcxMTc3NC0xNzdGMTdERTE3REYxN0VBLTE3RUYxN0ZBLTE3RkYxODBGMTgxQS0xODFGMTg3OC0xODdGMThBQi0xOEFGMThGNi0xOEZGMTkxRC0xOTFGMTkyQy0xOTJGMTkzQy0xOTNGMTk0MS0xOTQzMTk2RTE5NkYxOTc1LTE5N0YxOUFDLTE5QUYxOUNBLTE5Q0YxOURCLTE5REQxQTFDMUExRDFBNUYxQTdEMUE3RTFBOEEtMUE4RjFBOUEtMUE5RjFBQUUtMUFGRjFCNEMtMUI0RjFCN0QtMUI3RjFCQUItMUJBRDFCQkEtMUJGRjFDMzgtMUMzQTFDNEEtMUM0QzFDODAtMUNDRjFDRjMtMUNGRjFERTctMURGQzFGMTYxRjE3MUYxRTFGMUYxRjQ2MUY0NzFGNEUxRjRGMUY1ODFGNUExRjVDMUY1RTFGN0UxRjdGMUZCNTFGQzUxRkQ0MUZENTFGREMxRkYwMUZGMTFGRjUxRkZGMjA2NS0yMDY5MjA3MjIwNzMyMDhGMjA5NS0yMDlGMjBCOS0yMENGMjBGMS0yMEZGMjE4QS0yMThGMjNFOS0yM0ZGMjQyNy0yNDNGMjQ0Qi0yNDVGMjZDRTI2RTIyNkU0LTI2RTcyNzAwMjcwNTI3MEEyNzBCMjcyODI3NEMyNzRFMjc1My0yNzU1Mjc1RjI3NjAyNzk1LTI3OTcyN0IwMjdCRjI3Q0IyN0NELTI3Q0YyQjRELTJCNEYyQjVBLTJCRkYyQzJGMkM1RjJDRjItMkNGODJEMjYtMkQyRjJENjYtMkQ2RTJENzAtMkQ3RjJEOTctMkQ5RjJEQTcyREFGMkRCNzJEQkYyREM3MkRDRjJERDcyRERGMkUzMi0yRTdGMkU5QTJFRjQtMkVGRjJGRDYtMkZFRjJGRkMtMkZGRjMwNDAzMDk3MzA5ODMxMDAtMzEwNDMxMkUtMzEzMDMxOEYzMUI4LTMxQkYzMUU0LTMxRUYzMjFGMzJGRjREQjYtNERCRjlGQ0MtOUZGRkE0OEQtQTQ4RkE0QzctQTRDRkE2MkMtQTYzRkE2NjBBNjYxQTY3NC1BNjdCQTY5OC1BNjlGQTZGOC1BNkZGQTc4RC1BN0ZBQTgyQy1BODJGQTgzQS1BODNGQTg3OC1BODdGQThDNS1BOENEQThEQS1BOERGQThGQy1BOEZGQTk1NC1BOTVFQTk3RC1BOTdGQTlDRUE5REEtQTlEREE5RTAtQTlGRkFBMzctQUEzRkFBNEVBQTRGQUE1QUFBNUJBQTdDLUFBN0ZBQUMzLUFBREFBQUUwLUFCQkZBQkVFQUJFRkFCRkEtQUJGRkQ3QTQtRDdBRkQ3QzctRDdDQUQ3RkMtRDdGRkZBMkVGQTJGRkE2RUZBNkZGQURBLUZBRkZGQjA3LUZCMTJGQjE4LUZCMUNGQjM3RkIzREZCM0ZGQjQyRkI0NUZCQjItRkJEMkZENDAtRkQ0RkZEOTBGRDkxRkRDOC1GREVGRkRGRUZERkZGRTFBLUZFMUZGRTI3LUZFMkZGRTUzRkU2N0ZFNkMtRkU2RkZFNzVGRUZERkVGRUZGMDBGRkJGLUZGQzFGRkM4RkZDOUZGRDBGRkQxRkZEOEZGRDlGRkRELUZGREZGRkU3RkZFRi1GRkY4RkZGRUZGRkYiDQp9KTsNCg0KZnVuY3Rpb24gYWRkVW5pY29kZVBhY2thZ2UgKHBhY2spIHsNCiAgICB2YXIgY29kZVBvaW50ID0gL1x3ezR9L2c7DQogICAgZm9yICh2YXIgbmFtZSBpbiBwYWNrKQ0KICAgICAgICBleHBvcnRzLnBhY2thZ2VzW25hbWVdID0gcGFja1tuYW1lXS5yZXBsYWNlKGNvZGVQb2ludCwgIlxcdSQmIik7DQp9Ow0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvZG9jdW1lbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsICdhY2UvcmFuZ2UnLCAnYWNlL2FuY2hvciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuL3JhbmdlIikuUmFuZ2U7DQp2YXIgQW5jaG9yID0gcmVxdWlyZSgiLi9hbmNob3IiKS5BbmNob3I7DQoNCnZhciBEb2N1bWVudCA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICB0aGlzLiRsaW5lcyA9IFtdOw0KDQogICAgaWYgKEFycmF5LmlzQXJyYXkodGV4dCkpIHsNCiAgICAgICAgdGhpcy5pbnNlcnRMaW5lcygwLCB0ZXh0KTsNCiAgICB9DQogICAgLy8gVGhlcmUgaGFzIHRvIGJlIG9uZSBsaW5lIGF0IGxlYXN0IGluIHRoZSBkb2N1bWVudC4gSWYgeW91IHBhc3MgYW4gZW1wdHkNCiAgICAvLyBzdHJpbmcgdG8gdGhlIGluc2VydCBmdW5jdGlvbiwgbm90aGluZyB3aWxsIGhhcHBlbi4gV29ya2Fyb3VuZC4NCiAgICBlbHNlIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSB7DQogICAgICAgIHRoaXMuJGxpbmVzID0gWyIiXTsNCiAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLmluc2VydCh7cm93OiAwLCBjb2x1bW46MH0sIHRleHQpOw0KICAgIH0NCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCg0KICAgIHRoaXMuc2V0VmFsdWUgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgIHZhciBsZW4gPSB0aGlzLmdldExlbmd0aCgpOw0KICAgICAgICB0aGlzLnJlbW92ZShuZXcgUmFuZ2UoMCwgMCwgbGVuLCB0aGlzLmdldExpbmUobGVuLTEpLmxlbmd0aCkpOw0KICAgICAgICB0aGlzLmluc2VydCh7cm93OiAwLCBjb2x1bW46MH0sIHRleHQpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmdldEFsbExpbmVzKCkuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSk7DQogICAgfTsNCg0KICAgIHRoaXMuY3JlYXRlQW5jaG9yID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIG5ldyBBbmNob3IodGhpcywgcm93LCBjb2x1bW4pOw0KICAgIH07DQoNCiAgICAvLyBjaGVjayBmb3IgSUUgc3BsaXQgYnVnDQogICAgaWYgKCJhYWEiLnNwbGl0KC9hLykubGVuZ3RoID09IDApDQogICAgICAgIHRoaXMuJHNwbGl0ID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXHJcbnxcci9nLCAiXG4iKS5zcGxpdCgiXG4iKTsNCiAgICAgICAgfQ0KICAgIGVsc2UNCiAgICAgICAgdGhpcy4kc3BsaXQgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgICAgICByZXR1cm4gdGV4dC5zcGxpdCgvXHJcbnxccnxcbi8pOw0KICAgICAgICB9Ow0KDQoNCiAgICB0aGlzLiRkZXRlY3ROZXdMaW5lID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICB2YXIgbWF0Y2ggPSB0ZXh0Lm1hdGNoKC9eLio/KFxyXG58XHJ8XG4pL20pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gbWF0Y2hbMV07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLiRhdXRvTmV3TGluZSA9ICJcbiI7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyID0gZnVuY3Rpb24oKSB7DQogICAgICBzd2l0Y2ggKHRoaXMuJG5ld0xpbmVNb2RlKSB7DQogICAgICAgICAgY2FzZSAid2luZG93cyI6DQogICAgICAgICAgICAgIHJldHVybiAiXHJcbiI7DQoNCiAgICAgICAgICBjYXNlICJ1bml4IjoNCiAgICAgICAgICAgICAgcmV0dXJuICJcbiI7DQoNCiAgICAgICAgICBjYXNlICJhdXRvIjoNCiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGF1dG9OZXdMaW5lOw0KICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLiRhdXRvTmV3TGluZSA9ICJcbiI7DQogICAgdGhpcy4kbmV3TGluZU1vZGUgPSAiYXV0byI7DQogICAgdGhpcy5zZXROZXdMaW5lTW9kZSA9IGZ1bmN0aW9uKG5ld0xpbmVNb2RlKSB7DQogICAgICAgIGlmICh0aGlzLiRuZXdMaW5lTW9kZSA9PT0gbmV3TGluZU1vZGUpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdGhpcy4kbmV3TGluZU1vZGUgPSBuZXdMaW5lTW9kZTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXdMaW5lTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kbmV3TGluZU1vZGU7DQogICAgfTsNCg0KICAgIHRoaXMuaXNOZXdMaW5lID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICByZXR1cm4gKHRleHQgPT0gIlxyXG4iIHx8IHRleHQgPT0gIlxyIiB8fCB0ZXh0ID09ICJcbiIpOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBHZXQgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBnaXZlbiBsaW5lIGFzIGl0IGlzIGluIHRoZSBkb2N1bWVudA0KICAgICAqLw0KICAgIHRoaXMuZ2V0TGluZSA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICByZXR1cm4gdGhpcy4kbGluZXNbcm93XSB8fCAiIjsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5zbGljZShmaXJzdFJvdywgbGFzdFJvdyArIDEpOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBSZXR1cm5zIGFsbCBsaW5lcyBpbiB0aGUgZG9jdW1lbnQgYXMgc3RyaW5nIGFycmF5LiBXYXJuaW5nOiBUaGUgY2FsbGVyDQogICAgICogc2hvdWxkIG5vdCBtb2RpZnkgdGhpcyBhcnJheSENCiAgICAgKi8NCiAgICB0aGlzLmdldEFsbExpbmVzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmdldExpbmVzKDAsIHRoaXMuZ2V0TGVuZ3RoKCkpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldExlbmd0aCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kbGluZXMubGVuZ3RoOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFRleHRSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcmFuZ2UuZW5kLnJvdykgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzW3JhbmdlLnN0YXJ0LnJvd10uc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4pOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdmFyIGxpbmVzID0gW107DQogICAgICAgICAgICBsaW5lcy5wdXNoKHRoaXMuJGxpbmVzW3JhbmdlLnN0YXJ0LnJvd10uc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbikpOw0KICAgICAgICAgICAgbGluZXMucHVzaC5hcHBseShsaW5lcywgdGhpcy5nZXRMaW5lcyhyYW5nZS5zdGFydC5yb3crMSwgcmFuZ2UuZW5kLnJvdy0xKSk7DQogICAgICAgICAgICBsaW5lcy5wdXNoKHRoaXMuJGxpbmVzW3JhbmdlLmVuZC5yb3ddLnN1YnN0cmluZygwLCByYW5nZS5lbmQuY29sdW1uKSk7DQogICAgICAgICAgICByZXR1cm4gbGluZXMuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy4kY2xpcFBvc2l0aW9uID0gZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuZ2V0TGVuZ3RoKCk7DQogICAgICAgIGlmIChwb3NpdGlvbi5yb3cgPj0gbGVuZ3RoKSB7DQogICAgICAgICAgICBwb3NpdGlvbi5yb3cgPSBNYXRoLm1heCgwLCBsZW5ndGggLSAxKTsNCiAgICAgICAgICAgIHBvc2l0aW9uLmNvbHVtbiA9IHRoaXMuZ2V0TGluZShsZW5ndGgtMSkubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBwb3NpdGlvbjsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnQgPSBmdW5jdGlvbihwb3NpdGlvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsNCg0KICAgICAgICBwb3NpdGlvbiA9IHRoaXMuJGNsaXBQb3NpdGlvbihwb3NpdGlvbik7DQoNCiAgICAgICAgaWYgKHRoaXMuZ2V0TGVuZ3RoKCkgPD0gMSkNCiAgICAgICAgICAgIHRoaXMuJGRldGVjdE5ld0xpbmUodGV4dCk7DQoNCiAgICAgICAgdmFyIGxpbmVzID0gdGhpcy4kc3BsaXQodGV4dCk7DQogICAgICAgIHZhciBmaXJzdExpbmUgPSBsaW5lcy5zcGxpY2UoMCwgMSlbMF07DQogICAgICAgIHZhciBsYXN0TGluZSA9IGxpbmVzLmxlbmd0aCA9PSAwID8gbnVsbCA6IGxpbmVzLnNwbGljZShsaW5lcy5sZW5ndGggLSAxLCAxKVswXTsNCg0KICAgICAgICBwb3NpdGlvbiA9IHRoaXMuaW5zZXJ0SW5MaW5lKHBvc2l0aW9uLCBmaXJzdExpbmUpOw0KICAgICAgICBpZiAobGFzdExpbmUgIT09IG51bGwpIHsNCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnROZXdMaW5lKHBvc2l0aW9uKTsgLy8gdGVybWluYXRlIGZpcnN0IGxpbmUNCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRMaW5lcyhwb3NpdGlvbi5yb3csIGxpbmVzKTsNCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRJbkxpbmUocG9zaXRpb24sIGxhc3RMaW5lIHx8ICIiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcG9zaXRpb247DQogICAgfTsNCg0KICAgIHRoaXMuaW5zZXJ0TGluZXMgPSBmdW5jdGlvbihyb3csIGxpbmVzKSB7DQogICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgIHJldHVybiB7cm93OiByb3csIGNvbHVtbjogMH07DQoNCiAgICAgICAgdmFyIGFyZ3MgPSBbcm93LCAwXTsNCiAgICAgICAgYXJncy5wdXNoLmFwcGx5KGFyZ3MsIGxpbmVzKTsNCiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlLmFwcGx5KHRoaXMuJGxpbmVzLCBhcmdzKTsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCAwLCByb3cgKyBsaW5lcy5sZW5ndGgsIDApOw0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJpbnNlcnRMaW5lcyIsDQogICAgICAgICAgICByYW5nZTogcmFuZ2UsDQogICAgICAgICAgICBsaW5lczogbGluZXMNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCiAgICAgICAgcmV0dXJuIHJhbmdlLmVuZDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnROZXdMaW5lID0gZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICAgICAgcG9zaXRpb24gPSB0aGlzLiRjbGlwUG9zaXRpb24ocG9zaXRpb24pOw0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuJGxpbmVzW3Bvc2l0aW9uLnJvd10gfHwgIiI7DQoNCiAgICAgICAgdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSA9IGxpbmUuc3Vic3RyaW5nKDAsIHBvc2l0aW9uLmNvbHVtbik7DQogICAgICAgIHRoaXMuJGxpbmVzLnNwbGljZShwb3NpdGlvbi5yb3cgKyAxLCAwLCBsaW5lLnN1YnN0cmluZyhwb3NpdGlvbi5jb2x1bW4sIGxpbmUubGVuZ3RoKSk7DQoNCiAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgIHJvdyA6IHBvc2l0aW9uLnJvdyArIDEsDQogICAgICAgICAgICBjb2x1bW4gOiAwDQogICAgICAgIH07DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0VGV4dCIsDQogICAgICAgICAgICByYW5nZTogUmFuZ2UuZnJvbVBvaW50cyhwb3NpdGlvbiwgZW5kKSwNCiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQoNCiAgICAgICAgcmV0dXJuIGVuZDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnRJbkxpbmUgPSBmdW5jdGlvbihwb3NpdGlvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsNCg0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuJGxpbmVzW3Bvc2l0aW9uLnJvd10gfHwgIiI7DQoNCiAgICAgICAgdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSA9IGxpbmUuc3Vic3RyaW5nKDAsIHBvc2l0aW9uLmNvbHVtbikgKyB0ZXh0DQogICAgICAgICAgICAgICAgKyBsaW5lLnN1YnN0cmluZyhwb3NpdGlvbi5jb2x1bW4pOw0KDQogICAgICAgIHZhciBlbmQgPSB7DQogICAgICAgICAgICByb3cgOiBwb3NpdGlvbi5yb3csDQogICAgICAgICAgICBjb2x1bW4gOiBwb3NpdGlvbi5jb2x1bW4gKyB0ZXh0Lmxlbmd0aA0KICAgICAgICB9Ow0KDQogICAgICAgIHZhciBkZWx0YSA9IHsNCiAgICAgICAgICAgIGFjdGlvbjogImluc2VydFRleHQiLA0KICAgICAgICAgICAgcmFuZ2U6IFJhbmdlLmZyb21Qb2ludHMocG9zaXRpb24sIGVuZCksDQogICAgICAgICAgICB0ZXh0OiB0ZXh0DQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQoNCiAgICAgICAgcmV0dXJuIGVuZDsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmUgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICAvLyBjbGlwIHRvIGRvY3VtZW50DQogICAgICAgIHJhbmdlLnN0YXJ0ID0gdGhpcy4kY2xpcFBvc2l0aW9uKHJhbmdlLnN0YXJ0KTsNCiAgICAgICAgcmFuZ2UuZW5kID0gdGhpcy4kY2xpcFBvc2l0aW9uKHJhbmdlLmVuZCk7DQoNCiAgICAgICAgaWYgKHJhbmdlLmlzRW1wdHkoKSkNCiAgICAgICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCg0KICAgICAgICB2YXIgZmlyc3RSb3cgPSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgIHZhciBsYXN0Um93ID0gcmFuZ2UuZW5kLnJvdzsNCg0KICAgICAgICBpZiAocmFuZ2UuaXNNdWx0aUxpbmUoKSkgew0KICAgICAgICAgICAgdmFyIGZpcnN0RnVsbFJvdyA9IHJhbmdlLnN0YXJ0LmNvbHVtbiA9PSAwID8gZmlyc3RSb3cgOiBmaXJzdFJvdyArIDE7DQogICAgICAgICAgICB2YXIgbGFzdEZ1bGxSb3cgPSBsYXN0Um93IC0gMTsNCg0KICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5jb2x1bW4gPiAwKQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSW5MaW5lKGxhc3RSb3csIDAsIHJhbmdlLmVuZC5jb2x1bW4pOw0KDQogICAgICAgICAgICBpZiAobGFzdEZ1bGxSb3cgPj0gZmlyc3RGdWxsUm93KQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGluZXMoZmlyc3RGdWxsUm93LCBsYXN0RnVsbFJvdyk7DQoNCiAgICAgICAgICAgIGlmIChmaXJzdEZ1bGxSb3cgIT0gZmlyc3RSb3cpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUluTGluZShmaXJzdFJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLCB0aGlzLmdldExpbmUoZmlyc3RSb3cpLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVOZXdMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB0aGlzLnJlbW92ZUluTGluZShmaXJzdFJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlSW5MaW5lID0gZnVuY3Rpb24ocm93LCBzdGFydENvbHVtbiwgZW5kQ29sdW1uKSB7DQogICAgICAgIGlmIChzdGFydENvbHVtbiA9PSBlbmRDb2x1bW4pDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKHJvdywgc3RhcnRDb2x1bW4sIHJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHJlbW92ZWQgPSBsaW5lLnN1YnN0cmluZyhzdGFydENvbHVtbiwgZW5kQ29sdW1uKTsNCiAgICAgICAgdmFyIG5ld0xpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBzdGFydENvbHVtbikgKyBsaW5lLnN1YnN0cmluZyhlbmRDb2x1bW4sIGxpbmUubGVuZ3RoKTsNCiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlKHJvdywgMSwgbmV3TGluZSk7DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAicmVtb3ZlVGV4dCIsDQogICAgICAgICAgICByYW5nZTogcmFuZ2UsDQogICAgICAgICAgICB0ZXh0OiByZW1vdmVkDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQogICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogUmVtb3ZlcyBhIHJhbmdlIG9mIGZ1bGwgbGluZXMNCiAgICAgKg0KICAgICAqIEBwYXJhbSBmaXJzdFJvdyB7SW50ZWdlcn0gVGhlIGZpcnN0IHJvdyB0byBiZSByZW1vdmVkDQogICAgICogQHBhcmFtIGxhc3RSb3cge0ludGVnZXJ9IFRoZSBsYXN0IHJvdyB0byBiZSByZW1vdmVkDQogICAgICogQHJldHVybiB7U3RyaW5nW119IFRoZSByZW1vdmVkIGxpbmVzDQogICAgICovDQogICAgdGhpcy5yZW1vdmVMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShmaXJzdFJvdywgMCwgbGFzdFJvdyArIDEsIDApOw0KICAgICAgICB2YXIgcmVtb3ZlZCA9IHRoaXMuJGxpbmVzLnNwbGljZShmaXJzdFJvdywgbGFzdFJvdyAtIGZpcnN0Um93ICsgMSk7DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAicmVtb3ZlTGluZXMiLA0KICAgICAgICAgICAgcmFuZ2U6IHJhbmdlLA0KICAgICAgICAgICAgbmw6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpLA0KICAgICAgICAgICAgbGluZXM6IHJlbW92ZWQNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCiAgICAgICAgcmV0dXJuIHJlbW92ZWQ7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlTmV3TGluZSA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICB2YXIgZmlyc3RMaW5lID0gdGhpcy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBzZWNvbmRMaW5lID0gdGhpcy5nZXRMaW5lKHJvdysxKTsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCBmaXJzdExpbmUubGVuZ3RoLCByb3crMSwgMCk7DQogICAgICAgIHZhciBsaW5lID0gZmlyc3RMaW5lICsgc2Vjb25kTGluZTsNCg0KICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2Uocm93LCAyLCBsaW5lKTsNCg0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVUZXh0IiwNCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwNCiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQogICAgfTsNCg0KICAgIHRoaXMucmVwbGFjZSA9IGZ1bmN0aW9uKHJhbmdlLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwICYmIHJhbmdlLmlzRW1wdHkoKSkNCiAgICAgICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCg0KICAgICAgICAvLyBTaG9ydGN1dDogSWYgdGhlIHRleHQgd2Ugd2FudCB0byBpbnNlcnQgaXMgdGhlIHNhbWUgYXMgaXQgaXMgYWxyZWFkeQ0KICAgICAgICAvLyBpbiB0aGUgZG9jdW1lbnQsIHdlIGRvbid0IGhhdmUgdG8gcmVwbGFjZSBhbnl0aGluZy4NCiAgICAgICAgaWYgKHRleHQgPT0gdGhpcy5nZXRUZXh0UmFuZ2UocmFuZ2UpKQ0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlLmVuZDsNCg0KICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7DQogICAgICAgIGlmICh0ZXh0KSB7DQogICAgICAgICAgICB2YXIgZW5kID0gdGhpcy5pbnNlcnQocmFuZ2Uuc3RhcnQsIHRleHQpOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZW5kID0gcmFuZ2Uuc3RhcnQ7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gZW5kOw0KICAgIH07DQoNCiAgICB0aGlzLmFwcGx5RGVsdGFzID0gZnVuY3Rpb24oZGVsdGFzKSB7DQogICAgICAgIGZvciAodmFyIGk9MDsgaTxkZWx0YXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBkZWx0YSA9IGRlbHRhc1tpXTsNCiAgICAgICAgICAgIHZhciByYW5nZSA9IFJhbmdlLmZyb21Qb2ludHMoZGVsdGEucmFuZ2Uuc3RhcnQsIGRlbHRhLnJhbmdlLmVuZCk7DQoNCiAgICAgICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydExpbmVzIikNCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydExpbmVzKHJhbmdlLnN0YXJ0LnJvdywgZGVsdGEubGluZXMpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRUZXh0IikNCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydChyYW5nZS5zdGFydCwgZGVsdGEudGV4dCk7DQogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyAtIDEpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVUZXh0IikNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5yZXZlcnREZWx0YXMgPSBmdW5jdGlvbihkZWx0YXMpIHsNCiAgICAgICAgZm9yICh2YXIgaT1kZWx0YXMubGVuZ3RoLTE7IGk+PTA7IGktLSkgew0KICAgICAgICAgICAgdmFyIGRlbHRhID0gZGVsdGFzW2ldOw0KDQogICAgICAgICAgICB2YXIgcmFuZ2UgPSBSYW5nZS5mcm9tUG9pbnRzKGRlbHRhLnJhbmdlLnN0YXJ0LCBkZWx0YS5yYW5nZS5lbmQpOw0KDQogICAgICAgICAgICBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRMaW5lcyIpDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMaW5lcyhyYW5nZS5zdGFydC5yb3csIHJhbmdlLmVuZC5yb3cgLSAxKTsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0VGV4dCIpDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUocmFuZ2UpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVMaW5lcyIpDQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRMaW5lcyhyYW5nZS5zdGFydC5yb3csIGRlbHRhLmxpbmVzKTsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlVGV4dCIpDQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQocmFuZ2Uuc3RhcnQsIGRlbHRhLnRleHQpOw0KICAgICAgICB9DQogICAgfTsNCg0KfSkuY2FsbChEb2N1bWVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkRvY3VtZW50ID0gRG9jdW1lbnQ7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9hbmNob3InLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQoNCi8qKg0KICogQW4gQW5jaG9yIGlzIGEgZmxvYXRpbmcgcG9pbnRlciBpbiB0aGUgZG9jdW1lbnQuIFdoZW5ldmVyIHRleHQgaXMgaW5zZXJ0ZWQgb3INCiAqIGRlbGV0ZWQgYmVmb3JlIHRoZSBjdXJzb3IsIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yIGlzIHVwZGF0ZWQNCiAqLw0KdmFyIEFuY2hvciA9IGV4cG9ydHMuQW5jaG9yID0gZnVuY3Rpb24oZG9jLCByb3csIGNvbHVtbikgew0KICAgIHRoaXMuZG9jdW1lbnQgPSBkb2M7DQogICAgDQogICAgaWYgKHR5cGVvZiBjb2x1bW4gPT0gInVuZGVmaW5lZCIpDQogICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LnJvdywgcm93LmNvbHVtbik7DQogICAgZWxzZQ0KICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdywgY29sdW1uKTsNCg0KICAgIHRoaXMuJG9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpOw0KICAgIGRvYy5vbigiY2hhbmdlIiwgdGhpcy4kb25DaGFuZ2UpOw0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KICAgIA0KICAgIHRoaXMuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQodGhpcy5yb3csIHRoaXMuY29sdW1uKTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0RG9jdW1lbnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQ7DQogICAgfTsNCiAgICANCiAgICB0aGlzLm9uQ2hhbmdlID0gZnVuY3Rpb24oZSkgew0KICAgICAgICB2YXIgZGVsdGEgPSBlLmRhdGE7DQogICAgICAgIHZhciByYW5nZSA9IGRlbHRhLnJhbmdlOw0KICAgICAgICAgICAgDQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcmFuZ2UuZW5kLnJvdyAmJiByYW5nZS5zdGFydC5yb3cgIT0gdGhpcy5yb3cpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA+IHRoaXMucm93KQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gdGhpcy5yb3cgJiYgcmFuZ2Uuc3RhcnQuY29sdW1uID4gdGhpcy5jb2x1bW4pDQogICAgICAgICAgICByZXR1cm47DQogICAgDQogICAgICAgIHZhciByb3cgPSB0aGlzLnJvdzsNCiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uOw0KICAgICAgICANCiAgICAgICAgaWYgKGRlbHRhLmFjdGlvbiA9PT0gImluc2VydFRleHQiKSB7DQogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09PSByb3cgJiYgcmFuZ2Uuc3RhcnQuY29sdW1uIDw9IGNvbHVtbikgew0KICAgICAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT09IHJhbmdlLmVuZC5yb3cpIHsNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uICs9IHJhbmdlLmVuZC5jb2x1bW4gLSByYW5nZS5zdGFydC5jb2x1bW47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4gLT0gcmFuZ2Uuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChyYW5nZS5zdGFydC5yb3cgIT09IHJhbmdlLmVuZC5yb3cgJiYgcmFuZ2Uuc3RhcnQucm93IDwgcm93KSB7DQogICAgICAgICAgICAgICAgcm93ICs9IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09PSAiaW5zZXJ0TGluZXMiKSB7DQogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93IDw9IHJvdykgew0KICAgICAgICAgICAgICAgIHJvdyArPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlVGV4dCIpIHsNCiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA8IGNvbHVtbikgew0KICAgICAgICAgICAgICAgIGlmIChyYW5nZS5lbmQuY29sdW1uID49IGNvbHVtbikNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gcmFuZ2Uuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gTWF0aC5tYXgoMCwgY29sdW1uIC0gKHJhbmdlLmVuZC5jb2x1bW4gLSByYW5nZS5zdGFydC5jb2x1bW4pKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0gZWxzZSBpZiAocmFuZ2Uuc3RhcnQucm93ICE9PSByYW5nZS5lbmQucm93ICYmIHJhbmdlLnN0YXJ0LnJvdyA8IHJvdykgew0KICAgICAgICAgICAgICAgIGlmIChyYW5nZS5lbmQucm93ID09IHJvdykgew0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBNYXRoLm1heCgwLCBjb2x1bW4gLSByYW5nZS5lbmQuY29sdW1uKSArIHJhbmdlLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcm93IC09IChyYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKHJhbmdlLmVuZC5yb3cgPT0gcm93KSB7DQogICAgICAgICAgICAgICAgcm93IC09IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICAgICAgY29sdW1uID0gTWF0aC5tYXgoMCwgY29sdW1uIC0gcmFuZ2UuZW5kLmNvbHVtbikgKyByYW5nZS5zdGFydC5jb2x1bW47DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVMaW5lcyIpIHsNCiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPD0gcm93KSB7DQogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5yb3cgPD0gcm93KQ0KICAgICAgICAgICAgICAgICAgICByb3cgLT0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcm93ID0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSAwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LCBjb2x1bW4sIHRydWUpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldFBvc2l0aW9uID0gZnVuY3Rpb24ocm93LCBjb2x1bW4sIG5vQ2xpcCkgew0KICAgICAgICB2YXIgcG9zOw0KICAgICAgICBpZiAobm9DbGlwKSB7DQogICAgICAgICAgICBwb3MgPSB7DQogICAgICAgICAgICAgICAgcm93OiByb3csDQogICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4NCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBwb3MgPSB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KHJvdywgY29sdW1uKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHRoaXMucm93ID09IHBvcy5yb3cgJiYgdGhpcy5jb2x1bW4gPT0gcG9zLmNvbHVtbikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgb2xkID0gew0KICAgICAgICAgICAgcm93OiB0aGlzLnJvdywNCiAgICAgICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4NCiAgICAgICAgfTsNCiAgICAgICAgDQogICAgICAgIHRoaXMucm93ID0gcG9zLnJvdzsNCiAgICAgICAgdGhpcy5jb2x1bW4gPSBwb3MuY29sdW1uOw0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7DQogICAgICAgICAgICBvbGQ6IG9sZCwNCiAgICAgICAgICAgIHZhbHVlOiBwb3MNCiAgICAgICAgfSk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmRldGFjaCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIHRoaXMuJG9uQ2hhbmdlKTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgcG9zID0ge307DQogICAgDQogICAgICAgIGlmIChyb3cgPj0gdGhpcy5kb2N1bWVudC5nZXRMZW5ndGgoKSkgew0KICAgICAgICAgICAgcG9zLnJvdyA9IE1hdGgubWF4KDAsIHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsNCiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSB0aGlzLmRvY3VtZW50LmdldExpbmUocG9zLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKHJvdyA8IDApIHsNCiAgICAgICAgICAgIHBvcy5yb3cgPSAwOw0KICAgICAgICAgICAgcG9zLmNvbHVtbiA9IDA7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBwb3Mucm93ID0gcm93Ow0KICAgICAgICAgICAgcG9zLmNvbHVtbiA9IE1hdGgubWluKHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGgsIE1hdGgubWF4KDAsIGNvbHVtbikpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoY29sdW1uIDwgMCkNCiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSAwOw0KICAgICAgICAgICAgDQogICAgICAgIHJldHVybiBwb3M7DQogICAgfTsNCiAgICANCn0pLmNhbGwoQW5jaG9yLnByb3RvdHlwZSk7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2JhY2tncm91bmRfdG9rZW5pemVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuL2xpYi9vb3AiKTsNCnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KDQp2YXIgQmFja2dyb3VuZFRva2VuaXplciA9IGZ1bmN0aW9uKHRva2VuaXplciwgZWRpdG9yKSB7DQogICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7ICAgIA0KICAgIHRoaXMubGluZXMgPSBbXTsNCiAgICB0aGlzLmN1cnJlbnRMaW5lID0gMDsNCiAgICB0aGlzLnRva2VuaXplciA9IHRva2VuaXplcjsNCg0KICAgIHZhciBzZWxmID0gdGhpczsNCg0KICAgIHRoaXMuJHdvcmtlciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAoIXNlbGYucnVubmluZykgeyByZXR1cm47IH0NCg0KICAgICAgICB2YXIgd29ya2VyU3RhcnQgPSBuZXcgRGF0ZSgpOw0KICAgICAgICB2YXIgc3RhcnRMaW5lID0gc2VsZi5jdXJyZW50TGluZTsNCiAgICAgICAgdmFyIGRvYyA9IHNlbGYuZG9jOw0KDQogICAgICAgIHZhciBwcm9jZXNzZWRMaW5lcyA9IDA7DQoNCiAgICAgICAgdmFyIGxlbiA9IGRvYy5nZXRMZW5ndGgoKTsNCiAgICAgICAgd2hpbGUgKHNlbGYuY3VycmVudExpbmUgPCBsZW4pIHsNCiAgICAgICAgICAgIHNlbGYubGluZXNbc2VsZi5jdXJyZW50TGluZV0gPSBzZWxmLiR0b2tlbml6ZVJvd3Moc2VsZi5jdXJyZW50TGluZSwgc2VsZi5jdXJyZW50TGluZSlbMF07DQogICAgICAgICAgICBzZWxmLmN1cnJlbnRMaW5lKys7DQoNCiAgICAgICAgICAgIC8vIG9ubHkgY2hlY2sgZXZlcnkgNSBsaW5lcw0KICAgICAgICAgICAgcHJvY2Vzc2VkTGluZXMgKz0gMTsNCiAgICAgICAgICAgIGlmICgocHJvY2Vzc2VkTGluZXMgJSA1ID09IDApICYmIChuZXcgRGF0ZSgpIC0gd29ya2VyU3RhcnQpID4gMjApIHsNCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVVcGRhdGVFdmVudChzdGFydExpbmUsIHNlbGYuY3VycmVudExpbmUtMSk7DQogICAgICAgICAgICAgICAgc2VsZi5ydW5uaW5nID0gc2V0VGltZW91dChzZWxmLiR3b3JrZXIsIDIwKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBzZWxmLnJ1bm5pbmcgPSBmYWxzZTsNCg0KICAgICAgICBzZWxmLmZpcmVVcGRhdGVFdmVudChzdGFydExpbmUsIGxlbiAtIDEpOw0KICAgIH07DQp9Ow0KDQooZnVuY3Rpb24oKXsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCg0KICAgIHRoaXMuc2V0VG9rZW5pemVyID0gZnVuY3Rpb24odG9rZW5pemVyKSB7DQogICAgICAgIHRoaXMudG9rZW5pemVyID0gdG9rZW5pemVyOw0KICAgICAgICB0aGlzLmxpbmVzID0gW107DQoNCiAgICAgICAgdGhpcy5zdGFydCgwKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKGRvYykgew0KICAgICAgICB0aGlzLmRvYyA9IGRvYzsNCiAgICAgICAgdGhpcy5saW5lcyA9IFtdOw0KDQogICAgICAgIHRoaXMuc3RvcCgpOw0KICAgIH07DQoNCiAgICB0aGlzLmZpcmVVcGRhdGVFdmVudCA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIHZhciBkYXRhID0gew0KICAgICAgICAgICAgZmlyc3Q6IGZpcnN0Um93LA0KICAgICAgICAgICAgbGFzdDogbGFzdFJvdw0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLl9lbWl0KCJ1cGRhdGUiLCB7ZGF0YTogZGF0YX0pOw0KICAgIH07DQoNCiAgICB0aGlzLnN0YXJ0ID0gZnVuY3Rpb24oc3RhcnRSb3cpIHsNCiAgICAgICAgdGhpcy5jdXJyZW50TGluZSA9IE1hdGgubWluKHN0YXJ0Um93IHx8IDAsIHRoaXMuY3VycmVudExpbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvYy5nZXRMZW5ndGgoKSk7DQoNCiAgICAgICAgLy8gcmVtb3ZlIGFsbCBjYWNoZWQgaXRlbXMgYmVsb3cgdGhpcyBsaW5lDQogICAgICAgIHRoaXMubGluZXMuc3BsaWNlKHRoaXMuY3VycmVudExpbmUsIHRoaXMubGluZXMubGVuZ3RoKTsNCg0KICAgICAgICB0aGlzLnN0b3AoKTsNCiAgICAgICAgLy8gcHJldHR5IGxvbmcgZGVsYXkgdG8gcHJldmVudCB0aGUgdG9rZW5pemVyIGZyb20gaW50ZXJmZXJpbmcgd2l0aCB0aGUgdXNlcg0KICAgICAgICB0aGlzLnJ1bm5pbmcgPSBzZXRUaW1lb3V0KHRoaXMuJHdvcmtlciwgNzAwKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zdG9wID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmICh0aGlzLnJ1bm5pbmcpDQogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ydW5uaW5nKTsNCiAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0VG9rZW5zID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHRva2VuaXplUm93cyhmaXJzdFJvdywgbGFzdFJvdyk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U3RhdGUgPSBmdW5jdGlvbihyb3cpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHRva2VuaXplUm93cyhyb3csIHJvdylbMF0uc3RhdGU7DQogICAgfTsNCg0KICAgIHRoaXMuJHRva2VuaXplUm93cyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIGlmICghdGhpcy5kb2MgfHwgaXNOYU4oZmlyc3RSb3cpIHx8IGlzTmFOKGxhc3RSb3cpKQ0KICAgICAgICAgICAgcmV0dXJuIFt7J3N0YXRlJzonc3RhcnQnLCd0b2tlbnMnOltdfV07DQogICAgICAgICAgICANCiAgICAgICAgdmFyIHJvd3MgPSBbXTsNCg0KICAgICAgICAvLyBkZXRlcm1pbmUgc3RhcnQgc3RhdGUNCiAgICAgICAgdmFyIHN0YXRlID0gInN0YXJ0IjsNCiAgICAgICAgdmFyIGRvQ2FjaGUgPSBmYWxzZTsNCiAgICAgICAgaWYgKGZpcnN0Um93ID4gMCAmJiB0aGlzLmxpbmVzW2ZpcnN0Um93IC0gMV0pIHsNCiAgICAgICAgICAgIHN0YXRlID0gdGhpcy5saW5lc1tmaXJzdFJvdyAtIDFdLnN0YXRlOw0KICAgICAgICAgICAgZG9DYWNoZSA9IHRydWU7DQogICAgICAgIH0gZWxzZSBpZiAoZmlyc3RSb3cgPT0gMCkgew0KICAgICAgICAgICAgc3RhdGUgPSAic3RhcnQiOw0KICAgICAgICAgICAgZG9DYWNoZSA9IHRydWU7DQogICAgICAgIH0gZWxzZSBpZiAodGhpcy5saW5lcy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAvLyBHdWVzcyB0aGF0IHdlIGhhdmVuJ3QgY2hhbmdlZCBzdGF0ZS4NCiAgICAgICAgICAgIHN0YXRlID0gdGhpcy5saW5lc1t0aGlzLmxpbmVzLmxlbmd0aC0xXS5zdGF0ZTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBsaW5lcyA9IHRoaXMuZG9jLmdldExpbmVzKGZpcnN0Um93LCBsYXN0Um93KTsNCiAgICAgICAgZm9yICh2YXIgcm93PWZpcnN0Um93OyByb3c8PWxhc3RSb3c7IHJvdysrKSB7DQogICAgICAgICAgICBpZiAoIXRoaXMubGluZXNbcm93XSkgew0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSB0aGlzLnRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmVzW3Jvdy1maXJzdFJvd10gfHwgIiIsIHN0YXRlKTsNCiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSB0b2tlbnMuc3RhdGU7DQogICAgICAgICAgICAgICAgcm93cy5wdXNoKHRva2Vucyk7DQoNCiAgICAgICAgICAgICAgICBpZiAoZG9DYWNoZSkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVzW3Jvd10gPSB0b2tlbnM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHRoaXMubGluZXNbcm93XTsNCiAgICAgICAgICAgICAgICBzdGF0ZSA9IHRva2Vucy5zdGF0ZTsNCiAgICAgICAgICAgICAgICByb3dzLnB1c2godG9rZW5zKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcm93czsNCiAgICB9Ow0KDQp9KS5jYWxsKEJhY2tncm91bmRUb2tlbml6ZXIucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5CYWNrZ3JvdW5kVG9rZW5pemVyID0gQmFja2dyb3VuZFRva2VuaXplcjsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgSnVsaWFuIFZpZXJlY2sgPGp1bGlhbiBET1QgdmllcmVjayBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2VkaXRfc2Vzc2lvbi9mb2xkaW5nJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnLCAnYWNlL2VkaXRfc2Vzc2lvbi9mb2xkX2xpbmUnLCAnYWNlL2VkaXRfc2Vzc2lvbi9mb2xkJywgJ2FjZS90b2tlbl9pdGVyYXRvciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBGb2xkTGluZSA9IHJlcXVpcmUoIi4vZm9sZF9saW5lIikuRm9sZExpbmU7DQp2YXIgRm9sZCA9IHJlcXVpcmUoIi4vZm9sZCIpLkZvbGQ7DQp2YXIgVG9rZW5JdGVyYXRvciA9IHJlcXVpcmUoIi4uL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcjsNCg0KZnVuY3Rpb24gRm9sZGluZygpIHsNCiAgICAvKioNCiAgICAgKiBMb29rcyB1cCBhIGZvbGQgYXQgYSBnaXZlbiByb3cvY29sdW1uLiBQb3NzaWJsZSB2YWx1ZXMgZm9yIHNpZGU6DQogICAgICogICAtMTogaWdub3JlIGEgZm9sZCBpZiBmb2xkLnN0YXJ0ID0gcm93L2NvbHVtbg0KICAgICAqICAgKzE6IGlnbm9yZSBhIGZvbGQgaWYgZm9sZC5lbmQgPSByb3cvY29sdW1uDQogICAgICovDQogICAgdGhpcy5nZXRGb2xkQXQgPSBmdW5jdGlvbihyb3csIGNvbHVtbiwgc2lkZSkgew0KICAgICAgICB2YXIgZm9sZExpbmUgPSB0aGlzLmdldEZvbGRMaW5lKHJvdyk7DQogICAgICAgIGlmICghZm9sZExpbmUpDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCg0KICAgICAgICB2YXIgZm9sZHMgPSBmb2xkTGluZS5mb2xkczsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb2xkcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGZvbGQgPSBmb2xkc1tpXTsNCiAgICAgICAgICAgIGlmIChmb2xkLnJhbmdlLmNvbnRhaW5zKHJvdywgY29sdW1uKSkgew0KICAgICAgICAgICAgICAgIGlmIChzaWRlID09IDEgJiYgZm9sZC5yYW5nZS5pc0VuZChyb3csIGNvbHVtbikpIHsNCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaWRlID09IC0xICYmIGZvbGQucmFuZ2UuaXNTdGFydChyb3csIGNvbHVtbikpIHsNCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiBmb2xkOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIFJldHVybnMgYWxsIGZvbGRzIGluIHRoZSBnaXZlbiByYW5nZS4gTm90ZSwgdGhhdCB0aGlzIHdpbGwgcmV0dXJuIGZvbGRzDQogICAgICoNCiAgICAgKi8NCiAgICB0aGlzLmdldEZvbGRzSW5SYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIHJhbmdlID0gcmFuZ2UuY2xvbmUoKTsNCiAgICAgICAgdmFyIHN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7DQogICAgICAgIHZhciBlbmQgPSByYW5nZS5lbmQ7DQogICAgICAgIHZhciBmb2xkTGluZXMgPSB0aGlzLiRmb2xkRGF0YTsNCiAgICAgICAgdmFyIGZvdW5kRm9sZHMgPSBbXTsNCg0KICAgICAgICBzdGFydC5jb2x1bW4gKz0gMTsNCiAgICAgICAgZW5kLmNvbHVtbiAtPSAxOw0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9sZExpbmVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgY21wID0gZm9sZExpbmVzW2ldLnJhbmdlLmNvbXBhcmVSYW5nZShyYW5nZSk7DQogICAgICAgICAgICBpZiAoY21wID09IDIpIHsNCiAgICAgICAgICAgICAgICAvLyBSYW5nZSBpcyBiZWZvcmUgZm9sZExpbmUuIE5vIGludGVyc2VjdGlvbi4gVGhpcyBtZWFucywNCiAgICAgICAgICAgICAgICAvLyB0aGVyZSBtaWdodCBiZSBvdGhlciBmb2xkTGluZXMgdGhhdCBpbnRlcnNlY3QuDQogICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChjbXAgPT0gLTIpIHsNCiAgICAgICAgICAgICAgICAvLyBSYW5nZSBpcyBhZnRlciBmb2xkTGluZS4gVGhlcmUgY2FuJ3QgYmUgYW55IG90aGVyIGZvbGRMaW5lcyB0aGVuLA0KICAgICAgICAgICAgICAgIC8vIHNvIGxldCdzIGdpdmUgdXAuDQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBmb2xkcyA9IGZvbGRMaW5lc1tpXS5mb2xkczsNCiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZm9sZHMubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgZm9sZCA9IGZvbGRzW2pdOw0KICAgICAgICAgICAgICAgIGNtcCA9IGZvbGQucmFuZ2UuY29tcGFyZVJhbmdlKHJhbmdlKTsNCiAgICAgICAgICAgICAgICBpZiAoY21wID09IC0yKSB7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY21wID09IDIpIHsNCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgLy8gV1RGLXN0YXRlOiBDYW4gaGFwcGVuIGR1ZSB0byAtMS8rMSB0byBzdGFydC9lbmQgY29sdW1uLg0KICAgICAgICAgICAgICAgIGlmIChjbXAgPT0gNDIpIHsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvdW5kRm9sZHMucHVzaChmb2xkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZm91bmRGb2xkczsNCiAgICB9Ow0KICAgIA0KICAgIC8qKg0KICAgICAqIFJldHVybnMgYWxsIGZvbGRzIGluIHRoZSBkb2N1bWVudA0KICAgICAqLw0KICAgIHRoaXMuZ2V0QWxsRm9sZHMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIGZvbGRzID0gW107DQogICAgICAgIHZhciBmb2xkTGluZXMgPSB0aGlzLiRmb2xkRGF0YTsNCiAgICAgICAgDQogICAgICAgIGZ1bmN0aW9uIGFkZEZvbGQoZm9sZCkgew0KICAgICAgICAgICAgZm9sZHMucHVzaChmb2xkKTsNCiAgICAgICAgICAgIGlmICghZm9sZC5zdWJGb2xkcykNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvbGQuc3ViRm9sZHMubGVuZ3RoOyBpKyspDQogICAgICAgICAgICAgICAgYWRkRm9sZChmb2xkLnN1YkZvbGRzW2ldKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb2xkTGluZXMubGVuZ3RoOyBpKyspDQogICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZvbGRMaW5lc1tpXS5mb2xkcy5sZW5ndGg7IGorKykNCiAgICAgICAgICAgICAgICBhZGRGb2xkKGZvbGRMaW5lc1tpXS5mb2xkc1tqXSk7DQoNCiAgICAgICAgcmV0dXJuIGZvbGRzOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgYmV0d2VlbiBmb2xkcyBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uDQogICAgICogRS5nLg0KICAgICAqICBmb288Zm9sZD5ifGFyPGZvbGQ+d29scmQgLT4gImJhciINCiAgICAgKiAgZm9vPGZvbGQ+YmFyPGZvbGQ+d29sfHJkIC0+ICJ3b3JsZCINCiAgICAgKiAgZm9vPGZvbGQ+YmFyPGZvfGxkPndvbHJkIC0+IDxudWxsPg0KICAgICAqDQogICAgICogd2hlcmUgfCBtZWFucyB0aGUgcG9zaXRpb24gb2Ygcm93L2NvbHVtbg0KICAgICAqDQogICAgICogVGhlIHRyaW0gb3B0aW9uIGRldGVybXMgaWYgdGhlIHJldHVybiBzdHJpbmcgc2hvdWxkIGJlIHRyaW1lZCBhY2NvcmRpbmcNCiAgICAgKiB0byB0aGUgInNpZGUiIHBhc3NlZCB3aXRoIHRoZSB0cmltIHZhbHVlOg0KICAgICAqDQogICAgICogRS5nLg0KICAgICAqICBmb288Zm9sZD5ifGFyPGZvbGQ+d29scmQgLXRyaW09LTE+ICJiIg0KICAgICAqICBmb288Zm9sZD5iYXI8Zm9sZD53b2x8cmQgLXRyaW09KzE+ICJybGQiDQogICAgICogIGZvfG88Zm9sZD5iYXI8Zm9sZD53b2xyZCAtdHJpbT0wMD4gImZvbyINCiAgICAgKi8NCiAgICB0aGlzLmdldEZvbGRTdHJpbmdBdCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uLCB0cmltLCBmb2xkTGluZSkgew0KICAgICAgICBmb2xkTGluZSA9IGZvbGRMaW5lIHx8IHRoaXMuZ2V0Rm9sZExpbmUocm93KTsNCiAgICAgICAgaWYgKCFmb2xkTGluZSkNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KDQogICAgICAgIHZhciBsYXN0Rm9sZCA9IHsNCiAgICAgICAgICAgIGVuZDogeyBjb2x1bW46IDAgfQ0KICAgICAgICB9Ow0KICAgICAgICAvLyBUT0RPOiBSZWZhY3RvciB0byB1c2UgZ2V0TmV4dEZvbGRUbyBmdW5jdGlvbi4NCiAgICAgICAgdmFyIHN0ciwgZm9sZDsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb2xkTGluZS5mb2xkcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgZm9sZCA9IGZvbGRMaW5lLmZvbGRzW2ldOw0KICAgICAgICAgICAgdmFyIGNtcCA9IGZvbGQucmFuZ2UuY29tcGFyZUVuZChyb3csIGNvbHVtbik7DQogICAgICAgICAgICBpZiAoY21wID09IC0xKSB7DQogICAgICAgICAgICAgICAgc3RyID0gdGhpcw0KICAgICAgICAgICAgICAgICAgICAuZ2V0TGluZShmb2xkLnN0YXJ0LnJvdykNCiAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZyhsYXN0Rm9sZC5lbmQuY29sdW1uLCBmb2xkLnN0YXJ0LmNvbHVtbik7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChjbXAgPT09IDApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxhc3RGb2xkID0gZm9sZDsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIXN0cikNCiAgICAgICAgICAgIHN0ciA9IHRoaXMuZ2V0TGluZShmb2xkLnN0YXJ0LnJvdykuc3Vic3RyaW5nKGxhc3RGb2xkLmVuZC5jb2x1bW4pOw0KDQogICAgICAgIGlmICh0cmltID09IC0xKQ0KICAgICAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgY29sdW1uIC0gbGFzdEZvbGQuZW5kLmNvbHVtbik7DQogICAgICAgIGVsc2UgaWYgKHRyaW0gPT0gMSkNCiAgICAgICAgICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKGNvbHVtbiAtIGxhc3RGb2xkLmVuZC5jb2x1bW4pOw0KICAgICAgICBlbHNlDQogICAgICAgICAgICByZXR1cm4gc3RyOw0KICAgIH07DQoNCiAgICB0aGlzLmdldEZvbGRMaW5lID0gZnVuY3Rpb24oZG9jUm93LCBzdGFydEZvbGRMaW5lKSB7DQogICAgICAgIHZhciBmb2xkRGF0YSA9IHRoaXMuJGZvbGREYXRhOw0KICAgICAgICB2YXIgaSA9IDA7DQogICAgICAgIGlmIChzdGFydEZvbGRMaW5lKQ0KICAgICAgICAgICAgaSA9IGZvbGREYXRhLmluZGV4T2Yoc3RhcnRGb2xkTGluZSk7DQogICAgICAgIGlmIChpID09IC0xKQ0KICAgICAgICAgICAgaSA9IDA7DQogICAgICAgIGZvciAoaTsgaSA8IGZvbGREYXRhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgZm9sZExpbmUgPSBmb2xkRGF0YVtpXTsNCiAgICAgICAgICAgIGlmIChmb2xkTGluZS5zdGFydC5yb3cgPD0gZG9jUm93ICYmIGZvbGRMaW5lLmVuZC5yb3cgPj0gZG9jUm93KSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZvbGRMaW5lOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChmb2xkTGluZS5lbmQucm93ID4gZG9jUm93KSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIC8vIHJldHVybnMgdGhlIGZvbGQgd2hpY2ggc3RhcnRzIGFmdGVyIG9yIGNvbnRhaW5zIGRvY1Jvdw0KICAgIHRoaXMuZ2V0TmV4dEZvbGRMaW5lID0gZnVuY3Rpb24oZG9jUm93LCBzdGFydEZvbGRMaW5lKSB7DQogICAgICAgIHZhciBmb2xkRGF0YSA9IHRoaXMuJGZvbGREYXRhOw0KICAgICAgICB2YXIgaSA9IDA7DQogICAgICAgIGlmIChzdGFydEZvbGRMaW5lKQ0KICAgICAgICAgICAgaSA9IGZvbGREYXRhLmluZGV4T2Yoc3RhcnRGb2xkTGluZSk7DQogICAgICAgIGlmIChpID09IC0xKQ0KICAgICAgICAgICAgaSA9IDA7DQogICAgICAgIGZvciAoaTsgaSA8IGZvbGREYXRhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgZm9sZExpbmUgPSBmb2xkRGF0YVtpXTsNCiAgICAgICAgICAgIGlmIChmb2xkTGluZS5lbmQucm93ID49IGRvY1Jvdykgew0KICAgICAgICAgICAgICAgIHJldHVybiBmb2xkTGluZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRGb2xkZWRSb3dDb3VudCA9IGZ1bmN0aW9uKGZpcnN0LCBsYXN0KSB7DQogICAgICAgIHZhciBmb2xkRGF0YSA9IHRoaXMuJGZvbGREYXRhLCByb3dDb3VudCA9IGxhc3QtZmlyc3QrMTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb2xkRGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGZvbGRMaW5lID0gZm9sZERhdGFbaV0sDQogICAgICAgICAgICAgICAgZW5kID0gZm9sZExpbmUuZW5kLnJvdywNCiAgICAgICAgICAgICAgICBzdGFydCA9IGZvbGRMaW5lLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgIGlmIChlbmQgPj0gbGFzdCkgew0KICAgICAgICAgICAgICAgIGlmKHN0YXJ0IDwgbGFzdCkgew0KICAgICAgICAgICAgICAgICAgICBpZihzdGFydCA+PSBmaXJzdCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0NvdW50IC09IGxhc3Qtc3RhcnQ7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0NvdW50ID0gMDsvL2luIG9uZSBmb2xkDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfSBlbHNlIGlmKGVuZCA+PSBmaXJzdCl7DQogICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IGZpcnN0KSAvL2ZvbGQgaW5zaWRlIHJhbmdlDQogICAgICAgICAgICAgICAgICAgIHJvd0NvdW50IC09ICBlbmQtc3RhcnQ7DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICByb3dDb3VudCAtPSAgZW5kLWZpcnN0KzE7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHJvd0NvdW50Ow0KICAgIH07DQoNCiAgICB0aGlzLiRhZGRGb2xkTGluZSA9IGZ1bmN0aW9uKGZvbGRMaW5lKSB7DQogICAgICAgIHRoaXMuJGZvbGREYXRhLnB1c2goZm9sZExpbmUpOw0KICAgICAgICB0aGlzLiRmb2xkRGF0YS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsNCiAgICAgICAgICAgIHJldHVybiBhLnN0YXJ0LnJvdyAtIGIuc3RhcnQucm93Ow0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuIGZvbGRMaW5lOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBBZGRzIGEgbmV3IGZvbGQuDQogICAgICoNCiAgICAgKiBAcmV0dXJucw0KICAgICAqICAgICAgVGhlIG5ldyBjcmVhdGVkIEZvbGQgb2JqZWN0IG9yIGFuIGV4aXN0aW5nIGZvbGQgb2JqZWN0IGluIGNhc2UgdGhlDQogICAgICogICAgICBwYXNzZWQgaW4gcmFuZ2UgZml0cyBhbiBleGlzdGluZyBmb2xkIGV4YWN0bHkuDQogICAgICovDQogICAgdGhpcy5hZGRGb2xkID0gZnVuY3Rpb24ocGxhY2Vob2xkZXIsIHJhbmdlKSB7DQogICAgICAgIHZhciBmb2xkRGF0YSA9IHRoaXMuJGZvbGREYXRhOw0KICAgICAgICB2YXIgYWRkZWQgPSBmYWxzZTsNCiAgICAgICAgdmFyIGZvbGQ7DQogICAgICAgIA0KICAgICAgICBpZiAocGxhY2Vob2xkZXIgaW5zdGFuY2VvZiBGb2xkKQ0KICAgICAgICAgICAgZm9sZCA9IHBsYWNlaG9sZGVyOw0KICAgICAgICBlbHNlDQogICAgICAgICAgICBmb2xkID0gbmV3IEZvbGQocmFuZ2UsIHBsYWNlaG9sZGVyKTsNCg0KICAgICAgICB0aGlzLiRjbGlwUmFuZ2VUb0RvY3VtZW50KGZvbGQucmFuZ2UpOw0KDQogICAgICAgIHZhciBzdGFydFJvdyA9IGZvbGQuc3RhcnQucm93Ow0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBmb2xkLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgdmFyIGVuZFJvdyA9IGZvbGQuZW5kLnJvdzsNCiAgICAgICAgdmFyIGVuZENvbHVtbiA9IGZvbGQuZW5kLmNvbHVtbjsNCg0KICAgICAgICAvLyAtLS0gU29tZSBjaGVja2luZyAtLS0NCiAgICAgICAgaWYgKGZvbGQucGxhY2Vob2xkZXIubGVuZ3RoIDwgMikNCiAgICAgICAgICAgIHRocm93ICJQbGFjZWhvbGRlciBoYXMgdG8gYmUgYXQgbGVhc3QgMiBjaGFyYWN0ZXJzIjsNCg0KICAgICAgICBpZiAoc3RhcnRSb3cgPT0gZW5kUm93ICYmIGVuZENvbHVtbiAtIHN0YXJ0Q29sdW1uIDwgMikNCiAgICAgICAgICAgIHRocm93ICJUaGUgcmFuZ2UgaGFzIHRvIGJlIGF0IGxlYXN0IDIgY2hhcmFjdGVycyB3aWR0aCI7DQoNCiAgICAgICAgdmFyIHN0YXJ0Rm9sZCA9IHRoaXMuZ2V0Rm9sZEF0KHN0YXJ0Um93LCBzdGFydENvbHVtbiwgMSk7DQogICAgICAgIHZhciBlbmRGb2xkID0gdGhpcy5nZXRGb2xkQXQoZW5kUm93LCBlbmRDb2x1bW4sIC0xKTsNCiAgICAgICAgaWYgKHN0YXJ0Rm9sZCAmJiBlbmRGb2xkID09IHN0YXJ0Rm9sZCkNCiAgICAgICAgICAgIHJldHVybiBzdGFydEZvbGQuYWRkU3ViRm9sZChmb2xkKTsNCg0KICAgICAgICBpZiAoDQogICAgICAgICAgICAoc3RhcnRGb2xkICYmICFzdGFydEZvbGQucmFuZ2UuaXNTdGFydChzdGFydFJvdywgc3RhcnRDb2x1bW4pKQ0KICAgICAgICAgICAgfHwgKGVuZEZvbGQgJiYgIWVuZEZvbGQucmFuZ2UuaXNFbmQoZW5kUm93LCBlbmRDb2x1bW4pKQ0KICAgICAgICApIHsNCiAgICAgICAgICAgIHRocm93ICJBIGZvbGQgY2FuJ3QgaW50ZXJzZWN0IGFscmVhZHkgZXhpc3RpbmcgZm9sZCIgKyBmb2xkLnJhbmdlICsgc3RhcnRGb2xkLnJhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGZvbGRzIGluIHRoZSByYW5nZSB3ZSBjcmVhdGUgdGhlIG5ldyBmb2xkIGZvci4NCiAgICAgICAgdmFyIGZvbGRzID0gdGhpcy5nZXRGb2xkc0luUmFuZ2UoZm9sZC5yYW5nZSk7DQogICAgICAgIGlmIChmb2xkcy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGZvbGRzIGZyb20gZm9sZCBkYXRhLg0KICAgICAgICAgICAgdGhpcy5yZW1vdmVGb2xkcyhmb2xkcyk7DQogICAgICAgICAgICAvLyBBZGQgdGhlIHJlbW92ZWQgZm9sZHMgYXMgc3ViZm9sZHMgb24gdGhlIG5ldyBmb2xkLg0KICAgICAgICAgICAgZm9sZC5zdWJGb2xkcyA9IGZvbGRzOw0KICAgICAgICB9DQoNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb2xkRGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGZvbGRMaW5lID0gZm9sZERhdGFbaV07DQogICAgICAgICAgICBpZiAoZW5kUm93ID09IGZvbGRMaW5lLnN0YXJ0LnJvdykgew0KICAgICAgICAgICAgICAgIGZvbGRMaW5lLmFkZEZvbGQoZm9sZCk7DQogICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnRSb3cgPT0gZm9sZExpbmUuZW5kLnJvdykgew0KICAgICAgICAgICAgICAgIGZvbGRMaW5lLmFkZEZvbGQoZm9sZCk7DQogICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGlmICghZm9sZC5zYW1lUm93KSB7DQogICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIG1pZ2h0IGhhdmUgdG8gbWVyZ2UgdHdvIEZvbGRMaW5lcy4NCiAgICAgICAgICAgICAgICAgICAgdmFyIGZvbGRMaW5lTmV4dCA9IGZvbGREYXRhW2kgKyAxXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGRMaW5lTmV4dCAmJiBmb2xkTGluZU5leHQuc3RhcnQucm93ID09IGVuZFJvdykgew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBtZXJnZSENCiAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRMaW5lLm1lcmdlKGZvbGRMaW5lTmV4dCk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKGVuZFJvdyA8PSBmb2xkTGluZS5zdGFydC5yb3cpIHsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghYWRkZWQpDQogICAgICAgICAgICBmb2xkTGluZSA9IHRoaXMuJGFkZEZvbGRMaW5lKG5ldyBGb2xkTGluZSh0aGlzLiRmb2xkRGF0YSwgZm9sZCkpOw0KDQogICAgICAgIGlmICh0aGlzLiR1c2VXcmFwTW9kZSkNCiAgICAgICAgICAgIHRoaXMuJHVwZGF0ZVdyYXBEYXRhKGZvbGRMaW5lLnN0YXJ0LnJvdywgZm9sZExpbmUuc3RhcnQucm93KTsNCg0KICAgICAgICAvLyBOb3RpZnkgdGhhdCBmb2xkIGRhdGEgaGFzIGNoYW5nZWQuDQogICAgICAgIHRoaXMuJG1vZGlmaWVkID0gdHJ1ZTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlRm9sZCIsIHsgZGF0YTogZm9sZCB9KTsNCg0KICAgICAgICByZXR1cm4gZm9sZDsNCiAgICB9Ow0KDQogICAgdGhpcy5hZGRGb2xkcyA9IGZ1bmN0aW9uKGZvbGRzKSB7DQogICAgICAgIGZvbGRzLmZvckVhY2goZnVuY3Rpb24oZm9sZCkgew0KICAgICAgICAgICAgdGhpcy5hZGRGb2xkKGZvbGQpOw0KICAgICAgICB9LCB0aGlzKTsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmVGb2xkID0gZnVuY3Rpb24oZm9sZCkgew0KICAgICAgICB2YXIgZm9sZExpbmUgPSBmb2xkLmZvbGRMaW5lOw0KICAgICAgICB2YXIgc3RhcnRSb3cgPSBmb2xkTGluZS5zdGFydC5yb3c7DQogICAgICAgIHZhciBlbmRSb3cgPSBmb2xkTGluZS5lbmQucm93Ow0KDQogICAgICAgIHZhciBmb2xkTGluZXMgPSB0aGlzLiRmb2xkRGF0YTsNCiAgICAgICAgdmFyIGZvbGRzID0gZm9sZExpbmUuZm9sZHM7DQogICAgICAgIC8vIFNpbXBsZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG9ubHkgb25lIGZvbGQgaW4gdGhlIEZvbGRMaW5lIHN1Y2ggdGhhdA0KICAgICAgICAvLyB0aGUgZW50aXJlIGZvbGQgbGluZSBjYW4gZ2V0IHJlbW92ZWQgZGlyZWN0bHkuDQogICAgICAgIGlmIChmb2xkcy5sZW5ndGggPT0gMSkgew0KICAgICAgICAgICAgZm9sZExpbmVzLnNwbGljZShmb2xkTGluZXMuaW5kZXhPZihmb2xkTGluZSksIDEpOw0KICAgICAgICB9IGVsc2UNCiAgICAgICAgLy8gSWYgdGhlIGZvbGQgaXMgdGhlIGxhc3QgZm9sZCBvZiB0aGUgZm9sZExpbmUsIGp1c3QgcmVtb3ZlIGl0Lg0KICAgICAgICBpZiAoZm9sZExpbmUucmFuZ2UuaXNFbmQoZm9sZC5lbmQucm93LCBmb2xkLmVuZC5jb2x1bW4pKSB7DQogICAgICAgICAgICBmb2xkcy5wb3AoKTsNCiAgICAgICAgICAgIGZvbGRMaW5lLmVuZC5yb3cgPSBmb2xkc1tmb2xkcy5sZW5ndGggLSAxXS5lbmQucm93Ow0KICAgICAgICAgICAgZm9sZExpbmUuZW5kLmNvbHVtbiA9IGZvbGRzW2ZvbGRzLmxlbmd0aCAtIDFdLmVuZC5jb2x1bW47DQogICAgICAgIH0gZWxzZQ0KICAgICAgICAvLyBJZiB0aGUgZm9sZCBpcyB0aGUgZmlyc3QgZm9sZCBvZiB0aGUgZm9sZExpbmUsIGp1c3QgcmVtb3ZlIGl0Lg0KICAgICAgICBpZiAoZm9sZExpbmUucmFuZ2UuaXNTdGFydChmb2xkLnN0YXJ0LnJvdywgZm9sZC5zdGFydC5jb2x1bW4pKSB7DQogICAgICAgICAgICBmb2xkcy5zaGlmdCgpOw0KICAgICAgICAgICAgZm9sZExpbmUuc3RhcnQucm93ID0gZm9sZHNbMF0uc3RhcnQucm93Ow0KICAgICAgICAgICAgZm9sZExpbmUuc3RhcnQuY29sdW1uID0gZm9sZHNbMF0uc3RhcnQuY29sdW1uOw0KICAgICAgICB9IGVsc2UNCiAgICAgICAgLy8gV2Uga25vdyB0aGVyZSBhcmUgbW9yZSB0aGVuIDIgZm9sZHMgYW5kIHRoZSBmb2xkIGlzIG5vdCBhdCB0aGUgZWRnZS4NCiAgICAgICAgLy8gVGhpcyBtZWFucywgdGhlIGZvbGQgaXMgc29tZXdoZXJlIGluIGJldHdlZW4uDQogICAgICAgIC8vDQogICAgICAgIC8vIElmIHRoZSBmb2xkIGlzIGluIG9uZSByb3csIHdlIGp1c3QgY2FuIHJlbW92ZSBpdC4NCiAgICAgICAgaWYgKGZvbGQuc2FtZVJvdykgew0KICAgICAgICAgICAgZm9sZHMuc3BsaWNlKGZvbGRzLmluZGV4T2YoZm9sZCksIDEpOw0KICAgICAgICB9IGVsc2UNCiAgICAgICAgLy8gVGhlIGZvbGQgZ29lcyBvdmVyIG1vcmUgdGhlbiBvbmUgcm93LiBUaGlzIG1lYW5zIHJlbXZvaW5nIHRoaXMgZm9sZA0KICAgICAgICAvLyB3aWxsIGNhdXNlIHRoZSBmb2xkIGxpbmUgdG8gZ2V0IHNwbGl0dGVkIHVwLiBuZXdGb2xkTGluZSBpcyB0aGUgc2Vjb25kIHBhcnQNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIG5ld0ZvbGRMaW5lID0gZm9sZExpbmUuc3BsaXQoZm9sZC5zdGFydC5yb3csIGZvbGQuc3RhcnQuY29sdW1uKTsNCiAgICAgICAgICAgIGZvbGRzID0gbmV3Rm9sZExpbmUuZm9sZHM7DQogICAgICAgICAgICBmb2xkcy5zaGlmdCgpOw0KICAgICAgICAgICAgbmV3Rm9sZExpbmUuc3RhcnQucm93ID0gZm9sZHNbMF0uc3RhcnQucm93Ow0KICAgICAgICAgICAgbmV3Rm9sZExpbmUuc3RhcnQuY29sdW1uID0gZm9sZHNbMF0uc3RhcnQuY29sdW1uOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoaXMuJHVzZVdyYXBNb2RlKSB7DQogICAgICAgICAgICB0aGlzLiR1cGRhdGVXcmFwRGF0YShzdGFydFJvdywgZW5kUm93KTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIE5vdGlmeSB0aGF0IGZvbGQgZGF0YSBoYXMgY2hhbmdlZC4NCiAgICAgICAgdGhpcy4kbW9kaWZpZWQgPSB0cnVlOw0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VGb2xkIiwgeyBkYXRhOiBmb2xkIH0pOw0KICAgIH07DQoNCiAgICB0aGlzLnJlbW92ZUZvbGRzID0gZnVuY3Rpb24oZm9sZHMpIHsNCiAgICAgICAgLy8gV2UgbmVlZCB0byBjbG9uZSB0aGUgZm9sZHMgYXJyYXkgcGFzc2VkIGluIGFzIGl0IG1pZ2h0IGJlIHRoZSBmb2xkcw0KICAgICAgICAvLyBhcnJheSBvZiBhIGZvbGQgbGluZSBhbmQgYXMgd2UgY2FsbCB0aGlzLnJlbW92ZUZvbGQoZm9sZCksIGZvbGRzDQogICAgICAgIC8vIGFyZSByZW1vdmVkIGZyb20gZm9sZHMgYW5kIGNoYW5nZXMgdGhlIGN1cnJlbnQgaW5kZXguDQogICAgICAgIHZhciBjbG9uZUZvbGRzID0gW107DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9sZHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGNsb25lRm9sZHMucHVzaChmb2xkc1tpXSk7DQogICAgICAgIH0NCg0KICAgICAgICBjbG9uZUZvbGRzLmZvckVhY2goZnVuY3Rpb24oZm9sZCkgew0KICAgICAgICAgICAgdGhpcy5yZW1vdmVGb2xkKGZvbGQpOw0KICAgICAgICB9LCB0aGlzKTsNCiAgICAgICAgdGhpcy4kbW9kaWZpZWQgPSB0cnVlOw0KICAgIH07DQoNCiAgICB0aGlzLmV4cGFuZEZvbGQgPSBmdW5jdGlvbihmb2xkKSB7DQogICAgICAgIHRoaXMucmVtb3ZlRm9sZChmb2xkKTsNCiAgICAgICAgZm9sZC5zdWJGb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKGZvbGQpIHsNCiAgICAgICAgICAgIHRoaXMuYWRkRm9sZChmb2xkKTsNCiAgICAgICAgfSwgdGhpcyk7DQogICAgICAgIGZvbGQuc3ViRm9sZHMgPSBbXTsNCiAgICB9Ow0KDQogICAgdGhpcy5leHBhbmRGb2xkcyA9IGZ1bmN0aW9uKGZvbGRzKSB7DQogICAgICAgIGZvbGRzLmZvckVhY2goZnVuY3Rpb24oZm9sZCkgew0KICAgICAgICAgICAgdGhpcy5leHBhbmRGb2xkKGZvbGQpOw0KICAgICAgICB9LCB0aGlzKTsNCiAgICB9Ow0KDQogICAgdGhpcy51bmZvbGQgPSBmdW5jdGlvbihsb2NhdGlvbiwgZXhwYW5kSW5uZXIpIHsNCiAgICAgICAgdmFyIHJhbmdlLCBmb2xkczsNCiAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpDQogICAgICAgICAgICByYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCB0aGlzLmdldExlbmd0aCgpLCAwKTsNCiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxvY2F0aW9uID09ICJudW1iZXIiKQ0KICAgICAgICAgICAgcmFuZ2UgPSBuZXcgUmFuZ2UobG9jYXRpb24sIDAsIGxvY2F0aW9uLCB0aGlzLmdldExpbmUobG9jYXRpb24pLmxlbmd0aCk7DQogICAgICAgIGVsc2UgaWYgKCJyb3ciIGluIGxvY2F0aW9uKQ0KICAgICAgICAgICAgcmFuZ2UgPSBSYW5nZS5mcm9tUG9pbnRzKGxvY2F0aW9uLCBsb2NhdGlvbik7DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIHJhbmdlID0gbG9jYXRpb247DQoNCiAgICAgICAgZm9sZHMgPSB0aGlzLmdldEZvbGRzSW5SYW5nZShyYW5nZSk7DQogICAgICAgIGlmIChleHBhbmRJbm5lcikgew0KICAgICAgICAgICAgdGhpcy5yZW1vdmVGb2xkcyhmb2xkcyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAvLyBUT0RPOiBtaWdodCBuZWVkIHRvIHJlbW92ZSBhbmQgYWRkIGZvbGRzIGluIG9uZSBnbyBpbnN0ZWFkIG9mIHVzaW5nDQogICAgICAgICAgICAvLyBleHBhbmRGb2xkcyBzZXZlcmFsIHRpbWVzLg0KICAgICAgICAgICAgd2hpbGUgKGZvbGRzLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kRm9sZHMoZm9sZHMpOw0KICAgICAgICAgICAgICAgIGZvbGRzID0gdGhpcy5nZXRGb2xkc0luUmFuZ2UocmFuZ2UpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIENoZWNrcyBpZiBhIGdpdmVuIGRvY3VtZW50Um93IGlzIGZvbGRlZC4gVGhpcyBpcyB0cnVlIGlmIHRoZXJlIGFyZSBzb21lDQogICAgICogZm9sZGVkIHBhcnRzIHN1Y2ggdGhhdCBzb21lIHBhcnRzIG9mIHRoZSBsaW5lIGlzIHN0aWxsIHZpc2libGUuDQogICAgICoqLw0KICAgIHRoaXMuaXNSb3dGb2xkZWQgPSBmdW5jdGlvbihkb2NSb3csIHN0YXJ0Rm9sZFJvdykgew0KICAgICAgICByZXR1cm4gISF0aGlzLmdldEZvbGRMaW5lKGRvY1Jvdywgc3RhcnRGb2xkUm93KTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRSb3dGb2xkRW5kID0gZnVuY3Rpb24oZG9jUm93LCBzdGFydEZvbGRSb3cpIHsNCiAgICAgICAgdmFyIGZvbGRMaW5lID0gdGhpcy5nZXRGb2xkTGluZShkb2NSb3csIHN0YXJ0Rm9sZFJvdyk7DQogICAgICAgIHJldHVybiAoZm9sZExpbmUNCiAgICAgICAgICAgID8gZm9sZExpbmUuZW5kLnJvdw0KICAgICAgICAgICAgOiBkb2NSb3cpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldEZvbGREaXNwbGF5TGluZSA9IGZ1bmN0aW9uKGZvbGRMaW5lLCBlbmRSb3csIGVuZENvbHVtbiwgc3RhcnRSb3csIHN0YXJ0Q29sdW1uKSB7DQogICAgICAgIGlmIChzdGFydFJvdyA9PSBudWxsKSB7DQogICAgICAgICAgICBzdGFydFJvdyA9IGZvbGRMaW5lLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgIHN0YXJ0Q29sdW1uID0gMDsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPT0gbnVsbCkgew0KICAgICAgICAgICAgZW5kUm93ID0gZm9sZExpbmUuZW5kLnJvdzsNCiAgICAgICAgICAgIGVuZENvbHVtbiA9IHRoaXMuZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEJ1aWxkIHRoZSB0ZXh0bGluZSB1c2luZyB0aGUgRm9sZExpbmUgd2Fsa2VyLg0KICAgICAgICB2YXIgZG9jID0gdGhpcy5kb2M7DQogICAgICAgIHZhciB0ZXh0TGluZSA9ICIiOw0KDQogICAgICAgIGZvbGRMaW5lLndhbGsoZnVuY3Rpb24ocGxhY2Vob2xkZXIsIHJvdywgY29sdW1uLCBsYXN0Q29sdW1uKSB7DQogICAgICAgICAgICBpZiAocm93IDwgc3RhcnRSb3cpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9IGVsc2UgaWYgKHJvdyA9PSBzdGFydFJvdykgew0KICAgICAgICAgICAgICAgIGlmIChjb2x1bW4gPCBzdGFydENvbHVtbikgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGxhc3RDb2x1bW4gPSBNYXRoLm1heChzdGFydENvbHVtbiwgbGFzdENvbHVtbik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocGxhY2Vob2xkZXIpIHsNCiAgICAgICAgICAgICAgICB0ZXh0TGluZSArPSBwbGFjZWhvbGRlcjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdGV4dExpbmUgKz0gZG9jLmdldExpbmUocm93KS5zdWJzdHJpbmcobGFzdENvbHVtbiwgY29sdW1uKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfS5iaW5kKHRoaXMpLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIHJldHVybiB0ZXh0TGluZTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXREaXNwbGF5TGluZSA9IGZ1bmN0aW9uKHJvdywgZW5kQ29sdW1uLCBzdGFydFJvdywgc3RhcnRDb2x1bW4pIHsNCiAgICAgICAgdmFyIGZvbGRMaW5lID0gdGhpcy5nZXRGb2xkTGluZShyb3cpOw0KDQogICAgICAgIGlmICghZm9sZExpbmUpIHsNCiAgICAgICAgICAgIHZhciBsaW5lOw0KICAgICAgICAgICAgbGluZSA9IHRoaXMuZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgICAgIHJldHVybiBsaW5lLnN1YnN0cmluZyhzdGFydENvbHVtbiB8fCAwLCBlbmRDb2x1bW4gfHwgbGluZS5sZW5ndGgpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9sZERpc3BsYXlMaW5lKA0KICAgICAgICAgICAgICAgIGZvbGRMaW5lLCByb3csIGVuZENvbHVtbiwgc3RhcnRSb3csIHN0YXJ0Q29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLiRjbG9uZUZvbGREYXRhID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBmZCA9IFtdOw0KICAgICAgICBmZCA9IHRoaXMuJGZvbGREYXRhLm1hcChmdW5jdGlvbihmb2xkTGluZSkgew0KICAgICAgICAgICAgdmFyIGZvbGRzID0gZm9sZExpbmUuZm9sZHMubWFwKGZ1bmN0aW9uKGZvbGQpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZm9sZC5jbG9uZSgpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICByZXR1cm4gbmV3IEZvbGRMaW5lKGZkLCBmb2xkcyk7DQogICAgICAgIH0pOw0KDQogICAgICAgIHJldHVybiBmZDsNCiAgICB9Ow0KDQogICAgdGhpcy50b2dnbGVGb2xkID0gZnVuY3Rpb24odHJ5VG9VbmZvbGQpIHsNCiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uOw0KICAgICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2UoKTsNCiAgICAgICAgdmFyIGZvbGQ7DQogICAgICAgIHZhciBicmFja2V0UG9zOw0KDQogICAgICAgIGlmIChyYW5nZS5pc0VtcHR5KCkpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSByYW5nZS5zdGFydDsNCiAgICAgICAgICAgIGZvbGQgPSB0aGlzLmdldEZvbGRBdChjdXJzb3Iucm93LCBjdXJzb3IuY29sdW1uKTsNCg0KICAgICAgICAgICAgaWYgKGZvbGQpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZEZvbGQoZm9sZCk7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoYnJhY2tldFBvcyA9IHRoaXMuZmluZE1hdGNoaW5nQnJhY2tldChjdXJzb3IpKSB7DQogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmNvbXBhcmVQb2ludChicmFja2V0UG9zKSA9PSAxKSB7DQogICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZCA9IGJyYWNrZXRQb3M7DQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc3RhcnQgPSBicmFja2V0UG9zOw0KICAgICAgICAgICAgICAgICAgICByYW5nZS5zdGFydC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbi0tOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKGJyYWNrZXRQb3MgPSB0aGlzLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1uICsgMX0pKSB7DQogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmNvbXBhcmVQb2ludChicmFja2V0UG9zKSA9PSAxKQ0KICAgICAgICAgICAgICAgICAgICByYW5nZS5lbmQgPSBicmFja2V0UG9zOw0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc3RhcnQgPSBicmFja2V0UG9zOw0KDQogICAgICAgICAgICAgICAgcmFuZ2Uuc3RhcnQuY29sdW1uKys7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByYW5nZSA9IHRoaXMuZ2V0Q29tbWVudEZvbGRSYW5nZShjdXJzb3Iucm93LCBjdXJzb3IuY29sdW1uKSB8fCByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHZhciBmb2xkcyA9IHRoaXMuZ2V0Rm9sZHNJblJhbmdlKHJhbmdlKTsNCiAgICAgICAgICAgIGlmICh0cnlUb1VuZm9sZCAmJiBmb2xkcy5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZEZvbGRzKGZvbGRzKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgZWxzZSBpZiAoZm9sZHMubGVuZ3RoID09IDEgKSB7DQogICAgICAgICAgICAgICAgZm9sZCA9IGZvbGRzWzBdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCFmb2xkKQ0KICAgICAgICAgICAgZm9sZCA9IHRoaXMuZ2V0Rm9sZEF0KHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uKTsNCg0KICAgICAgICBpZiAoZm9sZCAmJiBmb2xkLnJhbmdlLnRvU3RyaW5nKCkgPT0gcmFuZ2UudG9TdHJpbmcoKSkgew0KICAgICAgICAgICAgdGhpcy5leHBhbmRGb2xkKGZvbGQpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHBsYWNlaG9sZGVyID0gIi4uLiI7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSkgew0KICAgICAgICAgICAgcGxhY2Vob2xkZXIgPSB0aGlzLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgICAgICBpZihwbGFjZWhvbGRlci5sZW5ndGggPCA0KQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIHBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXIudHJpbSgpLnN1YnN0cmluZygwLCAyKSArICIuLiI7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLmFkZEZvbGQocGxhY2Vob2xkZXIsIHJhbmdlKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRDb21tZW50Rm9sZFJhbmdlID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIGl0ZXJhdG9yID0gbmV3IFRva2VuSXRlcmF0b3IodGhpcywgcm93LCBjb2x1bW4pOw0KICAgICAgICB2YXIgdG9rZW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW4oKTsNCiAgICAgICAgaWYgKHRva2VuICYmIC9eY29tbWVudHxzdHJpbmcvLnRlc3QodG9rZW4udHlwZSkpIHsNCiAgICAgICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cCh0b2tlbi50eXBlLnJlcGxhY2UoL1wuLiovLCAiXFwuIikpOw0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIHRva2VuID0gaXRlcmF0b3Iuc3RlcEJhY2t3YXJkKCk7DQogICAgICAgICAgICB9IHdoaWxlKHRva2VuICYmIHJlLnRlc3QodG9rZW4udHlwZSkpOw0KDQogICAgICAgICAgICBpdGVyYXRvci5zdGVwRm9yd2FyZCgpOw0KICAgICAgICAgICAgcmFuZ2Uuc3RhcnQucm93ID0gaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCk7DQogICAgICAgICAgICByYW5nZS5zdGFydC5jb2x1bW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSArIDI7DQoNCiAgICAgICAgICAgIGl0ZXJhdG9yID0gbmV3IFRva2VuSXRlcmF0b3IodGhpcywgcm93LCBjb2x1bW4pOw0KDQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgdG9rZW4gPSBpdGVyYXRvci5zdGVwRm9yd2FyZCgpOw0KICAgICAgICAgICAgfSB3aGlsZSh0b2tlbiAmJiByZS50ZXN0KHRva2VuLnR5cGUpKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdG9rZW4gPSBpdGVyYXRvci5zdGVwQmFja3dhcmQoKTsNCg0KICAgICAgICAgICAgcmFuZ2UuZW5kLnJvdyA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoOw0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZm9sZEFsbCA9IGZ1bmN0aW9uKHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIGZvbGRXaWRnZXRzID0gdGhpcy5mb2xkV2lkZ2V0czsNCiAgICAgICAgZW5kUm93ID0gZW5kUm93IHx8IHRoaXMuZ2V0TGVuZ3RoKCk7DQogICAgICAgIGZvciAodmFyIHJvdyA9IHN0YXJ0Um93IHx8IDA7IHJvdyA8IGVuZFJvdzsgcm93KyspIHsNCiAgICAgICAgICAgIGlmIChmb2xkV2lkZ2V0c1tyb3ddID09IG51bGwpDQogICAgICAgICAgICAgICAgZm9sZFdpZGdldHNbcm93XSA9IHRoaXMuZ2V0Rm9sZFdpZGdldChyb3cpOw0KICAgICAgICAgICAgaWYgKGZvbGRXaWRnZXRzW3Jvd10gIT0gInN0YXJ0IikNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2Uocm93KTsNCiAgICAgICAgICAgIC8vIHNvbWV0aW1lcyByYW5nZSBjYW4gYmUgaW5jb21wYXRpYmxlIHdpdGggZXhpc3RpbmcgZm9sZA0KICAgICAgICAgICAgLy8gd291bGRuJ3QgaXQgYmUgYmV0dGVyIGZvciBhZGRGb2xkIHRvIHJldHVybiBudWxsIGlzdGVhZCBvZiB0aHJvd2luZz8NCiAgICAgICAgICAgIGlmIChyYW5nZSAmJiByYW5nZS5lbmQucm93IDwgZW5kUm93KSB0cnkgew0KICAgICAgICAgICAgICAgIHRoaXMuYWRkRm9sZCgiLi4uIiwgcmFuZ2UpOw0KICAgICAgICAgICAgfSBjYXRjaChlKSB7fQ0KICAgICAgICB9DQogICAgfTsNCiAgICANCiAgICB0aGlzLiRmb2xkU3R5bGVzID0gew0KICAgICAgICAibWFudWFsIjogMSwNCiAgICAgICAgIm1hcmtiZWdpbiI6IDEsDQogICAgICAgICJtYXJrYmVnaW5lbmQiOiAxDQogICAgfTsNCiAgICB0aGlzLiRmb2xkU3R5bGUgPSAibWFya2JlZ2luIjsNCiAgICB0aGlzLnNldEZvbGRTdHlsZSA9IGZ1bmN0aW9uKHN0eWxlKSB7DQogICAgICAgIGlmICghdGhpcy4kZm9sZFN0eWxlc1tzdHlsZV0pDQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9sZCBzdHlsZTogIiArIHN0eWxlICsgIlsiICsgT2JqZWN0LmtleXModGhpcy4kZm9sZFN0eWxlcykuam9pbigiLCAiKSArICJdIik7DQogICAgICAgIA0KICAgICAgICBpZiAodGhpcy4kZm9sZFN0eWxlID09IHN0eWxlKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHRoaXMuJGZvbGRTdHlsZSA9IHN0eWxlOw0KICAgICAgICANCiAgICAgICAgaWYgKHN0eWxlID09ICJtYW51YWwiKQ0KICAgICAgICAgICAgdGhpcy51bmZvbGQoKTsNCiAgICAgICAgDQogICAgICAgIC8vIHJlc2V0IGZvbGRpbmcNCiAgICAgICAgdmFyIG1vZGUgPSB0aGlzLiRmb2xkTW9kZTsNCiAgICAgICAgdGhpcy4kc2V0Rm9sZGluZyhudWxsKTsNCiAgICAgICAgdGhpcy4kc2V0Rm9sZGluZyhtb2RlKTsNCiAgICB9Ow0KDQogICAgLy8gc3RydWN0dXJlZCBmb2xkaW5nDQogICAgdGhpcy4kc2V0Rm9sZGluZyA9IGZ1bmN0aW9uKGZvbGRNb2RlKSB7DQogICAgICAgIGlmICh0aGlzLiRmb2xkTW9kZSA9PSBmb2xkTW9kZSkNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICB0aGlzLiRmb2xkTW9kZSA9IGZvbGRNb2RlOw0KICAgICAgICANCiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcignY2hhbmdlJywgdGhpcy4kdXBkYXRlRm9sZFdpZGdldHMpOw0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VBbm5vdGF0aW9uIik7DQogICAgICAgIA0KICAgICAgICBpZiAoIWZvbGRNb2RlIHx8IHRoaXMuJGZvbGRTdHlsZSA9PSAibWFudWFsIikgew0KICAgICAgICAgICAgdGhpcy5mb2xkV2lkZ2V0cyA9IG51bGw7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHRoaXMuZm9sZFdpZGdldHMgPSBbXTsNCiAgICAgICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZm9sZE1vZGUuZ2V0Rm9sZFdpZGdldC5iaW5kKGZvbGRNb2RlLCB0aGlzLCB0aGlzLiRmb2xkU3R5bGUpOw0KICAgICAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZvbGRNb2RlLmdldEZvbGRXaWRnZXRSYW5nZS5iaW5kKGZvbGRNb2RlLCB0aGlzLCB0aGlzLiRmb2xkU3R5bGUpOw0KICAgICAgICANCiAgICAgICAgdGhpcy4kdXBkYXRlRm9sZFdpZGdldHMgPSB0aGlzLnVwZGF0ZUZvbGRXaWRnZXRzLmJpbmQodGhpcyk7DQogICAgICAgIHRoaXMub24oJ2NoYW5nZScsIHRoaXMuJHVwZGF0ZUZvbGRXaWRnZXRzKTsNCiAgICAgICAgDQogICAgfTsNCg0KICAgIHRoaXMub25Gb2xkV2lkZ2V0Q2xpY2sgPSBmdW5jdGlvbihyb3csIGUpIHsNCiAgICAgICAgdmFyIHR5cGUgPSB0aGlzLmdldEZvbGRXaWRnZXQocm93KTsNCiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG9ubHlTdWJmb2xkcyA9IGUuc2hpZnRLZXk7DQogICAgICAgIHZhciBhZGRTdWJmb2xkcyA9IG9ubHlTdWJmb2xkcyB8fCBlLmN0cmxLZXkgfHwgZS5hbHRLZXkgfHwgZS5tZXRhS2V5Ow0KICAgICAgICB2YXIgZm9sZDsNCg0KICAgICAgICBpZiAodHlwZSA9PSAiZW5kIikNCiAgICAgICAgICAgIGZvbGQgPSB0aGlzLmdldEZvbGRBdChyb3csIDAsIC0xKTsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgZm9sZCA9IHRoaXMuZ2V0Rm9sZEF0KHJvdywgbGluZS5sZW5ndGgsIDEpOw0KDQogICAgICAgIGlmIChmb2xkKSB7DQogICAgICAgICAgICBpZiAoYWRkU3ViZm9sZHMpDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGb2xkKGZvbGQpOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kRm9sZChmb2xkKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciByYW5nZSA9IHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlKHJvdyk7DQogICAgICAgIGlmIChyYW5nZSkgew0KICAgICAgICAgICAgLy8gc29tZXRpbWVzIHNpbmdsZWxpbmUgZm9sZHMgY2FuIGJlIG1pc3NlZCBieSB0aGUgY29kZSBhYm92ZQ0KICAgICAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpKSB7DQogICAgICAgICAgICAgICAgZm9sZCA9IHRoaXMuZ2V0Rm9sZEF0KHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLCAxKTsNCiAgICAgICAgICAgICAgICBpZiAoZm9sZCAmJiByYW5nZS5pc0VlcXVhbChmb2xkLnJhbmdlKSkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZvbGQoZm9sZCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICghb25seVN1YmZvbGRzKQ0KICAgICAgICAgICAgICAgIHRoaXMuYWRkRm9sZCgiLi4uIiwgcmFuZ2UpOw0KDQogICAgICAgICAgICBpZiAoYWRkU3ViZm9sZHMpDQogICAgICAgICAgICAgICAgdGhpcy5mb2xkQWxsKHJhbmdlLnN0YXJ0LnJvdyArIDEsIHJhbmdlLmVuZC5yb3cpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaWYgKGFkZFN1YmZvbGRzKQ0KICAgICAgICAgICAgICAgIHRoaXMuZm9sZEFsbChyb3cgKyAxLCB0aGlzLmdldExlbmd0aCgpKTsNCiAgICAgICAgICAgIGUudGFyZ2V0LmNsYXNzTmFtZSArPSAiIGludmFsaWQiDQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMudXBkYXRlRm9sZFdpZGdldHMgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIHZhciBkZWx0YSA9IGUuZGF0YTsNCiAgICAgICAgdmFyIHJhbmdlID0gZGVsdGEucmFuZ2U7DQogICAgICAgIHZhciBmaXJzdFJvdyA9IHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgdmFyIGxlbiA9IHJhbmdlLmVuZC5yb3cgLSBmaXJzdFJvdzsNCg0KICAgICAgICBpZiAobGVuID09PSAwKSB7DQogICAgICAgICAgICB0aGlzLmZvbGRXaWRnZXRzW2ZpcnN0Um93XSA9IG51bGw7DQogICAgICAgIH0gZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVUZXh0IiB8fCBkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikgew0KICAgICAgICAgICAgdGhpcy5mb2xkV2lkZ2V0cy5zcGxpY2UoZmlyc3RSb3csIGxlbiArIDEsIG51bGwpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheShsZW4gKyAxKTsNCiAgICAgICAgICAgIGFyZ3MudW5zaGlmdChmaXJzdFJvdywgMSk7DQogICAgICAgICAgICB0aGlzLmZvbGRXaWRnZXRzLnNwbGljZS5hcHBseSh0aGlzLmZvbGRXaWRnZXRzLCBhcmdzKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCn0NCg0KZXhwb3J0cy5Gb2xkaW5nID0gRm9sZGluZzsNCg0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBKdWxpYW4gVmllcmVjayA8anVsaWFuIERPVCB2aWVyZWNrIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvZWRpdF9zZXNzaW9uL2ZvbGRfbGluZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQovKioNCiAqIElmIGFuIGFycmF5IGlzIHBhc3NlZCBpbiwgdGhlIGZvbGRzIGFyZSBleHBlY3RlZCB0byBiZSBzb3J0ZWQgYWxyZWFkeS4NCiAqLw0KZnVuY3Rpb24gRm9sZExpbmUoZm9sZERhdGEsIGZvbGRzKSB7DQogICAgdGhpcy5mb2xkRGF0YSA9IGZvbGREYXRhOw0KICAgIGlmIChBcnJheS5pc0FycmF5KGZvbGRzKSkgew0KICAgICAgICB0aGlzLmZvbGRzID0gZm9sZHM7DQogICAgfSBlbHNlIHsNCiAgICAgICAgZm9sZHMgPSB0aGlzLmZvbGRzID0gWyBmb2xkcyBdOw0KICAgIH0NCg0KICAgIHZhciBsYXN0ID0gZm9sZHNbZm9sZHMubGVuZ3RoIC0gMV0NCiAgICB0aGlzLnJhbmdlID0gbmV3IFJhbmdlKGZvbGRzWzBdLnN0YXJ0LnJvdywgZm9sZHNbMF0uc3RhcnQuY29sdW1uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdC5lbmQucm93LCBsYXN0LmVuZC5jb2x1bW4pOw0KICAgIHRoaXMuc3RhcnQgPSB0aGlzLnJhbmdlLnN0YXJ0Ow0KICAgIHRoaXMuZW5kICAgPSB0aGlzLnJhbmdlLmVuZDsNCg0KICAgIHRoaXMuZm9sZHMuZm9yRWFjaChmdW5jdGlvbihmb2xkKSB7DQogICAgICAgIGZvbGQuc2V0Rm9sZExpbmUodGhpcyk7DQogICAgfSwgdGhpcyk7DQp9DQoNCihmdW5jdGlvbigpIHsNCiAgICAvKioNCiAgICAgKiBOb3RlOiBUaGlzIGRvZXNuJ3QgdXBkYXRlIHdyYXBEYXRhIQ0KICAgICAqLw0KICAgIHRoaXMuc2hpZnRSb3cgPSBmdW5jdGlvbihzaGlmdCkgew0KICAgICAgICB0aGlzLnN0YXJ0LnJvdyArPSBzaGlmdDsNCiAgICAgICAgdGhpcy5lbmQucm93ICs9IHNoaWZ0Ow0KICAgICAgICB0aGlzLmZvbGRzLmZvckVhY2goZnVuY3Rpb24oZm9sZCkgew0KICAgICAgICAgICAgZm9sZC5zdGFydC5yb3cgKz0gc2hpZnQ7DQogICAgICAgICAgICBmb2xkLmVuZC5yb3cgKz0gc2hpZnQ7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIHRoaXMuYWRkRm9sZCA9IGZ1bmN0aW9uKGZvbGQpIHsNCiAgICAgICAgaWYgKGZvbGQuc2FtZVJvdykgew0KICAgICAgICAgICAgaWYgKGZvbGQuc3RhcnQucm93IDwgdGhpcy5zdGFydFJvdyB8fCBmb2xkLmVuZFJvdyA+IHRoaXMuZW5kUm93KSB7DQogICAgICAgICAgICAgICAgdGhyb3cgIkNhbid0IGFkZCBhIGZvbGQgdG8gdGhpcyBGb2xkTGluZSBhcyBpdCBoYXMgbm8gY29ubmVjdGlvbiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmZvbGRzLnB1c2goZm9sZCk7DQogICAgICAgICAgICB0aGlzLmZvbGRzLnNvcnQoZnVuY3Rpb24oYSwgYikgew0KICAgICAgICAgICAgICAgIHJldHVybiAtYS5yYW5nZS5jb21wYXJlRW5kKGIuc3RhcnQucm93LCBiLnN0YXJ0LmNvbHVtbik7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGlmICh0aGlzLnJhbmdlLmNvbXBhcmVFbmQoZm9sZC5zdGFydC5yb3csIGZvbGQuc3RhcnQuY29sdW1uKSA+IDApIHsNCiAgICAgICAgICAgICAgICB0aGlzLmVuZC5yb3cgPSBmb2xkLmVuZC5yb3c7DQogICAgICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uID0gIGZvbGQuZW5kLmNvbHVtbjsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5yYW5nZS5jb21wYXJlU3RhcnQoZm9sZC5lbmQucm93LCBmb2xkLmVuZC5jb2x1bW4pIDwgMCkgew0KICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gZm9sZC5zdGFydC5yb3c7DQogICAgICAgICAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gPSBmb2xkLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChmb2xkLnN0YXJ0LnJvdyA9PSB0aGlzLmVuZC5yb3cpIHsNCiAgICAgICAgICAgIHRoaXMuZm9sZHMucHVzaChmb2xkKTsNCiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IGZvbGQuZW5kLnJvdzsNCiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9IGZvbGQuZW5kLmNvbHVtbjsNCiAgICAgICAgfSBlbHNlIGlmIChmb2xkLmVuZC5yb3cgPT0gdGhpcy5zdGFydC5yb3cpIHsNCiAgICAgICAgICAgIHRoaXMuZm9sZHMudW5zaGlmdChmb2xkKTsNCiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gZm9sZC5zdGFydC5yb3c7DQogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IGZvbGQuc3RhcnQuY29sdW1uOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhyb3cgIlRyeWluZyB0byBhZGQgZm9sZCB0byBGb2xkUm93IHRoYXQgZG9lc24ndCBoYXZlIGEgbWF0Y2hpbmcgcm93IjsNCiAgICAgICAgfQ0KICAgICAgICBmb2xkLmZvbGRMaW5lID0gdGhpczsNCiAgICB9DQoNCiAgICB0aGlzLmNvbnRhaW5zUm93ID0gZnVuY3Rpb24ocm93KSB7DQogICAgICAgIHJldHVybiByb3cgPj0gdGhpcy5zdGFydC5yb3cgJiYgcm93IDw9IHRoaXMuZW5kLnJvdzsNCiAgICB9DQoNCiAgICB0aGlzLndhbGsgPSBmdW5jdGlvbihjYWxsYmFjaywgZW5kUm93LCBlbmRDb2x1bW4pIHsNCiAgICAgICAgdmFyIGxhc3RFbmQgPSAwLA0KICAgICAgICAgICAgZm9sZHMgPSB0aGlzLmZvbGRzLA0KICAgICAgICAgICAgZm9sZCwNCiAgICAgICAgICAgIGNvbXAsIHN0b3AsIGlzTmV3Um93ID0gdHJ1ZTsNCg0KICAgICAgICBpZiAoZW5kUm93ID09IG51bGwpIHsNCiAgICAgICAgICAgIGVuZFJvdyA9IHRoaXMuZW5kLnJvdzsNCiAgICAgICAgICAgIGVuZENvbHVtbiA9IHRoaXMuZW5kLmNvbHVtbjsNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9sZHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGZvbGQgPSBmb2xkc1tpXTsNCg0KICAgICAgICAgICAgY29tcCA9IGZvbGQucmFuZ2UuY29tcGFyZVN0YXJ0KGVuZFJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgICAgIC8vIFRoaXMgZm9sZCBpcyBhZnRlciB0aGUgZW5kUm93L0NvbHVtbi4NCiAgICAgICAgICAgIGlmIChjb21wID09IC0xKSB7DQogICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZW5kUm93LCBlbmRDb2x1bW4sIGxhc3RFbmQsIGlzTmV3Um93KTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHN0b3AgPSBjYWxsYmFjayhudWxsLCBmb2xkLnN0YXJ0LnJvdywgZm9sZC5zdGFydC5jb2x1bW4sIGxhc3RFbmQsIGlzTmV3Um93KTsNCiAgICAgICAgICAgIHN0b3AgPSAhc3RvcCAmJiBjYWxsYmFjayhmb2xkLnBsYWNlaG9sZGVyLCBmb2xkLnN0YXJ0LnJvdywgZm9sZC5zdGFydC5jb2x1bW4sIGxhc3RFbmQpOw0KDQogICAgICAgICAgICAvLyBJZiB0aGUgdXNlciByZXF1ZXN0ZWQgdG8gc3RvcCB0aGUgd2FsayBvciBlbmRSb3cvZW5kQ29sdW1uIGlzDQogICAgICAgICAgICAvLyBpbnNpZGUgb2YgdGhpcyBmb2xkIChjb21wID09IDApLCB0aGVuIGVuZCBoZXJlLg0KICAgICAgICAgICAgaWYgKHN0b3AgfHwgY29tcCA9PSAwKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBOb3RlIHRoZSBuZXcgbGFzdEVuZCBtaWdodCBub3QgYmUgb24gdGhlIHNhbWUgbGluZS4gSG93ZXZlciwNCiAgICAgICAgICAgIC8vIGl0J3MgdGhlIGNhbGxiYWNrJ3Mgam9iIHRvIHJlY29nbml6ZSB0aGlzLg0KICAgICAgICAgICAgaXNOZXdSb3cgPSAhZm9sZC5zYW1lUm93Ow0KICAgICAgICAgICAgbGFzdEVuZCA9IGZvbGQuZW5kLmNvbHVtbjsNCiAgICAgICAgfQ0KICAgICAgICBjYWxsYmFjayhudWxsLCBlbmRSb3csIGVuZENvbHVtbiwgbGFzdEVuZCwgaXNOZXdSb3cpOw0KICAgIH0NCg0KICAgIHRoaXMuZ2V0TmV4dEZvbGRUbyA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBmb2xkLCBjbXA7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mb2xkcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgZm9sZCA9IHRoaXMuZm9sZHNbaV07DQogICAgICAgICAgICBjbXAgPSBmb2xkLnJhbmdlLmNvbXBhcmVFbmQocm93LCBjb2x1bW4pOw0KICAgICAgICAgICAgaWYgKGNtcCA9PSAtMSkgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIGZvbGQ6IGZvbGQsDQogICAgICAgICAgICAgICAgICAgIGtpbmQ6ICJhZnRlciINCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMCkgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIGZvbGQ6IGZvbGQsDQogICAgICAgICAgICAgICAgICAgIGtpbmQ6ICJpbnNpZGUiDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH0NCg0KICAgIHRoaXMuYWRkUmVtb3ZlQ2hhcnMgPSBmdW5jdGlvbihyb3csIGNvbHVtbiwgbGVuKSB7DQogICAgICAgIHZhciByZXQgPSB0aGlzLmdldE5leHRGb2xkVG8ocm93LCBjb2x1bW4pLA0KICAgICAgICAgICAgZm9sZCwgZm9sZHM7DQogICAgICAgIGlmIChyZXQpIHsNCiAgICAgICAgICAgIGZvbGQgPSByZXQuZm9sZDsNCiAgICAgICAgICAgIGlmIChyZXQua2luZCA9PSAiaW5zaWRlIg0KICAgICAgICAgICAgICAgICYmIGZvbGQuc3RhcnQuY29sdW1uICE9IGNvbHVtbg0KICAgICAgICAgICAgICAgICYmIGZvbGQuc3RhcnQucm93ICE9IHJvdykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aHJvdyAiTW92aW5nIGNoYXJhY3RlcnMgaW5zaWRlIG9mIGEgZm9sZCBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZCI7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGZvbGQuc3RhcnQucm93ID09IHJvdykgew0KICAgICAgICAgICAgICAgIGZvbGRzID0gdGhpcy5mb2xkczsNCiAgICAgICAgICAgICAgICB2YXIgaSA9IGZvbGRzLmluZGV4T2YoZm9sZCk7DQogICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiArPSBsZW47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAoaTsgaSA8IGZvbGRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGZvbGQgPSBmb2xkc1tpXTsNCiAgICAgICAgICAgICAgICAgICAgZm9sZC5zdGFydC5jb2x1bW4gKz0gbGVuOw0KICAgICAgICAgICAgICAgICAgICBpZiAoIWZvbGQuc2FtZVJvdykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGZvbGQuZW5kLmNvbHVtbiArPSBsZW47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiArPSBsZW47DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLnNwbGl0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIGZvbGQgPSB0aGlzLmdldE5leHRGb2xkVG8ocm93LCBjb2x1bW4pLmZvbGQsDQogICAgICAgICAgICBmb2xkcyA9IHRoaXMuZm9sZHM7DQogICAgICAgIHZhciBmb2xkRGF0YSA9IHRoaXMuZm9sZERhdGE7DQoNCiAgICAgICAgaWYgKCFmb2xkKSB7DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgaSA9IGZvbGRzLmluZGV4T2YoZm9sZCk7DQogICAgICAgIHZhciBmb2xkQmVmb3JlID0gZm9sZHNbaSAtIDFdOw0KICAgICAgICB0aGlzLmVuZC5yb3cgPSBmb2xkQmVmb3JlLmVuZC5yb3c7DQogICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9IGZvbGRCZWZvcmUuZW5kLmNvbHVtbjsNCg0KICAgICAgICAvLyBSZW1vdmUgdGhlIGZvbGRzIGFmdGVyIHJvdy9jb2x1bW4gYW5kIGNyZWF0ZSBhIG5ldyBGb2xkTGluZQ0KICAgICAgICAvLyBjb250YWluaW5nIHRoZXNlIHJlbW92ZWQgZm9sZHMuDQogICAgICAgIGZvbGRzID0gZm9sZHMuc3BsaWNlKGksIGZvbGRzLmxlbmd0aCAtIGkpOw0KDQogICAgICAgIHZhciBuZXdGb2xkTGluZSA9IG5ldyBGb2xkTGluZShmb2xkRGF0YSwgZm9sZHMpOw0KICAgICAgICBmb2xkRGF0YS5zcGxpY2UoZm9sZERhdGEuaW5kZXhPZih0aGlzKSArIDEsIDAsIG5ld0ZvbGRMaW5lKTsNCiAgICAgICAgcmV0dXJuIG5ld0ZvbGRMaW5lOw0KICAgIH0NCg0KICAgIHRoaXMubWVyZ2UgPSBmdW5jdGlvbihmb2xkTGluZU5leHQpIHsNCiAgICAgICAgdmFyIGZvbGRzID0gZm9sZExpbmVOZXh0LmZvbGRzOw0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvbGRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB0aGlzLmFkZEZvbGQoZm9sZHNbaV0pOw0KICAgICAgICB9DQogICAgICAgIC8vIFJlbW92ZSB0aGUgZm9sZExpbmVOZXh0IC0gbm8gbG9uZ2VyIG5lZWRlZCwgYXMNCiAgICAgICAgLy8gaXQncyBtZXJnZWQgbm93IHdpdGggZm9sZExpbmVOZXh0Lg0KICAgICAgICB2YXIgZm9sZERhdGEgPSB0aGlzLmZvbGREYXRhOw0KICAgICAgICBmb2xkRGF0YS5zcGxpY2UoZm9sZERhdGEuaW5kZXhPZihmb2xkTGluZU5leHQpLCAxKTsNCiAgICB9DQoNCiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciByZXQgPSBbdGhpcy5yYW5nZS50b1N0cmluZygpICsgIjogWyIgXTsNCg0KICAgICAgICB0aGlzLmZvbGRzLmZvckVhY2goZnVuY3Rpb24oZm9sZCkgew0KICAgICAgICAgICAgcmV0LnB1c2goIiAgIiArIGZvbGQudG9TdHJpbmcoKSk7DQogICAgICAgIH0pOw0KICAgICAgICByZXQucHVzaCgiXSIpDQogICAgICAgIHJldHVybiByZXQuam9pbigiXG4iKTsNCiAgICB9DQoNCiAgICB0aGlzLmlkeFRvUG9zaXRpb24gPSBmdW5jdGlvbihpZHgpIHsNCiAgICAgICAgdmFyIGxhc3RGb2xkRW5kQ29sdW1uID0gMDsNCiAgICAgICAgdmFyIGZvbGQ7DQoNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZvbGRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgZm9sZCA9IHRoaXMuZm9sZHNbaV07DQoNCiAgICAgICAgICAgIGlkeCAtPSBmb2xkLnN0YXJ0LmNvbHVtbiAtIGxhc3RGb2xkRW5kQ29sdW1uOw0KICAgICAgICAgICAgaWYgKGlkeCA8IDApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICByb3c6IGZvbGQuc3RhcnQucm93LA0KICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGZvbGQuc3RhcnQuY29sdW1uICsgaWR4DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWR4IC09IGZvbGQucGxhY2Vob2xkZXIubGVuZ3RoOw0KICAgICAgICAgICAgaWYgKGlkeCA8IDApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZm9sZC5zdGFydDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbGFzdEZvbGRFbmRDb2x1bW4gPSBmb2xkLmVuZC5jb2x1bW47DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgcm93OiB0aGlzLmVuZC5yb3csDQogICAgICAgICAgICBjb2x1bW46IHRoaXMuZW5kLmNvbHVtbiArIGlkeA0KICAgICAgICB9Ow0KICAgIH0NCn0pLmNhbGwoRm9sZExpbmUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Gb2xkTGluZSA9IEZvbGRMaW5lOw0KfSk7LyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgSnVsaWFuIFZpZXJlY2sgPGp1bGlhbiBET1QgdmllcmVjayBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2VkaXRfc2Vzc2lvbi9mb2xkJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KLyoqDQogKiBTaW1wbGUgZm9sZC1kYXRhIHN0cnVjdC4NCiAqKi8NCnZhciBGb2xkID0gZXhwb3J0cy5Gb2xkID0gZnVuY3Rpb24ocmFuZ2UsIHBsYWNlaG9sZGVyKSB7DQogICAgdGhpcy5mb2xkTGluZSA9IG51bGw7DQogICAgdGhpcy5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyOw0KICAgIHRoaXMucmFuZ2UgPSByYW5nZTsNCiAgICB0aGlzLnN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7DQogICAgdGhpcy5lbmQgPSByYW5nZS5lbmQ7DQoNCiAgICB0aGlzLnNhbWVSb3cgPSByYW5nZS5zdGFydC5yb3cgPT0gcmFuZ2UuZW5kLnJvdzsNCiAgICB0aGlzLnN1YkZvbGRzID0gW107DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiAnIicgKyB0aGlzLnBsYWNlaG9sZGVyICsgJyIgJyArIHRoaXMucmFuZ2UudG9TdHJpbmcoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRGb2xkTGluZSA9IGZ1bmN0aW9uKGZvbGRMaW5lKSB7DQogICAgICAgIHRoaXMuZm9sZExpbmUgPSBmb2xkTGluZTsNCiAgICAgICAgdGhpcy5zdWJGb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKGZvbGQpIHsNCiAgICAgICAgICAgIGZvbGQuc2V0Rm9sZExpbmUoZm9sZExpbmUpOw0KICAgICAgICB9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5jbG9uZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLnJhbmdlLmNsb25lKCk7DQogICAgICAgIHZhciBmb2xkID0gbmV3IEZvbGQocmFuZ2UsIHRoaXMucGxhY2Vob2xkZXIpOw0KICAgICAgICB0aGlzLnN1YkZvbGRzLmZvckVhY2goZnVuY3Rpb24oc3ViRm9sZCkgew0KICAgICAgICAgICAgZm9sZC5zdWJGb2xkcy5wdXNoKHN1YkZvbGQuY2xvbmUoKSk7DQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4gZm9sZDsNCiAgICB9Ow0KDQogICAgdGhpcy5hZGRTdWJGb2xkID0gZnVuY3Rpb24oZm9sZCkgew0KICAgICAgICBpZiAodGhpcy5yYW5nZS5pc0VlcXVhbChmb2xkKSkNCiAgICAgICAgICAgIHJldHVybiB0aGlzOw0KDQogICAgICAgIGlmICghdGhpcy5yYW5nZS5jb250YWluc1JhbmdlKGZvbGQpKQ0KICAgICAgICAgICAgdGhyb3cgIkEgZm9sZCBjYW4ndCBpbnRlcnNlY3QgYWxyZWFkeSBleGlzdGluZyBmb2xkIiArIGZvbGQucmFuZ2UgKyB0aGlzLnJhbmdlOw0KDQogICAgICAgIHZhciByb3cgPSBmb2xkLnJhbmdlLnN0YXJ0LnJvdywgY29sdW1uID0gZm9sZC5yYW5nZS5zdGFydC5jb2x1bW47DQogICAgICAgIGZvciAodmFyIGkgPSAwLCBjbXAgPSAtMTsgaSA8IHRoaXMuc3ViRm9sZHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGNtcCA9IHRoaXMuc3ViRm9sZHNbaV0ucmFuZ2UuY29tcGFyZShyb3csIGNvbHVtbik7DQogICAgICAgICAgICBpZiAoY21wICE9IDEpDQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgdmFyIGFmdGVyU3RhcnQgPSB0aGlzLnN1YkZvbGRzW2ldOw0KDQogICAgICAgIGlmIChjbXAgPT0gMCkNCiAgICAgICAgICAgIHJldHVybiBhZnRlclN0YXJ0LmFkZFN1YkZvbGQoZm9sZCkNCg0KICAgICAgICAvLyBjbXAgPT0gLTENCiAgICAgICAgdmFyIHJvdyA9IGZvbGQucmFuZ2UuZW5kLnJvdywgY29sdW1uID0gZm9sZC5yYW5nZS5lbmQuY29sdW1uOw0KICAgICAgICBmb3IgKHZhciBqID0gaSwgY21wID0gLTE7IGogPCB0aGlzLnN1YkZvbGRzLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICBjbXAgPSB0aGlzLnN1YkZvbGRzW2pdLnJhbmdlLmNvbXBhcmUocm93LCBjb2x1bW4pOw0KICAgICAgICAgICAgaWYgKGNtcCAhPSAxKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIHZhciBhZnRlckVuZCA9IHRoaXMuc3ViRm9sZHNbal07DQoNCiAgICAgICAgaWYgKGNtcCA9PSAwKQ0KICAgICAgICAgICAgdGhyb3cgIkEgZm9sZCBjYW4ndCBpbnRlcnNlY3QgYWxyZWFkeSBleGlzdGluZyBmb2xkIiArIGZvbGQucmFuZ2UgKyB0aGlzLnJhbmdlOw0KDQogICAgICAgIHZhciBjb25zdW1lZEZvbGRzID0gdGhpcy5zdWJGb2xkcy5zcGxpY2UoaSwgaiAtIGksIGZvbGQpDQogICAgICAgIGZvbGQuc2V0Rm9sZExpbmUodGhpcy5mb2xkTGluZSk7DQoNCiAgICAgICAgcmV0dXJuIGZvbGQ7DQogICAgfQ0KDQp9KS5jYWxsKEZvbGQucHJvdG90eXBlKTsNCg0KfSk7LyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS90b2tlbl9pdGVyYXRvcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBUb2tlbkl0ZXJhdG9yID0gZnVuY3Rpb24oc2Vzc2lvbiwgaW5pdGlhbFJvdywgaW5pdGlhbENvbHVtbikgew0KICAgIHRoaXMuJHNlc3Npb24gPSBzZXNzaW9uOw0KICAgIHRoaXMuJHJvdyA9IGluaXRpYWxSb3c7DQogICAgdGhpcy4kcm93VG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMoaW5pdGlhbFJvdywgaW5pdGlhbFJvdylbMF0udG9rZW5zOw0KDQogICAgdmFyIHRva2VuID0gc2Vzc2lvbi5nZXRUb2tlbkF0KGluaXRpYWxSb3csIGluaXRpYWxDb2x1bW4pOw0KICAgIHRoaXMuJHRva2VuSW5kZXggPSB0b2tlbiA/IHRva2VuLmluZGV4IDogLTE7DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQogICAgDQogICAgdGhpcy5zdGVwQmFja3dhcmQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kdG9rZW5JbmRleCAtPSAxOw0KICAgICAgICANCiAgICAgICAgd2hpbGUgKHRoaXMuJHRva2VuSW5kZXggPCAwKSB7DQogICAgICAgICAgICB0aGlzLiRyb3cgLT0gMTsNCiAgICAgICAgICAgIGlmICh0aGlzLiRyb3cgPCAwKSB7DQogICAgICAgICAgICAgICAgdGhpcy4kcm93ID0gMDsNCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIHRoaXMuJHJvd1Rva2VucyA9IHRoaXMuJHNlc3Npb24uZ2V0VG9rZW5zKHRoaXMuJHJvdywgdGhpcy4kcm93KVswXS50b2tlbnM7DQogICAgICAgICAgICB0aGlzLiR0b2tlbkluZGV4ID0gdGhpcy4kcm93VG9rZW5zLmxlbmd0aCAtIDE7DQogICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICByZXR1cm4gdGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdOw0KICAgIH07DQogICAgDQogICAgdGhpcy5zdGVwRm9yd2FyZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgcm93Q291bnQgPSB0aGlzLiRzZXNzaW9uLmdldExlbmd0aCgpOw0KICAgICAgICB0aGlzLiR0b2tlbkluZGV4ICs9IDE7DQogICAgICAgIA0KICAgICAgICB3aGlsZSAodGhpcy4kdG9rZW5JbmRleCA+PSB0aGlzLiRyb3dUb2tlbnMubGVuZ3RoKSB7DQogICAgICAgICAgICB0aGlzLiRyb3cgKz0gMTsNCiAgICAgICAgICAgIGlmICh0aGlzLiRyb3cgPj0gcm93Q291bnQpIHsNCiAgICAgICAgICAgICAgICB0aGlzLiRyb3cgPSByb3dDb3VudCAtIDE7DQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRoaXMuJHJvd1Rva2VucyA9IHRoaXMuJHNlc3Npb24uZ2V0VG9rZW5zKHRoaXMuJHJvdywgdGhpcy4kcm93KVswXS50b2tlbnM7DQogICAgICAgICAgICB0aGlzLiR0b2tlbkluZGV4ID0gMDsNCiAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgIHJldHVybiB0aGlzLiRyb3dUb2tlbnNbdGhpcy4kdG9rZW5JbmRleF07DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEN1cnJlbnRUb2tlbiA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHJvd1Rva2Vuc1t0aGlzLiR0b2tlbkluZGV4XTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Q3VycmVudFRva2VuUm93ID0gZnVuY3Rpb24gKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kcm93Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRDdXJyZW50VG9rZW5Db2x1bW4gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHJvd1Rva2VucyA9IHRoaXMuJHJvd1Rva2VuczsNCiAgICAgICAgdmFyIHRva2VuSW5kZXggPSB0aGlzLiR0b2tlbkluZGV4Ow0KICAgICAgICANCiAgICAgICAgLy8gSWYgYSBjb2x1bW4gd2FzIGNhY2hlZCBieSBFZGl0U2Vzc2lvbi5nZXRUb2tlbkF0LCB0aGVuIHVzZSBpdA0KICAgICAgICB2YXIgY29sdW1uID0gcm93VG9rZW5zW3Rva2VuSW5kZXhdLnN0YXJ0Ow0KICAgICAgICBpZiAoY29sdW1uICE9PSB1bmRlZmluZWQpDQogICAgICAgICAgICByZXR1cm4gY29sdW1uOw0KICAgICAgICAgICAgDQogICAgICAgIGNvbHVtbiA9IDA7DQogICAgICAgIHdoaWxlICh0b2tlbkluZGV4ID4gMCkgew0KICAgICAgICAgICAgdG9rZW5JbmRleCAtPSAxOw0KICAgICAgICAgICAgY29sdW1uICs9IHJvd1Rva2Vuc1t0b2tlbkluZGV4XS52YWx1ZS5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHJldHVybiBjb2x1bW47ICANCiAgICB9Ow0KICAgICAgICAgICAgDQp9KS5jYWxsKFRva2VuSXRlcmF0b3IucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Ub2tlbkl0ZXJhdG9yID0gVG9rZW5JdGVyYXRvcjsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9lZGl0X3Nlc3Npb24vYnJhY2tldF9tYXRjaCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3Rva2VuX2l0ZXJhdG9yJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgVG9rZW5JdGVyYXRvciA9IHJlcXVpcmUoIi4uL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcjsNCg0KZnVuY3Rpb24gQnJhY2tldE1hdGNoKCkgew0KDQogICAgdGhpcy5maW5kTWF0Y2hpbmdCcmFja2V0ID0gZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICAgICAgaWYgKHBvc2l0aW9uLmNvbHVtbiA9PSAwKSByZXR1cm4gbnVsbDsNCg0KICAgICAgICB2YXIgY2hhckJlZm9yZUN1cnNvciA9IHRoaXMuZ2V0TGluZShwb3NpdGlvbi5yb3cpLmNoYXJBdChwb3NpdGlvbi5jb2x1bW4tMSk7DQogICAgICAgIGlmIChjaGFyQmVmb3JlQ3Vyc29yID09ICIiKSByZXR1cm4gbnVsbDsNCg0KICAgICAgICB2YXIgbWF0Y2ggPSBjaGFyQmVmb3JlQ3Vyc29yLm1hdGNoKC8oW1woXFtce10pfChbXClcXVx9XSkvKTsNCiAgICAgICAgaWYgKCFtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAobWF0Y2hbMV0pIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLiRmaW5kQ2xvc2luZ0JyYWNrZXQobWF0Y2hbMV0sIHBvc2l0aW9uKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLiRmaW5kT3BlbmluZ0JyYWNrZXQobWF0Y2hbMl0sIHBvc2l0aW9uKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLiRicmFja2V0cyA9IHsNCiAgICAgICAgIikiOiAiKCIsDQogICAgICAgICIoIjogIikiLA0KICAgICAgICAiXSI6ICJbIiwNCiAgICAgICAgIlsiOiAiXSIsDQogICAgICAgICJ7IjogIn0iLA0KICAgICAgICAifSI6ICJ7Ig0KICAgIH07DQoNCiAgICB0aGlzLiRmaW5kT3BlbmluZ0JyYWNrZXQgPSBmdW5jdGlvbihicmFja2V0LCBwb3NpdGlvbikgew0KICAgICAgICB2YXIgb3BlbkJyYWNrZXQgPSB0aGlzLiRicmFja2V0c1ticmFja2V0XTsNCiAgICAgICAgdmFyIGRlcHRoID0gMTsNCg0KICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcih0aGlzLCBwb3NpdGlvbi5yb3csIHBvc2l0aW9uLmNvbHVtbik7DQogICAgICAgIHZhciB0b2tlbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbigpOw0KICAgICAgICBpZiAoIXRva2VuKSByZXR1cm4gbnVsbDsNCiAgICAgICAgDQogICAgICAgIC8vIHRva2VuLnR5cGUgY29udGFpbnMgYSBwZXJpb2QtZGVsaW1pdGVkIGxpc3Qgb2YgdG9rZW4gaWRlbnRpZmllcnMNCiAgICAgICAgLy8gKGUuZy46ICJjb25zdGFudC5udW1lcmljIiBvciAicGFyZW4ubHBhcmVuIikuICBDcmVhdGUgYSBwYXR0ZXJuIHRoYXQNCiAgICAgICAgLy8gbWF0Y2hlcyBhbnkgdG9rZW4gY29udGFpbmluZyB0aGUgc2FtZSBpZGVudGlmaWVycyBvciBhIHN1YnNldC4gIEluDQogICAgICAgIC8vIGFkZGl0aW9uLCBpZiB0b2tlbi50eXBlIGluY2x1ZGVzICJycGFyZW4iLCB0aGVuIGFsc28gbWF0Y2ggImxwYXJlbiIuDQogICAgICAgIC8vIFNvIGlmIHR5cGUudG9rZW4gaXMgInBhcmVuLnJwYXJlbiIsIHRoZW4gdHlwZVJlIHdpbGwgbWF0Y2ggImxwYXJlbi5wYXJlbiIuDQogICAgICAgIHZhciB0eXBlUmUgPSBuZXcgUmVnRXhwKCIoXFwuPyIgKw0KICAgICAgICAgICAgdG9rZW4udHlwZS5yZXBsYWNlKCIuIiwgInwiKS5yZXBsYWNlKCJycGFyZW4iLCAibHBhcmVufHJwYXJlbiIpICsgIikrIik7DQogICAgICAgIA0KICAgICAgICAvLyBTdGFydCBzZWFyY2hpbmcgaW4gdG9rZW4sIGp1c3QgYmVmb3JlIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24uY29sdW1uDQogICAgICAgIHZhciB2YWx1ZUluZGV4ID0gcG9zaXRpb24uY29sdW1uIC0gaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkgLSAyOw0KICAgICAgICB2YXIgdmFsdWUgPSB0b2tlbi52YWx1ZTsNCiAgICAgICAgDQogICAgICAgIHdoaWxlICh0cnVlKSB7DQogICAgICAgIA0KICAgICAgICAgICAgd2hpbGUgKHZhbHVlSW5kZXggPj0gMCkgew0KICAgICAgICAgICAgICAgIHZhciBjaHIgPSB2YWx1ZS5jaGFyQXQodmFsdWVJbmRleCk7DQogICAgICAgICAgICAgICAgaWYgKGNociA9PSBvcGVuQnJhY2tldCkgew0KICAgICAgICAgICAgICAgICAgICBkZXB0aCAtPSAxOw0KICAgICAgICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtyb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdmFsdWVJbmRleCArIGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaHIgPT0gYnJhY2tldCkgew0KICAgICAgICAgICAgICAgICAgICBkZXB0aCArPSAxOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YWx1ZUluZGV4IC09IDE7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIFNjYW4gYmFja3dhcmQgdGhyb3VnaCB0aGUgZG9jdW1lbnQsIGxvb2tpbmcgZm9yIHRoZSBuZXh0IHRva2VuDQogICAgICAgICAgICAvLyB3aG9zZSB0eXBlIG1hdGNoZXMgdHlwZVJlDQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgdG9rZW4gPSBpdGVyYXRvci5zdGVwQmFja3dhcmQoKTsNCiAgICAgICAgICAgIH0gd2hpbGUgKHRva2VuICYmICF0eXBlUmUudGVzdCh0b2tlbi50eXBlKSk7DQoNCiAgICAgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgdmFsdWUgPSB0b2tlbi52YWx1ZTsNCiAgICAgICAgICAgIHZhbHVlSW5kZXggPSB2YWx1ZS5sZW5ndGggLSAxOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy4kZmluZENsb3NpbmdCcmFja2V0ID0gZnVuY3Rpb24oYnJhY2tldCwgcG9zaXRpb24pIHsNCiAgICAgICAgdmFyIGNsb3NpbmdCcmFja2V0ID0gdGhpcy4kYnJhY2tldHNbYnJhY2tldF07DQogICAgICAgIHZhciBkZXB0aCA9IDE7DQoNCiAgICAgICAgdmFyIGl0ZXJhdG9yID0gbmV3IFRva2VuSXRlcmF0b3IodGhpcywgcG9zaXRpb24ucm93LCBwb3NpdGlvbi5jb2x1bW4pOw0KICAgICAgICB2YXIgdG9rZW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW4oKTsNCiAgICAgICAgaWYgKCF0b2tlbikgcmV0dXJuIG51bGw7DQoNCiAgICAgICAgLy8gdG9rZW4udHlwZSBjb250YWlucyBhIHBlcmlvZC1kZWxpbWl0ZWQgbGlzdCBvZiB0b2tlbiBpZGVudGlmaWVycw0KICAgICAgICAvLyAoZS5nLjogImNvbnN0YW50Lm51bWVyaWMiIG9yICJwYXJlbi5scGFyZW4iKS4gIENyZWF0ZSBhIHBhdHRlcm4gdGhhdA0KICAgICAgICAvLyBtYXRjaGVzIGFueSB0b2tlbiBjb250YWluaW5nIHRoZSBzYW1lIGlkZW50aWZpZXJzIG9yIGEgc3Vic2V0LiAgSW4NCiAgICAgICAgLy8gYWRkaXRpb24sIGlmIHRva2VuLnR5cGUgaW5jbHVkZXMgImxwYXJlbiIsIHRoZW4gYWxzbyBtYXRjaCAicnBhcmVuIi4NCiAgICAgICAgLy8gU28gaWYgdHlwZS50b2tlbiBpcyAibHBhcmVuLnBhcmVuIiwgdGhlbiB0eXBlUmUgd2lsbCBtYXRjaCAicGFyZW4ucnBhcmVuIi4NCiAgICAgICAgdmFyIHR5cGVSZSA9IG5ldyBSZWdFeHAoIihcXC4/IiArDQogICAgICAgICAgICB0b2tlbi50eXBlLnJlcGxhY2UoIi4iLCAifCIpLnJlcGxhY2UoImxwYXJlbiIsICJscGFyZW58cnBhcmVuIikgKyAiKSsiKTsNCg0KICAgICAgICAvLyBTdGFydCBzZWFyY2hpbmcgaW4gdG9rZW4sIGFmdGVyIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24uY29sdW1uDQogICAgICAgIHZhciB2YWx1ZUluZGV4ID0gcG9zaXRpb24uY29sdW1uIC0gaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCk7DQoNCiAgICAgICAgd2hpbGUgKHRydWUpIHsNCg0KICAgICAgICAgICAgdmFyIHZhbHVlID0gdG9rZW4udmFsdWU7DQogICAgICAgICAgICB2YXIgdmFsdWVMZW5ndGggPSB2YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICB3aGlsZSAodmFsdWVJbmRleCA8IHZhbHVlTGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgdmFyIGNociA9IHZhbHVlLmNoYXJBdCh2YWx1ZUluZGV4KTsNCiAgICAgICAgICAgICAgICBpZiAoY2hyID09IGNsb3NpbmdCcmFja2V0KSB7DQogICAgICAgICAgICAgICAgICAgIGRlcHRoIC09IDE7DQogICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3JvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB2YWx1ZUluZGV4ICsgaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNociA9PSBicmFja2V0KSB7DQogICAgICAgICAgICAgICAgICAgIGRlcHRoICs9IDE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhbHVlSW5kZXggKz0gMTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gU2NhbiBmb3J3YXJkIHRocm91Z2ggdGhlIGRvY3VtZW50LCBsb29raW5nIGZvciB0aGUgbmV4dCB0b2tlbg0KICAgICAgICAgICAgLy8gd2hvc2UgdHlwZSBtYXRjaGVzIHR5cGVSZQ0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIHRva2VuID0gaXRlcmF0b3Iuc3RlcEZvcndhcmQoKTsNCiAgICAgICAgICAgIH0gd2hpbGUgKHRva2VuICYmICF0eXBlUmUudGVzdCh0b2tlbi50eXBlKSk7DQoNCiAgICAgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICB2YWx1ZUluZGV4ID0gMDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCn0NCmV4cG9ydHMuQnJhY2tldE1hdGNoID0gQnJhY2tldE1hdGNoOw0KDQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9zZWFyY2gnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvbGFuZycsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBsYW5nID0gcmVxdWlyZSgiLi9saWIvbGFuZyIpOw0KdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgU2VhcmNoID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kb3B0aW9ucyA9IHsNCiAgICAgICAgbmVlZGxlOiAiIiwNCiAgICAgICAgYmFja3dhcmRzOiBmYWxzZSwNCiAgICAgICAgd3JhcDogZmFsc2UsDQogICAgICAgIGNhc2VTZW5zaXRpdmU6IGZhbHNlLA0KICAgICAgICB3aG9sZVdvcmQ6IGZhbHNlLA0KICAgICAgICBzY29wZTogU2VhcmNoLkFMTCwNCiAgICAgICAgcmVnRXhwOiBmYWxzZQ0KICAgIH07DQp9Ow0KDQpTZWFyY2guQUxMID0gMTsNClNlYXJjaC5TRUxFQ1RJT04gPSAyOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLnNldCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsNCiAgICAgICAgb29wLm1peGluKHRoaXMuJG9wdGlvbnMsIG9wdGlvbnMpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gbGFuZy5jb3B5T2JqZWN0KHRoaXMuJG9wdGlvbnMpOw0KICAgIH07DQoNCiAgICB0aGlzLmZpbmQgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIGlmICghdGhpcy4kb3B0aW9ucy5uZWVkbGUpDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCg0KICAgICAgICBpZiAodGhpcy4kb3B0aW9ucy5iYWNrd2FyZHMpIHsNCiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IHRoaXMuJGJhY2t3YXJkTWF0Y2hJdGVyYXRvcihzZXNzaW9uKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGl0ZXJhdG9yID0gdGhpcy4kZm9yd2FyZE1hdGNoSXRlcmF0b3Ioc2Vzc2lvbik7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgZmlyc3RSYW5nZSA9IG51bGw7DQogICAgICAgIGl0ZXJhdG9yLmZvckVhY2goZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICAgICAgICAgIGZpcnN0UmFuZ2UgPSByYW5nZTsNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9KTsNCg0KICAgICAgICByZXR1cm4gZmlyc3RSYW5nZTsNCiAgICB9Ow0KDQogICAgdGhpcy5maW5kQWxsID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7DQogICAgICAgIGlmICghb3B0aW9ucy5uZWVkbGUpDQogICAgICAgICAgICByZXR1cm4gW107DQoNCiAgICAgICAgaWYgKG9wdGlvbnMuYmFja3dhcmRzKSB7DQogICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSB0aGlzLiRiYWNrd2FyZE1hdGNoSXRlcmF0b3Ioc2Vzc2lvbik7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpdGVyYXRvciA9IHRoaXMuJGZvcndhcmRNYXRjaEl0ZXJhdG9yKHNlc3Npb24pOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGlnbm9yZUN1cnNvciA9ICFvcHRpb25zLnN0YXJ0ICYmIG9wdGlvbnMud3JhcCAmJiBvcHRpb25zLnNjb3BlID09IFNlYXJjaC5BTEw7DQogICAgICAgIGlmIChpZ25vcmVDdXJzb3IpDQogICAgICAgICAgICBvcHRpb25zLnN0YXJ0ID0ge3JvdzogMCwgY29sdW1uOiAwfTsNCg0KICAgICAgICB2YXIgcmFuZ2VzID0gW107DQogICAgICAgIGl0ZXJhdG9yLmZvckVhY2goZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICAgICAgICAgIHJhbmdlcy5wdXNoKHJhbmdlKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgaWYgKGlnbm9yZUN1cnNvcikNCiAgICAgICAgICAgIG9wdGlvbnMuc3RhcnQgPSBudWxsOw0KDQogICAgICAgIHJldHVybiByYW5nZXM7DQogICAgfTsNCg0KICAgIHRoaXMucmVwbGFjZSA9IGZ1bmN0aW9uKGlucHV0LCByZXBsYWNlbWVudCkgew0KICAgICAgICB2YXIgcmUgPSB0aGlzLiRhc3NlbWJsZVJlZ0V4cCgpOw0KICAgICAgICB2YXIgbWF0Y2ggPSByZS5leGVjKGlucHV0KTsNCiAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoWzBdLmxlbmd0aCA9PSBpbnB1dC5sZW5ndGgpIHsNCiAgICAgICAgICAgIGlmICh0aGlzLiRvcHRpb25zLnJlZ0V4cCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKHJlLCByZXBsYWNlbWVudCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiByZXBsYWNlbWVudDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuJGZvcndhcmRNYXRjaEl0ZXJhdG9yID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICB2YXIgcmUgPSB0aGlzLiRhc3NlbWJsZVJlZ0V4cCgpOw0KICAgICAgICB2YXIgc2VsZiA9IHRoaXM7DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIGZvckVhY2g6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQogICAgICAgICAgICAgICAgc2VsZi4kZm9yd2FyZExpbmVJdGVyYXRvcihzZXNzaW9uKS5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUsIHN0YXJ0SW5kZXgsIHJvdykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRJbmRleCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKHN0YXJ0SW5kZXgpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTsNCg0KICAgICAgICAgICAgICAgICAgICBsaW5lLnJlcGxhY2UocmUsIGZ1bmN0aW9uKHN0cikgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHI6IHN0ciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHN0YXJ0SW5kZXggKyBvZmZzZXQNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cjsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPG1hdGNoZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IG1hdGNoZXNbaV07DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZWxmLiRyYW5nZUZyb21NYXRjaChyb3csIG1hdGNoLm9mZnNldCwgbWF0Y2guc3RyLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2socmFuZ2UpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICB9Ow0KDQogICAgdGhpcy4kYmFja3dhcmRNYXRjaEl0ZXJhdG9yID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICB2YXIgcmUgPSB0aGlzLiRhc3NlbWJsZVJlZ0V4cCgpOw0KICAgICAgICB2YXIgc2VsZiA9IHRoaXM7DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIGZvckVhY2g6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQogICAgICAgICAgICAgICAgc2VsZi4kYmFja3dhcmRMaW5lSXRlcmF0b3Ioc2Vzc2lvbikuZm9yRWFjaChmdW5jdGlvbihsaW5lLCBzdGFydEluZGV4LCByb3cpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZyhzdGFydEluZGV4KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzID0gW107DQoNCiAgICAgICAgICAgICAgICAgICAgbGluZS5yZXBsYWNlKHJlLCBmdW5jdGlvbihzdHIsIG9mZnNldCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHI6IHN0ciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHN0YXJ0SW5kZXggKyBvZmZzZXQNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cjsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaT1tYXRjaGVzLmxlbmd0aC0xOyBpPj0gMDsgaS0tKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBtYXRjaGVzW2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2VsZi4kcmFuZ2VGcm9tTWF0Y2gocm93LCBtYXRjaC5vZmZzZXQsIG1hdGNoLnN0ci5sZW5ndGgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKHJhbmdlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgIH07DQoNCiAgICB0aGlzLiRyYW5nZUZyb21NYXRjaCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uLCBsZW5ndGgpIHsNCiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShyb3csIGNvbHVtbiwgcm93LCBjb2x1bW4rbGVuZ3RoKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kYXNzZW1ibGVSZWdFeHAgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuJG9wdGlvbnMucmVnRXhwKSB7DQogICAgICAgICAgICB2YXIgbmVlZGxlID0gdGhpcy4kb3B0aW9ucy5uZWVkbGU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBuZWVkbGUgPSBsYW5nLmVzY2FwZVJlZ0V4cCh0aGlzLiRvcHRpb25zLm5lZWRsZSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy4kb3B0aW9ucy53aG9sZVdvcmQpIHsNCiAgICAgICAgICAgIG5lZWRsZSA9ICJcXGIiICsgbmVlZGxlICsgIlxcYiI7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgbW9kaWZpZXIgPSAiZyI7DQogICAgICAgIGlmICghdGhpcy4kb3B0aW9ucy5jYXNlU2Vuc2l0aXZlKSB7DQogICAgICAgICAgICBtb2RpZmllciArPSAiaSI7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKG5lZWRsZSwgbW9kaWZpZXIpOw0KICAgICAgICByZXR1cm4gcmU7DQogICAgfTsNCg0KICAgIHRoaXMuJGZvcndhcmRMaW5lSXRlcmF0b3IgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHZhciBzZWFyY2hTZWxlY3Rpb24gPSB0aGlzLiRvcHRpb25zLnNjb3BlID09IFNlYXJjaC5TRUxFQ1RJT047DQoNCiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy4kb3B0aW9ucy5yYW5nZSB8fCBzZXNzaW9uLmdldFNlbGVjdGlvbigpLmdldFJhbmdlKCk7DQogICAgICAgIHZhciBzdGFydCA9IHRoaXMuJG9wdGlvbnMuc3RhcnQgfHwgcmFuZ2Vbc2VhcmNoU2VsZWN0aW9uID8gInN0YXJ0IiA6ICJlbmQiXTsNCg0KICAgICAgICB2YXIgZmlyc3RSb3cgPSBzZWFyY2hTZWxlY3Rpb24gPyByYW5nZS5zdGFydC5yb3cgOiAwOw0KICAgICAgICB2YXIgZmlyc3RDb2x1bW4gPSBzZWFyY2hTZWxlY3Rpb24gPyByYW5nZS5zdGFydC5jb2x1bW4gOiAwOw0KICAgICAgICB2YXIgbGFzdFJvdyA9IHNlYXJjaFNlbGVjdGlvbiA/IHJhbmdlLmVuZC5yb3cgOiBzZXNzaW9uLmdldExlbmd0aCgpIC0gMTsNCg0KICAgICAgICB2YXIgd3JhcCA9IHRoaXMuJG9wdGlvbnMud3JhcDsNCiAgICAgICAgdmFyIGluV3JhcCA9IGZhbHNlOw0KDQogICAgICAgIGZ1bmN0aW9uIGdldExpbmUocm93KSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICAgICAgaWYgKHNlYXJjaFNlbGVjdGlvbiAmJiByb3cgPT0gcmFuZ2UuZW5kLnJvdykgew0KICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLCByYW5nZS5lbmQuY29sdW1uKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChpbldyYXAgJiYgcm93ID09IHN0YXJ0LnJvdykgew0KICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBzdGFydC5jb2x1bW4pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGxpbmU7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgZm9yRWFjaDogZnVuY3Rpb24oY2FsbGJhY2spIHsNCiAgICAgICAgICAgICAgICB2YXIgcm93ID0gc3RhcnQucm93Ow0KDQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBnZXRMaW5lKHJvdyk7DQogICAgICAgICAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSBzdGFydC5jb2x1bW47DQoNCiAgICAgICAgICAgICAgICB2YXIgc3RvcCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGluV3JhcCA9IGZhbHNlOw0KDQogICAgICAgICAgICAgICAgd2hpbGUgKCFjYWxsYmFjayhsaW5lLCBzdGFydEluZGV4LCByb3cpKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3ApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIHJvdysrOw0KICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gMDsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAocm93ID4gbGFzdFJvdykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyYXApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBmaXJzdFJvdzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gZmlyc3RDb2x1bW47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XcmFwID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdyA9PSBzdGFydC5yb3cpDQogICAgICAgICAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTsNCg0KICAgICAgICAgICAgICAgICAgICBsaW5lID0gZ2V0TGluZShyb3cpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICB9Ow0KDQogICAgdGhpcy4kYmFja3dhcmRMaW5lSXRlcmF0b3IgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHZhciBzZWFyY2hTZWxlY3Rpb24gPSB0aGlzLiRvcHRpb25zLnNjb3BlID09IFNlYXJjaC5TRUxFQ1RJT047DQoNCiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy4kb3B0aW9ucy5yYW5nZSB8fCBzZXNzaW9uLmdldFNlbGVjdGlvbigpLmdldFJhbmdlKCk7DQogICAgICAgIHZhciBzdGFydCA9IHRoaXMuJG9wdGlvbnMuc3RhcnQgfHwgcmFuZ2Vbc2VhcmNoU2VsZWN0aW9uID8gImVuZCIgOiAic3RhcnQiXTsNCg0KICAgICAgICB2YXIgZmlyc3RSb3cgPSBzZWFyY2hTZWxlY3Rpb24gPyByYW5nZS5zdGFydC5yb3cgOiAwOw0KICAgICAgICB2YXIgZmlyc3RDb2x1bW4gPSBzZWFyY2hTZWxlY3Rpb24gPyByYW5nZS5zdGFydC5jb2x1bW4gOiAwOw0KICAgICAgICB2YXIgbGFzdFJvdyA9IHNlYXJjaFNlbGVjdGlvbiA/IHJhbmdlLmVuZC5yb3cgOiBzZXNzaW9uLmdldExlbmd0aCgpIC0gMTsNCg0KICAgICAgICB2YXIgd3JhcCA9IHRoaXMuJG9wdGlvbnMud3JhcDsNCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgZm9yRWFjaCA6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQogICAgICAgICAgICAgICAgdmFyIHJvdyA9IHN0YXJ0LnJvdzsNCg0KICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdykuc3Vic3RyaW5nKDAsIHN0YXJ0LmNvbHVtbik7DQogICAgICAgICAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSAwOw0KICAgICAgICAgICAgICAgIHZhciBzdG9wID0gZmFsc2U7DQogICAgICAgICAgICAgICAgdmFyIGluV3JhcCA9IGZhbHNlOw0KDQogICAgICAgICAgICAgICAgd2hpbGUgKCFjYWxsYmFjayhsaW5lLCBzdGFydEluZGV4LCByb3cpKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3ApDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgcm93LS07DQogICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSAwOw0KDQogICAgICAgICAgICAgICAgICAgIGlmIChyb3cgPCBmaXJzdFJvdykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyYXApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBsYXN0Um93Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV3JhcCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGlmIChyb3cgPT0gc3RhcnQucm93KQ0KICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHRydWU7DQoNCiAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoU2VsZWN0aW9uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93ID09IGZpcnN0Um93KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBmaXJzdENvbHVtbjsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJvdyA9PSBsYXN0Um93KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLCByYW5nZS5lbmQuY29sdW1uKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGlmIChpbldyYXAgJiYgcm93ID09IHN0YXJ0LnJvdykNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBzdGFydC5jb2x1bW47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgIH07DQoNCn0pLmNhbGwoU2VhcmNoLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuU2VhcmNoID0gU2VhcmNoOw0KfSk7DQpkZWZpbmUoJ2FjZS9jb21tYW5kcy9jb21tYW5kX21hbmFnZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIva2V5cyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIGtleVV0aWwgPSByZXF1aXJlKCIuLi9saWIva2V5cyIpOw0KDQp2YXIgQ29tbWFuZE1hbmFnZXIgPSBmdW5jdGlvbihwbGF0Zm9ybSwgY29tbWFuZHMpIHsNCiAgICBpZiAodHlwZW9mIHBsYXRmb3JtICE9PSAic3RyaW5nIikNCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiJ3BsYXRmb3JtJyBhcmd1bWVudCBtdXN0IGJlIGVpdGhlciAnbWFjJyBvciAnd2luJyIpOw0KDQogICAgdGhpcy5wbGF0Zm9ybSA9IHBsYXRmb3JtOw0KICAgIHRoaXMuY29tbWFuZHMgPSB7fTsNCiAgICB0aGlzLmNvbW1tYW5kS2V5QmluZGluZyA9IHt9Ow0KDQogICAgaWYgKGNvbW1hbmRzKQ0KICAgICAgICBjb21tYW5kcy5mb3JFYWNoKHRoaXMuYWRkQ29tbWFuZCwgdGhpcyk7DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmFkZENvbW1hbmQgPSBmdW5jdGlvbihjb21tYW5kKSB7DQogICAgICAgIGlmICh0aGlzLmNvbW1hbmRzW2NvbW1hbmQubmFtZV0pDQogICAgICAgICAgICB0aGlzLnJlbW92ZUNvbW1hbmQoY29tbWFuZCk7DQoNCiAgICAgICAgdGhpcy5jb21tYW5kc1tjb21tYW5kLm5hbWVdID0gY29tbWFuZDsNCg0KICAgICAgICBpZiAoY29tbWFuZC5iaW5kS2V5KSB7DQogICAgICAgICAgICB0aGlzLl9idWlsZEtleUhhc2goY29tbWFuZCk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmVDb21tYW5kID0gZnVuY3Rpb24oY29tbWFuZCkgew0KICAgICAgICB2YXIgbmFtZSA9ICh0eXBlb2YgY29tbWFuZCA9PT0gJ3N0cmluZycgPyBjb21tYW5kIDogY29tbWFuZC5uYW1lKTsNCiAgICAgICAgY29tbWFuZCA9IHRoaXMuY29tbWFuZHNbbmFtZV07DQogICAgICAgIGRlbGV0ZSB0aGlzLmNvbW1hbmRzW25hbWVdOw0KDQogICAgICAgIC8vIGV4YXVzdGl2ZSBzZWFyY2ggaXMgYnJ1dGUgZm9yY2UgYnV0IHNpbmNlIHJlbW92ZUNvbW1hbmQgaXMNCiAgICAgICAgLy8gbm90IGEgcGVyZm9ybWFuY2UgY3JpdGljYWwgb3BlcmF0aW9uIHRoaXMgc2hvdWxkIGJlIE9LDQogICAgICAgIHZhciBja2IgPSB0aGlzLmNvbW1tYW5kS2V5QmluZGluZzsNCiAgICAgICAgZm9yICh2YXIgaGFzaElkIGluIGNrYikgew0KICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGNrYltoYXNoSWRdKSB7DQogICAgICAgICAgICAgICAgaWYgKGNrYltoYXNoSWRdW2tleV0gPT0gY29tbWFuZCkNCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNrYltoYXNoSWRdW2tleV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5hZGRDb21tYW5kcyA9IGZ1bmN0aW9uKGNvbW1hbmRzKSB7DQogICAgICAgIE9iamVjdC5rZXlzKGNvbW1hbmRzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHsNCiAgICAgICAgICAgIHZhciBjb21tYW5kID0gY29tbWFuZHNbbmFtZV07DQogICAgICAgICAgICBpZiAodHlwZW9mIGNvbW1hbmQgPT09ICJzdHJpbmciKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJpbmRLZXkoY29tbWFuZCwgbmFtZSk7DQoNCiAgICAgICAgICAgIGlmICh0eXBlb2YgY29tbWFuZCA9PT0gImZ1bmN0aW9uIikNCiAgICAgICAgICAgICAgICBjb21tYW5kID0geyBleGVjOiBjb21tYW5kIH07DQoNCiAgICAgICAgICAgIGlmICghY29tbWFuZC5uYW1lKQ0KICAgICAgICAgICAgICAgIGNvbW1hbmQubmFtZSA9IG5hbWU7DQoNCiAgICAgICAgICAgIHRoaXMuYWRkQ29tbWFuZChjb21tYW5kKTsNCiAgICAgICAgfSwgdGhpcyk7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlQ29tbWFuZHMgPSBmdW5jdGlvbihjb21tYW5kcykgew0KICAgICAgICBPYmplY3Qua2V5cyhjb21tYW5kcykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7DQogICAgICAgICAgICB0aGlzLnJlbW92ZUNvbW1hbmQoY29tbWFuZHNbbmFtZV0pOw0KICAgICAgICB9LCB0aGlzKTsNCiAgICB9Ow0KDQogICAgdGhpcy5iaW5kS2V5ID0gZnVuY3Rpb24oa2V5LCBjb21tYW5kKSB7DQogICAgICAgIGlmKCFrZXkpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGNrYiA9IHRoaXMuY29tbW1hbmRLZXlCaW5kaW5nOw0KICAgICAgICBrZXkuc3BsaXQoInwiKS5mb3JFYWNoKGZ1bmN0aW9uKGtleVBhcnQpIHsNCiAgICAgICAgICAgIHZhciBiaW5kaW5nID0gcGFyc2VLZXlzKGtleVBhcnQsIGNvbW1hbmQpOw0KICAgICAgICAgICAgdmFyIGhhc2hJZCA9IGJpbmRpbmcuaGFzaElkOw0KICAgICAgICAgICAgKGNrYltoYXNoSWRdIHx8IChja2JbaGFzaElkXSA9IHt9KSlbYmluZGluZy5rZXldID0gY29tbWFuZDsNCiAgICAgICAgfSk7DQogICAgfTsNCg0KICAgIHRoaXMuYmluZEtleXMgPSBmdW5jdGlvbihrZXlMaXN0KSB7DQogICAgICAgIE9iamVjdC5rZXlzKGtleUxpc3QpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7DQogICAgICAgICAgICB0aGlzLmJpbmRLZXkoa2V5LCBrZXlMaXN0W2tleV0pOw0KICAgICAgICB9LCB0aGlzKTsNCiAgICB9Ow0KDQogICAgdGhpcy5fYnVpbGRLZXlIYXNoID0gZnVuY3Rpb24oY29tbWFuZCkgew0KICAgICAgICB2YXIgYmluZGluZyA9IGNvbW1hbmQuYmluZEtleTsNCiAgICAgICAgaWYgKCFiaW5kaW5nKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBrZXkgPSB0eXBlb2YgYmluZGluZyA9PSAic3RyaW5nIiA/IGJpbmRpbmc6IGJpbmRpbmdbdGhpcy5wbGF0Zm9ybV07DQogICAgICAgIHRoaXMuYmluZEtleShrZXksIGNvbW1hbmQpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHBhcnNlS2V5cyhrZXlzLCB2YWwsIHJldCkgew0KICAgICAgICB2YXIga2V5Ow0KICAgICAgICB2YXIgaGFzaElkID0gMDsNCiAgICAgICAgdmFyIHBhcnRzID0gc3BsaXRTYWZlKGtleXMpOw0KDQogICAgICAgIGZvciAodmFyIGk9MCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgICAgICAgaWYgKGtleVV0aWwuS0VZX01PRFNbcGFydHNbaV1dKQ0KICAgICAgICAgICAgICAgIGhhc2hJZCA9IGhhc2hJZCB8IGtleVV0aWwuS0VZX01PRFNbcGFydHNbaV1dOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIGtleSA9IHBhcnRzW2ldIHx8ICItIjsgLy93aGVuIGVtcHR5LCB0aGUgc3BsaXRTYWZlIHJlbW92ZWQgYSAnLScNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBrZXk6IGtleSwNCiAgICAgICAgICAgIGhhc2hJZDogaGFzaElkDQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzcGxpdFNhZmUocywgc2VwYXJhdG9yKSB7DQogICAgICAgIHJldHVybiAocy50b0xvd2VyQ2FzZSgpDQogICAgICAgICAgICAudHJpbSgpDQogICAgICAgICAgICAuc3BsaXQobmV3IFJlZ0V4cCgiW1xccyBdKlxcLVtcXHMgXSoiLCAiZyIpLCA5OTkpKTsNCiAgICB9DQoNCiAgICB0aGlzLmZpbmRLZXlDb21tYW5kID0gZnVuY3Rpb24gZmluZEtleUNvbW1hbmQoaGFzaElkLCB0ZXh0T3JLZXkpIHsNCiAgICAgICAgLy8gQ29udmVydCBrZXlDb2RlIHRvIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uDQogICAgICAgIGlmICh0eXBlb2YgdGV4dE9yS2V5ID09ICJudW1iZXIiKSB7DQogICAgICAgICAgICB0ZXh0T3JLZXkgPSBrZXlVdGlsLmtleUNvZGVUb1N0cmluZyh0ZXh0T3JLZXkpOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGNrYnIgPSB0aGlzLmNvbW1tYW5kS2V5QmluZGluZzsNCiAgICAgICAgcmV0dXJuIGNrYnJbaGFzaElkXSAmJiBja2JyW2hhc2hJZF1bdGV4dE9yS2V5LnRvTG93ZXJDYXNlKCldOw0KICAgIH0NCg0KICAgIHRoaXMuZXhlYyA9IGZ1bmN0aW9uKGNvbW1hbmQsIGVkaXRvciwgYXJncykgew0KICAgICAgICBpZiAodHlwZW9mIGNvbW1hbmQgPT09ICdzdHJpbmcnKQ0KICAgICAgICAgICAgY29tbWFuZCA9IHRoaXMuY29tbWFuZHNbY29tbWFuZF07DQoNCiAgICAgICAgaWYgKCFjb21tYW5kKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIGlmIChlZGl0b3IgJiYgZWRpdG9yLiRyZWFkT25seSAmJiAhY29tbWFuZC5yZWFkT25seSkNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICBjb21tYW5kLmV4ZWMoZWRpdG9yLCBhcmdzIHx8IHt9KTsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfTsNCg0KICAgIHRoaXMudG9nZ2xlUmVjb3JkaW5nID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmICh0aGlzLiRpblJlcGxheSkNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgaWYgKHRoaXMucmVjb3JkaW5nKSB7DQogICAgICAgICAgICB0aGlzLm1hY3JvLnBvcCgpOw0KICAgICAgICAgICAgdGhpcy5leGVjID0gdGhpcy5ub3JtYWxfZXhlYzsNCg0KICAgICAgICAgICAgaWYgKCF0aGlzLm1hY3JvLmxlbmd0aCkNCiAgICAgICAgICAgICAgICB0aGlzLm1hY3JvID0gdGhpcy5vbGRNYWNybzsNCg0KICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVjb3JkaW5nID0gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5vbGRNYWNybyA9IHRoaXMubWFjcm87DQogICAgICAgIHRoaXMubWFjcm8gPSBbXTsNCiAgICAgICAgdGhpcy5ub3JtYWxfZXhlYyA9IHRoaXMuZXhlYzsNCiAgICAgICAgdGhpcy5leGVjID0gZnVuY3Rpb24oY29tbWFuZCwgZWRpdG9yLCBhcmdzKSB7DQogICAgICAgICAgICB0aGlzLm1hY3JvLnB1c2goW2NvbW1hbmQsIGFyZ3NdKTsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vcm1hbF9leGVjKGNvbW1hbmQsIGVkaXRvciwgYXJncyk7DQogICAgICAgIH07DQogICAgICAgIHJldHVybiB0aGlzLnJlY29yZGluZyA9IHRydWU7DQogICAgfTsNCg0KICAgIHRoaXMucmVwbGF5ID0gZnVuY3Rpb24oZWRpdG9yKSB7DQogICAgICAgIGlmICh0aGlzLiRpblJlcGxheSB8fCAhdGhpcy5tYWNybykNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICBpZiAodGhpcy5yZWNvcmRpbmcpDQogICAgICAgICAgICByZXR1cm4gdGhpcy50b2dnbGVSZWNvcmRpbmcoKTsNCg0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgdGhpcy4kaW5SZXBsYXkgPSB0cnVlOw0KICAgICAgICAgICAgdGhpcy5tYWNyby5mb3JFYWNoKGZ1bmN0aW9uKHgpIHsNCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHggPT0gInN0cmluZyIpDQogICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlYyh4LCBlZGl0b3IpOw0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjKHhbMF0sIGVkaXRvciwgeFsxXSk7DQogICAgICAgICAgICB9LCB0aGlzKQ0KICAgICAgICB9IGZpbmFsbHkgew0KICAgICAgICAgICAgdGhpcy4kaW5SZXBsYXkgPSBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLnRyaW1NYWNybyA9IGZ1bmN0aW9uKG0pIHsNCiAgICAgICAgcmV0dXJuIG0ubWFwKGZ1bmN0aW9uKHgpew0KICAgICAgICAgICAgaWYgKHR5cGVvZiB4WzBdICE9ICJzdHJpbmciKQ0KICAgICAgICAgICAgICAgIHhbMF0gPSB4WzBdLm5hbWU7DQogICAgICAgICAgICBpZiAoIXhbMV0pDQogICAgICAgICAgICAgICAgeCA9IHhbMF07DQogICAgICAgICAgICByZXR1cm4geA0KICAgICAgICB9KQ0KICAgIH0NCg0KfSkuY2FsbChDb21tYW5kTWFuYWdlci5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkNvbW1hbmRNYW5hZ2VyID0gQ29tbWFuZE1hbmFnZXI7DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3VuZG9tYW5hZ2VyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFVuZG9NYW5hZ2VyID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy5yZXNldCgpOw0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5leGVjdXRlID0gZnVuY3Rpb24ob3B0aW9ucykgew0KICAgICAgICB2YXIgZGVsdGFzID0gb3B0aW9ucy5hcmdzWzBdOw0KICAgICAgICB0aGlzLiRkb2MgID0gb3B0aW9ucy5hcmdzWzFdOw0KICAgICAgICB0aGlzLiR1bmRvU3RhY2sucHVzaChkZWx0YXMpOw0KICAgICAgICB0aGlzLiRyZWRvU3RhY2sgPSBbXTsNCiAgICB9Ow0KDQogICAgdGhpcy51bmRvID0gZnVuY3Rpb24oZG9udFNlbGVjdCkgew0KICAgICAgICB2YXIgZGVsdGFzID0gdGhpcy4kdW5kb1N0YWNrLnBvcCgpOw0KICAgICAgICB2YXIgdW5kb1NlbGVjdGlvblJhbmdlID0gbnVsbDsNCiAgICAgICAgaWYgKGRlbHRhcykgew0KICAgICAgICAgICAgdW5kb1NlbGVjdGlvblJhbmdlID0NCiAgICAgICAgICAgICAgICB0aGlzLiRkb2MudW5kb0NoYW5nZXMoZGVsdGFzLCBkb250U2VsZWN0KTsNCiAgICAgICAgICAgIHRoaXMuJHJlZG9TdGFjay5wdXNoKGRlbHRhcyk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHVuZG9TZWxlY3Rpb25SYW5nZTsNCiAgICB9Ow0KDQogICAgdGhpcy5yZWRvID0gZnVuY3Rpb24oZG9udFNlbGVjdCkgew0KICAgICAgICB2YXIgZGVsdGFzID0gdGhpcy4kcmVkb1N0YWNrLnBvcCgpOw0KICAgICAgICB2YXIgcmVkb1NlbGVjdGlvblJhbmdlID0gbnVsbDsNCiAgICAgICAgaWYgKGRlbHRhcykgew0KICAgICAgICAgICAgcmVkb1NlbGVjdGlvblJhbmdlID0NCiAgICAgICAgICAgICAgICB0aGlzLiRkb2MucmVkb0NoYW5nZXMoZGVsdGFzLCBkb250U2VsZWN0KTsNCiAgICAgICAgICAgIHRoaXMuJHVuZG9TdGFjay5wdXNoKGRlbHRhcyk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHJlZG9TZWxlY3Rpb25SYW5nZTsNCiAgICB9Ow0KDQogICAgdGhpcy5yZXNldCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiR1bmRvU3RhY2sgPSBbXTsNCiAgICAgICAgdGhpcy4kcmVkb1N0YWNrID0gW107DQogICAgfTsNCg0KICAgIHRoaXMuaGFzVW5kbyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kdW5kb1N0YWNrLmxlbmd0aCA+IDA7DQogICAgfTsNCg0KICAgIHRoaXMuaGFzUmVkbyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kcmVkb1N0YWNrLmxlbmd0aCA+IDA7DQogICAgfTsNCg0KfSkuY2FsbChVbmRvTWFuYWdlci5wcm90b3R5cGUpOw0KDQpleHBvcnRzLlVuZG9NYW5hZ2VyID0gVW5kb01hbmFnZXI7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbkBhamF4Lm9yZz4NCiAqICAgICAgSXJha2xpIEdvemFsaXNodmlsaSA8cmZvYmljQGdtYWlsLmNvbT4gKGh0dHA6Ly9qZWRpdG9vbGtpdC5jb20pDQogKiAgICAgIEp1bGlhbiBWaWVyZWNrIDxqdWxpYW4udmllcmVja0BnbWFpbC5jb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvdmlydHVhbF9yZW5kZXJlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9kb20nLCAnYWNlL2xpYi9ldmVudCcsICdhY2UvbGliL3VzZXJhZ2VudCcsICdhY2UvbGF5ZXIvZ3V0dGVyJywgJ2FjZS9sYXllci9tYXJrZXInLCAnYWNlL2xheWVyL3RleHQnLCAnYWNlL2xheWVyL2N1cnNvcicsICdhY2Uvc2Nyb2xsYmFyJywgJ2FjZS9yZW5kZXJsb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsICd0ZXh0IWFjZS9jc3MvZWRpdG9yLmNzcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOw0KdmFyIGRvbSA9IHJlcXVpcmUoIi4vbGliL2RvbSIpOw0KdmFyIGV2ZW50ID0gcmVxdWlyZSgiLi9saWIvZXZlbnQiKTsNCnZhciB1c2VyYWdlbnQgPSByZXF1aXJlKCIuL2xpYi91c2VyYWdlbnQiKTsNCnZhciBHdXR0ZXJMYXllciA9IHJlcXVpcmUoIi4vbGF5ZXIvZ3V0dGVyIikuR3V0dGVyOw0KdmFyIE1hcmtlckxheWVyID0gcmVxdWlyZSgiLi9sYXllci9tYXJrZXIiKS5NYXJrZXI7DQp2YXIgVGV4dExheWVyID0gcmVxdWlyZSgiLi9sYXllci90ZXh0IikuVGV4dDsNCnZhciBDdXJzb3JMYXllciA9IHJlcXVpcmUoIi4vbGF5ZXIvY3Vyc29yIikuQ3Vyc29yOw0KdmFyIFNjcm9sbEJhciA9IHJlcXVpcmUoIi4vc2Nyb2xsYmFyIikuU2Nyb2xsQmFyOw0KdmFyIFJlbmRlckxvb3AgPSByZXF1aXJlKCIuL3JlbmRlcmxvb3AiKS5SZW5kZXJMb29wOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQp2YXIgZWRpdG9yQ3NzID0gcmVxdWlyZSgidGV4dCEuL2Nzcy9lZGl0b3IuY3NzIik7DQoNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZWRpdG9yQ3NzLCAiYWNlX2VkaXRvciIpOw0KDQp2YXIgVmlydHVhbFJlbmRlcmVyID0gZnVuY3Rpb24oY29udGFpbmVyLCB0aGVtZSkgew0KICAgIHZhciBfc2VsZiA9IHRoaXM7DQogICAgDQogICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7DQoNCiAgICAvLyBUT0RPOiB0aGlzIGJyZWFrcyByZW5kZXJpbmcgaW4gQ2xvdWQ5IHdpdGggbXVsdGlwbGUgYWNlIGluc3RhbmNlcw0KLy8gICAgLy8gSW1wb3J0cyBDU1Mgb25jZSBwZXIgRE9NIGRvY3VtZW50ICgnYWNlX2VkaXRvcicgc2VydmVzIGFzIGFuIGlkZW50aWZpZXIpLg0KLy8gICAgZG9tLmltcG9ydENzc1N0cmluZyhlZGl0b3JDc3MsICJhY2VfZWRpdG9yIiwgY29udGFpbmVyLm93bmVyRG9jdW1lbnQpOw0KICAgIA0KICAgIGRvbS5hZGRDc3NDbGFzcyhjb250YWluZXIsICJhY2VfZWRpdG9yIik7DQoNCiAgICB0aGlzLnNldFRoZW1lKHRoZW1lKTsNCg0KICAgIHRoaXMuJGd1dHRlciA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICB0aGlzLiRndXR0ZXIuY2xhc3NOYW1lID0gImFjZV9ndXR0ZXIiOw0KICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuJGd1dHRlcik7DQoNCiAgICB0aGlzLnNjcm9sbGVyID0gZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgIHRoaXMuc2Nyb2xsZXIuY2xhc3NOYW1lID0gImFjZV9zY3JvbGxlciI7DQogICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zY3JvbGxlcik7DQoNCiAgICB0aGlzLmNvbnRlbnQgPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgdGhpcy5jb250ZW50LmNsYXNzTmFtZSA9ICJhY2VfY29udGVudCI7DQogICAgdGhpcy5zY3JvbGxlci5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnQpOw0KDQogICAgdGhpcy4kZ3V0dGVyTGF5ZXIgPSBuZXcgR3V0dGVyTGF5ZXIodGhpcy4kZ3V0dGVyKTsNCiAgICB0aGlzLiRndXR0ZXJMYXllci5vbigiY2hhbmdlR3V0dGVyV2lkdGgiLCB0aGlzLm9uUmVzaXplLmJpbmQodGhpcywgdHJ1ZSkpOyAgICANCiAgICANCiAgICB0aGlzLiRtYXJrZXJCYWNrID0gbmV3IE1hcmtlckxheWVyKHRoaXMuY29udGVudCk7DQoNCiAgICB2YXIgdGV4dExheWVyID0gdGhpcy4kdGV4dExheWVyID0gbmV3IFRleHRMYXllcih0aGlzLmNvbnRlbnQpOw0KICAgIHRoaXMuY2FudmFzID0gdGV4dExheWVyLmVsZW1lbnQ7DQoNCiAgICB0aGlzLiRtYXJrZXJGcm9udCA9IG5ldyBNYXJrZXJMYXllcih0aGlzLmNvbnRlbnQpOw0KDQogICAgdGhpcy5jaGFyYWN0ZXJXaWR0aCA9IHRleHRMYXllci5nZXRDaGFyYWN0ZXJXaWR0aCgpOw0KICAgIHRoaXMubGluZUhlaWdodCA9IHRleHRMYXllci5nZXRMaW5lSGVpZ2h0KCk7DQoNCiAgICB0aGlzLiRjdXJzb3JMYXllciA9IG5ldyBDdXJzb3JMYXllcih0aGlzLmNvbnRlbnQpOw0KICAgIHRoaXMuJGN1cnNvclBhZGRpbmcgPSA4Ow0KDQogICAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGhvcml6b250YWwgc2Nyb2xsYmFyIGlzIHZpc2libGUNCiAgICB0aGlzLiRob3JpelNjcm9sbCA9IHRydWU7DQogICAgdGhpcy4kaG9yaXpTY3JvbGxBbHdheXNWaXNpYmxlID0gdHJ1ZTsNCg0KICAgIHRoaXMuc2Nyb2xsQmFyID0gbmV3IFNjcm9sbEJhcihjb250YWluZXIpOw0KICAgIHRoaXMuc2Nyb2xsQmFyLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgX3NlbGYuc2Vzc2lvbi5zZXRTY3JvbGxUb3AoZS5kYXRhKTsNCiAgICB9KTsNCg0KICAgIHRoaXMuc2Nyb2xsVG9wID0gMDsNCiAgICB0aGlzLnNjcm9sbExlZnQgPSAwOw0KICAgIA0KICAgIGV2ZW50LmFkZExpc3RlbmVyKHRoaXMuc2Nyb2xsZXIsICJzY3JvbGwiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgX3NlbGYuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KF9zZWxmLnNjcm9sbGVyLnNjcm9sbExlZnQpOw0KICAgIH0pOw0KDQogICAgdGhpcy5jdXJzb3JQb3MgPSB7DQogICAgICAgIHJvdyA6IDAsDQogICAgICAgIGNvbHVtbiA6IDANCiAgICB9Ow0KDQogICAgdGhpcy4kdGV4dExheWVyLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZUNoYXJhY3RlclNpemUiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgX3NlbGYuY2hhcmFjdGVyV2lkdGggPSB0ZXh0TGF5ZXIuZ2V0Q2hhcmFjdGVyV2lkdGgoKTsNCiAgICAgICAgX3NlbGYubGluZUhlaWdodCA9IHRleHRMYXllci5nZXRMaW5lSGVpZ2h0KCk7DQogICAgICAgIF9zZWxmLiR1cGRhdGVQcmludE1hcmdpbigpOw0KICAgICAgICBfc2VsZi5vblJlc2l6ZSh0cnVlKTsNCg0KICAgICAgICBfc2VsZi4kbG9vcC5zY2hlZHVsZShfc2VsZi5DSEFOR0VfRlVMTCk7DQogICAgfSk7DQoNCiAgICB0aGlzLiRzaXplID0gew0KICAgICAgICB3aWR0aDogMCwNCiAgICAgICAgaGVpZ2h0OiAwLA0KICAgICAgICBzY3JvbGxlckhlaWdodDogMCwNCiAgICAgICAgc2Nyb2xsZXJXaWR0aDogMA0KICAgIH07DQoNCiAgICB0aGlzLmxheWVyQ29uZmlnID0gew0KICAgICAgICB3aWR0aCA6IDEsDQogICAgICAgIHBhZGRpbmcgOiAwLA0KICAgICAgICBmaXJzdFJvdyA6IDAsDQogICAgICAgIGZpcnN0Um93U2NyZWVuOiAwLA0KICAgICAgICBsYXN0Um93IDogMCwNCiAgICAgICAgbGluZUhlaWdodCA6IDEsDQogICAgICAgIGNoYXJhY3RlcldpZHRoIDogMSwNCiAgICAgICAgbWluSGVpZ2h0IDogMSwNCiAgICAgICAgbWF4SGVpZ2h0IDogMSwNCiAgICAgICAgb2Zmc2V0IDogMCwNCiAgICAgICAgaGVpZ2h0IDogMQ0KICAgIH07DQoNCiAgICB0aGlzLiRsb29wID0gbmV3IFJlbmRlckxvb3AoDQogICAgICAgIHRoaXMuJHJlbmRlckNoYW5nZXMuYmluZCh0aGlzKSwNCiAgICAgICAgdGhpcy5jb250YWluZXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldw0KICAgICk7DQogICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKTsNCg0KICAgIHRoaXMuc2V0UGFkZGluZyg0KTsNCiAgICB0aGlzLiR1cGRhdGVQcmludE1hcmdpbigpOw0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuc2hvd0d1dHRlciA9IHRydWU7DQoNCiAgICB0aGlzLkNIQU5HRV9DVVJTT1IgPSAxOw0KICAgIHRoaXMuQ0hBTkdFX01BUktFUiA9IDI7DQogICAgdGhpcy5DSEFOR0VfR1VUVEVSID0gNDsNCiAgICB0aGlzLkNIQU5HRV9TQ1JPTEwgPSA4Ow0KICAgIHRoaXMuQ0hBTkdFX0xJTkVTID0gMTY7DQogICAgdGhpcy5DSEFOR0VfVEVYVCA9IDMyOw0KICAgIHRoaXMuQ0hBTkdFX1NJWkUgPSA2NDsNCiAgICB0aGlzLkNIQU5HRV9NQVJLRVJfQkFDSyA9IDEyODsNCiAgICB0aGlzLkNIQU5HRV9NQVJLRVJfRlJPTlQgPSAyNTY7DQogICAgdGhpcy5DSEFOR0VfRlVMTCA9IDUxMjsNCiAgICB0aGlzLkNIQU5HRV9IX1NDUk9MTCA9IDEwMjQ7DQoNCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7DQoNCiAgICB0aGlzLnNldFNlc3Npb24gPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247DQogICAgICAgIHRoaXMuJGN1cnNvckxheWVyLnNldFNlc3Npb24oc2Vzc2lvbik7DQogICAgICAgIHRoaXMuJG1hcmtlckJhY2suc2V0U2Vzc2lvbihzZXNzaW9uKTsNCiAgICAgICAgdGhpcy4kbWFya2VyRnJvbnQuc2V0U2Vzc2lvbihzZXNzaW9uKTsNCiAgICAgICAgdGhpcy4kZ3V0dGVyTGF5ZXIuc2V0U2Vzc2lvbihzZXNzaW9uKTsNCiAgICAgICAgdGhpcy4kdGV4dExheWVyLnNldFNlc3Npb24oc2Vzc2lvbik7DQogICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCk7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIFRyaWdnZXJzIHBhcnRpYWwgdXBkYXRlIG9mIHRoZSB0ZXh0IGxheWVyDQogICAgICovDQogICAgdGhpcy51cGRhdGVMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIGlmIChsYXN0Um93ID09PSB1bmRlZmluZWQpDQogICAgICAgICAgICBsYXN0Um93ID0gSW5maW5pdHk7DQoNCiAgICAgICAgaWYgKCF0aGlzLiRjaGFuZ2VkTGluZXMpIHsNCiAgICAgICAgICAgIHRoaXMuJGNoYW5nZWRMaW5lcyA9IHsNCiAgICAgICAgICAgICAgICBmaXJzdFJvdzogZmlyc3RSb3csDQogICAgICAgICAgICAgICAgbGFzdFJvdzogbGFzdFJvdw0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGlmICh0aGlzLiRjaGFuZ2VkTGluZXMuZmlyc3RSb3cgPiBmaXJzdFJvdykNCiAgICAgICAgICAgICAgICB0aGlzLiRjaGFuZ2VkTGluZXMuZmlyc3RSb3cgPSBmaXJzdFJvdzsNCg0KICAgICAgICAgICAgaWYgKHRoaXMuJGNoYW5nZWRMaW5lcy5sYXN0Um93IDwgbGFzdFJvdykNCiAgICAgICAgICAgICAgICB0aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdyA9IGxhc3RSb3c7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0xJTkVTKTsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogVHJpZ2dlcnMgZnVsbCB1cGRhdGUgb2YgdGhlIHRleHQgbGF5ZXINCiAgICAgKi8NCiAgICB0aGlzLnVwZGF0ZVRleHQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9URVhUKTsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogVHJpZ2dlcnMgYSBmdWxsIHVwZGF0ZSBvZiBhbGwgbGF5ZXJzDQogICAgICovDQogICAgdGhpcy51cGRhdGVGdWxsID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCk7DQogICAgfTsNCg0KICAgIHRoaXMudXBkYXRlRm9udFNpemUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kdGV4dExheWVyLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKTsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogVHJpZ2dlcnMgcmVzaXplIG9mIHRoZSBlZGl0b3INCiAgICAgKi8NCiAgICB0aGlzLm9uUmVzaXplID0gZnVuY3Rpb24oZm9yY2UpIHsNCiAgICAgICAgdmFyIGNoYW5nZXMgPSB0aGlzLkNIQU5HRV9TSVpFOw0KICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuJHNpemU7DQoNCiAgICAgICAgdmFyIGhlaWdodCA9IGRvbS5nZXRJbm5lckhlaWdodCh0aGlzLmNvbnRhaW5lcik7DQogICAgICAgIGlmIChmb3JjZSB8fCBzaXplLmhlaWdodCAhPSBoZWlnaHQpIHsNCiAgICAgICAgICAgIHNpemUuaGVpZ2h0ID0gaGVpZ2h0Ow0KDQogICAgICAgICAgICB0aGlzLnNjcm9sbGVyLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICJweCI7DQogICAgICAgICAgICBzaXplLnNjcm9sbGVySGVpZ2h0ID0gdGhpcy5zY3JvbGxlci5jbGllbnRIZWlnaHQ7DQogICAgICAgICAgICB0aGlzLnNjcm9sbEJhci5zZXRIZWlnaHQoc2l6ZS5zY3JvbGxlckhlaWdodCk7DQoNCiAgICAgICAgICAgIGlmICh0aGlzLnNlc3Npb24pIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHRoaXMuZ2V0U2Nyb2xsVG9wKCkpOw0KICAgICAgICAgICAgICAgIGNoYW5nZXMgPSBjaGFuZ2VzIHwgdGhpcy5DSEFOR0VfRlVMTDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHZhciB3aWR0aCA9IGRvbS5nZXRJbm5lcldpZHRoKHRoaXMuY29udGFpbmVyKTsNCiAgICAgICAgaWYgKGZvcmNlIHx8IHNpemUud2lkdGggIT0gd2lkdGgpIHsNCiAgICAgICAgICAgIHNpemUud2lkdGggPSB3aWR0aDsNCg0KICAgICAgICAgICAgdmFyIGd1dHRlcldpZHRoID0gdGhpcy5zaG93R3V0dGVyID8gdGhpcy4kZ3V0dGVyLm9mZnNldFdpZHRoIDogMDsNCiAgICAgICAgICAgIHRoaXMuc2Nyb2xsZXIuc3R5bGUubGVmdCA9IGd1dHRlcldpZHRoICsgInB4IjsNCiAgICAgICAgICAgIHNpemUuc2Nyb2xsZXJXaWR0aCA9IE1hdGgubWF4KDAsIHdpZHRoIC0gZ3V0dGVyV2lkdGggLSB0aGlzLnNjcm9sbEJhci5nZXRXaWR0aCgpKTsNCiAgICAgICAgICAgIHRoaXMuc2Nyb2xsZXIuc3R5bGUud2lkdGggPSBzaXplLnNjcm9sbGVyV2lkdGggKyAicHgiOw0KDQogICAgICAgICAgICBpZiAodGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCkgJiYgdGhpcy5hZGp1c3RXcmFwTGltaXQoKSB8fCBmb3JjZSkNCiAgICAgICAgICAgICAgICBjaGFuZ2VzID0gY2hhbmdlcyB8IHRoaXMuQ0hBTkdFX0ZVTEw7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLiRsb29wLnNjaGVkdWxlKGNoYW5nZXMpOw0KICAgIH07DQoNCiAgICB0aGlzLmFkanVzdFdyYXBMaW1pdCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgYXZhaWxhYmxlV2lkdGggPSB0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGggLSB0aGlzLiRwYWRkaW5nICogMjsNCiAgICAgICAgdmFyIGxpbWl0ID0gTWF0aC5mbG9vcihhdmFpbGFibGVXaWR0aCAvIHRoaXMuY2hhcmFjdGVyV2lkdGgpOw0KICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmFkanVzdFdyYXBMaW1pdChsaW1pdCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0U2hvd0ludmlzaWJsZXMgPSBmdW5jdGlvbihzaG93SW52aXNpYmxlcykgew0KICAgICAgICBpZiAodGhpcy4kdGV4dExheWVyLnNldFNob3dJbnZpc2libGVzKHNob3dJbnZpc2libGVzKSkNCiAgICAgICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfVEVYVCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2hvd0ludmlzaWJsZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHRleHRMYXllci5zaG93SW52aXNpYmxlczsNCiAgICB9Ow0KDQogICAgdGhpcy4kc2hvd1ByaW50TWFyZ2luID0gdHJ1ZTsNCiAgICB0aGlzLnNldFNob3dQcmludE1hcmdpbiA9IGZ1bmN0aW9uKHNob3dQcmludE1hcmdpbikgew0KICAgICAgICB0aGlzLiRzaG93UHJpbnRNYXJnaW4gPSBzaG93UHJpbnRNYXJnaW47DQogICAgICAgIHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2hvd1ByaW50TWFyZ2luID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRzaG93UHJpbnRNYXJnaW47DQogICAgfTsNCg0KICAgIHRoaXMuJHByaW50TWFyZ2luQ29sdW1uID0gODA7DQogICAgdGhpcy5zZXRQcmludE1hcmdpbkNvbHVtbiA9IGZ1bmN0aW9uKHNob3dQcmludE1hcmdpbikgew0KICAgICAgICB0aGlzLiRwcmludE1hcmdpbkNvbHVtbiA9IHNob3dQcmludE1hcmdpbjsNCiAgICAgICAgdGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRQcmludE1hcmdpbkNvbHVtbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kcHJpbnRNYXJnaW5Db2x1bW47DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2hvd0d1dHRlciA9IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLnNob3dHdXR0ZXI7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0U2hvd0d1dHRlciA9IGZ1bmN0aW9uKHNob3cpew0KICAgICAgICBpZih0aGlzLnNob3dHdXR0ZXIgPT09IHNob3cpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIHRoaXMuJGd1dHRlci5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/ICJibG9jayIgOiAibm9uZSI7DQogICAgICAgIHRoaXMuc2hvd0d1dHRlciA9IHNob3c7DQogICAgICAgIHRoaXMub25SZXNpemUodHJ1ZSk7DQogICAgfTsNCg0KICAgIHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBjb250YWluZXJFbDsNCg0KICAgICAgICBpZiAoIXRoaXMuJHNob3dQcmludE1hcmdpbiAmJiAhdGhpcy4kcHJpbnRNYXJnaW5FbCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICBpZiAoIXRoaXMuJHByaW50TWFyZ2luRWwpIHsNCiAgICAgICAgICAgIGNvbnRhaW5lckVsID0gZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICAgICAgY29udGFpbmVyRWwuY2xhc3NOYW1lID0gImFjZV9wcmludF9tYXJnaW5fbGF5ZXIiOw0KICAgICAgICAgICAgdGhpcy4kcHJpbnRNYXJnaW5FbCA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICAgICAgICAgIHRoaXMuJHByaW50TWFyZ2luRWwuY2xhc3NOYW1lID0gImFjZV9wcmludF9tYXJnaW4iOw0KICAgICAgICAgICAgY29udGFpbmVyRWwuYXBwZW5kQ2hpbGQodGhpcy4kcHJpbnRNYXJnaW5FbCk7DQogICAgICAgICAgICB0aGlzLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKGNvbnRhaW5lckVsLCB0aGlzLiR0ZXh0TGF5ZXIuZWxlbWVudCk7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLiRwcmludE1hcmdpbkVsLnN0eWxlOw0KICAgICAgICBzdHlsZS5sZWZ0ID0gKCh0aGlzLmNoYXJhY3RlcldpZHRoICogdGhpcy4kcHJpbnRNYXJnaW5Db2x1bW4pICsgdGhpcy4kcGFkZGluZykgKyAicHgiOw0KICAgICAgICBzdHlsZS52aXNpYmlsaXR5ID0gdGhpcy4kc2hvd1ByaW50TWFyZ2luID8gInZpc2libGUiIDogImhpZGRlbiI7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0Q29udGFpbmVyRWxlbWVudCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TW91c2VFdmVudFRhcmdldCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50Ow0KICAgIH07DQoNCiAgICB0aGlzLmdldFRleHRBcmVhQ29udGFpbmVyID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsNCiAgICB9Ow0KDQogICAgdGhpcy5tb3ZlVGV4dEFyZWFUb0N1cnNvciA9IGZ1bmN0aW9uKHRleHRhcmVhKSB7DQogICAgICAgIC8vIGluIElFIHRoZSBuYXRpdmUgY3Vyc29yIGFsd2F5cyBzaGluZXMgdGhyb3VnaA0KICAgICAgICAvLyB0aGlzIHBlcnNpc3RzIGluIElFOQ0KICAgICAgICBpZiAodXNlcmFnZW50LmlzSUUpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIA0KICAgICAgICBpZiAodGhpcy5sYXllckNvbmZpZy5sYXN0Um93ID09PSAwKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBwb3MgPSB0aGlzLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKCk7DQogICAgICAgIGlmICghcG9zKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBib3VuZHMgPSB0aGlzLmNvbnRlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7DQogICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLmxheWVyQ29uZmlnLm9mZnNldDsNCg0KICAgICAgICB0ZXh0YXJlYS5zdHlsZS5sZWZ0ID0gKGJvdW5kcy5sZWZ0ICsgcG9zLmxlZnQpICsgInB4IjsNCiAgICAgICAgdGV4dGFyZWEuc3R5bGUudG9wID0gKGJvdW5kcy50b3AgKyBwb3MudG9wIC0gdGhpcy5zY3JvbGxUb3AgKyBvZmZzZXQpICsgInB4IjsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRGaXJzdFZpc2libGVSb3cgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3c7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0Rmlyc3RGdWxseVZpc2libGVSb3cgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3cgKyAodGhpcy5sYXllckNvbmZpZy5vZmZzZXQgPT09IDAgPyAwIDogMSk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TGFzdEZ1bGx5VmlzaWJsZVJvdyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgZmxpbnQgPSBNYXRoLmZsb29yKCh0aGlzLmxheWVyQ29uZmlnLmhlaWdodCArIHRoaXMubGF5ZXJDb25maWcub2Zmc2V0KSAvIHRoaXMubGF5ZXJDb25maWcubGluZUhlaWdodCk7DQogICAgICAgIHJldHVybiB0aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93IC0gMSArIGZsaW50Ow0KICAgIH07DQoNCiAgICB0aGlzLmdldExhc3RWaXNpYmxlUm93ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmxheWVyQ29uZmlnLmxhc3RSb3c7DQogICAgfTsNCg0KICAgIHRoaXMuJHBhZGRpbmcgPSBudWxsOw0KICAgIHRoaXMuc2V0UGFkZGluZyA9IGZ1bmN0aW9uKHBhZGRpbmcpIHsNCiAgICAgICAgdGhpcy4kcGFkZGluZyA9IHBhZGRpbmc7DQogICAgICAgIHRoaXMuJHRleHRMYXllci5zZXRQYWRkaW5nKHBhZGRpbmcpOw0KICAgICAgICB0aGlzLiRjdXJzb3JMYXllci5zZXRQYWRkaW5nKHBhZGRpbmcpOw0KICAgICAgICB0aGlzLiRtYXJrZXJGcm9udC5zZXRQYWRkaW5nKHBhZGRpbmcpOw0KICAgICAgICB0aGlzLiRtYXJrZXJCYWNrLnNldFBhZGRpbmcocGFkZGluZyk7DQogICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCk7DQogICAgICAgIHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0SFNjcm9sbEJhckFsd2F5c1Zpc2libGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGhvcml6U2Nyb2xsQWx3YXlzVmlzaWJsZTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRIU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZSA9IGZ1bmN0aW9uKGFsd2F5c1Zpc2libGUpIHsNCiAgICAgICAgaWYgKHRoaXMuJGhvcml6U2Nyb2xsQWx3YXlzVmlzaWJsZSAhPSBhbHdheXNWaXNpYmxlKSB7DQogICAgICAgICAgICB0aGlzLiRob3JpelNjcm9sbEFsd2F5c1Zpc2libGUgPSBhbHdheXNWaXNpYmxlOw0KICAgICAgICAgICAgaWYgKCF0aGlzLiRob3JpelNjcm9sbEFsd2F5c1Zpc2libGUgfHwgIXRoaXMuJGhvcml6U2Nyb2xsKQ0KICAgICAgICAgICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfU0NST0xMKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLiR1cGRhdGVTY3JvbGxCYXIgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5zY3JvbGxCYXIuc2V0SW5uZXJIZWlnaHQodGhpcy5sYXllckNvbmZpZy5tYXhIZWlnaHQpOw0KICAgICAgICB0aGlzLnNjcm9sbEJhci5zZXRTY3JvbGxUb3AodGhpcy5zY3JvbGxUb3ApOw0KICAgIH07DQoNCiAgICB0aGlzLiRyZW5kZXJDaGFuZ2VzID0gZnVuY3Rpb24oY2hhbmdlcykgew0KICAgICAgICBpZiAoIWNoYW5nZXMgfHwgIXRoaXMuc2Vzc2lvbiB8fCAhdGhpcy5jb250YWluZXIub2Zmc2V0V2lkdGgpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgLy8gdGV4dCwgc2Nyb2xsaW5nIGFuZCByZXNpemUgY2hhbmdlcyBjYW4gY2F1c2UgdGhlIHZpZXcgcG9ydCBzaXplIHRvIGNoYW5nZQ0KICAgICAgICBpZiAoY2hhbmdlcyAmIHRoaXMuQ0hBTkdFX0ZVTEwgfHwNCiAgICAgICAgICAgIGNoYW5nZXMgJiB0aGlzLkNIQU5HRV9TSVpFIHx8DQogICAgICAgICAgICBjaGFuZ2VzICYgdGhpcy5DSEFOR0VfVEVYVCB8fA0KICAgICAgICAgICAgY2hhbmdlcyAmIHRoaXMuQ0hBTkdFX0xJTkVTIHx8DQogICAgICAgICAgICBjaGFuZ2VzICYgdGhpcy5DSEFOR0VfU0NST0xMDQogICAgICAgICkNCiAgICAgICAgICAgIHRoaXMuJGNvbXB1dGVMYXllckNvbmZpZygpOw0KDQogICAgICAgIC8vIGhvcml6b250YWwgc2Nyb2xsaW5nDQogICAgICAgIGlmIChjaGFuZ2VzICYgdGhpcy5DSEFOR0VfSF9TQ1JPTEwpDQogICAgICAgICAgICB0aGlzLnNjcm9sbGVyLnNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbExlZnQNCg0KICAgICAgICAvLyBmdWxsDQogICAgICAgIGlmIChjaGFuZ2VzICYgdGhpcy5DSEFOR0VfRlVMTCkgew0KICAgICAgICAgICAgdGhpcy4kdGV4dExheWVyLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKTsNCiAgICAgICAgICAgIC8vIHVwZGF0ZSBzY3JvbGxiYXIgZmlyc3QgdG8gbm90IGxvc2Ugc2Nyb2xsIHBvc2l0aW9uIHdoZW4gZ3V0dGVyIGNhbGxzIHJlc2l6ZQ0KICAgICAgICAgICAgdGhpcy4kdXBkYXRlU2Nyb2xsQmFyKCk7DQogICAgICAgICAgICB0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOw0KICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0d1dHRlcikNCiAgICAgICAgICAgICAgICB0aGlzLiRndXR0ZXJMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7DQogICAgICAgICAgICB0aGlzLiRtYXJrZXJCYWNrLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsNCiAgICAgICAgICAgIHRoaXMuJG1hcmtlckZyb250LnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsNCiAgICAgICAgICAgIHRoaXMuJGN1cnNvckxheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIHNjcm9sbGluZw0KICAgICAgICBpZiAoY2hhbmdlcyAmIHRoaXMuQ0hBTkdFX1NDUk9MTCkgew0KICAgICAgICAgICAgdGhpcy4kdXBkYXRlU2Nyb2xsQmFyKCk7DQogICAgICAgICAgICBpZiAoY2hhbmdlcyAmIHRoaXMuQ0hBTkdFX1RFWFQgfHwgY2hhbmdlcyAmIHRoaXMuQ0hBTkdFX0xJTkVTKQ0KICAgICAgICAgICAgICAgIHRoaXMuJHRleHRMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgdGhpcy4kdGV4dExheWVyLnNjcm9sbExpbmVzKHRoaXMubGF5ZXJDb25maWcpOw0KDQogICAgICAgICAgICBpZiAodGhpcy5zaG93R3V0dGVyKQ0KICAgICAgICAgICAgICAgIHRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsNCiAgICAgICAgICAgIHRoaXMuJG1hcmtlckJhY2sudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOw0KICAgICAgICAgICAgdGhpcy4kbWFya2VyRnJvbnQudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOw0KICAgICAgICAgICAgdGhpcy4kY3Vyc29yTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGNoYW5nZXMgJiB0aGlzLkNIQU5HRV9URVhUKSB7DQogICAgICAgICAgICB0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOw0KICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0d1dHRlcikNCiAgICAgICAgICAgICAgICB0aGlzLiRndXR0ZXJMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoY2hhbmdlcyAmIHRoaXMuQ0hBTkdFX0xJTkVTKSB7DQogICAgICAgICAgICBpZiAodGhpcy4kdXBkYXRlTGluZXMoKSkgew0KICAgICAgICAgICAgICAgIHRoaXMuJHVwZGF0ZVNjcm9sbEJhcigpOw0KICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dHdXR0ZXIpDQogICAgICAgICAgICAgICAgICAgIHRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzICYgdGhpcy5DSEFOR0VfR1VUVEVSKSB7DQogICAgICAgICAgICBpZiAodGhpcy5zaG93R3V0dGVyKQ0KICAgICAgICAgICAgICAgIHRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChjaGFuZ2VzICYgdGhpcy5DSEFOR0VfQ1VSU09SKQ0KICAgICAgICAgICAgdGhpcy4kY3Vyc29yTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOw0KDQogICAgICAgIGlmIChjaGFuZ2VzICYgKHRoaXMuQ0hBTkdFX01BUktFUiB8IHRoaXMuQ0hBTkdFX01BUktFUl9GUk9OVCkpIHsNCiAgICAgICAgICAgIHRoaXMuJG1hcmtlckZyb250LnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChjaGFuZ2VzICYgKHRoaXMuQ0hBTkdFX01BUktFUiB8IHRoaXMuQ0hBTkdFX01BUktFUl9CQUNLKSkgew0KICAgICAgICAgICAgdGhpcy4kbWFya2VyQmFjay51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoY2hhbmdlcyAmIHRoaXMuQ0hBTkdFX1NJWkUpDQogICAgICAgICAgICB0aGlzLiR1cGRhdGVTY3JvbGxCYXIoKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kY29tcHV0ZUxheWVyQ29uZmlnID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBzZXNzaW9uID0gdGhpcy5zZXNzaW9uOw0KDQogICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnNjcm9sbFRvcCAlIHRoaXMubGluZUhlaWdodDsNCiAgICAgICAgdmFyIG1pbkhlaWdodCA9IHRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQgKyB0aGlzLmxpbmVIZWlnaHQ7DQoNCiAgICAgICAgdmFyIGxvbmdlc3RMaW5lID0gdGhpcy4kZ2V0TG9uZ2VzdExpbmUoKTsNCg0KICAgICAgICB2YXIgaG9yaXpTY3JvbGwgPSB0aGlzLiRob3JpelNjcm9sbEFsd2F5c1Zpc2libGUgfHwgdGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoIC0gbG9uZ2VzdExpbmUgPCAwOw0KICAgICAgICB2YXIgaG9yaXpTY3JvbGxDaGFuZ2VkID0gdGhpcy4kaG9yaXpTY3JvbGwgIT09IGhvcml6U2Nyb2xsOw0KICAgICAgICB0aGlzLiRob3JpelNjcm9sbCA9IGhvcml6U2Nyb2xsOw0KICAgICAgICBpZiAoaG9yaXpTY3JvbGxDaGFuZ2VkKSB7DQogICAgICAgICAgICB0aGlzLnNjcm9sbGVyLnN0eWxlLm92ZXJmbG93WCA9IGhvcml6U2Nyb2xsID8gInNjcm9sbCIgOiAiaGlkZGVuIjsNCiAgICAgICAgICAgIC8vIHdoZW4gd2UgaGlkZSBzY3JvbGxiYXIgc2Nyb2xsIGV2ZW50IGlzbid0IGVtaXRlZA0KICAgICAgICAgICAgLy8gbGVhdmluZyBzZXNzaW9uIHdpdGggd3Jvbmcgc2Nyb2xsTGVmdCB2YWx1ZQ0KICAgICAgICAgICAgaWYgKCFob3JpelNjcm9sbCkNCiAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdCgwKTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgbWF4SGVpZ2h0ID0gdGhpcy5zZXNzaW9uLmdldFNjcmVlbkxlbmd0aCgpICogdGhpcy5saW5lSGVpZ2h0Ow0KICAgICAgICB0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMuc2Nyb2xsVG9wLCBtYXhIZWlnaHQgLSB0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0KSkpOw0KDQogICAgICAgIHZhciBsaW5lQ291bnQgPSBNYXRoLmNlaWwobWluSGVpZ2h0IC8gdGhpcy5saW5lSGVpZ2h0KSAtIDE7DQogICAgICAgIHZhciBmaXJzdFJvdyA9IE1hdGgubWF4KDAsIE1hdGgucm91bmQoKHRoaXMuc2Nyb2xsVG9wIC0gb2Zmc2V0KSAvIHRoaXMubGluZUhlaWdodCkpOw0KICAgICAgICB2YXIgbGFzdFJvdyA9IGZpcnN0Um93ICsgbGluZUNvdW50Ow0KDQogICAgICAgIC8vIE1hcCBsaW5lcyBvbiB0aGUgc2NyZWVuIHRvIGxpbmVzIGluIHRoZSBkb2N1bWVudC4NCiAgICAgICAgdmFyIGZpcnN0Um93U2NyZWVuLCBmaXJzdFJvd0hlaWdodDsNCiAgICAgICAgdmFyIGxpbmVIZWlnaHQgPSB7IGxpbmVIZWlnaHQ6IHRoaXMubGluZUhlaWdodCB9Ow0KICAgICAgICBmaXJzdFJvdyA9IHNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFJvdyhmaXJzdFJvdywgMCk7DQoNCiAgICAgICAgLy8gQ2hlY2sgaWYgZmlyc3RSb3cgaXMgaW5zaWRlIG9mIGEgZm9sZExpbmUuIElmIHRydWUsIHRoZW4gdXNlIHRoZSBmaXJzdA0KICAgICAgICAvLyByb3cgb2YgdGhlIGZvbGRMaW5lLg0KICAgICAgICB2YXIgZm9sZExpbmUgPSBzZXNzaW9uLmdldEZvbGRMaW5lKGZpcnN0Um93KTsNCiAgICAgICAgaWYgKGZvbGRMaW5lKSB7DQogICAgICAgICAgICBmaXJzdFJvdyA9IGZvbGRMaW5lLnN0YXJ0LnJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGZpcnN0Um93U2NyZWVuID0gc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUm93KGZpcnN0Um93LCAwKTsNCiAgICAgICAgZmlyc3RSb3dIZWlnaHQgPSBzZXNzaW9uLmdldFJvd0hlaWdodChsaW5lSGVpZ2h0LCBmaXJzdFJvdyk7DQoNCiAgICAgICAgbGFzdFJvdyA9IE1hdGgubWluKHNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFJvdyhsYXN0Um93LCAwKSwgc2Vzc2lvbi5nZXRMZW5ndGgoKSAtIDEpOw0KICAgICAgICBtaW5IZWlnaHQgPSB0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0ICsgc2Vzc2lvbi5nZXRSb3dIZWlnaHQobGluZUhlaWdodCwgbGFzdFJvdykrDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJvd0hlaWdodDsNCg0KICAgICAgICBvZmZzZXQgPSB0aGlzLnNjcm9sbFRvcCAtIGZpcnN0Um93U2NyZWVuICogdGhpcy5saW5lSGVpZ2h0Ow0KDQogICAgICAgIHRoaXMubGF5ZXJDb25maWcgPSB7DQogICAgICAgICAgICB3aWR0aCA6IGxvbmdlc3RMaW5lLA0KICAgICAgICAgICAgcGFkZGluZyA6IHRoaXMuJHBhZGRpbmcsDQogICAgICAgICAgICBmaXJzdFJvdyA6IGZpcnN0Um93LA0KICAgICAgICAgICAgZmlyc3RSb3dTY3JlZW46IGZpcnN0Um93U2NyZWVuLA0KICAgICAgICAgICAgbGFzdFJvdyA6IGxhc3RSb3csDQogICAgICAgICAgICBsaW5lSGVpZ2h0IDogdGhpcy5saW5lSGVpZ2h0LA0KICAgICAgICAgICAgY2hhcmFjdGVyV2lkdGggOiB0aGlzLmNoYXJhY3RlcldpZHRoLA0KICAgICAgICAgICAgbWluSGVpZ2h0IDogbWluSGVpZ2h0LA0KICAgICAgICAgICAgbWF4SGVpZ2h0IDogbWF4SGVpZ2h0LA0KICAgICAgICAgICAgb2Zmc2V0IDogb2Zmc2V0LA0KICAgICAgICAgICAgaGVpZ2h0IDogdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodA0KICAgICAgICB9Ow0KDQogICAgICAgIC8vIEZvciBkZWJ1Z2dpbmcuDQogICAgICAgIC8vIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHRoaXMubGF5ZXJDb25maWcpKTsNCg0KICAgICAgICB0aGlzLiRndXR0ZXJMYXllci5lbGVtZW50LnN0eWxlLm1hcmdpblRvcCA9ICgtb2Zmc2V0KSArICJweCI7DQogICAgICAgIHRoaXMuY29udGVudC5zdHlsZS5tYXJnaW5Ub3AgPSAoLW9mZnNldCkgKyAicHgiOw0KICAgICAgICB0aGlzLmNvbnRlbnQuc3R5bGUud2lkdGggPSBsb25nZXN0TGluZSArIDIgKiB0aGlzLiRwYWRkaW5nICsgInB4IjsNCiAgICAgICAgdGhpcy5jb250ZW50LnN0eWxlLmhlaWdodCA9IG1pbkhlaWdodCArICJweCI7DQoNCiAgICAgICAgLy8gSG9yaXpvbnRhbCBzY3JvbGxiYXIgdmlzaWJpbGl0eSBtYXkgaGF2ZSBjaGFuZ2VkLCB3aGljaCBjaGFuZ2VzDQogICAgICAgIC8vIHRoZSBjbGllbnQgaGVpZ2h0IG9mIHRoZSBzY3JvbGxlcg0KICAgICAgICBpZiAoaG9yaXpTY3JvbGxDaGFuZ2VkKQ0KICAgICAgICAgICAgdGhpcy5vblJlc2l6ZSh0cnVlKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kdXBkYXRlTGluZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIGZpcnN0Um93ID0gdGhpcy4kY2hhbmdlZExpbmVzLmZpcnN0Um93Ow0KICAgICAgICB2YXIgbGFzdFJvdyA9IHRoaXMuJGNoYW5nZWRMaW5lcy5sYXN0Um93Ow0KICAgICAgICB0aGlzLiRjaGFuZ2VkTGluZXMgPSBudWxsOw0KDQogICAgICAgIHZhciBsYXllckNvbmZpZyA9IHRoaXMubGF5ZXJDb25maWc7DQoNCiAgICAgICAgLy8gaWYgdGhlIHVwZGF0ZSBjaGFuZ2VzIHRoZSB3aWR0aCBvZiB0aGUgZG9jdW1lbnQgZG8gYSBmdWxsIHJlZHJhdw0KICAgICAgICBpZiAobGF5ZXJDb25maWcud2lkdGggIT0gdGhpcy4kZ2V0TG9uZ2VzdExpbmUoKSkNCiAgICAgICAgICAgIHJldHVybiB0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKGxheWVyQ29uZmlnKTsNCg0KICAgICAgICBpZiAoZmlyc3RSb3cgPiBsYXllckNvbmZpZy5sYXN0Um93ICsgMSkgeyByZXR1cm47IH0NCiAgICAgICAgaWYgKGxhc3RSb3cgPCBsYXllckNvbmZpZy5maXJzdFJvdykgeyByZXR1cm47IH0NCg0KICAgICAgICAvLyBpZiB0aGUgbGFzdCByb3cgaXMgdW5rbm93biAtPiByZWRyYXcgZXZlcnl0aGluZw0KICAgICAgICBpZiAobGFzdFJvdyA9PT0gSW5maW5pdHkpIHsNCiAgICAgICAgICAgIGlmICh0aGlzLnNob3dHdXR0ZXIpDQogICAgICAgICAgICAgICAgdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKGxheWVyQ29uZmlnKTsNCiAgICAgICAgICAgIHRoaXMuJHRleHRMYXllci51cGRhdGUobGF5ZXJDb25maWcpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gZWxzZSB1cGRhdGUgb25seSB0aGUgY2hhbmdlZCByb3dzDQogICAgICAgIHRoaXMuJHRleHRMYXllci51cGRhdGVMaW5lcyhsYXllckNvbmZpZywgZmlyc3RSb3csIGxhc3RSb3cpOw0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0TG9uZ2VzdExpbmUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIGNoYXJDb3VudCA9IHRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5XaWR0aCgpOw0KICAgICAgICBpZiAodGhpcy4kdGV4dExheWVyLnNob3dJbnZpc2libGVzKQ0KICAgICAgICAgICAgY2hhckNvdW50ICs9IDE7DQoNCiAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aCAtIDIgKiB0aGlzLiRwYWRkaW5nLCBNYXRoLnJvdW5kKGNoYXJDb3VudCAqIHRoaXMuY2hhcmFjdGVyV2lkdGgpKTsNCiAgICB9Ow0KDQogICAgdGhpcy51cGRhdGVGcm9udE1hcmtlcnMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kbWFya2VyRnJvbnQuc2V0TWFya2Vycyh0aGlzLnNlc3Npb24uZ2V0TWFya2Vycyh0cnVlKSk7DQogICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfTUFSS0VSX0ZST05UKTsNCiAgICB9Ow0KDQogICAgdGhpcy51cGRhdGVCYWNrTWFya2VycyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRtYXJrZXJCYWNrLnNldE1hcmtlcnModGhpcy5zZXNzaW9uLmdldE1hcmtlcnMoKSk7DQogICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfTUFSS0VSX0JBQ0spOw0KICAgIH07DQoNCiAgICB0aGlzLmFkZEd1dHRlckRlY29yYXRpb24gPSBmdW5jdGlvbihyb3csIGNsYXNzTmFtZSl7DQogICAgICAgIHRoaXMuJGd1dHRlckxheWVyLmFkZEd1dHRlckRlY29yYXRpb24ocm93LCBjbGFzc05hbWUpOw0KICAgICAgICB0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUik7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbiA9IGZ1bmN0aW9uKHJvdywgY2xhc3NOYW1lKXsNCiAgICAgICAgdGhpcy4kZ3V0dGVyTGF5ZXIucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbihyb3csIGNsYXNzTmFtZSk7DQogICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRCcmVha3BvaW50cyA9IGZ1bmN0aW9uKHJvd3MpIHsNCiAgICAgICAgdGhpcy4kZ3V0dGVyTGF5ZXIuc2V0QnJlYWtwb2ludHMocm93cyk7DQogICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uKGFubm90YXRpb25zKSB7DQogICAgICAgIHRoaXMuJGd1dHRlckxheWVyLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsNCiAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpOw0KICAgIH07DQoNCiAgICB0aGlzLnVwZGF0ZUN1cnNvciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0NVUlNPUik7DQogICAgfTsNCg0KICAgIHRoaXMuaGlkZUN1cnNvciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRjdXJzb3JMYXllci5oaWRlQ3Vyc29yKCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2hvd0N1cnNvciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRjdXJzb3JMYXllci5zaG93Q3Vyc29yKCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgLy8gdGhlIGVkaXRvciBpcyBub3QgdmlzaWJsZQ0KICAgICAgICBpZiAodGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCA9PT0gMCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgcG9zID0gdGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbigpOw0KDQogICAgICAgIHZhciBsZWZ0ID0gcG9zLmxlZnQ7DQogICAgICAgIHZhciB0b3AgPSBwb3MudG9wOw0KDQogICAgICAgIGlmICh0aGlzLnNjcm9sbFRvcCA+IHRvcCkgew0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcCh0b3ApOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVG9wICsgdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCA8IHRvcCArIHRoaXMubGluZUhlaWdodCkgew0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcCh0b3AgKyB0aGlzLmxpbmVIZWlnaHQgLSB0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBzY3JvbGxMZWZ0ID0gdGhpcy5zY3JvbGxMZWZ0Ow0KDQogICAgICAgIGlmIChzY3JvbGxMZWZ0ID4gbGVmdCkgew0KICAgICAgICAgICAgaWYgKGxlZnQgPCB0aGlzLiRwYWRkaW5nICsgMiAqIHRoaXMubGF5ZXJDb25maWcuY2hhcmFjdGVyV2lkdGgpDQogICAgICAgICAgICAgICAgbGVmdCA9IDA7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdChsZWZ0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChzY3JvbGxMZWZ0ICsgdGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoIDwgbGVmdCArIHRoaXMuY2hhcmFjdGVyV2lkdGgpIHsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KE1hdGgucm91bmQobGVmdCArIHRoaXMuY2hhcmFjdGVyV2lkdGggLSB0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgpKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmdldFNjcm9sbFRvcCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFNjcm9sbExlZnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxMZWZ0KCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2Nyb2xsVG9wUm93ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRvcCAvIHRoaXMubGluZUhlaWdodDsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRTY3JvbGxCb3R0b21Sb3cgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGguZmxvb3IoKHRoaXMuc2Nyb2xsVG9wICsgdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCkgLyB0aGlzLmxpbmVIZWlnaHQpIC0gMSk7DQogICAgfTsNCg0KICAgIHRoaXMuc2Nyb2xsVG9Sb3cgPSBmdW5jdGlvbihyb3cpIHsNCiAgICAgICAgdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChyb3cgKiB0aGlzLmxpbmVIZWlnaHQpOw0KICAgIH07DQoNCiAgICB0aGlzLnNjcm9sbFRvTGluZSA9IGZ1bmN0aW9uKGxpbmUsIGNlbnRlcikgew0KICAgICAgICB2YXIgcG9zID0gdGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbih7cm93OiBsaW5lLCBjb2x1bW46IDB9KTsNCiAgICAgICAgdmFyIG9mZnNldCA9IHBvcy50b3A7DQogICAgICAgIGlmIChjZW50ZXIpDQogICAgICAgICAgICBvZmZzZXQgLT0gdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCAvIDI7DQoNCiAgICAgICAgdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChvZmZzZXQpOw0KICAgIH07DQoNCiAgICB0aGlzLnNjcm9sbFRvWSA9IGZ1bmN0aW9uKHNjcm9sbFRvcCkgew0KICAgICAgICAvLyBhZnRlciBjYWxsaW5nIHNjcm9sbEJhci5zZXRTY3JvbGxUb3ANCiAgICAgICAgLy8gc2Nyb2xsYmFyIHNlbmRzIHVzIGV2ZW50IHdpdGggc2FtZSBzY3JvbGxUb3AuIGlnbm9yZSBpdA0KICAgICAgICBpZiAodGhpcy5zY3JvbGxUb3AgIT09IHNjcm9sbFRvcCkgew0KICAgICAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9TQ1JPTEwpOw0KICAgICAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5zY3JvbGxUb1ggPSBmdW5jdGlvbihzY3JvbGxMZWZ0KSB7DQogICAgICAgIGlmIChzY3JvbGxMZWZ0IDw9IHRoaXMuJHBhZGRpbmcpDQogICAgICAgICAgICBzY3JvbGxMZWZ0ID0gMDsNCg0KICAgICAgICBpZiAodGhpcy5zY3JvbGxMZWZ0ICE9PSBzY3JvbGxMZWZ0KQ0KICAgICAgICAgICAgdGhpcy5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDsNCiAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9IX1NDUk9MTCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2Nyb2xsQnkgPSBmdW5jdGlvbihkZWx0YVgsIGRlbHRhWSkgew0KICAgICAgICBkZWx0YVkgJiYgdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcCh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkgKyBkZWx0YVkpOw0KICAgICAgICBkZWx0YVggJiYgdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQodGhpcy5zZXNzaW9uLmdldFNjcm9sbExlZnQoKSArIGRlbHRhWCk7DQogICAgfTsNCg0KICAgIHRoaXMuaXNTY3JvbGxhYmxlQnkgPSBmdW5jdGlvbihkZWx0YVgsIGRlbHRhWSkgew0KICAgICAgICBpZiAoZGVsdGFZIDwgMCAmJiB0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkgPiAwKQ0KICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgaWYgKGRlbHRhWSA+IDAgJiYgdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpICsgdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCA8IHRoaXMubGF5ZXJDb25maWcubWF4SGVpZ2h0KQ0KICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgLy8gdG9kbzogaGFuZGxlIGhvcml6b250YWwgc2Nyb2xsaW5nDQogICAgfTsNCg0KICAgIHRoaXMuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXMgPSBmdW5jdGlvbihwYWdlWCwgcGFnZVkpIHsNCiAgICAgICAgdmFyIGNhbnZhc1BvcyA9IHRoaXMuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7DQoNCiAgICAgICAgdmFyIGNvbCA9IE1hdGgucm91bmQoDQogICAgICAgICAgICAocGFnZVggKyB0aGlzLnNjcm9sbExlZnQgLSBjYW52YXNQb3MubGVmdCAtIHRoaXMuJHBhZGRpbmcgLSBkb20uZ2V0UGFnZVNjcm9sbExlZnQoKSkgLyB0aGlzLmNoYXJhY3RlcldpZHRoDQogICAgICAgICk7DQogICAgICAgIHZhciByb3cgPSBNYXRoLmZsb29yKA0KICAgICAgICAgICAgKHBhZ2VZICsgdGhpcy5zY3JvbGxUb3AgLSBjYW52YXNQb3MudG9wIC0gZG9tLmdldFBhZ2VTY3JvbGxUb3AoKSkgLyB0aGlzLmxpbmVIZWlnaHQNCiAgICAgICAgKTsNCg0KICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihyb3csIE1hdGgubWF4KGNvbCwgMCkpOw0KICAgIH07DQoNCiAgICB0aGlzLnRleHRUb1NjcmVlbkNvb3JkaW5hdGVzID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIGNhbnZhc1BvcyA9IHRoaXMuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7DQogICAgICAgIHZhciBwb3MgPSB0aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHJvdywgY29sdW1uKTsNCg0KICAgICAgICB2YXIgeCA9IHRoaXMuJHBhZGRpbmcgKyBNYXRoLnJvdW5kKHBvcy5jb2x1bW4gKiB0aGlzLmNoYXJhY3RlcldpZHRoKTsNCiAgICAgICAgdmFyIHkgPSBwb3Mucm93ICogdGhpcy5saW5lSGVpZ2h0Ow0KDQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBwYWdlWDogY2FudmFzUG9zLmxlZnQgKyB4IC0gdGhpcy5zY3JvbGxMZWZ0LA0KICAgICAgICAgICAgcGFnZVk6IGNhbnZhc1Bvcy50b3AgKyB5IC0gdGhpcy5zY3JvbGxUb3ANCiAgICAgICAgfTsNCiAgICB9Ow0KDQogICAgdGhpcy52aXN1YWxpemVGb2N1cyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBkb20uYWRkQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsICJhY2VfZm9jdXMiKTsNCiAgICB9Ow0KDQogICAgdGhpcy52aXN1YWxpemVCbHVyID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGRvbS5yZW1vdmVDc3NDbGFzcyh0aGlzLmNvbnRhaW5lciwgImFjZV9mb2N1cyIpOw0KICAgIH07DQoNCiAgICB0aGlzLnNob3dDb21wb3NpdGlvbiA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7DQogICAgICAgIGlmICghdGhpcy4kY29tcG9zaXRpb24pIHsNCiAgICAgICAgICAgIHRoaXMuJGNvbXBvc2l0aW9uID0gZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICAgICAgdGhpcy4kY29tcG9zaXRpb24uY2xhc3NOYW1lID0gImFjZV9jb21wb3NpdGlvbiI7DQogICAgICAgICAgICB0aGlzLmNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy4kY29tcG9zaXRpb24pOw0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy4kY29tcG9zaXRpb24uaW5uZXJIVE1MID0gIiYjMTYwOyI7DQoNCiAgICAgICAgdmFyIHBvcyA9IHRoaXMuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oKTsNCiAgICAgICAgdmFyIHN0eWxlID0gdGhpcy4kY29tcG9zaXRpb24uc3R5bGU7DQogICAgICAgIHN0eWxlLnRvcCA9IHBvcy50b3AgKyAicHgiOw0KICAgICAgICBzdHlsZS5sZWZ0ID0gKHBvcy5sZWZ0ICsgdGhpcy4kcGFkZGluZykgKyAicHgiOw0KICAgICAgICBzdHlsZS5oZWlnaHQgPSB0aGlzLmxpbmVIZWlnaHQgKyAicHgiOw0KDQogICAgICAgIHRoaXMuaGlkZUN1cnNvcigpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldENvbXBvc2l0aW9uVGV4dCA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICAgICAgZG9tLnNldElubmVyVGV4dCh0aGlzLiRjb21wb3NpdGlvbiwgdGV4dCk7DQogICAgfTsNCg0KICAgIHRoaXMuaGlkZUNvbXBvc2l0aW9uID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuc2hvd0N1cnNvcigpOw0KDQogICAgICAgIGlmICghdGhpcy4kY29tcG9zaXRpb24pDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIHN0eWxlID0gdGhpcy4kY29tcG9zaXRpb24uc3R5bGU7DQogICAgICAgIHN0eWxlLnRvcCA9ICItMTAwMDBweCI7DQogICAgICAgIHN0eWxlLmxlZnQgPSAiLTEwMDAwcHgiOw0KICAgIH07DQoNCiAgICB0aGlzLnNldFRoZW1lID0gZnVuY3Rpb24odGhlbWUpIHsNCiAgICAgICAgdmFyIF9zZWxmID0gdGhpczsNCg0KICAgICAgICB0aGlzLiR0aGVtZVZhbHVlID0gdGhlbWU7DQogICAgICAgIGlmICghdGhlbWUgfHwgdHlwZW9mIHRoZW1lID09ICJzdHJpbmciKSB7DQogICAgICAgICAgICB0aGVtZSA9IHRoZW1lIHx8ICJhY2UvdGhlbWUvdGV4dG1hdGUiOw0KICAgICAgICAgICAgcmVxdWlyZShbdGhlbWVdLCBmdW5jdGlvbih0aGVtZSkgew0KICAgICAgICAgICAgICAgIGFmdGVyTG9hZCh0aGVtZSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGFmdGVyTG9hZCh0aGVtZSk7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBhZnRlckxvYWQodGhlbWUpIHsNCiAgICAgICAgICAgIGRvbS5pbXBvcnRDc3NTdHJpbmcoDQogICAgICAgICAgICAgICAgdGhlbWUuY3NzVGV4dCwNCiAgICAgICAgICAgICAgICB0aGVtZS5jc3NDbGFzcywNCiAgICAgICAgICAgICAgICBfc2VsZi5jb250YWluZXIub3duZXJEb2N1bWVudA0KICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgaWYgKF9zZWxmLiR0aGVtZSkNCiAgICAgICAgICAgICAgICBkb20ucmVtb3ZlQ3NzQ2xhc3MoX3NlbGYuY29udGFpbmVyLCBfc2VsZi4kdGhlbWUpOw0KDQogICAgICAgICAgICBfc2VsZi4kdGhlbWUgPSB0aGVtZSA/IHRoZW1lLmNzc0NsYXNzIDogbnVsbDsNCg0KICAgICAgICAgICAgaWYgKF9zZWxmLiR0aGVtZSkNCiAgICAgICAgICAgICAgICBkb20uYWRkQ3NzQ2xhc3MoX3NlbGYuY29udGFpbmVyLCBfc2VsZi4kdGhlbWUpOw0KDQogICAgICAgICAgICBpZiAodGhlbWUgJiYgdGhlbWUuaXNEYXJrKQ0KICAgICAgICAgICAgICAgIGRvbS5hZGRDc3NDbGFzcyhfc2VsZi5jb250YWluZXIsICJhY2VfZGFyayIpOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVDc3NDbGFzcyhfc2VsZi5jb250YWluZXIsICJhY2VfZGFyayIpOw0KDQogICAgICAgICAgICAvLyBmb3JjZSByZS1tZWFzdXJlIG9mIHRoZSBndXR0ZXIgd2lkdGgNCiAgICAgICAgICAgIGlmIChfc2VsZi4kc2l6ZSkgew0KICAgICAgICAgICAgICAgIF9zZWxmLiRzaXplLndpZHRoID0gMDsNCiAgICAgICAgICAgICAgICBfc2VsZi5vblJlc2l6ZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0VGhlbWUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHRoZW1lVmFsdWU7DQogICAgfTsNCg0KICAgIC8vIE1ldGhvZHMgYWxsb3dzIHRvIGFkZCAvIHJlbW92ZSBDU1MgY2xhc3NuYW1lcyB0byB0aGUgZWRpdG9yIGVsZW1lbnQuDQogICAgLy8gVGhpcyBmZWF0dXJlIGNhbiBiZSB1c2VkIGJ5IHBsdWctaW5zIHRvIHByb3ZpZGUgYSB2aXN1YWwgaW5kaWNhdGlvbiBvZg0KICAgIC8vIGEgY2VydGFpbiBtb2RlIHRoYXQgZWRpdG9yIGlzIGluLg0KDQogICAgdGhpcy5zZXRTdHlsZSA9IGZ1bmN0aW9uIHNldFN0eWxlKHN0eWxlKSB7DQogICAgICBkb20uYWRkQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsIHN0eWxlKTsNCiAgICB9Ow0KDQogICAgdGhpcy51bnNldFN0eWxlID0gZnVuY3Rpb24gdW5zZXRTdHlsZShzdHlsZSkgew0KICAgICAgZG9tLnJlbW92ZUNzc0NsYXNzKHRoaXMuY29udGFpbmVyLCBzdHlsZSk7DQogICAgfTsNCg0KICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiR0ZXh0TGF5ZXIuZGVzdHJveSgpOw0KICAgICAgICB0aGlzLiRjdXJzb3JMYXllci5kZXN0cm95KCk7DQogICAgfTsNCg0KfSkuY2FsbChWaXJ0dWFsUmVuZGVyZXIucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5WaXJ0dWFsUmVuZGVyZXIgPSBWaXJ0dWFsUmVuZGVyZXI7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIEp1bGlhbiBWaWVyZWNrIDxqdWxpYW4gRE9UIHZpZXJlY2sgQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9sYXllci9ndXR0ZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZG9tJywgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQoNCnZhciBHdXR0ZXIgPSBmdW5jdGlvbihwYXJlbnRFbCkgew0KICAgIHRoaXMuZWxlbWVudCA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gImFjZV9sYXllciBhY2VfZ3V0dGVyLWxheWVyIjsNCiAgICBwYXJlbnRFbC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpOw0KICAgIHRoaXMuc2V0U2hvd0ZvbGRXaWRnZXRzKHRoaXMuJHNob3dGb2xkV2lkZ2V0cyk7DQogICAgDQogICAgdGhpcy5ndXR0ZXJXaWR0aCA9IDA7DQoNCiAgICB0aGlzLiRicmVha3BvaW50cyA9IFtdOw0KICAgIHRoaXMuJGFubm90YXRpb25zID0gW107DQogICAgdGhpcy4kZGVjb3JhdGlvbnMgPSBbXTsNCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCiAgICANCiAgICB0aGlzLnNldFNlc3Npb24gPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247DQogICAgfTsNCg0KICAgIHRoaXMuYWRkR3V0dGVyRGVjb3JhdGlvbiA9IGZ1bmN0aW9uKHJvdywgY2xhc3NOYW1lKXsNCiAgICAgICAgaWYgKCF0aGlzLiRkZWNvcmF0aW9uc1tyb3ddKQ0KICAgICAgICAgICAgdGhpcy4kZGVjb3JhdGlvbnNbcm93XSA9ICIiOw0KICAgICAgICB0aGlzLiRkZWNvcmF0aW9uc1tyb3ddICs9ICIgYWNlXyIgKyBjbGFzc05hbWU7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbiA9IGZ1bmN0aW9uKHJvdywgY2xhc3NOYW1lKXsNCiAgICAgICAgdGhpcy4kZGVjb3JhdGlvbnNbcm93XSA9IHRoaXMuJGRlY29yYXRpb25zW3Jvd10ucmVwbGFjZSgiIGFjZV8iICsgY2xhc3NOYW1lLCAiIik7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0QnJlYWtwb2ludHMgPSBmdW5jdGlvbihyb3dzKSB7DQogICAgICAgIHRoaXMuJGJyZWFrcG9pbnRzID0gcm93cy5jb25jYXQoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uKGFubm90YXRpb25zKSB7DQogICAgICAgIC8vIGl0ZXJhdGUgb3ZlciBzcGFyc2UgYXJyYXkNCiAgICAgICAgdGhpcy4kYW5ub3RhdGlvbnMgPSBbXTsNCiAgICAgICAgZm9yICh2YXIgcm93IGluIGFubm90YXRpb25zKSBpZiAoYW5ub3RhdGlvbnMuaGFzT3duUHJvcGVydHkocm93KSkgew0KICAgICAgICAgICAgdmFyIHJvd0Fubm90YXRpb25zID0gYW5ub3RhdGlvbnNbcm93XTsNCiAgICAgICAgICAgIGlmICghcm93QW5ub3RhdGlvbnMpDQogICAgICAgICAgICAgICAgY29udGludWU7DQoNCiAgICAgICAgICAgIHZhciByb3dJbmZvID0gdGhpcy4kYW5ub3RhdGlvbnNbcm93XSA9IHsNCiAgICAgICAgICAgICAgICB0ZXh0OiBbXQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxyb3dBbm5vdGF0aW9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBhbm5vdGF0aW9uID0gcm93QW5ub3RhdGlvbnNbaV07DQogICAgICAgICAgICAgICAgdmFyIGFubm9UZXh0ID0gYW5ub3RhdGlvbi50ZXh0LnJlcGxhY2UoLyIvZywgIiZxdW90OyIpLnJlcGxhY2UoLycvZywgIiYjODIxNzsiKS5yZXBsYWNlKC88LywgIiZsdDsiKTsNCiAgICAgICAgICAgICAgICBpZiAocm93SW5mby50ZXh0LmluZGV4T2YoYW5ub1RleHQpID09PSAtMSkNCiAgICAgICAgICAgICAgICAgICAgcm93SW5mby50ZXh0LnB1c2goYW5ub1RleHQpOw0KICAgICAgICAgICAgICAgIHZhciB0eXBlID0gYW5ub3RhdGlvbi50eXBlOw0KICAgICAgICAgICAgICAgIGlmICh0eXBlID09ICJlcnJvciIpDQogICAgICAgICAgICAgICAgICAgIHJvd0luZm8uY2xhc3NOYW1lID0gImFjZV9lcnJvciI7DQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAid2FybmluZyIgJiYgcm93SW5mby5jbGFzc05hbWUgIT0gImFjZV9lcnJvciIpDQogICAgICAgICAgICAgICAgICAgIHJvd0luZm8uY2xhc3NOYW1lID0gImFjZV93YXJuaW5nIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09ICJpbmZvIiAmJiAoIXJvd0luZm8uY2xhc3NOYW1lKSkNCiAgICAgICAgICAgICAgICAgICAgcm93SW5mby5jbGFzc05hbWUgPSAiYWNlX2luZm8iOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMudXBkYXRlID0gZnVuY3Rpb24oY29uZmlnKSB7DQogICAgICAgIHRoaXMuJGNvbmZpZyA9IGNvbmZpZzsNCg0KICAgICAgICB2YXIgZW1wdHlBbm5vID0ge2NsYXNzTmFtZTogIiIsIHRleHQ6IFtdfTsNCiAgICAgICAgdmFyIGh0bWwgPSBbXTsNCiAgICAgICAgdmFyIGkgPSBjb25maWcuZmlyc3RSb3c7DQogICAgICAgIHZhciBsYXN0Um93ID0gY29uZmlnLmxhc3RSb3c7DQogICAgICAgIHZhciBmb2xkID0gdGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShpKTsNCiAgICAgICAgdmFyIGZvbGRTdGFydCA9IGZvbGQgPyBmb2xkLnN0YXJ0LnJvdyA6IEluZmluaXR5Ow0KICAgICAgICB2YXIgZm9sZFdpZGdldHMgPSB0aGlzLiRzaG93Rm9sZFdpZGdldHMgJiYgdGhpcy5zZXNzaW9uLmZvbGRXaWRnZXRzOw0KDQogICAgICAgIHdoaWxlICh0cnVlKSB7DQogICAgICAgICAgICBpZihpID4gZm9sZFN0YXJ0KSB7DQogICAgICAgICAgICAgICAgaSA9IGZvbGQuZW5kLnJvdyArIDE7DQogICAgICAgICAgICAgICAgZm9sZCA9IHRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUoaSwgZm9sZCk7DQogICAgICAgICAgICAgICAgZm9sZFN0YXJ0ID0gZm9sZCA/Zm9sZC5zdGFydC5yb3cgOkluZmluaXR5Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoaSA+IGxhc3RSb3cpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIHZhciBhbm5vdGF0aW9uID0gdGhpcy4kYW5ub3RhdGlvbnNbaV0gfHwgZW1wdHlBbm5vOw0KICAgICAgICAgICAgaHRtbC5wdXNoKCI8ZGl2IGNsYXNzPSdhY2VfZ3V0dGVyLWNlbGwiLA0KICAgICAgICAgICAgICAgIHRoaXMuJGRlY29yYXRpb25zW2ldIHx8ICIiLA0KICAgICAgICAgICAgICAgIHRoaXMuJGJyZWFrcG9pbnRzW2ldID8gIiBhY2VfYnJlYWtwb2ludCAiIDogIiAiLA0KICAgICAgICAgICAgICAgIGFubm90YXRpb24uY2xhc3NOYW1lLA0KICAgICAgICAgICAgICAgICInIHRpdGxlPSciLCBhbm5vdGF0aW9uLnRleHQuam9pbigiXG4iKSwNCiAgICAgICAgICAgICAgICAiJyBzdHlsZT0naGVpZ2h0OiIsIGNvbmZpZy5saW5lSGVpZ2h0LCAicHg7Jz4iLCAoaSsxKSk7DQoNCiAgICAgICAgICAgIGlmIChmb2xkV2lkZ2V0cykgew0KICAgICAgICAgICAgICAgIHZhciBjID0gZm9sZFdpZGdldHNbaV07DQogICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgY2FjaGVkIHZhbHVlIGlzIGludmFsaWRhdGVkIGFuZCB3ZSBuZWVkIHRvIHJlY29tcHV0ZQ0KICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwpDQogICAgICAgICAgICAgICAgICAgIGMgPSBmb2xkV2lkZ2V0c1tpXSA9IHRoaXMuc2Vzc2lvbi5nZXRGb2xkV2lkZ2V0KGkpOw0KICAgICAgICAgICAgICAgIGlmIChjKQ0KICAgICAgICAgICAgICAgICAgICBodG1sLnB1c2goDQogICAgICAgICAgICAgICAgICAgICAgICAiPHNwYW4gY2xhc3M9J2FjZV9mb2xkLXdpZGdldCAiLCBjLA0KICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAic3RhcnQiICYmIGkgPT0gZm9sZFN0YXJ0ICYmIGkgPCBmb2xkLmVuZC5yb3cgPyAiIGNsb3NlZCIgOiAiIG9wZW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgIic+PC9zcGFuPiINCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIHdyYXBwZWRSb3dMZW5ndGggPSB0aGlzLnNlc3Npb24uZ2V0Um93TGVuZ3RoKGkpIC0gMTsNCiAgICAgICAgICAgIHdoaWxlICh3cmFwcGVkUm93TGVuZ3RoLS0pIHsNCiAgICAgICAgICAgICAgICBodG1sLnB1c2goIjwvZGl2PjxkaXYgY2xhc3M9J2FjZV9ndXR0ZXItY2VsbCcgc3R5bGU9J2hlaWdodDoiLCBjb25maWcubGluZUhlaWdodCwgInB4Jz5ceEE2Iik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGh0bWwucHVzaCgiPC9kaXY+Iik7DQoNCiAgICAgICAgICAgIGkrKzsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmVsZW1lbnQgPSBkb20uc2V0SW5uZXJIdG1sKHRoaXMuZWxlbWVudCwgaHRtbC5qb2luKCIiKSk7DQogICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBjb25maWcubWluSGVpZ2h0ICsgInB4IjsNCiAgICAgICAgDQogICAgICAgIHZhciBndXR0ZXJXaWR0aCA9IHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aDsNCiAgICAgICAgaWYgKGd1dHRlcldpZHRoICE9PSB0aGlzLmd1dHRlcldpZHRoKSB7DQogICAgICAgICAgICB0aGlzLmd1dHRlcldpZHRoID0gZ3V0dGVyV2lkdGg7DQogICAgICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VHdXR0ZXJXaWR0aCIsIGd1dHRlcldpZHRoKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLiRzaG93Rm9sZFdpZGdldHMgPSB0cnVlOw0KICAgIHRoaXMuc2V0U2hvd0ZvbGRXaWRnZXRzID0gZnVuY3Rpb24oc2hvdykgew0KICAgICAgICBpZiAoc2hvdykNCiAgICAgICAgICAgIGRvbS5hZGRDc3NDbGFzcyh0aGlzLmVsZW1lbnQsICJhY2VfZm9sZGluZy1lbmFibGVkIik7DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIGRvbS5yZW1vdmVDc3NDbGFzcyh0aGlzLmVsZW1lbnQsICJhY2VfZm9sZGluZy1lbmFibGVkIik7DQoNCiAgICAgICAgdGhpcy4kc2hvd0ZvbGRXaWRnZXRzID0gc2hvdzsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0U2hvd0ZvbGRXaWRnZXRzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRzaG93Rm9sZFdpZGdldHM7DQogICAgfTsNCg0KfSkuY2FsbChHdXR0ZXIucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5HdXR0ZXIgPSBHdXR0ZXI7DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgSnVsaWFuIFZpZXJlY2sgPGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9sYXllci9tYXJrZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZScsICdhY2UvbGliL2RvbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQoNCnZhciBNYXJrZXIgPSBmdW5jdGlvbihwYXJlbnRFbCkgew0KICAgIHRoaXMuZWxlbWVudCA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gImFjZV9sYXllciBhY2VfbWFya2VyLWxheWVyIjsNCiAgICBwYXJlbnRFbC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpOw0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy4kcGFkZGluZyA9IDA7DQoNCiAgICB0aGlzLnNldFBhZGRpbmcgPSBmdW5jdGlvbihwYWRkaW5nKSB7DQogICAgICAgIHRoaXMuJHBhZGRpbmcgPSBwYWRkaW5nOw0KICAgIH07DQogICAgdGhpcy5zZXRTZXNzaW9uID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOw0KICAgIH07DQogICAgDQogICAgdGhpcy5zZXRNYXJrZXJzID0gZnVuY3Rpb24obWFya2Vycykgew0KICAgICAgICB0aGlzLm1hcmtlcnMgPSBtYXJrZXJzOw0KICAgIH07DQoNCiAgICB0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKGNvbmZpZykgew0KICAgICAgICB2YXIgY29uZmlnID0gY29uZmlnIHx8IHRoaXMuY29uZmlnOw0KICAgICAgICBpZiAoIWNvbmZpZykNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsNCg0KDQogICAgICAgIHZhciBodG1sID0gW107DQogICAgICAgIGZvciAoIHZhciBrZXkgaW4gdGhpcy5tYXJrZXJzKSB7DQogICAgICAgICAgICB2YXIgbWFya2VyID0gdGhpcy5tYXJrZXJzW2tleV07DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IG1hcmtlci5yYW5nZS5jbGlwUm93cyhjb25maWcuZmlyc3RSb3csIGNvbmZpZy5sYXN0Um93KTsNCiAgICAgICAgICAgIGlmIChyYW5nZS5pc0VtcHR5KCkpIGNvbnRpbnVlOw0KDQogICAgICAgICAgICByYW5nZSA9IHJhbmdlLnRvU2NyZWVuUmFuZ2UodGhpcy5zZXNzaW9uKTsNCiAgICAgICAgICAgIGlmIChtYXJrZXIucmVuZGVyZXIpIHsNCiAgICAgICAgICAgICAgICB2YXIgdG9wID0gdGhpcy4kZ2V0VG9wKHJhbmdlLnN0YXJ0LnJvdywgY29uZmlnKTsNCiAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IE1hdGgucm91bmQoDQogICAgICAgICAgICAgICAgICAgIHRoaXMuJHBhZGRpbmcgKyByYW5nZS5zdGFydC5jb2x1bW4gKiBjb25maWcuY2hhcmFjdGVyV2lkdGgNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIG1hcmtlci5yZW5kZXJlcihodG1sLCByYW5nZSwgbGVmdCwgdG9wLCBjb25maWcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2UuaXNNdWx0aUxpbmUoKSkgew0KICAgICAgICAgICAgICAgIGlmIChtYXJrZXIudHlwZSA9PSAidGV4dCIpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3VGV4dE1hcmtlcihodG1sLCByYW5nZSwgbWFya2VyLmNsYXp6LCBjb25maWcpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd011bHRpTGluZU1hcmtlcigNCiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwsIHJhbmdlLCBtYXJrZXIuY2xhenosIGNvbmZpZywNCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci50eXBlDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgdGhpcy5kcmF3U2luZ2xlTGluZU1hcmtlcigNCiAgICAgICAgICAgICAgICAgICAgaHRtbCwgcmFuZ2UsIG1hcmtlci5jbGF6eiwgY29uZmlnLA0KICAgICAgICAgICAgICAgICAgICBudWxsLCBtYXJrZXIudHlwZQ0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5lbGVtZW50ID0gZG9tLnNldElubmVySHRtbCh0aGlzLmVsZW1lbnQsIGh0bWwuam9pbigiIikpOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRUb3AgPSBmdW5jdGlvbihyb3csIGxheWVyQ29uZmlnKSB7DQogICAgICAgIHJldHVybiAocm93IC0gbGF5ZXJDb25maWcuZmlyc3RSb3dTY3JlZW4pICogbGF5ZXJDb25maWcubGluZUhlaWdodDsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogRHJhd3MgYSBtYXJrZXIsIHdoaWNoIHNwYW5zIGEgcmFuZ2Ugb2YgdGV4dCBpbiBhIHNpbmdsZSBsaW5lDQogICAgICovIA0KICAgIHRoaXMuZHJhd1RleHRNYXJrZXIgPSBmdW5jdGlvbihzdHJpbmdCdWlsZGVyLCByYW5nZSwgY2xhenosIGxheWVyQ29uZmlnKSB7DQogICAgICAgIC8vIHNlbGVjdGlvbiBzdGFydA0KICAgICAgICB2YXIgcm93ID0gcmFuZ2Uuc3RhcnQucm93Ow0KDQogICAgICAgIHZhciBsaW5lUmFuZ2UgPSBuZXcgUmFuZ2UoDQogICAgICAgICAgICByb3csIHJhbmdlLnN0YXJ0LmNvbHVtbiwNCiAgICAgICAgICAgIHJvdywgdGhpcy5zZXNzaW9uLmdldFNjcmVlbkxhc3RSb3dDb2x1bW4ocm93KQ0KICAgICAgICApOw0KICAgICAgICB0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyKHN0cmluZ0J1aWxkZXIsIGxpbmVSYW5nZSwgY2xhenosIGxheWVyQ29uZmlnLCAxLCAidGV4dCIpOw0KDQogICAgICAgIC8vIHNlbGVjdGlvbiBlbmQNCiAgICAgICAgcm93ID0gcmFuZ2UuZW5kLnJvdzsNCiAgICAgICAgbGluZVJhbmdlID0gbmV3IFJhbmdlKHJvdywgMCwgcm93LCByYW5nZS5lbmQuY29sdW1uKTsNCiAgICAgICAgdGhpcy5kcmF3U2luZ2xlTGluZU1hcmtlcihzdHJpbmdCdWlsZGVyLCBsaW5lUmFuZ2UsIGNsYXp6LCBsYXllckNvbmZpZywgMCwgInRleHQiKTsNCg0KICAgICAgICBmb3IgKHJvdyA9IHJhbmdlLnN0YXJ0LnJvdyArIDE7IHJvdyA8IHJhbmdlLmVuZC5yb3c7IHJvdysrKSB7DQogICAgICAgICAgICBsaW5lUmFuZ2Uuc3RhcnQucm93ID0gcm93Ow0KICAgICAgICAgICAgbGluZVJhbmdlLmVuZC5yb3cgPSByb3c7DQogICAgICAgICAgICBsaW5lUmFuZ2UuZW5kLmNvbHVtbiA9IHRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5MYXN0Um93Q29sdW1uKHJvdyk7DQogICAgICAgICAgICB0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyKHN0cmluZ0J1aWxkZXIsIGxpbmVSYW5nZSwgY2xhenosIGxheWVyQ29uZmlnLCAxLCAidGV4dCIpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIERyYXdzIGEgbXVsdGkgbGluZSBtYXJrZXIsIHdoZXJlIGxpbmVzIHNwYW4gdGhlIGZ1bGwgd2lkdGgNCiAgICAgKi8NCiAgICAgdGhpcy5kcmF3TXVsdGlMaW5lTWFya2VyID0gZnVuY3Rpb24oc3RyaW5nQnVpbGRlciwgcmFuZ2UsIGNsYXp6LCBsYXllckNvbmZpZywgdHlwZSkgew0KICAgICAgICB2YXIgcGFkZGluZyA9IHR5cGUgPT09ICJiYWNrZ3JvdW5kIiA/IDAgOiB0aGlzLiRwYWRkaW5nOw0KICAgICAgICB2YXIgbGF5ZXJXaWR0aCA9IGxheWVyQ29uZmlnLndpZHRoICsgMiAqIHRoaXMuJHBhZGRpbmcgLSBwYWRkaW5nOw0KICAgICAgICAvLyBmcm9tIHNlbGVjdGlvbiBzdGFydCB0byB0aGUgZW5kIG9mIHRoZSBsaW5lDQogICAgICAgIHZhciBoZWlnaHQgPSBsYXllckNvbmZpZy5saW5lSGVpZ2h0Ow0KICAgICAgICB2YXIgd2lkdGggPSBNYXRoLnJvdW5kKGxheWVyV2lkdGggLSAocmFuZ2Uuc3RhcnQuY29sdW1uICogbGF5ZXJDb25maWcuY2hhcmFjdGVyV2lkdGgpKTsNCiAgICAgICAgdmFyIHRvcCA9IHRoaXMuJGdldFRvcChyYW5nZS5zdGFydC5yb3csIGxheWVyQ29uZmlnKTsNCiAgICAgICAgdmFyIGxlZnQgPSBNYXRoLnJvdW5kKA0KICAgICAgICAgICAgcGFkZGluZyArIHJhbmdlLnN0YXJ0LmNvbHVtbiAqIGxheWVyQ29uZmlnLmNoYXJhY3RlcldpZHRoDQogICAgICAgICk7DQoNCiAgICAgICAgc3RyaW5nQnVpbGRlci5wdXNoKA0KICAgICAgICAgICAgIjxkaXYgY2xhc3M9JyIsIGNsYXp6LCAiJyBzdHlsZT0nIiwNCiAgICAgICAgICAgICJoZWlnaHQ6IiwgaGVpZ2h0LCAicHg7IiwNCiAgICAgICAgICAgICJ3aWR0aDoiLCB3aWR0aCwgInB4OyIsDQogICAgICAgICAgICAidG9wOiIsIHRvcCwgInB4OyIsDQogICAgICAgICAgICAibGVmdDoiLCBsZWZ0LCAicHg7Jz48L2Rpdj4iDQogICAgICAgICk7DQoNCiAgICAgICAgLy8gZnJvbSBzdGFydCBvZiB0aGUgbGFzdCBsaW5lIHRvIHRoZSBzZWxlY3Rpb24gZW5kDQogICAgICAgIHRvcCA9IHRoaXMuJGdldFRvcChyYW5nZS5lbmQucm93LCBsYXllckNvbmZpZyk7DQogICAgICAgIHdpZHRoID0gTWF0aC5yb3VuZChyYW5nZS5lbmQuY29sdW1uICogbGF5ZXJDb25maWcuY2hhcmFjdGVyV2lkdGgpOw0KDQogICAgICAgIHN0cmluZ0J1aWxkZXIucHVzaCgNCiAgICAgICAgICAgICI8ZGl2IGNsYXNzPSciLCBjbGF6eiwgIicgc3R5bGU9JyIsDQogICAgICAgICAgICAiaGVpZ2h0OiIsIGhlaWdodCwgInB4OyIsDQogICAgICAgICAgICAid2lkdGg6Iiwgd2lkdGgsICJweDsiLA0KICAgICAgICAgICAgInRvcDoiLCB0b3AsICJweDsiLA0KICAgICAgICAgICAgImxlZnQ6IiwgcGFkZGluZywgInB4Oyc+PC9kaXY+Ig0KICAgICAgICApOw0KDQogICAgICAgIC8vIGFsbCB0aGUgY29tcGxldGUgbGluZXMNCiAgICAgICAgaGVpZ2h0ID0gKHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3cgLSAxKSAqIGxheWVyQ29uZmlnLmxpbmVIZWlnaHQ7DQogICAgICAgIGlmIChoZWlnaHQgPCAwKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB0b3AgPSB0aGlzLiRnZXRUb3AocmFuZ2Uuc3RhcnQucm93ICsgMSwgbGF5ZXJDb25maWcpOw0KDQogICAgICAgIHN0cmluZ0J1aWxkZXIucHVzaCgNCiAgICAgICAgICAgICI8ZGl2IGNsYXNzPSciLCBjbGF6eiwgIicgc3R5bGU9JyIsDQogICAgICAgICAgICAiaGVpZ2h0OiIsIGhlaWdodCwgInB4OyIsDQogICAgICAgICAgICAid2lkdGg6IiwgbGF5ZXJXaWR0aCwgInB4OyIsDQogICAgICAgICAgICAidG9wOiIsIHRvcCwgInB4OyIsDQogICAgICAgICAgICAibGVmdDoiLCBwYWRkaW5nLCAicHg7Jz48L2Rpdj4iDQogICAgICAgICk7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIERyYXdzIGEgbWFya2VyIHdoaWNoIGNvdmVycyBvbmUgc2luZ2xlIGZ1bGwgbGluZQ0KICAgICAqLw0KICAgIHRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXIgPSBmdW5jdGlvbihzdHJpbmdCdWlsZGVyLCByYW5nZSwgY2xhenosIGxheWVyQ29uZmlnLCBleHRyYUxlbmd0aCwgdHlwZSkgew0KICAgICAgICB2YXIgcGFkZGluZyA9IHR5cGUgPT09ICJiYWNrZ3JvdW5kIiA/IDAgOiB0aGlzLiRwYWRkaW5nOw0KICAgICAgICB2YXIgaGVpZ2h0ID0gbGF5ZXJDb25maWcubGluZUhlaWdodDsNCg0KICAgICAgICBpZiAodHlwZSA9PT0gImJhY2tncm91bmQiKQ0KICAgICAgICAgICAgdmFyIHdpZHRoID0gbGF5ZXJDb25maWcud2lkdGg7DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIHdpZHRoID0gTWF0aC5yb3VuZCgocmFuZ2UuZW5kLmNvbHVtbiArIChleHRyYUxlbmd0aCB8fCAwKSAtIHJhbmdlLnN0YXJ0LmNvbHVtbikgKiBsYXllckNvbmZpZy5jaGFyYWN0ZXJXaWR0aCk7DQoNCiAgICAgICAgdmFyIHRvcCA9IHRoaXMuJGdldFRvcChyYW5nZS5zdGFydC5yb3csIGxheWVyQ29uZmlnKTsNCiAgICAgICAgdmFyIGxlZnQgPSBNYXRoLnJvdW5kKA0KICAgICAgICAgICAgcGFkZGluZyArIHJhbmdlLnN0YXJ0LmNvbHVtbiAqIGxheWVyQ29uZmlnLmNoYXJhY3RlcldpZHRoDQogICAgICAgICk7DQoNCiAgICAgICAgc3RyaW5nQnVpbGRlci5wdXNoKA0KICAgICAgICAgICAgIjxkaXYgY2xhc3M9JyIsIGNsYXp6LCAiJyBzdHlsZT0nIiwNCiAgICAgICAgICAgICJoZWlnaHQ6IiwgaGVpZ2h0LCAicHg7IiwNCiAgICAgICAgICAgICJ3aWR0aDoiLCB3aWR0aCwgInB4OyIsDQogICAgICAgICAgICAidG9wOiIsIHRvcCwgInB4OyIsDQogICAgICAgICAgICAibGVmdDoiLCBsZWZ0LCJweDsnPjwvZGl2PiINCiAgICAgICAgKTsNCiAgICB9Ow0KDQp9KS5jYWxsKE1hcmtlci5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1hcmtlciA9IE1hcmtlcjsNCg0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBKdWxpYW4gVmllcmVjayA8anVsaWFuIERPVCB2aWVyZWNrIEFUIGdtYWlsIERPVCBjb20+DQogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaS5zdWNhbkBnbWFpbC5jb20+DQogKiAgICAgIElyYWtsaSBHb3phbGlzaHZpbGkgPHJmb2JpY0BnbWFpbC5jb20+IChodHRwOi8vamVkaXRvb2xraXQuY29tKQ0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2xheWVyL3RleHQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZG9tJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbGliL3VzZXJhZ2VudCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIHVzZXJhZ2VudCA9IHJlcXVpcmUoIi4uL2xpYi91c2VyYWdlbnQiKTsNCnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsNCg0KdmFyIFRleHQgPSBmdW5jdGlvbihwYXJlbnRFbCkgew0KICAgIHRoaXMuZWxlbWVudCA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gImFjZV9sYXllciBhY2VfdGV4dC1sYXllciI7DQogICAgcGFyZW50RWwuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTsNCg0KICAgIHRoaXMuJGNoYXJhY3RlclNpemUgPSB0aGlzLiRtZWFzdXJlU2l6ZXMoKSB8fCB7d2lkdGg6IDAsIGhlaWdodDogMH07DQogICAgdGhpcy4kcG9sbFNpemVDaGFuZ2VzKCk7DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7DQoNCiAgICB0aGlzLkVPRl9DSEFSID0gIlx4QjYiOyAvLyImcGFyYTsiOw0KICAgIHRoaXMuRU9MX0NIQVIgPSAiXHhBQyI7IC8vIiZub3Q7IjsNCiAgICB0aGlzLlRBQl9DSEFSID0gIlx1MjE5MiI7IC8vIiZyYXJyOyI7DQogICAgdGhpcy5TUEFDRV9DSEFSID0gIlx4QjciOyAvLyImbWlkZG90OyI7DQogICAgdGhpcy4kcGFkZGluZyA9IDA7DQoNCiAgICB0aGlzLnNldFBhZGRpbmcgPSBmdW5jdGlvbihwYWRkaW5nKSB7DQogICAgICAgIHRoaXMuJHBhZGRpbmcgPSBwYWRkaW5nOw0KICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICIwICIgKyBwYWRkaW5nICsgInB4IjsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRMaW5lSGVpZ2h0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRjaGFyYWN0ZXJTaXplLmhlaWdodCB8fCAxOw0KICAgIH07DQoNCiAgICB0aGlzLmdldENoYXJhY3RlcldpZHRoID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRjaGFyYWN0ZXJTaXplLndpZHRoIHx8IDE7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tGb3JTaXplQ2hhbmdlcyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuJG1lYXN1cmVTaXplcygpOw0KICAgICAgICBpZiAoc2l6ZSAmJiAodGhpcy4kY2hhcmFjdGVyU2l6ZS53aWR0aCAhPT0gc2l6ZS53aWR0aCB8fCB0aGlzLiRjaGFyYWN0ZXJTaXplLmhlaWdodCAhPT0gc2l6ZS5oZWlnaHQpKSB7DQogICAgICAgICAgICB0aGlzLiRjaGFyYWN0ZXJTaXplID0gc2l6ZTsNCiAgICAgICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUNoYXJhY3RlclNpemUiLCB7ZGF0YTogc2l6ZX0pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuJHBvbGxTaXplQ2hhbmdlcyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgc2VsZiA9IHRoaXM7DQogICAgICAgIHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBzZWxmLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKTsNCiAgICAgICAgfSwgNTAwKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZm9udFN0eWxlcyA9IHsNCiAgICAgICAgZm9udEZhbWlseSA6IDEsDQogICAgICAgIGZvbnRTaXplIDogMSwNCiAgICAgICAgZm9udFdlaWdodCA6IDEsDQogICAgICAgIGZvbnRTdHlsZSA6IDEsDQogICAgICAgIGxpbmVIZWlnaHQgOiAxDQogICAgfTsNCg0KICAgIHRoaXMuJG1lYXN1cmVTaXplcyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgbiA9IDEwMDA7DQogICAgICAgIGlmICghdGhpcy4kbWVhc3VyZU5vZGUpIHsNCiAgICAgICAgICAgIHZhciBtZWFzdXJlTm9kZSA9IHRoaXMuJG1lYXN1cmVOb2RlID0gZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICAgICAgdmFyIHN0eWxlID0gbWVhc3VyZU5vZGUuc3R5bGU7DQoNCiAgICAgICAgICAgIHN0eWxlLndpZHRoID0gc3R5bGUuaGVpZ2h0ID0gImF1dG8iOw0KICAgICAgICAgICAgc3R5bGUubGVmdCA9IHN0eWxlLnRvcCA9ICgtbiAqIDQwKSAgKyAicHgiOw0KDQogICAgICAgICAgICBzdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQogICAgICAgICAgICBzdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7DQogICAgICAgICAgICBzdHlsZS5vdmVyZmxvdyA9ICJ2aXNpYmxlIjsNCiAgICAgICAgICAgIHN0eWxlLndoaXRlU3BhY2UgPSAibm93cmFwIjsNCg0KICAgICAgICAgICAgLy8gaW4gRkYgMy42IG1vbm9zcGFjZSBmb250cyBjYW4gaGF2ZSBhIGZpeGVkIHN1YiBwaXhlbCB3aWR0aC4NCiAgICAgICAgICAgIC8vIHRoYXQncyB3aHkgd2UgaGF2ZSB0byBtZWFzdXJlIG1hbnkgY2hhcmFjdGVycw0KICAgICAgICAgICAgLy8gTm90ZTogY2hhcmFjdGVyV2lkdGggY2FuIGJlIGEgZmxvYXQhDQogICAgICAgICAgICBtZWFzdXJlTm9kZS5pbm5lckhUTUwgPSBsYW5nLnN0cmluZ1JlcGVhdCgiWHkiLCBuKTsNCg0KICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHkpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lYXN1cmVOb2RlKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuZWxlbWVudC5wYXJlbnROb2RlOw0KICAgICAgICAgICAgICAgIHdoaWxlICghZG9tLmhhc0Nzc0NsYXNzKGNvbnRhaW5lciwgImFjZV9lZGl0b3IiKSkNCiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7DQogICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKG1lYXN1cmVOb2RlKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyBTaXplIGFuZCB3aWR0aCBjYW4gYmUgbnVsbCBpZiB0aGUgZWRpdG9yIGlzIG5vdCB2aXNpYmxlIG9yDQogICAgICAgIC8vIGRldGFjaGVkIGZyb20gdGhlIGRvY3VtZW50DQogICAgICAgIGlmICghdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoKQ0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQoNCiAgICAgICAgdmFyIHN0eWxlID0gdGhpcy4kbWVhc3VyZU5vZGUuc3R5bGU7DQogICAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gZG9tLmNvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50KTsNCiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiB0aGlzLiRmb250U3R5bGVzKQ0KICAgICAgICAgICAgc3R5bGVbcHJvcF0gPSBjb21wdXRlZFN0eWxlW3Byb3BdOw0KDQogICAgICAgIHZhciBzaXplID0gew0KICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLiRtZWFzdXJlTm9kZS5vZmZzZXRIZWlnaHQsDQogICAgICAgICAgICB3aWR0aDogdGhpcy4kbWVhc3VyZU5vZGUub2Zmc2V0V2lkdGggLyAobiAqIDIpDQogICAgICAgIH07DQoNCiAgICAgICAgLy8gU2l6ZSBhbmQgd2lkdGggY2FuIGJlIG51bGwgaWYgdGhlIGVkaXRvciBpcyBub3QgdmlzaWJsZSBvcg0KICAgICAgICAvLyBkZXRhY2hlZCBmcm9tIHRoZSBkb2N1bWVudA0KICAgICAgICBpZiAoc2l6ZS53aWR0aCA9PSAwICYmIHNpemUuaGVpZ2h0ID09IDApDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCg0KICAgICAgICByZXR1cm4gc2l6ZTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRTZXNzaW9uID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOw0KICAgIH07DQoNCiAgICB0aGlzLnNob3dJbnZpc2libGVzID0gZmFsc2U7DQogICAgdGhpcy5zZXRTaG93SW52aXNpYmxlcyA9IGZ1bmN0aW9uKHNob3dJbnZpc2libGVzKSB7DQogICAgICAgIGlmICh0aGlzLnNob3dJbnZpc2libGVzID09IHNob3dJbnZpc2libGVzKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHRoaXMuc2hvd0ludmlzaWJsZXMgPSBzaG93SW52aXNpYmxlczsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfTsNCg0KICAgIHRoaXMuJHRhYlN0cmluZ3MgPSBbXTsNCiAgICB0aGlzLiRjb21wdXRlVGFiU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciB0YWJTaXplID0gdGhpcy5zZXNzaW9uLmdldFRhYlNpemUoKTsNCiAgICAgICAgdmFyIHRhYlN0ciA9IHRoaXMuJHRhYlN0cmluZ3MgPSBbMF07DQogICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdGFiU2l6ZSArIDE7IGkrKykgew0KICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0ludmlzaWJsZXMpIHsNCiAgICAgICAgICAgICAgICB0YWJTdHIucHVzaCgiPHNwYW4gY2xhc3M9J2FjZV9pbnZpc2libGUnPiINCiAgICAgICAgICAgICAgICAgICAgKyB0aGlzLlRBQl9DSEFSDQogICAgICAgICAgICAgICAgICAgICsgbmV3IEFycmF5KGkpLmpvaW4oIiYjMTYwOyIpDQogICAgICAgICAgICAgICAgICAgICsgIjwvc3Bhbj4iKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdGFiU3RyLnB1c2gobmV3IEFycmF5KGkrMSkuam9pbigiJiMxNjA7IikpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICB9Ow0KDQogICAgdGhpcy51cGRhdGVMaW5lcyA9IGZ1bmN0aW9uKGNvbmZpZywgZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgdGhpcy4kY29tcHV0ZVRhYlN0cmluZygpOw0KICAgICAgICAvLyBEdWUgdG8gd3JhcCBsaW5lIGNoYW5nZXMgdGhlcmUgY2FuIGJlIG5ldyBsaW5lcyBpZiBlLmcuDQogICAgICAgIC8vIHRoZSBsaW5lIHRvIHVwZGF0ZWQgd3JhcHBlZCBpbiB0aGUgbWVhbnRpbWUuDQogICAgICAgIGlmICh0aGlzLmNvbmZpZy5sYXN0Um93ICE9IGNvbmZpZy5sYXN0Um93IHx8DQogICAgICAgICAgICB0aGlzLmNvbmZpZy5maXJzdFJvdyAhPSBjb25maWcuZmlyc3RSb3cpIHsNCiAgICAgICAgICAgIHRoaXMuc2Nyb2xsTGluZXMoY29uZmlnKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsNCg0KICAgICAgICB2YXIgZmlyc3QgPSBNYXRoLm1heChmaXJzdFJvdywgY29uZmlnLmZpcnN0Um93KTsNCiAgICAgICAgdmFyIGxhc3QgPSBNYXRoLm1pbihsYXN0Um93LCBjb25maWcubGFzdFJvdyk7DQoNCiAgICAgICAgdmFyIGxpbmVFbGVtZW50cyA9IHRoaXMuZWxlbWVudC5jaGlsZE5vZGVzOw0KICAgICAgICB2YXIgbGluZUVsZW1lbnRzSWR4ID0gMDsNCg0KICAgICAgICBmb3IgKHZhciByb3cgPSBjb25maWcuZmlyc3RSb3c7IHJvdyA8IGZpcnN0OyByb3crKykgew0KICAgICAgICAgICAgdmFyIGZvbGRMaW5lID0gdGhpcy5zZXNzaW9uLmdldEZvbGRMaW5lKHJvdyk7DQogICAgICAgICAgICBpZiAoZm9sZExpbmUpIHsNCiAgICAgICAgICAgICAgICBpZiAoZm9sZExpbmUuY29udGFpbnNSb3coZmlyc3QpKSB7DQogICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZm9sZExpbmUuc3RhcnQucm93Ow0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByb3cgPSBmb2xkTGluZS5lbmQucm93Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxpbmVFbGVtZW50c0lkeCArKzsNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGk9Zmlyc3Q7IGk8PWxhc3Q7IGkrKykgew0KICAgICAgICAgICAgdmFyIGxpbmVFbGVtZW50ID0gbGluZUVsZW1lbnRzW2xpbmVFbGVtZW50c0lkeCsrXTsNCiAgICAgICAgICAgIGlmICghbGluZUVsZW1lbnQpDQogICAgICAgICAgICAgICAgY29udGludWU7DQoNCiAgICAgICAgICAgIHZhciBodG1sID0gW107DQogICAgICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy5zZXNzaW9uLmdldFRva2VucyhpLCBpKTsNCiAgICAgICAgICAgIHRoaXMuJHJlbmRlckxpbmUoaHRtbCwgaSwgdG9rZW5zWzBdLnRva2VucywgIXRoaXMuJHVzZUxpbmVHcm91cHMoKSk7DQogICAgICAgICAgICBsaW5lRWxlbWVudCA9IGRvbS5zZXRJbm5lckh0bWwobGluZUVsZW1lbnQsIGh0bWwuam9pbigiIikpOw0KDQogICAgICAgICAgICBpID0gdGhpcy5zZXNzaW9uLmdldFJvd0ZvbGRFbmQoaSk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5zY3JvbGxMaW5lcyA9IGZ1bmN0aW9uKGNvbmZpZykgew0KICAgICAgICB0aGlzLiRjb21wdXRlVGFiU3RyaW5nKCk7DQogICAgICAgIHZhciBvbGRDb25maWcgPSB0aGlzLmNvbmZpZzsNCiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7DQoNCiAgICAgICAgaWYgKCFvbGRDb25maWcgfHwgb2xkQ29uZmlnLmxhc3RSb3cgPCBjb25maWcuZmlyc3RSb3cpDQogICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUoY29uZmlnKTsNCg0KICAgICAgICBpZiAoY29uZmlnLmxhc3RSb3cgPCBvbGRDb25maWcuZmlyc3RSb3cpDQogICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUoY29uZmlnKTsNCg0KICAgICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnQ7DQogICAgICAgIGlmIChvbGRDb25maWcuZmlyc3RSb3cgPCBjb25maWcuZmlyc3RSb3cpDQogICAgICAgICAgICBmb3IgKHZhciByb3c9dGhpcy5zZXNzaW9uLmdldEZvbGRlZFJvd0NvdW50KG9sZENvbmZpZy5maXJzdFJvdywgY29uZmlnLmZpcnN0Um93IC0gMSk7IHJvdz4wOyByb3ctLSkNCiAgICAgICAgICAgICAgICBlbC5yZW1vdmVDaGlsZChlbC5maXJzdENoaWxkKTsNCg0KICAgICAgICBpZiAob2xkQ29uZmlnLmxhc3RSb3cgPiBjb25maWcubGFzdFJvdykNCiAgICAgICAgICAgIGZvciAodmFyIHJvdz10aGlzLnNlc3Npb24uZ2V0Rm9sZGVkUm93Q291bnQoY29uZmlnLmxhc3RSb3cgKyAxLCBvbGRDb25maWcubGFzdFJvdyk7IHJvdz4wOyByb3ctLSkNCiAgICAgICAgICAgICAgICBlbC5yZW1vdmVDaGlsZChlbC5sYXN0Q2hpbGQpOw0KDQogICAgICAgIGlmIChjb25maWcuZmlyc3RSb3cgPCBvbGRDb25maWcuZmlyc3RSb3cpIHsNCiAgICAgICAgICAgIHZhciBmcmFnbWVudCA9IHRoaXMuJHJlbmRlckxpbmVzRnJhZ21lbnQoY29uZmlnLCBjb25maWcuZmlyc3RSb3csIG9sZENvbmZpZy5maXJzdFJvdyAtIDEpOw0KICAgICAgICAgICAgaWYgKGVsLmZpcnN0Q2hpbGQpDQogICAgICAgICAgICAgICAgZWwuaW5zZXJ0QmVmb3JlKGZyYWdtZW50LCBlbC5maXJzdENoaWxkKTsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICBlbC5hcHBlbmRDaGlsZChmcmFnbWVudCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoY29uZmlnLmxhc3RSb3cgPiBvbGRDb25maWcubGFzdFJvdykgew0KICAgICAgICAgICAgdmFyIGZyYWdtZW50ID0gdGhpcy4kcmVuZGVyTGluZXNGcmFnbWVudChjb25maWcsIG9sZENvbmZpZy5sYXN0Um93ICsgMSwgY29uZmlnLmxhc3RSb3cpOw0KICAgICAgICAgICAgZWwuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuJHJlbmRlckxpbmVzRnJhZ21lbnQgPSBmdW5jdGlvbihjb25maWcsIGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIHZhciBmcmFnbWVudCA9IHRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwNCiAgICAgICAgICAgIHJvdyA9IGZpcnN0Um93LA0KICAgICAgICAgICAgZm9sZCA9IHRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUocm93KSwNCiAgICAgICAgICAgIGZvbGRTdGFydCA9IGZvbGQgP2ZvbGQuc3RhcnQucm93IDpJbmZpbml0eTsNCg0KICAgICAgICB3aGlsZSAodHJ1ZSkgew0KICAgICAgICAgICAgaWYgKHJvdyA+IGZvbGRTdGFydCkgew0KICAgICAgICAgICAgICAgIHJvdyA9IGZvbGQuZW5kLnJvdysxOw0KICAgICAgICAgICAgICAgIGZvbGQgPSB0aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKHJvdywgZm9sZCk7DQogICAgICAgICAgICAgICAgZm9sZFN0YXJ0ID0gZm9sZCA/Zm9sZC5zdGFydC5yb3cgOkluZmluaXR5Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJvdyA+IGxhc3RSb3cpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7DQoNCiAgICAgICAgICAgIHZhciBodG1sID0gW107DQogICAgICAgICAgICAvLyBHZXQgdGhlIHRva2VucyBwZXIgbGluZSBhcyB0aGVyZSBtaWdodCBiZSBzb21lIGxpbmVzIGluIGJldHdlZW4NCiAgICAgICAgICAgIC8vIGJlZWluZyBmb2xkZWQuDQogICAgICAgICAgICAvLyBPUFRJTUlaRTogSWYgdGhlcmUgaXMgYSBsb25nIGJsb2NrIG9mIHVuZm9sZGVkIGxpbmVzLCBqdXN0IG1ha2UNCiAgICAgICAgICAgIC8vIHRoaXMgY2FsbCBvbmNlIGZvciB0aGF0IGJpZyBibG9jayBvZiB1bmZvbGRlZCBsaW5lcy4NCiAgICAgICAgICAgIHZhciB0b2tlbnMgPSB0aGlzLnNlc3Npb24uZ2V0VG9rZW5zKHJvdywgcm93KTsNCiAgICAgICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09IDEpDQogICAgICAgICAgICAgICAgdGhpcy4kcmVuZGVyTGluZShodG1sLCByb3csIHRva2Vuc1swXS50b2tlbnMsIGZhbHNlKTsNCg0KICAgICAgICAgICAgLy8gZG9uJ3QgdXNlIHNldElubmVySHRtbCBzaW5jZSB3ZSBhcmUgd29ya2luZyB3aXRoIGFuIGVtcHR5IERJVg0KICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWwuam9pbigiIik7DQogICAgICAgICAgICBpZiAodGhpcy4kdXNlTGluZUdyb3VwcygpKSB7DQogICAgICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTmFtZSA9ICdhY2VfbGluZV9ncm91cCc7DQogICAgICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gY29udGFpbmVyLmNoaWxkTm9kZXMNCiAgICAgICAgICAgICAgICB3aGlsZShsaW5lcy5sZW5ndGgpDQogICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGxpbmVzWzBdKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcm93Kys7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZyYWdtZW50Ow0KICAgIH07DQoNCiAgICB0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKGNvbmZpZykgew0KICAgICAgICB0aGlzLiRjb21wdXRlVGFiU3RyaW5nKCk7DQogICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOw0KDQogICAgICAgIHZhciBodG1sID0gW107DQogICAgICAgIHZhciBmaXJzdFJvdyA9IGNvbmZpZy5maXJzdFJvdywgbGFzdFJvdyA9IGNvbmZpZy5sYXN0Um93Ow0KDQogICAgICAgIHZhciByb3cgPSBmaXJzdFJvdywNCiAgICAgICAgICAgIGZvbGQgPSB0aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKHJvdyksDQogICAgICAgICAgICBmb2xkU3RhcnQgPSBmb2xkID9mb2xkLnN0YXJ0LnJvdyA6SW5maW5pdHk7DQoNCiAgICAgICAgd2hpbGUgKHRydWUpIHsNCiAgICAgICAgICAgIGlmIChyb3cgPiBmb2xkU3RhcnQpIHsNCiAgICAgICAgICAgICAgICByb3cgPSBmb2xkLmVuZC5yb3crMTsNCiAgICAgICAgICAgICAgICBmb2xkID0gdGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShyb3csIGZvbGQpOw0KICAgICAgICAgICAgICAgIGZvbGRTdGFydCA9IGZvbGQgP2ZvbGQuc3RhcnQucm93IDpJbmZpbml0eTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyb3cgPiBsYXN0Um93KQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBpZiAodGhpcy4kdXNlTGluZUdyb3VwcygpKQ0KICAgICAgICAgICAgICAgIGh0bWwucHVzaCgiPGRpdiBjbGFzcz0nYWNlX2xpbmVfZ3JvdXAnPiIpDQoNCiAgICAgICAgICAgIC8vIEdldCB0aGUgdG9rZW5zIHBlciBsaW5lIGFzIHRoZXJlIG1pZ2h0IGJlIHNvbWUgbGluZXMgaW4gYmV0d2Vlbg0KICAgICAgICAgICAgLy8gYmVlaW5nIGZvbGRlZC4NCiAgICAgICAgICAgIC8vIE9QVElNSVpFOiBJZiB0aGVyZSBpcyBhIGxvbmcgYmxvY2sgb2YgdW5mb2xkZWQgbGluZXMsIGp1c3QgbWFrZQ0KICAgICAgICAgICAgLy8gdGhpcyBjYWxsIG9uY2UgZm9yIHRoYXQgYmlnIGJsb2NrIG9mIHVuZm9sZGVkIGxpbmVzLg0KICAgICAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuc2Vzc2lvbi5nZXRUb2tlbnMocm93LCByb3cpOw0KICAgICAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT0gMSkNCiAgICAgICAgICAgICAgICB0aGlzLiRyZW5kZXJMaW5lKGh0bWwsIHJvdywgdG9rZW5zWzBdLnRva2VucywgZmFsc2UpOw0KDQogICAgICAgICAgICBpZiAodGhpcy4kdXNlTGluZUdyb3VwcygpKQ0KICAgICAgICAgICAgICAgIGh0bWwucHVzaCgiPC9kaXY+Iik7IC8vIGVuZCB0aGUgbGluZSBncm91cA0KDQogICAgICAgICAgICByb3crKzsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmVsZW1lbnQgPSBkb20uc2V0SW5uZXJIdG1sKHRoaXMuZWxlbWVudCwgaHRtbC5qb2luKCIiKSk7DQogICAgfTsNCg0KICAgIHRoaXMuJHRleHRUb2tlbiA9IHsNCiAgICAgICAgInRleHQiOiB0cnVlLA0KICAgICAgICAicnBhcmVuIjogdHJ1ZSwNCiAgICAgICAgImxwYXJlbiI6IHRydWUNCiAgICB9Ow0KDQogICAgdGhpcy4kcmVuZGVyVG9rZW4gPSBmdW5jdGlvbihzdHJpbmdCdWlsZGVyLCBzY3JlZW5Db2x1bW4sIHRva2VuLCB2YWx1ZSkgeyAgICAgICAgDQogICAgICAgIHZhciBzZWxmID0gdGhpczsNCiAgICAgICAgdmFyIHJlcGxhY2VSZWcgPSAvXHR8Jnw8fCggKyl8KFtcdlxmIFx1MDBhMFx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAwYlx1MjAyOFx1MjAyOVx1MzAwMF0pfFtcdTExMDAtXHUxMTVGXXxbXHUxMUEzLVx1MTFBN118W1x1MTFGQS1cdTExRkZdfFtcdTIzMjktXHUyMzJBXXxbXHUyRTgwLVx1MkU5OV18W1x1MkU5Qi1cdTJFRjNdfFtcdTJGMDAtXHUyRkQ1XXxbXHUyRkYwLVx1MkZGQl18W1x1MzAwMC1cdTMwM0VdfFtcdTMwNDEtXHUzMDk2XXxbXHUzMDk5LVx1MzBGRl18W1x1MzEwNS1cdTMxMkRdfFtcdTMxMzEtXHUzMThFXXxbXHUzMTkwLVx1MzFCQV18W1x1MzFDMC1cdTMxRTNdfFtcdTMxRjAtXHUzMjFFXXxbXHUzMjIwLVx1MzI0N118W1x1MzI1MC1cdTMyRkVdfFtcdTMzMDAtXHU0REJGXXxbXHU0RTAwLVx1QTQ4Q118W1x1QTQ5MC1cdUE0QzZdfFtcdUE5NjAtXHVBOTdDXXxbXHVBQzAwLVx1RDdBM118W1x1RDdCMC1cdUQ3QzZdfFtcdUQ3Q0ItXHVEN0ZCXXxbXHVGOTAwLVx1RkFGRl18W1x1RkUxMC1cdUZFMTldfFtcdUZFMzAtXHVGRTUyXXxbXHVGRTU0LVx1RkU2Nl18W1x1RkU2OC1cdUZFNkJdfFtcdUZGMDEtXHVGRjYwXXxbXHVGRkUwLVx1RkZFNl0vZzsNCiAgICAgICAgdmFyIHJlcGxhY2VGdW5jID0gZnVuY3Rpb24oYywgYSwgYiwgdGFiSWR4LCBpZHg0KSB7DQogICAgICAgICAgICBpZiAoYy5jaGFyQ29kZUF0KDApID09IDMyKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheShjLmxlbmd0aCsxKS5qb2luKCImIzE2MDsiKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAiXHQiKSB7DQogICAgICAgICAgICAgICAgdmFyIHRhYlNpemUgPSBzZWxmLnNlc3Npb24uZ2V0U2NyZWVuVGFiU2l6ZShzY3JlZW5Db2x1bW4gKyB0YWJJZHgpOw0KICAgICAgICAgICAgICAgIHNjcmVlbkNvbHVtbiArPSB0YWJTaXplIC0gMTsNCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi4kdGFiU3RyaW5nc1t0YWJTaXplXTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAiJiIpIHsNCiAgICAgICAgICAgICAgICBpZiAodXNlcmFnZW50LmlzT2xkR2Vja28pDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiJiI7DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiZhbXA7IjsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAiPCIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIiZsdDsiOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICJcdTMwMDAiKSB7DQogICAgICAgICAgICAgICAgLy8gVSszMDAwIGlzIGJvdGggaW52aXNpYmxlIEFORCBmdWxsLXdpZHRoLCBzbyBtdXN0IGJlIGhhbmRsZWQgdW5pcXVlbHkNCiAgICAgICAgICAgICAgICB2YXIgY2xhc3NUb1VzZSA9IHNlbGYuc2hvd0ludmlzaWJsZXMgPyAiYWNlX2NqayBhY2VfaW52aXNpYmxlIiA6ICJhY2VfY2prIjsNCiAgICAgICAgICAgICAgICB2YXIgc3BhY2UgPSBzZWxmLnNob3dJbnZpc2libGVzID8gc2VsZi5TUEFDRV9DSEFSIDogIiI7DQogICAgICAgICAgICAgICAgc2NyZWVuQ29sdW1uICs9IDE7DQogICAgICAgICAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz0nIiArIGNsYXNzVG9Vc2UgKyAiJyBzdHlsZT0nd2lkdGg6IiArDQogICAgICAgICAgICAgICAgICAgIChzZWxmLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCAqIDIpICsNCiAgICAgICAgICAgICAgICAgICAgInB4Jz4iICsgc3BhY2UgKyAiPC9zcGFuPiI7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGMubWF0Y2goL1tcdlxmIFx1MDBhMFx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAwYlx1MjAyOFx1MjAyOVx1MzAwMF0vKSkgew0KICAgICAgICAgICAgICAgIGlmIChzZWxmLnNob3dJbnZpc2libGVzKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBzcGFjZSA9IG5ldyBBcnJheShjLmxlbmd0aCsxKS5qb2luKHNlbGYuU1BBQ0VfQ0hBUik7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiPHNwYW4gY2xhc3M9J2FjZV9pbnZpc2libGUnPiIgKyBzcGFjZSArICI8L3NwYW4+IjsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiYjMTYwOyI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBzY3JlZW5Db2x1bW4gKz0gMTsNCiAgICAgICAgICAgICAgICByZXR1cm4gIjxzcGFuIGNsYXNzPSdhY2VfY2prJyBzdHlsZT0nd2lkdGg6IiArDQogICAgICAgICAgICAgICAgICAgIChzZWxmLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCAqIDIpICsNCiAgICAgICAgICAgICAgICAgICAgInB4Jz4iICsgYyArICI8L3NwYW4+IjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCg0KICAgICAgICB2YXIgb3V0cHV0ID0gdmFsdWUucmVwbGFjZShyZXBsYWNlUmVnLCByZXBsYWNlRnVuYyk7DQoNCiAgICAgICAgaWYgKCF0aGlzLiR0ZXh0VG9rZW5bdG9rZW4udHlwZV0pIHsNCiAgICAgICAgICAgIHZhciBjbGFzc2VzID0gImFjZV8iICsgdG9rZW4udHlwZS5yZXBsYWNlKC9cLi9nLCAiIGFjZV8iKTsNCiAgICAgICAgICAgIHZhciBzdHlsZSA9ICIiOw0KICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gImZvbGQiKQ0KICAgICAgICAgICAgICAgIHN0eWxlID0gIiBzdHlsZT0nd2lkdGg6IiArICh0b2tlbi52YWx1ZS5sZW5ndGggKiB0aGlzLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCkgKyAicHg7JyAiOw0KICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5wdXNoKCI8c3BhbiBjbGFzcz0nIiwgY2xhc3NlcywgIiciLCBzdHlsZSwgIj4iLCBvdXRwdXQsICI8L3NwYW4+Iik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBzdHJpbmdCdWlsZGVyLnB1c2gob3V0cHV0KTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gc2NyZWVuQ29sdW1uICsgdmFsdWUubGVuZ3RoOw0KICAgIH07DQoNCiAgICB0aGlzLiRyZW5kZXJMaW5lQ29yZSA9IGZ1bmN0aW9uKHN0cmluZ0J1aWxkZXIsIGxhc3RSb3csIHRva2Vucywgc3BsaXRzLCBvbmx5Q29udGVudHMpIHsNCiAgICAgICAgdmFyIGNoYXJzID0gMDsNCiAgICAgICAgdmFyIHNwbGl0ID0gMDsNCiAgICAgICAgdmFyIHNwbGl0Q2hhcnM7DQogICAgICAgIHZhciBzY3JlZW5Db2x1bW4gPSAwOw0KICAgICAgICB2YXIgc2VsZiA9IHRoaXM7DQoNCiAgICAgICAgaWYgKCFzcGxpdHMgfHwgc3BsaXRzLmxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgc3BsaXRDaGFycyA9IE51bWJlci5NQVhfVkFMVUU7DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIHNwbGl0Q2hhcnMgPSBzcGxpdHNbMF07DQoNCiAgICAgICAgaWYgKCFvbmx5Q29udGVudHMpIHsNCiAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIucHVzaCgiPGRpdiBjbGFzcz0nYWNlX2xpbmUnIHN0eWxlPSdoZWlnaHQ6IiwNCiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5saW5lSGVpZ2h0LCAicHgiLA0KICAgICAgICAgICAgICAgICInPiINCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07DQogICAgICAgICAgICB2YXIgdmFsdWUgPSB0b2tlbi52YWx1ZTsNCg0KICAgICAgICAgICAgaWYgKGNoYXJzICsgdmFsdWUubGVuZ3RoIDwgc3BsaXRDaGFycykgew0KICAgICAgICAgICAgICAgIHNjcmVlbkNvbHVtbiA9IHNlbGYuJHJlbmRlclRva2VuKA0KICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLCBzY3JlZW5Db2x1bW4sIHRva2VuLCB2YWx1ZQ0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgY2hhcnMgKz0gdmFsdWUubGVuZ3RoOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgd2hpbGUgKGNoYXJzICsgdmFsdWUubGVuZ3RoID49IHNwbGl0Q2hhcnMpIHsNCiAgICAgICAgICAgICAgICAgICAgc2NyZWVuQ29sdW1uID0gc2VsZi4kcmVuZGVyVG9rZW4oDQogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLCBzY3JlZW5Db2x1bW4sIA0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4sIHZhbHVlLnN1YnN0cmluZygwLCBzcGxpdENoYXJzIC0gY2hhcnMpDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKHNwbGl0Q2hhcnMgLSBjaGFycyk7DQogICAgICAgICAgICAgICAgICAgIGNoYXJzID0gc3BsaXRDaGFyczsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmICghb25seUNvbnRlbnRzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLnB1c2goIjwvZGl2PiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxkaXYgY2xhc3M9J2FjZV9saW5lJyBzdHlsZT0naGVpZ2h0OiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcubGluZUhlaWdodCwgInB4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJz4iDQogICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgc3BsaXQgKys7DQogICAgICAgICAgICAgICAgICAgIHNjcmVlbkNvbHVtbiA9IDA7DQogICAgICAgICAgICAgICAgICAgIHNwbGl0Q2hhcnMgPSBzcGxpdHNbc3BsaXRdIHx8IE51bWJlci5NQVhfVkFMVUU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT0gMCkgew0KICAgICAgICAgICAgICAgICAgICBjaGFycyArPSB2YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgICAgIHNjcmVlbkNvbHVtbiA9IHNlbGYuJHJlbmRlclRva2VuKA0KICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlciwgc2NyZWVuQ29sdW1uLCB0b2tlbiwgdmFsdWUNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy5zaG93SW52aXNpYmxlcykgew0KICAgICAgICAgICAgaWYgKGxhc3RSb3cgIT09IHRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKSAtIDEpDQogICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5wdXNoKCI8c3BhbiBjbGFzcz0nYWNlX2ludmlzaWJsZSc+IiArIHRoaXMuRU9MX0NIQVIgKyAiPC9zcGFuPiIpOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIucHVzaCgiPHNwYW4gY2xhc3M9J2FjZV9pbnZpc2libGUnPiIgKyB0aGlzLkVPRl9DSEFSICsgIjwvc3Bhbj4iKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIW9ubHlDb250ZW50cykNCiAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIucHVzaCgiPC9kaXY+Iik7DQogICAgfTsNCg0KICAgIHRoaXMuJHJlbmRlckxpbmUgPSBmdW5jdGlvbihzdHJpbmdCdWlsZGVyLCByb3csIHRva2Vucywgb25seUNvbnRlbnRzKSB7DQogICAgICAgIC8vIENoZWNrIGlmIHRoZSBsaW5lIHRvIHJlbmRlciBpcyBmb2xkZWQgb3Igbm90LiBJZiBub3QsIHRoaW5ncyBhcmUNCiAgICAgICAgLy8gc2ltcGxlLCBvdGhlcndpc2UsIHdlIG5lZWQgdG8gZmFrZSBzb21lIHRoaW5ncy4uLg0KICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbi5pc1Jvd0ZvbGRlZChyb3cpKSB7DQogICAgICAgICAgICB2YXIgc3BsaXRzID0gdGhpcy5zZXNzaW9uLmdldFJvd1NwbGl0RGF0YShyb3cpOw0KICAgICAgICAgICAgdGhpcy4kcmVuZGVyTGluZUNvcmUoc3RyaW5nQnVpbGRlciwgcm93LCB0b2tlbnMsIHNwbGl0cywgb25seUNvbnRlbnRzKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMuJHJlbmRlckZvbGRMaW5lKHN0cmluZ0J1aWxkZXIsIHJvdywgdG9rZW5zLCBvbmx5Q29udGVudHMpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuJHJlbmRlckZvbGRMaW5lID0gZnVuY3Rpb24oc3RyaW5nQnVpbGRlciwgcm93LCB0b2tlbnMsIG9ubHlDb250ZW50cykgew0KICAgICAgICB2YXIgc2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbiwNCiAgICAgICAgICAgIGZvbGRMaW5lID0gc2Vzc2lvbi5nZXRGb2xkTGluZShyb3cpLA0KICAgICAgICAgICAgcmVuZGVyVG9rZW5zID0gW107DQoNCiAgICAgICAgZnVuY3Rpb24gYWRkVG9rZW5zKHRva2VucywgZnJvbSwgdG8pIHsNCiAgICAgICAgICAgIHZhciBpZHggPSAwLCBjb2wgPSAwOw0KICAgICAgICAgICAgd2hpbGUgKChjb2wgKyB0b2tlbnNbaWR4XS52YWx1ZS5sZW5ndGgpIDwgZnJvbSkgew0KICAgICAgICAgICAgICAgIGNvbCArPSB0b2tlbnNbaWR4XS52YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgaWR4Kys7DQoNCiAgICAgICAgICAgICAgICBpZiAoaWR4ID09IHRva2Vucy5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChjb2wgIT0gZnJvbSkgew0KICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRva2Vuc1tpZHhdLnZhbHVlLnN1YnN0cmluZyhmcm9tIC0gY29sKTsNCiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdG9rZW4gdmFsdWUgaXMgbG9uZ2VyIHRoZW4gdGhlIGZyb20uLi50byBzcGFjaW5nLg0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAodG8gLSBmcm9tKSkgew0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCB0byAtIGZyb20pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHJlbmRlclRva2Vucy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgdHlwZTogdG9rZW5zW2lkeF0udHlwZSwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlDQogICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICBjb2wgPSBmcm9tICsgdmFsdWUubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGlkeCArPSAxOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB3aGlsZSAoY29sIDwgdG8pIHsNCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0b2tlbnNbaWR4XS52YWx1ZTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoICsgY29sID4gdG8pIHsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdG8gLSBjb2wpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZW5kZXJUb2tlbnMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgIHR5cGU6IHRva2Vuc1tpZHhdLnR5cGUsDQogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZQ0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIGNvbCArPSB2YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgaWR4ICs9IDE7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBmb2xkTGluZS53YWxrKGZ1bmN0aW9uKHBsYWNlaG9sZGVyLCByb3csIGNvbHVtbiwgbGFzdENvbHVtbiwgaXNOZXdSb3cpIHsNCiAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlcikgew0KICAgICAgICAgICAgICAgcmVuZGVyVG9rZW5zLnB1c2goew0KICAgICAgICAgICAgICAgICAgICB0eXBlOiAiZm9sZCIsDQogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwbGFjZWhvbGRlcg0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBpZiAoaXNOZXdSb3cpIHsNCiAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0aGlzLnNlc3Npb24uZ2V0VG9rZW5zKHJvdywgcm93KVswXS50b2tlbnM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICE9IDApIHsNCiAgICAgICAgICAgICAgICAgICAgYWRkVG9rZW5zKHRva2VucywgbGFzdENvbHVtbiwgY29sdW1uKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0uYmluZCh0aGlzKSwgZm9sZExpbmUuZW5kLnJvdywgdGhpcy5zZXNzaW9uLmdldExpbmUoZm9sZExpbmUuZW5kLnJvdykubGVuZ3RoKTsNCg0KICAgICAgICAvLyBUT0RPOiBCdWlsZCBhIGZha2Ugc3BsaXRzIGFycmF5IQ0KICAgICAgICB2YXIgc3BsaXRzID0gdGhpcy5zZXNzaW9uLiR1c2VXcmFwTW9kZT90aGlzLnNlc3Npb24uJHdyYXBEYXRhW3Jvd106bnVsbDsNCiAgICAgICAgdGhpcy4kcmVuZGVyTGluZUNvcmUoc3RyaW5nQnVpbGRlciwgcm93LCByZW5kZXJUb2tlbnMsIHNwbGl0cywgb25seUNvbnRlbnRzKTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuJHVzZUxpbmVHcm91cHMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgLy8gRm9yIHRoZSB1cGRhdGVMaW5lcyBmdW5jdGlvbiB0byB3b3JrIGNvcnJlY3RseSwgaXQncyBpbXBvcnRhbnQgdGhhdCB0aGUNCiAgICAgICAgLy8gY2hpbGQgbm9kZXMgb2YgdGhpcy5lbGVtZW50IGNvcnJlc3BvbmQgb24gYSAxLXRvLTEgYmFzaXMgdG8gcm93cyBpbiB0aGUgDQogICAgICAgIC8vIGRvY3VtZW50IChhcyBkaXN0aW5jdCBmcm9tIGxpbmVzIG9uIHRoZSBzY3JlZW4pLiBGb3Igc2Vzc2lvbnMgdGhhdCBhcmUNCiAgICAgICAgLy8gd3JhcHBlZCwgdGhpcyBtZWFucyB3ZSBuZWVkIHRvIGFkZCBhIGxheWVyIHRvIHRoZSBub2RlIGhpZXJhcmNoeSAodGFnZ2VkDQogICAgICAgIC8vIHdpdGggdGhlIGNsYXNzIG5hbWUgYWNlX2xpbmVfZ3JvdXApLg0KICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCk7DQogICAgfTsNCg0KICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBjbGVhckludGVydmFsKHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyKTsNCiAgICAgICAgaWYgKHRoaXMuJG1lYXN1cmVOb2RlKQ0KICAgICAgICAgICAgdGhpcy4kbWVhc3VyZU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLiRtZWFzdXJlTm9kZSk7DQogICAgICAgIGRlbGV0ZSB0aGlzLiRtZWFzdXJlTm9kZTsNCiAgICB9Ow0KDQp9KS5jYWxsKFRleHQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5UZXh0ID0gVGV4dDsNCg0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBKdWxpYW4gVmllcmVjayA8anVsaWFuLnZpZXJlY2tAZ21haWwuY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2xheWVyL2N1cnNvcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9kb20nXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQoNCnZhciBDdXJzb3IgPSBmdW5jdGlvbihwYXJlbnRFbCkgew0KICAgIHRoaXMuZWxlbWVudCA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gImFjZV9sYXllciBhY2VfY3Vyc29yLWxheWVyIjsNCiAgICBwYXJlbnRFbC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpOw0KDQogICAgdGhpcy5jdXJzb3IgPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgdGhpcy5jdXJzb3IuY2xhc3NOYW1lID0gImFjZV9jdXJzb3IgYWNlX2hpZGRlbiI7DQogICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY3Vyc29yKTsNCg0KICAgIHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLiRwYWRkaW5nID0gMDsNCiAgICB0aGlzLnNldFBhZGRpbmcgPSBmdW5jdGlvbihwYWRkaW5nKSB7DQogICAgICAgIHRoaXMuJHBhZGRpbmcgPSBwYWRkaW5nOw0KICAgIH07DQoNCiAgICB0aGlzLnNldFNlc3Npb24gPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247DQogICAgfTsNCg0KICAgIHRoaXMuaGlkZUN1cnNvciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlOw0KICAgICAgICBkb20uYWRkQ3NzQ2xhc3ModGhpcy5jdXJzb3IsICJhY2VfaGlkZGVuIik7DQogICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5ibGlua0lkKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zaG93Q3Vyc29yID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTsNCiAgICAgICAgZG9tLnJlbW92ZUNzc0NsYXNzKHRoaXMuY3Vyc29yLCAiYWNlX2hpZGRlbiIpOw0KICAgICAgICB0aGlzLmN1cnNvci5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOw0KICAgICAgICB0aGlzLnJlc3RhcnRUaW1lcigpOw0KICAgIH07DQoNCiAgICB0aGlzLnJlc3RhcnRUaW1lciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBjbGVhckludGVydmFsKHRoaXMuYmxpbmtJZCk7DQogICAgICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBjdXJzb3IgPSB0aGlzLmN1cnNvcjsNCiAgICAgICAgdGhpcy5ibGlua0lkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBjdXJzb3Iuc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOw0KICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICBjdXJzb3Iuc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsNCiAgICAgICAgICAgIH0sIDQwMCk7DQogICAgICAgIH0sIDEwMDApOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFBpeGVsUG9zaXRpb24gPSBmdW5jdGlvbihwb3NpdGlvbiwgb25TY3JlZW4pIHsNCiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZyB8fCAhdGhpcy5zZXNzaW9uKSB7DQogICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgIGxlZnQgOiAwLA0KICAgICAgICAgICAgICAgIHRvcCA6IDANCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoIXBvc2l0aW9uKQ0KICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLnNlc3Npb24uc2VsZWN0aW9uLmdldEN1cnNvcigpOw0KICAgICAgICB2YXIgcG9zID0gdGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihwb3NpdGlvbik7DQogICAgICAgIHZhciBjdXJzb3JMZWZ0ID0gTWF0aC5yb3VuZCh0aGlzLiRwYWRkaW5nICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcy5jb2x1bW4gKiB0aGlzLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCk7DQogICAgICAgIHZhciBjdXJzb3JUb3AgPSAocG9zLnJvdyAtIChvblNjcmVlbiA/IHRoaXMuY29uZmlnLmZpcnN0Um93U2NyZWVuIDogMCkpICoNCiAgICAgICAgICAgIHRoaXMuY29uZmlnLmxpbmVIZWlnaHQ7DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIGxlZnQgOiBjdXJzb3JMZWZ0LA0KICAgICAgICAgICAgdG9wIDogY3Vyc29yVG9wDQogICAgICAgIH07DQogICAgfTsNCg0KICAgIHRoaXMudXBkYXRlID0gZnVuY3Rpb24oY29uZmlnKSB7DQogICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOw0KDQogICAgICAgIHRoaXMucGl4ZWxQb3MgPSB0aGlzLmdldFBpeGVsUG9zaXRpb24obnVsbCwgdHJ1ZSk7DQoNCiAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUubGVmdCA9IHRoaXMucGl4ZWxQb3MubGVmdCArICJweCI7DQogICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLnRvcCA9ICB0aGlzLnBpeGVsUG9zLnRvcCArICJweCI7DQogICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLndpZHRoID0gY29uZmlnLmNoYXJhY3RlcldpZHRoICsgInB4IjsNCiAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUuaGVpZ2h0ID0gY29uZmlnLmxpbmVIZWlnaHQgKyAicHgiOw0KDQogICAgICAgIHZhciBvdmVyd3JpdGUgPSB0aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCkNCiAgICAgICAgaWYgKG92ZXJ3cml0ZSAhPSB0aGlzLm92ZXJ3cml0ZSkgew0KICAgICAgICAgICAgdGhpcy5vdmVyd3JpdGUgPSBvdmVyd3JpdGU7DQogICAgICAgICAgICBpZiAob3ZlcndyaXRlKQ0KICAgICAgICAgICAgICAgIGRvbS5hZGRDc3NDbGFzcyh0aGlzLmN1cnNvciwgImFjZV9vdmVyd3JpdGUiKTsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICBkb20ucmVtb3ZlQ3NzQ2xhc3ModGhpcy5jdXJzb3IsICJhY2Vfb3ZlcndyaXRlIik7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLnJlc3RhcnRUaW1lcigpOw0KICAgIH07DQoNCiAgICB0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmJsaW5rSWQpOw0KICAgIH0NCg0KfSkuY2FsbChDdXJzb3IucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5DdXJzb3IgPSBDdXJzb3I7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPiAoaHR0cDovL2plZGl0b29sa2l0LmNvbSkNCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9zY3JvbGxiYXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZG9tJywgJ2FjZS9saWIvZXZlbnQnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi9saWIvb29wIik7DQp2YXIgZG9tID0gcmVxdWlyZSgiLi9saWIvZG9tIik7DQp2YXIgZXZlbnQgPSByZXF1aXJlKCIuL2xpYi9ldmVudCIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQoNCnZhciBTY3JvbGxCYXIgPSBmdW5jdGlvbihwYXJlbnQpIHsNCiAgICB0aGlzLmVsZW1lbnQgPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9ICJhY2Vfc2IiOw0KDQogICAgdGhpcy5pbm5lciA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5pbm5lcik7DQoNCiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTsNCg0KICAgIC8vIGluIE9TWCBsaW9uIHRoZSBzY3JvbGxiYXJzIGFwcGVhciB0byBoYXZlIG5vIHdpZHRoLiBJbiB0aGlzIGNhc2UgcmVzaXplDQogICAgLy8gdGhlIHRvIHNob3cgdGhlIHNjcm9sbGJhciBidXQgc3RpbGwgcHJldGVuZCB0aGF0IHRoZSBzY3JvbGxiYXIgaGFzIGEgd2lkdGgNCiAgICAvLyBvZiAwcHgNCiAgICAvLyBpbiBGaXJlZm94IDYrIHNjcm9sbGJhciBpcyBoaWRkZW4gaWYgZWxlbWVudCBoYXMgdGhlIHNhbWUgd2lkdGggYXMgc2Nyb2xsYmFyDQogICAgLy8gbWFrZSBlbGVtZW50IGEgbGl0dGxlIGJpdCB3aWRlciB0byByZXRhaW4gc2Nyb2xsYmFyIHdoZW4gcGFnZSBpcyB6b29tZWQgDQogICAgdGhpcy53aWR0aCA9IGRvbS5zY3JvbGxiYXJXaWR0aChwYXJlbnQub3duZXJEb2N1bWVudCk7DQogICAgdGhpcy5lbGVtZW50LnN0eWxlLndpZHRoID0gKHRoaXMud2lkdGggfHwgMTUpICsgNSArICJweCI7DQoNCiAgICBldmVudC5hZGRMaXN0ZW5lcih0aGlzLmVsZW1lbnQsICJzY3JvbGwiLCB0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcykpOw0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCg0KICAgIHRoaXMub25TY3JvbGwgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5fZW1pdCgic2Nyb2xsIiwge2RhdGE6IHRoaXMuZWxlbWVudC5zY3JvbGxUb3B9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRXaWR0aCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy53aWR0aDsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRIZWlnaHQgPSBmdW5jdGlvbihoZWlnaHQpIHsNCiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodCArICJweCI7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0SW5uZXJIZWlnaHQgPSBmdW5jdGlvbihoZWlnaHQpIHsNCiAgICAgICAgdGhpcy5pbm5lci5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAicHgiOw0KICAgIH07DQoNCiAgICB0aGlzLnNldFNjcm9sbFRvcCA9IGZ1bmN0aW9uKHNjcm9sbFRvcCkgew0KICAgICAgICB0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wOw0KICAgIH07DQoNCn0pLmNhbGwoU2Nyb2xsQmFyLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuU2Nyb2xsQmFyID0gU2Nyb2xsQmFyOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIElyYWtsaSBHb3phbGlzaHZpbGkgPHJmb2JpY0BnbWFpbC5jb20+IChodHRwOi8vamVkaXRvb2xraXQuY29tKQ0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3JlbmRlcmxvb3AnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZXZlbnQnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBldmVudCA9IHJlcXVpcmUoIi4vbGliL2V2ZW50Iik7DQoNCnZhciBSZW5kZXJMb29wID0gZnVuY3Rpb24ob25SZW5kZXIsIHdpbikgew0KICAgIHRoaXMub25SZW5kZXIgPSBvblJlbmRlcjsNCiAgICB0aGlzLnBlbmRpbmcgPSBmYWxzZTsNCiAgICB0aGlzLmNoYW5nZXMgPSAwOw0KICAgIHRoaXMud2luZG93ID0gd2luIHx8IHdpbmRvdzsNCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuc2NoZWR1bGUgPSBmdW5jdGlvbihjaGFuZ2UpIHsNCiAgICAgICAgLy90aGlzLm9uUmVuZGVyKGNoYW5nZSk7DQogICAgICAgIC8vcmV0dXJuOw0KICAgICAgICB0aGlzLmNoYW5nZXMgPSB0aGlzLmNoYW5nZXMgfCBjaGFuZ2U7DQogICAgICAgIGlmICghdGhpcy5wZW5kaW5nKSB7DQogICAgICAgICAgICB0aGlzLnBlbmRpbmcgPSB0cnVlOw0KICAgICAgICAgICAgdmFyIF9zZWxmID0gdGhpczsNCiAgICAgICAgICAgIGV2ZW50Lm5leHRUaWNrKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIF9zZWxmLnBlbmRpbmcgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB2YXIgY2hhbmdlczsNCiAgICAgICAgICAgICAgICB3aGlsZSAoY2hhbmdlcyA9IF9zZWxmLmNoYW5nZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgX3NlbGYuY2hhbmdlcyA9IDA7DQogICAgICAgICAgICAgICAgICAgIF9zZWxmLm9uUmVuZGVyKGNoYW5nZXMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sIHRoaXMud2luZG93KTsNCiAgICAgICAgfQ0KICAgIH07DQoNCn0pLmNhbGwoUmVuZGVyTG9vcC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLlJlbmRlckxvb3AgPSBSZW5kZXJMb29wOw0KfSk7DQpkZWZpbmUoInRleHQhYWNlL2Nzcy9lZGl0b3IuY3NzIiwgW10sICJAaW1wb3J0IHVybCgvL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9RHJvaWQrU2FucytNb25vKTtcbiIgKw0KICAiXG4iICsNCiAgIlxuIiArDQogICIuYWNlX2VkaXRvciB7XG4iICsNCiAgIiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4iICsNCiAgIiAgICBvdmVyZmxvdzogaGlkZGVuO1xuIiArDQogICIgICAgZm9udC1mYW1pbHk6ICdNb25hY28nLCAnTWVubG8nLCAnVWJ1bnR1IE1vbm8nLCAnRHJvaWQgU2FucyBNb25vJywgJ0NvbnNvbGFzJywgbW9ub3NwYWNlO1xuIiArDQogICIgICAgZm9udC1zaXplOiAxMnB4O1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX3Njcm9sbGVyIHtcbiIgKw0KICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKw0KICAiICAgIG92ZXJmbG93LXg6IHNjcm9sbDtcbiIgKw0KICAiICAgIG92ZXJmbG93LXk6IGhpZGRlbjtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9jb250ZW50IHtcbiIgKw0KICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKw0KICAiICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4iICsNCiAgIiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4iICsNCiAgIiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4iICsNCiAgIiAgICBjdXJzb3I6IHRleHQ7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfY29tcG9zaXRpb24ge1xuIiArDQogICIgICAgcG9zaXRpb246IGFic29sdXRlO1xuIiArDQogICIgICAgYmFja2dyb3VuZDogIzU1NTtcbiIgKw0KICAiICAgIGNvbG9yOiAjREREO1xuIiArDQogICIgICAgei1pbmRleDogNDtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9ndXR0ZXIge1xuIiArDQogICIgICAgcG9zaXRpb246IGFic29sdXRlO1xuIiArDQogICIgICAgb3ZlcmZsb3cgOiBoaWRkZW47XG4iICsNCiAgIiAgICBoZWlnaHQ6IDEwMCU7XG4iICsNCiAgIiAgICB3aWR0aDogYXV0bztcbiIgKw0KICAiICAgIGN1cnNvcjogZGVmYXVsdDtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9ndXR0ZXItY2VsbCB7XG4iICsNCiAgIiAgICBwYWRkaW5nLWxlZnQ6IDE5cHg7XG4iICsNCiAgIiAgICBwYWRkaW5nLXJpZ2h0OiA2cHg7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfZ3V0dGVyLWNlbGwuYWNlX2Vycm9yIHtcbiIgKw0KICAiICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvZ2lmLEdJRjg5YSUxMCUwMCUxMCUwMCVENSUwMCUwMCVGNW9yJUY1JTg3JTg4JUY1bnIlRjRucyVFQm1xJUY1eiU3RiVEREpUJURFS1MlREZPVyVGMVljJUYyYWglQ0UoNyVDRSk4JUQxOEUlREQlNDBNJUYyS1olRUJVJTYwJUY0JTYwbSVEQ2lyJUM4JTE2KCVDOCUxOSolQ0UlMjU1JUYxJTNGUiVGMSUzRlMlRTYlQUIlQjUlQ0ElNURJJUNFbiU1RSVGNyVBMiU5QSVDOUclM0UlRTBhJTVCJUY3JTg5JTg1JUY1eXklRjYlODIlODAlRUQlODIlODAlRkYlQkYlQkYlRTMlQzQlQzQlRkYlRkYlRkYlRkYlRkYlRkYlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAhJUY5JTA0JTAxJTAwJTAwJTI1JTAwJTJDJTAwJTAwJTAwJTAwJTEwJTAwJTEwJTAwJTAwJTA2cCVDMCU5MnBIJTJDJTFBJThGJUM4JUQySCU5MyVFMWQ0JTIzJUU0JTg4JUQzJTA5bUIlMUROJUI0OCVGNSU5MCU0MCU2MCU5MkclNUIlOTQlMjAlM0UlMjIlRDIlODclMjQlRkElMjAlMjQlQzUlMDZBJTAwJTIwJUIxJTA3JTAyQiVBMzglODlYLnYlMTclODIlMTElMTNxJTEwJTBGaSUyNCUwRiU4QiUxMCU3QkQlMTIlMEVpJTA5JTkyJTA5JTBFcEQlMTglMTUlMjQlMEElOUNpJTA1JTBDJTE4RiUxOCUwQiUwNyUwNCUwMSUwNCUwNiVBMEglMTglMTIlMEQlMTQlMEQlMTIlQTFJJUIzJUI0JUI1SUElMDAlM0JcIik7XG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuIiArDQogICIgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMnB4IGNlbnRlcjtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9ndXR0ZXItY2VsbC5hY2Vfd2FybmluZyB7XG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL2dpZixHSUY4OWElMTAlMDAlMTAlMDAlRDUlMDAlMDAlRkYlREJyJUZGJURFJTgxJUZGJUUyJThEJUZGJUUyJThGJUZGJUU0JTk2JUZGJUUzJTk3JUZGJUU1JTlEJUZGJUU2JTlFJUZGJUVFJUMxJUZGJUM4WiVGRiVDRGslRkYlRDBzJUZGJUQ0JTgxJUZGJUQ1JTgyJUZGJUQ1JTgzJUZGJURDJTk3JUZGJURFJTlEJUZGJUU3JUI4JUZGJUNDbCU3QlElMTMlODBVJTE1JTgyVyUxNiU4MVUlMTYlODklNUIlMTglODclNUIlMTglOEMlNUUlMUElOTRkJTFEJUM1JTgzLSVDOSU4NyUyRiVDNiU4NC4lQzYlODUuJUNEJThCMiVDOSU4NzElQ0IlOEEzJUNEJThCNSVEQyU5OCUzRiVERiU5QkIlRTAlOUNDJUUxJUE1VSVDQiU4NzElQ0YlOEI1JUQxJThENiVEQiU5NyU0MCVERiU5QUIlREQlOTlCJUUzJUIwcCVFNyVDQyVBRSVGRiVGRiVGRiUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCElRjklMDQlMDElMDAlMDAlMkYlMDAlMkMlMDAlMDAlMDAlMDAlMTAlMDAlMTAlMDAlMDAlMDZhJUMwJTk3cEglMkMlMUElOEZIJUExJUFCVHIlMjUlODclMkIlMDQlODIlRjQlN0MlQjlYJTkxJTA4JUNCJTk5JTFDISUyNiUxMyU4NCppSjkoJTE1RyVDQSU4NCUxNCUwMSUxQSU5NyUwQyUwMyU4MCUzQSU5QSUzRSU4MSU4NCUzRSUxMSUwOCVCMSU4QiUyMCUwMiUxMiUwRiUxOCUxQSUwRiUwQSUwMydGJTFDJTA0JTBCJTEwJTE2JTE4JTEwJTBCJTA1JTFDRiUxRC0lMDYlMDclOUElOUEtJTFFRyUxQiVBMCVBMSVBMFUlQTQlQTUlQTZCQSUwMCUzQlwiKTtcbiIgKw0KICAiICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggY2VudGVyO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2d1dHRlci1jZWxsLmFjZV9pbmZvIHtcbiIgKw0KICAiICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEVBQVFBTVFBQUFBQUFFRkJRVkpTVWw1ZVhtUmtaR3RyYTM5L2Y0V0ZoWW1KaVpHUmthYW1wcnk4dk1QRHc4ek16TlhWMWR6YzNPVGs1T3JxNnZEdzhQLy8vd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0g1QkFrQUFCUUFMQUFBQUFBUUFCQUFBQVV1SUNXT1pHbWVhQm1sNVhHd0ZDUVNCR3lYUlNBd3RxUUlpUnVpd0lNNUJvWVZiRUZJeUdDUW9lSkdyVnB0SVFBN1wiKTtcbiIgKw0KICAiICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggY2VudGVyO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2VkaXRvciAuYWNlX3NiIHtcbiIgKw0KICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKw0KICAiICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiIgKw0KICAiICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbiIgKw0KICAiICAgIHJpZ2h0OiAwO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2VkaXRvciAuYWNlX3NiIGRpdiB7XG4iICsNCiAgIiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4iICsNCiAgIiAgICB3aWR0aDogMXB4O1xuIiArDQogICIgICAgbGVmdDogMDtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9lZGl0b3IgLmFjZV9wcmludF9tYXJnaW5fbGF5ZXIge1xuIiArDQogICIgICAgei1pbmRleDogMDtcbiIgKw0KICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKw0KICAiICAgIG92ZXJmbG93OiBoaWRkZW47XG4iICsNCiAgIiAgICBtYXJnaW46IDA7XG4iICsNCiAgIiAgICBsZWZ0OiAwO1xuIiArDQogICIgICAgaGVpZ2h0OiAxMDAlO1xuIiArDQogICIgICAgd2lkdGg6IDEwMCU7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfZWRpdG9yIC5hY2VfcHJpbnRfbWFyZ2luIHtcbiIgKw0KICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKw0KICAiICAgIGhlaWdodDogMTAwJTtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9lZGl0b3IgdGV4dGFyZWEge1xuIiArDQogICIgICAgcG9zaXRpb246IGZpeGVkO1xuIiArDQogICIgICAgei1pbmRleDogMDtcbiIgKw0KICAiICAgIHdpZHRoOiAxMHB4O1xuIiArDQogICIgICAgaGVpZ2h0OiAzMHB4O1xuIiArDQogICIgICAgb3BhY2l0eTogMDtcbiIgKw0KICAiICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuIiArDQogICIgICAgYXBwZWFyYW5jZTogbm9uZTtcbiIgKw0KICAiICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiIgKw0KICAiICAgIGJvcmRlcjogbm9uZTtcbiIgKw0KICAiICAgIHJlc2l6ZTogbm9uZTtcbiIgKw0KICAiICAgIG91dGxpbmU6IG5vbmU7XG4iICsNCiAgIiAgICBvdmVyZmxvdzogaGlkZGVuO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2xheWVyIHtcbiIgKw0KICAiICAgIHotaW5kZXg6IDE7XG4iICsNCiAgIiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4iICsNCiAgIiAgICBvdmVyZmxvdzogaGlkZGVuO1xuIiArDQogICIgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiIgKw0KICAiICAgIGhlaWdodDogMTAwJTtcbiIgKw0KICAiICAgIHdpZHRoOiAxMDAlO1xuIiArDQogICIgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiIgKw0KICAiICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiIgKw0KICAiICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiIgKw0KICAiICAgIC8qIHNldHRpbmcgcG9pbnRlci1ldmVudHM6IGF1dG87IG9uIG5vZGUgdW5kZXIgdGhlIG1vdXNlLCB3aGljaCBjaGFuZ2VzXG4iICsNCiAgIiAgICAgICAgZHVyaW5nIHNjcm9sbCwgd2lsbCBicmVhayBtb3VzZSB3aGVlbCBzY3JvbGxpbmcgaW4gU2FmYXJpICovXG4iICsNCiAgIiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9ndXR0ZXIgLmFjZV9sYXllciB7XG4iICsNCiAgIiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4iICsNCiAgIiAgICBtaW4td2lkdGg6IDQwcHg7XG4iICsNCiAgIiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiIgKw0KICAiICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX3RleHQtbGF5ZXIge1xuIiArDQogICIgICAgY29sb3I6IGJsYWNrO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2NqayB7XG4iICsNCiAgIiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4iICsNCiAgIiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfY3Vyc29yLWxheWVyIHtcbiIgKw0KICAiICAgIHotaW5kZXg6IDQ7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfY3Vyc29yIHtcbiIgKw0KICAiICAgIHotaW5kZXg6IDQ7XG4iICsNCiAgIiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfY3Vyc29yLmFjZV9oaWRkZW4ge1xuIiArDQogICIgICAgb3BhY2l0eTogMC4yO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2xpbmUge1xuIiArDQogICIgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcbiIgKw0KICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKw0KICAiICAgIHotaW5kZXg6IDM7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtcbiIgKw0KICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKw0KICAiICAgIHotaW5kZXg6IDQ7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XG4iICsNCiAgIiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4iICsNCiAgIiAgICB6LWluZGV4OiA1O1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcbiIgKw0KICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKw0KICAiICAgIHotaW5kZXg6IDI7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XG4iICsNCiAgIiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4iICsNCiAgIiAgICB6LWluZGV4OiA2O1xuIiArDQogICIgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiIgKw0KICAiICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiIgKw0KICAiICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9saW5lIC5hY2VfZm9sZCB7XG4iICsNCiAgIiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArDQogICIgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArDQogICIgICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArDQogICIgICAgXG4iICsNCiAgIiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4iICsNCiAgIiAgICBoZWlnaHQ6IDExcHg7XG4iICsNCiAgIiAgICBtYXJnaW4tdG9wOiAtMnB4O1xuIiArDQogICIgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiIgKw0KICAiXG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kLWltYWdlOiBcbiIgKw0KICAiICAgICAgICB1cmwoXCJkYXRhOmltYWdlL3BuZywlODlQTkclMEQlMEElMUElMEElMDAlMDAlMDAlMERJSERSJTAwJTAwJTAwJTExJTAwJTAwJTAwJTA5JTA4JTA2JTAwJTAwJTAwJUQ0JUU4JUM3JTBDJTAwJTAwJTAzJTFFaUNDUElDQyUyMFByb2ZpbGUlMDAlMDB4JTAxJTg1VCVERmslRDNQJTE0JUZFJURBZSU5RCVCMCVFMSU4QiUzQWclMTElMDklM0VoJTkxbmRTdEMlOUMlQjZrVyVCQSVDRFolRUE2JUI3IUglOUIlQTZtJTVDJTlBJUM2JTI0JUVEfiVCMCUwNyVEOSU4Qm8lM0ElQzV3JUYxJTA3JTNFJUY5JTA3JTBDJUQ5JTgzbyU3QiU5MiUwRCVDNiUxNGElRjglQUMlODglMjJMJUY2JTIyJUIzJTlFJTlCNE0nUyUwMyVCOSVGNyVCQiVERiVGOSVFRTknJUU3JUU0JTVFJUEwJUY5cVolRDMlMTQlMkYlMEYlMTRVU08lQzUlQzIlRkMlQzQlRTQlMTQlREYlRjIlMDElNUUlMUNDJTJCJUZDaE0lOEIlODYlMTZKJTI2RyU0MCUwRiVEMyVCMnklRUYlQjMlRjMlMEUlMUUlQzZsdCVFRW8lREYlQUIlRkVjJUQ1JTlBJTk1JTBDJTExJUYwJTFDJTIwJUJFJTk0NSVDNCUyMiVFMVklQTBpJTVDJUQ0dCUxMyVFMCVENiU4OSVFRiU5RDE1JUMyJUNETHNYJUE3JTA0JTA5JTFGZzhvYyU4MSVFMSU4QyU4RCUyMyU5NmY0NSU0MCU5QSUwOSVDMiUwNyVDNUIlM0FLJUI4JTQwOCU5OGklRTAlRjMlMEQlRDglQ0UlODElMTQlRTQnJTI2JUE5JTkyLiU4QiUzQyVBQkVSJTJGJUU1ZEUlQjIlMEMlRjYlRjAlMUZzJTgzJUYyXyVCMCVBOCU5NCVFOSU5QiVBRCVFNyUxMCU4RG0lOUElMTlOJUQxJTdDJThBJURFJTFGOSU3RHAlOEMlRTYlMDAlRDUlQzElM0ZfJTE4JUJEQSVCOCU5RHBYNiVFMyVBMzV+QiVDRCUyNCVBRSUxMSUyNiVCRCVFNyVFRXRpJTk4JUVEZSU5QSU5N1kpJTEyJTI1JTFDJTI0JUJDYlQlQUUzbGklRTYlMEIlMDMlODklOUElRTYlRDMlRUQlRjRQJTkyJUIwJTlGNCVCRjQzWSVGMyVFMyVFRFAlOTUlMDQlRUIxJUM1JUY1JUY2S0YlRjQlQkElQkQlRDclREIlOTElOTMlMDclRTM1JTNFJUE3KSVENiU3RiU0MCVGRSVCRCVGNyVGNXIlOEElRTV5JTkyJUYwJUVCJUI0JTFFJThEJUQ1JUY0JTVCJTkyJTNBViVEQiVEQiVFNCVDRCVBNiUyMyVDMyVDNHdRJTNGJTAzSEIlODIlOEUlMUNkKCVFMCU5MUIlMENhJTlBYyVDNCVBQSVGOEwlMTYlMTklMjJKJUE0JUQyaXRUeSVCMjglRDYlM0IoJTkzJTk2JUVEJTFDR3glQzlfJTBFJUI4JTVFJTE2JUY1JTVCJUIyJUI4JUY2JUUwJUZCJTlFJUREJTI1JUQ3JThFJUJDJTE1JTg1JUM1JUI3JUEzJUQ4USVFRCVCNSU4MSVFOSVCQSVCMiUxMyU5QSUxQiU3RnVhJUE1JUEzbiVFMTclQjklRTUlOUIlMUJtJUFCJTBCJTA4USVGRSU4QSVFNSVCMUglNUVlJUNBTyU4MlElRDd1NiVFNiU5MFMlOTclRkN1JTBCJUNGMiU5NCVFRSUyNXYlMTJYJTBDJUJBJUFDJUYwJTVFJUY4KmwlMEFPJTg1JTE3JUMyJTk3JUJGJUQ0JUM4JUNFJURFJUFEJTExJUNCJTgwcSUyQyUzRSVBQiU5RVMlQ0QlQzYlRUMlMjUlRDJMJUQyJUVCZCVCOCVCRiU4QSVGNUIlQzYlMTglRjklOTAxQ1olOUQlQkUlMjRNJTlDJThBOSVGMiVEQVAlMEInJTA2dyU4MiVFQiVFNiVFMiU1QyUyRiVENyUwNyU5RSVCQiVDQyU1RCVFMSVGQSVCOSUwOCVBRC5yJTIzJThFJUMyJTE3JUY1RSU3QyElRjAlQkUzJUJFJTNFXyVCN28lODhhJUE3JURCJUJFJUQzZCVFQiVBMzFaJUVCJUJCJUQzJTkxJUJBJUEyJUIxeiU5NCU4RiVEQiclRjYlM0QlOEUlQUElMTMlMTklQjIlQjElQkUlQjF+ViUwOCUyQiVCNCVBMmNqSiVCM3RPJTAwJTAzJTI1bU4lOTclRjMlMDUlOTMlRUYlMTElODQlMEIlN0MlODglQUUtJTg5JThGJUFCYlclOTBPJTJCJTBBbyU5OSUwQyU1RSU5NyUwQ0klQUZIJUQ5LiVCMCUzQiU4RiVFRCUwMyVCNlMlRDYlNUQlRTZpX3M5JUYzKnAlRTklMUIlRkQlQzMlRUIuN1UlMDYlNUUlMTklQzAlRDFzLiUxNyVBMDN1JUU0JTA5JUIwJTdDJTVFJTJDJUVCJTE1JURCJTFGJTNDJTlFJUI3JTgwJTkxJTNCJURCYyVBRCUzRG1hJUJBJThCJTNFViVBQiVEQnQuJTVCJTFFJTAxJUJCJTBGJUFCJUQ1JTlGJUNGJUFBJUQ1JUREJUU3JUU0JTdGJTBCeCVBMyVGQyUwNiVBOSUyMyUwQSVENiVDMiVBMV8yJTAwJTAwJTAwJTA5cEhZcyUwMCUwMCUwQiUxMyUwMCUwMCUwQiUxMyUwMSUwMCU5QSU5QyUxOCUwMCUwMCUwMCVCNUlEQVQoJTE1JUE1JTkxJTNEJTBFJTAyISUxMCU4NWFjJUUxJTA1JUQ2JUNFJUQ2JUM2JUNFJUQyJUU4JUVEJUNEJURFJUMwJUM2JUQ2Ti4lRTBWJUY4JTNEJTlDYSU4OTFYSCVDMiVCRSVEOXklM0YlOTAhJUU2JTlDJUMzJUJGayVFNSUwMTElQzYtJUY1JUM4TiUwNCVERiVCRCVGRiU4OSVERnQlODNETiU2MCUzRSVGMyVBQiVBMCVERSUxQSU1RGclQkUlMTBRJTk3JTFCJTQwJTlDJUE4byUxMCU4RiU1RSU4MjglQjQlMUIlNjAlODclRjYlMDIlMjYlODUlMUNoJTFFJUMxJTJCJTVCayVGRiU4NiVFRSVCN2olMDklOUElREElOUIlQUNlJUEzJUY5JUVDJURBITklQjQlRDUlQTYlODElODYlODYlOTglQ0MlM0MlNUIlNDAlRkElODElQjMlRTklQ0IlMjMlOTQlQzE2QXpvJTA1JUQ0JUUxJUMxJTk1YSUzQiU4QSclQTAlRTglQ0MlMTclMjIlODUlMUQlQkElMDAlQTIlRkElREMlMEElOTQlRDElRDElOEQlOEIlM0ElODQlMTdCJUM3JTYwJTFBJTI1WiVGQyU4RCUwMCUwMCUwMCUwMElFTkQlQUVCJTYwJTgyXCIpLFxuIiArDQogICIgICAgICAgIHVybChcImRhdGE6aW1hZ2UvcG5nLCU4OVBORyUwRCUwQSUxQSUwQSUwMCUwMCUwMCUwRElIRFIlMDAlMDAlMDAlMDUlMDAlMDAlMDA3JTA4JTA2JTAwJTAwJTAwJUM0JUREJTgwQyUwMCUwMCUwMyUxRWlDQ1BJQ0MlMjBQcm9maWxlJTAwJTAweCUwMSU4NVQlREZrJUQzUCUxNCVGRSVEQWUlOUQlQjAlRTElOEIlM0FnJTExJTA5JTNFaCU5MW5kU3RDJTlDJUI2a1clQkElQ0RaJUVBNiVCNyFIJTlCJUE2bSU1QyU5QSVDNiUyNCVFRH4lQjAlMDclRDklOEJvJTNBJUM1dyVGMSUwNyUzRSVGOSUwNyUwQyVEOSU4M28lN0IlOTIlMEQlQzYlMTRhJUY4JUFDJTg4JTIyTCVGNiUyMiVCMyU5RSU5QjRNJ1MlMDMlQjklRjclQkIlREYlRjklRUU5JyVFNyVFNCU1RSVBMCVGOXFaJUQzJTE0JTJGJTBGJTE0VVNPJUM1JUMyJUZDJUM0JUU0JTE0JURGJUYyJTAxJTVFJTFDQyUyQiVGQ2hNJThCJTg2JTE2SiUyNkclNDAlMEYlRDMlQjJ5JUVGJUIzJUYzJTBFJTFFJUM2bHQlRUVvJURGJUFCJUZFYyVENSU5QSU5NSUwQyUxMSVGMCUxQyUyMCVCRSU5NDUlQzQlMjIlRTFZJUEwaSU1QyVENHQlMTMlRTAlRDYlODklRUYlOUQxNSVDMiVDRExzWCVBNyUwNCUwOSUxRmc4b2MlODElRTElOEMlOEQlMjMlOTZmNDUlNDAlOUElMDklQzIlMDclQzVCJTNBSyVCOCU0MDglOThpJUUwJUYzJTBEJUQ4JUNFJTgxJTE0JUU0JyUyNiVBOSU5Mi4lOEIlM0MlQUJFUiUyRiVFNWRFJUIyJTBDJUY2JUYwJTFGcyU4MyVGMl8lQjAlQTglOTQlRTklOUIlQUQlRTclMTAlOERtJTlBJTE5TiVEMSU3QyU4QSVERSUxRjklN0RwJThDJUU2JTAwJUQ1JUMxJTNGXyUxOCVCREElQjglOURwWDYlRTMlQTM1fkIlQ0QlMjQlQUUlMTElMjYlQkQlRTclRUV0aSU5OCVFRGUlOUElOTdZKSUxMiUyNSUxQyUyNCVCQ2JUJUFFM2xpJUU2JTBCJTAzJTg5JTlBJUU2JUQzJUVEJUY0UCU5MiVCMCU5RjQlQkY0M1klRjMlRTMlRURQJTk1JTA0JUVCMSVDNSVGNSVGNktGJUY0JUJBJUJEJUQ3JURCJTkxJTkzJTA3JUUzNSUzRSVBNyklRDYlN0YlNDAlRkUlQkQlRjclRjVyJThBJUU1eSU5MiVGMCVFQiVCNCUxRSU4RCVENSVGNCU1QiU5MiUzQVYlREIlREIlRTQlQ0QlQTYlMjMlQzMlQzR3USUzRiUwM0hCJTgyJThFJTFDZCglRTAlOTFCJTBDYSU5QWMlQzQlQUElRjhMJTE2JTE5JTIySiVBNCVEMml0VHklQjI4JUQ2JTNCKCU5MyU5NiVFRCUxQ0d4JUM5XyUwRSVCOCU1RSUxNiVGNSU1QiVCMiVCOCVGNiVFMCVGQiU5RSVERCUyNSVENyU4RSVCQyUxNSU4NSVDNSVCNyVBMyVEOFElRUQlQjUlODElRTklQkElQjIlMTMlOUElMUIlN0Z1YSVBNSVBM24lRTE3JUI5JUU1JTlCJTFCbSVBQiUwQiUwOFElRkUlOEElRTUlQjFIJTVFZSVDQU8lODJRJUQ3dTYlRTYlOTBTJTk3JUZDdSUwQiVDRjIlOTQlRUUlMjV2JTEyWCUwQyVCQSVBQyVGMCU1RSVGOCpsJTBBTyU4NSUxNyVDMiU5NyVCRiVENCVDOCVDRSVERSVBRCUxMSVDQiU4MHElMkMlM0UlQUIlOUVTJUNEJUM2JUVDJTI1JUQyTCVEMiVFQmQlQjglQkYlOEElRjVCJUM2JTE4JUY5JTkwMUNaJTlEJUJFJTI0TSU5QyU4QTklRjIlREFQJTBCJyUwNnclODIlRUIlRTYlRTIlNUMlMkYlRDclMDclOUUlQkIlQ0MlNUQlRTElRkElQjklMDglQUQuciUyMyU4RSVDMiUxNyVGNUUlN0MhJUYwJUJFMyVCRSUzRV8lQjdvJTg4YSVBNyVEQiVCRSVEM2QlRUIlQTMxWiVFQiVCQiVEMyU5MSVCQSVBMiVCMXolOTQlOEYlREInJUY2JTNEJThFJUFBJTEzJTE5JUIyJUIxJUJFJUIxflYlMDglMkIlQjQlQTJjakolQjN0TyUwMCUwMyUyNW1OJTk3JUYzJTA1JTkzJUVGJTExJTg0JTBCJTdDJTg4JUFFLSU4OSU4RiVBQmJXJTkwTyUyQiUwQW8lOTklMEMlNUUlOTclMENJJUFGSCVEOS4lQjAlM0IlOEYlRUQlMDMlQjZTJUQ2JTVEJUU2aV9zOSVGMypwJUU5JTFCJUZEJUMzJUVCLjdVJTA2JTVFJTE5JUMwJUQxcy4lMTclQTAzdSVFNCUwOSVCMCU3QyU1RSUyQyVFQiUxNSVEQiUxRiUzQyU5RSVCNyU4MCU5MSUzQiVEQmMlQUQlM0RtYSVCQSU4QiUzRVYlQUIlREJ0LiU1QiUxRSUwMSVCQiUwRiVBQiVENSU5RiVDRiVBQSVENSVERCVFNyVFNCU3RiUwQnglQTMlRkMlMDYlQTklMjMlMEElRDYlQzIlQTFfMiUwMCUwMCUwMCUwOXBIWXMlMDAlMDAlMEIlMTMlMDAlMDAlMEIlMTMlMDElMDAlOUElOUMlMTglMDAlMDAlMDAlM0FJREFUOCUxMWMlRkMlRkYlRkYlN0YlMTglMDMlMUElNjAlMDElRjIlM0YlQTAlODkxJTgwJTA0JUZGJTExLSVGOCUxNyU5QkolRTIlMDUlQjFaRCU4MXYlMjZ0JUU3JTgwJUY4JUEzJTgyaCVBMTIlMUElMjAlQTMlMDElMDIlMEYlMDElQkElMjUlMDYlMDAlMTklQzAlMEQlQUVGJUQ1JTNFUyUwMCUwMCUwMCUwMElFTkQlQUVCJTYwJTgyXCIpO1xuIiArDQogICIgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdCwgcmVwZWF0LXg7XG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyLCB0b3AgbGVmdDtcbiIgKw0KICAiICAgIGNvbG9yOiB0cmFuc3BhcmVudDtcbiIgKw0KICAiXG4iICsNCiAgIiAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcbiIgKw0KICAiICAgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4O1xuIiArDQogICIgICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHg7XG4iICsNCiAgIiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4iICsNCiAgIiAgICBcbiIgKw0KICAiICAgIGN1cnNvcjogcG9pbnRlcjtcbiIgKw0KICAiICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2RhcmsgLmFjZV9mb2xkIHtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9mb2xkOmhvdmVye1xuIiArDQogICIgICAgYmFja2dyb3VuZC1pbWFnZTogXG4iICsNCiAgIiAgICAgICAgdXJsKFwiZGF0YTppbWFnZS9wbmcsJTg5UE5HJTBEJTBBJTFBJTBBJTAwJTAwJTAwJTBESUhEUiUwMCUwMCUwMCUxMSUwMCUwMCUwMCUwOSUwOCUwNiUwMCUwMCUwMCVENCVFOCVDNyUwQyUwMCUwMCUwMyUxRWlDQ1BJQ0MlMjBQcm9maWxlJTAwJTAweCUwMSU4NVQlREZrJUQzUCUxNCVGRSVEQWUlOUQlQjAlRTElOEIlM0FnJTExJTA5JTNFaCU5MW5kU3RDJTlDJUI2a1clQkElQ0RaJUVBNiVCNyFIJTlCJUE2bSU1QyU5QSVDNiUyNCVFRH4lQjAlMDclRDklOEJvJTNBJUM1dyVGMSUwNyUzRSVGOSUwNyUwQyVEOSU4M28lN0IlOTIlMEQlQzYlMTRhJUY4JUFDJTg4JTIyTCVGNiUyMiVCMyU5RSU5QjRNJ1MlMDMlQjklRjclQkIlREYlRjklRUU5JyVFNyVFNCU1RSVBMCVGOXFaJUQzJTE0JTJGJTBGJTE0VVNPJUM1JUMyJUZDJUM0JUU0JTE0JURGJUYyJTAxJTVFJTFDQyUyQiVGQ2hNJThCJTg2JTE2SiUyNkclNDAlMEYlRDMlQjJ5JUVGJUIzJUYzJTBFJTFFJUM2bHQlRUVvJURGJUFCJUZFYyVENSU5QSU5NSUwQyUxMSVGMCUxQyUyMCVCRSU5NDUlQzQlMjIlRTFZJUEwaSU1QyVENHQlMTMlRTAlRDYlODklRUYlOUQxNSVDMiVDRExzWCVBNyUwNCUwOSUxRmc4b2MlODElRTElOEMlOEQlMjMlOTZmNDUlNDAlOUElMDklQzIlMDclQzVCJTNBSyVCOCU0MDglOThpJUUwJUYzJTBEJUQ4JUNFJTgxJTE0JUU0JyUyNiVBOSU5Mi4lOEIlM0MlQUJFUiUyRiVFNWRFJUIyJTBDJUY2JUYwJTFGcyU4MyVGMl8lQjAlQTglOTQlRTklOUIlQUQlRTclMTAlOERtJTlBJTE5TiVEMSU3QyU4QSVERSUxRjklN0RwJThDJUU2JTAwJUQ1JUMxJTNGXyUxOCVCREElQjglOURwWDYlRTMlQTM1fkIlQ0QlMjQlQUUlMTElMjYlQkQlRTclRUV0aSU5OCVFRGUlOUElOTdZKSUxMiUyNSUxQyUyNCVCQ2JUJUFFM2xpJUU2JTBCJTAzJTg5JTlBJUU2JUQzJUVEJUY0UCU5MiVCMCU5RjQlQkY0M1klRjMlRTMlRURQJTk1JTA0JUVCMSVDNSVGNSVGNktGJUY0JUJBJUJEJUQ3JURCJTkxJTkzJTA3JUUzNSUzRSVBNyklRDYlN0YlNDAlRkUlQkQlRjclRjVyJThBJUU1eSU5MiVGMCVFQiVCNCUxRSU4RCVENSVGNCU1QiU5MiUzQVYlREIlREIlRTQlQ0QlQTYlMjMlQzMlQzR3USUzRiUwM0hCJTgyJThFJTFDZCglRTAlOTFCJTBDYSU5QWMlQzQlQUElRjhMJTE2JTE5JTIySiVBNCVEMml0VHklQjI4JUQ2JTNCKCU5MyU5NiVFRCUxQ0d4JUM5XyUwRSVCOCU1RSUxNiVGNSU1QiVCMiVCOCVGNiVFMCVGQiU5RSVERCUyNSVENyU4RSVCQyUxNSU4NSVDNSVCNyVBMyVEOFElRUQlQjUlODElRTklQkElQjIlMTMlOUElMUIlN0Z1YSVBNSVBM24lRTE3JUI5JUU1JTlCJTFCbSVBQiUwQiUwOFElRkUlOEElRTUlQjFIJTVFZSVDQU8lODJRJUQ3dTYlRTYlOTBTJTk3JUZDdSUwQiVDRjIlOTQlRUUlMjV2JTEyWCUwQyVCQSVBQyVGMCU1RSVGOCpsJTBBTyU4NSUxNyVDMiU5NyVCRiVENCVDOCVDRSVERSVBRCUxMSVDQiU4MHElMkMlM0UlQUIlOUVTJUNEJUM2JUVDJTI1JUQyTCVEMiVFQmQlQjglQkYlOEElRjVCJUM2JTE4JUY5JTkwMUNaJTlEJUJFJTI0TSU5QyU4QTklRjIlREFQJTBCJyUwNnclODIlRUIlRTYlRTIlNUMlMkYlRDclMDclOUUlQkIlQ0MlNUQlRTElRkElQjklMDglQUQuciUyMyU4RSVDMiUxNyVGNUUlN0MhJUYwJUJFMyVCRSUzRV8lQjdvJTg4YSVBNyVEQiVCRSVEM2QlRUIlQTMxWiVFQiVCQiVEMyU5MSVCQSVBMiVCMXolOTQlOEYlREInJUY2JTNEJThFJUFBJTEzJTE5JUIyJUIxJUJFJUIxflYlMDglMkIlQjQlQTJjakolQjN0TyUwMCUwMyUyNW1OJTk3JUYzJTA1JTkzJUVGJTExJTg0JTBCJTdDJTg4JUFFLSU4OSU4RiVBQmJXJTkwTyUyQiUwQW8lOTklMEMlNUUlOTclMENJJUFGSCVEOS4lQjAlM0IlOEYlRUQlMDMlQjZTJUQ2JTVEJUU2aV9zOSVGMypwJUU5JTFCJUZEJUMzJUVCLjdVJTA2JTVFJTE5JUMwJUQxcy4lMTclQTAzdSVFNCUwOSVCMCU3QyU1RSUyQyVFQiUxNSVEQiUxRiUzQyU5RSVCNyU4MCU5MSUzQiVEQmMlQUQlM0RtYSVCQSU4QiUzRVYlQUIlREJ0LiU1QiUxRSUwMSVCQiUwRiVBQiVENSU5RiVDRiVBQSVENSVERCVFNyVFNCU3RiUwQnglQTMlRkMlMDYlQTklMjMlMEElRDYlQzIlQTFfMiUwMCUwMCUwMCUwOXBIWXMlMDAlMDAlMEIlMTMlMDAlMDAlMEIlMTMlMDElMDAlOUElOUMlMTglMDAlMDAlMDAlQjVJREFUKCUxNSVBNSU5MSUzRCUwRSUwMiElMTAlODVhYyVFMSUwNSVENiVDRSVENiVDNiVDRSVEMiVFOCVFRCVDRCVERSVDMCVDNiVENk4uJUUwViVGOCUzRCU5Q2ElODkxWEglQzIlQkUlRDl5JTNGJTkwISVFNiU5QyVDMyVCRmslRTUlMDExJUM2LSVGNSVDOE4lMDQlREYlQkQlRkYlODklREZ0JTgzRE4lNjAlM0UlRjMlQUIlQTAlREUlMUElNURnJUJFJTEwUSU5NyUxQiU0MCU5QyVBOG8lMTAlOEYlNUUlODI4JUI0JTFCJTYwJTg3JUY2JTAyJTI2JTg1JTFDaCUxRSVDMSUyQiU1QmslRkYlODYlRUUlQjdqJTA5JTlBJURBJTlCJUFDZSVBMyVGOSVFQyVEQSE5JUI0JUQ1JUE2JTgxJTg2JTg2JTk4JUNDJTNDJTVCJTQwJUZBJTgxJUIzJUU5JUNCJTIzJTk0JUMxNkF6byUwNSVENCVFMSVDMSU5NWElM0IlOEEnJUEwJUU4JUNDJTE3JTIyJTg1JTFEJUJBJTAwJUEyJUZBJURDJTBBJTk0JUQxJUQxJThEJThCJTNBJTg0JTE3QiVDNyU2MCUxQSUyNVolRkMlOEQlMDAlMDAlMDAlMDBJRU5EJUFFQiU2MCU4MlwiKSxcbiIgKw0KICAiICAgICAgICB1cmwoXCJkYXRhOmltYWdlL3BuZywlODlQTkclMEQlMEElMUElMEElMDAlMDAlMDAlMERJSERSJTAwJTAwJTAwJTA1JTAwJTAwJTAwNyUwOCUwNiUwMCUwMCUwMCVDNCVERCU4MEMlMDAlMDAlMDMlMUVpQ0NQSUNDJTIwUHJvZmlsZSUwMCUwMHglMDElODVUJURGayVEM1AlMTQlRkUlREFlJTlEJUIwJUUxJThCJTNBZyUxMSUwOSUzRWglOTFuZFN0QyU5QyVCNmtXJUJBJUNEWiVFQTYlQjchSCU5QiVBNm0lNUMlOUElQzYlMjQlRUR+JUIwJTA3JUQ5JThCbyUzQSVDNXclRjElMDclM0UlRjklMDclMEMlRDklODNvJTdCJTkyJTBEJUM2JTE0YSVGOCVBQyU4OCUyMkwlRjYlMjIlQjMlOUUlOUI0TSdTJTAzJUI5JUY3JUJCJURGJUY5JUVFOSclRTclRTQlNUUlQTAlRjlxWiVEMyUxNCUyRiUwRiUxNFVTTyVDNSVDMiVGQyVDNCVFNCUxNCVERiVGMiUwMSU1RSUxQ0MlMkIlRkNoTSU4QiU4NiUxNkolMjZHJTQwJTBGJUQzJUIyeSVFRiVCMyVGMyUwRSUxRSVDNmx0JUVFbyVERiVBQiVGRWMlRDUlOUElOTUlMEMlMTElRjAlMUMlMjAlQkUlOTQ1JUM0JTIyJUUxWSVBMGklNUMlRDR0JTEzJUUwJUQ2JTg5JUVGJTlEMTUlQzIlQ0RMc1glQTclMDQlMDklMUZnOG9jJTgxJUUxJThDJThEJTIzJTk2ZjQ1JTQwJTlBJTA5JUMyJTA3JUM1QiUzQUslQjglNDA4JTk4aSVFMCVGMyUwRCVEOCVDRSU4MSUxNCVFNCclMjYlQTklOTIuJThCJTNDJUFCRVIlMkYlRTVkRSVCMiUwQyVGNiVGMCUxRnMlODMlRjJfJUIwJUE4JTk0JUU5JTlCJUFEJUU3JTEwJThEbSU5QSUxOU4lRDElN0MlOEElREUlMUY5JTdEcCU4QyVFNiUwMCVENSVDMSUzRl8lMTglQkRBJUI4JTlEcFg2JUUzJUEzNX5CJUNEJTI0JUFFJTExJTI2JUJEJUU3JUVFdGklOTglRURlJTlBJTk3WSklMTIlMjUlMUMlMjQlQkNiVCVBRTNsaSVFNiUwQiUwMyU4OSU5QSVFNiVEMyVFRCVGNFAlOTIlQjAlOUY0JUJGNDNZJUYzJUUzJUVEUCU5NSUwNCVFQjElQzUlRjUlRjZLRiVGNCVCQSVCRCVENyVEQiU5MSU5MyUwNyVFMzUlM0UlQTcpJUQ2JTdGJTQwJUZFJUJEJUY3JUY1ciU4QSVFNXklOTIlRjAlRUIlQjQlMUUlOEQlRDUlRjQlNUIlOTIlM0FWJURCJURCJUU0JUNEJUE2JTIzJUMzJUM0d1ElM0YlMDNIQiU4MiU4RSUxQ2QoJUUwJTkxQiUwQ2ElOUFjJUM0JUFBJUY4TCUxNiUxOSUyMkolQTQlRDJpdFR5JUIyOCVENiUzQiglOTMlOTYlRUQlMUNHeCVDOV8lMEUlQjglNUUlMTYlRjUlNUIlQjIlQjglRjYlRTAlRkIlOUUlREQlMjUlRDclOEUlQkMlMTUlODUlQzUlQjclQTMlRDhRJUVEJUI1JTgxJUU5JUJBJUIyJTEzJTlBJTFCJTdGdWElQTUlQTNuJUUxNyVCOSVFNSU5QiUxQm0lQUIlMEIlMDhRJUZFJThBJUU1JUIxSCU1RWUlQ0FPJTgyUSVEN3U2JUU2JTkwUyU5NyVGQ3UlMEIlQ0YyJTk0JUVFJTI1diUxMlglMEMlQkElQUMlRjAlNUUlRjgqbCUwQU8lODUlMTclQzIlOTclQkYlRDQlQzglQ0UlREUlQUQlMTElQ0IlODBxJTJDJTNFJUFCJTlFUyVDRCVDNiVFQyUyNSVEMkwlRDIlRUJkJUI4JUJGJThBJUY1QiVDNiUxOCVGOSU5MDFDWiU5RCVCRSUyNE0lOUMlOEE5JUYyJURBUCUwQiclMDZ3JTgyJUVCJUU2JUUyJTVDJTJGJUQ3JTA3JTlFJUJCJUNDJTVEJUUxJUZBJUI5JTA4JUFELnIlMjMlOEUlQzIlMTclRjVFJTdDISVGMCVCRTMlQkUlM0VfJUI3byU4OGElQTclREIlQkUlRDNkJUVCJUEzMVolRUIlQkIlRDMlOTElQkElQTIlQjF6JTk0JThGJURCJyVGNiUzRCU4RSVBQSUxMyUxOSVCMiVCMSVCRSVCMX5WJTA4JTJCJUI0JUEyY2pKJUIzdE8lMDAlMDMlMjVtTiU5NyVGMyUwNSU5MyVFRiUxMSU4NCUwQiU3QyU4OCVBRS0lODklOEYlQUJiVyU5ME8lMkIlMEFvJTk5JTBDJTVFJTk3JTBDSSVBRkglRDkuJUIwJTNCJThGJUVEJTAzJUI2UyVENiU1RCVFNmlfczklRjMqcCVFOSUxQiVGRCVDMyVFQi43VSUwNiU1RSUxOSVDMCVEMXMuJTE3JUEwM3UlRTQlMDklQjAlN0MlNUUlMkMlRUIlMTUlREIlMUYlM0MlOUUlQjclODAlOTElM0IlREJjJUFEJTNEbWElQkElOEIlM0VWJUFCJURCdC4lNUIlMUUlMDElQkIlMEYlQUIlRDUlOUYlQ0YlQUElRDUlREQlRTclRTQlN0YlMEJ4JUEzJUZDJTA2JUE5JTIzJTBBJUQ2JUMyJUExXzIlMDAlMDAlMDAlMDlwSFlzJTAwJTAwJTBCJTEzJTAwJTAwJTBCJTEzJTAxJTAwJTlBJTlDJTE4JTAwJTAwJTAwM0lEQVQ4JTExYyVGQyVGRiVGRiU3RiUzRSUwMyUxQSU2MCUwMSVGMiUzRiVBMyU4OTElODAlMDQlRkZRJTI2JUY4dyVDMCVCNDMlQTElREIlMEMlRTIlOEYlMEElQTIlODUlQ0FoJTgwJThDJTA2JTA4JTNDJTA0JUU4JTk2JTE4JTAwJUEzUyUwRCVDRCVDRiVEOCVDMSU5RCUwMCUwMCUwMCUwMElFTkQlQUVCJTYwJTgyXCIpO1xuIiArDQogICIgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdCwgcmVwZWF0LXg7XG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyLCB0b3AgbGVmdDtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9kcmFnZ2luZyAuYWNlX2NvbnRlbnQge1xuIiArDQogICIgICAgY3Vyc29yOiBtb3ZlO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2ZvbGRpbmctZW5hYmxlZCA+IC5hY2VfZ3V0dGVyLWNlbGwge1xuIiArDQogICIgICAgcGFkZGluZy1yaWdodDogMTNweDtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9mb2xkLXdpZGdldCB7XG4iICsNCiAgIiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArDQogICIgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArDQogICIgICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArDQogICJcbiIgKw0KICAiICAgIG1hcmdpbjogMCAtMTJweCAxcHggMXB4O1xuIiArDQogICIgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuIiArDQogICIgICAgaGVpZ2h0OiAxNHB4O1xuIiArDQogICIgICAgd2lkdGg6IDExcHg7XG4iICsNCiAgIiAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC1ib3R0b207XG4iICsNCiAgIiAgICBcbiIgKw0KICAiICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvcG5nLCU4OVBORyUwRCUwQSUxQSUwQSUwMCUwMCUwMCUwRElIRFIlMDAlMDAlMDAlMDUlMDAlMDAlMDAlMDUlMDglMDYlMDAlMDAlMDAlOERvJTI2JUU1JTAwJTAwJTAwNElEQVR4JURBZSU4QSVCMSUwRCUwMDAlMEMlQzIlRjIlMkNLJTk2JUJDJUQwJThGOSU4MSU4OEglRTklRDAlMEUlOTYlQzAlMTAlOTIlM0UlMDIlODAlNUUlODIlRTQlQTkqLSVFRXN3JUM4JUNDJTExJUVFJTk2dyVEOCVEQyVFOSpFaCUwQyUxNTEoJTAwJTAwJTAwJTAwSUVORCVBRUIlNjAlODJcIik7XG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuIiArDQogICIgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIDVweDtcbiIgKw0KICAiXG4iICsNCiAgIiAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfZm9sZC13aWRnZXQuZW5kIHtcbiIgKw0KICAiICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvcG5nLCU4OVBORyUwRCUwQSUxQSUwQSUwMCUwMCUwMCUwRElIRFIlMDAlMDAlMDAlMDUlMDAlMDAlMDAlMDUlMDglMDYlMDAlMDAlMDAlOERvJTI2JUU1JTAwJTAwJTAwNElEQVR4JURBbSVDNyVDMSUwOSUwMDAlMDhDJUQxJThDJUVDRSVDOEUoJThFJUVDJTAyKSUxRVpKJUYxJUMxJyUwNCUwN0klRTElRTUlRUUlQ0FMJUY1JUEyJTk5JTk5JTIyJUUyJUQ2JTFGVSVCNSVGRTAlRDl4JUE3JTI2V3o1JTBFJUQ1JTAwJTAwJTAwJTAwSUVORCVBRUIlNjAlODJcIik7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfZm9sZC13aWRnZXQuY2xvc2VkIHtcbiIgKw0KICAiICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvcG5nLCU4OVBORyUwRCUwQSUxQSUwQSUwMCUwMCUwMCUwRElIRFIlMDAlMDAlMDAlMDMlMDAlMDAlMDAlMDYlMDglMDYlMDAlMDAlMDAlMDYlRTUlMjQlMEMlMDAlMDAlMDA5SURBVHglREE1JUNBJUMxJTA5JTAwMCUwOCUwMyVDMCVBQyooJTNFJTA0JUMxJTBEJUJBJUIxJTIzJUE0VWglRTAlMjAlODElQzAlQ0MlRjglODIlODElQUElQTIlQUFyR2ZyJTg4JTA4JTExJTExJTFDJUREJTdEJUUwJUVFJTVCJUY2JUY2JUNCJUI4JTA1USUyRiVFOXRhaSVEOSUwMCUwMCUwMCUwMElFTkQlQUVCJTYwJTgyXCIpO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2ZvbGQtd2lkZ2V0OmhvdmVyIHtcbiIgKw0KICAiICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4zKTtcbiIgKw0KICAiICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiIgKw0KICAiICAgIC1tb3otYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuIiArDQogICIgICAgLW1vei1ib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuIiArDQogICIgICAgLXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4iICsNCiAgIiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4iICsNCiAgIiAgICBib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4iICsNCiAgIiAgICBib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuIiArDQogICIgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIDRweDtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9mb2xkLXdpZGdldDphY3RpdmUge1xuIiArDQogICIgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjQpO1xuIiArDQogICIgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiIgKw0KICAiICAgIC1tb3otYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1KTtcbiIgKw0KICAiICAgIC1tb3otYm94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTtcbiIgKw0KICAiICAgIC13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1KTtcbiIgKw0KICAiICAgIC13ZWJraXQtYm94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTtcbiIgKw0KICAiICAgIGJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSk7XG4iICsNCiAgIiAgICBib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2ZvbGQtd2lkZ2V0LmludmFsaWQge1xuIiArDQogICIgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGQjRCNDtcbiIgKw0KICAiICAgIGJvcmRlci1jb2xvcjogI0RFNTU1NTtcbiIgKw0KICAifVxuIiArDQogICIiKTsNCg0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3RleHRtYXRlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2RvbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KZXhwb3J0cy5pc0RhcmsgPSBmYWxzZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLXRtIjsNCmV4cG9ydHMuY3NzVGV4dCA9ICIuYWNlLXRtIC5hY2VfZWRpdG9yIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2d1dHRlciB7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCiAgY29sb3I6ICMzMzM7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9wcmludF9tYXJnaW4ge1wNCiAgd2lkdGg6IDFweDtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogIzZCNzJFNjtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgYmxhY2s7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1wNCn1cDQogICAgICAgIFwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiByZ2IoMTkxLCAxOTEsIDE5MSk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfa2V5d29yZCB7XA0KICBjb2xvcjogYmx1ZTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfYnVpbGRpbiB7XA0KICBjb2xvcjogcmdiKDg4LCA3MiwgMjQ2KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6IHJnYig4OCwgOTIsIDI0Nik7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xpYnJhcnkge1wNCiAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9pbnZhbGlkIHtcDQogIGJhY2tncm91bmQtY29sb3I6IHJnYigxNTMsIDAsIDApO1wNCiAgY29sb3I6IHdoaXRlO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiByZ2IoNjAsIDc2LCAxMTQpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2NvbnN0YW50IHtcDQogIGNvbG9yOiByZ2IoNiwgMTUwLCAxNCk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfdHlwZSxcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2NsYXNzIHtcDQogIGNvbG9yOiByZ2IoMTA5LCAxMjEsIDIyMik7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige1wNCiAgY29sb3I6IHJnYigxMDQsIDExOCwgMTM1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6IHJnYigzLCAxMDYsIDcpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6IHJnYig3NiwgMTM2LCAxMDcpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQuYWNlX2RvYyB7XA0KICBjb2xvcjogcmdiKDAsIDEwMiwgMjU1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MuYWNlX3RhZyB7XA0KICBjb2xvcjogcmdiKDEyOCwgMTU5LCAxOTEpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcDQogIGNvbG9yOiByZ2IoMCwgMCwgMjA1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV92YXJpYWJsZSB7XA0KICBjb2xvcjogcmdiKDQ5LCAxMzIsIDE0OSk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfeG1sX3BlIHtcDQogIGNvbG9yOiByZ2IoMTA0LCAxMDQsIDkxKTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6ICMwMDAwQTI7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tYXJrdXAuYWNlX21hcmt1cGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcge1wNCiAgY29sb3I6IHJnYigxMiwgNywgMjU1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XA0KICBjb2xvcjpyZ2IoMTg1LCA2LCAxNDQpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtcDQogIGJhY2tncm91bmQ6IHJnYigxODEsIDIxMywgMjU1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDI1MiwgMjU1LCAwKTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0YWNrIHtcDQogIGJhY2tncm91bmQ6IHJnYigxNjQsIDIyOSwgMTAxKTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE5MiwgMTkyLCAxOTIpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA3KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYmFja2dyb3VuZDogcmdiKDI1MCwgMjUwLCAyNTUpO1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwMCwgMjAwLCAyNTApO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWV0YS5hY2VfdGFnIHtcDQogIGNvbG9yOnJnYigyOCwgMiwgMjU1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX3N0cmluZy5hY2VfcmVnZXgge1wNCiAgY29sb3I6IHJnYigyNTUsIDAsIDApXA0KfSI7DQoNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7DQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/ace.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZyhhKXt2YXIgZT1mdW5jdGlvbihhLGIpe3JldHVybiBkKCIiLGEsYil9O2UucGFja2FnZWQ9ITA7dmFyIGY9YjthJiYoYlthXXx8KGJbYV09e30pLGY9YlthXSksZi5kZWZpbmUmJihjLm9yaWdpbmFsPWYuZGVmaW5lKSxmLmRlZmluZT1jLGYucmVxdWlyZSYmKGQub3JpZ2luYWw9Zi5yZXF1aXJlKSxmLnJlcXVpcmU9ZX12YXIgYT0iIixiPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7aWYodHlwZW9mIHJlcXVpcmVqcyE9InVuZGVmaW5lZCIpcmV0dXJuO3ZhciBjPWZ1bmN0aW9uKGEsYixkKXtpZih0eXBlb2YgYSE9InN0cmluZyIpe2Mub3JpZ2luYWw/Yy5vcmlnaW5hbC5hcHBseSh3aW5kb3csYXJndW1lbnRzKTooY29uc29sZS5lcnJvcigiZHJvcHBpbmcgbW9kdWxlIGJlY2F1c2UgZGVmaW5lIHdhc24ndCBhIHN0cmluZy4iKSxjb25zb2xlLnRyYWNlKCkpO3JldHVybn1hcmd1bWVudHMubGVuZ3RoPT0yJiYoZD1iKSxjLm1vZHVsZXN8fChjLm1vZHVsZXM9e30pLGMubW9kdWxlc1thXT1kfSxkPWZ1bmN0aW9uKGEsYixjKXtpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYik9PT0iW29iamVjdCBBcnJheV0iKXt2YXIgZT1bXTtmb3IodmFyIGc9MCxoPWIubGVuZ3RoO2c8aDsrK2cpe3ZhciBpPWYoYSxiW2ddKTtpZighaSYmZC5vcmlnaW5hbClyZXR1cm4gZC5vcmlnaW5hbC5hcHBseSh3aW5kb3csYXJndW1lbnRzKTtlLnB1c2goaSl9YyYmYy5hcHBseShudWxsLGUpfWVsc2V7aWYodHlwZW9mIGI9PSJzdHJpbmciKXt2YXIgaj1mKGEsYik7cmV0dXJuIWomJmQub3JpZ2luYWw/ZC5vcmlnaW5hbC5hcHBseSh3aW5kb3csYXJndW1lbnRzKTooYyYmYygpLGopfWlmKGQub3JpZ2luYWwpcmV0dXJuIGQub3JpZ2luYWwuYXBwbHkod2luZG93LGFyZ3VtZW50cyl9fSxlPWZ1bmN0aW9uKGEsYil7aWYoYi5pbmRleE9mKCIhIikhPT0tMSl7dmFyIGM9Yi5zcGxpdCgiISIpO3JldHVybiBlKGEsY1swXSkrIiEiK2UoYSxjWzFdKX1pZihiLmNoYXJBdCgwKT09Ii4iKXt2YXIgZD1hLnNwbGl0KCIvIikuc2xpY2UoMCwtMSkuam9pbigiLyIpO2I9ZCsiLyIrYjt3aGlsZShiLmluZGV4T2YoIi4iKSE9PS0xJiZmIT1iKXt2YXIgZj1iO2I9Yi5yZXBsYWNlKC9cL1wuXC8vLCIvIikucmVwbGFjZSgvW15cL10rXC9cLlwuXC8vLCIiKX19cmV0dXJuIGJ9LGY9ZnVuY3Rpb24oYSxiKXtiPWUoYSxiKTt2YXIgZj1jLm1vZHVsZXNbYl07aWYoIWYpcmV0dXJuIG51bGw7aWYodHlwZW9mIGY9PSJmdW5jdGlvbiIpe3ZhciBnPXt9LGg9e2lkOmIsdXJpOiIiLGV4cG9ydHM6ZyxwYWNrYWdlZDohMH0saT1mdW5jdGlvbihhLGMpe3JldHVybiBkKGIsYSxjKX0saj1mKGksZyxoKTtyZXR1cm4gZz1qfHxoLmV4cG9ydHMsYy5tb2R1bGVzW2JdPWcsZ31yZXR1cm4gZn07ZyhhKX0pKCksZGVmaW5lKCJhY2UvYWNlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9maXhvbGRicm93c2VycyIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9ldmVudCIsImFjZS9lZGl0b3IiLCJhY2UvZWRpdF9zZXNzaW9uIiwiYWNlL3VuZG9tYW5hZ2VyIiwiYWNlL3ZpcnR1YWxfcmVuZGVyZXIiLCJhY2UvdGhlbWUvdGV4dG1hdGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiLGEoIi4vbGliL2ZpeG9sZGJyb3dzZXJzIik7dmFyIGQ9YSgiLi9saWIvZG9tIiksZT1hKCIuL2xpYi9ldmVudCIpLGY9YSgiLi9lZGl0b3IiKS5FZGl0b3IsZz1hKCIuL2VkaXRfc2Vzc2lvbiIpLkVkaXRTZXNzaW9uLGg9YSgiLi91bmRvbWFuYWdlciIpLlVuZG9NYW5hZ2VyLGk9YSgiLi92aXJ0dWFsX3JlbmRlcmVyIikuVmlydHVhbFJlbmRlcmVyO2IuZWRpdD1mdW5jdGlvbihiKXt0eXBlb2YgYj09InN0cmluZyImJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt2YXIgYz1uZXcgZyhkLmdldElubmVyVGV4dChiKSk7Yy5zZXRVbmRvTWFuYWdlcihuZXcgaCksYi5pbm5lckhUTUw9IiI7dmFyIGo9bmV3IGYobmV3IGkoYixhKCIuL3RoZW1lL3RleHRtYXRlIikpKTtqLnNldFNlc3Npb24oYyk7dmFyIGs9e307cmV0dXJuIGsuZG9jdW1lbnQ9YyxrLmVkaXRvcj1qLGoucmVzaXplKCksZS5hZGRMaXN0ZW5lcih3aW5kb3csInJlc2l6ZSIsZnVuY3Rpb24oKXtqLnJlc2l6ZSgpfSksYi5lbnY9ayxqLmVudj1rLGp9fSksZGVmaW5lKCJhY2UvbGliL2ZpeG9sZGJyb3dzZXJzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9yZWdleHAiLCJhY2UvbGliL2VzNS1zaGltIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IixhKCIuL3JlZ2V4cCIpLGEoIi4vZXM1LXNoaW0iKX0pLGRlZmluZSgiYWNlL2xpYi9yZWdleHAiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZyhhKXtyZXR1cm4oYS5nbG9iYWw/ImciOiIiKSsoYS5pZ25vcmVDYXNlPyJpIjoiIikrKGEubXVsdGlsaW5lPyJtIjoiIikrKGEuZXh0ZW5kZWQ/IngiOiIiKSsoYS5zdGlja3k/InkiOiIiKX1mdW5jdGlvbiBoKGEsYixjKXtpZihBcnJheS5wcm90b3R5cGUuaW5kZXhPZilyZXR1cm4gYS5pbmRleE9mKGIsYyk7Zm9yKHZhciBkPWN8fDA7ZDxhLmxlbmd0aDtkKyspaWYoYVtkXT09PWIpcmV0dXJuIGQ7cmV0dXJuLTF9InVzZSBzdHJpY3QiO3ZhciBkPXtleGVjOlJlZ0V4cC5wcm90b3R5cGUuZXhlYyx0ZXN0OlJlZ0V4cC5wcm90b3R5cGUudGVzdCxtYXRjaDpTdHJpbmcucHJvdG90eXBlLm1hdGNoLHJlcGxhY2U6U3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlLHNwbGl0OlN0cmluZy5wcm90b3R5cGUuc3BsaXR9LGU9ZC5leGVjLmNhbGwoLygpPz8vLCIiKVsxXT09PXVuZGVmaW5lZCxmPWZ1bmN0aW9uKCl7dmFyIGE9L14vZztyZXR1cm4gZC50ZXN0LmNhbGwoYSwiIiksIWEubGFzdEluZGV4fSgpO1JlZ0V4cC5wcm90b3R5cGUuZXhlYz1mdW5jdGlvbihhKXt2YXIgYj1kLmV4ZWMuYXBwbHkodGhpcyxhcmd1bWVudHMpLGMsaTtpZihiKXshZSYmYi5sZW5ndGg+MSYmaChiLCIiKT4tMSYmKGk9UmVnRXhwKHRoaXMuc291cmNlLGQucmVwbGFjZS5jYWxsKGcodGhpcyksImciLCIiKSksZC5yZXBsYWNlLmNhbGwoYS5zbGljZShiLmluZGV4KSxpLGZ1bmN0aW9uKCl7Zm9yKHZhciBhPTE7YTxhcmd1bWVudHMubGVuZ3RoLTI7YSsrKWFyZ3VtZW50c1thXT09PXVuZGVmaW5lZCYmKGJbYV09dW5kZWZpbmVkKX0pKTtpZih0aGlzLl94cmVnZXhwJiZ0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lcylmb3IodmFyIGo9MTtqPGIubGVuZ3RoO2orKyljPXRoaXMuX3hyZWdleHAuY2FwdHVyZU5hbWVzW2otMV0sYyYmKGJbY109YltqXSk7IWYmJnRoaXMuZ2xvYmFsJiYhYlswXS5sZW5ndGgmJnRoaXMubGFzdEluZGV4PmIuaW5kZXgmJnRoaXMubGFzdEluZGV4LS19cmV0dXJuIGJ9LGZ8fChSZWdFeHAucHJvdG90eXBlLnRlc3Q9ZnVuY3Rpb24oYSl7dmFyIGI9ZC5leGVjLmNhbGwodGhpcyxhKTtyZXR1cm4gYiYmdGhpcy5nbG9iYWwmJiFiWzBdLmxlbmd0aCYmdGhpcy5sYXN0SW5kZXg+Yi5pbmRleCYmdGhpcy5sYXN0SW5kZXgtLSwhIWJ9KX0pLGRlZmluZSgiYWNlL2xpYi9lczUtc2hpbSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBwKGEpe3RyeXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsInNlbnRpbmVsIix7fSksInNlbnRpbmVsImluIGF9Y2F0Y2goYil7fX1GdW5jdGlvbi5wcm90b3R5cGUuYmluZHx8KEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7aWYodHlwZW9mIGMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgZD1nLmNhbGwoYXJndW1lbnRzLDEpLGU9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgZSl7dmFyIGE9ZnVuY3Rpb24oKXt9O2EucHJvdG90eXBlPWMucHJvdG90eXBlO3ZhciBmPW5ldyBhLGg9Yy5hcHBseShmLGQuY29uY2F0KGcuY2FsbChhcmd1bWVudHMpKSk7cmV0dXJuIGghPT1udWxsJiZPYmplY3QoaCk9PT1oP2g6Zn1yZXR1cm4gYy5hcHBseShiLGQuY29uY2F0KGcuY2FsbChhcmd1bWVudHMpKSl9O3JldHVybiBlfSk7dmFyIGQ9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsZT1BcnJheS5wcm90b3R5cGUsZj1PYmplY3QucHJvdG90eXBlLGc9ZS5zbGljZSxoPWQuYmluZChmLnRvU3RyaW5nKSxpPWQuYmluZChmLmhhc093blByb3BlcnR5KSxqLGssbCxtLG47aWYobj1pKGYsIl9fZGVmaW5lR2V0dGVyX18iKSlqPWQuYmluZChmLl9fZGVmaW5lR2V0dGVyX18pLGs9ZC5iaW5kKGYuX19kZWZpbmVTZXR0ZXJfXyksbD1kLmJpbmQoZi5fX2xvb2t1cEdldHRlcl9fKSxtPWQuYmluZChmLl9fbG9va3VwU2V0dGVyX18pO0FycmF5LmlzQXJyYXl8fChBcnJheS5pc0FycmF5PWZ1bmN0aW9uKGIpe3JldHVybiBoKGIpPT0iW29iamVjdCBBcnJheV0ifSksQXJyYXkucHJvdG90eXBlLmZvckVhY2h8fChBcnJheS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihiKXt2YXIgYz1HKHRoaXMpLGQ9YXJndW1lbnRzWzFdLGU9MCxmPWMubGVuZ3RoPj4+MDtpZihoKGIpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3I7d2hpbGUoZTxmKWUgaW4gYyYmYi5jYWxsKGQsY1tlXSxlLGMpLGUrK30pLEFycmF5LnByb3RvdHlwZS5tYXB8fChBcnJheS5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKGIpe3ZhciBjPUcodGhpcyksZD1jLmxlbmd0aD4+PjAsZT1BcnJheShkKSxmPWFyZ3VtZW50c1sxXTtpZihoKGIpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3I7Zm9yKHZhciBnPTA7ZzxkO2crKylnIGluIGMmJihlW2ddPWIuY2FsbChmLGNbZ10sZyxjKSk7cmV0dXJuIGV9KSxBcnJheS5wcm90b3R5cGUuZmlsdGVyfHwoQXJyYXkucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbihiKXt2YXIgYz1HKHRoaXMpLGQ9Yy5sZW5ndGg+Pj4wLGU9W10sZj1hcmd1bWVudHNbMV07aWYoaChiKSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yO2Zvcih2YXIgZz0wO2c8ZDtnKyspZyBpbiBjJiZiLmNhbGwoZixjW2ddLGcsYykmJmUucHVzaChjW2ddKTtyZXR1cm4gZX0pLEFycmF5LnByb3RvdHlwZS5ldmVyeXx8KEFycmF5LnByb3RvdHlwZS5ldmVyeT1mdW5jdGlvbihiKXt2YXIgYz1HKHRoaXMpLGQ9Yy5sZW5ndGg+Pj4wLGU9YXJndW1lbnRzWzFdO2lmKGgoYikhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcjtmb3IodmFyIGY9MDtmPGQ7ZisrKWlmKGYgaW4gYyYmIWIuY2FsbChlLGNbZl0sZixjKSlyZXR1cm4hMTtyZXR1cm4hMH0pLEFycmF5LnByb3RvdHlwZS5zb21lfHwoQXJyYXkucHJvdG90eXBlLnNvbWU9ZnVuY3Rpb24oYil7dmFyIGM9Ryh0aGlzKSxkPWMubGVuZ3RoPj4+MCxlPWFyZ3VtZW50c1sxXTtpZihoKGIpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3I7Zm9yKHZhciBmPTA7ZjxkO2YrKylpZihmIGluIGMmJmIuY2FsbChlLGNbZl0sZixjKSlyZXR1cm4hMDtyZXR1cm4hMX0pLEFycmF5LnByb3RvdHlwZS5yZWR1Y2V8fChBcnJheS5wcm90b3R5cGUucmVkdWNlPWZ1bmN0aW9uKGIpe3ZhciBjPUcodGhpcyksZD1jLmxlbmd0aD4+PjA7aWYoaChiKSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yO2lmKCFkJiZhcmd1bWVudHMubGVuZ3RoPT0xKXRocm93IG5ldyBUeXBlRXJyb3I7dmFyIGU9MCxmO2lmKGFyZ3VtZW50cy5sZW5ndGg+PTIpZj1hcmd1bWVudHNbMV07ZWxzZSBkb3tpZihlIGluIGMpe2Y9Y1tlKytdO2JyZWFrfWlmKCsrZT49ZCl0aHJvdyBuZXcgVHlwZUVycm9yfXdoaWxlKCEwKTtmb3IoO2U8ZDtlKyspZSBpbiBjJiYoZj1iLmNhbGwodm9pZCAwLGYsY1tlXSxlLGMpKTtyZXR1cm4gZn0pLEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodHx8KEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodD1mdW5jdGlvbihiKXt2YXIgYz1HKHRoaXMpLGQ9Yy5sZW5ndGg+Pj4wO2lmKGgoYikhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcjtpZighZCYmYXJndW1lbnRzLmxlbmd0aD09MSl0aHJvdyBuZXcgVHlwZUVycm9yO3ZhciBlLGY9ZC0xO2lmKGFyZ3VtZW50cy5sZW5ndGg+PTIpZT1hcmd1bWVudHNbMV07ZWxzZSBkb3tpZihmIGluIGMpe2U9Y1tmLS1dO2JyZWFrfWlmKC0tZjwwKXRocm93IG5ldyBUeXBlRXJyb3J9d2hpbGUoITApO2RvIGYgaW4gdGhpcyYmKGU9Yi5jYWxsKHZvaWQgMCxlLGNbZl0sZixjKSk7d2hpbGUoZi0tKTtyZXR1cm4gZX0pLEFycmF5LnByb3RvdHlwZS5pbmRleE9mfHwoQXJyYXkucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oYil7dmFyIGM9Ryh0aGlzKSxkPWMubGVuZ3RoPj4+MDtpZighZClyZXR1cm4tMTt2YXIgZT0wO2FyZ3VtZW50cy5sZW5ndGg+MSYmKGU9RShhcmd1bWVudHNbMV0pKSxlPWU+PTA/ZTpNYXRoLm1heCgwLGQrZSk7Zm9yKDtlPGQ7ZSsrKWlmKGUgaW4gYyYmY1tlXT09PWIpcmV0dXJuIGU7cmV0dXJuLTF9KSxBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2Z8fChBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oYil7dmFyIGM9Ryh0aGlzKSxkPWMubGVuZ3RoPj4+MDtpZighZClyZXR1cm4tMTt2YXIgZT1kLTE7YXJndW1lbnRzLmxlbmd0aD4xJiYoZT1NYXRoLm1pbihlLEUoYXJndW1lbnRzWzFdKSkpLGU9ZT49MD9lOmQtTWF0aC5hYnMoZSk7Zm9yKDtlPj0wO2UtLSlpZihlIGluIGMmJmI9PT1jW2VdKXJldHVybiBlO3JldHVybi0xfSksT2JqZWN0LmdldFByb3RvdHlwZU9mfHwoT2JqZWN0LmdldFByb3RvdHlwZU9mPWZ1bmN0aW9uKGIpe3JldHVybiBiLl9fcHJvdG9fX3x8KGIuY29uc3RydWN0b3I/Yi5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6Zil9KTtpZighT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcil7dmFyIG89Ik9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgY2FsbGVkIG9uIGEgbm9uLW9iamVjdDogIjtPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yPWZ1bmN0aW9uKGIsYyl7aWYodHlwZW9mIGIhPSJvYmplY3QiJiZ0eXBlb2YgYiE9ImZ1bmN0aW9uInx8Yj09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcihvK2IpO2lmKCFpKGIsYykpcmV0dXJuO3ZhciBkLGUsZztkPXtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH07aWYobil7dmFyIGg9Yi5fX3Byb3RvX187Yi5fX3Byb3RvX189Zjt2YXIgZT1sKGIsYyksZz1tKGIsYyk7Yi5fX3Byb3RvX189aDtpZihlfHxnKXJldHVybiBlJiYoZC5nZXQ9ZSksZyYmKGQuc2V0PWcpLGR9cmV0dXJuIGQudmFsdWU9YltjXSxkfX1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8KE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzPWZ1bmN0aW9uKGIpe3JldHVybiBPYmplY3Qua2V5cyhiKX0pLE9iamVjdC5jcmVhdGV8fChPYmplY3QuY3JlYXRlPWZ1bmN0aW9uKGIsYyl7dmFyIGQ7aWYoYj09PW51bGwpZD17Il9fcHJvdG9fXyI6bnVsbH07ZWxzZXtpZih0eXBlb2YgYiE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcigidHlwZW9mIHByb3RvdHlwZVsiK3R5cGVvZiBiKyJdICE9ICdvYmplY3QnIik7dmFyIGU9ZnVuY3Rpb24oKXt9O2UucHJvdG90eXBlPWIsZD1uZXcgZSxkLl9fcHJvdG9fXz1ifXJldHVybiBjIT09dm9pZCAwJiZPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkLGMpLGR9KTtpZihPYmplY3QuZGVmaW5lUHJvcGVydHkpe3ZhciBxPXAoe30pLHI9dHlwZW9mIGRvY3VtZW50PT0idW5kZWZpbmVkInx8cChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7aWYoIXF8fCFyKXZhciBzPU9iamVjdC5kZWZpbmVQcm9wZXJ0eX1pZighT2JqZWN0LmRlZmluZVByb3BlcnR5fHxzKXt2YXIgdD0iUHJvcGVydHkgZGVzY3JpcHRpb24gbXVzdCBiZSBhbiBvYmplY3Q6ICIsdT0iT2JqZWN0LmRlZmluZVByb3BlcnR5IGNhbGxlZCBvbiBub24tb2JqZWN0OiAiLHY9ImdldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCBvbiB0aGlzIGphdmFzY3JpcHQgZW5naW5lIjtPYmplY3QuZGVmaW5lUHJvcGVydHk9ZnVuY3Rpb24oYixjLGQpe2lmKHR5cGVvZiBiIT0ib2JqZWN0IiYmdHlwZW9mIGIhPSJmdW5jdGlvbiJ8fGI9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IodStiKTtpZih0eXBlb2YgZCE9Im9iamVjdCImJnR5cGVvZiBkIT0iZnVuY3Rpb24ifHxkPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKHQrZCk7aWYocyl0cnl7cmV0dXJuIHMuY2FsbChPYmplY3QsYixjLGQpfWNhdGNoKGUpe31pZihpKGQsInZhbHVlIikpaWYobiYmKGwoYixjKXx8bShiLGMpKSl7dmFyIGc9Yi5fX3Byb3RvX187Yi5fX3Byb3RvX189ZixkZWxldGUgYltjXSxiW2NdPWQudmFsdWUsYi5fX3Byb3RvX189Z31lbHNlIGJbY109ZC52YWx1ZTtlbHNle2lmKCFuKXRocm93IG5ldyBUeXBlRXJyb3Iodik7aShkLCJnZXQiKSYmaihiLGMsZC5nZXQpLGkoZCwic2V0IikmJmsoYixjLGQuc2V0KX1yZXR1cm4gYn19T2JqZWN0LmRlZmluZVByb3BlcnRpZXN8fChPYmplY3QuZGVmaW5lUHJvcGVydGllcz1mdW5jdGlvbihiLGMpe2Zvcih2YXIgZCBpbiBjKWkoYyxkKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsZCxjW2RdKTtyZXR1cm4gYn0pLE9iamVjdC5zZWFsfHwoT2JqZWN0LnNlYWw9ZnVuY3Rpb24oYil7cmV0dXJuIGJ9KSxPYmplY3QuZnJlZXplfHwoT2JqZWN0LmZyZWV6ZT1mdW5jdGlvbihiKXtyZXR1cm4gYn0pO3RyeXtPYmplY3QuZnJlZXplKGZ1bmN0aW9uKCl7fSl9Y2F0Y2godyl7T2JqZWN0LmZyZWV6ZT1mdW5jdGlvbihiKXtyZXR1cm4gZnVuY3Rpb24oYyl7cmV0dXJuIHR5cGVvZiBjPT0iZnVuY3Rpb24iP2M6YihjKX19KE9iamVjdC5mcmVlemUpfU9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uc3x8KE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucz1mdW5jdGlvbihiKXtyZXR1cm4gYn0pLE9iamVjdC5pc1NlYWxlZHx8KE9iamVjdC5pc1NlYWxlZD1mdW5jdGlvbihiKXtyZXR1cm4hMX0pLE9iamVjdC5pc0Zyb3plbnx8KE9iamVjdC5pc0Zyb3plbj1mdW5jdGlvbihiKXtyZXR1cm4hMX0pLE9iamVjdC5pc0V4dGVuc2libGV8fChPYmplY3QuaXNFeHRlbnNpYmxlPWZ1bmN0aW9uKGIpe2lmKE9iamVjdChiKT09PWIpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgYz0iIjt3aGlsZShpKGIsYykpYys9Ij8iO2JbY109ITA7dmFyIGQ9aShiLGMpO3JldHVybiBkZWxldGUgYltjXSxkfSk7aWYoIU9iamVjdC5rZXlzKXt2YXIgeD0hMCx5PVsidG9TdHJpbmciLCJ0b0xvY2FsZVN0cmluZyIsInZhbHVlT2YiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsImNvbnN0cnVjdG9yIl0sej15Lmxlbmd0aDtmb3IodmFyIEEgaW57dG9TdHJpbmc6bnVsbH0peD0hMTtPYmplY3Qua2V5cz1mdW5jdGlvbiBIKGEpe2lmKHR5cGVvZiBhIT0ib2JqZWN0IiYmdHlwZW9mIGEhPSJmdW5jdGlvbiJ8fGE9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTt2YXIgSD1bXTtmb3IodmFyIGIgaW4gYSlpKGEsYikmJkgucHVzaChiKTtpZih4KWZvcih2YXIgYz0wLGQ9ejtjPGQ7YysrKXt2YXIgZT15W2NdO2koYSxlKSYmSC5wdXNoKGUpfXJldHVybiBIfX1pZighRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmd8fChuZXcgRGF0ZSgtNjIxOTg3NTUyZTUpKS50b0lTT1N0cmluZygpLmluZGV4T2YoIi0wMDAwMDEiKT09PS0xKURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGIsYyxkLGU7aWYoIWlzRmluaXRlKHRoaXMpKXRocm93IG5ldyBSYW5nZUVycm9yO2I9W3RoaXMuZ2V0VVRDTW9udGgoKSsxLHRoaXMuZ2V0VVRDRGF0ZSgpLHRoaXMuZ2V0VVRDSG91cnMoKSx0aGlzLmdldFVUQ01pbnV0ZXMoKSx0aGlzLmdldFVUQ1NlY29uZHMoKV0sZT10aGlzLmdldFVUQ0Z1bGxZZWFyKCksZT0oZTwwPyItIjplPjk5OTk/IisiOiIiKSsoIjAwMDAwIitNYXRoLmFicyhlKSkuc2xpY2UoMDw9ZSYmZTw9OTk5OT8tNDotNiksYz1iLmxlbmd0aDt3aGlsZShjLS0pZD1iW2NdLGQ8MTAmJihiW2NdPSIwIitkKTtyZXR1cm4gZSsiLSIrYi5zbGljZSgwLDIpLmpvaW4oIi0iKSsiVCIrYi5zbGljZSgyKS5qb2luKCI6IikrIi4iKygiMDAwIit0aGlzLmdldFVUQ01pbGxpc2Vjb25kcygpKS5zbGljZSgtMykrIloifTtEYXRlLm5vd3x8KERhdGUubm93PWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9KSxEYXRlLnByb3RvdHlwZS50b0pTT058fChEYXRlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oYil7aWYodHlwZW9mIHRoaXMudG9JU09TdHJpbmchPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcjtyZXR1cm4gdGhpcy50b0lTT1N0cmluZygpfSksRGF0ZS5wYXJzZSgiKzI3NTc2MC0wOS0xM1QwMDowMDowMC4wMDBaIikhPT04NjRlMTMmJihEYXRlPWZ1bmN0aW9uKGEpe3ZhciBiPWZ1bmN0aW9uIGUoYixjLGQsZixnLGgsaSl7dmFyIGo9YXJndW1lbnRzLmxlbmd0aDtpZih0aGlzIGluc3RhbmNlb2YgYSl7dmFyIGs9aj09MSYmU3RyaW5nKGIpPT09Yj9uZXcgYShlLnBhcnNlKGIpKTpqPj03P25ldyBhKGIsYyxkLGYsZyxoLGkpOmo+PTY/bmV3IGEoYixjLGQsZixnLGgpOmo+PTU/bmV3IGEoYixjLGQsZixnKTpqPj00P25ldyBhKGIsYyxkLGYpOmo+PTM/bmV3IGEoYixjLGQpOmo+PTI/bmV3IGEoYixjKTpqPj0xP25ldyBhKGIpOm5ldyBhO3JldHVybiBrLmNvbnN0cnVjdG9yPWUsa31yZXR1cm4gYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGM9bmV3IFJlZ0V4cCgiXihcXGR7NH18WystXVxcZHs2fSkoPzotKFxcZHsyfSkoPzotKFxcZHsyfSkoPzpUKFxcZHsyfSk6KFxcZHsyfSkoPzo6KFxcZHsyfSkoPzpcXC4oXFxkezN9KSk/KT8oPzpafCg/OihbLStdKShcXGR7Mn0pOihcXGR7Mn0pKSk/KT8pPyk/JCIpO2Zvcih2YXIgZCBpbiBhKWJbZF09YVtkXTtyZXR1cm4gYi5ub3c9YS5ub3csYi5VVEM9YS5VVEMsYi5wcm90b3R5cGU9YS5wcm90b3R5cGUsYi5wcm90b3R5cGUuY29uc3RydWN0b3I9YixiLnBhcnNlPWZ1bmN0aW9uKGQpe3ZhciBlPWMuZXhlYyhkKTtpZihlKXtlLnNoaWZ0KCk7Zm9yKHZhciBmPTE7Zjw3O2YrKyllW2ZdPSsoZVtmXXx8KGY8Mz8xOjApKSxmPT0xJiZlW2ZdLS07dmFyIGc9K2UucG9wKCksaD0rZS5wb3AoKSxpPWUucG9wKCksaj0wO2lmKGkpe2lmKGg+MjN8fGc+NTkpcmV0dXJuIE5hTjtqPShoKjYwK2cpKjZlNCooaT09IisiPy0xOjEpfXZhciBrPStlWzBdO3JldHVybiAwPD1rJiZrPD05OT8oZVswXT1rKzQwMCxhLlVUQy5hcHBseSh0aGlzLGUpK2otMTI2MjI3ODA4ZTUpOmEuVVRDLmFwcGx5KHRoaXMsZSkran1yZXR1cm4gYS5wYXJzZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGJ9KERhdGUpKTt2YXIgQj0iXHRcbgtcZlxyIMKg4ZqA4aCO4oCA4oCB4oCC4oCD4oCE4oCF4oCG4oCH4oCI4oCJ4oCK4oCv4oGf44CAXHUyMDI4XHUyMDI577u/IjtpZighU3RyaW5nLnByb3RvdHlwZS50cmltfHxCLnRyaW0oKSl7Qj0iWyIrQisiXSI7dmFyIEM9bmV3IFJlZ0V4cCgiXiIrQitCKyIqIiksRD1uZXcgUmVnRXhwKEIrQisiKiQiKTtTdHJpbmcucHJvdG90eXBlLnRyaW09ZnVuY3Rpb24oKXtyZXR1cm4gU3RyaW5nKHRoaXMpLnJlcGxhY2UoQywiIikucmVwbGFjZShELCIiKX19dmFyIEU9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9K2EsYSE9PWE/YT0wOmEhPT0wJiZhIT09MS8wJiZhIT09LUluZmluaXR5JiYoYT0oYT4wfHwtMSkqTWF0aC5mbG9vcihNYXRoLmFicyhhKSkpLGF9LEY9ImEiWzBdIT0iYSIsRz1mdW5jdGlvbihhKXtpZihhPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3I7cmV0dXJuIEYmJnR5cGVvZiBhPT0ic3RyaW5nIiYmYT9hLnNwbGl0KCIiKTpPYmplY3QoYSl9fSksZGVmaW5lKCJhY2UvbGliL2RvbSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiO2IuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihhLGIpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlM/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGJ8fGQsYSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChhKX0sYi5zZXRUZXh0PWZ1bmN0aW9uKGEsYil7YS5pbm5lclRleHQhPT11bmRlZmluZWQmJihhLmlubmVyVGV4dD1iKSxhLnRleHRDb250ZW50IT09dW5kZWZpbmVkJiYoYS50ZXh0Q29udGVudD1iKX0sYi5oYXNDc3NDbGFzcz1mdW5jdGlvbihhLGIpe3ZhciBjPWEuY2xhc3NOYW1lLnNwbGl0KC9ccysvZyk7cmV0dXJuIGMuaW5kZXhPZihiKSE9PS0xfSxiLmFkZENzc0NsYXNzPWZ1bmN0aW9uKGEsYyl7Yi5oYXNDc3NDbGFzcyhhLGMpfHwoYS5jbGFzc05hbWUrPSIgIitjKX0sYi5yZW1vdmVDc3NDbGFzcz1mdW5jdGlvbihhLGIpe3ZhciBjPWEuY2xhc3NOYW1lLnNwbGl0KC9ccysvZyk7Zm9yKDs7KXt2YXIgZD1jLmluZGV4T2YoYik7aWYoZD09LTEpYnJlYWs7Yy5zcGxpY2UoZCwxKX1hLmNsYXNzTmFtZT1jLmpvaW4oIiAiKX0sYi50b2dnbGVDc3NDbGFzcz1mdW5jdGlvbihhLGIpe3ZhciBjPWEuY2xhc3NOYW1lLnNwbGl0KC9ccysvZyksZD0hMDtmb3IoOzspe3ZhciBlPWMuaW5kZXhPZihiKTtpZihlPT0tMSlicmVhaztkPSExLGMuc3BsaWNlKGUsMSl9cmV0dXJuIGQmJmMucHVzaChiKSxhLmNsYXNzTmFtZT1jLmpvaW4oIiAiKSxkfSxiLnNldENzc0NsYXNzPWZ1bmN0aW9uKGEsYyxkKXtkP2IuYWRkQ3NzQ2xhc3MoYSxjKTpiLnJlbW92ZUNzc0NsYXNzKGEsYyl9LGIuaGFzQ3NzU3RyaW5nPWZ1bmN0aW9uKGEsYil7dmFyIGM9MCxkO2I9Ynx8ZG9jdW1lbnQ7aWYoYi5jcmVhdGVTdHlsZVNoZWV0JiYoZD1iLnN0eWxlU2hlZXRzKSl7d2hpbGUoYzxkLmxlbmd0aClpZihkW2MrK10udGl0bGU9PT1hKXJldHVybiEwfWVsc2UgaWYoZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHlsZSIpKXdoaWxlKGM8ZC5sZW5ndGgpaWYoZFtjKytdLmlkPT09YSlyZXR1cm4hMDtyZXR1cm4hMX0sYi5pbXBvcnRDc3NTdHJpbmc9ZnVuY3Rpb24oYyxlLGYpe2Y9Znx8ZG9jdW1lbnQ7aWYoZSYmYi5oYXNDc3NTdHJpbmcoZSxmKSlyZXR1cm4gbnVsbDt2YXIgZztpZihmLmNyZWF0ZVN0eWxlU2hlZXQpZz1mLmNyZWF0ZVN0eWxlU2hlZXQoKSxnLmNzc1RleHQ9YyxlJiYoZy50aXRsZT1lKTtlbHNle2c9Zi5jcmVhdGVFbGVtZW50TlM/Zi5jcmVhdGVFbGVtZW50TlMoZCwic3R5bGUiKTpmLmNyZWF0ZUVsZW1lbnQoInN0eWxlIiksZy5hcHBlbmRDaGlsZChmLmNyZWF0ZVRleHROb2RlKGMpKSxlJiYoZy5pZD1lKTt2YXIgaD1mLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGYuZG9jdW1lbnRFbGVtZW50O2guYXBwZW5kQ2hpbGQoZyl9fSxiLmltcG9ydENzc1N0eWxzaGVldD1mdW5jdGlvbihhLGMpe2lmKGMuY3JlYXRlU3R5bGVTaGVldCljLmNyZWF0ZVN0eWxlU2hlZXQoYSk7ZWxzZXt2YXIgZD1iLmNyZWF0ZUVsZW1lbnQoImxpbmsiKTtkLnJlbD0ic3R5bGVzaGVldCIsZC5ocmVmPWE7dmFyIGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHxjLmRvY3VtZW50RWxlbWVudDtlLmFwcGVuZENoaWxkKGQpfX0sYi5nZXRJbm5lcldpZHRoPWZ1bmN0aW9uKGEpe3JldHVybiBwYXJzZUludChiLmNvbXB1dGVkU3R5bGUoYSwicGFkZGluZ0xlZnQiKSwxMCkrcGFyc2VJbnQoYi5jb21wdXRlZFN0eWxlKGEsInBhZGRpbmdSaWdodCIpLDEwKSthLmNsaWVudFdpZHRofSxiLmdldElubmVySGVpZ2h0PWZ1bmN0aW9uKGEpe3JldHVybiBwYXJzZUludChiLmNvbXB1dGVkU3R5bGUoYSwicGFkZGluZ1RvcCIpLDEwKStwYXJzZUludChiLmNvbXB1dGVkU3R5bGUoYSwicGFkZGluZ0JvdHRvbSIpLDEwKSthLmNsaWVudEhlaWdodH0sd2luZG93LnBhZ2VZT2Zmc2V0IT09dW5kZWZpbmVkPyhiLmdldFBhZ2VTY3JvbGxUb3A9ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LnBhZ2VZT2Zmc2V0fSxiLmdldFBhZ2VTY3JvbGxMZWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5wYWdlWE9mZnNldH0pOihiLmdldFBhZ2VTY3JvbGxUb3A9ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxUb3B9LGIuZ2V0UGFnZVNjcm9sbExlZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0fSksd2luZG93LmdldENvbXB1dGVkU3R5bGU/Yi5jb21wdXRlZFN0eWxlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEsIiIpfHx7fSlbYl18fCIiOndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEsIiIpfHx7fX06Yi5jb21wdXRlZFN0eWxlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/YS5jdXJyZW50U3R5bGVbYl06YS5jdXJyZW50U3R5bGV9LGIuc2Nyb2xsYmFyV2lkdGg9ZnVuY3Rpb24oYSl7dmFyIGM9Yi5jcmVhdGVFbGVtZW50KCJwIik7Yy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5taW5XaWR0aD0iMHB4IixjLnN0eWxlLmhlaWdodD0iMjAwcHgiO3ZhciBkPWIuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kLnN0eWxlO2UucG9zaXRpb249ImFic29sdXRlIixlLmxlZnQ9Ii0xMDAwMHB4IixlLm92ZXJmbG93PSJoaWRkZW4iLGUud2lkdGg9IjIwMHB4IixlLm1pbldpZHRoPSIwcHgiLGUuaGVpZ2h0PSIxNTBweCIsZC5hcHBlbmRDaGlsZChjKTt2YXIgZj1hLmJvZHl8fGEuZG9jdW1lbnRFbGVtZW50O2YuYXBwZW5kQ2hpbGQoZCk7dmFyIGc9Yy5vZmZzZXRXaWR0aDtlLm92ZXJmbG93PSJzY3JvbGwiO3ZhciBoPWMub2Zmc2V0V2lkdGg7cmV0dXJuIGc9PWgmJihoPWQuY2xpZW50V2lkdGgpLGYucmVtb3ZlQ2hpbGQoZCksZy1ofSxiLnNldElubmVySHRtbD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuY2xvbmVOb2RlKCExKTtyZXR1cm4gYy5pbm5lckhUTUw9YixhLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGMsYSksY30sYi5zZXRJbm5lclRleHQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLm93bmVyRG9jdW1lbnQ7Yy5ib2R5JiYidGV4dENvbnRlbnQiaW4gYy5ib2R5P2EudGV4dENvbnRlbnQ9YjphLmlubmVyVGV4dD1ifSxiLmdldElubmVyVGV4dD1mdW5jdGlvbihhKXt2YXIgYj1hLm93bmVyRG9jdW1lbnQ7cmV0dXJuIGIuYm9keSYmInRleHRDb250ZW50ImluIGIuYm9keT9hLnRleHRDb250ZW50OmEuaW5uZXJUZXh0fHxhLnRleHRDb250ZW50fHwiIn0sYi5nZXRQYXJlbnRXaW5kb3c9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93fX0pLGRlZmluZSgiYWNlL2xpYi9ldmVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIva2V5cyIsImFjZS9saWIvdXNlcmFnZW50IiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZyhhLGIsYyl7dmFyIGY9MDtlLmlzT3BlcmEmJmUuaXNNYWM/Zj0wfChiLm1ldGFLZXk/MTowKXwoYi5hbHRLZXk/MjowKXwoYi5zaGlmdEtleT80OjApfChiLmN0cmxLZXk/ODowKTpmPTB8KGIuY3RybEtleT8xOjApfChiLmFsdEtleT8yOjApfChiLnNoaWZ0S2V5PzQ6MCl8KGIubWV0YUtleT84OjApO2lmKGMgaW4gZC5NT0RJRklFUl9LRVlTKXtzd2l0Y2goZC5NT0RJRklFUl9LRVlTW2NdKXtjYXNlIkFsdCI6Zj0yO2JyZWFrO2Nhc2UiU2hpZnQiOmY9NDticmVhaztjYXNlIkN0cmwiOmY9MTticmVhaztkZWZhdWx0OmY9OH1jPTB9cmV0dXJuIGYmOCYmKGM9PTkxfHxjPT05MykmJihjPTApLCEhZnx8YyBpbiBkLkZVTkNUSU9OX0tFWVN8fGMgaW4gZC5QUklOVEFCTEVfS0VZUz9hKGIsZixjKTohMX0idXNlIHN0cmljdCI7dmFyIGQ9YSgiLi9rZXlzIiksZT1hKCIuL3VzZXJhZ2VudCIpLGY9YSgiLi9kb20iKTtiLmFkZExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXtpZihhLmFkZEV2ZW50TGlzdGVuZXIpcmV0dXJuIGEuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITEpO2lmKGEuYXR0YWNoRXZlbnQpe3ZhciBkPWZ1bmN0aW9uKCl7Yyh3aW5kb3cuZXZlbnQpfTtjLl93cmFwcGVyPWQsYS5hdHRhY2hFdmVudCgib24iK2IsZCl9fSxiLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXtpZihhLnJlbW92ZUV2ZW50TGlzdGVuZXIpcmV0dXJuIGEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpO2EuZGV0YWNoRXZlbnQmJmEuZGV0YWNoRXZlbnQoIm9uIitiLGMuX3dyYXBwZXJ8fGMpfSxiLnN0b3BFdmVudD1mdW5jdGlvbihhKXtyZXR1cm4gYi5zdG9wUHJvcGFnYXRpb24oYSksYi5wcmV2ZW50RGVmYXVsdChhKSwhMX0sYi5zdG9wUHJvcGFnYXRpb249ZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24/YS5zdG9wUHJvcGFnYXRpb24oKTphLmNhbmNlbEJ1YmJsZT0hMH0sYi5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbihhKXthLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExfSxiLmdldERvY3VtZW50WD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGllbnRYP2EuY2xpZW50WCtmLmdldFBhZ2VTY3JvbGxMZWZ0KCk6YS5wYWdlWH0sYi5nZXREb2N1bWVudFk9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xpZW50WT9hLmNsaWVudFkrZi5nZXRQYWdlU2Nyb2xsVG9wKCk6YS5wYWdlWX0sYi5nZXRCdXR0b249ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ImRibGNsaWNrIj8wOmEudHlwZT09ImNvbnRleHRtZW51Ij8yOmEucHJldmVudERlZmF1bHQ/YS5idXR0b246ezE6MCwyOjIsNDoxfVthLmJ1dHRvbl19LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zZXRDYXB0dXJlP2IuY2FwdHVyZT1mdW5jdGlvbihhLGMsZCl7ZnVuY3Rpb24gZShhKXtyZXR1cm4gYyhhKSxiLnN0b3BQcm9wYWdhdGlvbihhKX1mdW5jdGlvbiBnKGUpe2MoZSksZnx8KGY9ITAsZChlKSksYi5yZW1vdmVMaXN0ZW5lcihhLCJtb3VzZW1vdmUiLGMpLGIucmVtb3ZlTGlzdGVuZXIoYSwibW91c2V1cCIsZyksYi5yZW1vdmVMaXN0ZW5lcihhLCJsb3NlY2FwdHVyZSIsZyksYS5yZWxlYXNlQ2FwdHVyZSgpfXZhciBmPSExO2IuYWRkTGlzdGVuZXIoYSwibW91c2Vtb3ZlIixjKSxiLmFkZExpc3RlbmVyKGEsIm1vdXNldXAiLGcpLGIuYWRkTGlzdGVuZXIoYSwibG9zZWNhcHR1cmUiLGcpLGEuc2V0Q2FwdHVyZSgpfTpiLmNhcHR1cmU9ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7YihhKSxhLnN0b3BQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGUoYSl7YiYmYihhKSxjJiZjKGEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsZCwhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsZSwhMCksYS5zdG9wUHJvcGFnYXRpb24oKX1kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLGQsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGUsITApfSxiLmFkZE1vdXNlV2hlZWxMaXN0ZW5lcj1mdW5jdGlvbihhLGMpe3ZhciBkPTAsZT1mdW5jdGlvbihhKXtpZihhLndoZWVsRGVsdGEhPT11bmRlZmluZWQpe01hdGguYWJzKGEud2hlZWxEZWx0YVkpPmQmJihkPU1hdGguYWJzKGEud2hlZWxEZWx0YVkpKTtpZihkPjVlMyl2YXIgYj00MDA7ZWxzZSB2YXIgYj04O2Eud2hlZWxEZWx0YVghPT11bmRlZmluZWQ/KGEud2hlZWxYPS1hLndoZWVsRGVsdGFYL2IsYS53aGVlbFk9LWEud2hlZWxEZWx0YVkvYik6KGEud2hlZWxYPTAsYS53aGVlbFk9LWEud2hlZWxEZWx0YS9iKX1lbHNlIGEuYXhpcyYmYS5heGlzPT1hLkhPUklaT05UQUxfQVhJUz8oYS53aGVlbFg9KGEuZGV0YWlsfHwwKSo1LGEud2hlZWxZPTApOihhLndoZWVsWD0wLGEud2hlZWxZPShhLmRldGFpbHx8MCkqNSk7YyhhKX07Yi5hZGRMaXN0ZW5lcihhLCJET01Nb3VzZVNjcm9sbCIsZSksYi5hZGRMaXN0ZW5lcihhLCJtb3VzZXdoZWVsIixlKX0sYi5hZGRNdWx0aU1vdXNlRG93bkxpc3RlbmVyPWZ1bmN0aW9uKGEsYyxkLGYsZyl7dmFyIGg9MCxpLGosaz1mdW5jdGlvbihhKXtoKz0xLGg9PTEmJihpPWEuY2xpZW50WCxqPWEuY2xpZW50WSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aD0wfSxmfHw2MDApKTt2YXIgZT1iLmdldEJ1dHRvbihhKT09YztpZighZXx8TWF0aC5hYnMoYS5jbGllbnRYLWkpPjV8fE1hdGguYWJzKGEuY2xpZW50WS1qKT41KWg9MDtoPT1kJiYoaD0wLGcoYSkpO2lmKGUpcmV0dXJuIGIucHJldmVudERlZmF1bHQoYSl9O2IuYWRkTGlzdGVuZXIoYSwibW91c2Vkb3duIixrKSxlLmlzT2xkSUUmJmIuYWRkTGlzdGVuZXIoYSwiZGJsY2xpY2siLGspfSxiLmFkZENvbW1hbmRLZXlMaXN0ZW5lcj1mdW5jdGlvbihhLGMpe3ZhciBkPWIuYWRkTGlzdGVuZXI7aWYoZS5pc09sZEdlY2tvfHxlLmlzT3BlcmEpe3ZhciBmPW51bGw7ZChhLCJrZXlkb3duIixmdW5jdGlvbihhKXtmPWEua2V5Q29kZX0pLGQoYSwia2V5cHJlc3MiLGZ1bmN0aW9uKGEpe3JldHVybiBnKGMsYSxmKX0pfWVsc2V7dmFyIGg9bnVsbDtkKGEsImtleWRvd24iLGZ1bmN0aW9uKGEpe3JldHVybiBoPWEua2V5SWRlbnRpZmllcnx8YS5rZXlDb2RlLGcoYyxhLGEua2V5Q29kZSl9KX19O2lmKHdpbmRvdy5wb3N0TWVzc2FnZSl7dmFyIGg9MTtiLm5leHRUaWNrPWZ1bmN0aW9uKGEsYyl7Yz1jfHx3aW5kb3c7dmFyIGQ9Inplcm8tdGltZW91dC1tZXNzYWdlLSIraDtiLmFkZExpc3RlbmVyKGMsIm1lc3NhZ2UiLGZ1bmN0aW9uIGUoZil7Zi5kYXRhPT1kJiYoYi5zdG9wUHJvcGFnYXRpb24oZiksYi5yZW1vdmVMaXN0ZW5lcihjLCJtZXNzYWdlIixlKSxhKCkpfSksYy5wb3N0TWVzc2FnZShkLCIqIil9fWVsc2UgYi5uZXh0VGljaz1mdW5jdGlvbihhLGIpe2I9Ynx8d2luZG93LHdpbmRvdy5zZXRUaW1lb3V0KGEsMCl9fSksZGVmaW5lKCJhY2UvbGliL2tleXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi9vb3AiKSxlPWZ1bmN0aW9uKCl7dmFyIGE9e01PRElGSUVSX0tFWVM6ezE2OiJTaGlmdCIsMTc6IkN0cmwiLDE4OiJBbHQiLDIyNDoiTWV0YSJ9LEtFWV9NT0RTOntjdHJsOjEsYWx0OjIsb3B0aW9uOjIsc2hpZnQ6NCxtZXRhOjgsY29tbWFuZDo4fSxGVU5DVElPTl9LRVlTOns4OiJCYWNrc3BhY2UiLDk6IlRhYiIsMTM6IlJldHVybiIsMTk6IlBhdXNlIiwyNzoiRXNjIiwzMjoiU3BhY2UiLDMzOiJQYWdlVXAiLDM0OiJQYWdlRG93biIsMzU6IkVuZCIsMzY6IkhvbWUiLDM3OiJMZWZ0IiwzODoiVXAiLDM5OiJSaWdodCIsNDA6IkRvd24iLDQ0OiJQcmludCIsNDU6Ikluc2VydCIsNDY6IkRlbGV0ZSIsOTY6Ik51bXBhZDAiLDk3OiJOdW1wYWQxIiw5ODoiTnVtcGFkMiIsOTk6Ik51bXBhZDMiLDEwMDoiTnVtcGFkNCIsMTAxOiJOdW1wYWQ1IiwxMDI6Ik51bXBhZDYiLDEwMzoiTnVtcGFkNyIsMTA0OiJOdW1wYWQ4IiwxMDU6Ik51bXBhZDkiLDExMjoiRjEiLDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYiLDExODoiRjciLDExOToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIiLDE0NDoiTnVtbG9jayIsMTQ1OiJTY3JvbGxsb2NrIn0sUFJJTlRBQkxFX0tFWVM6ezMyOiIgIiw0ODoiMCIsNDk6IjEiLDUwOiIyIiw1MToiMyIsNTI6IjQiLDUzOiI1Iiw1NDoiNiIsNTU6IjciLDU2OiI4Iiw1NzoiOSIsNTk6IjsiLDYxOiI9Iiw2NToiYSIsNjY6ImIiLDY3OiJjIiw2ODoiZCIsNjk6ImUiLDcwOiJmIiw3MToiZyIsNzI6ImgiLDczOiJpIiw3NDoiaiIsNzU6ImsiLDc2OiJsIiw3NzoibSIsNzg6Im4iLDc5OiJvIiw4MDoicCIsODE6InEiLDgyOiJyIiw4MzoicyIsODQ6InQiLDg1OiJ1Iiw4NjoidiIsODc6InciLDg4OiJ4Iiw4OToieSIsOTA6InoiLDEwNzoiKyIsMTA5OiItIiwxMTA6Ii4iLDE4ODoiLCIsMTkwOiIuIiwxOTE6Ii8iLDE5MjoiYCIsMjE5OiJbIiwyMjA6IlxcIiwyMjE6Il0iLDIyMjonIid9fTtmb3IodmFyIGIgaW4gYS5GVU5DVElPTl9LRVlTKXt2YXIgYz1hLkZVTkNUSU9OX0tFWVNbYl0udG9VcHBlckNhc2UoKTthW2NdPXBhcnNlSW50KGIsMTApfXJldHVybiBkLm1peGluKGEsYS5NT0RJRklFUl9LRVlTKSxkLm1peGluKGEsYS5QUklOVEFCTEVfS0VZUyksZC5taXhpbihhLGEuRlVOQ1RJT05fS0VZUyksYX0oKTtkLm1peGluKGIsZSksYi5rZXlDb2RlVG9TdHJpbmc9ZnVuY3Rpb24oYSl7cmV0dXJuKGVbYV18fFN0cmluZy5mcm9tQ2hhckNvZGUoYSkpLnRvTG93ZXJDYXNlKCl9fSksZGVmaW5lKCJhY2UvbGliL29vcCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCIsYi5pbmhlcml0cz1mdW5jdGlvbigpe3ZhciBhPWZ1bmN0aW9uKCl7fTtyZXR1cm4gZnVuY3Rpb24oYixjKXthLnByb3RvdHlwZT1jLnByb3RvdHlwZSxiLnN1cGVyXz1jLnByb3RvdHlwZSxiLnByb3RvdHlwZT1uZXcgYSxiLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ifX0oKSxiLm1peGluPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjIGluIGIpYVtjXT1iW2NdfSxiLmltcGxlbWVudD1mdW5jdGlvbihhLGMpe2IubWl4aW4oYSxjKX19KSxkZWZpbmUoImFjZS9saWIvdXNlcmFnZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD0obmF2aWdhdG9yLnBsYXRmb3JtLm1hdGNoKC9tYWN8d2lufGxpbnV4L2kpfHxbIm90aGVyIl0pWzBdLnRvTG93ZXJDYXNlKCksZT1uYXZpZ2F0b3IudXNlckFnZW50O2IuaXNXaW49ZD09IndpbiIsYi5pc01hYz1kPT0ibWFjIixiLmlzTGludXg9ZD09ImxpbnV4IixiLmlzSUU9bmF2aWdhdG9yLmFwcE5hbWU9PSJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiJiZwYXJzZUZsb2F0KG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01TSUUgKFswLTldK1tcLjAtOV0rKS8pWzFdKSxiLmlzT2xkSUU9Yi5pc0lFJiZiLmlzSUU8OSxiLmlzR2Vja289Yi5pc01vemlsbGE9d2luZG93LmNvbnRyb2xsZXJzJiZ3aW5kb3cubmF2aWdhdG9yLnByb2R1Y3Q9PT0iR2Vja28iLGIuaXNPbGRHZWNrbz1iLmlzR2Vja28mJnBhcnNlSW50KChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9ydlw6KFxkKykvKXx8W10pWzFdLDEwKTw0LGIuaXNPcGVyYT13aW5kb3cub3BlcmEmJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3aW5kb3cub3BlcmEpPT0iW29iamVjdCBPcGVyYV0iLGIuaXNXZWJLaXQ9cGFyc2VGbG9hdChlLnNwbGl0KCJXZWJLaXQvIilbMV0pfHx1bmRlZmluZWQsYi5pc0Nocm9tZT1wYXJzZUZsb2F0KGUuc3BsaXQoIiBDaHJvbWUvIilbMV0pfHx1bmRlZmluZWQsYi5pc0FJUj1lLmluZGV4T2YoIkFkb2JlQUlSIik+PTAsYi5pc0lQYWQ9ZS5pbmRleE9mKCJpUGFkIik+PTAsYi5pc1RvdWNoUGFkPWUuaW5kZXhPZigiVG91Y2hQYWQiKT49MCxiLk9TPXtMSU5VWDoiTElOVVgiLE1BQzoiTUFDIixXSU5ET1dTOiJXSU5ET1dTIn0sYi5nZXRPUz1mdW5jdGlvbigpe3JldHVybiBiLmlzTWFjP2IuT1MuTUFDOmIuaXNMaW51eD9iLk9TLkxJTlVYOmIuT1MuV0lORE9XU319KSxkZWZpbmUoImFjZS9lZGl0b3IiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2ZpeG9sZGJyb3dzZXJzIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL3VzZXJhZ2VudCIsImFjZS9rZXlib2FyZC90ZXh0aW5wdXQiLCJhY2UvbW91c2UvbW91c2VfaGFuZGxlciIsImFjZS9tb3VzZS9mb2xkX2hhbmRsZXIiLCJhY2Uva2V5Ym9hcmQva2V5YmluZGluZyIsImFjZS9lZGl0X3Nlc3Npb24iLCJhY2Uvc2VhcmNoIiwiYWNlL3JhbmdlIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL2NvbW1hbmRzL2NvbW1hbmRfbWFuYWdlciIsImFjZS9jb21tYW5kcy9kZWZhdWx0X2NvbW1hbmRzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IixhKCIuL2xpYi9maXhvbGRicm93c2VycyIpO3ZhciBkPWEoIi4vbGliL29vcCIpLGU9YSgiLi9saWIvbGFuZyIpLGY9YSgiLi9saWIvdXNlcmFnZW50IiksZz1hKCIuL2tleWJvYXJkL3RleHRpbnB1dCIpLlRleHRJbnB1dCxoPWEoIi4vbW91c2UvbW91c2VfaGFuZGxlciIpLk1vdXNlSGFuZGxlcixpPWEoIi4vbW91c2UvZm9sZF9oYW5kbGVyIikuRm9sZEhhbmRsZXIsaj1hKCIuL2tleWJvYXJkL2tleWJpbmRpbmciKS5LZXlCaW5kaW5nLGs9YSgiLi9lZGl0X3Nlc3Npb24iKS5FZGl0U2Vzc2lvbixsPWEoIi4vc2VhcmNoIikuU2VhcmNoLG09YSgiLi9yYW5nZSIpLlJhbmdlLG49YSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixvPWEoIi4vY29tbWFuZHMvY29tbWFuZF9tYW5hZ2VyIikuQ29tbWFuZE1hbmFnZXIscD1hKCIuL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMiKS5jb21tYW5kcyxxPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRDb250YWluZXJFbGVtZW50KCk7dGhpcy5jb250YWluZXI9Yyx0aGlzLnJlbmRlcmVyPWEsdGhpcy50ZXh0SW5wdXQ9bmV3IGcoYS5nZXRUZXh0QXJlYUNvbnRhaW5lcigpLHRoaXMpLHRoaXMua2V5QmluZGluZz1uZXcgaih0aGlzKSxmLmlzSVBhZHx8KHRoaXMuJG1vdXNlSGFuZGxlcj1uZXcgaCh0aGlzKSxuZXcgaSh0aGlzKSksdGhpcy4kYmxvY2tTY3JvbGxpbmc9MCx0aGlzLiRzZWFyY2g9KG5ldyBsKS5zZXQoe3dyYXA6ITB9KSx0aGlzLmNvbW1hbmRzPW5ldyBvKGYuaXNNYWM/Im1hYyI6IndpbiIscCksdGhpcy5zZXRTZXNzaW9uKGJ8fG5ldyBrKCIiKSl9OygoZnVuY3Rpb24oKXtkLmltcGxlbWVudCh0aGlzLG4pLHRoaXMuc2V0S2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKGEpe3RoaXMua2V5QmluZGluZy5zZXRLZXlib2FyZEhhbmRsZXIoYSl9LHRoaXMuZ2V0S2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2V5QmluZGluZy5nZXRLZXlib2FyZEhhbmRsZXIoKX0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKGEpe2lmKHRoaXMuc2Vzc2lvbj09YSlyZXR1cm47aWYodGhpcy5zZXNzaW9uKXt2YXIgYj10aGlzLnNlc3Npb247dGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy4kb25Eb2N1bWVudENoYW5nZSksdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZU1vZGUiLHRoaXMuJG9uQ2hhbmdlTW9kZSksdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRva2VuaXplclVwZGF0ZSIsdGhpcy4kb25Ub2tlbml6ZXJVcGRhdGUpLHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VUYWJTaXplIix0aGlzLiRvbkNoYW5nZVRhYlNpemUpLHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VXcmFwTGltaXQiLHRoaXMuJG9uQ2hhbmdlV3JhcExpbWl0KSx0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlV3JhcE1vZGUiLHRoaXMuJG9uQ2hhbmdlV3JhcE1vZGUpLHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJvbkNoYW5nZUZvbGQiLHRoaXMuJG9uQ2hhbmdlRm9sZCksdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZUZyb250TWFya2VyIix0aGlzLiRvbkNoYW5nZUZyb250TWFya2VyKSx0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlQmFja01hcmtlciIsdGhpcy4kb25DaGFuZ2VCYWNrTWFya2VyKSx0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlQnJlYWtwb2ludCIsdGhpcy4kb25DaGFuZ2VCcmVha3BvaW50KSx0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlQW5ub3RhdGlvbiIsdGhpcy4kb25DaGFuZ2VBbm5vdGF0aW9uKSx0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlT3ZlcndyaXRlIix0aGlzLiRvbkN1cnNvckNoYW5nZSksdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZVNjcm9sbFRvcCIsdGhpcy4kb25TY3JvbGxUb3BDaGFuZ2UpLHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VMZWZ0VG9wIix0aGlzLiRvblNjcm9sbExlZnRDaGFuZ2UpO3ZhciBjPXRoaXMuc2Vzc2lvbi5nZXRTZWxlY3Rpb24oKTtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZUN1cnNvciIsdGhpcy4kb25DdXJzb3JDaGFuZ2UpLGMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlU2VsZWN0aW9uIix0aGlzLiRvblNlbGVjdGlvbkNoYW5nZSl9dGhpcy5zZXNzaW9uPWEsdGhpcy4kb25Eb2N1bWVudENoYW5nZT10aGlzLm9uRG9jdW1lbnRDaGFuZ2UuYmluZCh0aGlzKSxhLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy4kb25Eb2N1bWVudENoYW5nZSksdGhpcy5yZW5kZXJlci5zZXRTZXNzaW9uKGEpLHRoaXMuJG9uQ2hhbmdlTW9kZT10aGlzLm9uQ2hhbmdlTW9kZS5iaW5kKHRoaXMpLGEuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlTW9kZSIsdGhpcy4kb25DaGFuZ2VNb2RlKSx0aGlzLiRvblRva2VuaXplclVwZGF0ZT10aGlzLm9uVG9rZW5pemVyVXBkYXRlLmJpbmQodGhpcyksYS5hZGRFdmVudExpc3RlbmVyKCJ0b2tlbml6ZXJVcGRhdGUiLHRoaXMuJG9uVG9rZW5pemVyVXBkYXRlKSx0aGlzLiRvbkNoYW5nZVRhYlNpemU9dGhpcy5yZW5kZXJlci51cGRhdGVUZXh0LmJpbmQodGhpcy5yZW5kZXJlciksYS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VUYWJTaXplIix0aGlzLiRvbkNoYW5nZVRhYlNpemUpLHRoaXMuJG9uQ2hhbmdlV3JhcExpbWl0PXRoaXMub25DaGFuZ2VXcmFwTGltaXQuYmluZCh0aGlzKSxhLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZVdyYXBMaW1pdCIsdGhpcy4kb25DaGFuZ2VXcmFwTGltaXQpLHRoaXMuJG9uQ2hhbmdlV3JhcE1vZGU9dGhpcy5vbkNoYW5nZVdyYXBNb2RlLmJpbmQodGhpcyksYS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VXcmFwTW9kZSIsdGhpcy4kb25DaGFuZ2VXcmFwTW9kZSksdGhpcy4kb25DaGFuZ2VGb2xkPXRoaXMub25DaGFuZ2VGb2xkLmJpbmQodGhpcyksYS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VGb2xkIix0aGlzLiRvbkNoYW5nZUZvbGQpLHRoaXMuJG9uQ2hhbmdlRnJvbnRNYXJrZXI9dGhpcy5vbkNoYW5nZUZyb250TWFya2VyLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZUZyb250TWFya2VyIix0aGlzLiRvbkNoYW5nZUZyb250TWFya2VyKSx0aGlzLiRvbkNoYW5nZUJhY2tNYXJrZXI9dGhpcy5vbkNoYW5nZUJhY2tNYXJrZXIuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlQmFja01hcmtlciIsdGhpcy4kb25DaGFuZ2VCYWNrTWFya2VyKSx0aGlzLiRvbkNoYW5nZUJyZWFrcG9pbnQ9dGhpcy5vbkNoYW5nZUJyZWFrcG9pbnQuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlQnJlYWtwb2ludCIsdGhpcy4kb25DaGFuZ2VCcmVha3BvaW50KSx0aGlzLiRvbkNoYW5nZUFubm90YXRpb249dGhpcy5vbkNoYW5nZUFubm90YXRpb24uYmluZCh0aGlzKSx0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlQW5ub3RhdGlvbiIsdGhpcy4kb25DaGFuZ2VBbm5vdGF0aW9uKSx0aGlzLiRvbkN1cnNvckNoYW5nZT10aGlzLm9uQ3Vyc29yQ2hhbmdlLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZU92ZXJ3cml0ZSIsdGhpcy4kb25DdXJzb3JDaGFuZ2UpLHRoaXMuJG9uU2Nyb2xsVG9wQ2hhbmdlPXRoaXMub25TY3JvbGxUb3BDaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlU2Nyb2xsVG9wIix0aGlzLiRvblNjcm9sbFRvcENoYW5nZSksdGhpcy4kb25TY3JvbGxMZWZ0Q2hhbmdlPXRoaXMub25TY3JvbGxMZWZ0Q2hhbmdlLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZVNjcm9sbExlZnQiLHRoaXMuJG9uU2Nyb2xsTGVmdENoYW5nZSksdGhpcy5zZWxlY3Rpb249YS5nZXRTZWxlY3Rpb24oKSx0aGlzLnNlbGVjdGlvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VDdXJzb3IiLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKSx0aGlzLiRvblNlbGVjdGlvbkNoYW5nZT10aGlzLm9uU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcyksdGhpcy5zZWxlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlU2VsZWN0aW9uIix0aGlzLiRvblNlbGVjdGlvbkNoYW5nZSksdGhpcy5vbkNoYW5nZU1vZGUoKSx0aGlzLiRibG9ja1Njcm9sbGluZys9MSx0aGlzLm9uQ3Vyc29yQ2hhbmdlKCksdGhpcy4kYmxvY2tTY3JvbGxpbmctPTEsdGhpcy5vblNjcm9sbFRvcENoYW5nZSgpLHRoaXMub25TY3JvbGxMZWZ0Q2hhbmdlKCksdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpLHRoaXMub25DaGFuZ2VGcm9udE1hcmtlcigpLHRoaXMub25DaGFuZ2VCYWNrTWFya2VyKCksdGhpcy5vbkNoYW5nZUJyZWFrcG9pbnQoKSx0aGlzLm9uQ2hhbmdlQW5ub3RhdGlvbigpLHRoaXMuc2Vzc2lvbi5nZXRVc2VXcmFwTW9kZSgpJiZ0aGlzLnJlbmRlcmVyLmFkanVzdFdyYXBMaW1pdCgpLHRoaXMucmVuZGVyZXIudXBkYXRlRnVsbCgpLHRoaXMuX2VtaXQoImNoYW5nZVNlc3Npb24iLHtzZXNzaW9uOmEsb2xkU2Vzc2lvbjpifSl9LHRoaXMuZ2V0U2Vzc2lvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb259LHRoaXMuZ2V0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9ufSx0aGlzLnJlc2l6ZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIub25SZXNpemUoKX0sdGhpcy5zZXRUaGVtZT1mdW5jdGlvbihhKXt0aGlzLnJlbmRlcmVyLnNldFRoZW1lKGEpfSx0aGlzLmdldFRoZW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0VGhlbWUoKX0sdGhpcy5zZXRTdHlsZT1mdW5jdGlvbihhKXt0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGEpfSx0aGlzLnVuc2V0U3R5bGU9ZnVuY3Rpb24oYSl7dGhpcy5yZW5kZXJlci51bnNldFN0eWxlKGEpfSx0aGlzLnNldEZvbnRTaXplPWZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyLnN0eWxlLmZvbnRTaXplPWEsdGhpcy5yZW5kZXJlci51cGRhdGVGb250U2l6ZSgpfSx0aGlzLiRoaWdobGlnaHRCcmFja2V0cz1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi4kYnJhY2tldEhpZ2hsaWdodCYmKHRoaXMuc2Vzc2lvbi5yZW1vdmVNYXJrZXIodGhpcy5zZXNzaW9uLiRicmFja2V0SGlnaGxpZ2h0KSx0aGlzLnNlc3Npb24uJGJyYWNrZXRIaWdobGlnaHQ9bnVsbCk7aWYodGhpcy4kaGlnaGxpZ2h0UGVuZGluZylyZXR1cm47dmFyIGE9dGhpczt0aGlzLiRoaWdobGlnaHRQZW5kaW5nPSEwLHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLiRoaWdobGlnaHRQZW5kaW5nPSExO3ZhciBiPWEuc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KGEuZ2V0Q3Vyc29yUG9zaXRpb24oKSk7aWYoYil7dmFyIGM9bmV3IG0oYi5yb3csYi5jb2x1bW4sYi5yb3csYi5jb2x1bW4rMSk7YS5zZXNzaW9uLiRicmFja2V0SGlnaGxpZ2h0PWEuc2Vzc2lvbi5hZGRNYXJrZXIoYywiYWNlX2JyYWNrZXQiLCJ0ZXh0Iil9fSwxMCl9LHRoaXMuZm9jdXM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXthLnRleHRJbnB1dC5mb2N1cygpfSksdGhpcy50ZXh0SW5wdXQuZm9jdXMoKX0sdGhpcy5pc0ZvY3VzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0SW5wdXQuaXNGb2N1c2VkKCl9LHRoaXMuYmx1cj1mdW5jdGlvbigpe3RoaXMudGV4dElucHV0LmJsdXIoKX0sdGhpcy5vbkZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5zaG93Q3Vyc29yKCksdGhpcy5yZW5kZXJlci52aXN1YWxpemVGb2N1cygpLHRoaXMuX2VtaXQoImZvY3VzIil9LHRoaXMub25CbHVyPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5oaWRlQ3Vyc29yKCksdGhpcy5yZW5kZXJlci52aXN1YWxpemVCbHVyKCksdGhpcy5fZW1pdCgiYmx1ciIpfSx0aGlzLm9uRG9jdW1lbnRDaGFuZ2U9ZnVuY3Rpb24oYSl7dmFyIGI9YS5kYXRhLGM9Yi5yYW5nZSxkO2Muc3RhcnQucm93PT1jLmVuZC5yb3cmJmIuYWN0aW9uIT0iaW5zZXJ0TGluZXMiJiZiLmFjdGlvbiE9InJlbW92ZUxpbmVzIj9kPWMuZW5kLnJvdzpkPUluZmluaXR5LHRoaXMucmVuZGVyZXIudXBkYXRlTGluZXMoYy5zdGFydC5yb3csZCksdGhpcy5fZW1pdCgiY2hhbmdlIixhKSx0aGlzLm9uQ3Vyc29yQ2hhbmdlKCl9LHRoaXMub25Ub2tlbml6ZXJVcGRhdGU9ZnVuY3Rpb24oYSl7dmFyIGI9YS5kYXRhO3RoaXMucmVuZGVyZXIudXBkYXRlTGluZXMoYi5maXJzdCxiLmxhc3QpfSx0aGlzLm9uU2Nyb2xsVG9wQ2hhbmdlPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5zY3JvbGxUb1kodGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpKX0sdGhpcy5vblNjcm9sbExlZnRDaGFuZ2U9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnNjcm9sbFRvWCh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsTGVmdCgpKX0sdGhpcy5vbkN1cnNvckNoYW5nZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCksdGhpcy4kYmxvY2tTY3JvbGxpbmd8fHRoaXMucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKSx0aGlzLnJlbmRlcmVyLm1vdmVUZXh0QXJlYVRvQ3Vyc29yKHRoaXMudGV4dElucHV0LmdldEVsZW1lbnQoKSksdGhpcy4kaGlnaGxpZ2h0QnJhY2tldHMoKSx0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lKCl9LHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFNlc3Npb24oKTthLiRoaWdobGlnaHRMaW5lTWFya2VyJiZhLnJlbW92ZU1hcmtlcihhLiRoaWdobGlnaHRMaW5lTWFya2VyKSxhLiRoaWdobGlnaHRMaW5lTWFya2VyPW51bGw7aWYodGhpcy5nZXRIaWdobGlnaHRBY3RpdmVMaW5lKCkmJih0aGlzLmdldFNlbGVjdGlvblN0eWxlKCkhPSJsaW5lInx8IXRoaXMuc2VsZWN0aW9uLmlzTXVsdGlMaW5lKCkpKXt2YXIgYj10aGlzLmdldEN1cnNvclBvc2l0aW9uKCksYz10aGlzLnNlc3Npb24uZ2V0Rm9sZExpbmUoYi5yb3cpLGQ7Yz9kPW5ldyBtKGMuc3RhcnQucm93LDAsYy5lbmQucm93KzEsMCk6ZD1uZXcgbShiLnJvdywwLGIucm93KzEsMCksYS4kaGlnaGxpZ2h0TGluZU1hcmtlcj1hLmFkZE1hcmtlcihkLCJhY2VfYWN0aXZlX2xpbmUiLCJiYWNrZ3JvdW5kIil9fSx0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0U2Vzc2lvbigpO2IuJHNlbGVjdGlvbk1hcmtlciYmYi5yZW1vdmVNYXJrZXIoYi4kc2VsZWN0aW9uTWFya2VyKSxiLiRzZWxlY3Rpb25NYXJrZXI9bnVsbDtpZighdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKXt2YXIgYz10aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpLGQ9dGhpcy5nZXRTZWxlY3Rpb25TdHlsZSgpO2IuJHNlbGVjdGlvbk1hcmtlcj1iLmFkZE1hcmtlcihjLCJhY2Vfc2VsZWN0aW9uIixkKX1lbHNlIHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKTt0aGlzLiRoaWdobGlnaHRTZWxlY3RlZFdvcmQmJnRoaXMuc2Vzc2lvbi5nZXRNb2RlKCkuaGlnaGxpZ2h0U2VsZWN0aW9uKHRoaXMpfSx0aGlzLm9uQ2hhbmdlRnJvbnRNYXJrZXI9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnVwZGF0ZUZyb250TWFya2VycygpfSx0aGlzLm9uQ2hhbmdlQmFja01hcmtlcj1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlQmFja01hcmtlcnMoKX0sdGhpcy5vbkNoYW5nZUJyZWFrcG9pbnQ9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnNldEJyZWFrcG9pbnRzKHRoaXMuc2Vzc2lvbi5nZXRCcmVha3BvaW50cygpKX0sdGhpcy5vbkNoYW5nZUFubm90YXRpb249ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnNldEFubm90YXRpb25zKHRoaXMuc2Vzc2lvbi5nZXRBbm5vdGF0aW9ucygpKX0sdGhpcy5vbkNoYW5nZU1vZGU9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnVwZGF0ZVRleHQoKX0sdGhpcy5vbkNoYW5nZVdyYXBMaW1pdD1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlRnVsbCgpfSx0aGlzLm9uQ2hhbmdlV3JhcE1vZGU9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLm9uUmVzaXplKCEwKX0sdGhpcy5vbkNoYW5nZUZvbGQ9ZnVuY3Rpb24oKXt0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lKCksdGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCl9LHRoaXMuZ2V0Q29weVRleHQ9ZnVuY3Rpb24oKXt2YXIgYT0iIjtyZXR1cm4gdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpfHwoYT10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSkpLHRoaXMuX2VtaXQoImNvcHkiLGEpLGF9LHRoaXMub25DdXQ9ZnVuY3Rpb24oKXtpZih0aGlzLiRyZWFkT25seSlyZXR1cm47dmFyIGE9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO3RoaXMuX2VtaXQoImN1dCIsYSksdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpfHwodGhpcy5zZXNzaW9uLnJlbW92ZShhKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCkpfSx0aGlzLmluc2VydD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnNlc3Npb24sYz1iLmdldE1vZGUoKSxkPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKTtpZih0aGlzLmdldEJlaGF2aW91cnNFbmFibGVkKCkpe3ZhciBlPWMudHJhbnNmb3JtQWN0aW9uKGIuZ2V0U3RhdGUoZC5yb3cpLCJpbnNlcnRpb24iLHRoaXMsYixhKTtlJiYoYT1lLnRleHQpfWE9YS5yZXBsYWNlKCJcdCIsdGhpcy5zZXNzaW9uLmdldFRhYlN0cmluZygpKTtpZighdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKWQ9dGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtlbHNlIGlmKHRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKSl7dmFyIGY9bmV3IG0uZnJvbVBvaW50cyhkLGQpO2YuZW5kLmNvbHVtbis9YS5sZW5ndGgsdGhpcy5zZXNzaW9uLnJlbW92ZShmKX10aGlzLmNsZWFyU2VsZWN0aW9uKCk7dmFyIGc9ZC5jb2x1bW4saD1iLmdldFN0YXRlKGQucm93KSxpPWMuY2hlY2tPdXRkZW50KGgsYi5nZXRMaW5lKGQucm93KSxhKSxqPWIuZ2V0TGluZShkLnJvdyksaz1jLmdldE5leHRMaW5lSW5kZW50KGgsai5zbGljZSgwLGQuY29sdW1uKSxiLmdldFRhYlN0cmluZygpKSxsPWIuaW5zZXJ0KGQsYSk7ZSYmZS5zZWxlY3Rpb24mJihlLnNlbGVjdGlvbi5sZW5ndGg9PTI/dGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UobmV3IG0oZC5yb3csZytlLnNlbGVjdGlvblswXSxkLnJvdyxnK2Uuc2VsZWN0aW9uWzFdKSk6dGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UobmV3IG0oZC5yb3crZS5zZWxlY3Rpb25bMF0sZS5zZWxlY3Rpb25bMV0sZC5yb3crZS5zZWxlY3Rpb25bMl0sZS5zZWxlY3Rpb25bM10pKSk7dmFyIGg9Yi5nZXRTdGF0ZShkLnJvdyk7aWYoYi5nZXREb2N1bWVudCgpLmlzTmV3TGluZShhKSl7dGhpcy5tb3ZlQ3Vyc29yVG8oZC5yb3crMSwwKTt2YXIgbj1iLmdldFRhYlNpemUoKSxvPU51bWJlci5NQVhfVkFMVUU7Zm9yKHZhciBwPWQucm93KzE7cDw9bC5yb3c7KytwKXt2YXIgcT0wO2o9Yi5nZXRMaW5lKHApO2Zvcih2YXIgcj0wO3I8ai5sZW5ndGg7KytyKWlmKGouY2hhckF0KHIpPT0iXHQiKXErPW47ZWxzZXtpZihqLmNoYXJBdChyKSE9IiAiKWJyZWFrO3ErPTF9L1teXHNdLy50ZXN0KGopJiYobz1NYXRoLm1pbihxLG8pKX1mb3IodmFyIHA9ZC5yb3crMTtwPD1sLnJvdzsrK3Ape3ZhciBzPW87aj1iLmdldExpbmUocCk7Zm9yKHZhciByPTA7cjxqLmxlbmd0aCYmcz4wOysrcilqLmNoYXJBdChyKT09Ilx0Ij9zLT1uOmouY2hhckF0KHIpPT0iICImJihzLT0xKTtiLnJlbW92ZShuZXcgbShwLDAscCxyKSl9Yi5pbmRlbnRSb3dzKGQucm93KzEsbC5yb3csayl9aSYmYy5hdXRvT3V0ZGVudChoLGIsZC5yb3cpfSx0aGlzLm9uVGV4dElucHV0PWZ1bmN0aW9uKGEsYil7YiYmdGhpcy5fZW1pdCgicGFzdGUiLGEpLHRoaXMua2V5QmluZGluZy5vblRleHRJbnB1dChhLGIpfSx0aGlzLm9uQ29tbWFuZEtleT1mdW5jdGlvbihhLGIsYyl7dGhpcy5rZXlCaW5kaW5nLm9uQ29tbWFuZEtleShhLGIsYyl9LHRoaXMuc2V0T3ZlcndyaXRlPWZ1bmN0aW9uKGEpe3RoaXMuc2Vzc2lvbi5zZXRPdmVyd3JpdGUoYSl9LHRoaXMuZ2V0T3ZlcndyaXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKX0sdGhpcy50b2dnbGVPdmVyd3JpdGU9ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24udG9nZ2xlT3ZlcndyaXRlKCl9LHRoaXMuc2V0U2Nyb2xsU3BlZWQ9ZnVuY3Rpb24oYSl7dGhpcy4kbW91c2VIYW5kbGVyLnNldFNjcm9sbFNwZWVkKGEpfSx0aGlzLmdldFNjcm9sbFNwZWVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG1vdXNlSGFuZGxlci5nZXRTY3JvbGxTcGVlZCgpfSx0aGlzLnNldERyYWdEZWxheT1mdW5jdGlvbihhKXt0aGlzLiRtb3VzZUhhbmRsZXIuc2V0RHJhZ0RlbGF5KGEpfSx0aGlzLmdldERyYWdEZWxheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRtb3VzZUhhbmRsZXIuZ2V0RHJhZ0RlbGF5KCl9LHRoaXMuJHNlbGVjdGlvblN0eWxlPSJsaW5lIix0aGlzLnNldFNlbGVjdGlvblN0eWxlPWZ1bmN0aW9uKGEpe2lmKHRoaXMuJHNlbGVjdGlvblN0eWxlPT1hKXJldHVybjt0aGlzLiRzZWxlY3Rpb25TdHlsZT1hLHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKSx0aGlzLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb25TdHlsZSIse2RhdGE6YX0pfSx0aGlzLmdldFNlbGVjdGlvblN0eWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNlbGVjdGlvblN0eWxlfSx0aGlzLiRoaWdobGlnaHRBY3RpdmVMaW5lPSEwLHRoaXMuc2V0SGlnaGxpZ2h0QWN0aXZlTGluZT1mdW5jdGlvbihhKXtpZih0aGlzLiRoaWdobGlnaHRBY3RpdmVMaW5lPT1hKXJldHVybjt0aGlzLiRoaWdobGlnaHRBY3RpdmVMaW5lPWEsdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpfSx0aGlzLmdldEhpZ2hsaWdodEFjdGl2ZUxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaGlnaGxpZ2h0QWN0aXZlTGluZX0sdGhpcy4kaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkPSEwLHRoaXMuc2V0SGlnaGxpZ2h0U2VsZWN0ZWRXb3JkPWZ1bmN0aW9uKGEpe2lmKHRoaXMuJGhpZ2hsaWdodFNlbGVjdGVkV29yZD09YSlyZXR1cm47dGhpcy4kaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkPWEsYT90aGlzLnNlc3Npb24uZ2V0TW9kZSgpLmhpZ2hsaWdodFNlbGVjdGlvbih0aGlzKTp0aGlzLnNlc3Npb24uZ2V0TW9kZSgpLmNsZWFyU2VsZWN0aW9uSGlnaGxpZ2h0KHRoaXMpfSx0aGlzLmdldEhpZ2hsaWdodFNlbGVjdGVkV29yZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRoaWdobGlnaHRTZWxlY3RlZFdvcmR9LHRoaXMuc2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oYSl7aWYodGhpcy5nZXRTaG93SW52aXNpYmxlcygpPT1hKXJldHVybjt0aGlzLnJlbmRlcmVyLnNldFNob3dJbnZpc2libGVzKGEpfSx0aGlzLmdldFNob3dJbnZpc2libGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0U2hvd0ludmlzaWJsZXMoKX0sdGhpcy5zZXRTaG93UHJpbnRNYXJnaW49ZnVuY3Rpb24oYSl7dGhpcy5yZW5kZXJlci5zZXRTaG93UHJpbnRNYXJnaW4oYSl9LHRoaXMuZ2V0U2hvd1ByaW50TWFyZ2luPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0U2hvd1ByaW50TWFyZ2luKCl9LHRoaXMuc2V0UHJpbnRNYXJnaW5Db2x1bW49ZnVuY3Rpb24oYSl7dGhpcy5yZW5kZXJlci5zZXRQcmludE1hcmdpbkNvbHVtbihhKX0sdGhpcy5nZXRQcmludE1hcmdpbkNvbHVtbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldFByaW50TWFyZ2luQ29sdW1uKCl9LHRoaXMuJHJlYWRPbmx5PSExLHRoaXMuc2V0UmVhZE9ubHk9ZnVuY3Rpb24oYSl7dGhpcy4kcmVhZE9ubHk9YX0sdGhpcy5nZXRSZWFkT25seT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyZWFkT25seX0sdGhpcy4kbW9kZUJlaGF2aW91cnM9ITAsdGhpcy5zZXRCZWhhdmlvdXJzRW5hYmxlZD1mdW5jdGlvbihhKXt0aGlzLiRtb2RlQmVoYXZpb3Vycz1hfSx0aGlzLmdldEJlaGF2aW91cnNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG1vZGVCZWhhdmlvdXJzfSx0aGlzLnNldFNob3dGb2xkV2lkZ2V0cz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnJlbmRlcmVyLiRndXR0ZXJMYXllcjtpZihiLmdldFNob3dGb2xkV2lkZ2V0cygpPT1hKXJldHVybjt0aGlzLnJlbmRlcmVyLiRndXR0ZXJMYXllci5zZXRTaG93Rm9sZFdpZGdldHMoYSksdGhpcy4kc2hvd0ZvbGRXaWRnZXRzPWEsdGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCl9LHRoaXMuZ2V0U2hvd0ZvbGRXaWRnZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuJGd1dHRlckxheWVyLmdldFNob3dGb2xkV2lkZ2V0cygpfSx0aGlzLnJlbW92ZT1mdW5jdGlvbihhKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJihhPT0ibGVmdCI/dGhpcy5zZWxlY3Rpb24uc2VsZWN0TGVmdCgpOnRoaXMuc2VsZWN0aW9uLnNlbGVjdFJpZ2h0KCkpO3ZhciBiPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtpZih0aGlzLmdldEJlaGF2aW91cnNFbmFibGVkKCkpe3ZhciBjPXRoaXMuc2Vzc2lvbixkPWMuZ2V0U3RhdGUoYi5zdGFydC5yb3cpLGU9Yy5nZXRNb2RlKCkudHJhbnNmb3JtQWN0aW9uKGQsImRlbGV0aW9uIix0aGlzLGMsYik7ZSYmKGI9ZSl9dGhpcy5zZXNzaW9uLnJlbW92ZShiKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMucmVtb3ZlV29yZFJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkUmlnaHQoKSx0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnJlbW92ZVdvcmRMZWZ0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkTGVmdCgpLHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMucmVtb3ZlVG9MaW5lU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdExpbmVTdGFydCgpLHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMucmVtb3ZlVG9MaW5lRW5kPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RMaW5lRW5kKCk7dmFyIGE9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO2Euc3RhcnQuY29sdW1uPT1hLmVuZC5jb2x1bW4mJmEuc3RhcnQucm93PT1hLmVuZC5yb3cmJihhLmVuZC5jb2x1bW49MCxhLmVuZC5yb3crKyksdGhpcy5zZXNzaW9uLnJlbW92ZShhKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMuc3BsaXRMaW5lPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpfHwodGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKSk7dmFyIGE9dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpO3RoaXMuaW5zZXJ0KCJcbiIpLHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24oYSl9LHRoaXMudHJhbnNwb3NlTGV0dGVycz1mdW5jdGlvbigpe2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpcmV0dXJuO3ZhciBhPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxiPWEuY29sdW1uO2lmKGI9PT0wKXJldHVybjt2YXIgYz10aGlzLnNlc3Npb24uZ2V0TGluZShhLnJvdyksZCxlO2I8Yy5sZW5ndGg/KGQ9Yy5jaGFyQXQoYikrYy5jaGFyQXQoYi0xKSxlPW5ldyBtKGEucm93LGItMSxhLnJvdyxiKzEpKTooZD1jLmNoYXJBdChiLTEpK2MuY2hhckF0KGItMiksZT1uZXcgbShhLnJvdyxiLTIsYS5yb3csYikpLHRoaXMuc2Vzc2lvbi5yZXBsYWNlKGUsZCl9LHRoaXMudG9Mb3dlckNhc2U9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk7dmFyIGI9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLGM9dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZShiKTt0aGlzLnNlc3Npb24ucmVwbGFjZShiLGMudG9Mb3dlckNhc2UoKSksdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoYSl9LHRoaXMudG9VcHBlckNhc2U9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk7dmFyIGI9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLGM9dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZShiKTt0aGlzLnNlc3Npb24ucmVwbGFjZShiLGMudG9VcHBlckNhc2UoKSksdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoYSl9LHRoaXMuaW5kZW50PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZXNzaW9uLGI9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO2lmKCEoYi5zdGFydC5yb3c8Yi5lbmQucm93fHxiLnN0YXJ0LmNvbHVtbjxiLmVuZC5jb2x1bW4pKXt2YXIgZDtpZih0aGlzLnNlc3Npb24uZ2V0VXNlU29mdFRhYnMoKSl7dmFyIGY9YS5nZXRUYWJTaXplKCksZz10aGlzLmdldEN1cnNvclBvc2l0aW9uKCksaD1hLmRvY3VtZW50VG9TY3JlZW5Db2x1bW4oZy5yb3csZy5jb2x1bW4pLGk9Zi1oJWY7ZD1lLnN0cmluZ1JlcGVhdCgiICIsaSl9ZWxzZSBkPSJcdCI7cmV0dXJuIHRoaXMuaW5zZXJ0KGQpfXZhciBjPXRoaXMuJGdldFNlbGVjdGVkUm93cygpO2EuaW5kZW50Um93cyhjLmZpcnN0LGMubGFzdCwiXHQiKX0sdGhpcy5ibG9ja091dGRlbnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlc3Npb24uZ2V0U2VsZWN0aW9uKCk7dGhpcy5zZXNzaW9uLm91dGRlbnRSb3dzKGEuZ2V0UmFuZ2UoKSl9LHRoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZXNzaW9uLmdldFN0YXRlKHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKS5yb3cpLGI9dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCk7dGhpcy5zZXNzaW9uLmdldE1vZGUoKS50b2dnbGVDb21tZW50TGluZXMoYSx0aGlzLnNlc3Npb24sYi5maXJzdCxiLmxhc3QpfSx0aGlzLnJlbW92ZUxpbmVzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCksYjthLmZpcnN0PT09MHx8YS5sYXN0KzE8dGhpcy5zZXNzaW9uLmdldExlbmd0aCgpP2I9bmV3IG0oYS5maXJzdCwwLGEubGFzdCsxLDApOmI9bmV3IG0oYS5maXJzdC0xLHRoaXMuc2Vzc2lvbi5nZXRMaW5lKGEuZmlyc3QtMSkubGVuZ3RoLGEubGFzdCx0aGlzLnNlc3Npb24uZ2V0TGluZShhLmxhc3QpLmxlbmd0aCksdGhpcy5zZXNzaW9uLnJlbW92ZShiKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubW92ZUxpbmVzRG93bj1mdW5jdGlvbigpe3RoaXMuJG1vdmVMaW5lcyhmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnNlc3Npb24ubW92ZUxpbmVzRG93bihhLGIpfSl9LHRoaXMubW92ZUxpbmVzVXA9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlTGluZXMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5zZXNzaW9uLm1vdmVMaW5lc1VwKGEsYil9KX0sdGhpcy5tb3ZlVGV4dD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLiRyZWFkT25seT9udWxsOnRoaXMuc2Vzc2lvbi5tb3ZlVGV4dChhLGIpfSx0aGlzLmNvcHlMaW5lc1VwPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUxpbmVzKGZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuc2Vzc2lvbi5kdXBsaWNhdGVMaW5lcyhhLGIpLDB9KX0sdGhpcy5jb3B5TGluZXNEb3duPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUxpbmVzKGZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuc2Vzc2lvbi5kdXBsaWNhdGVMaW5lcyhhLGIpfSl9LHRoaXMuJG1vdmVMaW5lcz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLiRnZXRTZWxlY3RlZFJvd3MoKSxjPXRoaXMuc2VsZWN0aW9uO2lmKCFjLmlzTXVsdGlMaW5lKCkpdmFyIGQ9Yy5nZXRSYW5nZSgpLGU9Yy5pc0JhY2t3YXJkcygpO3ZhciBmPWEuY2FsbCh0aGlzLGIuZmlyc3QsYi5sYXN0KTtkPyhkLnN0YXJ0LnJvdys9ZixkLmVuZC5yb3crPWYsYy5zZXRTZWxlY3Rpb25SYW5nZShkLGUpKTooYy5zZXRTZWxlY3Rpb25BbmNob3IoYi5sYXN0K2YrMSwwKSxjLiRtb3ZlU2VsZWN0aW9uKGZ1bmN0aW9uKCl7Yy5tb3ZlQ3Vyc29yVG8oYi5maXJzdCtmLDApfSkpfSx0aGlzLiRnZXRTZWxlY3RlZFJvd3M9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCkuY29sbGFwc2VSb3dzKCk7cmV0dXJue2ZpcnN0OmEuc3RhcnQucm93LGxhc3Q6YS5lbmQucm93fX0sdGhpcy5vbkNvbXBvc2l0aW9uU3RhcnQ9ZnVuY3Rpb24oYSl7dGhpcy5yZW5kZXJlci5zaG93Q29tcG9zaXRpb24odGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpKX0sdGhpcy5vbkNvbXBvc2l0aW9uVXBkYXRlPWZ1bmN0aW9uKGEpe3RoaXMucmVuZGVyZXIuc2V0Q29tcG9zaXRpb25UZXh0KGEpfSx0aGlzLm9uQ29tcG9zaXRpb25FbmQ9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLmhpZGVDb21wb3NpdGlvbigpfSx0aGlzLmdldEZpcnN0VmlzaWJsZVJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldEZpcnN0VmlzaWJsZVJvdygpfSx0aGlzLmdldExhc3RWaXNpYmxlUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0TGFzdFZpc2libGVSb3coKX0sdGhpcy5pc1Jvd1Zpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIGE+PXRoaXMuZ2V0Rmlyc3RWaXNpYmxlUm93KCkmJmE8PXRoaXMuZ2V0TGFzdFZpc2libGVSb3coKX0sdGhpcy5pc1Jvd0Z1bGx5VmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4gYT49dGhpcy5yZW5kZXJlci5nZXRGaXJzdEZ1bGx5VmlzaWJsZVJvdygpJiZhPD10aGlzLnJlbmRlcmVyLmdldExhc3RGdWxseVZpc2libGVSb3coKX0sdGhpcy4kZ2V0VmlzaWJsZVJvd0NvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0U2Nyb2xsQm90dG9tUm93KCktdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxUb3BSb3coKSsxfSx0aGlzLiRnZXRQYWdlRG93blJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldFNjcm9sbEJvdHRvbVJvdygpfSx0aGlzLiRnZXRQYWdlVXBSb3c9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlbmRlcmVyLmdldFNjcm9sbFRvcFJvdygpLGI9dGhpcy5yZW5kZXJlci5nZXRTY3JvbGxCb3R0b21Sb3coKTtyZXR1cm4gYS0oYi1hKX0sdGhpcy5zZWxlY3RQYWdlRG93bj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGdldFBhZ2VEb3duUm93KCkrTWF0aC5mbG9vcih0aGlzLiRnZXRWaXNpYmxlUm93Q291bnQoKS8yKTt0aGlzLnNjcm9sbFBhZ2VEb3duKCk7dmFyIGI9dGhpcy5nZXRTZWxlY3Rpb24oKSxjPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oYi5nZXRTZWxlY3Rpb25MZWFkKCkpLGQ9dGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihhLGMuY29sdW1uKTtiLnNlbGVjdFRvKGQucm93LGQuY29sdW1uKX0sdGhpcy5zZWxlY3RQYWdlVXA9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlbmRlcmVyLmdldFNjcm9sbFRvcFJvdygpLXRoaXMucmVuZGVyZXIuZ2V0U2Nyb2xsQm90dG9tUm93KCksYj10aGlzLiRnZXRQYWdlVXBSb3coKStNYXRoLnJvdW5kKGEvMik7dGhpcy5zY3JvbGxQYWdlVXAoKTt2YXIgYz10aGlzLmdldFNlbGVjdGlvbigpLGQ9dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihjLmdldFNlbGVjdGlvbkxlYWQoKSksZT10aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGIsZC5jb2x1bW4pO2Muc2VsZWN0VG8oZS5yb3csZS5jb2x1bW4pfSx0aGlzLmdvdG9QYWdlRG93bj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGdldFBhZ2VEb3duUm93KCksYj10aGlzLmdldEN1cnNvclBvc2l0aW9uU2NyZWVuKCkuY29sdW1uO3RoaXMuc2Nyb2xsVG9Sb3coYSksdGhpcy5nZXRTZWxlY3Rpb24oKS5tb3ZlQ3Vyc29yVG9TY3JlZW4oYSxiKX0sdGhpcy5nb3RvUGFnZVVwPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kZ2V0UGFnZVVwUm93KCksYj10aGlzLmdldEN1cnNvclBvc2l0aW9uU2NyZWVuKCkuY29sdW1uO3RoaXMuc2Nyb2xsVG9Sb3coYSksdGhpcy5nZXRTZWxlY3Rpb24oKS5tb3ZlQ3Vyc29yVG9TY3JlZW4oYSxiKX0sdGhpcy5zY3JvbGxQYWdlRG93bj1mdW5jdGlvbigpe3RoaXMuc2Nyb2xsVG9Sb3codGhpcy4kZ2V0UGFnZURvd25Sb3coKSl9LHRoaXMuc2Nyb2xsUGFnZVVwPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5zY3JvbGxUb1Jvdyh0aGlzLiRnZXRQYWdlVXBSb3coKSl9LHRoaXMuc2Nyb2xsVG9Sb3c9ZnVuY3Rpb24oYSl7dGhpcy5yZW5kZXJlci5zY3JvbGxUb1JvdyhhKX0sdGhpcy5zY3JvbGxUb0xpbmU9ZnVuY3Rpb24oYSxiKXt0aGlzLnJlbmRlcmVyLnNjcm9sbFRvTGluZShhLGIpfSx0aGlzLmNlbnRlclNlbGVjdGlvbj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxiPU1hdGguZmxvb3IoYS5zdGFydC5yb3crKGEuZW5kLnJvdy1hLnN0YXJ0LnJvdykvMik7dGhpcy5yZW5kZXJlci5zY3JvbGxUb0xpbmUoYiwhMCl9LHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCl9LHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb25TY3JlZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmdldEN1cnNvclBvc2l0aW9uKCkpfSx0aGlzLmdldFNlbGVjdGlvblJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCl9LHRoaXMuc2VsZWN0QWxsPWZ1bmN0aW9uKCl7dGhpcy4kYmxvY2tTY3JvbGxpbmcrPTEsdGhpcy5zZWxlY3Rpb24uc2VsZWN0QWxsKCksdGhpcy4kYmxvY2tTY3JvbGxpbmctPTF9LHRoaXMuY2xlYXJTZWxlY3Rpb249ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm1vdmVDdXJzb3JUbz1mdW5jdGlvbihhLGIpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JUbyhhLGIpfSx0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uPWZ1bmN0aW9uKGEpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGEpfSx0aGlzLmp1bXBUb01hdGNoaW5nPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLGI9dGhpcy5zZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoYSk7Ynx8KGEuY29sdW1uKz0xLGI9dGhpcy5zZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoYSkpLGJ8fChhLmNvbHVtbi09MixiPXRoaXMuc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KGEpKSxiJiYodGhpcy5jbGVhclNlbGVjdGlvbigpLHRoaXMubW92ZUN1cnNvclRvKGIucm93LGIuY29sdW1uKSl9LHRoaXMuZ290b0xpbmU9ZnVuY3Rpb24oYSxiKXt0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpLHRoaXMuc2Vzc2lvbi51bmZvbGQoe3JvdzphLTEsY29sdW1uOmJ8fDB9KSx0aGlzLiRibG9ja1Njcm9sbGluZys9MSx0aGlzLm1vdmVDdXJzb3JUbyhhLTEsYnx8MCksdGhpcy4kYmxvY2tTY3JvbGxpbmctPTEsdGhpcy5pc1Jvd0Z1bGx5VmlzaWJsZSh0aGlzLmdldEN1cnNvclBvc2l0aW9uKCkucm93KXx8dGhpcy5zY3JvbGxUb0xpbmUoYSwhMCl9LHRoaXMubmF2aWdhdGVUbz1mdW5jdGlvbihhLGIpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKSx0aGlzLm1vdmVDdXJzb3JUbyhhLGIpfSx0aGlzLm5hdmlnYXRlVXA9ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKSxhPWF8fDEsdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckJ5KC1hLDApfSx0aGlzLm5hdmlnYXRlRG93bj1mdW5jdGlvbihhKXt0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpLGE9YXx8MSx0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yQnkoYSwwKX0sdGhpcy5uYXZpZ2F0ZUxlZnQ9ZnVuY3Rpb24oYSl7aWYoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSl7dmFyIGI9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLnN0YXJ0O3RoaXMubW92ZUN1cnNvclRvUG9zaXRpb24oYil9ZWxzZXthPWF8fDE7d2hpbGUoYS0tKXRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JMZWZ0KCl9dGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlUmlnaHQ9ZnVuY3Rpb24oYSl7aWYoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSl7dmFyIGI9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLmVuZDt0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGIpfWVsc2V7YT1hfHwxO3doaWxlKGEtLSl0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yUmlnaHQoKX10aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVMaW5lU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yTGluZVN0YXJ0KCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlTGluZUVuZD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JMaW5lRW5kKCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlRmlsZUVuZD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JGaWxlRW5kKCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlRmlsZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckZpbGVTdGFydCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZVdvcmRSaWdodD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JXb3JkUmlnaHQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVXb3JkTGVmdD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JXb3JkTGVmdCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5yZXBsYWNlPWZ1bmN0aW9uKGEsYil7YiYmdGhpcy4kc2VhcmNoLnNldChiKTt2YXIgYz10aGlzLiRzZWFyY2guZmluZCh0aGlzLnNlc3Npb24pO2lmKCFjKXJldHVybjt0aGlzLiR0cnlSZXBsYWNlKGMsYSksYyE9PW51bGwmJnRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGMpfSx0aGlzLnJlcGxhY2VBbGw9ZnVuY3Rpb24oYSxiKXtiJiZ0aGlzLiRzZWFyY2guc2V0KGIpO3ZhciBjPXRoaXMuJHNlYXJjaC5maW5kQWxsKHRoaXMuc2Vzc2lvbik7aWYoIWMubGVuZ3RoKXJldHVybjt2YXIgZD10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7dGhpcy5jbGVhclNlbGVjdGlvbigpLHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JUbygwLDApLHRoaXMuJGJsb2NrU2Nyb2xsaW5nKz0xO2Zvcih2YXIgZT1jLmxlbmd0aC0xO2U+PTA7LS1lKXRoaXMuJHRyeVJlcGxhY2UoY1tlXSxhKTt0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShkKSx0aGlzLiRibG9ja1Njcm9sbGluZy09MX0sdGhpcy4kdHJ5UmVwbGFjZT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UoYSk7cmV0dXJuIGI9dGhpcy4kc2VhcmNoLnJlcGxhY2UoYyxiKSxiIT09bnVsbD8oYS5lbmQ9dGhpcy5zZXNzaW9uLnJlcGxhY2UoYSxiKSxhKTpudWxsfSx0aGlzLmdldExhc3RTZWFyY2hPcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNlYXJjaC5nZXRPcHRpb25zKCl9LHRoaXMuZmluZD1mdW5jdGlvbihhLGIpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKSxiPWJ8fHt9LGIubmVlZGxlPWEsdGhpcy4kc2VhcmNoLnNldChiKSx0aGlzLiRmaW5kKCl9LHRoaXMuZmluZE5leHQ9ZnVuY3Rpb24oYSl7YT1hfHx7fSx0eXBlb2YgYS5iYWNrd2FyZHM9PSJ1bmRlZmluZWQiJiYoYS5iYWNrd2FyZHM9ITEpLHRoaXMuJHNlYXJjaC5zZXQoYSksdGhpcy4kZmluZCgpfSx0aGlzLmZpbmRQcmV2aW91cz1mdW5jdGlvbihhKXthPWF8fHt9LHR5cGVvZiBhLmJhY2t3YXJkcz09InVuZGVmaW5lZCImJihhLmJhY2t3YXJkcz0hMCksdGhpcy4kc2VhcmNoLnNldChhKSx0aGlzLiRmaW5kKCl9LHRoaXMuJGZpbmQ9ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpfHx0aGlzLiRzZWFyY2guc2V0KHtuZWVkbGU6dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpfSksdHlwZW9mIGEhPSJ1bmRlZmluZWQiJiZ0aGlzLiRzZWFyY2guc2V0KHtiYWNrd2FyZHM6YX0pO3ZhciBiPXRoaXMuJHNlYXJjaC5maW5kKHRoaXMuc2Vzc2lvbik7YiYmKHRoaXMuc2Vzc2lvbi51bmZvbGQoYiksdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoYikpfSx0aGlzLnVuZG89ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24uZ2V0VW5kb01hbmFnZXIoKS51bmRvKCl9LHRoaXMucmVkbz1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi5nZXRVbmRvTWFuYWdlcigpLnJlZG8oKX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5kZXN0cm95KCl9fSkpLmNhbGwocS5wcm90b3R5cGUpLGIuRWRpdG9yPXF9KSxkZWZpbmUoImFjZS9saWIvbGFuZyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCIsYi5zdHJpbmdSZXZlcnNlPWZ1bmN0aW9uKGEpe3JldHVybiBhLnNwbGl0KCIiKS5yZXZlcnNlKCkuam9pbigiIil9LGIuc3RyaW5nUmVwZWF0PWZ1bmN0aW9uKGEsYil7cmV0dXJuKG5ldyBBcnJheShiKzEpKS5qb2luKGEpfTt2YXIgZD0vXlxzXHMqLyxlPS9cc1xzKiQvO2Iuc3RyaW5nVHJpbUxlZnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZShkLCIiKX0sYi5zdHJpbmdUcmltUmlnaHQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZShlLCIiKX0sYi5jb3B5T2JqZWN0PWZ1bmN0aW9uKGEpe3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKWJbY109YVtjXTtyZXR1cm4gYn0sYi5jb3B5QXJyYXk9ZnVuY3Rpb24oYSl7dmFyIGI9W107Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtjPGQ7YysrKWFbY10mJnR5cGVvZiBhW2NdPT0ib2JqZWN0Ij9iW2NdPXRoaXMuY29weU9iamVjdChhW2NdKTpiW2NdPWFbY107cmV0dXJuIGJ9LGIuZGVlcENvcHk9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPSJvYmplY3QiKXJldHVybiBhO3ZhciBiPWEuY29uc3RydWN0b3IoKTtmb3IodmFyIGMgaW4gYSl0eXBlb2YgYVtjXT09Im9iamVjdCI/YltjXT10aGlzLmRlZXBDb3B5KGFbY10pOmJbY109YVtjXTtyZXR1cm4gYn0sYi5hcnJheVRvTWFwPWZ1bmN0aW9uKGEpe3ZhciBiPXt9O2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWJbYVtjXV09MTtyZXR1cm4gYn0sYi5hcnJheVJlbW92ZT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2M8PWEubGVuZ3RoO2MrKyliPT09YVtjXSYmYS5zcGxpY2UoYywxKX0sYi5lc2NhcGVSZWdFeHA9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvKFsuKis/XiR7fSgpfFtcXVwvXFxdKS9nLCJcXCQxIil9LGIuZGVmZXJyZWRDYWxsPWZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1mdW5jdGlvbigpe2I9bnVsbCxhKCl9LGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGQuY2FuY2VsKCksYj1zZXRUaW1lb3V0KGMsYXx8MCksZH07cmV0dXJuIGQuc2NoZWR1bGU9ZCxkLmNhbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWwoKSxhKCksZH0sZC5jYW5jZWw9ZnVuY3Rpb24oKXtyZXR1cm4gY2xlYXJUaW1lb3V0KGIpLGI9bnVsbCxkfSxkfX0pLGRlZmluZSgiYWNlL2tleWJvYXJkL3RleHRpbnB1dCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL3VzZXJhZ2VudCIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvZXZlbnQiKSxlPWEoIi4uL2xpYi91c2VyYWdlbnQiKSxmPWEoIi4uL2xpYi9kb20iKSxnPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gbCgpe3RyeXtjLnNlbGVjdCgpfWNhdGNoKGEpe319ZnVuY3Rpb24gbShhKXtpZighaSl7dmFyIGQ9YXx8Yy52YWx1ZTtpZihkKXtkLmNoYXJDb2RlQXQoZC5sZW5ndGgtMSk9PWcuY2hhckNvZGVBdCgwKT8oZD1kLnNsaWNlKDAsLTEpLGQmJmIub25UZXh0SW5wdXQoZCxqKSk6Yi5vblRleHRJbnB1dChkLGopO2lmKCF2KCkpcmV0dXJuITF9fWk9ITEsaj0hMSxjLnZhbHVlPWcsbCgpfWZ1bmN0aW9uIHYoKXtyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PWN9dmFyIGM9Zi5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpO2UuaXNUb3VjaFBhZCYmYy5zZXRBdHRyaWJ1dGUoIngtcGFsbS1kaXNhYmxlLWF1dG8tY2FwIiwhMCksYy5zdHlsZS5sZWZ0PSItMTAwMDBweCIsYy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLGEuaW5zZXJ0QmVmb3JlKGMsYS5maXJzdENoaWxkKTt2YXIgZz1TdHJpbmcuZnJvbUNoYXJDb2RlKDApO20oKTt2YXIgaD0hMSxpPSExLGo9ITEsaz0iIixuPWZ1bmN0aW9uKGEpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtofHxtKGEuZGF0YSl9LDApfSxvPWZ1bmN0aW9uKGEpe2lmKGUuaXNPbGRJRSYmYy52YWx1ZS5jaGFyQ29kZUF0KDApPjEyOClyZXR1cm47c2V0VGltZW91dChmdW5jdGlvbigpe2h8fG0oKX0sMCl9LHA9ZnVuY3Rpb24oYSl7aD0hMCxiLm9uQ29tcG9zaXRpb25TdGFydCgpLGUuaXNHZWNrb3x8c2V0VGltZW91dChxLDApfSxxPWZ1bmN0aW9uKCl7aWYoIWgpcmV0dXJuO2Iub25Db21wb3NpdGlvblVwZGF0ZShjLnZhbHVlKX0scj1mdW5jdGlvbihhKXtoPSExLGIub25Db21wb3NpdGlvbkVuZCgpfSxzPWZ1bmN0aW9uKGEpe2k9ITA7dmFyIGQ9Yi5nZXRDb3B5VGV4dCgpO2Q/Yy52YWx1ZT1kOmEucHJldmVudERlZmF1bHQoKSxsKCksc2V0VGltZW91dChmdW5jdGlvbigpe20oKX0sMCl9LHQ9ZnVuY3Rpb24oYSl7aT0hMDt2YXIgZD1iLmdldENvcHlUZXh0KCk7ZD8oYy52YWx1ZT1kLGIub25DdXQoKSk6YS5wcmV2ZW50RGVmYXVsdCgpLGwoKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bSgpfSwwKX07ZC5hZGRDb21tYW5kS2V5TGlzdGVuZXIoYyxiLm9uQ29tbWFuZEtleS5iaW5kKGIpKTtpZihlLmlzT2xkSUUpe3ZhciB1PXsxMzoxLDI3OjF9O2QuYWRkTGlzdGVuZXIoYywia2V5dXAiLGZ1bmN0aW9uKGEpe2gmJighYy52YWx1ZXx8dVthLmtleUNvZGVdKSYmc2V0VGltZW91dChyLDApO2lmKChjLnZhbHVlLmNoYXJDb2RlQXQoMCl8MCk8MTI5KXJldHVybjtoP3EoKTpwKCl9KX0ib25wcm9wZXJ0eWNoYW5nZSJpbiBjJiYhKCJvbmlucHV0ImluIGMpP2QuYWRkTGlzdGVuZXIoYywicHJvcGVydHljaGFuZ2UiLG8pOmQuYWRkTGlzdGVuZXIoYywiaW5wdXQiLG4pLGQuYWRkTGlzdGVuZXIoYywicGFzdGUiLGZ1bmN0aW9uKGEpe2o9ITAsYS5jbGlwYm9hcmREYXRhJiZhLmNsaXBib2FyZERhdGEuZ2V0RGF0YT8obShhLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgidGV4dC9wbGFpbiIpKSxhLnByZXZlbnREZWZhdWx0KCkpOm8oKX0pLCJvbmJlZm9yZWNvcHkiaW4gYyYmdHlwZW9mIGNsaXBib2FyZERhdGEhPSJ1bmRlZmluZWQiPyhkLmFkZExpc3RlbmVyKGMsImJlZm9yZWNvcHkiLGZ1bmN0aW9uKGEpe3ZhciBjPWIuZ2V0Q29weVRleHQoKTtjP2NsaXBib2FyZERhdGEuc2V0RGF0YSgiVGV4dCIsYyk6YS5wcmV2ZW50RGVmYXVsdCgpfSksZC5hZGRMaXN0ZW5lcihhLCJrZXlkb3duIixmdW5jdGlvbihhKXtpZihhLmN0cmxLZXkmJmEua2V5Q29kZT09ODgpe3ZhciBjPWIuZ2V0Q29weVRleHQoKTtjJiYoY2xpcGJvYXJkRGF0YS5zZXREYXRhKCJUZXh0IixjKSxiLm9uQ3V0KCkpLGQucHJldmVudERlZmF1bHQoYSl9fSkpOihkLmFkZExpc3RlbmVyKGMsImNvcHkiLHMpLGQuYWRkTGlzdGVuZXIoYywiY3V0Iix0KSksZC5hZGRMaXN0ZW5lcihjLCJjb21wb3NpdGlvbnN0YXJ0IixwKSxlLmlzR2Vja28mJmQuYWRkTGlzdGVuZXIoYywidGV4dCIscSksZS5pc1dlYktpdCYmZC5hZGRMaXN0ZW5lcihjLCJrZXl1cCIscSksZC5hZGRMaXN0ZW5lcihjLCJjb21wb3NpdGlvbmVuZCIsciksZC5hZGRMaXN0ZW5lcihjLCJibHVyIixmdW5jdGlvbigpe2Iub25CbHVyKCl9KSxkLmFkZExpc3RlbmVyKGMsImZvY3VzIixmdW5jdGlvbigpe2Iub25Gb2N1cygpLGwoKX0pLHRoaXMuZm9jdXM9ZnVuY3Rpb24oKXtiLm9uRm9jdXMoKSxsKCksYy5mb2N1cygpfSx0aGlzLmJsdXI9ZnVuY3Rpb24oKXtjLmJsdXIoKX0sdGhpcy5pc0ZvY3VzZWQ9dix0aGlzLmdldEVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gY30sdGhpcy5vbkNvbnRleHRNZW51PWZ1bmN0aW9uKGEsYil7YSYmKGt8fChrPWMuc3R5bGUuY3NzVGV4dCksYy5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjpmaXhlZDsgei1pbmRleDoxMDAwO2xlZnQ6IisoYS54LTIpKyJweDsgdG9wOiIrKGEueS0yKSsicHg7IiksYiYmKGMudmFsdWU9IiIpfSx0aGlzLm9uQ29udGV4dE1lbnVDbG9zZT1mdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrJiYoYy5zdHlsZS5jc3NUZXh0PWssaz0iIiksbSgpfSwwKX19O2IuVGV4dElucHV0PWd9KSxkZWZpbmUoImFjZS9tb3VzZS9tb3VzZV9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9ldmVudCIsImFjZS9tb3VzZS9kZWZhdWx0X2hhbmRsZXJzIiwiYWNlL21vdXNlL2RlZmF1bHRfZ3V0dGVyX2hhbmRsZXIiLCJhY2UvbW91c2UvbW91c2VfZXZlbnQiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9ldmVudCIpLGU9YSgiLi9kZWZhdWx0X2hhbmRsZXJzIikuRGVmYXVsdEhhbmRsZXJzLGY9YSgiLi9kZWZhdWx0X2d1dHRlcl9oYW5kbGVyIikuR3V0dGVySGFuZGxlcixnPWEoIi4vbW91c2VfZXZlbnQiKS5Nb3VzZUV2ZW50LGg9ZnVuY3Rpb24oYSl7dGhpcy5lZGl0b3I9YSxuZXcgZShhKSxuZXcgZihhKSxkLmFkZExpc3RlbmVyKGEuY29udGFpbmVyLCJtb3VzZWRvd24iLGZ1bmN0aW9uKGIpe3JldHVybiBhLmZvY3VzKCksZC5wcmV2ZW50RGVmYXVsdChiKX0pLGQuYWRkTGlzdGVuZXIoYS5jb250YWluZXIsInNlbGVjdHN0YXJ0IixmdW5jdGlvbihhKXtyZXR1cm4gZC5wcmV2ZW50RGVmYXVsdChhKX0pO3ZhciBiPWEucmVuZGVyZXIuZ2V0TW91c2VFdmVudFRhcmdldCgpO2QuYWRkTGlzdGVuZXIoYiwibW91c2Vkb3duIix0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsIm1vdXNlZG93biIpKSxkLmFkZExpc3RlbmVyKGIsImNsaWNrIix0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsImNsaWNrIikpLGQuYWRkTGlzdGVuZXIoYiwibW91c2Vtb3ZlIix0aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcywibW91c2Vtb3ZlIikpLGQuYWRkTXVsdGlNb3VzZURvd25MaXN0ZW5lcihiLDAsMiw1MDAsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJkYmxjbGljayIpKSxkLmFkZE11bHRpTW91c2VEb3duTGlzdGVuZXIoYiwwLDMsNjAwLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywidHJpcGxlY2xpY2siKSksZC5hZGRNdWx0aU1vdXNlRG93bkxpc3RlbmVyKGIsMCw0LDYwMCx0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsInF1YWRjbGljayIpKSxkLmFkZE1vdXNlV2hlZWxMaXN0ZW5lcihhLmNvbnRhaW5lcix0aGlzLm9uTW91c2VXaGVlbC5iaW5kKHRoaXMsIm1vdXNld2hlZWwiKSk7dmFyIGM9YS5yZW5kZXJlci4kZ3V0dGVyO2QuYWRkTGlzdGVuZXIoYywibW91c2Vkb3duIix0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsImd1dHRlcm1vdXNlZG93biIpKSxkLmFkZExpc3RlbmVyKGMsImNsaWNrIix0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsImd1dHRlcmNsaWNrIikpLGQuYWRkTGlzdGVuZXIoYywiZGJsY2xpY2siLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywiZ3V0dGVyZGJsY2xpY2siKSksZC5hZGRMaXN0ZW5lcihjLCJtb3VzZW1vdmUiLHRoaXMub25Nb3VzZU1vdmUuYmluZCh0aGlzLCJndXR0ZXIiKSl9OygoZnVuY3Rpb24oKXt0aGlzLiRzY3JvbGxTcGVlZD0xLHRoaXMuc2V0U2Nyb2xsU3BlZWQ9ZnVuY3Rpb24oYSl7dGhpcy4kc2Nyb2xsU3BlZWQ9YX0sdGhpcy5nZXRTY3JvbGxTcGVlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzY3JvbGxTcGVlZH0sdGhpcy5vbk1vdXNlRXZlbnQ9ZnVuY3Rpb24oYSxiKXt0aGlzLmVkaXRvci5fZW1pdChhLG5ldyBnKGIsdGhpcy5lZGl0b3IpKX0sdGhpcy4kZHJhZ0RlbGF5PTI1MCx0aGlzLnNldERyYWdEZWxheT1mdW5jdGlvbihhKXt0aGlzLiRkcmFnRGVsYXk9YX0sdGhpcy5nZXREcmFnRGVsYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZHJhZ0RlbGF5fSx0aGlzLm9uTW91c2VNb3ZlPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5lZGl0b3IuX2V2ZW50UmVnaXN0cnkmJnRoaXMuZWRpdG9yLl9ldmVudFJlZ2lzdHJ5Lm1vdXNlbW92ZTtpZighY3x8IWMubGVuZ3RoKXJldHVybjt0aGlzLmVkaXRvci5fZW1pdChhLG5ldyBnKGIsdGhpcy5lZGl0b3IpKX0sdGhpcy5vbk1vdXNlV2hlZWw9ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgZyhiLHRoaXMuZWRpdG9yKTtjLnNwZWVkPXRoaXMuJHNjcm9sbFNwZWVkKjIsYy53aGVlbFg9Yi53aGVlbFgsYy53aGVlbFk9Yi53aGVlbFksdGhpcy5lZGl0b3IuX2VtaXQoYSxjKX19KSkuY2FsbChoLnByb3RvdHlwZSksYi5Nb3VzZUhhbmRsZXI9aH0pLGRlZmluZSgiYWNlL21vdXNlL2RlZmF1bHRfaGFuZGxlcnMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2Jyb3dzZXJfZm9jdXMiXSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gayhhKXt0aGlzLmVkaXRvcj1hLHRoaXMuJGNsaWNrU2VsZWN0aW9uPW51bGwsdGhpcy5icm93c2VyRm9jdXM9bmV3IGYsYS5zZXREZWZhdWx0SGFuZGxlcigibW91c2Vkb3duIix0aGlzLm9uTW91c2VEb3duLmJpbmQodGhpcykpLGEuc2V0RGVmYXVsdEhhbmRsZXIoImRibGNsaWNrIix0aGlzLm9uRG91YmxlQ2xpY2suYmluZCh0aGlzKSksYS5zZXREZWZhdWx0SGFuZGxlcigidHJpcGxlY2xpY2siLHRoaXMub25UcmlwbGVDbGljay5iaW5kKHRoaXMpKSxhLnNldERlZmF1bHRIYW5kbGVyKCJxdWFkY2xpY2siLHRoaXMub25RdWFkQ2xpY2suYmluZCh0aGlzKSksYS5zZXREZWZhdWx0SGFuZGxlcigibW91c2V3aGVlbCIsdGhpcy5vblNjcm9sbC5iaW5kKHRoaXMpKX1mdW5jdGlvbiBsKGEsYixjLGQpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coYy1hLDIpK01hdGgucG93KGQtYiwyKSl9InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9ldmVudCIpLGU9YSgiLi4vbGliL2RvbSIpLGY9YSgiLi4vbGliL2Jyb3dzZXJfZm9jdXMiKS5Ccm93c2VyRm9jdXMsZz0wLGg9MSxpPTIsaj01OygoZnVuY3Rpb24oKXt0aGlzLm9uTW91c2VEb3duPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIEMoYil7YS5nZXRTaGlmdEtleSgpP20uc2VsZWN0aW9uLnNlbGVjdFRvUG9zaXRpb24oYik6bi4kY2xpY2tTZWxlY3Rpb258fChtLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGIpLG0uc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKGIucm93LGIuY29sdW1uKSkscT1ofXZhciBiPWEuaW5TZWxlY3Rpb24oKSxjPWEucGFnZVgsZj1hLnBhZ2VZLGs9YS5nZXREb2N1bWVudFBvc2l0aW9uKCksbT10aGlzLmVkaXRvcixuPXRoaXMsbz1tLmdldFNlbGVjdGlvblJhbmdlKCkscD1vLmlzRW1wdHkoKSxxPWc7aWYoYiYmKCF0aGlzLmJyb3dzZXJGb2N1cy5pc0ZvY3VzZWQoKXx8KG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5icm93c2VyRm9jdXMubGFzdEZvY3VzPDIwfHwhbS5pc0ZvY3VzZWQoKSkpe20uZm9jdXMoKTtyZXR1cm59dmFyIHI9YS5nZXRCdXR0b24oKTtpZihyIT09MCl7cCYmbS5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihrKSxyPT0yJiYobS50ZXh0SW5wdXQub25Db250ZXh0TWVudSh7eDphLmNsaWVudFgseTphLmNsaWVudFl9LHApLGQuY2FwdHVyZShtLmNvbnRhaW5lcixmdW5jdGlvbigpe30sbS50ZXh0SW5wdXQub25Db250ZXh0TWVudUNsb3NlKSk7cmV0dXJufWJ8fEMoayk7dmFyIHM9Yyx0PWYsdT0obmV3IERhdGUpLmdldFRpbWUoKSx2LHcseCx5PWZ1bmN0aW9uKGEpe3M9ZC5nZXREb2N1bWVudFgoYSksdD1kLmdldERvY3VtZW50WShhKX0sej1mdW5jdGlvbihhKXtjbGVhckludGVydmFsKEYpLHE9PWc/QyhrKTpxPT1pJiZBKGEpLG4uJGNsaWNrU2VsZWN0aW9uPW51bGwscT1nfSxBPWZ1bmN0aW9uKGEpe2UucmVtb3ZlQ3NzQ2xhc3MobS5jb250YWluZXIsImFjZV9kcmFnZ2luZyIpLG0uc2Vzc2lvbi5yZW1vdmVNYXJrZXIoeCksbS4kbW91c2VIYW5kbGVyLiRjbGlja1NlbGVjdGlvbnx8dnx8KG0ubW92ZUN1cnNvclRvUG9zaXRpb24oayksbS5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oay5yb3csay5jb2x1bW4pKTtpZighdilyZXR1cm47aWYody5jb250YWlucyh2LnJvdyx2LmNvbHVtbikpe3Y9bnVsbDtyZXR1cm59bS5jbGVhclNlbGVjdGlvbigpO2lmKGEmJihhLmN0cmxLZXl8fGEuYWx0S2V5KSl2YXIgYj1tLnNlc3Npb24sYz1iLmluc2VydCh2LGIuZ2V0VGV4dFJhbmdlKHcpKTtlbHNlIHZhciBjPW0ubW92ZVRleHQodyx2KTtpZighYyl7dj1udWxsO3JldHVybn1tLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShjKX0sQj1mdW5jdGlvbigpe2lmKHE9PWcpe3ZhciBhPWwoYyxmLHMsdCksYj0obmV3IERhdGUpLmdldFRpbWUoKTtpZihhPmope3E9aDt2YXIgZD1tLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHMsdCk7ZC5yb3c9TWF0aC5tYXgoMCxNYXRoLm1pbihkLnJvdyxtLnNlc3Npb24uZ2V0TGVuZ3RoKCktMSkpLEMoZCl9ZWxzZSBpZihiLXU+bS5nZXREcmFnRGVsYXkoKSl7cT1pLHc9bS5nZXRTZWxlY3Rpb25SYW5nZSgpO3ZhciBrPW0uZ2V0U2VsZWN0aW9uU3R5bGUoKTt4PW0uc2Vzc2lvbi5hZGRNYXJrZXIodywiYWNlX3NlbGVjdGlvbiIsayksbS5jbGVhclNlbGVjdGlvbigpLGUuYWRkQ3NzQ2xhc3MobS5jb250YWluZXIsImFjZV9kcmFnZ2luZyIpfX1xPT1pP0UoKTpxPT1oJiZEKCl9LEQ9ZnVuY3Rpb24oKXt2YXIgYSxiPW0ucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXMocyx0KTtiLnJvdz1NYXRoLm1heCgwLE1hdGgubWluKGIucm93LG0uc2Vzc2lvbi5nZXRMZW5ndGgoKS0xKSksbi4kY2xpY2tTZWxlY3Rpb24/bi4kY2xpY2tTZWxlY3Rpb24uY29udGFpbnMoYi5yb3csYi5jb2x1bW4pP20uc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKG4uJGNsaWNrU2VsZWN0aW9uKToobi4kY2xpY2tTZWxlY3Rpb24uY29tcGFyZShiLnJvdyxiLmNvbHVtbik9PS0xP2E9bi4kY2xpY2tTZWxlY3Rpb24uZW5kOmE9bi4kY2xpY2tTZWxlY3Rpb24uc3RhcnQsbS5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uQW5jaG9yKGEucm93LGEuY29sdW1uKSxtLnNlbGVjdGlvbi5zZWxlY3RUb1Bvc2l0aW9uKGIpKTptLnNlbGVjdGlvbi5zZWxlY3RUb1Bvc2l0aW9uKGIpLG0ucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKX0sRT1mdW5jdGlvbigpe3Y9bS5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyhzLHQpLHYucm93PU1hdGgubWF4KDAsTWF0aC5taW4odi5yb3csbS5zZXNzaW9uLmdldExlbmd0aCgpLTEpKSxtLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHYpfTtkLmNhcHR1cmUobS5jb250YWluZXIseSx6KTt2YXIgRj1zZXRJbnRlcnZhbChCLDIwKTtyZXR1cm4gYS5wcmV2ZW50RGVmYXVsdCgpfSx0aGlzLm9uRG91YmxlQ2xpY2s9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXREb2N1bWVudFBvc2l0aW9uKCksYz10aGlzLmVkaXRvcjtjLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGIpLGMuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKSx0aGlzLiRjbGlja1NlbGVjdGlvbj1jLmdldFNlbGVjdGlvblJhbmdlKCl9LHRoaXMub25UcmlwbGVDbGljaz1mdW5jdGlvbihhKXt2YXIgYj1hLmdldERvY3VtZW50UG9zaXRpb24oKSxjPXRoaXMuZWRpdG9yO2MubW92ZUN1cnNvclRvUG9zaXRpb24oYiksYy5zZWxlY3Rpb24uc2VsZWN0TGluZSgpLHRoaXMuJGNsaWNrU2VsZWN0aW9uPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKX0sdGhpcy5vblF1YWRDbGljaz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmVkaXRvcjtiLnNlbGVjdEFsbCgpLHRoaXMuJGNsaWNrU2VsZWN0aW9uPWIuZ2V0U2VsZWN0aW9uUmFuZ2UoKX0sdGhpcy5vblNjcm9sbD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmVkaXRvcjtiLnJlbmRlcmVyLnNjcm9sbEJ5KGEud2hlZWxYKmEuc3BlZWQsYS53aGVlbFkqYS5zcGVlZCk7aWYoYi5yZW5kZXJlci5pc1Njcm9sbGFibGVCeShhLndoZWVsWCphLnNwZWVkLGEud2hlZWxZKmEuc3BlZWQpKXJldHVybiBhLnByZXZlbnREZWZhdWx0KCl9fSkpLmNhbGwoay5wcm90b3R5cGUpLGIuRGVmYXVsdEhhbmRsZXJzPWt9KSxkZWZpbmUoImFjZS9saWIvYnJvd3Nlcl9mb2N1cyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi9vb3AiKSxlPWEoIi4vZXZlbnQiKSxmPWEoIi4vZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixnPWZ1bmN0aW9uKGEpe2E9YXx8d2luZG93LHRoaXMubGFzdEZvY3VzPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuX2lzRm9jdXNlZD0hMDt2YXIgYj10aGlzOyJvbmZvY3VzaW4iaW4gYS5kb2N1bWVudD8oZS5hZGRMaXN0ZW5lcihhLmRvY3VtZW50LCJmb2N1c2luIixmdW5jdGlvbihhKXtiLl9zZXRGb2N1c2VkKCEwKX0pLGUuYWRkTGlzdGVuZXIoYS5kb2N1bWVudCwiZm9jdXNvdXQiLGZ1bmN0aW9uKGEpe2IuX3NldEZvY3VzZWQoISFhLnRvRWxlbWVudCl9KSk6KGUuYWRkTGlzdGVuZXIoYSwiYmx1ciIsZnVuY3Rpb24oYSl7Yi5fc2V0Rm9jdXNlZCghMSl9KSxlLmFkZExpc3RlbmVyKGEsImZvY3VzIixmdW5jdGlvbihhKXtiLl9zZXRGb2N1c2VkKCEwKX0pKX07KChmdW5jdGlvbigpe2QuaW1wbGVtZW50KHRoaXMsZiksdGhpcy5pc0ZvY3VzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNGb2N1c2VkfSx0aGlzLl9zZXRGb2N1c2VkPWZ1bmN0aW9uKGEpe2lmKHRoaXMuX2lzRm9jdXNlZD09YSlyZXR1cm47YSYmKHRoaXMubGFzdEZvY3VzPShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0aGlzLl9pc0ZvY3VzZWQ9YSx0aGlzLl9lbWl0KCJjaGFuZ2VGb2N1cyIpfX0pKS5jYWxsKGcucHJvdG90eXBlKSxiLkJyb3dzZXJGb2N1cz1nfSksZGVmaW5lKCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPXt9O2QuX2VtaXQ9ZC5fZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihhLGIpe3RoaXMuX2V2ZW50UmVnaXN0cnk9dGhpcy5fZXZlbnRSZWdpc3RyeXx8e30sdGhpcy5fZGVmYXVsdEhhbmRsZXJzPXRoaXMuX2RlZmF1bHRIYW5kbGVyc3x8e307dmFyIGM9dGhpcy5fZXZlbnRSZWdpc3RyeVthXXx8W10sZD10aGlzLl9kZWZhdWx0SGFuZGxlcnNbYV07aWYoIWMubGVuZ3RoJiYhZClyZXR1cm47Yj1ifHx7fSxiLnR5cGU9YSxiLnN0b3BQcm9wYWdhdGlvbnx8KGIuc3RvcFByb3BhZ2F0aW9uPWZ1bmN0aW9uKCl7dGhpcy5wcm9wYWdhdGlvblN0b3BwZWQ9ITB9KSxiLnByZXZlbnREZWZhdWx0fHwoYi5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH0pO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXtjW2VdKGIpO2lmKGIucHJvcGFnYXRpb25TdG9wcGVkKWJyZWFrfWQmJiFiLmRlZmF1bHRQcmV2ZW50ZWQmJmQoYil9LGQuc2V0RGVmYXVsdEhhbmRsZXI9ZnVuY3Rpb24oYSxiKXt0aGlzLl9kZWZhdWx0SGFuZGxlcnM9dGhpcy5fZGVmYXVsdEhhbmRsZXJzfHx7fTtpZih0aGlzLl9kZWZhdWx0SGFuZGxlcnNbYV0pdGhyb3cgbmV3IEVycm9yKCJUaGUgZGVmYXVsdCBoYW5kbGVyIGZvciAnIithKyInIGlzIGFscmVhZHkgc2V0Iik7dGhpcy5fZGVmYXVsdEhhbmRsZXJzW2FdPWJ9LGQub249ZC5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYil7dGhpcy5fZXZlbnRSZWdpc3RyeT10aGlzLl9ldmVudFJlZ2lzdHJ5fHx7fTt2YXIgYz10aGlzLl9ldmVudFJlZ2lzdHJ5W2FdO2lmKCFjKXZhciBjPXRoaXMuX2V2ZW50UmVnaXN0cnlbYV09W107Yy5pbmRleE9mKGIpPT0tMSYmYy5wdXNoKGIpfSxkLnJlbW92ZUxpc3RlbmVyPWQucmVtb3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIpe3RoaXMuX2V2ZW50UmVnaXN0cnk9dGhpcy5fZXZlbnRSZWdpc3RyeXx8e307dmFyIGM9dGhpcy5fZXZlbnRSZWdpc3RyeVthXTtpZighYylyZXR1cm47dmFyIGQ9Yy5pbmRleE9mKGIpO2QhPT0tMSYmYy5zcGxpY2UoZCwxKX0sZC5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24oYSl7dGhpcy5fZXZlbnRSZWdpc3RyeSYmKHRoaXMuX2V2ZW50UmVnaXN0cnlbYV09W10pfSxiLkV2ZW50RW1pdHRlcj1kfSksZGVmaW5lKCJhY2UvbW91c2UvZGVmYXVsdF9ndXR0ZXJfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2Euc2V0RGVmYXVsdEhhbmRsZXIoImd1dHRlcmNsaWNrIixmdW5jdGlvbihiKXt2YXIgYz1iLmdldERvY3VtZW50UG9zaXRpb24oKS5yb3csZD1hLnNlc3Npb24uc2VsZWN0aW9uO2QubW92ZUN1cnNvclRvKGMsMCksZC5zZWxlY3RMaW5lKCl9KX0idXNlIHN0cmljdCIsYi5HdXR0ZXJIYW5kbGVyPWR9KSxkZWZpbmUoImFjZS9tb3VzZS9tb3VzZV9ldmVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZXZlbnQiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9ldmVudCIpLGU9Yi5Nb3VzZUV2ZW50PWZ1bmN0aW9uKGEsYil7dGhpcy5kb21FdmVudD1hLHRoaXMuZWRpdG9yPWIsdGhpcy5wYWdlWD1kLmdldERvY3VtZW50WChhKSx0aGlzLnBhZ2VZPWQuZ2V0RG9jdW1lbnRZKGEpLHRoaXMuY2xpZW50WD1hLmNsaWVudFgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSx0aGlzLiRwb3M9bnVsbCx0aGlzLiRpblNlbGVjdGlvbj1udWxsLHRoaXMucHJvcGFnYXRpb25TdG9wcGVkPSExLHRoaXMuZGVmYXVsdFByZXZlbnRlZD0hMX07KChmdW5jdGlvbigpe3RoaXMuc3RvcFByb3BhZ2F0aW9uPWZ1bmN0aW9uKCl7ZC5zdG9wUHJvcGFnYXRpb24odGhpcy5kb21FdmVudCksdGhpcy5wcm9wYWdhdGlvblN0b3BwZWQ9ITB9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXtkLnByZXZlbnREZWZhdWx0KHRoaXMuZG9tRXZlbnQpLHRoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH0sdGhpcy5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnByZXZlbnREZWZhdWx0KCl9LHRoaXMuZ2V0RG9jdW1lbnRQb3NpdGlvbj1mdW5jdGlvbigpe2lmKHRoaXMuJHBvcylyZXR1cm4gdGhpcy4kcG9zO3ZhciBhPWQuZ2V0RG9jdW1lbnRYKHRoaXMuZG9tRXZlbnQpLGI9ZC5nZXREb2N1bWVudFkodGhpcy5kb21FdmVudCk7cmV0dXJuIHRoaXMuJHBvcz10aGlzLmVkaXRvci5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyhhLGIpLHRoaXMuJHBvcy5yb3c9TWF0aC5tYXgoMCxNYXRoLm1pbih0aGlzLiRwb3Mucm93LHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0TGVuZ3RoKCktMSkpLHRoaXMuJHBvc30sdGhpcy5pblNlbGVjdGlvbj1mdW5jdGlvbigpe2lmKHRoaXMuJGluU2VsZWN0aW9uIT09bnVsbClyZXR1cm4gdGhpcy4kaW5TZWxlY3Rpb247dmFyIGE9dGhpcy5lZGl0b3I7aWYoYS5nZXRSZWFkT25seSgpKXRoaXMuJGluU2VsZWN0aW9uPSExO2Vsc2V7dmFyIGI9YS5nZXRTZWxlY3Rpb25SYW5nZSgpO2lmKGIuaXNFbXB0eSgpKXRoaXMuJGluU2VsZWN0aW9uPSExO2Vsc2V7dmFyIGM9dGhpcy5nZXREb2N1bWVudFBvc2l0aW9uKCk7dGhpcy4kaW5TZWxlY3Rpb249Yi5jb250YWlucyhjLnJvdyxjLmNvbHVtbil9fXJldHVybiB0aGlzLiRpblNlbGVjdGlvbn0sdGhpcy5nZXRCdXR0b249ZnVuY3Rpb24oKXtyZXR1cm4gZC5nZXRCdXR0b24odGhpcy5kb21FdmVudCl9LHRoaXMuZ2V0U2hpZnRLZXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21FdmVudC5zaGlmdEtleX0sdGhpcy5nZXRBY2NlbEtleT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbUV2ZW50LmN0cmxLZXl8fHRoaXMuZG9tRXZlbnQubWV0YUtleX19KSkuY2FsbChlLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb3VzZS9mb2xkX2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXthLm9uKCJjbGljayIsZnVuY3Rpb24oYil7dmFyIGM9Yi5nZXREb2N1bWVudFBvc2l0aW9uKCksZD1hLnNlc3Npb24sZT1kLmdldEZvbGRBdChjLnJvdyxjLmNvbHVtbiwxKTtlJiYoYi5nZXRBY2NlbEtleSgpP2QucmVtb3ZlRm9sZChlKTpkLmV4cGFuZEZvbGQoZSksYi5zdG9wKCkpfSksYS5vbigiZ3V0dGVyY2xpY2siLGZ1bmN0aW9uKGIpe2lmKGIuZG9tRXZlbnQudGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCJhY2VfZm9sZC13aWRnZXQiKSE9LTEpe3ZhciBjPWIuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLnJvdzthLnNlc3Npb24ub25Gb2xkV2lkZ2V0Q2xpY2soYyxiLmRvbUV2ZW50KSxiLnN0b3AoKX19KX0idXNlIHN0cmljdCIsYi5Gb2xkSGFuZGxlcj1kfSksZGVmaW5lKCJhY2Uva2V5Ym9hcmQva2V5YmluZGluZyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIva2V5cyIsImFjZS9saWIvZXZlbnQiLCJhY2UvY29tbWFuZHMvZGVmYXVsdF9jb21tYW5kcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2tleXMiKSxlPWEoIi4uL2xpYi9ldmVudCIpO2EoIi4uL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMiKTt2YXIgZj1mdW5jdGlvbihhKXt0aGlzLiRlZGl0b3I9YSx0aGlzLiRkYXRhPXt9LHRoaXMuJGhhbmRsZXJzPVt0aGlzXX07KChmdW5jdGlvbigpe3RoaXMuc2V0S2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKGEpe2lmKHRoaXMuJGhhbmRsZXJzW3RoaXMuJGhhbmRsZXJzLmxlbmd0aC0xXT09YSlyZXR1cm47dGhpcy4kZGF0YT17fSx0aGlzLiRoYW5kbGVycz1hP1t0aGlzLGFdOlt0aGlzXX0sdGhpcy5hZGRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oYSl7dGhpcy5yZW1vdmVLZXlib2FyZEhhbmRsZXIoYSksdGhpcy4kaGFuZGxlcnMucHVzaChhKX0sdGhpcy5yZW1vdmVLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kaGFuZGxlcnMuaW5kZXhPZihhKTtyZXR1cm4gYj09LTE/ITE6KHRoaXMuJGhhbmRsZXJzLnNwbGljZShiLDEpLCEwKX0sdGhpcy5nZXRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaGFuZGxlcnNbdGhpcy4kaGFuZGxlcnMubGVuZ3RoLTFdfSx0aGlzLiRjYWxsS2V5Ym9hcmRIYW5kbGVycz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZjtmb3IodmFyIGc9dGhpcy4kaGFuZGxlcnMubGVuZ3RoO2ctLTspe2Y9dGhpcy4kaGFuZGxlcnNbZ10uaGFuZGxlS2V5Ym9hcmQodGhpcy4kZGF0YSxhLGIsYyxkKTtpZihmJiZmLmNvbW1hbmQpYnJlYWt9aWYoIWZ8fCFmLmNvbW1hbmQpcmV0dXJuITE7dmFyIGg9ITEsaT10aGlzLiRlZGl0b3IuY29tbWFuZHM7cmV0dXJuIGYuY29tbWFuZCE9Im51bGwiP2g9aS5leGVjKGYuY29tbWFuZCx0aGlzLiRlZGl0b3IsZi5hcmdzKTpoPSEwLGgmJmQmJmUuc3RvcEV2ZW50KGQpLGh9LHRoaXMuaGFuZGxlS2V5Ym9hcmQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybntjb21tYW5kOnRoaXMuJGVkaXRvci5jb21tYW5kcy5maW5kS2V5Q29tbWFuZChiLGMpfX0sdGhpcy5vbkNvbW1hbmRLZXk9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPWQua2V5Q29kZVRvU3RyaW5nKGMpO3RoaXMuJGNhbGxLZXlib2FyZEhhbmRsZXJzKGIsZSxjLGEpfSx0aGlzLm9uVGV4dElucHV0PWZ1bmN0aW9uKGEsYil7dmFyIGM9ITE7IWImJmEubGVuZ3RoPT0xJiYoYz10aGlzLiRjYWxsS2V5Ym9hcmRIYW5kbGVycygwLGEpKSxjfHx0aGlzLiRlZGl0b3IuY29tbWFuZHMuZXhlYygiaW5zZXJ0c3RyaW5nIix0aGlzLiRlZGl0b3IsYSl9fSkpLmNhbGwoZi5wcm90b3R5cGUpLGIuS2V5QmluZGluZz1mfSksZGVmaW5lKCJhY2UvY29tbWFuZHMvZGVmYXVsdF9jb21tYW5kcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKGEsYil7cmV0dXJue3dpbjphLG1hYzpifX0idXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2xhbmciKTtiLmNvbW1hbmRzPVt7bmFtZToic2VsZWN0YWxsIixiaW5kS2V5OmUoIkN0cmwtQSIsIkNvbW1hbmQtQSIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5zZWxlY3RBbGwoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJjZW50ZXJzZWxlY3Rpb24iLGJpbmRLZXk6ZShudWxsLCJDdHJsLUwiKSxleGVjOmZ1bmN0aW9uKGEpe2EuY2VudGVyU2VsZWN0aW9uKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b2xpbmUiLGJpbmRLZXk6ZSgiQ3RybC1MIiwiQ29tbWFuZC1MIiksZXhlYzpmdW5jdGlvbihhKXt2YXIgYj1wYXJzZUludChwcm9tcHQoIkVudGVyIGxpbmUgbnVtYmVyOiIpLDEwKTtpc05hTihiKXx8YS5nb3RvTGluZShiKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJmb2xkIixiaW5kS2V5OmUoIkFsdC1MIiwiQWx0LUwiKSxleGVjOmZ1bmN0aW9uKGEpe2Euc2Vzc2lvbi50b2dnbGVGb2xkKCExKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJ1bmZvbGQiLGJpbmRLZXk6ZSgiQWx0LVNoaWZ0LUwiLCJBbHQtU2hpZnQtTCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5zZXNzaW9uLnRvZ2dsZUZvbGQoITApfSxyZWFkT25seTohMH0se25hbWU6ImZvbGRhbGwiLGJpbmRLZXk6ZSgiQWx0LTAiLCJBbHQtMCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5zZXNzaW9uLmZvbGRBbGwoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJ1bmZvbGRhbGwiLGJpbmRLZXk6ZSgiQWx0LVNoaWZ0LTAiLCJBbHQtU2hpZnQtMCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5zZXNzaW9uLnVuZm9sZCgpfSxyZWFkT25seTohMH0se25hbWU6ImZpbmRuZXh0IixiaW5kS2V5OmUoIkN0cmwtSyIsIkNvbW1hbmQtRyIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5maW5kTmV4dCgpfSxyZWFkT25seTohMH0se25hbWU6ImZpbmRwcmV2aW91cyIsYmluZEtleTplKCJDdHJsLVNoaWZ0LUsiLCJDb21tYW5kLVNoaWZ0LUciKSxleGVjOmZ1bmN0aW9uKGEpe2EuZmluZFByZXZpb3VzKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZmluZCIsYmluZEtleTplKCJDdHJsLUYiLCJDb21tYW5kLUYiKSxleGVjOmZ1bmN0aW9uKGEpe3ZhciBiPXByb21wdCgiRmluZDoiLGEuZ2V0Q29weVRleHQoKSk7YS5maW5kKGIpfSxyZWFkT25seTohMH0se25hbWU6Im92ZXJ3cml0ZSIsYmluZEtleTplKCJJbnNlcnQiLCJJbnNlcnQiKSxleGVjOmZ1bmN0aW9uKGEpe2EudG9nZ2xlT3ZlcndyaXRlKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0dG9zdGFydCIsYmluZEtleTplKCJDdHJsLVNoaWZ0LUhvbWV8QWx0LVNoaWZ0LVVwIiwiQ29tbWFuZC1TaGlmdC1VcCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RGaWxlU3RhcnQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3Rvc3RhcnQiLGJpbmRLZXk6ZSgiQ3RybC1Ib21lfEN0cmwtVXAiLCJDb21tYW5kLUhvbWV8Q29tbWFuZC1VcCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5uYXZpZ2F0ZUZpbGVTdGFydCgpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdHVwIixiaW5kS2V5OmUoIlNoaWZ0LVVwIiwiU2hpZnQtVXAiKSxleGVjOmZ1bmN0aW9uKGEpe2EuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0VXAoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb2xpbmV1cCIsYmluZEtleTplKCJVcCIsIlVwfEN0cmwtUCIpLGV4ZWM6ZnVuY3Rpb24oYSxiKXthLm5hdmlnYXRlVXAoYi50aW1lcyl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0dG9lbmQiLGJpbmRLZXk6ZSgiQ3RybC1TaGlmdC1FbmR8QWx0LVNoaWZ0LURvd24iLCJDb21tYW5kLVNoaWZ0LURvd24iKSxleGVjOmZ1bmN0aW9uKGEpe2EuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0RmlsZUVuZCgpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG9lbmQiLGJpbmRLZXk6ZSgiQ3RybC1FbmR8Q3RybC1Eb3duIiwiQ29tbWFuZC1FbmR8Q29tbWFuZC1Eb3duIiksZXhlYzpmdW5jdGlvbihhKXthLm5hdmlnYXRlRmlsZUVuZCgpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdGRvd24iLGJpbmRLZXk6ZSgiU2hpZnQtRG93biIsIlNoaWZ0LURvd24iKSxleGVjOmZ1bmN0aW9uKGEpe2EuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0RG93bigpfSxyZWFkT25seTohMH0se25hbWU6ImdvbGluZWRvd24iLGJpbmRLZXk6ZSgiRG93biIsIkRvd258Q3RybC1OIiksZXhlYzpmdW5jdGlvbihhLGIpe2EubmF2aWdhdGVEb3duKGIudGltZXMpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdHdvcmRsZWZ0IixiaW5kS2V5OmUoIkN0cmwtU2hpZnQtTGVmdCIsIk9wdGlvbi1TaGlmdC1MZWZ0IiksZXhlYzpmdW5jdGlvbihhKXthLmdldFNlbGVjdGlvbigpLnNlbGVjdFdvcmRMZWZ0KCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b3dvcmRsZWZ0IixiaW5kS2V5OmUoIkN0cmwtTGVmdCIsIk9wdGlvbi1MZWZ0IiksZXhlYzpmdW5jdGlvbihhKXthLm5hdmlnYXRlV29yZExlZnQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R0b2xpbmVzdGFydCIsYmluZEtleTplKCJBbHQtU2hpZnQtTGVmdCIsIkNvbW1hbmQtU2hpZnQtTGVmdCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMaW5lU3RhcnQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvbGluZXN0YXJ0IixiaW5kS2V5OmUoIkFsdC1MZWZ0fEhvbWUiLCJDb21tYW5kLUxlZnR8SG9tZXxDdHJsLUEiKSxleGVjOmZ1bmN0aW9uKGEpe2EubmF2aWdhdGVMaW5lU3RhcnQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RsZWZ0IixiaW5kS2V5OmUoIlNoaWZ0LUxlZnQiLCJTaGlmdC1MZWZ0IiksZXhlYzpmdW5jdGlvbihhKXthLmdldFNlbGVjdGlvbigpLnNlbGVjdExlZnQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvbGVmdCIsYmluZEtleTplKCJMZWZ0IiwiTGVmdHxDdHJsLUIiKSxleGVjOmZ1bmN0aW9uKGEsYil7YS5uYXZpZ2F0ZUxlZnQoYi50aW1lcyl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0d29yZHJpZ2h0IixiaW5kS2V5OmUoIkN0cmwtU2hpZnQtUmlnaHQiLCJPcHRpb24tU2hpZnQtUmlnaHQiKSxleGVjOmZ1bmN0aW9uKGEpe2EuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0V29yZFJpZ2h0KCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b3dvcmRyaWdodCIsYmluZEtleTplKCJDdHJsLVJpZ2h0IiwiT3B0aW9uLVJpZ2h0IiksZXhlYzpmdW5jdGlvbihhKXthLm5hdmlnYXRlV29yZFJpZ2h0KCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0dG9saW5lZW5kIixiaW5kS2V5OmUoIkFsdC1TaGlmdC1SaWdodCIsIkNvbW1hbmQtU2hpZnQtUmlnaHQiKSxleGVjOmZ1bmN0aW9uKGEpe2EuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGluZUVuZCgpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG9saW5lZW5kIixiaW5kS2V5OmUoIkFsdC1SaWdodHxFbmQiLCJDb21tYW5kLVJpZ2h0fEVuZHxDdHJsLUUiKSxleGVjOmZ1bmN0aW9uKGEpe2EubmF2aWdhdGVMaW5lRW5kKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0cmlnaHQiLGJpbmRLZXk6ZSgiU2hpZnQtUmlnaHQiLCJTaGlmdC1SaWdodCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RSaWdodCgpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG9yaWdodCIsYmluZEtleTplKCJSaWdodCIsIlJpZ2h0fEN0cmwtRiIpLGV4ZWM6ZnVuY3Rpb24oYSxiKXthLm5hdmlnYXRlUmlnaHQoYi50aW1lcyl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0cGFnZWRvd24iLGJpbmRLZXk6ZSgiU2hpZnQtUGFnZURvd24iLCJTaGlmdC1QYWdlRG93biIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5zZWxlY3RQYWdlRG93bigpfSxyZWFkT25seTohMH0se25hbWU6InBhZ2Vkb3duIixiaW5kS2V5OmUobnVsbCwiUGFnZURvd24iKSxleGVjOmZ1bmN0aW9uKGEpe2Euc2Nyb2xsUGFnZURvd24oKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvcGFnZWRvd24iLGJpbmRLZXk6ZSgiUGFnZURvd24iLCJPcHRpb24tUGFnZURvd258Q3RybC1WIiksZXhlYzpmdW5jdGlvbihhKXthLmdvdG9QYWdlRG93bigpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdHBhZ2V1cCIsYmluZEtleTplKCJTaGlmdC1QYWdlVXAiLCJTaGlmdC1QYWdlVXAiKSxleGVjOmZ1bmN0aW9uKGEpe2Euc2VsZWN0UGFnZVVwKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToicGFnZXVwIixiaW5kS2V5OmUobnVsbCwiUGFnZVVwIiksZXhlYzpmdW5jdGlvbihhKXthLnNjcm9sbFBhZ2VVcCgpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG9wYWdldXAiLGJpbmRLZXk6ZSgiUGFnZVVwIiwiT3B0aW9uLVBhZ2VVcCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5nb3RvUGFnZVVwKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0bGluZXN0YXJ0IixiaW5kS2V5OmUoIlNoaWZ0LUhvbWUiLCJTaGlmdC1Ib21lIiksZXhlYzpmdW5jdGlvbihhKXthLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVTdGFydCgpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdGxpbmVlbmQiLGJpbmRLZXk6ZSgiU2hpZnQtRW5kIiwiU2hpZnQtRW5kIiksZXhlYzpmdW5jdGlvbihhKXthLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVFbmQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJ0b2dnbGVyZWNvcmRpbmciLGJpbmRLZXk6ZSgiQ3RybC1BbHQtRSIsIkNvbW1hbmQtT3B0aW9uLUUiKSxleGVjOmZ1bmN0aW9uKGEpe2EuY29tbWFuZHMudG9nZ2xlUmVjb3JkaW5nKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToicmVwbGF5bWFjcm8iLGJpbmRLZXk6ZSgiQ3RybC1TaGlmdC1FIiwiQ29tbWFuZC1TaGlmdC1FIiksZXhlYzpmdW5jdGlvbihhKXthLmNvbW1hbmRzLnJlcGxheShhKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJqdW1wdG9tYXRjaGluZyIsYmluZEtleTplKCJDdHJsLVNoaWZ0LVAiLCJDdHJsLVNoaWZ0LVAiKSxleGVjOmZ1bmN0aW9uKGEpe2EuanVtcFRvTWF0Y2hpbmcoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJyZW1vdmVsaW5lIixiaW5kS2V5OmUoIkN0cmwtRCIsIkNvbW1hbmQtRCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5yZW1vdmVMaW5lcygpfX0se25hbWU6InRvZ2dsZWNvbW1lbnQiLGJpbmRLZXk6ZSgiQ3RybC03IiwiQ29tbWFuZC03IiksZXhlYzpmdW5jdGlvbihhKXthLnRvZ2dsZUNvbW1lbnRMaW5lcygpfX0se25hbWU6InJlcGxhY2UiLGJpbmRLZXk6ZSgiQ3RybC1SIiwiQ29tbWFuZC1PcHRpb24tRiIpLGV4ZWM6ZnVuY3Rpb24oYSl7dmFyIGI9cHJvbXB0KCJGaW5kOiIsYS5nZXRDb3B5VGV4dCgpKTtpZighYilyZXR1cm47dmFyIGM9cHJvbXB0KCJSZXBsYWNlbWVudDoiKTtpZighYylyZXR1cm47YS5yZXBsYWNlKGMse25lZWRsZTpifSl9fSx7bmFtZToicmVwbGFjZWFsbCIsYmluZEtleTplKCJDdHJsLVNoaWZ0LVIiLCJDb21tYW5kLVNoaWZ0LU9wdGlvbi1GIiksZXhlYzpmdW5jdGlvbihhKXt2YXIgYj1wcm9tcHQoIkZpbmQ6Iik7aWYoIWIpcmV0dXJuO3ZhciBjPXByb21wdCgiUmVwbGFjZW1lbnQ6Iik7aWYoIWMpcmV0dXJuO2EucmVwbGFjZUFsbChjLHtuZWVkbGU6Yn0pfX0se25hbWU6InVuZG8iLGJpbmRLZXk6ZSgiQ3RybC1aIiwiQ29tbWFuZC1aIiksZXhlYzpmdW5jdGlvbihhKXthLnVuZG8oKX19LHtuYW1lOiJyZWRvIixiaW5kS2V5OmUoIkN0cmwtU2hpZnQtWnxDdHJsLVkiLCJDb21tYW5kLVNoaWZ0LVp8Q29tbWFuZC1ZIiksZXhlYzpmdW5jdGlvbihhKXthLnJlZG8oKX19LHtuYW1lOiJjb3B5bGluZXN1cCIsYmluZEtleTplKCJDdHJsLUFsdC1VcCIsIkNvbW1hbmQtT3B0aW9uLVVwIiksZXhlYzpmdW5jdGlvbihhKXthLmNvcHlMaW5lc1VwKCl9fSx7bmFtZToibW92ZWxpbmVzdXAiLGJpbmRLZXk6ZSgiQWx0LVVwIiwiT3B0aW9uLVVwIiksZXhlYzpmdW5jdGlvbihhKXthLm1vdmVMaW5lc1VwKCl9fSx7bmFtZToiY29weWxpbmVzZG93biIsYmluZEtleTplKCJDdHJsLUFsdC1Eb3duIiwiQ29tbWFuZC1PcHRpb24tRG93biIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5jb3B5TGluZXNEb3duKCl9fSx7bmFtZToibW92ZWxpbmVzZG93biIsYmluZEtleTplKCJBbHQtRG93biIsIk9wdGlvbi1Eb3duIiksZXhlYzpmdW5jdGlvbihhKXthLm1vdmVMaW5lc0Rvd24oKX19LHtuYW1lOiJkZWwiLGJpbmRLZXk6ZSgiRGVsZXRlIiwiRGVsZXRlfEN0cmwtRCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5yZW1vdmUoInJpZ2h0Iil9fSx7bmFtZToiYmFja3NwYWNlIixiaW5kS2V5OmUoIkN0cmwtQmFja3NwYWNlfENvbW1hbmQtQmFja3NwYWNlfE9wdGlvbi1CYWNrc3BhY2V8U2hpZnQtQmFja3NwYWNlfEJhY2tzcGFjZSIsIkN0cmwtQmFja3NwYWNlfENvbW1hbmQtQmFja3NwYWNlfFNoaWZ0LUJhY2tzcGFjZXxCYWNrc3BhY2V8Q3RybC1IIiksZXhlYzpmdW5jdGlvbihhKXthLnJlbW92ZSgibGVmdCIpfX0se25hbWU6InJlbW92ZXRvbGluZXN0YXJ0IixiaW5kS2V5OmUoIkFsdC1CYWNrc3BhY2UiLCJPcHRpb24tQmFja3NwYWNlIiksZXhlYzpmdW5jdGlvbihhKXthLnJlbW92ZVRvTGluZVN0YXJ0KCl9fSx7bmFtZToicmVtb3ZldG9saW5lZW5kIixiaW5kS2V5OmUoIkFsdC1EZWxldGUiLCJDdHJsLUsiKSxleGVjOmZ1bmN0aW9uKGEpe2EucmVtb3ZlVG9MaW5lRW5kKCl9fSx7bmFtZToicmVtb3Zld29yZGxlZnQiLGJpbmRLZXk6ZSgiQ3RybC1CYWNrc3BhY2UiLCJBbHQtQmFja3NwYWNlfEN0cmwtQWx0LUJhY2tzcGFjZSIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5yZW1vdmVXb3JkTGVmdCgpfX0se25hbWU6InJlbW92ZXdvcmRyaWdodCIsYmluZEtleTplKCJDdHJsLURlbGV0ZSIsIkFsdC1EZWxldGUiKSxleGVjOmZ1bmN0aW9uKGEpe2EucmVtb3ZlV29yZFJpZ2h0KCl9fSx7bmFtZToib3V0ZGVudCIsYmluZEtleTplKCJTaGlmdC1UYWIiLCJTaGlmdC1UYWIiKSxleGVjOmZ1bmN0aW9uKGEpe2EuYmxvY2tPdXRkZW50KCl9fSx7bmFtZToiaW5kZW50IixiaW5kS2V5OmUoIlRhYiIsIlRhYiIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5pbmRlbnQoKX19LHtuYW1lOiJpbnNlcnRzdHJpbmciLGV4ZWM6ZnVuY3Rpb24oYSxiKXthLmluc2VydChiKX19LHtuYW1lOiJpbnNlcnR0ZXh0IixleGVjOmZ1bmN0aW9uKGEsYil7YS5pbnNlcnQoZC5zdHJpbmdSZXBlYXQoYi50ZXh0fHwiIixiLnRpbWVzfHwxKSl9fSx7bmFtZToic3BsaXRsaW5lIixiaW5kS2V5OmUobnVsbCwiQ3RybC1PIiksZXhlYzpmdW5jdGlvbihhKXthLnNwbGl0TGluZSgpfX0se25hbWU6InRyYW5zcG9zZWxldHRlcnMiLGJpbmRLZXk6ZSgiQ3RybC1UIiwiQ3RybC1UIiksZXhlYzpmdW5jdGlvbihhKXthLnRyYW5zcG9zZUxldHRlcnMoKX19LHtuYW1lOiJ0b3VwcGVyY2FzZSIsYmluZEtleTplKCJDdHJsLVUiLCJDdHJsLVUiKSxleGVjOmZ1bmN0aW9uKGEpe2EudG9VcHBlckNhc2UoKX19LHtuYW1lOiJ0b2xvd2VyY2FzZSIsYmluZEtleTplKCJDdHJsLVNoaWZ0LVUiLCJDdHJsLVNoaWZ0LVUiKSxleGVjOmZ1bmN0aW9uKGEpe2EudG9Mb3dlckNhc2UoKX19XX0pLGRlZmluZSgiYWNlL2VkaXRfc2Vzc2lvbiIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL3NlbGVjdGlvbiIsImFjZS9tb2RlL3RleHQiLCJhY2UvcmFuZ2UiLCJhY2UvZG9jdW1lbnQiLCJhY2UvYmFja2dyb3VuZF90b2tlbml6ZXIiLCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGRpbmciLCJhY2UvZWRpdF9zZXNzaW9uL2JyYWNrZXRfbWF0Y2giXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4vbGliL29vcCIpLGU9YSgiLi9saWIvbGFuZyIpLGY9YSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixnPWEoIi4vc2VsZWN0aW9uIikuU2VsZWN0aW9uLGg9YSgiLi9tb2RlL3RleHQiKS5Nb2RlLGk9YSgiLi9yYW5nZSIpLlJhbmdlLGo9YSgiLi9kb2N1bWVudCIpLkRvY3VtZW50LGs9YSgiLi9iYWNrZ3JvdW5kX3Rva2VuaXplciIpLkJhY2tncm91bmRUb2tlbml6ZXIsbD1mdW5jdGlvbihhLGIpe3RoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJGJyZWFrcG9pbnRzPVtdLHRoaXMuJGZyb250TWFya2Vycz17fSx0aGlzLiRiYWNrTWFya2Vycz17fSx0aGlzLiRtYXJrZXJJZD0xLHRoaXMuJHJvd0NhY2hlPVtdLHRoaXMuJHdyYXBEYXRhPVtdLHRoaXMuJGZvbGREYXRhPVtdLHRoaXMuJHVuZG9TZWxlY3Q9ITAsdGhpcy4kZm9sZERhdGEudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgYT0iIjtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2ErPSJcbiIrYi50b1N0cmluZygpfSksYX0sYSBpbnN0YW5jZW9mIGo/dGhpcy5zZXREb2N1bWVudChhKTp0aGlzLnNldERvY3VtZW50KG5ldyBqKGEpKSx0aGlzLnNlbGVjdGlvbj1uZXcgZyh0aGlzKSxiP3RoaXMuc2V0TW9kZShiKTp0aGlzLnNldE1vZGUobmV3IGgpfTsoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyhhKXtyZXR1cm4gYTw0MzUyPyExOmE+PTQzNTImJmE8PTQ0NDd8fGE+PTQ1MTUmJmE8PTQ1MTl8fGE+PTQ2MDImJmE8PTQ2MDd8fGE+PTkwMDEmJmE8PTkwMDJ8fGE+PTExOTA0JiZhPD0xMTkyOXx8YT49MTE5MzEmJmE8PTEyMDE5fHxhPj0xMjAzMiYmYTw9MTIyNDV8fGE+PTEyMjcyJiZhPD0xMjI4M3x8YT49MTIyODgmJmE8PTEyMzUwfHxhPj0xMjM1MyYmYTw9MTI0Mzh8fGE+PTEyNDQxJiZhPD0xMjU0M3x8YT49MTI1NDkmJmE8PTEyNTg5fHxhPj0xMjU5MyYmYTw9MTI2ODZ8fGE+PTEyNjg4JiZhPD0xMjczMHx8YT49MTI3MzYmJmE8PTEyNzcxfHxhPj0xMjc4NCYmYTw9MTI4MzB8fGE+PTEyODMyJiZhPD0xMjg3MXx8YT49MTI4ODAmJmE8PTEzMDU0fHxhPj0xMzA1NiYmYTw9MTk5MDN8fGE+PTE5OTY4JiZhPD00MjEyNHx8YT49NDIxMjgmJmE8PTQyMTgyfHxhPj00MzM2MCYmYTw9NDMzODh8fGE+PTQ0MDMyJiZhPD01NTIwM3x8YT49NTUyMTYmJmE8PTU1MjM4fHxhPj01NTI0MyYmYTw9NTUyOTF8fGE+PTYzNzQ0JiZhPD02NDI1NXx8YT49NjUwNDAmJmE8PTY1MDQ5fHxhPj02NTA3MiYmYTw9NjUxMDZ8fGE+PTY1MTA4JiZhPD02NTEyNnx8YT49NjUxMjgmJmE8PTY1MTMxfHxhPj02NTI4MSYmYTw9NjUzNzZ8fGE+PTY1NTA0JiZhPD02NTUxMH1kLmltcGxlbWVudCh0aGlzLGYpLHRoaXMuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oYSl7aWYodGhpcy5kb2MpdGhyb3cgbmV3IEVycm9yKCJEb2N1bWVudCBpcyBhbHJlYWR5IHNldCIpO3RoaXMuZG9jPWEsYS5vbigiY2hhbmdlIix0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcykpLHRoaXMub24oImNoYW5nZUZvbGQiLHRoaXMub25DaGFuZ2VGb2xkLmJpbmQodGhpcykpLHRoaXMuYmdUb2tlbml6ZXImJih0aGlzLmJnVG9rZW5pemVyLnNldERvY3VtZW50KHRoaXMuZ2V0RG9jdW1lbnQoKSksdGhpcy5iZ1Rva2VuaXplci5zdGFydCgwKSl9LHRoaXMuZ2V0RG9jdW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb2N9LHRoaXMuJHJlc2V0Um93Q2FjaGU9ZnVuY3Rpb24oYSl7aWYoYT09MCl7dGhpcy4kcm93Q2FjaGU9W107cmV0dXJufXZhciBiPXRoaXMuJHJvd0NhY2hlO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWlmKGJbY10uZG9jUm93Pj1hKXtiLnNwbGljZShjLGIubGVuZ3RoKTtyZXR1cm59fSx0aGlzLm9uQ2hhbmdlRm9sZD1mdW5jdGlvbihhKXt2YXIgYj1hLmRhdGE7dGhpcy4kcmVzZXRSb3dDYWNoZShiLnN0YXJ0LnJvdyl9LHRoaXMub25DaGFuZ2U9ZnVuY3Rpb24oYSl7dmFyIGI9YS5kYXRhO3RoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJHJlc2V0Um93Q2FjaGUoYi5yYW5nZS5zdGFydC5yb3cpO3ZhciBjPXRoaXMuJHVwZGF0ZUludGVybmFsRGF0YU9uQ2hhbmdlKGEpOyF0aGlzLiRmcm9tVW5kbyYmdGhpcy4kdW5kb01hbmFnZXImJiFiLmlnbm9yZSYmKHRoaXMuJGRlbHRhc0RvYy5wdXNoKGIpLGMmJmMubGVuZ3RoIT0wJiZ0aGlzLiRkZWx0YXNGb2xkLnB1c2goe2FjdGlvbjoicmVtb3ZlRm9sZHMiLGZvbGRzOmN9KSx0aGlzLiRpbmZvcm1VbmRvTWFuYWdlci5zY2hlZHVsZSgpKSx0aGlzLmJnVG9rZW5pemVyLnN0YXJ0KGIucmFuZ2Uuc3RhcnQucm93KSx0aGlzLl9lbWl0KCJjaGFuZ2UiLGEpfSx0aGlzLnNldFZhbHVlPWZ1bmN0aW9uKGEpe3RoaXMuZG9jLnNldFZhbHVlKGEpLHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JUbygwLDApLHRoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCksdGhpcy4kcmVzZXRSb3dDYWNoZSgwKSx0aGlzLiRkZWx0YXM9W10sdGhpcy4kZGVsdGFzRG9jPVtdLHRoaXMuJGRlbHRhc0ZvbGQ9W10sdGhpcy5nZXRVbmRvTWFuYWdlcigpLnJlc2V0KCl9LHRoaXMuZ2V0VmFsdWU9dGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvYy5nZXRWYWx1ZSgpfSx0aGlzLmdldFNlbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbn0sdGhpcy5nZXRTdGF0ZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5iZ1Rva2VuaXplci5nZXRTdGF0ZShhKX0sdGhpcy5nZXRUb2tlbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5iZ1Rva2VuaXplci5nZXRUb2tlbnMoYSxiKX0sdGhpcy5nZXRUb2tlbkF0PWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5iZ1Rva2VuaXplci5nZXRUb2tlbnMoYSxhKVswXS50b2tlbnMsZCxlPTA7aWYoYj09bnVsbClmPWMubGVuZ3RoLTEsZT10aGlzLmdldExpbmUoYSkubGVuZ3RoO2Vsc2UgZm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspe2UrPWNbZl0udmFsdWUubGVuZ3RoO2lmKGU+PWIpYnJlYWt9cmV0dXJuIGQ9Y1tmXSxkPyhkLmluZGV4PWYsZC5zdGFydD1lLWQudmFsdWUubGVuZ3RoLGQpOm51bGx9LHRoaXMuc2V0VW5kb01hbmFnZXI9ZnVuY3Rpb24oYSl7dGhpcy4kdW5kb01hbmFnZXI9YSx0aGlzLiRyZXNldFJvd0NhY2hlKDApLHRoaXMuJGRlbHRhcz1bXSx0aGlzLiRkZWx0YXNEb2M9W10sdGhpcy4kZGVsdGFzRm9sZD1bXSx0aGlzLiRpbmZvcm1VbmRvTWFuYWdlciYmdGhpcy4kaW5mb3JtVW5kb01hbmFnZXIuY2FuY2VsKCk7aWYoYSl7dmFyIGI9dGhpczt0aGlzLiRzeW5jSW5mb3JtVW5kb01hbmFnZXI9ZnVuY3Rpb24oKXtiLiRpbmZvcm1VbmRvTWFuYWdlci5jYW5jZWwoKSxiLiRkZWx0YXNGb2xkLmxlbmd0aCYmKGIuJGRlbHRhcy5wdXNoKHtncm91cDoiZm9sZCIsZGVsdGFzOmIuJGRlbHRhc0ZvbGR9KSxiLiRkZWx0YXNGb2xkPVtdKSxiLiRkZWx0YXNEb2MubGVuZ3RoJiYoYi4kZGVsdGFzLnB1c2goe2dyb3VwOiJkb2MiLGRlbHRhczpiLiRkZWx0YXNEb2N9KSxiLiRkZWx0YXNEb2M9W10pLGIuJGRlbHRhcy5sZW5ndGg+MCYmYS5leGVjdXRlKHthY3Rpb246ImFjZXVwZGF0ZSIsYXJnczpbYi4kZGVsdGFzLGJdfSksYi4kZGVsdGFzPVtdfSx0aGlzLiRpbmZvcm1VbmRvTWFuYWdlcj1lLmRlZmVycmVkQ2FsbCh0aGlzLiRzeW5jSW5mb3JtVW5kb01hbmFnZXIpfX0sdGhpcy4kZGVmYXVsdFVuZG9NYW5hZ2VyPXt1bmRvOmZ1bmN0aW9uKCl7fSxyZWRvOmZ1bmN0aW9uKCl7fSxyZXNldDpmdW5jdGlvbigpe319LHRoaXMuZ2V0VW5kb01hbmFnZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdW5kb01hbmFnZXJ8fHRoaXMuJGRlZmF1bHRVbmRvTWFuYWdlcn0sdGhpcy5nZXRUYWJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRVc2VTb2Z0VGFicygpP2Uuc3RyaW5nUmVwZWF0KCIgIix0aGlzLmdldFRhYlNpemUoKSk6Ilx0In0sdGhpcy4kdXNlU29mdFRhYnM9ITAsdGhpcy5zZXRVc2VTb2Z0VGFicz1mdW5jdGlvbihhKXtpZih0aGlzLiR1c2VTb2Z0VGFicz09PWEpcmV0dXJuO3RoaXMuJHVzZVNvZnRUYWJzPWF9LHRoaXMuZ2V0VXNlU29mdFRhYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdXNlU29mdFRhYnN9LHRoaXMuJHRhYlNpemU9NCx0aGlzLnNldFRhYlNpemU9ZnVuY3Rpb24oYSl7aWYoaXNOYU4oYSl8fHRoaXMuJHRhYlNpemU9PT1hKXJldHVybjt0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiR0YWJTaXplPWEsdGhpcy5fZW1pdCgiY2hhbmdlVGFiU2l6ZSIpfSx0aGlzLmdldFRhYlNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdGFiU2l6ZX0sdGhpcy5pc1RhYlN0b3A9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuJHVzZVNvZnRUYWJzJiZhLmNvbHVtbiV0aGlzLiR0YWJTaXplPT0wfSx0aGlzLiRvdmVyd3JpdGU9ITEsdGhpcy5zZXRPdmVyd3JpdGU9ZnVuY3Rpb24oYSl7aWYodGhpcy4kb3ZlcndyaXRlPT1hKXJldHVybjt0aGlzLiRvdmVyd3JpdGU9YSx0aGlzLl9lbWl0KCJjaGFuZ2VPdmVyd3JpdGUiKX0sdGhpcy5nZXRPdmVyd3JpdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kb3ZlcndyaXRlfSx0aGlzLnRvZ2dsZU92ZXJ3cml0ZT1mdW5jdGlvbigpe3RoaXMuc2V0T3ZlcndyaXRlKCF0aGlzLiRvdmVyd3JpdGUpfSx0aGlzLmdldEJyZWFrcG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGJyZWFrcG9pbnRzfSx0aGlzLnNldEJyZWFrcG9pbnRzPWZ1bmN0aW9uKGEpe3RoaXMuJGJyZWFrcG9pbnRzPVtdO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXRoaXMuJGJyZWFrcG9pbnRzW2FbYl1dPSEwO3RoaXMuX2VtaXQoImNoYW5nZUJyZWFrcG9pbnQiLHt9KX0sdGhpcy5jbGVhckJyZWFrcG9pbnRzPWZ1bmN0aW9uKCl7dGhpcy4kYnJlYWtwb2ludHM9W10sdGhpcy5fZW1pdCgiY2hhbmdlQnJlYWtwb2ludCIse30pfSx0aGlzLnNldEJyZWFrcG9pbnQ9ZnVuY3Rpb24oYSl7dGhpcy4kYnJlYWtwb2ludHNbYV09ITAsdGhpcy5fZW1pdCgiY2hhbmdlQnJlYWtwb2ludCIse30pfSx0aGlzLmNsZWFyQnJlYWtwb2ludD1mdW5jdGlvbihhKXtkZWxldGUgdGhpcy4kYnJlYWtwb2ludHNbYV0sdGhpcy5fZW1pdCgiY2hhbmdlQnJlYWtwb2ludCIse30pfSx0aGlzLmdldEJyZWFrcG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGJyZWFrcG9pbnRzfSx0aGlzLmFkZE1hcmtlcj1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLiRtYXJrZXJJZCsrLGY9e3JhbmdlOmEsdHlwZTpjfHwibGluZSIscmVuZGVyZXI6dHlwZW9mIGM9PSJmdW5jdGlvbiI/YzpudWxsLGNsYXp6OmIsaW5Gcm9udDohIWR9O3JldHVybiBkPyh0aGlzLiRmcm9udE1hcmtlcnNbZV09Zix0aGlzLl9lbWl0KCJjaGFuZ2VGcm9udE1hcmtlciIpKToodGhpcy4kYmFja01hcmtlcnNbZV09Zix0aGlzLl9lbWl0KCJjaGFuZ2VCYWNrTWFya2VyIikpLGV9LHRoaXMucmVtb3ZlTWFya2VyPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuJGZyb250TWFya2Vyc1thXXx8dGhpcy4kYmFja01hcmtlcnNbYV07aWYoIWIpcmV0dXJuO3ZhciBjPWIuaW5Gcm9udD90aGlzLiRmcm9udE1hcmtlcnM6dGhpcy4kYmFja01hcmtlcnM7YiYmKGRlbGV0ZSBjW2FdLHRoaXMuX2VtaXQoYi5pbkZyb250PyJjaGFuZ2VGcm9udE1hcmtlciI6ImNoYW5nZUJhY2tNYXJrZXIiKSl9LHRoaXMuZ2V0TWFya2Vycz1mdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLiRmcm9udE1hcmtlcnM6dGhpcy4kYmFja01hcmtlcnN9LHRoaXMuc2V0QW5ub3RhdGlvbnM9ZnVuY3Rpb24oYSl7dGhpcy4kYW5ub3RhdGlvbnM9e307Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBjPWFbYl0sZD1jLnJvdzt0aGlzLiRhbm5vdGF0aW9uc1tkXT90aGlzLiRhbm5vdGF0aW9uc1tkXS5wdXNoKGMpOnRoaXMuJGFubm90YXRpb25zW2RdPVtjXX10aGlzLl9lbWl0KCJjaGFuZ2VBbm5vdGF0aW9uIix7fSl9LHRoaXMuZ2V0QW5ub3RhdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYW5ub3RhdGlvbnN8fHt9fSx0aGlzLmNsZWFyQW5ub3RhdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLiRhbm5vdGF0aW9ucz17fSx0aGlzLl9lbWl0KCJjaGFuZ2VBbm5vdGF0aW9uIix7fSl9LHRoaXMuJGRldGVjdE5ld0xpbmU9ZnVuY3Rpb24oYSl7dmFyIGI9YS5tYXRjaCgvXi4qPyhccj9cbikvbSk7Yj90aGlzLiRhdXRvTmV3TGluZT1iWzFdOnRoaXMuJGF1dG9OZXdMaW5lPSJcbiJ9LHRoaXMuZ2V0V29yZFJhbmdlPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5nZXRMaW5lKGEpLGQ9ITE7Yj4wJiYoZD0hIWMuY2hhckF0KGItMSkubWF0Y2godGhpcy50b2tlblJlKSksZHx8KGQ9ISFjLmNoYXJBdChiKS5tYXRjaCh0aGlzLnRva2VuUmUpKTt2YXIgZT1kP3RoaXMudG9rZW5SZTp0aGlzLm5vblRva2VuUmUsZj1iO2lmKGY+MCl7ZG8gZi0tO3doaWxlKGY+PTAmJmMuY2hhckF0KGYpLm1hdGNoKGUpKTtmKyt9dmFyIGc9Yjt3aGlsZShnPGMubGVuZ3RoJiZjLmNoYXJBdChnKS5tYXRjaChlKSlnKys7cmV0dXJuIG5ldyBpKGEsZixhLGcpfSx0aGlzLmdldEFXb3JkUmFuZ2U9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmdldFdvcmRSYW5nZShhLGIpLGQ9dGhpcy5nZXRMaW5lKGMuZW5kLnJvdyk7d2hpbGUoZC5jaGFyQXQoYy5lbmQuY29sdW1uKS5tYXRjaCgvWyBcdF0vKSljLmVuZC5jb2x1bW4rPTE7cmV0dXJuIGN9LHRoaXMuc2V0TmV3TGluZU1vZGU9ZnVuY3Rpb24oYSl7dGhpcy5kb2Muc2V0TmV3TGluZU1vZGUoYSl9LHRoaXMuZ2V0TmV3TGluZU1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb2MuZ2V0TmV3TGluZU1vZGUoKX0sdGhpcy4kdXNlV29ya2VyPSEwLHRoaXMuc2V0VXNlV29ya2VyPWZ1bmN0aW9uKGEpe2lmKHRoaXMuJHVzZVdvcmtlcj09YSlyZXR1cm47dGhpcy4kdXNlV29ya2VyPWEsdGhpcy4kc3RvcFdvcmtlcigpLGEmJnRoaXMuJHN0YXJ0V29ya2VyKCl9LHRoaXMuZ2V0VXNlV29ya2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHVzZVdvcmtlcn0sdGhpcy5vblJlbG9hZFRva2VuaXplcj1mdW5jdGlvbihhKXt2YXIgYj1hLmRhdGE7dGhpcy5iZ1Rva2VuaXplci5zdGFydChiLmZpcnN0KSx0aGlzLl9lbWl0KCJ0b2tlbml6ZXJVcGRhdGUiLGEpfSx0aGlzLiRtb2RlPW51bGwsdGhpcy5zZXRNb2RlPWZ1bmN0aW9uKGEpe2lmKHRoaXMuJG1vZGU9PT1hKXJldHVybjt0aGlzLiRtb2RlPWEsdGhpcy4kc3RvcFdvcmtlcigpLHRoaXMuJHVzZVdvcmtlciYmdGhpcy4kc3RhcnRXb3JrZXIoKTt2YXIgYj1hLmdldFRva2VuaXplcigpO2lmKGIuYWRkRXZlbnRMaXN0ZW5lciE9PXVuZGVmaW5lZCl7dmFyIGM9dGhpcy5vblJlbG9hZFRva2VuaXplci5iaW5kKHRoaXMpO2IuYWRkRXZlbnRMaXN0ZW5lcigidXBkYXRlIixjKX1pZighdGhpcy5iZ1Rva2VuaXplcil7dGhpcy5iZ1Rva2VuaXplcj1uZXcgayhiKTt2YXIgZD10aGlzO3RoaXMuYmdUb2tlbml6ZXIuYWRkRXZlbnRMaXN0ZW5lcigidXBkYXRlIixmdW5jdGlvbihhKXtkLl9lbWl0KCJ0b2tlbml6ZXJVcGRhdGUiLGEpfSl9ZWxzZSB0aGlzLmJnVG9rZW5pemVyLnNldFRva2VuaXplcihiKTt0aGlzLmJnVG9rZW5pemVyLnNldERvY3VtZW50KHRoaXMuZ2V0RG9jdW1lbnQoKSksdGhpcy5iZ1Rva2VuaXplci5zdGFydCgwKSx0aGlzLnRva2VuUmU9YS50b2tlblJlLHRoaXMubm9uVG9rZW5SZT1hLm5vblRva2VuUmUsdGhpcy4kc2V0Rm9sZGluZyhhLmZvbGRpbmdSdWxlcyksdGhpcy5fZW1pdCgiY2hhbmdlTW9kZSIpfSx0aGlzLiRzdG9wV29ya2VyPWZ1bmN0aW9uKCl7dGhpcy4kd29ya2VyJiZ0aGlzLiR3b3JrZXIudGVybWluYXRlKCksdGhpcy4kd29ya2VyPW51bGx9LHRoaXMuJHN0YXJ0V29ya2VyPWZ1bmN0aW9uKCl7aWYodHlwZW9mIFdvcmtlciE9InVuZGVmaW5lZCImJiFhLm5vV29ya2VyKXRyeXt0aGlzLiR3b3JrZXI9dGhpcy4kbW9kZS5jcmVhdGVXb3JrZXIodGhpcyl9Y2F0Y2goYil7Y29uc29sZS5sb2coIkNvdWxkIG5vdCBsb2FkIHdvcmtlciIpLGNvbnNvbGUubG9nKGIpLHRoaXMuJHdvcmtlcj1udWxsfWVsc2UgdGhpcy4kd29ya2VyPW51bGx9LHRoaXMuZ2V0TW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRtb2RlfSx0aGlzLiRzY3JvbGxUb3A9MCx0aGlzLnNldFNjcm9sbFRvcD1mdW5jdGlvbihhKXthPU1hdGgucm91bmQoTWF0aC5tYXgoMCxhKSk7aWYodGhpcy4kc2Nyb2xsVG9wPT09YSlyZXR1cm47dGhpcy4kc2Nyb2xsVG9wPWEsdGhpcy5fZW1pdCgiY2hhbmdlU2Nyb2xsVG9wIixhKX0sdGhpcy5nZXRTY3JvbGxUb3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2Nyb2xsVG9wfSx0aGlzLiRzY3JvbGxMZWZ0PTAsdGhpcy5zZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChNYXRoLm1heCgwLGEpKTtpZih0aGlzLiRzY3JvbGxMZWZ0PT09YSlyZXR1cm47dGhpcy4kc2Nyb2xsTGVmdD1hLHRoaXMuX2VtaXQoImNoYW5nZVNjcm9sbExlZnQiLGEpfSx0aGlzLmdldFNjcm9sbExlZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2Nyb2xsTGVmdH0sdGhpcy5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRjb21wdXRlV2lkdGgoKSx0aGlzLndpZHRofSx0aGlzLmdldFNjcmVlbldpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGNvbXB1dGVXaWR0aCgpLHRoaXMuc2NyZWVuV2lkdGh9LHRoaXMuJGNvbXB1dGVXaWR0aD1mdW5jdGlvbihhKXtpZih0aGlzLiRtb2RpZmllZHx8YSl7dGhpcy4kbW9kaWZpZWQ9ITE7dmFyIGI9dGhpcy5kb2MuZ2V0QWxsTGluZXMoKSxjPTAsZD0wO2Zvcih2YXIgZT0wO2U8Yi5sZW5ndGg7ZSsrKXt2YXIgZj10aGlzLmdldEZvbGRMaW5lKGUpLGcsaDtnPWJbZV07aWYoZil7dmFyIGk9Zi5yYW5nZS5lbmQ7Zz10aGlzLmdldEZvbGREaXNwbGF5TGluZShmKSxlPWkucm93fWg9Zy5sZW5ndGgsYz1NYXRoLm1heChjLGgpLHRoaXMuJHVzZVdyYXBNb2RlfHwoZD1NYXRoLm1heChkLHRoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoKGcpWzBdKSl9dGhpcy53aWR0aD1jLHRoaXMuJHVzZVdyYXBNb2RlP3RoaXMuc2NyZWVuV2lkdGg9dGhpcy4kd3JhcExpbWl0OnRoaXMuc2NyZWVuV2lkdGg9ZH19LHRoaXMuZ2V0TGluZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kb2MuZ2V0TGluZShhKX0sdGhpcy5nZXRMaW5lcz1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmRvYy5nZXRMaW5lcyhhLGIpfSx0aGlzLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvYy5nZXRMZW5ndGgoKX0sdGhpcy5nZXRUZXh0UmFuZ2U9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZG9jLmdldFRleHRSYW5nZShhKX0sdGhpcy5pbnNlcnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5kb2MuaW5zZXJ0KGEsYil9LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRvYy5yZW1vdmUoYSl9LHRoaXMudW5kb0NoYW5nZXM9ZnVuY3Rpb24oYSxiKXtpZighYS5sZW5ndGgpcmV0dXJuO3RoaXMuJGZyb21VbmRvPSEwO3ZhciBjPW51bGw7Zm9yKHZhciBkPWEubGVuZ3RoLTE7ZCE9LTE7ZC0tKXt2YXIgZT1hW2RdO2UuZ3JvdXA9PSJkb2MiPyh0aGlzLmRvYy5yZXZlcnREZWx0YXMoZS5kZWx0YXMpLGM9dGhpcy4kZ2V0VW5kb1NlbGVjdGlvbihlLmRlbHRhcywhMCxjKSk6ZS5kZWx0YXMuZm9yRWFjaChmdW5jdGlvbihhKXt0aGlzLmFkZEZvbGRzKGEuZm9sZHMpfSx0aGlzKX1yZXR1cm4gdGhpcy4kZnJvbVVuZG89ITEsYyYmdGhpcy4kdW5kb1NlbGVjdCYmIWImJnRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGMpLGN9LHRoaXMucmVkb0NoYW5nZXM9ZnVuY3Rpb24oYSxiKXtpZighYS5sZW5ndGgpcmV0dXJuO3RoaXMuJGZyb21VbmRvPSEwO3ZhciBjPW51bGw7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspe3ZhciBlPWFbZF07ZS5ncm91cD09ImRvYyImJih0aGlzLmRvYy5hcHBseURlbHRhcyhlLmRlbHRhcyksYz10aGlzLiRnZXRVbmRvU2VsZWN0aW9uKGUuZGVsdGFzLCExLGMpKX1yZXR1cm4gdGhpcy4kZnJvbVVuZG89ITEsYyYmdGhpcy4kdW5kb1NlbGVjdCYmIWImJnRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGMpLGN9LHRoaXMuc2V0VW5kb1NlbGVjdD1mdW5jdGlvbihhKXt0aGlzLiR1bmRvU2VsZWN0PWF9LHRoaXMuJGdldFVuZG9TZWxlY3Rpb249ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dmFyIGM9YS5hY3Rpb249PSJpbnNlcnRUZXh0Inx8YS5hY3Rpb249PSJpbnNlcnRMaW5lcyI7cmV0dXJuIGI/IWM6Y312YXIgZT1hWzBdLGYsZyxoPSExO2QoZSk/KGY9ZS5yYW5nZS5jbG9uZSgpLGg9ITApOihmPWkuZnJvbVBvaW50cyhlLnJhbmdlLnN0YXJ0LGUucmFuZ2Uuc3RhcnQpLGg9ITEpO2Zvcih2YXIgaj0xO2o8YS5sZW5ndGg7aisrKWU9YVtqXSxkKGUpPyhnPWUucmFuZ2Uuc3RhcnQsZi5jb21wYXJlKGcucm93LGcuY29sdW1uKT09LTEmJmYuc2V0U3RhcnQoZS5yYW5nZS5zdGFydCksZz1lLnJhbmdlLmVuZCxmLmNvbXBhcmUoZy5yb3csZy5jb2x1bW4pPT0xJiZmLnNldEVuZChlLnJhbmdlLmVuZCksaD0hMCk6KGc9ZS5yYW5nZS5zdGFydCxmLmNvbXBhcmUoZy5yb3csZy5jb2x1bW4pPT0tMSYmKGY9aS5mcm9tUG9pbnRzKGUucmFuZ2Uuc3RhcnQsZS5yYW5nZS5zdGFydCkpLGg9ITEpO2lmKGMhPW51bGwpe3ZhciBrPWMuY29tcGFyZVJhbmdlKGYpO2s9PTE/Zi5zZXRTdGFydChjLnN0YXJ0KTprPT0tMSYmZi5zZXRFbmQoYy5lbmQpfXJldHVybiBmfSx0aGlzLnJlcGxhY2U9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5kb2MucmVwbGFjZShhLGIpfSx0aGlzLm1vdmVUZXh0PWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5nZXRUZXh0UmFuZ2UoYSk7dGhpcy5yZW1vdmUoYSk7dmFyIGQ9Yi5yb3csZT1iLmNvbHVtbjshYS5pc011bHRpTGluZSgpJiZhLnN0YXJ0LnJvdz09ZCYmYS5lbmQuY29sdW1uPGUmJihlLT1jLmxlbmd0aCk7aWYoYS5pc011bHRpTGluZSgpJiZhLmVuZC5yb3c8ZCl7dmFyIGY9dGhpcy5kb2MuJHNwbGl0KGMpO2QtPWYubGVuZ3RoLTF9dmFyIGc9ZCthLmVuZC5yb3ctYS5zdGFydC5yb3csaD1hLmlzTXVsdGlMaW5lKCk/YS5lbmQuY29sdW1uOmUrYS5lbmQuY29sdW1uLWEuc3RhcnQuY29sdW1uLGo9bmV3IGkoZCxlLGcsaCk7cmV0dXJuIHRoaXMuaW5zZXJ0KGouc3RhcnQsYyksan0sdGhpcy5pbmRlbnRSb3dzPWZ1bmN0aW9uKGEsYixjKXtjPWMucmVwbGFjZSgvXHQvZyx0aGlzLmdldFRhYlN0cmluZygpKTtmb3IodmFyIGQ9YTtkPD1iO2QrKyl0aGlzLmluc2VydCh7cm93OmQsY29sdW1uOjB9LGMpfSx0aGlzLm91dGRlbnRSb3dzPWZ1bmN0aW9uKGEpe3ZhciBiPWEuY29sbGFwc2VSb3dzKCksYz1uZXcgaSgwLDAsMCwwKSxkPXRoaXMuZ2V0VGFiU2l6ZSgpO2Zvcih2YXIgZT1iLnN0YXJ0LnJvdztlPD1iLmVuZC5yb3c7KytlKXt2YXIgZj10aGlzLmdldExpbmUoZSk7Yy5zdGFydC5yb3c9ZSxjLmVuZC5yb3c9ZTtmb3IodmFyIGc9MDtnPGQ7KytnKWlmKGYuY2hhckF0KGcpIT0iICIpYnJlYWs7ZzxkJiZmLmNoYXJBdChnKT09Ilx0Ij8oYy5zdGFydC5jb2x1bW49ZyxjLmVuZC5jb2x1bW49ZysxKTooYy5zdGFydC5jb2x1bW49MCxjLmVuZC5jb2x1bW49ZyksdGhpcy5yZW1vdmUoYyl9fSx0aGlzLm1vdmVMaW5lc1VwPWZ1bmN0aW9uKGEsYil7aWYoYTw9MClyZXR1cm4gMDt2YXIgYz10aGlzLmRvYy5yZW1vdmVMaW5lcyhhLGIpO3JldHVybiB0aGlzLmRvYy5pbnNlcnRMaW5lcyhhLTEsYyksLTF9LHRoaXMubW92ZUxpbmVzRG93bj1mdW5jdGlvbihhLGIpe2lmKGI+PXRoaXMuZG9jLmdldExlbmd0aCgpLTEpcmV0dXJuIDA7dmFyIGM9dGhpcy5kb2MucmVtb3ZlTGluZXMoYSxiKTtyZXR1cm4gdGhpcy5kb2MuaW5zZXJ0TGluZXMoYSsxLGMpLDF9LHRoaXMuZHVwbGljYXRlTGluZXM9ZnVuY3Rpb24oYSxiKXt2YXIgYT10aGlzLiRjbGlwUm93VG9Eb2N1bWVudChhKSxiPXRoaXMuJGNsaXBSb3dUb0RvY3VtZW50KGIpLGM9dGhpcy5nZXRMaW5lcyhhLGIpO3RoaXMuZG9jLmluc2VydExpbmVzKGEsYyk7dmFyIGQ9Yi1hKzE7cmV0dXJuIGR9LHRoaXMuJGNsaXBSb3dUb0RvY3VtZW50PWZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKGEsdGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSkpfSx0aGlzLiRjbGlwQ29sdW1uVG9Sb3c9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYjwwPzA6TWF0aC5taW4odGhpcy5kb2MuZ2V0TGluZShhKS5sZW5ndGgsYil9LHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQ9ZnVuY3Rpb24oYSxiKXtiPU1hdGgubWF4KDAsYik7aWYoYTwwKWE9MCxiPTA7ZWxzZXt2YXIgYz10aGlzLmRvYy5nZXRMZW5ndGgoKTthPj1jPyhhPWMtMSxiPXRoaXMuZG9jLmdldExpbmUoYy0xKS5sZW5ndGgpOmI9TWF0aC5taW4odGhpcy5kb2MuZ2V0TGluZShhKS5sZW5ndGgsYil9cmV0dXJue3JvdzphLGNvbHVtbjpifX0sdGhpcy4kY2xpcFJhbmdlVG9Eb2N1bWVudD1mdW5jdGlvbihhKXthLnN0YXJ0LnJvdzwwPyhhLnN0YXJ0LnJvdz0wLGEuc3RhcnQuY29sdW1uPTApOmEuc3RhcnQuY29sdW1uPXRoaXMuJGNsaXBDb2x1bW5Ub1JvdyhhLnN0YXJ0LnJvdyxhLnN0YXJ0LmNvbHVtbik7dmFyIGI9dGhpcy5kb2MuZ2V0TGVuZ3RoKCktMTtyZXR1cm4gYS5lbmQucm93PmI/KGEuZW5kLnJvdz1iLGEuZW5kLmNvbHVtbj10aGlzLmRvYy5nZXRMaW5lKGIpLmxlbmd0aCk6YS5lbmQuY29sdW1uPXRoaXMuJGNsaXBDb2x1bW5Ub1JvdyhhLmVuZC5yb3csYS5lbmQuY29sdW1uKSxhfSx0aGlzLiR3cmFwTGltaXQ9ODAsdGhpcy4kdXNlV3JhcE1vZGU9ITEsdGhpcy4kd3JhcExpbWl0UmFuZ2U9e21pbjpudWxsLG1heDpudWxsfSx0aGlzLnNldFVzZVdyYXBNb2RlPWZ1bmN0aW9uKGEpe2lmKGEhPXRoaXMuJHVzZVdyYXBNb2RlKXt0aGlzLiR1c2VXcmFwTW9kZT1hLHRoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJHJlc2V0Um93Q2FjaGUoMCk7aWYoYSl7dmFyIGI9dGhpcy5nZXRMZW5ndGgoKTt0aGlzLiR3cmFwRGF0YT1bXTtmb3IodmFyIGM9MDtjPGI7YysrKXRoaXMuJHdyYXBEYXRhLnB1c2goW10pO3RoaXMuJHVwZGF0ZVdyYXBEYXRhKDAsYi0xKX10aGlzLl9lbWl0KCJjaGFuZ2VXcmFwTW9kZSIpfX0sdGhpcy5nZXRVc2VXcmFwTW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR1c2VXcmFwTW9kZX0sdGhpcy5zZXRXcmFwTGltaXRSYW5nZT1mdW5jdGlvbihhLGIpe2lmKHRoaXMuJHdyYXBMaW1pdFJhbmdlLm1pbiE9PWF8fHRoaXMuJHdyYXBMaW1pdFJhbmdlLm1heCE9PWIpdGhpcy4kd3JhcExpbWl0UmFuZ2UubWluPWEsdGhpcy4kd3JhcExpbWl0UmFuZ2UubWF4PWIsdGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy5fZW1pdCgiY2hhbmdlV3JhcE1vZGUiKX0sdGhpcy5hZGp1c3RXcmFwTGltaXQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kY29uc3RyYWluV3JhcExpbWl0KGEpO3JldHVybiBiIT10aGlzLiR3cmFwTGltaXQmJmI+MD8odGhpcy4kd3JhcExpbWl0PWIsdGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kdXNlV3JhcE1vZGUmJih0aGlzLiR1cGRhdGVXcmFwRGF0YSgwLHRoaXMuZ2V0TGVuZ3RoKCktMSksdGhpcy4kcmVzZXRSb3dDYWNoZSgwKSx0aGlzLl9lbWl0KCJjaGFuZ2VXcmFwTGltaXQiKSksITApOiExfSx0aGlzLiRjb25zdHJhaW5XcmFwTGltaXQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kd3JhcExpbWl0UmFuZ2UubWluO2ImJihhPU1hdGgubWF4KGIsYSkpO3ZhciBjPXRoaXMuJHdyYXBMaW1pdFJhbmdlLm1heDtyZXR1cm4gYyYmKGE9TWF0aC5taW4oYyxhKSksTWF0aC5tYXgoMSxhKX0sdGhpcy5nZXRXcmFwTGltaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kd3JhcExpbWl0fSx0aGlzLmdldFdyYXBMaW1pdFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJue21pbjp0aGlzLiR3cmFwTGltaXRSYW5nZS5taW4sbWF4OnRoaXMuJHdyYXBMaW1pdFJhbmdlLm1heH19LHRoaXMuJHVwZGF0ZUludGVybmFsRGF0YU9uQ2hhbmdlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuJHVzZVdyYXBNb2RlLGMsZD1hLmRhdGEuYWN0aW9uLGU9YS5kYXRhLnJhbmdlLnN0YXJ0LnJvdyxmPWEuZGF0YS5yYW5nZS5lbmQucm93LGc9YS5kYXRhLnJhbmdlLnN0YXJ0LGg9YS5kYXRhLnJhbmdlLmVuZCxpPW51bGw7ZC5pbmRleE9mKCJMaW5lcyIpIT0tMT8oZD09Imluc2VydExpbmVzIj9mPWUrYS5kYXRhLmxpbmVzLmxlbmd0aDpmPWUsYz1hLmRhdGEubGluZXM/YS5kYXRhLmxpbmVzLmxlbmd0aDpmLWUpOmM9Zi1lO2lmKGMhPTApaWYoZC5pbmRleE9mKCJyZW1vdmUiKSE9LTEpe2ImJnRoaXMuJHdyYXBEYXRhLnNwbGljZShlLGMpO3ZhciBqPXRoaXMuJGZvbGREYXRhO2k9dGhpcy5nZXRGb2xkc0luUmFuZ2UoYS5kYXRhLnJhbmdlKSx0aGlzLnJlbW92ZUZvbGRzKGkpO3ZhciBrPXRoaXMuZ2V0Rm9sZExpbmUoaC5yb3cpLGw9MDtpZihrKXtrLmFkZFJlbW92ZUNoYXJzKGgucm93LGguY29sdW1uLGcuY29sdW1uLWguY29sdW1uKSxrLnNoaWZ0Um93KC1jKTt2YXIgbT10aGlzLmdldEZvbGRMaW5lKGUpO20mJm0hPT1rJiYobS5tZXJnZShrKSxrPW0pLGw9ai5pbmRleE9mKGspKzF9Zm9yKGw7bDxqLmxlbmd0aDtsKyspe3ZhciBrPWpbbF07ay5zdGFydC5yb3c+PWgucm93JiZrLnNoaWZ0Um93KC1jKX1mPWV9ZWxzZXt2YXIgbjtpZihiKXtuPVtlLDBdO2Zvcih2YXIgbz0wO288YztvKyspbi5wdXNoKFtdKTt0aGlzLiR3cmFwRGF0YS5zcGxpY2UuYXBwbHkodGhpcy4kd3JhcERhdGEsbil9dmFyIGo9dGhpcy4kZm9sZERhdGEsaz10aGlzLmdldEZvbGRMaW5lKGUpLGw9MDtpZihrKXt2YXIgcD1rLnJhbmdlLmNvbXBhcmVJbnNpZGUoZy5yb3csZy5jb2x1bW4pO3A9PTA/KGs9ay5zcGxpdChnLnJvdyxnLmNvbHVtbiksay5zaGlmdFJvdyhjKSxrLmFkZFJlbW92ZUNoYXJzKGYsMCxoLmNvbHVtbi1nLmNvbHVtbikpOnA9PS0xJiYoay5hZGRSZW1vdmVDaGFycyhlLDAsaC5jb2x1bW4tZy5jb2x1bW4pLGsuc2hpZnRSb3coYykpLGw9ai5pbmRleE9mKGspKzF9Zm9yKGw7bDxqLmxlbmd0aDtsKyspe3ZhciBrPWpbbF07ay5zdGFydC5yb3c+PWUmJmsuc2hpZnRSb3coYyl9fWVsc2V7Yz1NYXRoLmFicyhhLmRhdGEucmFuZ2Uuc3RhcnQuY29sdW1uLWEuZGF0YS5yYW5nZS5lbmQuY29sdW1uKSxkLmluZGV4T2YoInJlbW92ZSIpIT0tMSYmKGk9dGhpcy5nZXRGb2xkc0luUmFuZ2UoYS5kYXRhLnJhbmdlKSx0aGlzLnJlbW92ZUZvbGRzKGkpLGM9LWMpO3ZhciBrPXRoaXMuZ2V0Rm9sZExpbmUoZSk7ayYmay5hZGRSZW1vdmVDaGFycyhlLGcuY29sdW1uLGMpfXJldHVybiBiJiZ0aGlzLiR3cmFwRGF0YS5sZW5ndGghPXRoaXMuZG9jLmdldExlbmd0aCgpJiZjb25zb2xlLmVycm9yKCJkb2MuZ2V0TGVuZ3RoKCkgYW5kICR3cmFwRGF0YS5sZW5ndGggaGF2ZSB0byBiZSB0aGUgc2FtZSEiKSxiJiZ0aGlzLiR1cGRhdGVXcmFwRGF0YShlLGYpLGl9LHRoaXMuJHVwZGF0ZVdyYXBEYXRhPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5kb2MuZ2V0QWxsTGluZXMoKSxkPXRoaXMuZ2V0VGFiU2l6ZSgpLGY9dGhpcy4kd3JhcERhdGEsaT10aGlzLiR3cmFwTGltaXQsaixrLG09YTtiPU1hdGgubWluKGIsYy5sZW5ndGgtMSk7d2hpbGUobTw9Yil7az10aGlzLmdldEZvbGRMaW5lKG0sayk7aWYoIWspaj10aGlzLiRnZXREaXNwbGF5VG9rZW5zKGUuc3RyaW5nVHJpbVJpZ2h0KGNbbV0pKSxmW21dPXRoaXMuJGNvbXB1dGVXcmFwU3BsaXRzKGosaSxkKSxtKys7ZWxzZXtqPVtdLGsud2FsayhmdW5jdGlvbihhLGIsZCxlKXt2YXIgZjtpZihhKXtmPXRoaXMuJGdldERpc3BsYXlUb2tlbnMoYSxqLmxlbmd0aCksZlswXT1nO2Zvcih2YXIgaT0xO2k8Zi5sZW5ndGg7aSsrKWZbaV09aH1lbHNlIGY9dGhpcy4kZ2V0RGlzcGxheVRva2VucyhjW2JdLnN1YnN0cmluZyhlLGQpLGoubGVuZ3RoKTtqPWouY29uY2F0KGYpfS5iaW5kKHRoaXMpLGsuZW5kLnJvdyxjW2suZW5kLnJvd10ubGVuZ3RoKzEpO3doaWxlKGoubGVuZ3RoIT0wJiZqW2oubGVuZ3RoLTFdPj1sKWoucG9wKCk7ZltrLnN0YXJ0LnJvd109dGhpcy4kY29tcHV0ZVdyYXBTcGxpdHMoaixpLGQpLG09ay5lbmQucm93KzF9fX07dmFyIGI9MSxjPTIsZz0zLGg9NCxqPTksbD0xMCxtPTExLG49MTI7dGhpcy4kY29tcHV0ZVdyYXBTcGxpdHM9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBpKGIpe3ZhciBkPWEuc2xpY2UoZSxiKSxnPWQubGVuZ3RoO2Quam9pbigiIikucmVwbGFjZSgvMTIvZyxmdW5jdGlvbigpe2ctPTF9KS5yZXBsYWNlKC8yL2csZnVuY3Rpb24oKXtnLT0xfSksZis9ZyxjLnB1c2goZiksZT1ifWlmKGEubGVuZ3RoPT0wKXJldHVybltdO3ZhciBjPVtdLGQ9YS5sZW5ndGgsZT0wLGY9MDt3aGlsZShkLWU+Yil7dmFyIGs9ZStiO2lmKGFba10+PWwpe3doaWxlKGFba10+PWwpaysrO2koayk7Y29udGludWV9aWYoYVtrXT09Z3x8YVtrXT09aCl7Zm9yKGs7ayE9ZS0xO2stLSlpZihhW2tdPT1nKWJyZWFrO2lmKGs+ZSl7aShrKTtjb250aW51ZX1rPWUrYjtmb3IoaztrPGEubGVuZ3RoO2srKylpZihhW2tdIT1oKWJyZWFrO2lmKGs9PWEubGVuZ3RoKWJyZWFrO2koayk7Y29udGludWV9dmFyIG09TWF0aC5tYXgoay0xMCxlLTEpO3doaWxlKGs+bSYmYVtrXTxnKWstLTt3aGlsZShrPm0mJmFba109PWopay0tO2lmKGs+bSl7aSgrK2spO2NvbnRpbnVlfWs9ZStiLGkoayl9cmV0dXJuIGN9LHRoaXMuJGdldERpc3BsYXlUb2tlbnM9ZnVuY3Rpb24oYSxkKXt2YXIgZT1bXSxmO2Q9ZHx8MDtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl7dmFyIGg9YS5jaGFyQ29kZUF0KGcpO2lmKGg9PTkpe2Y9dGhpcy5nZXRTY3JlZW5UYWJTaXplKGUubGVuZ3RoK2QpLGUucHVzaChtKTtmb3IodmFyIGk9MTtpPGY7aSsrKWUucHVzaChuKX1lbHNlIGg9PTMyP2UucHVzaChsKTpoPjM5JiZoPDQ4fHxoPjU3JiZoPDY0P2UucHVzaChqKTpoPj00MzUyJiZvKGgpP2UucHVzaChiLGMpOmUucHVzaChiKX1yZXR1cm4gZX0sdGhpcy4kZ2V0U3RyaW5nU2NyZWVuV2lkdGg9ZnVuY3Rpb24oYSxiLGMpe2lmKGI9PTApcmV0dXJuWzAsMF07Yj09bnVsbCYmKGI9YythLmxlbmd0aCpNYXRoLm1heCh0aGlzLmdldFRhYlNpemUoKSwyKSksYz1jfHwwO3ZhciBkLGU7Zm9yKGU9MDtlPGEubGVuZ3RoO2UrKyl7ZD1hLmNoYXJDb2RlQXQoZSksZD09OT9jKz10aGlzLmdldFNjcmVlblRhYlNpemUoYyk6ZD49NDM1MiYmbyhkKT9jKz0yOmMrPTE7aWYoYz5iKWJyZWFrfXJldHVybltjLGVdfSx0aGlzLmdldFJvd0xlbmd0aD1mdW5jdGlvbihhKXtyZXR1cm4hdGhpcy4kdXNlV3JhcE1vZGV8fCF0aGlzLiR3cmFwRGF0YVthXT8xOnRoaXMuJHdyYXBEYXRhW2FdLmxlbmd0aCsxfSx0aGlzLmdldFJvd0hlaWdodD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmdldFJvd0xlbmd0aChiKSphLmxpbmVIZWlnaHR9LHRoaXMuZ2V0U2NyZWVuTGFzdFJvd0NvbHVtbj1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kb2N1bWVudFRvU2NyZWVuQ29sdW1uKGEsdGhpcy5kb2MuZ2V0TGluZShhKS5sZW5ndGgpfSx0aGlzLmdldERvY3VtZW50TGFzdFJvd0NvbHVtbj1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZG9jdW1lbnRUb1NjcmVlblJvdyhhLGIpO3JldHVybiB0aGlzLmdldFNjcmVlbkxhc3RSb3dDb2x1bW4oYyl9LHRoaXMuZ2V0RG9jdW1lbnRMYXN0Um93Q29sdW1uUG9zaXRpb249ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmRvY3VtZW50VG9TY3JlZW5Sb3coYSxiKTtyZXR1cm4gdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oYyxOdW1iZXIuTUFYX1ZBTFVFLzEwKX0sdGhpcy5nZXRSb3dTcGxpdERhdGE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuJHVzZVdyYXBNb2RlP3RoaXMuJHdyYXBEYXRhW2FdOnVuZGVmaW5lZH0sdGhpcy5nZXRTY3JlZW5UYWJTaXplPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLiR0YWJTaXplLWEldGhpcy4kdGFiU2l6ZX0sdGhpcy5zY3JlZW5Ub0RvY3VtZW50Um93PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGEsYikucm93fSx0aGlzLnNjcmVlblRvRG9jdW1lbnRDb2x1bW49ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oYSxiKS5jb2x1bW59LHRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uPWZ1bmN0aW9uKGEsYil7aWYoYTwwKXJldHVybntyb3c6MCxjb2x1bW46MH07dmFyIGMsZD0wLGU9MCxmLGc9MCxoPTAsaT10aGlzLiRyb3dDYWNoZTtmb3IodmFyIGo9MDtqPGkubGVuZ3RoO2orKyl7aWYoIShpW2pdLnNjcmVlblJvdzxhKSlicmVhaztnPWlbal0uc2NyZWVuUm93LGQ9aVtqXS5kb2NSb3d9dmFyIGs9IWkubGVuZ3RofHxqPT1pLmxlbmd0aCxsPXRoaXMuZ2V0TGVuZ3RoKCktMSxtPXRoaXMuZ2V0TmV4dEZvbGRMaW5lKGQpLG49bT9tLnN0YXJ0LnJvdzpJbmZpbml0eTt3aGlsZShnPD1hKXtoPXRoaXMuZ2V0Um93TGVuZ3RoKGQpO2lmKGcraC0xPj1hfHxkPj1sKWJyZWFrO2crPWgsZCsrLGQ+biYmKGQ9bS5lbmQucm93KzEsbT10aGlzLmdldE5leHRGb2xkTGluZShkLG0pLG49bT9tLnN0YXJ0LnJvdzpJbmZpbml0eSksayYmaS5wdXNoKHtkb2NSb3c6ZCxzY3JlZW5Sb3c6Z30pfWlmKG0mJm0uc3RhcnQucm93PD1kKWM9dGhpcy5nZXRGb2xkRGlzcGxheUxpbmUobSksZD1tLnN0YXJ0LnJvdztlbHNle2lmKGcraDw9YXx8ZD5sKXJldHVybntyb3c6bCxjb2x1bW46dGhpcy5nZXRMaW5lKGwpLmxlbmd0aH07Yz10aGlzLmdldExpbmUoZCksbT1udWxsfWlmKHRoaXMuJHVzZVdyYXBNb2RlKXt2YXIgbz10aGlzLiR3cmFwRGF0YVtkXTtvJiYoZj1vW2EtZ10sYT5nJiZvLmxlbmd0aCYmKGU9b1thLWctMV18fG9bby5sZW5ndGgtMV0sYz1jLnN1YnN0cmluZyhlKSkpfXJldHVybiBlKz10aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aChjLGIpWzFdLHRoaXMuJHVzZVdyYXBNb2RlP2U+PWYmJihlPWYtMSk6ZT1NYXRoLm1pbihlLGMubGVuZ3RoKSxtP20uaWR4VG9Qb3NpdGlvbihlKTp7cm93OmQsY29sdW1uOmV9fSx0aGlzLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbj1mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiPT0idW5kZWZpbmVkIil2YXIgYz10aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KGEucm93LGEuY29sdW1uKTtlbHNlIGM9dGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChhLGIpO2E9Yy5yb3csYj1jLmNvbHVtbjt2YXIgZDtpZih0aGlzLiR1c2VXcmFwTW9kZSl7ZD10aGlzLiR3cmFwRGF0YTtpZihhPmQubGVuZ3RoLTEpcmV0dXJue3Jvdzp0aGlzLmdldFNjcmVlbkxlbmd0aCgpLGNvbHVtbjpkLmxlbmd0aD09MD8wOmRbZC5sZW5ndGgtMV0ubGVuZ3RoLTF9fXZhciBlPTAsZj1udWxsLGc9bnVsbDtnPXRoaXMuZ2V0Rm9sZEF0KGEsYiwxKSxnJiYoYT1nLnN0YXJ0LnJvdyxiPWcuc3RhcnQuY29sdW1uKTt2YXIgaCxpPTAsaj10aGlzLiRyb3dDYWNoZTtmb3IodmFyIGs9MDtrPGoubGVuZ3RoO2srKyl7aWYoIShqW2tdLmRvY1JvdzxhKSlicmVhaztlPWpba10uc2NyZWVuUm93LGk9altrXS5kb2NSb3d9dmFyIGw9IWoubGVuZ3RofHxrPT1qLmxlbmd0aCxtPXRoaXMuZ2V0TmV4dEZvbGRMaW5lKGkpLG49bT9tLnN0YXJ0LnJvdzpJbmZpbml0eTt3aGlsZShpPGEpe2lmKGk+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/KHRoaXMuZW5kLnJvdz1hLmVuZC5yb3csdGhpcy5lbmQuY29sdW1uPWEuZW5kLmNvbHVtbik6dGhpcy5yYW5nZS5jb21wYXJlU3RhcnQoYS5lbmQucm93LGEuZW5kLmNvbHVtbik8MCYmKHRoaXMuc3RhcnQucm93PWEuc3RhcnQucm93LHRoaXMuc3RhcnQuY29sdW1uPWEuc3RhcnQuY29sdW1uKX1lbHNlIGlmKGEuc3RhcnQucm93PT10aGlzLmVuZC5yb3cpdGhpcy5mb2xkcy5wdXNoKGEpLHRoaXMuZW5kLnJvdz1hLmVuZC5yb3csdGhpcy5lbmQuY29sdW1uPWEuZW5kLmNvbHVtbjtlbHNle2lmKGEuZW5kLnJvdyE9dGhpcy5zdGFydC5yb3cpdGhyb3ciVHJ5aW5nIHRvIGFkZCBmb2xkIHRvIEZvbGRSb3cgdGhhdCBkb2Vzbid0IGhhdmUgYSBtYXRjaGluZyByb3ciO3RoaXMuZm9sZHMudW5zaGlmdChhKSx0aGlzLnN0YXJ0LnJvdz1hLnN0YXJ0LnJvdyx0aGlzLnN0YXJ0LmNvbHVtbj1hLnN0YXJ0LmNvbHVtbn1hLmZvbGRMaW5lPXRoaXN9LHRoaXMuY29udGFpbnNSb3c9ZnVuY3Rpb24oYSl7cmV0dXJuIGE+PXRoaXMuc3RhcnQucm93JiZhPD10aGlzLmVuZC5yb3d9LHRoaXMud2Fsaz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9MCxlPXRoaXMuZm9sZHMsZixnLGgsaT0hMDtiPT1udWxsJiYoYj10aGlzLmVuZC5yb3csYz10aGlzLmVuZC5jb2x1bW4pO2Zvcih2YXIgaj0wO2o8ZS5sZW5ndGg7aisrKXtmPWVbal0sZz1mLnJhbmdlLmNvbXBhcmVTdGFydChiLGMpO2lmKGc9PS0xKXthKG51bGwsYixjLGQsaSk7cmV0dXJufWg9YShudWxsLGYuc3RhcnQucm93LGYuc3RhcnQuY29sdW1uLGQsaSksaD0haCYmYShmLnBsYWNlaG9sZGVyLGYuc3RhcnQucm93LGYuc3RhcnQuY29sdW1uLGQpO2lmKGh8fGc9PTApcmV0dXJuO2k9IWYuc2FtZVJvdyxkPWYuZW5kLmNvbHVtbn1hKG51bGwsYixjLGQsaSl9LHRoaXMuZ2V0TmV4dEZvbGRUbz1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7Zm9yKHZhciBlPTA7ZTx0aGlzLmZvbGRzLmxlbmd0aDtlKyspe2M9dGhpcy5mb2xkc1tlXSxkPWMucmFuZ2UuY29tcGFyZUVuZChhLGIpO2lmKGQ9PS0xKXJldHVybntmb2xkOmMsa2luZDoiYWZ0ZXIifTtpZihkPT0wKXJldHVybntmb2xkOmMsa2luZDoiaW5zaWRlIn19cmV0dXJuIG51bGx9LHRoaXMuYWRkUmVtb3ZlQ2hhcnM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZ2V0TmV4dEZvbGRUbyhhLGIpLGUsZjtpZihkKXtlPWQuZm9sZDtpZihkLmtpbmQ9PSJpbnNpZGUiJiZlLnN0YXJ0LmNvbHVtbiE9YiYmZS5zdGFydC5yb3chPWEpdGhyb3ciTW92aW5nIGNoYXJhY3RlcnMgaW5zaWRlIG9mIGEgZm9sZCBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZCI7aWYoZS5zdGFydC5yb3c9PWEpe2Y9dGhpcy5mb2xkczt2YXIgZz1mLmluZGV4T2YoZSk7Zz09MCYmKHRoaXMuc3RhcnQuY29sdW1uKz1jKTtmb3IoZztnPGYubGVuZ3RoO2crKyl7ZT1mW2ddLGUuc3RhcnQuY29sdW1uKz1jO2lmKCFlLnNhbWVSb3cpcmV0dXJuO2UuZW5kLmNvbHVtbis9Y310aGlzLmVuZC5jb2x1bW4rPWN9fX0sdGhpcy5zcGxpdD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZ2V0TmV4dEZvbGRUbyhhLGIpLmZvbGQsZD10aGlzLmZvbGRzLGY9dGhpcy5mb2xkRGF0YTtpZighYylyZXR1cm4gbnVsbDt2YXIgZz1kLmluZGV4T2YoYyksaD1kW2ctMV07dGhpcy5lbmQucm93PWguZW5kLnJvdyx0aGlzLmVuZC5jb2x1bW49aC5lbmQuY29sdW1uLGQ9ZC5zcGxpY2UoZyxkLmxlbmd0aC1nKTt2YXIgaT1uZXcgZShmLGQpO3JldHVybiBmLnNwbGljZShmLmluZGV4T2YodGhpcykrMSwwLGkpLGl9LHRoaXMubWVyZ2U9ZnVuY3Rpb24oYSl7dmFyIGI9YS5mb2xkcztmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmFkZEZvbGQoYltjXSk7dmFyIGQ9dGhpcy5mb2xkRGF0YTtkLnNwbGljZShkLmluZGV4T2YoYSksMSl9LHRoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgYT1bdGhpcy5yYW5nZS50b1N0cmluZygpKyI6IFsiXTtyZXR1cm4gdGhpcy5mb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2EucHVzaCgiICAiK2IudG9TdHJpbmcoKSl9KSxhLnB1c2goIl0iKSxhLmpvaW4oIlxuIil9LHRoaXMuaWR4VG9Qb3NpdGlvbj1mdW5jdGlvbihhKXt2YXIgYj0wLGM7Zm9yKHZhciBkPTA7ZDx0aGlzLmZvbGRzLmxlbmd0aDtkKyspe3ZhciBjPXRoaXMuZm9sZHNbZF07YS09Yy5zdGFydC5jb2x1bW4tYjtpZihhPDApcmV0dXJue3JvdzpjLnN0YXJ0LnJvdyxjb2x1bW46Yy5zdGFydC5jb2x1bW4rYX07YS09Yy5wbGFjZWhvbGRlci5sZW5ndGg7aWYoYTwwKXJldHVybiBjLnN0YXJ0O2I9Yy5lbmQuY29sdW1ufXJldHVybntyb3c6dGhpcy5lbmQucm93LGNvbHVtbjp0aGlzLmVuZC5jb2x1bW4rYX19fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuRm9sZExpbmU9ZX0pLGRlZmluZSgiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1iLkZvbGQ9ZnVuY3Rpb24oYSxiKXt0aGlzLmZvbGRMaW5lPW51bGwsdGhpcy5wbGFjZWhvbGRlcj1iLHRoaXMucmFuZ2U9YSx0aGlzLnN0YXJ0PWEuc3RhcnQsdGhpcy5lbmQ9YS5lbmQsdGhpcy5zYW1lUm93PWEuc3RhcnQucm93PT1hLmVuZC5yb3csdGhpcy5zdWJGb2xkcz1bXX07KChmdW5jdGlvbigpe3RoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4nIicrdGhpcy5wbGFjZWhvbGRlcisnIiAnK3RoaXMucmFuZ2UudG9TdHJpbmcoKX0sdGhpcy5zZXRGb2xkTGluZT1mdW5jdGlvbihhKXt0aGlzLmZvbGRMaW5lPWEsdGhpcy5zdWJGb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2Iuc2V0Rm9sZExpbmUoYSl9KX0sdGhpcy5jbG9uZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucmFuZ2UuY2xvbmUoKSxiPW5ldyBkKGEsdGhpcy5wbGFjZWhvbGRlcik7cmV0dXJuIHRoaXMuc3ViRm9sZHMuZm9yRWFjaChmdW5jdGlvbihhKXtiLnN1YkZvbGRzLnB1c2goYS5jbG9uZSgpKX0pLGJ9LHRoaXMuYWRkU3ViRm9sZD1mdW5jdGlvbihhKXtpZih0aGlzLnJhbmdlLmlzRWVxdWFsKGEpKXJldHVybiB0aGlzO2lmKCF0aGlzLnJhbmdlLmNvbnRhaW5zUmFuZ2UoYSkpdGhyb3ciQSBmb2xkIGNhbid0IGludGVyc2VjdCBhbHJlYWR5IGV4aXN0aW5nIGZvbGQiK2EucmFuZ2UrdGhpcy5yYW5nZTt2YXIgYj1hLnJhbmdlLnN0YXJ0LnJvdyxjPWEucmFuZ2Uuc3RhcnQuY29sdW1uO2Zvcih2YXIgZD0wLGU9LTE7ZDx0aGlzLnN1YkZvbGRzLmxlbmd0aDtkKyspe2U9dGhpcy5zdWJGb2xkc1tkXS5yYW5nZS5jb21wYXJlKGIsYyk7aWYoZSE9MSlicmVha312YXIgZj10aGlzLnN1YkZvbGRzW2RdO2lmKGU9PTApcmV0dXJuIGYuYWRkU3ViRm9sZChhKTt2YXIgYj1hLnJhbmdlLmVuZC5yb3csYz1hLnJhbmdlLmVuZC5jb2x1bW47Zm9yKHZhciBnPWQsZT0tMTtnPHRoaXMuc3ViRm9sZHMubGVuZ3RoO2crKyl7ZT10aGlzLnN1YkZvbGRzW2ddLnJhbmdlLmNvbXBhcmUoYixjKTtpZihlIT0xKWJyZWFrfXZhciBoPXRoaXMuc3ViRm9sZHNbZ107aWYoZT09MCl0aHJvdyJBIGZvbGQgY2FuJ3QgaW50ZXJzZWN0IGFscmVhZHkgZXhpc3RpbmcgZm9sZCIrYS5yYW5nZSt0aGlzLnJhbmdlO3ZhciBpPXRoaXMuc3ViRm9sZHMuc3BsaWNlKGQsZy1kLGEpO3JldHVybiBhLnNldEZvbGRMaW5lKHRoaXMuZm9sZExpbmUpLGF9fSkpLmNhbGwoZC5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvdG9rZW5faXRlcmF0b3IiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRzZXNzaW9uPWEsdGhpcy4kcm93PWIsdGhpcy4kcm93VG9rZW5zPWEuZ2V0VG9rZW5zKGIsYilbMF0udG9rZW5zO3ZhciBkPWEuZ2V0VG9rZW5BdChiLGMpO3RoaXMuJHRva2VuSW5kZXg9ZD9kLmluZGV4Oi0xfTsoKGZ1bmN0aW9uKCl7dGhpcy5zdGVwQmFja3dhcmQ9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbkluZGV4LT0xO3doaWxlKHRoaXMuJHRva2VuSW5kZXg8MCl7dGhpcy4kcm93LT0xO2lmKHRoaXMuJHJvdzwwKXJldHVybiB0aGlzLiRyb3c9MCxudWxsO3RoaXMuJHJvd1Rva2Vucz10aGlzLiRzZXNzaW9uLmdldFRva2Vucyh0aGlzLiRyb3csdGhpcy4kcm93KVswXS50b2tlbnMsdGhpcy4kdG9rZW5JbmRleD10aGlzLiRyb3dUb2tlbnMubGVuZ3RoLTF9cmV0dXJuIHRoaXMuJHJvd1Rva2Vuc1t0aGlzLiR0b2tlbkluZGV4XX0sdGhpcy5zdGVwRm9yd2FyZD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJHNlc3Npb24uZ2V0TGVuZ3RoKCk7dGhpcy4kdG9rZW5JbmRleCs9MTt3aGlsZSh0aGlzLiR0b2tlbkluZGV4Pj10aGlzLiRyb3dUb2tlbnMubGVuZ3RoKXt0aGlzLiRyb3crPTE7aWYodGhpcy4kcm93Pj1hKXJldHVybiB0aGlzLiRyb3c9YS0xLG51bGw7dGhpcy4kcm93VG9rZW5zPXRoaXMuJHNlc3Npb24uZ2V0VG9rZW5zKHRoaXMuJHJvdyx0aGlzLiRyb3cpWzBdLnRva2Vucyx0aGlzLiR0b2tlbkluZGV4PTB9cmV0dXJuIHRoaXMuJHJvd1Rva2Vuc1t0aGlzLiR0b2tlbkluZGV4XX0sdGhpcy5nZXRDdXJyZW50VG9rZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdfSx0aGlzLmdldEN1cnJlbnRUb2tlblJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyb3d9LHRoaXMuZ2V0Q3VycmVudFRva2VuQ29sdW1uPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kcm93VG9rZW5zLGI9dGhpcy4kdG9rZW5JbmRleCxjPWFbYl0uc3RhcnQ7aWYoYyE9PXVuZGVmaW5lZClyZXR1cm4gYztjPTA7d2hpbGUoYj4wKWItPTEsYys9YVtiXS52YWx1ZS5sZW5ndGg7cmV0dXJuIGN9fSkpLmNhbGwoZC5wcm90b3R5cGUpLGIuVG9rZW5JdGVyYXRvcj1kfSksZGVmaW5lKCJhY2UvZWRpdF9zZXNzaW9uL2JyYWNrZXRfbWF0Y2giLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvdG9rZW5faXRlcmF0b3IiXSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe3RoaXMuZmluZE1hdGNoaW5nQnJhY2tldD1mdW5jdGlvbihhKXtpZihhLmNvbHVtbj09MClyZXR1cm4gbnVsbDt2YXIgYj10aGlzLmdldExpbmUoYS5yb3cpLmNoYXJBdChhLmNvbHVtbi0xKTtpZihiPT0iIilyZXR1cm4gbnVsbDt2YXIgYz1iLm1hdGNoKC8oW1woXFtce10pfChbXClcXVx9XSkvKTtyZXR1cm4gYz9jWzFdP3RoaXMuJGZpbmRDbG9zaW5nQnJhY2tldChjWzFdLGEpOnRoaXMuJGZpbmRPcGVuaW5nQnJhY2tldChjWzJdLGEpOm51bGx9LHRoaXMuJGJyYWNrZXRzPXsiKSI6IigiLCIoIjoiKSIsIl0iOiJbIiwiWyI6Il0iLCJ7IjoifSIsIn0iOiJ7In0sdGhpcy4kZmluZE9wZW5pbmdCcmFja2V0PWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy4kYnJhY2tldHNbYV0sZT0xLGY9bmV3IGQodGhpcyxiLnJvdyxiLmNvbHVtbiksZz1mLmdldEN1cnJlbnRUb2tlbigpO2lmKCFnKXJldHVybiBudWxsO3ZhciBoPW5ldyBSZWdFeHAoIihcXC4/IitnLnR5cGUucmVwbGFjZSgiLiIsInwiKS5yZXBsYWNlKCJycGFyZW4iLCJscGFyZW58cnBhcmVuIikrIikrIiksaT1iLmNvbHVtbi1mLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpLTIsaj1nLnZhbHVlO2Zvcig7Oyl7d2hpbGUoaT49MCl7dmFyIGs9ai5jaGFyQXQoaSk7aWYoaz09Yyl7ZS09MTtpZihlPT0wKXJldHVybntyb3c6Zi5nZXRDdXJyZW50VG9rZW5Sb3coKSxjb2x1bW46aStmLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfX1lbHNlIGs9PWEmJihlKz0xKTtpLT0xfWRvIGc9Zi5zdGVwQmFja3dhcmQoKTt3aGlsZShnJiYhaC50ZXN0KGcudHlwZSkpO2lmKGc9PW51bGwpYnJlYWs7aj1nLnZhbHVlLGk9ai5sZW5ndGgtMX1yZXR1cm4gbnVsbH0sdGhpcy4kZmluZENsb3NpbmdCcmFja2V0PWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy4kYnJhY2tldHNbYV0sZT0xLGY9bmV3IGQodGhpcyxiLnJvdyxiLmNvbHVtbiksZz1mLmdldEN1cnJlbnRUb2tlbigpO2lmKCFnKXJldHVybiBudWxsO3ZhciBoPW5ldyBSZWdFeHAoIihcXC4/IitnLnR5cGUucmVwbGFjZSgiLiIsInwiKS5yZXBsYWNlKCJscGFyZW4iLCJscGFyZW58cnBhcmVuIikrIikrIiksaT1iLmNvbHVtbi1mLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpO2Zvcig7Oyl7dmFyIGo9Zy52YWx1ZSxrPWoubGVuZ3RoO3doaWxlKGk8ayl7dmFyIGw9ai5jaGFyQXQoaSk7aWYobD09Yyl7ZS09MTtpZihlPT0wKXJldHVybntyb3c6Zi5nZXRDdXJyZW50VG9rZW5Sb3coKSxjb2x1bW46aStmLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfX1lbHNlIGw9PWEmJihlKz0xKTtpKz0xfWRvIGc9Zi5zdGVwRm9yd2FyZCgpO3doaWxlKGcmJiFoLnRlc3QoZy50eXBlKSk7aWYoZz09bnVsbClicmVhaztpPTB9cmV0dXJuIG51bGx9fSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3I7Yi5CcmFja2V0TWF0Y2g9ZX0pLGRlZmluZSgiYWNlL3NlYXJjaCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuL2xpYi9sYW5nIiksZT1hKCIuL2xpYi9vb3AiKSxmPWEoIi4vcmFuZ2UiKS5SYW5nZSxnPWZ1bmN0aW9uKCl7dGhpcy4kb3B0aW9ucz17bmVlZGxlOiIiLGJhY2t3YXJkczohMSx3cmFwOiExLGNhc2VTZW5zaXRpdmU6ITEsd2hvbGVXb3JkOiExLHNjb3BlOmcuQUxMLHJlZ0V4cDohMX19O2cuQUxMPTEsZy5TRUxFQ1RJT049MixmdW5jdGlvbigpe3RoaXMuc2V0PWZ1bmN0aW9uKGEpe3JldHVybiBlLm1peGluKHRoaXMuJG9wdGlvbnMsYSksdGhpc30sdGhpcy5nZXRPcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIGQuY29weU9iamVjdCh0aGlzLiRvcHRpb25zKX0sdGhpcy5maW5kPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLiRvcHRpb25zLm5lZWRsZSlyZXR1cm4gbnVsbDtpZih0aGlzLiRvcHRpb25zLmJhY2t3YXJkcyl2YXIgYj10aGlzLiRiYWNrd2FyZE1hdGNoSXRlcmF0b3IoYSk7ZWxzZSBiPXRoaXMuJGZvcndhcmRNYXRjaEl0ZXJhdG9yKGEpO3ZhciBjPW51bGw7cmV0dXJuIGIuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYz1hLCEwfSksY30sdGhpcy5maW5kQWxsPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuJG9wdGlvbnM7aWYoIWIubmVlZGxlKXJldHVybltdO2lmKGIuYmFja3dhcmRzKXZhciBjPXRoaXMuJGJhY2t3YXJkTWF0Y2hJdGVyYXRvcihhKTtlbHNlIGM9dGhpcy4kZm9yd2FyZE1hdGNoSXRlcmF0b3IoYSk7dmFyIGQ9IWIuc3RhcnQmJmIud3JhcCYmYi5zY29wZT09Zy5BTEw7ZCYmKGIuc3RhcnQ9e3JvdzowLGNvbHVtbjowfSk7dmFyIGU9W107cmV0dXJuIGMuZm9yRWFjaChmdW5jdGlvbihhKXtlLnB1c2goYSl9KSxkJiYoYi5zdGFydD1udWxsKSxlfSx0aGlzLnJlcGxhY2U9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLiRhc3NlbWJsZVJlZ0V4cCgpLGQ9Yy5leGVjKGEpO3JldHVybiBkJiZkWzBdLmxlbmd0aD09YS5sZW5ndGg/dGhpcy4kb3B0aW9ucy5yZWdFeHA/YS5yZXBsYWNlKGMsYik6YjpudWxsfSx0aGlzLiRmb3J3YXJkTWF0Y2hJdGVyYXRvcj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLiRhc3NlbWJsZVJlZ0V4cCgpLGM9dGhpcztyZXR1cm57Zm9yRWFjaDpmdW5jdGlvbihkKXtjLiRmb3J3YXJkTGluZUl0ZXJhdG9yKGEpLmZvckVhY2goZnVuY3Rpb24oYSxlLGYpe2UmJihhPWEuc3Vic3RyaW5nKGUpKTt2YXIgZz1bXTthLnJlcGxhY2UoYixmdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0yXTtyZXR1cm4gZy5wdXNoKHtzdHI6YSxvZmZzZXQ6ZStifSksYX0pO2Zvcih2YXIgaD0wO2g8Zy5sZW5ndGg7aCsrKXt2YXIgaT1nW2hdLGo9Yy4kcmFuZ2VGcm9tTWF0Y2goZixpLm9mZnNldCxpLnN0ci5sZW5ndGgpO2lmKGQoaikpcmV0dXJuITB9fSl9fX0sdGhpcy4kYmFja3dhcmRNYXRjaEl0ZXJhdG9yPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuJGFzc2VtYmxlUmVnRXhwKCksYz10aGlzO3JldHVybntmb3JFYWNoOmZ1bmN0aW9uKGQpe2MuJGJhY2t3YXJkTGluZUl0ZXJhdG9yKGEpLmZvckVhY2goZnVuY3Rpb24oYSxlLGYpe2UmJihhPWEuc3Vic3RyaW5nKGUpKTt2YXIgZz1bXTthLnJlcGxhY2UoYixmdW5jdGlvbihhLGIpe3JldHVybiBnLnB1c2goe3N0cjphLG9mZnNldDplK2J9KSxhfSk7Zm9yKHZhciBoPWcubGVuZ3RoLTE7aD49MDtoLS0pe3ZhciBpPWdbaF0saj1jLiRyYW5nZUZyb21NYXRjaChmLGkub2Zmc2V0LGkuc3RyLmxlbmd0aCk7aWYoZChqKSlyZXR1cm4hMH19KX19fSx0aGlzLiRyYW5nZUZyb21NYXRjaD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBmKGEsYixhLGIrYyl9LHRoaXMuJGFzc2VtYmxlUmVnRXhwPWZ1bmN0aW9uKCl7aWYodGhpcy4kb3B0aW9ucy5yZWdFeHApdmFyIGE9dGhpcy4kb3B0aW9ucy5uZWVkbGU7ZWxzZSBhPWQuZXNjYXBlUmVnRXhwKHRoaXMuJG9wdGlvbnMubmVlZGxlKTt0aGlzLiRvcHRpb25zLndob2xlV29yZCYmKGE9IlxcYiIrYSsiXFxiIik7dmFyIGI9ImciO3RoaXMuJG9wdGlvbnMuY2FzZVNlbnNpdGl2ZXx8KGIrPSJpIik7dmFyIGM9bmV3IFJlZ0V4cChhLGIpO3JldHVybiBjfSx0aGlzLiRmb3J3YXJkTGluZUl0ZXJhdG9yPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGsoZSl7dmFyIGY9YS5nZXRMaW5lKGUpO3JldHVybiBiJiZlPT1jLmVuZC5yb3cmJihmPWYuc3Vic3RyaW5nKDAsYy5lbmQuY29sdW1uKSksaiYmZT09ZC5yb3cmJihmPWYuc3Vic3RyaW5nKDAsZC5jb2x1bW4pKSxmfXZhciBiPXRoaXMuJG9wdGlvbnMuc2NvcGU9PWcuU0VMRUNUSU9OLGM9dGhpcy4kb3B0aW9ucy5yYW5nZXx8YS5nZXRTZWxlY3Rpb24oKS5nZXRSYW5nZSgpLGQ9dGhpcy4kb3B0aW9ucy5zdGFydHx8Y1tiPyJzdGFydCI6ImVuZCJdLGU9Yj9jLnN0YXJ0LnJvdzowLGY9Yj9jLnN0YXJ0LmNvbHVtbjowLGg9Yj9jLmVuZC5yb3c6YS5nZXRMZW5ndGgoKS0xLGk9dGhpcy4kb3B0aW9ucy53cmFwLGo9ITE7cmV0dXJue2ZvckVhY2g6ZnVuY3Rpb24oYSl7dmFyIGI9ZC5yb3csYz1rKGIpLGc9ZC5jb2x1bW4sbD0hMTtqPSExO3doaWxlKCFhKGMsZyxiKSl7aWYobClyZXR1cm47YisrLGc9MDtpZihiPmgpe2lmKCFpKXJldHVybjtiPWUsZz1mLGo9ITB9Yj09ZC5yb3cmJihsPSEwKSxjPWsoYil9fX19LHRoaXMuJGJhY2t3YXJkTGluZUl0ZXJhdG9yPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuJG9wdGlvbnMuc2NvcGU9PWcuU0VMRUNUSU9OLGM9dGhpcy4kb3B0aW9ucy5yYW5nZXx8YS5nZXRTZWxlY3Rpb24oKS5nZXRSYW5nZSgpLGQ9dGhpcy4kb3B0aW9ucy5zdGFydHx8Y1tiPyJlbmQiOiJzdGFydCJdLGU9Yj9jLnN0YXJ0LnJvdzowLGY9Yj9jLnN0YXJ0LmNvbHVtbjowLGg9Yj9jLmVuZC5yb3c6YS5nZXRMZW5ndGgoKS0xLGk9dGhpcy4kb3B0aW9ucy53cmFwO3JldHVybntmb3JFYWNoOmZ1bmN0aW9uKGcpe3ZhciBqPWQucm93LGs9YS5nZXRMaW5lKGopLnN1YnN0cmluZygwLGQuY29sdW1uKSxsPTAsbT0hMSxuPSExO3doaWxlKCFnKGssbCxqKSl7aWYobSlyZXR1cm47ai0tLGw9MDtpZihqPGUpe2lmKCFpKXJldHVybjtqPWgsbj0hMH1qPT1kLnJvdyYmKG09ITApLGs9YS5nZXRMaW5lKGopLGImJihqPT1lP2w9ZjpqPT1oJiYoaz1rLnN1YnN0cmluZygwLGMuZW5kLmNvbHVtbikpKSxuJiZqPT1kLnJvdyYmKGw9ZC5jb2x1bW4pfX19fX0uY2FsbChnLnByb3RvdHlwZSksYi5TZWFyY2g9Z30pLGRlZmluZSgiYWNlL2NvbW1hbmRzL2NvbW1hbmRfbWFuYWdlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIva2V5cyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2tleXMiKSxlPWZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGEhPSJzdHJpbmciKXRocm93IG5ldyBUeXBlRXJyb3IoIidwbGF0Zm9ybScgYXJndW1lbnQgbXVzdCBiZSBlaXRoZXIgJ21hYycgb3IgJ3dpbiciKTt0aGlzLnBsYXRmb3JtPWEsdGhpcy5jb21tYW5kcz17fSx0aGlzLmNvbW1tYW5kS2V5QmluZGluZz17fSxiJiZiLmZvckVhY2godGhpcy5hZGRDb21tYW5kLHRoaXMpfTsoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGMsZSl7dmFyIGYsZz0wLGg9YihhKTtmb3IodmFyIGk9MCxqPWgubGVuZ3RoO2k8ajtpKyspZC5LRVlfTU9EU1toW2ldXT9nfD1kLktFWV9NT0RTW2hbaV1dOmY9aFtpXXx8Ii0iO3JldHVybntrZXk6ZixoYXNoSWQ6Z319ZnVuY3Rpb24gYihhLGIpe3JldHVybiBhLnRvTG93ZXJDYXNlKCkudHJpbSgpLnNwbGl0KG5ldyBSZWdFeHAoIltcXHMgXSpcXC1bXFxzIF0qIiwiZyIpLDk5OSl9dGhpcy5hZGRDb21tYW5kPWZ1bmN0aW9uKGEpe3RoaXMuY29tbWFuZHNbYS5uYW1lXSYmdGhpcy5yZW1vdmVDb21tYW5kKGEpLHRoaXMuY29tbWFuZHNbYS5uYW1lXT1hLGEuYmluZEtleSYmdGhpcy5fYnVpbGRLZXlIYXNoKGEpfSx0aGlzLnJlbW92ZUNvbW1hbmQ9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE9PSJzdHJpbmciP2E6YS5uYW1lO2E9dGhpcy5jb21tYW5kc1tiXSxkZWxldGUgdGhpcy5jb21tYW5kc1tiXTt2YXIgYz10aGlzLmNvbW1tYW5kS2V5QmluZGluZztmb3IodmFyIGQgaW4gYylmb3IodmFyIGUgaW4gY1tkXSljW2RdW2VdPT1hJiZkZWxldGUgY1tkXVtlXX0sdGhpcy5hZGRDb21tYW5kcz1mdW5jdGlvbihhKXtPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWFbYl07aWYodHlwZW9mIGM9PSJzdHJpbmciKXJldHVybiB0aGlzLmJpbmRLZXkoYyxiKTt0eXBlb2YgYz09ImZ1bmN0aW9uIiYmKGM9e2V4ZWM6Y30pLGMubmFtZXx8KGMubmFtZT1iKSx0aGlzLmFkZENvbW1hbmQoYyl9LHRoaXMpfSx0aGlzLnJlbW92ZUNvbW1hbmRzPWZ1bmN0aW9uKGEpe09iamVjdC5rZXlzKGEpLmZvckVhY2goZnVuY3Rpb24oYil7dGhpcy5yZW1vdmVDb21tYW5kKGFbYl0pfSx0aGlzKX0sdGhpcy5iaW5kS2V5PWZ1bmN0aW9uKGIsYyl7aWYoIWIpcmV0dXJuO3ZhciBkPXRoaXMuY29tbW1hbmRLZXlCaW5kaW5nO2Iuc3BsaXQoInwiKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBlPWEoYixjKSxmPWUuaGFzaElkOyhkW2ZdfHwoZFtmXT17fSkpW2Uua2V5XT1jfSl9LHRoaXMuYmluZEtleXM9ZnVuY3Rpb24oYSl7T2JqZWN0LmtleXMoYSkuZm9yRWFjaChmdW5jdGlvbihiKXt0aGlzLmJpbmRLZXkoYixhW2JdKX0sdGhpcyl9LHRoaXMuX2J1aWxkS2V5SGFzaD1mdW5jdGlvbihhKXt2YXIgYj1hLmJpbmRLZXk7aWYoIWIpcmV0dXJuO3ZhciBjPXR5cGVvZiBiPT0ic3RyaW5nIj9iOmJbdGhpcy5wbGF0Zm9ybV07dGhpcy5iaW5kS2V5KGMsYSl9LHRoaXMuZmluZEtleUNvbW1hbmQ9ZnVuY3Rpb24oYixjKXt0eXBlb2YgYz09Im51bWJlciImJihjPWQua2V5Q29kZVRvU3RyaW5nKGMpKTt2YXIgZT10aGlzLmNvbW1tYW5kS2V5QmluZGluZztyZXR1cm4gZVtiXSYmZVtiXVtjLnRvTG93ZXJDYXNlKCldfSx0aGlzLmV4ZWM9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0eXBlb2YgYT09InN0cmluZyImJihhPXRoaXMuY29tbWFuZHNbYV0pLGE/YiYmYi4kcmVhZE9ubHkmJiFhLnJlYWRPbmx5PyExOihhLmV4ZWMoYixjfHx7fSksITApOiExfSx0aGlzLnRvZ2dsZVJlY29yZGluZz1mdW5jdGlvbigpe2lmKHRoaXMuJGluUmVwbGF5KXJldHVybjtyZXR1cm4gdGhpcy5yZWNvcmRpbmc/KHRoaXMubWFjcm8ucG9wKCksdGhpcy5leGVjPXRoaXMubm9ybWFsX2V4ZWMsdGhpcy5tYWNyby5sZW5ndGh8fCh0aGlzLm1hY3JvPXRoaXMub2xkTWFjcm8pLHRoaXMucmVjb3JkaW5nPSExKToodGhpcy5vbGRNYWNybz10aGlzLm1hY3JvLHRoaXMubWFjcm89W10sdGhpcy5ub3JtYWxfZXhlYz10aGlzLmV4ZWMsdGhpcy5leGVjPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5tYWNyby5wdXNoKFthLGNdKSx0aGlzLm5vcm1hbF9leGVjKGEsYixjKX0sdGhpcy5yZWNvcmRpbmc9ITApfSx0aGlzLnJlcGxheT1mdW5jdGlvbihhKXtpZih0aGlzLiRpblJlcGxheXx8IXRoaXMubWFjcm8pcmV0dXJuO2lmKHRoaXMucmVjb3JkaW5nKXJldHVybiB0aGlzLnRvZ2dsZVJlY29yZGluZygpO3RyeXt0aGlzLiRpblJlcGxheT0hMCx0aGlzLm1hY3JvLmZvckVhY2goZnVuY3Rpb24oYil7dHlwZW9mIGI9PSJzdHJpbmciP3RoaXMuZXhlYyhiLGEpOnRoaXMuZXhlYyhiWzBdLGEsYlsxXSl9LHRoaXMpfWZpbmFsbHl7dGhpcy4kaW5SZXBsYXk9ITF9fSx0aGlzLnRyaW1NYWNybz1mdW5jdGlvbihhKXtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhWzBdIT0ic3RyaW5nIiYmKGFbMF09YVswXS5uYW1lKSxhWzFdfHwoYT1hWzBdKSxhfSl9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuQ29tbWFuZE1hbmFnZXI9ZX0pLGRlZmluZSgiYWNlL3VuZG9tYW5hZ2VyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1mdW5jdGlvbigpe3RoaXMucmVzZXQoKX07KChmdW5jdGlvbigpe3RoaXMuZXhlY3V0ZT1mdW5jdGlvbihhKXt2YXIgYj1hLmFyZ3NbMF07dGhpcy4kZG9jPWEuYXJnc1sxXSx0aGlzLiR1bmRvU3RhY2sucHVzaChiKSx0aGlzLiRyZWRvU3RhY2s9W119LHRoaXMudW5kbz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLiR1bmRvU3RhY2sucG9wKCksYz1udWxsO3JldHVybiBiJiYoYz10aGlzLiRkb2MudW5kb0NoYW5nZXMoYixhKSx0aGlzLiRyZWRvU3RhY2sucHVzaChiKSksY30sdGhpcy5yZWRvPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuJHJlZG9TdGFjay5wb3AoKSxjPW51bGw7cmV0dXJuIGImJihjPXRoaXMuJGRvYy5yZWRvQ2hhbmdlcyhiLGEpLHRoaXMuJHVuZG9TdGFjay5wdXNoKGIpKSxjfSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy4kdW5kb1N0YWNrPVtdLHRoaXMuJHJlZG9TdGFjaz1bXX0sdGhpcy5oYXNVbmRvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHVuZG9TdGFjay5sZW5ndGg+MH0sdGhpcy5oYXNSZWRvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJlZG9TdGFjay5sZW5ndGg+MH19KSkuY2FsbChkLnByb3RvdHlwZSksYi5VbmRvTWFuYWdlcj1kfSksZGVmaW5lKCJhY2UvdmlydHVhbF9yZW5kZXJlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi91c2VyYWdlbnQiLCJhY2UvbGF5ZXIvZ3V0dGVyIiwiYWNlL2xheWVyL21hcmtlciIsImFjZS9sYXllci90ZXh0IiwiYWNlL2xheWVyL2N1cnNvciIsImFjZS9zY3JvbGxiYXIiLCJhY2UvcmVuZGVybG9vcCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsInRleHQhYWNlL2Nzcy9lZGl0b3IuY3NzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuL2xpYi9vb3AiKSxlPWEoIi4vbGliL2RvbSIpLGY9YSgiLi9saWIvZXZlbnQiKSxnPWEoIi4vbGliL3VzZXJhZ2VudCIpLGg9YSgiLi9sYXllci9ndXR0ZXIiKS5HdXR0ZXIsaT1hKCIuL2xheWVyL21hcmtlciIpLk1hcmtlcixqPWEoIi4vbGF5ZXIvdGV4dCIpLlRleHQsaz1hKCIuL2xheWVyL2N1cnNvciIpLkN1cnNvcixsPWEoIi4vc2Nyb2xsYmFyIikuU2Nyb2xsQmFyLG09YSgiLi9yZW5kZXJsb29wIikuUmVuZGVyTG9vcCxuPWEoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsbz1hKCJ0ZXh0IS4vY3NzL2VkaXRvci5jc3MiKTtlLmltcG9ydENzc1N0cmluZyhvLCJhY2VfZWRpdG9yIik7dmFyIHA9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO3RoaXMuY29udGFpbmVyPWEsZS5hZGRDc3NDbGFzcyhhLCJhY2VfZWRpdG9yIiksdGhpcy5zZXRUaGVtZShiKSx0aGlzLiRndXR0ZXI9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLiRndXR0ZXIuY2xhc3NOYW1lPSJhY2VfZ3V0dGVyIix0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLiRndXR0ZXIpLHRoaXMuc2Nyb2xsZXI9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnNjcm9sbGVyLmNsYXNzTmFtZT0iYWNlX3Njcm9sbGVyIix0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnNjcm9sbGVyKSx0aGlzLmNvbnRlbnQ9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbnRlbnQuY2xhc3NOYW1lPSJhY2VfY29udGVudCIsdGhpcy5zY3JvbGxlci5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnQpLHRoaXMuJGd1dHRlckxheWVyPW5ldyBoKHRoaXMuJGd1dHRlciksdGhpcy4kZ3V0dGVyTGF5ZXIub24oImNoYW5nZUd1dHRlcldpZHRoIix0aGlzLm9uUmVzaXplLmJpbmQodGhpcywhMCkpLHRoaXMuJG1hcmtlckJhY2s9bmV3IGkodGhpcy5jb250ZW50KTt2YXIgZD10aGlzLiR0ZXh0TGF5ZXI9bmV3IGoodGhpcy5jb250ZW50KTt0aGlzLmNhbnZhcz1kLmVsZW1lbnQsdGhpcy4kbWFya2VyRnJvbnQ9bmV3IGkodGhpcy5jb250ZW50KSx0aGlzLmNoYXJhY3RlcldpZHRoPWQuZ2V0Q2hhcmFjdGVyV2lkdGgoKSx0aGlzLmxpbmVIZWlnaHQ9ZC5nZXRMaW5lSGVpZ2h0KCksdGhpcy4kY3Vyc29yTGF5ZXI9bmV3IGsodGhpcy5jb250ZW50KSx0aGlzLiRjdXJzb3JQYWRkaW5nPTgsdGhpcy4kaG9yaXpTY3JvbGw9ITAsdGhpcy4kaG9yaXpTY3JvbGxBbHdheXNWaXNpYmxlPSEwLHRoaXMuc2Nyb2xsQmFyPW5ldyBsKGEpLHRoaXMuc2Nyb2xsQmFyLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZnVuY3Rpb24oYSl7Yy5zZXNzaW9uLnNldFNjcm9sbFRvcChhLmRhdGEpfSksdGhpcy5zY3JvbGxUb3A9MCx0aGlzLnNjcm9sbExlZnQ9MCxmLmFkZExpc3RlbmVyKHRoaXMuc2Nyb2xsZXIsInNjcm9sbCIsZnVuY3Rpb24oKXtjLnNlc3Npb24uc2V0U2Nyb2xsTGVmdChjLnNjcm9sbGVyLnNjcm9sbExlZnQpfSksdGhpcy5jdXJzb3JQb3M9e3JvdzowLGNvbHVtbjowfSx0aGlzLiR0ZXh0TGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlQ2hhcmFjdGVyU2l6ZSIsZnVuY3Rpb24oKXtjLmNoYXJhY3RlcldpZHRoPWQuZ2V0Q2hhcmFjdGVyV2lkdGgoKSxjLmxpbmVIZWlnaHQ9ZC5nZXRMaW5lSGVpZ2h0KCksYy4kdXBkYXRlUHJpbnRNYXJnaW4oKSxjLm9uUmVzaXplKCEwKSxjLiRsb29wLnNjaGVkdWxlKGMuQ0hBTkdFX0ZVTEwpfSksdGhpcy4kc2l6ZT17d2lkdGg6MCxoZWlnaHQ6MCxzY3JvbGxlckhlaWdodDowLHNjcm9sbGVyV2lkdGg6MH0sdGhpcy5sYXllckNvbmZpZz17d2lkdGg6MSxwYWRkaW5nOjAsZmlyc3RSb3c6MCxmaXJzdFJvd1NjcmVlbjowLGxhc3RSb3c6MCxsaW5lSGVpZ2h0OjEsY2hhcmFjdGVyV2lkdGg6MSxtaW5IZWlnaHQ6MSxtYXhIZWlnaHQ6MSxvZmZzZXQ6MCxoZWlnaHQ6MX0sdGhpcy4kbG9vcD1uZXcgbSh0aGlzLiRyZW5kZXJDaGFuZ2VzLmJpbmQodGhpcyksdGhpcy5jb250YWluZXIub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKSx0aGlzLnNldFBhZGRpbmcoNCksdGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKX07KChmdW5jdGlvbigpe3RoaXMuc2hvd0d1dHRlcj0hMCx0aGlzLkNIQU5HRV9DVVJTT1I9MSx0aGlzLkNIQU5HRV9NQVJLRVI9Mix0aGlzLkNIQU5HRV9HVVRURVI9NCx0aGlzLkNIQU5HRV9TQ1JPTEw9OCx0aGlzLkNIQU5HRV9MSU5FUz0xNix0aGlzLkNIQU5HRV9URVhUPTMyLHRoaXMuQ0hBTkdFX1NJWkU9NjQsdGhpcy5DSEFOR0VfTUFSS0VSX0JBQ0s9MTI4LHRoaXMuQ0hBTkdFX01BUktFUl9GUk9OVD0yNTYsdGhpcy5DSEFOR0VfRlVMTD01MTIsdGhpcy5DSEFOR0VfSF9TQ1JPTEw9MTAyNCxkLmltcGxlbWVudCh0aGlzLG4pLHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihhKXt0aGlzLnNlc3Npb249YSx0aGlzLiRjdXJzb3JMYXllci5zZXRTZXNzaW9uKGEpLHRoaXMuJG1hcmtlckJhY2suc2V0U2Vzc2lvbihhKSx0aGlzLiRtYXJrZXJGcm9udC5zZXRTZXNzaW9uKGEpLHRoaXMuJGd1dHRlckxheWVyLnNldFNlc3Npb24oYSksdGhpcy4kdGV4dExheWVyLnNldFNlc3Npb24oYSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKX0sdGhpcy51cGRhdGVMaW5lcz1mdW5jdGlvbihhLGIpe2I9PT11bmRlZmluZWQmJihiPUluZmluaXR5KSx0aGlzLiRjaGFuZ2VkTGluZXM/KHRoaXMuJGNoYW5nZWRMaW5lcy5maXJzdFJvdz5hJiYodGhpcy4kY2hhbmdlZExpbmVzLmZpcnN0Um93PWEpLHRoaXMuJGNoYW5nZWRMaW5lcy5sYXN0Um93PGImJih0aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdz1iKSk6dGhpcy4kY2hhbmdlZExpbmVzPXtmaXJzdFJvdzphLGxhc3RSb3c6Yn0sdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9MSU5FUyl9LHRoaXMudXBkYXRlVGV4dD1mdW5jdGlvbigpe3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfVEVYVCl9LHRoaXMudXBkYXRlRnVsbD1mdW5jdGlvbigpe3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCl9LHRoaXMudXBkYXRlRm9udFNpemU9ZnVuY3Rpb24oKXt0aGlzLiR0ZXh0TGF5ZXIuY2hlY2tGb3JTaXplQ2hhbmdlcygpfSx0aGlzLm9uUmVzaXplPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQ0hBTkdFX1NJWkUsYz10aGlzLiRzaXplLGQ9ZS5nZXRJbm5lckhlaWdodCh0aGlzLmNvbnRhaW5lcik7aWYoYXx8Yy5oZWlnaHQhPWQpYy5oZWlnaHQ9ZCx0aGlzLnNjcm9sbGVyLnN0eWxlLmhlaWdodD1kKyJweCIsYy5zY3JvbGxlckhlaWdodD10aGlzLnNjcm9sbGVyLmNsaWVudEhlaWdodCx0aGlzLnNjcm9sbEJhci5zZXRIZWlnaHQoYy5zY3JvbGxlckhlaWdodCksdGhpcy5zZXNzaW9uJiYodGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcCh0aGlzLmdldFNjcm9sbFRvcCgpKSxifD10aGlzLkNIQU5HRV9GVUxMKTt2YXIgZj1lLmdldElubmVyV2lkdGgodGhpcy5jb250YWluZXIpO2lmKGF8fGMud2lkdGghPWYpe2Mud2lkdGg9Zjt2YXIgZz10aGlzLnNob3dHdXR0ZXI/dGhpcy4kZ3V0dGVyLm9mZnNldFdpZHRoOjA7dGhpcy5zY3JvbGxlci5zdHlsZS5sZWZ0PWcrInB4IixjLnNjcm9sbGVyV2lkdGg9TWF0aC5tYXgoMCxmLWctdGhpcy5zY3JvbGxCYXIuZ2V0V2lkdGgoKSksdGhpcy5zY3JvbGxlci5zdHlsZS53aWR0aD1jLnNjcm9sbGVyV2lkdGgrInB4IjtpZih0aGlzLnNlc3Npb24uZ2V0VXNlV3JhcE1vZGUoKSYmdGhpcy5hZGp1c3RXcmFwTGltaXQoKXx8YSlifD10aGlzLkNIQU5HRV9GVUxMfXRoaXMuJGxvb3Auc2NoZWR1bGUoYil9LHRoaXMuYWRqdXN0V3JhcExpbWl0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoLXRoaXMuJHBhZGRpbmcqMixiPU1hdGguZmxvb3IoYS90aGlzLmNoYXJhY3RlcldpZHRoKTtyZXR1cm4gdGhpcy5zZXNzaW9uLmFkanVzdFdyYXBMaW1pdChiKX0sdGhpcy5zZXRTaG93SW52aXNpYmxlcz1mdW5jdGlvbihhKXt0aGlzLiR0ZXh0TGF5ZXIuc2V0U2hvd0ludmlzaWJsZXMoYSkmJnRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfVEVYVCl9LHRoaXMuZ2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdGV4dExheWVyLnNob3dJbnZpc2libGVzfSx0aGlzLiRzaG93UHJpbnRNYXJnaW49ITAsdGhpcy5zZXRTaG93UHJpbnRNYXJnaW49ZnVuY3Rpb24oYSl7dGhpcy4kc2hvd1ByaW50TWFyZ2luPWEsdGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKX0sdGhpcy5nZXRTaG93UHJpbnRNYXJnaW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2hvd1ByaW50TWFyZ2lufSx0aGlzLiRwcmludE1hcmdpbkNvbHVtbj04MCx0aGlzLnNldFByaW50TWFyZ2luQ29sdW1uPWZ1bmN0aW9uKGEpe3RoaXMuJHByaW50TWFyZ2luQ29sdW1uPWEsdGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKX0sdGhpcy5nZXRQcmludE1hcmdpbkNvbHVtbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRwcmludE1hcmdpbkNvbHVtbn0sdGhpcy5nZXRTaG93R3V0dGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2hvd0d1dHRlcn0sdGhpcy5zZXRTaG93R3V0dGVyPWZ1bmN0aW9uKGEpe2lmKHRoaXMuc2hvd0d1dHRlcj09PWEpcmV0dXJuO3RoaXMuJGd1dHRlci5zdHlsZS5kaXNwbGF5PWE/ImJsb2NrIjoibm9uZSIsdGhpcy5zaG93R3V0dGVyPWEsdGhpcy5vblJlc2l6ZSghMCl9LHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luPWZ1bmN0aW9uKCl7dmFyIGE7aWYoIXRoaXMuJHNob3dQcmludE1hcmdpbiYmIXRoaXMuJHByaW50TWFyZ2luRWwpcmV0dXJuO3RoaXMuJHByaW50TWFyZ2luRWx8fChhPWUuY3JlYXRlRWxlbWVudCgiZGl2IiksYS5jbGFzc05hbWU9ImFjZV9wcmludF9tYXJnaW5fbGF5ZXIiLHRoaXMuJHByaW50TWFyZ2luRWw9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLiRwcmludE1hcmdpbkVsLmNsYXNzTmFtZT0iYWNlX3ByaW50X21hcmdpbiIsYS5hcHBlbmRDaGlsZCh0aGlzLiRwcmludE1hcmdpbkVsKSx0aGlzLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKGEsdGhpcy4kdGV4dExheWVyLmVsZW1lbnQpKTt2YXIgYj10aGlzLiRwcmludE1hcmdpbkVsLnN0eWxlO2IubGVmdD10aGlzLmNoYXJhY3RlcldpZHRoKnRoaXMuJHByaW50TWFyZ2luQ29sdW1uK3RoaXMuJHBhZGRpbmcrInB4IixiLnZpc2liaWxpdHk9dGhpcy4kc2hvd1ByaW50TWFyZ2luPyJ2aXNpYmxlIjoiaGlkZGVuIn0sdGhpcy5nZXRDb250YWluZXJFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFpbmVyfSx0aGlzLmdldE1vdXNlRXZlbnRUYXJnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZW50fSx0aGlzLmdldFRleHRBcmVhQ29udGFpbmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFpbmVyfSx0aGlzLm1vdmVUZXh0QXJlYVRvQ3Vyc29yPWZ1bmN0aW9uKGEpe2lmKGcuaXNJRSlyZXR1cm47aWYodGhpcy5sYXllckNvbmZpZy5sYXN0Um93PT09MClyZXR1cm47dmFyIGI9dGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbigpO2lmKCFiKXJldHVybjt2YXIgYz10aGlzLmNvbnRlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD10aGlzLmxheWVyQ29uZmlnLm9mZnNldDthLnN0eWxlLmxlZnQ9Yy5sZWZ0K2IubGVmdCsicHgiLGEuc3R5bGUudG9wPWMudG9wK2IudG9wLXRoaXMuc2Nyb2xsVG9wK2QrInB4In0sdGhpcy5nZXRGaXJzdFZpc2libGVSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXllckNvbmZpZy5maXJzdFJvd30sdGhpcy5nZXRGaXJzdEZ1bGx5VmlzaWJsZVJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93Kyh0aGlzLmxheWVyQ29uZmlnLm9mZnNldD09PTA/MDoxKX0sdGhpcy5nZXRMYXN0RnVsbHlWaXNpYmxlUm93PWZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5mbG9vcigodGhpcy5sYXllckNvbmZpZy5oZWlnaHQrdGhpcy5sYXllckNvbmZpZy5vZmZzZXQpL3RoaXMubGF5ZXJDb25maWcubGluZUhlaWdodCk7cmV0dXJuIHRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3ctMSthfSx0aGlzLmdldExhc3RWaXNpYmxlUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5ZXJDb25maWcubGFzdFJvd30sdGhpcy4kcGFkZGluZz1udWxsLHRoaXMuc2V0UGFkZGluZz1mdW5jdGlvbihhKXt0aGlzLiRwYWRkaW5nPWEsdGhpcy4kdGV4dExheWVyLnNldFBhZGRpbmcoYSksdGhpcy4kY3Vyc29yTGF5ZXIuc2V0UGFkZGluZyhhKSx0aGlzLiRtYXJrZXJGcm9udC5zZXRQYWRkaW5nKGEpLHRoaXMuJG1hcmtlckJhY2suc2V0UGFkZGluZyhhKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpLHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCl9LHRoaXMuZ2V0SFNjcm9sbEJhckFsd2F5c1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaG9yaXpTY3JvbGxBbHdheXNWaXNpYmxlfSx0aGlzLnNldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlPWZ1bmN0aW9uKGEpe3RoaXMuJGhvcml6U2Nyb2xsQWx3YXlzVmlzaWJsZSE9YSYmKHRoaXMuJGhvcml6U2Nyb2xsQWx3YXlzVmlzaWJsZT1hLCghdGhpcy4kaG9yaXpTY3JvbGxBbHdheXNWaXNpYmxlfHwhdGhpcy4kaG9yaXpTY3JvbGwpJiZ0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1NDUk9MTCkpfSx0aGlzLiR1cGRhdGVTY3JvbGxCYXI9ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbEJhci5zZXRJbm5lckhlaWdodCh0aGlzLmxheWVyQ29uZmlnLm1heEhlaWdodCksdGhpcy5zY3JvbGxCYXIuc2V0U2Nyb2xsVG9wKHRoaXMuc2Nyb2xsVG9wKX0sdGhpcy4kcmVuZGVyQ2hhbmdlcz1mdW5jdGlvbihhKXtpZighYXx8IXRoaXMuc2Vzc2lvbilyZXR1cm47KGEmdGhpcy5DSEFOR0VfRlVMTHx8YSZ0aGlzLkNIQU5HRV9TSVpFfHxhJnRoaXMuQ0hBTkdFX1RFWFR8fGEmdGhpcy5DSEFOR0VfTElORVN8fGEmdGhpcy5DSEFOR0VfU0NST0xMKSYmdGhpcy4kY29tcHV0ZUxheWVyQ29uZmlnKCksYSZ0aGlzLkNIQU5HRV9IX1NDUk9MTCYmKHRoaXMuc2Nyb2xsZXIuc2Nyb2xsTGVmdD10aGlzLnNjcm9sbExlZnQpO2lmKGEmdGhpcy5DSEFOR0VfRlVMTCl7dGhpcy4kdGV4dExheWVyLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKSx0aGlzLiR1cGRhdGVTY3JvbGxCYXIoKSx0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpLHRoaXMuc2hvd0d1dHRlciYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpLHRoaXMuJG1hcmtlckJhY2sudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpLHRoaXMuJG1hcmtlckZyb250LnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKSx0aGlzLiRjdXJzb3JMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7cmV0dXJufWlmKGEmdGhpcy5DSEFOR0VfU0NST0xMKXt0aGlzLiR1cGRhdGVTY3JvbGxCYXIoKSxhJnRoaXMuQ0hBTkdFX1RFWFR8fGEmdGhpcy5DSEFOR0VfTElORVM/dGhpcy4kdGV4dExheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTp0aGlzLiR0ZXh0TGF5ZXIuc2Nyb2xsTGluZXModGhpcy5sYXllckNvbmZpZyksdGhpcy5zaG93R3V0dGVyJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyksdGhpcy4kbWFya2VyQmFjay51cGRhdGUodGhpcy5sYXllckNvbmZpZyksdGhpcy4kbWFya2VyRnJvbnQudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpLHRoaXMuJGN1cnNvckxheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTtyZXR1cm59YSZ0aGlzLkNIQU5HRV9URVhUPyh0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpLHRoaXMuc2hvd0d1dHRlciYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpKTphJnRoaXMuQ0hBTkdFX0xJTkVTP3RoaXMuJHVwZGF0ZUxpbmVzKCkmJih0aGlzLiR1cGRhdGVTY3JvbGxCYXIoKSx0aGlzLnNob3dHdXR0ZXImJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKSk6YSZ0aGlzLkNIQU5HRV9HVVRURVImJnRoaXMuc2hvd0d1dHRlciYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpLGEmdGhpcy5DSEFOR0VfQ1VSU09SJiZ0aGlzLiRjdXJzb3JMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyksYSYodGhpcy5DSEFOR0VfTUFSS0VSfHRoaXMuQ0hBTkdFX01BUktFUl9GUk9OVCkmJnRoaXMuJG1hcmtlckZyb250LnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKSxhJih0aGlzLkNIQU5HRV9NQVJLRVJ8dGhpcy5DSEFOR0VfTUFSS0VSX0JBQ0spJiZ0aGlzLiRtYXJrZXJCYWNrLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKSxhJnRoaXMuQ0hBTkdFX1NJWkUmJnRoaXMuJHVwZGF0ZVNjcm9sbEJhcigpfSx0aGlzLiRjb21wdXRlTGF5ZXJDb25maWc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlc3Npb24sYj10aGlzLnNjcm9sbFRvcCV0aGlzLmxpbmVIZWlnaHQsYz10aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0K3RoaXMubGluZUhlaWdodCxkPXRoaXMuJGdldExvbmdlc3RMaW5lKCksZT10aGlzLiRob3JpelNjcm9sbEFsd2F5c1Zpc2libGV8fHRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aC1kPDAsZj10aGlzLiRob3JpelNjcm9sbCE9PWU7dGhpcy4kaG9yaXpTY3JvbGw9ZSxmJiYodGhpcy5zY3JvbGxlci5zdHlsZS5vdmVyZmxvd1g9ZT8ic2Nyb2xsIjoiaGlkZGVuIixlfHx0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdCgwKSk7dmFyIGc9dGhpcy5zZXNzaW9uLmdldFNjcmVlbkxlbmd0aCgpKnRoaXMubGluZUhlaWdodDt0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKE1hdGgubWF4KDAsTWF0aC5taW4odGhpcy5zY3JvbGxUb3AsZy10aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0KSkpO3ZhciBoPU1hdGguY2VpbChjL3RoaXMubGluZUhlaWdodCktMSxpPU1hdGgubWF4KDAsTWF0aC5yb3VuZCgodGhpcy5zY3JvbGxUb3AtYikvdGhpcy5saW5lSGVpZ2h0KSksaj1pK2gsayxsLG09e2xpbmVIZWlnaHQ6dGhpcy5saW5lSGVpZ2h0fTtpPWEuc2NyZWVuVG9Eb2N1bWVudFJvdyhpLDApO3ZhciBuPWEuZ2V0Rm9sZExpbmUoaSk7biYmKGk9bi5zdGFydC5yb3cpLGs9YS5kb2N1bWVudFRvU2NyZWVuUm93KGksMCksbD1hLmdldFJvd0hlaWdodChtLGkpLGo9TWF0aC5taW4oYS5zY3JlZW5Ub0RvY3VtZW50Um93KGosMCksYS5nZXRMZW5ndGgoKS0xKSxjPXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQrYS5nZXRSb3dIZWlnaHQobSxqKStsLGI9dGhpcy5zY3JvbGxUb3Atayp0aGlzLmxpbmVIZWlnaHQsdGhpcy5sYXllckNvbmZpZz17d2lkdGg6ZCxwYWRkaW5nOnRoaXMuJHBhZGRpbmcsZmlyc3RSb3c6aSxmaXJzdFJvd1NjcmVlbjprLGxhc3RSb3c6aixsaW5lSGVpZ2h0OnRoaXMubGluZUhlaWdodCxjaGFyYWN0ZXJXaWR0aDp0aGlzLmNoYXJhY3RlcldpZHRoLG1pbkhlaWdodDpjLG1heEhlaWdodDpnLG9mZnNldDpiLGhlaWdodDp0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0fSx0aGlzLiRndXR0ZXJMYXllci5lbGVtZW50LnN0eWxlLm1hcmdpblRvcD0tYisicHgiLHRoaXMuY29udGVudC5zdHlsZS5tYXJnaW5Ub3A9LWIrInB4Iix0aGlzLmNvbnRlbnQuc3R5bGUud2lkdGg9ZCsyKnRoaXMuJHBhZGRpbmcrInB4Iix0aGlzLmNvbnRlbnQuc3R5bGUuaGVpZ2h0PWMrInB4IixmJiZ0aGlzLm9uUmVzaXplKCEwKX0sdGhpcy4kdXBkYXRlTGluZXM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRjaGFuZ2VkTGluZXMuZmlyc3RSb3csYj10aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdzt0aGlzLiRjaGFuZ2VkTGluZXM9bnVsbDt2YXIgYz10aGlzLmxheWVyQ29uZmlnO2lmKGMud2lkdGghPXRoaXMuJGdldExvbmdlc3RMaW5lKCkpcmV0dXJuIHRoaXMuJHRleHRMYXllci51cGRhdGUoYyk7aWYoYT5jLmxhc3RSb3crMSlyZXR1cm47aWYoYjxjLmZpcnN0Um93KXJldHVybjtpZihiPT09SW5maW5pdHkpe3RoaXMuc2hvd0d1dHRlciYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKGMpLHRoaXMuJHRleHRMYXllci51cGRhdGUoYyk7cmV0dXJufXJldHVybiB0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlTGluZXMoYyxhLGIpLCEwfSx0aGlzLiRnZXRMb25nZXN0TGluZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5XaWR0aCgpO3JldHVybiB0aGlzLiR0ZXh0TGF5ZXIuc2hvd0ludmlzaWJsZXMmJihhKz0xKSxNYXRoLm1heCh0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgtMip0aGlzLiRwYWRkaW5nLE1hdGgucm91bmQoYSp0aGlzLmNoYXJhY3RlcldpZHRoKSl9LHRoaXMudXBkYXRlRnJvbnRNYXJrZXJzPWZ1bmN0aW9uKCl7dGhpcy4kbWFya2VyRnJvbnQuc2V0TWFya2Vycyh0aGlzLnNlc3Npb24uZ2V0TWFya2VycyghMCkpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfTUFSS0VSX0ZST05UKX0sdGhpcy51cGRhdGVCYWNrTWFya2Vycz1mdW5jdGlvbigpe3RoaXMuJG1hcmtlckJhY2suc2V0TWFya2Vycyh0aGlzLnNlc3Npb24uZ2V0TWFya2VycygpKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX01BUktFUl9CQUNLKX0sdGhpcy5hZGRHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGEsYil7dGhpcy4kZ3V0dGVyTGF5ZXIuYWRkR3V0dGVyRGVjb3JhdGlvbihhLGIpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKX0sdGhpcy5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGEsYil7dGhpcy4kZ3V0dGVyTGF5ZXIucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbihhLGIpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKX0sdGhpcy5zZXRCcmVha3BvaW50cz1mdW5jdGlvbihhKXt0aGlzLiRndXR0ZXJMYXllci5zZXRCcmVha3BvaW50cyhhKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUil9LHRoaXMuc2V0QW5ub3RhdGlvbnM9ZnVuY3Rpb24oYSl7dGhpcy4kZ3V0dGVyTGF5ZXIuc2V0QW5ub3RhdGlvbnMoYSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpfSx0aGlzLnVwZGF0ZUN1cnNvcj1mdW5jdGlvbigpe3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfQ1VSU09SKX0sdGhpcy5oaWRlQ3Vyc29yPWZ1bmN0aW9uKCl7dGhpcy4kY3Vyc29yTGF5ZXIuaGlkZUN1cnNvcigpfSx0aGlzLnNob3dDdXJzb3I9ZnVuY3Rpb24oKXt0aGlzLiRjdXJzb3JMYXllci5zaG93Q3Vyc29yKCl9LHRoaXMuc2Nyb2xsQ3Vyc29ySW50b1ZpZXc9ZnVuY3Rpb24oKXtpZih0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0PT09MClyZXR1cm47dmFyIGE9dGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbigpLGI9YS5sZWZ0LGM9YS50b3A7dGhpcy5zY3JvbGxUb3A+YyYmdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChjKSx0aGlzLnNjcm9sbFRvcCt0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0PGMrdGhpcy5saW5lSGVpZ2h0JiZ0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKGMrdGhpcy5saW5lSGVpZ2h0LXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQpO3ZhciBkPXRoaXMuc2Nyb2xsTGVmdDtkPmImJihiPHRoaXMuJHBhZGRpbmcrMip0aGlzLmxheWVyQ29uZmlnLmNoYXJhY3RlcldpZHRoJiYoYj0wKSx0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdChiKSksZCt0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGg8Yit0aGlzLmNoYXJhY3RlcldpZHRoJiZ0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdChNYXRoLnJvdW5kKGIrdGhpcy5jaGFyYWN0ZXJXaWR0aC10aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgpKX0sdGhpcy5nZXRTY3JvbGxUb3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpfSx0aGlzLmdldFNjcm9sbExlZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldFNjcm9sbExlZnQoKX0sdGhpcy5nZXRTY3JvbGxUb3BSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY3JvbGxUb3AvdGhpcy5saW5lSGVpZ2h0fSx0aGlzLmdldFNjcm9sbEJvdHRvbVJvdz1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1heCgwLE1hdGguZmxvb3IoKHRoaXMuc2Nyb2xsVG9wK3RoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQpL3RoaXMubGluZUhlaWdodCktMSl9LHRoaXMuc2Nyb2xsVG9Sb3c9ZnVuY3Rpb24oYSl7dGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChhKnRoaXMubGluZUhlaWdodCl9LHRoaXMuc2Nyb2xsVG9MaW5lPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbih7cm93OmEsY29sdW1uOjB9KSxkPWMudG9wO2ImJihkLT10aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0LzIpLHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AoZCl9LHRoaXMuc2Nyb2xsVG9ZPWZ1bmN0aW9uKGEpe3RoaXMuc2Nyb2xsVG9wIT09YSYmKHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfU0NST0xMKSx0aGlzLnNjcm9sbFRvcD1hKX0sdGhpcy5zY3JvbGxUb1g9ZnVuY3Rpb24oYSl7YTw9dGhpcy4kcGFkZGluZyYmKGE9MCksdGhpcy5zY3JvbGxMZWZ0IT09YSYmKHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfSF9TQ1JPTEwpLHRoaXMuc2Nyb2xsTGVmdD1hKX0sdGhpcy5zY3JvbGxCeT1mdW5jdGlvbihhLGIpe2ImJnRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AodGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpK2IpLGEmJnRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxMZWZ0KCkrYSl9LHRoaXMuaXNTY3JvbGxhYmxlQnk9ZnVuY3Rpb24oYSxiKXtpZihiPDAmJnRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKT4wKXJldHVybiEwO2lmKGI+MCYmdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpK3RoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQ8dGhpcy5sYXllckNvbmZpZy5tYXhIZWlnaHQpcmV0dXJuITB9LHRoaXMuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLnNjcm9sbGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9TWF0aC5yb3VuZCgoYSt0aGlzLnNjcm9sbExlZnQtYy5sZWZ0LXRoaXMuJHBhZGRpbmctZS5nZXRQYWdlU2Nyb2xsTGVmdCgpKS90aGlzLmNoYXJhY3RlcldpZHRoKSxmPU1hdGguZmxvb3IoKGIrdGhpcy5zY3JvbGxUb3AtYy50b3AtZS5nZXRQYWdlU2Nyb2xsVG9wKCkpL3RoaXMubGluZUhlaWdodCk7cmV0dXJuIHRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZixNYXRoLm1heChkLDApKX0sdGhpcy50ZXh0VG9TY3JlZW5Db29yZGluYXRlcz1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKGEsYiksZT10aGlzLiRwYWRkaW5nK01hdGgucm91bmQoZC5jb2x1bW4qdGhpcy5jaGFyYWN0ZXJXaWR0aCksZj1kLnJvdyp0aGlzLmxpbmVIZWlnaHQ7cmV0dXJue3BhZ2VYOmMubGVmdCtlLXRoaXMuc2Nyb2xsTGVmdCxwYWdlWTpjLnRvcCtmLXRoaXMuc2Nyb2xsVG9wfX0sdGhpcy52aXN1YWxpemVGb2N1cz1mdW5jdGlvbigpe2UuYWRkQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsImFjZV9mb2N1cyIpfSx0aGlzLnZpc3VhbGl6ZUJsdXI9ZnVuY3Rpb24oKXtlLnJlbW92ZUNzc0NsYXNzKHRoaXMuY29udGFpbmVyLCJhY2VfZm9jdXMiKX0sdGhpcy5zaG93Q29tcG9zaXRpb249ZnVuY3Rpb24oYSl7dGhpcy4kY29tcG9zaXRpb258fCh0aGlzLiRjb21wb3NpdGlvbj1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuJGNvbXBvc2l0aW9uLmNsYXNzTmFtZT0iYWNlX2NvbXBvc2l0aW9uIix0aGlzLmNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy4kY29tcG9zaXRpb24pKSx0aGlzLiRjb21wb3NpdGlvbi5pbm5lckhUTUw9IiYjMTYwOyI7dmFyIGI9dGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbigpLGM9dGhpcy4kY29tcG9zaXRpb24uc3R5bGU7Yy50b3A9Yi50b3ArInB4IixjLmxlZnQ9Yi5sZWZ0K3RoaXMuJHBhZGRpbmcrInB4IixjLmhlaWdodD10aGlzLmxpbmVIZWlnaHQrInB4Iix0aGlzLmhpZGVDdXJzb3IoKX0sdGhpcy5zZXRDb21wb3NpdGlvblRleHQ9ZnVuY3Rpb24oYSl7ZS5zZXRJbm5lclRleHQodGhpcy4kY29tcG9zaXRpb24sYSl9LHRoaXMuaGlkZUNvbXBvc2l0aW9uPWZ1bmN0aW9uKCl7dGhpcy5zaG93Q3Vyc29yKCk7aWYoIXRoaXMuJGNvbXBvc2l0aW9uKXJldHVybjt2YXIgYT10aGlzLiRjb21wb3NpdGlvbi5zdHlsZTthLnRvcD0iLTEwMDAwcHgiLGEubGVmdD0iLTEwMDAwcHgifSx0aGlzLnNldFRoZW1lPWZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoYSl7ZS5pbXBvcnRDc3NTdHJpbmcoYS5jc3NUZXh0LGEuY3NzQ2xhc3MsYy5jb250YWluZXIub3duZXJEb2N1bWVudCksYy4kdGhlbWUmJmUucmVtb3ZlQ3NzQ2xhc3MoYy5jb250YWluZXIsYy4kdGhlbWUpLGMuJHRoZW1lPWE/YS5jc3NDbGFzczpudWxsLGMuJHRoZW1lJiZlLmFkZENzc0NsYXNzKGMuY29udGFpbmVyLGMuJHRoZW1lKSxhJiZhLmlzRGFyaz9lLmFkZENzc0NsYXNzKGMuY29udGFpbmVyLCJhY2VfZGFyayIpOmUucmVtb3ZlQ3NzQ2xhc3MoYy5jb250YWluZXIsImFjZV9kYXJrIiksYy4kc2l6ZSYmKGMuJHNpemUud2lkdGg9MCxjLm9uUmVzaXplKCkpfXZhciBjPXRoaXM7dGhpcy4kdGhlbWVWYWx1ZT1iLCFifHx0eXBlb2YgYj09InN0cmluZyI/KGI9Ynx8ImFjZS90aGVtZS90ZXh0bWF0ZSIsYShbYl0sZnVuY3Rpb24oYSl7ZChhKX0pKTpkKGIpfSx0aGlzLmdldFRoZW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRoZW1lVmFsdWV9LHRoaXMuc2V0U3R5bGU9ZnVuY3Rpb24oYil7ZS5hZGRDc3NDbGFzcyh0aGlzLmNvbnRhaW5lcixiKX0sdGhpcy51bnNldFN0eWxlPWZ1bmN0aW9uKGIpe2UucmVtb3ZlQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsYil9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuJHRleHRMYXllci5kZXN0cm95KCksdGhpcy4kY3Vyc29yTGF5ZXIuZGVzdHJveSgpfX0pKS5jYWxsKHAucHJvdG90eXBlKSxiLlZpcnR1YWxSZW5kZXJlcj1wfSksZGVmaW5lKCJhY2UvbGF5ZXIvZ3V0dGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL29vcCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpLGU9YSgiLi4vbGliL29vcCIpLGY9YSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsZz1mdW5jdGlvbihhKXt0aGlzLmVsZW1lbnQ9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfbGF5ZXIgYWNlX2d1dHRlci1sYXllciIsYS5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpLHRoaXMuc2V0U2hvd0ZvbGRXaWRnZXRzKHRoaXMuJHNob3dGb2xkV2lkZ2V0cyksdGhpcy5ndXR0ZXJXaWR0aD0wLHRoaXMuJGJyZWFrcG9pbnRzPVtdLHRoaXMuJGFubm90YXRpb25zPVtdLHRoaXMuJGRlY29yYXRpb25zPVtdfTsoKGZ1bmN0aW9uKCl7ZS5pbXBsZW1lbnQodGhpcyxmKSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oYSl7dGhpcy5zZXNzaW9uPWF9LHRoaXMuYWRkR3V0dGVyRGVjb3JhdGlvbj1mdW5jdGlvbihhLGIpe3RoaXMuJGRlY29yYXRpb25zW2FdfHwodGhpcy4kZGVjb3JhdGlvbnNbYV09IiIpLHRoaXMuJGRlY29yYXRpb25zW2FdKz0iIGFjZV8iK2J9LHRoaXMucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbj1mdW5jdGlvbihhLGIpe3RoaXMuJGRlY29yYXRpb25zW2FdPXRoaXMuJGRlY29yYXRpb25zW2FdLnJlcGxhY2UoIiBhY2VfIitiLCIiKX0sdGhpcy5zZXRCcmVha3BvaW50cz1mdW5jdGlvbihhKXt0aGlzLiRicmVha3BvaW50cz1hLmNvbmNhdCgpfSx0aGlzLnNldEFubm90YXRpb25zPWZ1bmN0aW9uKGEpe3RoaXMuJGFubm90YXRpb25zPVtdO2Zvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl07aWYoIWMpY29udGludWU7dmFyIGQ9dGhpcy4kYW5ub3RhdGlvbnNbYl09e3RleHQ6W119O2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdLGc9Zi50ZXh0LnJlcGxhY2UoLyIvZywiJnF1b3Q7IikucmVwbGFjZSgvJy9nLCImIzgyMTc7IikucmVwbGFjZSgvPC8sIiZsdDsiKTtkLnRleHQuaW5kZXhPZihnKT09PS0xJiZkLnRleHQucHVzaChnKTt2YXIgaD1mLnR5cGU7aD09ImVycm9yIj9kLmNsYXNzTmFtZT0iYWNlX2Vycm9yIjpoPT0id2FybmluZyImJmQuY2xhc3NOYW1lIT0iYWNlX2Vycm9yIj9kLmNsYXNzTmFtZT0iYWNlX3dhcm5pbmciOmg9PSJpbmZvIiYmIWQuY2xhc3NOYW1lJiYoZC5jbGFzc05hbWU9ImFjZV9pbmZvIil9fX0sdGhpcy51cGRhdGU9ZnVuY3Rpb24oYSl7dGhpcy4kY29uZmlnPWE7dmFyIGI9e2NsYXNzTmFtZToiIix0ZXh0OltdfSxjPVtdLGU9YS5maXJzdFJvdyxmPWEubGFzdFJvdyxnPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUoZSksaD1nP2cuc3RhcnQucm93OkluZmluaXR5LGk9dGhpcy4kc2hvd0ZvbGRXaWRnZXRzJiZ0aGlzLnNlc3Npb24uZm9sZFdpZGdldHM7Zm9yKDs7KXtlPmgmJihlPWcuZW5kLnJvdysxLGc9dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShlLGcpLGg9Zz9nLnN0YXJ0LnJvdzpJbmZpbml0eSk7aWYoZT5mKWJyZWFrO3ZhciBqPXRoaXMuJGFubm90YXRpb25zW2VdfHxiO2MucHVzaCgiPGRpdiBjbGFzcz0nYWNlX2d1dHRlci1jZWxsIix0aGlzLiRkZWNvcmF0aW9uc1tlXXx8IiIsdGhpcy4kYnJlYWtwb2ludHNbZV0/IiBhY2VfYnJlYWtwb2ludCAiOiIgIixqLmNsYXNzTmFtZSwiJyB0aXRsZT0nIixqLnRleHQuam9pbigiXG4iKSwiJyBzdHlsZT0naGVpZ2h0OiIsYS5saW5lSGVpZ2h0LCJweDsnPiIsZSsxKTtpZihpKXt2YXIgaz1pW2VdO2s9PW51bGwmJihrPWlbZV09dGhpcy5zZXNzaW9uLmdldEZvbGRXaWRnZXQoZSkpLGsmJmMucHVzaCgiPHNwYW4gY2xhc3M9J2FjZV9mb2xkLXdpZGdldCAiLGssaz09InN0YXJ0IiYmZT09aCYmZTxnLmVuZC5yb3c/IiBjbG9zZWQiOiIgb3BlbiIsIic+PC9zcGFuPiIpfXZhciBsPXRoaXMuc2Vzc2lvbi5nZXRSb3dMZW5ndGgoZSktMTt3aGlsZShsLS0pYy5wdXNoKCI8L2Rpdj48ZGl2IGNsYXNzPSdhY2VfZ3V0dGVyLWNlbGwnIHN0eWxlPSdoZWlnaHQ6IixhLmxpbmVIZWlnaHQsInB4Jz7CpiIpO2MucHVzaCgiPC9kaXY+IiksZSsrfXRoaXMuZWxlbWVudD1kLnNldElubmVySHRtbCh0aGlzLmVsZW1lbnQsYy5qb2luKCIiKSksdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodD1hLm1pbkhlaWdodCsicHgiO3ZhciBtPXRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aDttIT09dGhpcy5ndXR0ZXJXaWR0aCYmKHRoaXMuZ3V0dGVyV2lkdGg9bSx0aGlzLl9lbWl0KCJjaGFuZ2VHdXR0ZXJXaWR0aCIsbSkpfSx0aGlzLiRzaG93Rm9sZFdpZGdldHM9ITAsdGhpcy5zZXRTaG93Rm9sZFdpZGdldHM9ZnVuY3Rpb24oYSl7YT9kLmFkZENzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX2ZvbGRpbmctZW5hYmxlZCIpOmQucmVtb3ZlQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfZm9sZGluZy1lbmFibGVkIiksdGhpcy4kc2hvd0ZvbGRXaWRnZXRzPWF9LHRoaXMuZ2V0U2hvd0ZvbGRXaWRnZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNob3dGb2xkV2lkZ2V0c319KSkuY2FsbChnLnByb3RvdHlwZSksYi5HdXR0ZXI9Z30pLGRlZmluZSgiYWNlL2xheWVyL21hcmtlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9yYW5nZSIpLlJhbmdlLGU9YSgiLi4vbGliL2RvbSIpLGY9ZnVuY3Rpb24oYSl7dGhpcy5lbGVtZW50PWUuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmNsYXNzTmFtZT0iYWNlX2xheWVyIGFjZV9tYXJrZXItbGF5ZXIiLGEuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KX07KChmdW5jdGlvbigpe3RoaXMuJHBhZGRpbmc9MCx0aGlzLnNldFBhZGRpbmc9ZnVuY3Rpb24oYSl7dGhpcy4kcGFkZGluZz1hfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oYSl7dGhpcy5zZXNzaW9uPWF9LHRoaXMuc2V0TWFya2Vycz1mdW5jdGlvbihhKXt0aGlzLm1hcmtlcnM9YX0sdGhpcy51cGRhdGU9ZnVuY3Rpb24oYSl7dmFyIGE9YXx8dGhpcy5jb25maWc7aWYoIWEpcmV0dXJuO3RoaXMuY29uZmlnPWE7dmFyIGI9W107Zm9yKHZhciBjIGluIHRoaXMubWFya2Vycyl7dmFyIGQ9dGhpcy5tYXJrZXJzW2NdLGY9ZC5yYW5nZS5jbGlwUm93cyhhLmZpcnN0Um93LGEubGFzdFJvdyk7aWYoZi5pc0VtcHR5KCkpY29udGludWU7Zj1mLnRvU2NyZWVuUmFuZ2UodGhpcy5zZXNzaW9uKTtpZihkLnJlbmRlcmVyKXt2YXIgZz10aGlzLiRnZXRUb3AoZi5zdGFydC5yb3csYSksaD1NYXRoLnJvdW5kKHRoaXMuJHBhZGRpbmcrZi5zdGFydC5jb2x1bW4qYS5jaGFyYWN0ZXJXaWR0aCk7ZC5yZW5kZXJlcihiLGYsaCxnLGEpfWVsc2UgZi5pc011bHRpTGluZSgpP2QudHlwZT09InRleHQiP3RoaXMuZHJhd1RleHRNYXJrZXIoYixmLGQuY2xhenosYSk6dGhpcy5kcmF3TXVsdGlMaW5lTWFya2VyKGIsZixkLmNsYXp6LGEsZC50eXBlKTp0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyKGIsZixkLmNsYXp6LGEsbnVsbCxkLnR5cGUpfXRoaXMuZWxlbWVudD1lLnNldElubmVySHRtbCh0aGlzLmVsZW1lbnQsYi5qb2luKCIiKSl9LHRoaXMuJGdldFRvcD1mdW5jdGlvbihhLGIpe3JldHVybihhLWIuZmlyc3RSb3dTY3JlZW4pKmIubGluZUhlaWdodH0sdGhpcy5kcmF3VGV4dE1hcmtlcj1mdW5jdGlvbihhLGIsYyxlKXt2YXIgZj1iLnN0YXJ0LnJvdyxnPW5ldyBkKGYsYi5zdGFydC5jb2x1bW4sZix0aGlzLnNlc3Npb24uZ2V0U2NyZWVuTGFzdFJvd0NvbHVtbihmKSk7dGhpcy5kcmF3U2luZ2xlTGluZU1hcmtlcihhLGcsYyxlLDEsInRleHQiKSxmPWIuZW5kLnJvdyxnPW5ldyBkKGYsMCxmLGIuZW5kLmNvbHVtbiksdGhpcy5kcmF3U2luZ2xlTGluZU1hcmtlcihhLGcsYyxlLDAsInRleHQiKTtmb3IoZj1iLnN0YXJ0LnJvdysxO2Y8Yi5lbmQucm93O2YrKylnLnN0YXJ0LnJvdz1mLGcuZW5kLnJvdz1mLGcuZW5kLmNvbHVtbj10aGlzLnNlc3Npb24uZ2V0U2NyZWVuTGFzdFJvd0NvbHVtbihmKSx0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyKGEsZyxjLGUsMSwidGV4dCIpfSx0aGlzLmRyYXdNdWx0aUxpbmVNYXJrZXI9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1lPT09ImJhY2tncm91bmQiPzA6dGhpcy4kcGFkZGluZyxnPWQud2lkdGgrMip0aGlzLiRwYWRkaW5nLWYsaD1kLmxpbmVIZWlnaHQsaT1NYXRoLnJvdW5kKGctYi5zdGFydC5jb2x1bW4qZC5jaGFyYWN0ZXJXaWR0aCksaj10aGlzLiRnZXRUb3AoYi5zdGFydC5yb3csZCksaz1NYXRoLnJvdW5kKGYrYi5zdGFydC5jb2x1bW4qZC5jaGFyYWN0ZXJXaWR0aCk7YS5wdXNoKCI8ZGl2IGNsYXNzPSciLGMsIicgc3R5bGU9JyIsImhlaWdodDoiLGgsInB4OyIsIndpZHRoOiIsaSwicHg7IiwidG9wOiIsaiwicHg7IiwibGVmdDoiLGssInB4Oyc+PC9kaXY+Iiksaj10aGlzLiRnZXRUb3AoYi5lbmQucm93LGQpLGk9TWF0aC5yb3VuZChiLmVuZC5jb2x1bW4qZC5jaGFyYWN0ZXJXaWR0aCksYS5wdXNoKCI8ZGl2IGNsYXNzPSciLGMsIicgc3R5bGU9JyIsImhlaWdodDoiLGgsInB4OyIsIndpZHRoOiIsaSwicHg7IiwidG9wOiIsaiwicHg7IiwibGVmdDoiLGYsInB4Oyc+PC9kaXY+IiksaD0oYi5lbmQucm93LWIuc3RhcnQucm93LTEpKmQubGluZUhlaWdodDtpZihoPDApcmV0dXJuO2o9dGhpcy4kZ2V0VG9wKGIuc3RhcnQucm93KzEsZCksYS5wdXNoKCI8ZGl2IGNsYXNzPSciLGMsIicgc3R5bGU9JyIsImhlaWdodDoiLGgsInB4OyIsIndpZHRoOiIsZywicHg7IiwidG9wOiIsaiwicHg7IiwibGVmdDoiLGYsInB4Oyc+PC9kaXY+Iil9LHRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXI9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnPWY9PT0iYmFja2dyb3VuZCI/MDp0aGlzLiRwYWRkaW5nLGg9ZC5saW5lSGVpZ2h0O2lmKGY9PT0iYmFja2dyb3VuZCIpdmFyIGk9ZC53aWR0aDtlbHNlIGk9TWF0aC5yb3VuZCgoYi5lbmQuY29sdW1uKyhlfHwwKS1iLnN0YXJ0LmNvbHVtbikqZC5jaGFyYWN0ZXJXaWR0aCk7dmFyIGo9dGhpcy4kZ2V0VG9wKGIuc3RhcnQucm93LGQpLGs9TWF0aC5yb3VuZChnK2Iuc3RhcnQuY29sdW1uKmQuY2hhcmFjdGVyV2lkdGgpO2EucHVzaCgiPGRpdiBjbGFzcz0nIixjLCInIHN0eWxlPSciLCJoZWlnaHQ6IixoLCJweDsiLCJ3aWR0aDoiLGksInB4OyIsInRvcDoiLGosInB4OyIsImxlZnQ6IixrLCJweDsnPjwvZGl2PiIpfX0pKS5jYWxsKGYucHJvdG90eXBlKSxiLk1hcmtlcj1mfSksZGVmaW5lKCJhY2UvbGF5ZXIvdGV4dCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL3VzZXJhZ2VudCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2RvbSIpLGY9YSgiLi4vbGliL2xhbmciKSxnPWEoIi4uL2xpYi91c2VyYWdlbnQiKSxoPWEoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLGk9ZnVuY3Rpb24oYSl7dGhpcy5lbGVtZW50PWUuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmNsYXNzTmFtZT0iYWNlX2xheWVyIGFjZV90ZXh0LWxheWVyIixhLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCksdGhpcy4kY2hhcmFjdGVyU2l6ZT10aGlzLiRtZWFzdXJlU2l6ZXMoKXx8e3dpZHRoOjAsaGVpZ2h0OjB9LHRoaXMuJHBvbGxTaXplQ2hhbmdlcygpfTsoKGZ1bmN0aW9uKCl7ZC5pbXBsZW1lbnQodGhpcyxoKSx0aGlzLkVPRl9DSEFSPSLCtiIsdGhpcy5FT0xfQ0hBUj0iwqwiLHRoaXMuVEFCX0NIQVI9IuKGkiIsdGhpcy5TUEFDRV9DSEFSPSLCtyIsdGhpcy4kcGFkZGluZz0wLHRoaXMuc2V0UGFkZGluZz1mdW5jdGlvbihhKXt0aGlzLiRwYWRkaW5nPWEsdGhpcy5lbGVtZW50LnN0eWxlLnBhZGRpbmc9IjAgIithKyJweCJ9LHRoaXMuZ2V0TGluZUhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRjaGFyYWN0ZXJTaXplLmhlaWdodHx8MX0sdGhpcy5nZXRDaGFyYWN0ZXJXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRjaGFyYWN0ZXJTaXplLndpZHRofHwxfSx0aGlzLmNoZWNrRm9yU2l6ZUNoYW5nZXM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRtZWFzdXJlU2l6ZXMoKTthJiYodGhpcy4kY2hhcmFjdGVyU2l6ZS53aWR0aCE9PWEud2lkdGh8fHRoaXMuJGNoYXJhY3RlclNpemUuaGVpZ2h0IT09YS5oZWlnaHQpJiYodGhpcy4kY2hhcmFjdGVyU2l6ZT1hLHRoaXMuX2VtaXQoImNoYW5nZUNoYXJhY3RlclNpemUiLHtkYXRhOmF9KSl9LHRoaXMuJHBvbGxTaXplQ2hhbmdlcz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXI9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXthLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKX0sNTAwKX0sdGhpcy4kZm9udFN0eWxlcz17Zm9udEZhbWlseToxLGZvbnRTaXplOjEsZm9udFdlaWdodDoxLGZvbnRTdHlsZToxLGxpbmVIZWlnaHQ6MX0sdGhpcy4kbWVhc3VyZVNpemVzPWZ1bmN0aW9uKCl7dmFyIGE9MWUzO2lmKCF0aGlzLiRtZWFzdXJlTm9kZSl7dmFyIGI9dGhpcy4kbWVhc3VyZU5vZGU9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWIuc3R5bGU7Yy53aWR0aD1jLmhlaWdodD0iYXV0byIsYy5sZWZ0PWMudG9wPS1hKjQwKyJweCIsYy52aXNpYmlsaXR5PSJoaWRkZW4iLGMucG9zaXRpb249ImFic29sdXRlIixjLm92ZXJmbG93PSJ2aXNpYmxlIixjLndoaXRlU3BhY2U9Im5vd3JhcCIsYi5pbm5lckhUTUw9Zi5zdHJpbmdSZXBlYXQoIlh5IixhKTtpZih0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5ib2R5KXRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7ZWxzZXt2YXIgZD10aGlzLmVsZW1lbnQucGFyZW50Tm9kZTt3aGlsZSghZS5oYXNDc3NDbGFzcyhkLCJhY2VfZWRpdG9yIikpZD1kLnBhcmVudE5vZGU7ZC5hcHBlbmRDaGlsZChiKX19aWYoIXRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aClyZXR1cm4gbnVsbDt2YXIgYz10aGlzLiRtZWFzdXJlTm9kZS5zdHlsZSxnPWUuY29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnQpO2Zvcih2YXIgaCBpbiB0aGlzLiRmb250U3R5bGVzKWNbaF09Z1toXTt2YXIgaT17aGVpZ2h0OnRoaXMuJG1lYXN1cmVOb2RlLm9mZnNldEhlaWdodCx3aWR0aDp0aGlzLiRtZWFzdXJlTm9kZS5vZmZzZXRXaWR0aC8oYSoyKX07cmV0dXJuIGkud2lkdGg9PTAmJmkuaGVpZ2h0PT0wP251bGw6aX0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKGEpe3RoaXMuc2Vzc2lvbj1hfSx0aGlzLnNob3dJbnZpc2libGVzPSExLHRoaXMuc2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2hvd0ludmlzaWJsZXM9PWE/ITE6KHRoaXMuc2hvd0ludmlzaWJsZXM9YSwhMCl9LHRoaXMuJHRhYlN0cmluZ3M9W10sdGhpcy4kY29tcHV0ZVRhYlN0cmluZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc2Vzc2lvbi5nZXRUYWJTaXplKCksYj10aGlzLiR0YWJTdHJpbmdzPVswXTtmb3IodmFyIGM9MTtjPGErMTtjKyspdGhpcy5zaG93SW52aXNpYmxlcz9iLnB1c2goIjxzcGFuIGNsYXNzPSdhY2VfaW52aXNpYmxlJz4iK3RoaXMuVEFCX0NIQVIrKG5ldyBBcnJheShjKSkuam9pbigiJiMxNjA7IikrIjwvc3Bhbj4iKTpiLnB1c2goKG5ldyBBcnJheShjKzEpKS5qb2luKCImIzE2MDsiKSl9LHRoaXMudXBkYXRlTGluZXM9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJGNvbXB1dGVUYWJTdHJpbmcoKSwodGhpcy5jb25maWcubGFzdFJvdyE9YS5sYXN0Um93fHx0aGlzLmNvbmZpZy5maXJzdFJvdyE9YS5maXJzdFJvdykmJnRoaXMuc2Nyb2xsTGluZXMoYSksdGhpcy5jb25maWc9YTt2YXIgZD1NYXRoLm1heChiLGEuZmlyc3RSb3cpLGY9TWF0aC5taW4oYyxhLmxhc3RSb3cpLGc9dGhpcy5lbGVtZW50LmNoaWxkTm9kZXMsaD0wO2Zvcih2YXIgaT1hLmZpcnN0Um93O2k8ZDtpKyspe3ZhciBqPXRoaXMuc2Vzc2lvbi5nZXRGb2xkTGluZShpKTtpZihqKXtpZihqLmNvbnRhaW5zUm93KGQpKXtkPWouc3RhcnQucm93O2JyZWFrfWk9ai5lbmQucm93fWgrK31mb3IodmFyIGs9ZDtrPD1mO2srKyl7dmFyIGw9Z1toKytdO2lmKCFsKWNvbnRpbnVlO3ZhciBtPVtdLG49dGhpcy5zZXNzaW9uLmdldFRva2VucyhrLGspO3RoaXMuJHJlbmRlckxpbmUobSxrLG5bMF0udG9rZW5zLCF0aGlzLiR1c2VMaW5lR3JvdXBzKCkpLGw9ZS5zZXRJbm5lckh0bWwobCxtLmpvaW4oIiIpKSxrPXRoaXMuc2Vzc2lvbi5nZXRSb3dGb2xkRW5kKGspfX0sdGhpcy5zY3JvbGxMaW5lcz1mdW5jdGlvbihhKXt0aGlzLiRjb21wdXRlVGFiU3RyaW5nKCk7dmFyIGI9dGhpcy5jb25maWc7dGhpcy5jb25maWc9YTtpZighYnx8Yi5sYXN0Um93PGEuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGEpO2lmKGEubGFzdFJvdzxiLmZpcnN0Um93KXJldHVybiB0aGlzLnVwZGF0ZShhKTt2YXIgYz10aGlzLmVsZW1lbnQ7aWYoYi5maXJzdFJvdzxhLmZpcnN0Um93KWZvcih2YXIgZD10aGlzLnNlc3Npb24uZ2V0Rm9sZGVkUm93Q291bnQoYi5maXJzdFJvdyxhLmZpcnN0Um93LTEpO2Q+MDtkLS0pYy5yZW1vdmVDaGlsZChjLmZpcnN0Q2hpbGQpO2lmKGIubGFzdFJvdz5hLmxhc3RSb3cpZm9yKHZhciBkPXRoaXMuc2Vzc2lvbi5nZXRGb2xkZWRSb3dDb3VudChhLmxhc3RSb3crMSxiLmxhc3RSb3cpO2Q+MDtkLS0pYy5yZW1vdmVDaGlsZChjLmxhc3RDaGlsZCk7aWYoYS5maXJzdFJvdzxiLmZpcnN0Um93KXt2YXIgZT10aGlzLiRyZW5kZXJMaW5lc0ZyYWdtZW50KGEsYS5maXJzdFJvdyxiLmZpcnN0Um93LTEpO2MuZmlyc3RDaGlsZD9jLmluc2VydEJlZm9yZShlLGMuZmlyc3RDaGlsZCk6Yy5hcHBlbmRDaGlsZChlKX1pZihhLmxhc3RSb3c+Yi5sYXN0Um93KXt2YXIgZT10aGlzLiRyZW5kZXJMaW5lc0ZyYWdtZW50KGEsYi5sYXN0Um93KzEsYS5sYXN0Um93KTtjLmFwcGVuZENoaWxkKGUpfX0sdGhpcy4kcmVuZGVyTGluZXNGcmFnbWVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGY9YixnPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUoZiksaD1nP2cuc3RhcnQucm93OkluZmluaXR5O2Zvcig7Oyl7Zj5oJiYoZj1nLmVuZC5yb3crMSxnPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUoZixnKSxoPWc/Zy5zdGFydC5yb3c6SW5maW5pdHkpO2lmKGY+YylicmVhazt2YXIgaT1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGo9W10saz10aGlzLnNlc3Npb24uZ2V0VG9rZW5zKGYsZik7ay5sZW5ndGg9PTEmJnRoaXMuJHJlbmRlckxpbmUoaixmLGtbMF0udG9rZW5zLCExKSxpLmlubmVySFRNTD1qLmpvaW4oIiIpO2lmKHRoaXMuJHVzZUxpbmVHcm91cHMoKSlpLmNsYXNzTmFtZT0iYWNlX2xpbmVfZ3JvdXAiLGQuYXBwZW5kQ2hpbGQoaSk7ZWxzZXt2YXIgbD1pLmNoaWxkTm9kZXM7d2hpbGUobC5sZW5ndGgpZC5hcHBlbmRDaGlsZChsWzBdKX1mKyt9cmV0dXJuIGR9LHRoaXMudXBkYXRlPWZ1bmN0aW9uKGEpe3RoaXMuJGNvbXB1dGVUYWJTdHJpbmcoKSx0aGlzLmNvbmZpZz1hO3ZhciBiPVtdLGM9YS5maXJzdFJvdyxkPWEubGFzdFJvdyxmPWMsZz10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKGYpLGg9Zz9nLnN0YXJ0LnJvdzpJbmZpbml0eTtmb3IoOzspe2Y+aCYmKGY9Zy5lbmQucm93KzEsZz10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKGYsZyksaD1nP2cuc3RhcnQucm93OkluZmluaXR5KTtpZihmPmQpYnJlYWs7dGhpcy4kdXNlTGluZUdyb3VwcygpJiZiLnB1c2goIjxkaXYgY2xhc3M9J2FjZV9saW5lX2dyb3VwJz4iKTt2YXIgaT10aGlzLnNlc3Npb24uZ2V0VG9rZW5zKGYsZik7aS5sZW5ndGg9PTEmJnRoaXMuJHJlbmRlckxpbmUoYixmLGlbMF0udG9rZW5zLCExKSx0aGlzLiR1c2VMaW5lR3JvdXBzKCkmJmIucHVzaCgiPC9kaXY+IiksZisrfXRoaXMuZWxlbWVudD1lLnNldElubmVySHRtbCh0aGlzLmVsZW1lbnQsYi5qb2luKCIiKSl9LHRoaXMuJHRleHRUb2tlbj17dGV4dDohMCxycGFyZW46ITAsbHBhcmVuOiEwfSx0aGlzLiRyZW5kZXJUb2tlbj1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLGY9L1x0fCZ8PHwoICspfChbXHZcZiBcdTAwYTBcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMGJcdTIwMjhcdTIwMjlcdTMwMDBdKXxbXHUxMTAwLVx1MTE1Rl18W1x1MTFBMy1cdTExQTddfFtcdTExRkEtXHUxMUZGXXxbXHUyMzI5LVx1MjMyQV18W1x1MkU4MC1cdTJFOTldfFtcdTJFOUItXHUyRUYzXXxbXHUyRjAwLVx1MkZENV18W1x1MkZGMC1cdTJGRkJdfFtcdTMwMDAtXHUzMDNFXXxbXHUzMDQxLVx1MzA5Nl18W1x1MzA5OS1cdTMwRkZdfFtcdTMxMDUtXHUzMTJEXXxbXHUzMTMxLVx1MzE4RV18W1x1MzE5MC1cdTMxQkFdfFtcdTMxQzAtXHUzMUUzXXxbXHUzMUYwLVx1MzIxRV18W1x1MzIyMC1cdTMyNDddfFtcdTMyNTAtXHUzMkZFXXxbXHUzMzAwLVx1NERCRl18W1x1NEUwMC1cdUE0OENdfFtcdUE0OTAtXHVBNEM2XXxbXHVBOTYwLVx1QTk3Q118W1x1QUMwMC1cdUQ3QTNdfFtcdUQ3QjAtXHVEN0M2XXxbXHVEN0NCLVx1RDdGQl18W1x1RjkwMC1cdUZBRkZdfFtcdUZFMTAtXHVGRTE5XXxbXHVGRTMwLVx1RkU1Ml18W1x1RkU1NC1cdUZFNjZdfFtcdUZFNjgtXHVGRTZCXXxbXHVGRjAxLVx1RkY2MF18W1x1RkZFMC1cdUZGRTZdL2csaD1mdW5jdGlvbihhLGMsZCxmLGgpe2lmKGEuY2hhckNvZGVBdCgwKT09MzIpcmV0dXJuKG5ldyBBcnJheShhLmxlbmd0aCsxKSkuam9pbigiJiMxNjA7Iik7aWYoYT09Ilx0Iil7dmFyIGk9ZS5zZXNzaW9uLmdldFNjcmVlblRhYlNpemUoYitmKTtyZXR1cm4gYis9aS0xLGUuJHRhYlN0cmluZ3NbaV19aWYoYT09IiYiKXJldHVybiBnLmlzT2xkR2Vja28/IiYiOiImYW1wOyI7aWYoYT09IjwiKXJldHVybiImbHQ7IjtpZihhPT0i44CAIil7dmFyIGo9ZS5zaG93SW52aXNpYmxlcz8iYWNlX2NqayBhY2VfaW52aXNpYmxlIjoiYWNlX2NqayIsaz1lLnNob3dJbnZpc2libGVzP2UuU1BBQ0VfQ0hBUjoiIjtyZXR1cm4gYis9MSwiPHNwYW4gY2xhc3M9JyIraisiJyBzdHlsZT0nd2lkdGg6IitlLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCoyKyJweCc+IitrKyI8L3NwYW4+In1pZihhLm1hdGNoKC9bXHZcZiBcdTAwYTBcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMGJcdTIwMjhcdTIwMjlcdTMwMDBdLykpe2lmKGUuc2hvd0ludmlzaWJsZXMpe3ZhciBrPShuZXcgQXJyYXkoYS5sZW5ndGgrMSkpLmpvaW4oZS5TUEFDRV9DSEFSKTtyZXR1cm4iPHNwYW4gY2xhc3M9J2FjZV9pbnZpc2libGUnPiIraysiPC9zcGFuPiJ9cmV0dXJuIiYjMTYwOyJ9cmV0dXJuIGIrPTEsIjxzcGFuIGNsYXNzPSdhY2VfY2prJyBzdHlsZT0nd2lkdGg6IitlLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCoyKyJweCc+IithKyI8L3NwYW4+In0saT1kLnJlcGxhY2UoZixoKTtpZighdGhpcy4kdGV4dFRva2VuW2MudHlwZV0pe3ZhciBqPSJhY2VfIitjLnR5cGUucmVwbGFjZSgvXC4vZywiIGFjZV8iKSxrPSIiO2MudHlwZT09ImZvbGQiJiYoaz0iIHN0eWxlPSd3aWR0aDoiK2MudmFsdWUubGVuZ3RoKnRoaXMuY29uZmlnLmNoYXJhY3RlcldpZHRoKyJweDsnICIpLGEucHVzaCgiPHNwYW4gY2xhc3M9JyIsaiwiJyIsaywiPiIsaSwiPC9zcGFuPiIpfWVsc2UgYS5wdXNoKGkpO3JldHVybiBiK2QubGVuZ3RofSx0aGlzLiRyZW5kZXJMaW5lQ29yZT1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPTAsZz0wLGgsaT0wLGo9dGhpczshZHx8ZC5sZW5ndGg9PTA/aD1OdW1iZXIuTUFYX1ZBTFVFOmg9ZFswXSxlfHxhLnB1c2goIjxkaXYgY2xhc3M9J2FjZV9saW5lJyBzdHlsZT0naGVpZ2h0OiIsdGhpcy5jb25maWcubGluZUhlaWdodCwicHgiLCInPiIpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKXt2YXIgbD1jW2tdLG09bC52YWx1ZTtpZihmK20ubGVuZ3RoPGgpaT1qLiRyZW5kZXJUb2tlbihhLGksbCxtKSxmKz1tLmxlbmd0aDtlbHNle3doaWxlKGYrbS5sZW5ndGg+PWgpaT1qLiRyZW5kZXJUb2tlbihhLGksbCxtLnN1YnN0cmluZygwLGgtZikpLG09bS5zdWJzdHJpbmcoaC1mKSxmPWgsZXx8YS5wdXNoKCI8L2Rpdj4iLCI8ZGl2IGNsYXNzPSdhY2VfbGluZScgc3R5bGU9J2hlaWdodDoiLHRoaXMuY29uZmlnLmxpbmVIZWlnaHQsInB4IiwiJz4iKSxnKyssaT0wLGg9ZFtnXXx8TnVtYmVyLk1BWF9WQUxVRTttLmxlbmd0aCE9MCYmKGYrPW0ubGVuZ3RoLGk9ai4kcmVuZGVyVG9rZW4oYSxpLGwsbSkpfX10aGlzLnNob3dJbnZpc2libGVzJiYoYiE9PXRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKS0xP2EucHVzaCgiPHNwYW4gY2xhc3M9J2FjZV9pbnZpc2libGUnPiIrdGhpcy5FT0xfQ0hBUisiPC9zcGFuPiIpOmEucHVzaCgiPHNwYW4gY2xhc3M9J2FjZV9pbnZpc2libGUnPiIrdGhpcy5FT0ZfQ0hBUisiPC9zcGFuPiIpKSxlfHxhLnB1c2goIjwvZGl2PiIpfSx0aGlzLiRyZW5kZXJMaW5lPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCF0aGlzLnNlc3Npb24uaXNSb3dGb2xkZWQoYikpe3ZhciBlPXRoaXMuc2Vzc2lvbi5nZXRSb3dTcGxpdERhdGEoYik7dGhpcy4kcmVuZGVyTGluZUNvcmUoYSxiLGMsZSxkKX1lbHNlIHRoaXMuJHJlbmRlckZvbGRMaW5lKGEsYixjLGQpfSx0aGlzLiRyZW5kZXJGb2xkTGluZT1mdW5jdGlvbihhLGIsYyxkKXtmdW5jdGlvbiBoKGEsYixjKXt2YXIgZD0wLGU9MDt3aGlsZShlK2FbZF0udmFsdWUubGVuZ3RoPGIpe2UrPWFbZF0udmFsdWUubGVuZ3RoLGQrKztpZihkPT1hLmxlbmd0aClyZXR1cm59aWYoZSE9Yil7dmFyIGY9YVtkXS52YWx1ZS5zdWJzdHJpbmcoYi1lKTtmLmxlbmd0aD5jLWImJihmPWYuc3Vic3RyaW5nKDAsYy1iKSksZy5wdXNoKHt0eXBlOmFbZF0udHlwZSx2YWx1ZTpmfSksZT1iK2YubGVuZ3RoLGQrPTF9d2hpbGUoZTxjKXt2YXIgZj1hW2RdLnZhbHVlO2YubGVuZ3RoK2U+YyYmKGY9Zi5zdWJzdHJpbmcoMCxjLWUpKSxnLnB1c2goe3R5cGU6YVtkXS50eXBlLHZhbHVlOmZ9KSxlKz1mLmxlbmd0aCxkKz0xfX12YXIgZT10aGlzLnNlc3Npb24sZj1lLmdldEZvbGRMaW5lKGIpLGc9W107Zi53YWxrKGZ1bmN0aW9uKGEsYixkLGUsZil7YT9nLnB1c2goe3R5cGU6ImZvbGQiLHZhbHVlOmF9KTooZiYmKGM9dGhpcy5zZXNzaW9uLmdldFRva2VucyhiLGIpWzBdLnRva2VucyksYy5sZW5ndGghPTAmJmgoYyxlLGQpKX0uYmluZCh0aGlzKSxmLmVuZC5yb3csdGhpcy5zZXNzaW9uLmdldExpbmUoZi5lbmQucm93KS5sZW5ndGgpO3ZhciBpPXRoaXMuc2Vzc2lvbi4kdXNlV3JhcE1vZGU/dGhpcy5zZXNzaW9uLiR3cmFwRGF0YVtiXTpudWxsO3RoaXMuJHJlbmRlckxpbmVDb3JlKGEsYixnLGksZCl9LHRoaXMuJHVzZUxpbmVHcm91cHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCl9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwodGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXIpLHRoaXMuJG1lYXN1cmVOb2RlJiZ0aGlzLiRtZWFzdXJlTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuJG1lYXN1cmVOb2RlKSxkZWxldGUgdGhpcy4kbWVhc3VyZU5vZGV9fSkpLmNhbGwoaS5wcm90b3R5cGUpLGIuVGV4dD1pfSksZGVmaW5lKCJhY2UvbGF5ZXIvY3Vyc29yIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9kb20iKSxlPWZ1bmN0aW9uKGEpe3RoaXMuZWxlbWVudD1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9sYXllciBhY2VfY3Vyc29yLWxheWVyIixhLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCksdGhpcy5jdXJzb3I9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmN1cnNvci5jbGFzc05hbWU9ImFjZV9jdXJzb3IgYWNlX2hpZGRlbiIsdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY3Vyc29yKSx0aGlzLmlzVmlzaWJsZT0hMX07KChmdW5jdGlvbigpe3RoaXMuJHBhZGRpbmc9MCx0aGlzLnNldFBhZGRpbmc9ZnVuY3Rpb24oYSl7dGhpcy4kcGFkZGluZz1hfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oYSl7dGhpcy5zZXNzaW9uPWF9LHRoaXMuaGlkZUN1cnNvcj1mdW5jdGlvbigpe3RoaXMuaXNWaXNpYmxlPSExLGQuYWRkQ3NzQ2xhc3ModGhpcy5jdXJzb3IsImFjZV9oaWRkZW4iKSxjbGVhckludGVydmFsKHRoaXMuYmxpbmtJZCl9LHRoaXMuc2hvd0N1cnNvcj1mdW5jdGlvbigpe3RoaXMuaXNWaXNpYmxlPSEwLGQucmVtb3ZlQ3NzQ2xhc3ModGhpcy5jdXJzb3IsImFjZV9oaWRkZW4iKSx0aGlzLmN1cnNvci5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIix0aGlzLnJlc3RhcnRUaW1lcigpfSx0aGlzLnJlc3RhcnRUaW1lcj1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwodGhpcy5ibGlua0lkKTtpZighdGhpcy5pc1Zpc2libGUpcmV0dXJuO3ZhciBhPXRoaXMuY3Vyc29yO3RoaXMuYmxpbmtJZD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2Euc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIixzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIn0sNDAwKX0sMWUzKX0sdGhpcy5nZXRQaXhlbFBvc2l0aW9uPWZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuY29uZmlnfHwhdGhpcy5zZXNzaW9uKXJldHVybntsZWZ0OjAsdG9wOjB9O2F8fChhPXRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCkpO3ZhciBjPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oYSksZD1NYXRoLnJvdW5kKHRoaXMuJHBhZGRpbmcrYy5jb2x1bW4qdGhpcy5jb25maWcuY2hhcmFjdGVyV2lkdGgpLGU9KGMucm93LShiP3RoaXMuY29uZmlnLmZpcnN0Um93U2NyZWVuOjApKSp0aGlzLmNvbmZpZy5saW5lSGVpZ2h0O3JldHVybntsZWZ0OmQsdG9wOmV9fSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLmNvbmZpZz1hLHRoaXMucGl4ZWxQb3M9dGhpcy5nZXRQaXhlbFBvc2l0aW9uKG51bGwsITApLHRoaXMuY3Vyc29yLnN0eWxlLmxlZnQ9dGhpcy5waXhlbFBvcy5sZWZ0KyJweCIsdGhpcy5jdXJzb3Iuc3R5bGUudG9wPXRoaXMucGl4ZWxQb3MudG9wKyJweCIsdGhpcy5jdXJzb3Iuc3R5bGUud2lkdGg9YS5jaGFyYWN0ZXJXaWR0aCsicHgiLHRoaXMuY3Vyc29yLnN0eWxlLmhlaWdodD1hLmxpbmVIZWlnaHQrInB4Ijt2YXIgYj10aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCk7YiE9dGhpcy5vdmVyd3JpdGUmJih0aGlzLm92ZXJ3cml0ZT1iLGI/ZC5hZGRDc3NDbGFzcyh0aGlzLmN1cnNvciwiYWNlX292ZXJ3cml0ZSIpOmQucmVtb3ZlQ3NzQ2xhc3ModGhpcy5jdXJzb3IsImFjZV9vdmVyd3JpdGUiKSksdGhpcy5yZXN0YXJ0VGltZXIoKX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbCh0aGlzLmJsaW5rSWQpfX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLkN1cnNvcj1lfSksZGVmaW5lKCJhY2Uvc2Nyb2xsYmFyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4vbGliL29vcCIpLGU9YSgiLi9saWIvZG9tIiksZj1hKCIuL2xpYi9ldmVudCIpLGc9YSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixoPWZ1bmN0aW9uKGEpe3RoaXMuZWxlbWVudD1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9zYiIsdGhpcy5pbm5lcj1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmlubmVyKSxhLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCksdGhpcy53aWR0aD1lLnNjcm9sbGJhcldpZHRoKGEub3duZXJEb2N1bWVudCksdGhpcy5lbGVtZW50LnN0eWxlLndpZHRoPSh0aGlzLndpZHRofHwxNSkrNSsicHgiLGYuYWRkTGlzdGVuZXIodGhpcy5lbGVtZW50LCJzY3JvbGwiLHRoaXMub25TY3JvbGwuYmluZCh0aGlzKSl9OygoZnVuY3Rpb24oKXtkLmltcGxlbWVudCh0aGlzLGcpLHRoaXMub25TY3JvbGw9ZnVuY3Rpb24oKXt0aGlzLl9lbWl0KCJzY3JvbGwiLHtkYXRhOnRoaXMuZWxlbWVudC5zY3JvbGxUb3B9KX0sdGhpcy5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLndpZHRofSx0aGlzLnNldEhlaWdodD1mdW5jdGlvbihhKXt0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0PWErInB4In0sdGhpcy5zZXRJbm5lckhlaWdodD1mdW5jdGlvbihhKXt0aGlzLmlubmVyLnN0eWxlLmhlaWdodD1hKyJweCJ9LHRoaXMuc2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKGEpe3RoaXMuZWxlbWVudC5zY3JvbGxUb3A9YX19KSkuY2FsbChoLnByb3RvdHlwZSksYi5TY3JvbGxCYXI9aH0pLGRlZmluZSgiYWNlL3JlbmRlcmxvb3AiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50Il0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuL2xpYi9ldmVudCIpLGU9ZnVuY3Rpb24oYSxiKXt0aGlzLm9uUmVuZGVyPWEsdGhpcy5wZW5kaW5nPSExLHRoaXMuY2hhbmdlcz0wLHRoaXMud2luZG93PWJ8fHdpbmRvd307KChmdW5jdGlvbigpe3RoaXMuc2NoZWR1bGU9ZnVuY3Rpb24oYSl7dGhpcy5jaGFuZ2VzPXRoaXMuY2hhbmdlc3xhO2lmKCF0aGlzLnBlbmRpbmcpe3RoaXMucGVuZGluZz0hMDt2YXIgYj10aGlzO2QubmV4dFRpY2soZnVuY3Rpb24oKXtiLnBlbmRpbmc9ITE7dmFyIGE7d2hpbGUoYT1iLmNoYW5nZXMpYi5jaGFuZ2VzPTAsYi5vblJlbmRlcihhKX0sdGhpcy53aW5kb3cpfX19KSkuY2FsbChlLnByb3RvdHlwZSksYi5SZW5kZXJMb29wPWV9KSxkZWZpbmUoInRleHQhYWNlL2Nzcy9lZGl0b3IuY3NzIixbXSwiQGltcG9ydCB1cmwoLy9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PURyb2lkK1NhbnMrTW9ubyk7XG5cblxuLmFjZV9lZGl0b3Ige1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGZvbnQtZmFtaWx5OiAnTW9uYWNvJywgJ01lbmxvJywgJ1VidW50dSBNb25vJywgJ0Ryb2lkIFNhbnMgTW9ubycsICdDb25zb2xhcycsIG1vbm9zcGFjZTtcbiAgICBmb250LXNpemU6IDEycHg7XG59XG5cbi5hY2Vfc2Nyb2xsZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBvdmVyZmxvdy14OiBzY3JvbGw7XG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xufVxuXG4uYWNlX2NvbnRlbnQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgY3Vyc29yOiB0ZXh0O1xufVxuXG4uYWNlX2NvbXBvc2l0aW9uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgYmFja2dyb3VuZDogIzU1NTtcbiAgICBjb2xvcjogI0RERDtcbiAgICB6LWluZGV4OiA0O1xufVxuXG4uYWNlX2d1dHRlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIG92ZXJmbG93IDogaGlkZGVuO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogYXV0bztcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi5hY2VfZ3V0dGVyLWNlbGwge1xuICAgIHBhZGRpbmctbGVmdDogMTlweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiA2cHg7XG59XG5cbi5hY2VfZ3V0dGVyLWNlbGwuYWNlX2Vycm9yIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL2dpZixHSUY4OWElMTAlMDAlMTAlMDAlRDUlMDAlMDAlRjVvciVGNSU4NyU4OCVGNW5yJUY0bnMlRUJtcSVGNXolN0YlRERKVCVERUtTJURGT1clRjFZYyVGMmFoJUNFKDclQ0UpOCVEMThFJUREJTQwTSVGMktaJUVCVSU2MCVGNCU2MG0lRENpciVDOCUxNiglQzglMTkqJUNFJTI1NSVGMSUzRlIlRjElM0ZTJUU2JUFCJUI1JUNBJTVESSVDRW4lNUUlRjclQTIlOUElQzlHJTNFJUUwYSU1QiVGNyU4OSU4NSVGNXl5JUY2JTgyJTgwJUVEJTgyJTgwJUZGJUJGJUJGJUUzJUM0JUM0JUZGJUZGJUZGJUZGJUZGJUZGJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwISVGOSUwNCUwMSUwMCUwMCUyNSUwMCUyQyUwMCUwMCUwMCUwMCUxMCUwMCUxMCUwMCUwMCUwNnAlQzAlOTJwSCUyQyUxQSU4RiVDOCVEMkglOTMlRTFkNCUyMyVFNCU4OCVEMyUwOW1CJTFETiVCNDglRjUlOTAlNDAlNjAlOTJHJTVCJTk0JTIwJTNFJTIyJUQyJTg3JTI0JUZBJTIwJTI0JUM1JTA2QSUwMCUyMCVCMSUwNyUwMkIlQTM4JTg5WC52JTE3JTgyJTExJTEzcSUxMCUwRmklMjQlMEYlOEIlMTAlN0JEJTEyJTBFaSUwOSU5MiUwOSUwRXBEJTE4JTE1JTI0JTBBJTlDaSUwNSUwQyUxOEYlMTglMEIlMDclMDQlMDElMDQlMDYlQTBIJTE4JTEyJTBEJTE0JTBEJTEyJUExSSVCMyVCNCVCNUlBJTAwJTNCXCIpO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMnB4IGNlbnRlcjtcbn1cblxuLmFjZV9ndXR0ZXItY2VsbC5hY2Vfd2FybmluZyB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9naWYsR0lGODlhJTEwJTAwJTEwJTAwJUQ1JTAwJTAwJUZGJURCciVGRiVERSU4MSVGRiVFMiU4RCVGRiVFMiU4RiVGRiVFNCU5NiVGRiVFMyU5NyVGRiVFNSU5RCVGRiVFNiU5RSVGRiVFRSVDMSVGRiVDOFolRkYlQ0RrJUZGJUQwcyVGRiVENCU4MSVGRiVENSU4MiVGRiVENSU4MyVGRiVEQyU5NyVGRiVERSU5RCVGRiVFNyVCOCVGRiVDQ2wlN0JRJTEzJTgwVSUxNSU4MlclMTYlODFVJTE2JTg5JTVCJTE4JTg3JTVCJTE4JThDJTVFJTFBJTk0ZCUxRCVDNSU4My0lQzklODclMkYlQzYlODQuJUM2JTg1LiVDRCU4QjIlQzklODcxJUNCJThBMyVDRCU4QjUlREMlOTglM0YlREYlOUJCJUUwJTlDQyVFMSVBNVUlQ0IlODcxJUNGJThCNSVEMSU4RDYlREIlOTclNDAlREYlOUFCJUREJTk5QiVFMyVCMHAlRTclQ0MlQUUlRkYlRkYlRkYlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAhJUY5JTA0JTAxJTAwJTAwJTJGJTAwJTJDJTAwJTAwJTAwJTAwJTEwJTAwJTEwJTAwJTAwJTA2YSVDMCU5N3BIJTJDJTFBJThGSCVBMSVBQlRyJTI1JTg3JTJCJTA0JTgyJUY0JTdDJUI5WCU5MSUwOCVDQiU5OSUxQyElMjYlMTMlODQqaUo5KCUxNUclQ0ElODQlMTQlMDElMUElOTclMEMlMDMlODAlM0ElOUElM0UlODElODQlM0UlMTElMDglQjElOEIlMjAlMDIlMTIlMEYlMTglMUElMEYlMEElMDMnRiUxQyUwNCUwQiUxMCUxNiUxOCUxMCUwQiUwNSUxQ0YlMUQtJTA2JTA3JTlBJTlBLSUxRUclMUIlQTAlQTElQTBVJUE0JUE1JUE2QkElMDAlM0JcIik7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggY2VudGVyO1xufVxuXG4uYWNlX2d1dHRlci1jZWxsLmFjZV9pbmZvIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhFQUFRQU1RQUFBQUFBRUZCUVZKU1VsNWVYbVJrWkd0cmEzOS9mNFdGaFltSmlaR1JrYWFtcHJ5OHZNUER3OHpNek5YVjFkemMzT1RrNU9ycTZ2RHc4UC8vL3dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNINUJBa0FBQlFBTEFBQUFBQVFBQkFBQUFVdUlDV09aR21lYUJtbDVYR3dGQ1FTQkd5WFJTQXd0cVFJaVJ1aXdJTTVCb1lWYkVGSXlHQ1FvZUpHclZwdElRQTdcIik7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggY2VudGVyO1xufVxuXG4uYWNlX2VkaXRvciAuYWNlX3NiIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgICByaWdodDogMDtcbn1cblxuLmFjZV9lZGl0b3IgLmFjZV9zYiBkaXYge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMXB4O1xuICAgIGxlZnQ6IDA7XG59XG5cbi5hY2VfZWRpdG9yIC5hY2VfcHJpbnRfbWFyZ2luX2xheWVyIHtcbiAgICB6LWluZGV4OiAwO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIG1hcmdpbjogMDtcbiAgICBsZWZ0OiAwO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuLmFjZV9lZGl0b3IgLmFjZV9wcmludF9tYXJnaW4ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBoZWlnaHQ6IDEwMCU7XG59XG5cbi5hY2VfZWRpdG9yIHRleHRhcmVhIHtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgei1pbmRleDogMDtcbiAgICB3aWR0aDogMTBweDtcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgb3BhY2l0eTogMDtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgcmVzaXplOiBub25lO1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmFjZV9sYXllciB7XG4gICAgei1pbmRleDogMTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgLyogc2V0dGluZyBwb2ludGVyLWV2ZW50czogYXV0bzsgb24gbm9kZSB1bmRlciB0aGUgbW91c2UsIHdoaWNoIGNoYW5nZXNcbiAgICAgICAgZHVyaW5nIHNjcm9sbCwgd2lsbCBicmVhayBtb3VzZSB3aGVlbCBzY3JvbGxpbmcgaW4gU2FmYXJpICovXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5hY2VfZ3V0dGVyIC5hY2VfbGF5ZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtaW4td2lkdGg6IDQwcHg7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG59XG5cbi5hY2VfdGV4dC1sYXllciB7XG4gICAgY29sb3I6IGJsYWNrO1xufVxuXG4uYWNlX2NqayB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmFjZV9jdXJzb3ItbGF5ZXIge1xuICAgIHotaW5kZXg6IDQ7XG59XG5cbi5hY2VfY3Vyc29yIHtcbiAgICB6LWluZGV4OiA0O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cblxuLmFjZV9jdXJzb3IuYWNlX2hpZGRlbiB7XG4gICAgb3BhY2l0eTogMC4yO1xufVxuXG4uYWNlX2xpbmUge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6IDM7XG59XG5cbi5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogNDtcbn1cblxuLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogNTtcbn1cblxuLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6IDI7XG59XG5cbi5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6IDY7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4uYWNlX2xpbmUgLmFjZV9mb2xkIHtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGhlaWdodDogMTFweDtcbiAgICBtYXJnaW4tdG9wOiAtMnB4O1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG5cbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBcbiAgICAgICAgdXJsKFwiZGF0YTppbWFnZS9wbmcsJTg5UE5HJTBEJTBBJTFBJTBBJTAwJTAwJTAwJTBESUhEUiUwMCUwMCUwMCUxMSUwMCUwMCUwMCUwOSUwOCUwNiUwMCUwMCUwMCVENCVFOCVDNyUwQyUwMCUwMCUwMyUxRWlDQ1BJQ0MlMjBQcm9maWxlJTAwJTAweCUwMSU4NVQlREZrJUQzUCUxNCVGRSVEQWUlOUQlQjAlRTElOEIlM0FnJTExJTA5JTNFaCU5MW5kU3RDJTlDJUI2a1clQkElQ0RaJUVBNiVCNyFIJTlCJUE2bSU1QyU5QSVDNiUyNCVFRH4lQjAlMDclRDklOEJvJTNBJUM1dyVGMSUwNyUzRSVGOSUwNyUwQyVEOSU4M28lN0IlOTIlMEQlQzYlMTRhJUY4JUFDJTg4JTIyTCVGNiUyMiVCMyU5RSU5QjRNJ1MlMDMlQjklRjclQkIlREYlRjklRUU5JyVFNyVFNCU1RSVBMCVGOXFaJUQzJTE0JTJGJTBGJTE0VVNPJUM1JUMyJUZDJUM0JUU0JTE0JURGJUYyJTAxJTVFJTFDQyUyQiVGQ2hNJThCJTg2JTE2SiUyNkclNDAlMEYlRDMlQjJ5JUVGJUIzJUYzJTBFJTFFJUM2bHQlRUVvJURGJUFCJUZFYyVENSU5QSU5NSUwQyUxMSVGMCUxQyUyMCVCRSU5NDUlQzQlMjIlRTFZJUEwaSU1QyVENHQlMTMlRTAlRDYlODklRUYlOUQxNSVDMiVDRExzWCVBNyUwNCUwOSUxRmc4b2MlODElRTElOEMlOEQlMjMlOTZmNDUlNDAlOUElMDklQzIlMDclQzVCJTNBSyVCOCU0MDglOThpJUUwJUYzJTBEJUQ4JUNFJTgxJTE0JUU0JyUyNiVBOSU5Mi4lOEIlM0MlQUJFUiUyRiVFNWRFJUIyJTBDJUY2JUYwJTFGcyU4MyVGMl8lQjAlQTglOTQlRTklOUIlQUQlRTclMTAlOERtJTlBJTE5TiVEMSU3QyU4QSVERSUxRjklN0RwJThDJUU2JTAwJUQ1JUMxJTNGXyUxOCVCREElQjglOURwWDYlRTMlQTM1fkIlQ0QlMjQlQUUlMTElMjYlQkQlRTclRUV0aSU5OCVFRGUlOUElOTdZKSUxMiUyNSUxQyUyNCVCQ2JUJUFFM2xpJUU2JTBCJTAzJTg5JTlBJUU2JUQzJUVEJUY0UCU5MiVCMCU5RjQlQkY0M1klRjMlRTMlRURQJTk1JTA0JUVCMSVDNSVGNSVGNktGJUY0JUJBJUJEJUQ3JURCJTkxJTkzJTA3JUUzNSUzRSVBNyklRDYlN0YlNDAlRkUlQkQlRjclRjVyJThBJUU1eSU5MiVGMCVFQiVCNCUxRSU4RCVENSVGNCU1QiU5MiUzQVYlREIlREIlRTQlQ0QlQTYlMjMlQzMlQzR3USUzRiUwM0hCJTgyJThFJTFDZCglRTAlOTFCJTBDYSU5QWMlQzQlQUElRjhMJTE2JTE5JTIySiVBNCVEMml0VHklQjI4JUQ2JTNCKCU5MyU5NiVFRCUxQ0d4JUM5XyUwRSVCOCU1RSUxNiVGNSU1QiVCMiVCOCVGNiVFMCVGQiU5RSVERCUyNSVENyU4RSVCQyUxNSU4NSVDNSVCNyVBMyVEOFElRUQlQjUlODElRTklQkElQjIlMTMlOUElMUIlN0Z1YSVBNSVBM24lRTE3JUI5JUU1JTlCJTFCbSVBQiUwQiUwOFElRkUlOEElRTUlQjFIJTVFZSVDQU8lODJRJUQ3dTYlRTYlOTBTJTk3JUZDdSUwQiVDRjIlOTQlRUUlMjV2JTEyWCUwQyVCQSVBQyVGMCU1RSVGOCpsJTBBTyU4NSUxNyVDMiU5NyVCRiVENCVDOCVDRSVERSVBRCUxMSVDQiU4MHElMkMlM0UlQUIlOUVTJUNEJUM2JUVDJTI1JUQyTCVEMiVFQmQlQjglQkYlOEElRjVCJUM2JTE4JUY5JTkwMUNaJTlEJUJFJTI0TSU5QyU4QTklRjIlREFQJTBCJyUwNnclODIlRUIlRTYlRTIlNUMlMkYlRDclMDclOUUlQkIlQ0MlNUQlRTElRkElQjklMDglQUQuciUyMyU4RSVDMiUxNyVGNUUlN0MhJUYwJUJFMyVCRSUzRV8lQjdvJTg4YSVBNyVEQiVCRSVEM2QlRUIlQTMxWiVFQiVCQiVEMyU5MSVCQSVBMiVCMXolOTQlOEYlREInJUY2JTNEJThFJUFBJTEzJTE5JUIyJUIxJUJFJUIxflYlMDglMkIlQjQlQTJjakolQjN0TyUwMCUwMyUyNW1OJTk3JUYzJTA1JTkzJUVGJTExJTg0JTBCJTdDJTg4JUFFLSU4OSU4RiVBQmJXJTkwTyUyQiUwQW8lOTklMEMlNUUlOTclMENJJUFGSCVEOS4lQjAlM0IlOEYlRUQlMDMlQjZTJUQ2JTVEJUU2aV9zOSVGMypwJUU5JTFCJUZEJUMzJUVCLjdVJTA2JTVFJTE5JUMwJUQxcy4lMTclQTAzdSVFNCUwOSVCMCU3QyU1RSUyQyVFQiUxNSVEQiUxRiUzQyU5RSVCNyU4MCU5MSUzQiVEQmMlQUQlM0RtYSVCQSU4QiUzRVYlQUIlREJ0LiU1QiUxRSUwMSVCQiUwRiVBQiVENSU5RiVDRiVBQSVENSVERCVFNyVFNCU3RiUwQnglQTMlRkMlMDYlQTklMjMlMEElRDYlQzIlQTFfMiUwMCUwMCUwMCUwOXBIWXMlMDAlMDAlMEIlMTMlMDAlMDAlMEIlMTMlMDElMDAlOUElOUMlMTglMDAlMDAlMDAlQjVJREFUKCUxNSVBNSU5MSUzRCUwRSUwMiElMTAlODVhYyVFMSUwNSVENiVDRSVENiVDNiVDRSVEMiVFOCVFRCVDRCVERSVDMCVDNiVENk4uJUUwViVGOCUzRCU5Q2ElODkxWEglQzIlQkUlRDl5JTNGJTkwISVFNiU5QyVDMyVCRmslRTUlMDExJUM2LSVGNSVDOE4lMDQlREYlQkQlRkYlODklREZ0JTgzRE4lNjAlM0UlRjMlQUIlQTAlREUlMUElNURnJUJFJTEwUSU5NyUxQiU0MCU5QyVBOG8lMTAlOEYlNUUlODI4JUI0JTFCJTYwJTg3JUY2JTAyJTI2JTg1JTFDaCUxRSVDMSUyQiU1QmslRkYlODYlRUUlQjdqJTA5JTlBJURBJTlCJUFDZSVBMyVGOSVFQyVEQSE5JUI0JUQ1JUE2JTgxJTg2JTg2JTk4JUNDJTNDJTVCJTQwJUZBJTgxJUIzJUU5JUNCJTIzJTk0JUMxNkF6byUwNSVENCVFMSVDMSU5NWElM0IlOEEnJUEwJUU4JUNDJTE3JTIyJTg1JTFEJUJBJTAwJUEyJUZBJURDJTBBJTk0JUQxJUQxJThEJThCJTNBJTg0JTE3QiVDNyU2MCUxQSUyNVolRkMlOEQlMDAlMDAlMDAlMDBJRU5EJUFFQiU2MCU4MlwiKSxcbiAgICAgICAgdXJsKFwiZGF0YTppbWFnZS9wbmcsJTg5UE5HJTBEJTBBJTFBJTBBJTAwJTAwJTAwJTBESUhEUiUwMCUwMCUwMCUwNSUwMCUwMCUwMDclMDglMDYlMDAlMDAlMDAlQzQlREQlODBDJTAwJTAwJTAzJTFFaUNDUElDQyUyMFByb2ZpbGUlMDAlMDB4JTAxJTg1VCVERmslRDNQJTE0JUZFJURBZSU5RCVCMCVFMSU4QiUzQWclMTElMDklM0VoJTkxbmRTdEMlOUMlQjZrVyVCQSVDRFolRUE2JUI3IUglOUIlQTZtJTVDJTlBJUM2JTI0JUVEfiVCMCUwNyVEOSU4Qm8lM0ElQzV3JUYxJTA3JTNFJUY5JTA3JTBDJUQ5JTgzbyU3QiU5MiUwRCVDNiUxNGElRjglQUMlODglMjJMJUY2JTIyJUIzJTlFJTlCNE0nUyUwMyVCOSVGNyVCQiVERiVGOSVFRTknJUU3JUU0JTVFJUEwJUY5cVolRDMlMTQlMkYlMEYlMTRVU08lQzUlQzIlRkMlQzQlRTQlMTQlREYlRjIlMDElNUUlMUNDJTJCJUZDaE0lOEIlODYlMTZKJTI2RyU0MCUwRiVEMyVCMnklRUYlQjMlRjMlMEUlMUUlQzZsdCVFRW8lREYlQUIlRkVjJUQ1JTlBJTk1JTBDJTExJUYwJTFDJTIwJUJFJTk0NSVDNCUyMiVFMVklQTBpJTVDJUQ0dCUxMyVFMCVENiU4OSVFRiU5RDE1JUMyJUNETHNYJUE3JTA0JTA5JTFGZzhvYyU4MSVFMSU4QyU4RCUyMyU5NmY0NSU0MCU5QSUwOSVDMiUwNyVDNUIlM0FLJUI4JTQwOCU5OGklRTAlRjMlMEQlRDglQ0UlODElMTQlRTQnJTI2JUE5JTkyLiU4QiUzQyVBQkVSJTJGJUU1ZEUlQjIlMEMlRjYlRjAlMUZzJTgzJUYyXyVCMCVBOCU5NCVFOSU5QiVBRCVFNyUxMCU4RG0lOUElMTlOJUQxJTdDJThBJURFJTFGOSU3RHAlOEMlRTYlMDAlRDUlQzElM0ZfJTE4JUJEQSVCOCU5RHBYNiVFMyVBMzV+QiVDRCUyNCVBRSUxMSUyNiVCRCVFNyVFRXRpJTk4JUVEZSU5QSU5N1kpJTEyJTI1JTFDJTI0JUJDYlQlQUUzbGklRTYlMEIlMDMlODklOUElRTYlRDMlRUQlRjRQJTkyJUIwJTlGNCVCRjQzWSVGMyVFMyVFRFAlOTUlMDQlRUIxJUM1JUY1JUY2S0YlRjQlQkElQkQlRDclREIlOTElOTMlMDclRTM1JTNFJUE3KSVENiU3RiU0MCVGRSVCRCVGNyVGNXIlOEElRTV5JTkyJUYwJUVCJUI0JTFFJThEJUQ1JUY0JTVCJTkyJTNBViVEQiVEQiVFNCVDRCVBNiUyMyVDMyVDNHdRJTNGJTAzSEIlODIlOEUlMUNkKCVFMCU5MUIlMENhJTlBYyVDNCVBQSVGOEwlMTYlMTklMjJKJUE0JUQyaXRUeSVCMjglRDYlM0IoJTkzJTk2JUVEJTFDR3glQzlfJTBFJUI4JTVFJTE2JUY1JTVCJUIyJUI4JUY2JUUwJUZCJTlFJUREJTI1JUQ3JThFJUJDJTE1JTg1JUM1JUI3JUEzJUQ4USVFRCVCNSU4MSVFOSVCQSVCMiUxMyU5QSUxQiU3RnVhJUE1JUEzbiVFMTclQjklRTUlOUIlMUJtJUFCJTBCJTA4USVGRSU4QSVFNSVCMUglNUVlJUNBTyU4MlElRDd1NiVFNiU5MFMlOTclRkN1JTBCJUNGMiU5NCVFRSUyNXYlMTJYJTBDJUJBJUFDJUYwJTVFJUY4KmwlMEFPJTg1JTE3JUMyJTk3JUJGJUQ0JUM4JUNFJURFJUFEJTExJUNCJTgwcSUyQyUzRSVBQiU5RVMlQ0QlQzYlRUMlMjUlRDJMJUQyJUVCZCVCOCVCRiU4QSVGNUIlQzYlMTglRjklOTAxQ1olOUQlQkUlMjRNJTlDJThBOSVGMiVEQVAlMEInJTA2dyU4MiVFQiVFNiVFMiU1QyUyRiVENyUwNyU5RSVCQiVDQyU1RCVFMSVGQSVCOSUwOCVBRC5yJTIzJThFJUMyJTE3JUY1RSU3QyElRjAlQkUzJUJFJTNFXyVCN28lODhhJUE3JURCJUJFJUQzZCVFQiVBMzFaJUVCJUJCJUQzJTkxJUJBJUEyJUIxeiU5NCU4RiVEQiclRjYlM0QlOEUlQUElMTMlMTklQjIlQjElQkUlQjF+ViUwOCUyQiVCNCVBMmNqSiVCM3RPJTAwJTAzJTI1bU4lOTclRjMlMDUlOTMlRUYlMTElODQlMEIlN0MlODglQUUtJTg5JThGJUFCYlclOTBPJTJCJTBBbyU5OSUwQyU1RSU5NyUwQ0klQUZIJUQ5LiVCMCUzQiU4RiVFRCUwMyVCNlMlRDYlNUQlRTZpX3M5JUYzKnAlRTklMUIlRkQlQzMlRUIuN1UlMDYlNUUlMTklQzAlRDFzLiUxNyVBMDN1JUU0JTA5JUIwJTdDJTVFJTJDJUVCJTE1JURCJTFGJTNDJTlFJUI3JTgwJTkxJTNCJURCYyVBRCUzRG1hJUJBJThCJTNFViVBQiVEQnQuJTVCJTFFJTAxJUJCJTBGJUFCJUQ1JTlGJUNGJUFBJUQ1JUREJUU3JUU0JTdGJTBCeCVBMyVGQyUwNiVBOSUyMyUwQSVENiVDMiVBMV8yJTAwJTAwJTAwJTA5cEhZcyUwMCUwMCUwQiUxMyUwMCUwMCUwQiUxMyUwMSUwMCU5QSU5QyUxOCUwMCUwMCUwMCUzQUlEQVQ4JTExYyVGQyVGRiVGRiU3RiUxOCUwMyUxQSU2MCUwMSVGMiUzRiVBMCU4OTElODAlMDQlRkYlMTEtJUY4JTE3JTlCSiVFMiUwNSVCMVpEJTgxdiUyNnQlRTclODAlRjglQTMlODJoJUExMiUxQSUyMCVBMyUwMSUwMiUwRiUwMSVCQSUyNSUwNiUwMCUxOSVDMCUwRCVBRUYlRDUlM0VTJTAwJTAwJTAwJTAwSUVORCVBRUIlNjAlODJcIik7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdCwgcmVwZWF0LXg7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlciwgdG9wIGxlZnQ7XG4gICAgY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XG4gICAgLW1vei1ib3JkZXItcmFkaXVzOiAycHg7XG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHg7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIFxuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbn1cblxuLmFjZV9kYXJrIC5hY2VfZm9sZCB7XG59XG5cbi5hY2VfZm9sZDpob3ZlcntcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBcbiAgICAgICAgdXJsKFwiZGF0YTppbWFnZS9wbmcsJTg5UE5HJTBEJTBBJTFBJTBBJTAwJTAwJTAwJTBESUhEUiUwMCUwMCUwMCUxMSUwMCUwMCUwMCUwOSUwOCUwNiUwMCUwMCUwMCVENCVFOCVDNyUwQyUwMCUwMCUwMyUxRWlDQ1BJQ0MlMjBQcm9maWxlJTAwJTAweCUwMSU4NVQlREZrJUQzUCUxNCVGRSVEQWUlOUQlQjAlRTElOEIlM0FnJTExJTA5JTNFaCU5MW5kU3RDJTlDJUI2a1clQkElQ0RaJUVBNiVCNyFIJTlCJUE2bSU1QyU5QSVDNiUyNCVFRH4lQjAlMDclRDklOEJvJTNBJUM1dyVGMSUwNyUzRSVGOSUwNyUwQyVEOSU4M28lN0IlOTIlMEQlQzYlMTRhJUY4JUFDJTg4JTIyTCVGNiUyMiVCMyU5RSU5QjRNJ1MlMDMlQjklRjclQkIlREYlRjklRUU5JyVFNyVFNCU1RSVBMCVGOXFaJUQzJTE0JTJGJTBGJTE0VVNPJUM1JUMyJUZDJUM0JUU0JTE0JURGJUYyJTAxJTVFJTFDQyUyQiVGQ2hNJThCJTg2JTE2SiUyNkclNDAlMEYlRDMlQjJ5JUVGJUIzJUYzJTBFJTFFJUM2bHQlRUVvJURGJUFCJUZFYyVENSU5QSU5NSUwQyUxMSVGMCUxQyUyMCVCRSU5NDUlQzQlMjIlRTFZJUEwaSU1QyVENHQlMTMlRTAlRDYlODklRUYlOUQxNSVDMiVDRExzWCVBNyUwNCUwOSUxRmc4b2MlODElRTElOEMlOEQlMjMlOTZmNDUlNDAlOUElMDklQzIlMDclQzVCJTNBSyVCOCU0MDglOThpJUUwJUYzJTBEJUQ4JUNFJTgxJTE0JUU0JyUyNiVBOSU5Mi4lOEIlM0MlQUJFUiUyRiVFNWRFJUIyJTBDJUY2JUYwJTFGcyU4MyVGMl8lQjAlQTglOTQlRTklOUIlQUQlRTclMTAlOERtJTlBJTE5TiVEMSU3QyU4QSVERSUxRjklN0RwJThDJUU2JTAwJUQ1JUMxJTNGXyUxOCVCREElQjglOURwWDYlRTMlQTM1fkIlQ0QlMjQlQUUlMTElMjYlQkQlRTclRUV0aSU5OCVFRGUlOUElOTdZKSUxMiUyNSUxQyUyNCVCQ2JUJUFFM2xpJUU2JTBCJTAzJTg5JTlBJUU2JUQzJUVEJUY0UCU5MiVCMCU5RjQlQkY0M1klRjMlRTMlRURQJTk1JTA0JUVCMSVDNSVGNSVGNktGJUY0JUJBJUJEJUQ3JURCJTkxJTkzJTA3JUUzNSUzRSVBNyklRDYlN0YlNDAlRkUlQkQlRjclRjVyJThBJUU1eSU5MiVGMCVFQiVCNCUxRSU4RCVENSVGNCU1QiU5MiUzQVYlREIlREIlRTQlQ0QlQTYlMjMlQzMlQzR3USUzRiUwM0hCJTgyJThFJTFDZCglRTAlOTFCJTBDYSU5QWMlQzQlQUElRjhMJTE2JTE5JTIySiVBNCVEMml0VHklQjI4JUQ2JTNCKCU5MyU5NiVFRCUxQ0d4JUM5XyUwRSVCOCU1RSUxNiVGNSU1QiVCMiVCOCVGNiVFMCVGQiU5RSVERCUyNSVENyU4RSVCQyUxNSU4NSVDNSVCNyVBMyVEOFElRUQlQjUlODElRTklQkElQjIlMTMlOUElMUIlN0Z1YSVBNSVBM24lRTE3JUI5JUU1JTlCJTFCbSVBQiUwQiUwOFElRkUlOEElRTUlQjFIJTVFZSVDQU8lODJRJUQ3dTYlRTYlOTBTJTk3JUZDdSUwQiVDRjIlOTQlRUUlMjV2JTEyWCUwQyVCQSVBQyVGMCU1RSVGOCpsJTBBTyU4NSUxNyVDMiU5NyVCRiVENCVDOCVDRSVERSVBRCUxMSVDQiU4MHElMkMlM0UlQUIlOUVTJUNEJUM2JUVDJTI1JUQyTCVEMiVFQmQlQjglQkYlOEElRjVCJUM2JTE4JUY5JTkwMUNaJTlEJUJFJTI0TSU5QyU4QTklRjIlREFQJTBCJyUwNnclODIlRUIlRTYlRTIlNUMlMkYlRDclMDclOUUlQkIlQ0MlNUQlRTElRkElQjklMDglQUQuciUyMyU4RSVDMiUxNyVGNUUlN0MhJUYwJUJFMyVCRSUzRV8lQjdvJTg4YSVBNyVEQiVCRSVEM2QlRUIlQTMxWiVFQiVCQiVEMyU5MSVCQSVBMiVCMXolOTQlOEYlREInJUY2JTNEJThFJUFBJTEzJTE5JUIyJUIxJUJFJUIxflYlMDglMkIlQjQlQTJjakolQjN0TyUwMCUwMyUyNW1OJTk3JUYzJTA1JTkzJUVGJTExJTg0JTBCJTdDJTg4JUFFLSU4OSU4RiVBQmJXJTkwTyUyQiUwQW8lOTklMEMlNUUlOTclMENJJUFGSCVEOS4lQjAlM0IlOEYlRUQlMDMlQjZTJUQ2JTVEJUU2aV9zOSVGMypwJUU5JTFCJUZEJUMzJUVCLjdVJTA2JTVFJTE5JUMwJUQxcy4lMTclQTAzdSVFNCUwOSVCMCU3QyU1RSUyQyVFQiUxNSVEQiUxRiUzQyU5RSVCNyU4MCU5MSUzQiVEQmMlQUQlM0RtYSVCQSU4QiUzRVYlQUIlREJ0LiU1QiUxRSUwMSVCQiUwRiVBQiVENSU5RiVDRiVBQSVENSVERCVFNyVFNCU3RiUwQnglQTMlRkMlMDYlQTklMjMlMEElRDYlQzIlQTFfMiUwMCUwMCUwMCUwOXBIWXMlMDAlMDAlMEIlMTMlMDAlMDAlMEIlMTMlMDElMDAlOUElOUMlMTglMDAlMDAlMDAlQjVJREFUKCUxNSVBNSU5MSUzRCUwRSUwMiElMTAlODVhYyVFMSUwNSVENiVDRSVENiVDNiVDRSVEMiVFOCVFRCVDRCVERSVDMCVDNiVENk4uJUUwViVGOCUzRCU5Q2ElODkxWEglQzIlQkUlRDl5JTNGJTkwISVFNiU5QyVDMyVCRmslRTUlMDExJUM2LSVGNSVDOE4lMDQlREYlQkQlRkYlODklREZ0JTgzRE4lNjAlM0UlRjMlQUIlQTAlREUlMUElNURnJUJFJTEwUSU5NyUxQiU0MCU5QyVBOG8lMTAlOEYlNUUlODI4JUI0JTFCJTYwJTg3JUY2JTAyJTI2JTg1JTFDaCUxRSVDMSUyQiU1QmslRkYlODYlRUUlQjdqJTA5JTlBJURBJTlCJUFDZSVBMyVGOSVFQyVEQSE5JUI0JUQ1JUE2JTgxJTg2JTg2JTk4JUNDJTNDJTVCJTQwJUZBJTgxJUIzJUU5JUNCJTIzJTk0JUMxNkF6byUwNSVENCVFMSVDMSU5NWElM0IlOEEnJUEwJUU4JUNDJTE3JTIyJTg1JTFEJUJBJTAwJUEyJUZBJURDJTBBJTk0JUQxJUQxJThEJThCJTNBJTg0JTE3QiVDNyU2MCUxQSUyNVolRkMlOEQlMDAlMDAlMDAlMDBJRU5EJUFFQiU2MCU4MlwiKSxcbiAgICAgICAgdXJsKFwiZGF0YTppbWFnZS9wbmcsJTg5UE5HJTBEJTBBJTFBJTBBJTAwJTAwJTAwJTBESUhEUiUwMCUwMCUwMCUwNSUwMCUwMCUwMDclMDglMDYlMDAlMDAlMDAlQzQlREQlODBDJTAwJTAwJTAzJTFFaUNDUElDQyUyMFByb2ZpbGUlMDAlMDB4JTAxJTg1VCVERmslRDNQJTE0JUZFJURBZSU5RCVCMCVFMSU4QiUzQWclMTElMDklM0VoJTkxbmRTdEMlOUMlQjZrVyVCQSVDRFolRUE2JUI3IUglOUIlQTZtJTVDJTlBJUM2JTI0JUVEfiVCMCUwNyVEOSU4Qm8lM0ElQzV3JUYxJTA3JTNFJUY5JTA3JTBDJUQ5JTgzbyU3QiU5MiUwRCVDNiUxNGElRjglQUMlODglMjJMJUY2JTIyJUIzJTlFJTlCNE0nUyUwMyVCOSVGNyVCQiVERiVGOSVFRTknJUU3JUU0JTVFJUEwJUY5cVolRDMlMTQlMkYlMEYlMTRVU08lQzUlQzIlRkMlQzQlRTQlMTQlREYlRjIlMDElNUUlMUNDJTJCJUZDaE0lOEIlODYlMTZKJTI2RyU0MCUwRiVEMyVCMnklRUYlQjMlRjMlMEUlMUUlQzZsdCVFRW8lREYlQUIlRkVjJUQ1JTlBJTk1JTBDJTExJUYwJTFDJTIwJUJFJTk0NSVDNCUyMiVFMVklQTBpJTVDJUQ0dCUxMyVFMCVENiU4OSVFRiU5RDE1JUMyJUNETHNYJUE3JTA0JTA5JTFGZzhvYyU4MSVFMSU4QyU4RCUyMyU5NmY0NSU0MCU5QSUwOSVDMiUwNyVDNUIlM0FLJUI4JTQwOCU5OGklRTAlRjMlMEQlRDglQ0UlODElMTQlRTQnJTI2JUE5JTkyLiU4QiUzQyVBQkVSJTJGJUU1ZEUlQjIlMEMlRjYlRjAlMUZzJTgzJUYyXyVCMCVBOCU5NCVFOSU5QiVBRCVFNyUxMCU4RG0lOUElMTlOJUQxJTdDJThBJURFJTFGOSU3RHAlOEMlRTYlMDAlRDUlQzElM0ZfJTE4JUJEQSVCOCU5RHBYNiVFMyVBMzV+QiVDRCUyNCVBRSUxMSUyNiVCRCVFNyVFRXRpJTk4JUVEZSU5QSU5N1kpJTEyJTI1JTFDJTI0JUJDYlQlQUUzbGklRTYlMEIlMDMlODklOUElRTYlRDMlRUQlRjRQJTkyJUIwJTlGNCVCRjQzWSVGMyVFMyVFRFAlOTUlMDQlRUIxJUM1JUY1JUY2S0YlRjQlQkElQkQlRDclREIlOTElOTMlMDclRTM1JTNFJUE3KSVENiU3RiU0MCVGRSVCRCVGNyVGNXIlOEElRTV5JTkyJUYwJUVCJUI0JTFFJThEJUQ1JUY0JTVCJTkyJTNBViVEQiVEQiVFNCVDRCVBNiUyMyVDMyVDNHdRJTNGJTAzSEIlODIlOEUlMUNkKCVFMCU5MUIlMENhJTlBYyVDNCVBQSVGOEwlMTYlMTklMjJKJUE0JUQyaXRUeSVCMjglRDYlM0IoJTkzJTk2JUVEJTFDR3glQzlfJTBFJUI4JTVFJTE2JUY1JTVCJUIyJUI4JUY2JUUwJUZCJTlFJUREJTI1JUQ3JThFJUJDJTE1JTg1JUM1JUI3JUEzJUQ4USVFRCVCNSU4MSVFOSVCQSVCMiUxMyU5QSUxQiU3RnVhJUE1JUEzbiVFMTclQjklRTUlOUIlMUJtJUFCJTBCJTA4USVGRSU4QSVFNSVCMUglNUVlJUNBTyU4MlElRDd1NiVFNiU5MFMlOTclRkN1JTBCJUNGMiU5NCVFRSUyNXYlMTJYJTBDJUJBJUFDJUYwJTVFJUY4KmwlMEFPJTg1JTE3JUMyJTk3JUJGJUQ0JUM4JUNFJURFJUFEJTExJUNCJTgwcSUyQyUzRSVBQiU5RVMlQ0QlQzYlRUMlMjUlRDJMJUQyJUVCZCVCOCVCRiU4QSVGNUIlQzYlMTglRjklOTAxQ1olOUQlQkUlMjRNJTlDJThBOSVGMiVEQVAlMEInJTA2dyU4MiVFQiVFNiVFMiU1QyUyRiVENyUwNyU5RSVCQiVDQyU1RCVFMSVGQSVCOSUwOCVBRC5yJTIzJThFJUMyJTE3JUY1RSU3QyElRjAlQkUzJUJFJTNFXyVCN28lODhhJUE3JURCJUJFJUQzZCVFQiVBMzFaJUVCJUJCJUQzJTkxJUJBJUEyJUIxeiU5NCU4RiVEQiclRjYlM0QlOEUlQUElMTMlMTklQjIlQjElQkUlQjF+ViUwOCUyQiVCNCVBMmNqSiVCM3RPJTAwJTAzJTI1bU4lOTclRjMlMDUlOTMlRUYlMTElODQlMEIlN0MlODglQUUtJTg5JThGJUFCYlclOTBPJTJCJTBBbyU5OSUwQyU1RSU5NyUwQ0klQUZIJUQ5LiVCMCUzQiU4RiVFRCUwMyVCNlMlRDYlNUQlRTZpX3M5JUYzKnAlRTklMUIlRkQlQzMlRUIuN1UlMDYlNUUlMTklQzAlRDFzLiUxNyVBMDN1JUU0JTA5JUIwJTdDJTVFJTJDJUVCJTE1JURCJTFGJTNDJTlFJUI3JTgwJTkxJTNCJURCYyVBRCUzRG1hJUJBJThCJTNFViVBQiVEQnQuJTVCJTFFJTAxJUJCJTBGJUFCJUQ1JTlGJUNGJUFBJUQ1JUREJUU3JUU0JTdGJTBCeCVBMyVGQyUwNiVBOSUyMyUwQSVENiVDMiVBMV8yJTAwJTAwJTAwJTA5cEhZcyUwMCUwMCUwQiUxMyUwMCUwMCUwQiUxMyUwMSUwMCU5QSU5QyUxOCUwMCUwMCUwMDNJREFUOCUxMWMlRkMlRkYlRkYlN0YlM0UlMDMlMUElNjAlMDElRjIlM0YlQTMlODkxJTgwJTA0JUZGUSUyNiVGOHclQzAlQjQzJUExJURCJTBDJUUyJThGJTBBJUEyJTg1JUNBaCU4MCU4QyUwNiUwOCUzQyUwNCVFOCU5NiUxOCUwMCVBM1MlMEQlQ0QlQ0YlRDglQzElOUQlMDAlMDAlMDAlMDBJRU5EJUFFQiU2MCU4MlwiKTtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0LCByZXBlYXQteDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyLCB0b3AgbGVmdDtcbn1cblxuLmFjZV9kcmFnZ2luZyAuYWNlX2NvbnRlbnQge1xuICAgIGN1cnNvcjogbW92ZTtcbn1cblxuLmFjZV9mb2xkaW5nLWVuYWJsZWQgPiAuYWNlX2d1dHRlci1jZWxsIHtcbiAgICBwYWRkaW5nLXJpZ2h0OiAxM3B4O1xufVxuXG4uYWNlX2ZvbGQtd2lkZ2V0IHtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cbiAgICBtYXJnaW46IDAgLTEycHggMXB4IDFweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgaGVpZ2h0OiAxNHB4O1xuICAgIHdpZHRoOiAxMXB4O1xuICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LWJvdHRvbTtcbiAgICBcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3BuZywlODlQTkclMEQlMEElMUElMEElMDAlMDAlMDAlMERJSERSJTAwJTAwJTAwJTA1JTAwJTAwJTAwJTA1JTA4JTA2JTAwJTAwJTAwJThEbyUyNiVFNSUwMCUwMCUwMDRJREFUeCVEQWUlOEElQjElMEQlMDAwJTBDJUMyJUYyJTJDSyU5NiVCQyVEMCU4RjklODElODhIJUU5JUQwJTBFJTk2JUMwJTEwJTkyJTNFJTAyJTgwJTVFJTgyJUU0JUE5Ki0lRUVzdyVDOCVDQyUxMSVFRSU5NnclRDglREMlRTkqRWglMEMlMTUxKCUwMCUwMCUwMCUwMElFTkQlQUVCJTYwJTgyXCIpO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIDVweDtcblxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLmFjZV9mb2xkLXdpZGdldC5lbmQge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvcG5nLCU4OVBORyUwRCUwQSUxQSUwQSUwMCUwMCUwMCUwRElIRFIlMDAlMDAlMDAlMDUlMDAlMDAlMDAlMDUlMDglMDYlMDAlMDAlMDAlOERvJTI2JUU1JTAwJTAwJTAwNElEQVR4JURBbSVDNyVDMSUwOSUwMDAlMDhDJUQxJThDJUVDRSVDOEUoJThFJUVDJTAyKSUxRVpKJUYxJUMxJyUwNCUwN0klRTElRTUlRUUlQ0FMJUY1JUEyJTk5JTk5JTIyJUUyJUQ2JTFGVSVCNSVGRTAlRDl4JUE3JTI2V3o1JTBFJUQ1JTAwJTAwJTAwJTAwSUVORCVBRUIlNjAlODJcIik7XG59XG5cbi5hY2VfZm9sZC13aWRnZXQuY2xvc2VkIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3BuZywlODlQTkclMEQlMEElMUElMEElMDAlMDAlMDAlMERJSERSJTAwJTAwJTAwJTAzJTAwJTAwJTAwJTA2JTA4JTA2JTAwJTAwJTAwJTA2JUU1JTI0JTBDJTAwJTAwJTAwOUlEQVR4JURBNSVDQSVDMSUwOSUwMDAlMDglMDMlQzAlQUMqKCUzRSUwNCVDMSUwRCVCQSVCMSUyMyVBNFVoJUUwJTIwJTgxJUMwJUNDJUY4JTgyJTgxJUFBJUEyJUFBckdmciU4OCUwOCUxMSUxMSUxQyVERCU3RCVFMCVFRSU1QiVGNiVGNiVDQiVCOCUwNVElMkYlRTl0YWklRDklMDAlMDAlMDAlMDBJRU5EJUFFQiU2MCU4MlwiKTtcbn1cblxuLmFjZV9mb2xkLXdpZGdldDpob3ZlciB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjMpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiAgICAtbW96LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTtcbiAgICAtbW96LWJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuICAgIGJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTtcbiAgICBib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciA0cHg7XG59XG5cbi5hY2VfZm9sZC13aWRnZXQ6YWN0aXZlIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuNCk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICAtbW96LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSk7XG4gICAgLW1vei1ib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO1xuICAgIC13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1KTtcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7XG4gICAgYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1KTtcbiAgICBib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO1xufVxuXG4uYWNlX2ZvbGQtd2lkZ2V0LmludmFsaWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkI0QjQ7XG4gICAgYm9yZGVyLWNvbG9yOiAjREU1NTU1O1xufVxuIiksZGVmaW5lKCJhY2UvdGhlbWUvdGV4dG1hdGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCIsYi5pc0Rhcms9ITEsYi5jc3NDbGFzcz0iYWNlLXRtIixiLmNzc1RleHQ9Ii5hY2UtdG0gLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLXRtIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLXRtIC5hY2VfZ3V0dGVyIHsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzt9LmFjZS10bSAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS10bSAuYWNlX2ZvbGQgeyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNkI3MkU2O30uYWNlLXRtIC5hY2VfdGV4dC1sYXllciB7ICBjdXJzb3I6IHRleHQ7fS5hY2UtdG0gLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCBibGFjazt9LmFjZS10bSAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fSAgICAgICAgLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6IHJnYigxOTEsIDE5MSwgMTkxKTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiBibHVlO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9idWlsZGluIHsgIGNvbG9yOiByZ2IoODgsIDcyLCAyNDYpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7ICBjb2xvcjogcmdiKDg4LCA5MiwgMjQ2KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGlicmFyeSB7ICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2ludmFsaWQgeyAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1MywgMCwgMCk7ICBjb2xvcjogd2hpdGU7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6IHJnYig2MCwgNzYsIDExNCk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY29uc3RhbnQgeyAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV90eXBlLC5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY2xhc3MgeyAgY29sb3I6IHJnYigxMDksIDEyMSwgMjIyKTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7ICBjb2xvcjogcmdiKDEwNCwgMTE4LCAxMzUpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N0cmluZyB7ICBjb2xvcjogcmdiKDMsIDEwNiwgNyk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29tbWVudCB7ICBjb2xvcjogcmdiKDc2LCAxMzYsIDEwNyk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jIHsgIGNvbG9yOiByZ2IoMCwgMTAyLCAyNTUpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQuYWNlX2RvYy5hY2VfdGFnIHsgIGNvbG9yOiByZ2IoMTI4LCAxNTksIDE5MSk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMgeyAgY29sb3I6IHJnYigwLCAwLCAyMDUpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX3ZhcmlhYmxlIHsgIGNvbG9yOiByZ2IoNDksIDEzMiwgMTQ5KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV94bWxfcGUgeyAgY29sb3I6IHJnYigxMDQsIDEwNCwgOTEpO30uYWNlLXRtIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7ICBjb2xvcjogIzAwMDBBMjt9LmFjZS10bSAuYWNlX21hcmt1cC5hY2VfbWFya3VwaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9LmFjZS10bSAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7ICBjb2xvcjogcmdiKDEyLCA3LCAyNTUpO30uYWNlLXRtIC5hY2VfbWFya3VwLmFjZV9saXN0IHsgIGNvbG9yOnJnYigxODUsIDYsIDE0NCk7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogcmdiKDE4MSwgMjEzLCAyNTUpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyNTUsIDApO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RhY2sgeyAgYmFja2dyb3VuZDogcmdiKDE2NCwgMjI5LCAxMDEpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTkyLCAxOTIsIDE5Mik7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDcpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBiYWNrZ3JvdW5kOiByZ2IoMjUwLCAyNTAsIDI1NSk7ICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjAwLCAyMDAsIDI1MCk7fS5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcgeyAgY29sb3I6cmdiKDI4LCAyLCAyNTUpO30uYWNlLXRtIC5hY2Vfc3RyaW5nLmFjZV9yZWdleCB7ICBjb2xvcjogcmdiKDI1NSwgMCwgMCl9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/keybinding-emacs-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgU2t5d3JpdGVyLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogTW96aWxsYS4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDkNCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgSnVsaWFuIFZpZXJlY2sgKGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbSkNCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9rZXlib2FyZC9rZXliaW5kaW5nL2VtYWNzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2Uva2V5Ym9hcmQvc3RhdGVfaGFuZGxlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFN0YXRlSGFuZGxlciA9IHJlcXVpcmUoIi4uL3N0YXRlX2hhbmRsZXIiKS5TdGF0ZUhhbmRsZXI7DQp2YXIgbWF0Y2hDaGFyYWN0ZXJPbmx5ID0gIHJlcXVpcmUoIi4uL3N0YXRlX2hhbmRsZXIiKS5tYXRjaENoYXJhY3Rlck9ubHk7DQoNCnZhciBlbWFjc1N0YXRlID0gew0KICAgIHN0YXJ0OiBbDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogICAgImN0cmwteCIsDQogICAgICAgICAgICB0aGVuOiAgICJjLXgiDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIHJlZ2V4OiAgWyAiKD86Y29tbWFuZC0oWzAtOV0qKSkqIiwgIihkb3dufGN0cmwtbikiIF0sDQogICAgICAgICAgICBleGVjOiAgICJnb2xpbmVkb3duIiwNCiAgICAgICAgICAgIHBhcmFtczogWw0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgbmFtZTogInRpbWVzIiwNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2g6IDEsDQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJudW1iZXIiLA0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDENCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIHJlZ2V4OiBbICIoPzpjb21tYW5kLShbMC05XSopKSoiLCAiKHJpZ2h0fGN0cmwtZikiIF0sDQogICAgICAgICAgICBleGVjOiAiZ290b3JpZ2h0IiwNCiAgICAgICAgICAgIHBhcmFtczogWw0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgbmFtZTogInRpbWVzIiwNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2g6IDEsDQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJudW1iZXIiLA0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDENCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIHJlZ2V4OiBbICIoPzpjb21tYW5kLShbMC05XSopKSoiLCAiKHVwfGN0cmwtcCkiIF0sDQogICAgICAgICAgICBleGVjOiAiZ29saW5ldXAiLA0KICAgICAgICAgICAgcGFyYW1zOiBbDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBuYW1lOiAidGltZXMiLA0KICAgICAgICAgICAgICAgICAgICBtYXRjaDogMSwNCiAgICAgICAgICAgICAgICAgICAgdHlwZTogIm51bWJlciIsDQogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogMQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIF0NCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgcmVnZXg6IFsgIig/OmNvbW1hbmQtKFswLTldKikpKiIsICIobGVmdHxjdHJsLWIpIiBdLA0KICAgICAgICAgICAgZXhlYzogImdvdG9sZWZ0IiwNCiAgICAgICAgICAgIHBhcmFtczogWw0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgbmFtZTogInRpbWVzIiwNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2g6IDEsDQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJudW1iZXIiLA0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDENCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbW1lbnQ6ICJUaGlzIGJpbmRpbmcgbWF0Y2hlcyBhbGwgcHJpbnRhYmxlIGNoYXJhY3RlcnMgZXhjZXB0IG51bWJlcnMgYXMgbG9uZyBhcyB0aGV5IGFyZSBubyBudW1iZXJzIGFuZCBwcmludCB0aGVtIG4gdGltZXMuIiwNCiAgICAgICAgICAgIHJlZ2V4OiAgWyAiKD86Y29tbWFuZC0oWzAtOV0qKSkiLCAiKFteMC05XSspKiIgXSwNCiAgICAgICAgICAgIG1hdGNoOiAgbWF0Y2hDaGFyYWN0ZXJPbmx5LA0KICAgICAgICAgICAgZXhlYzogICAiaW5zZXJ0dGV4dCIsDQogICAgICAgICAgICBwYXJhbXM6IFsNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJ0aW1lcyIsDQogICAgICAgICAgICAgICAgICAgIG1hdGNoOiAxLA0KICAgICAgICAgICAgICAgICAgICB0eXBlOiAibnVtYmVyIiwNCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAiMSINCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgbmFtZTogInRleHQiLA0KICAgICAgICAgICAgICAgICAgICBtYXRjaDogMg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIF0NCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgY29tbWVudDogIlRoaXMgYmluZGluZyBtYXRjaGVzIG51bWJlcnMgYXMgbG9uZyBhcyB0aGVyZSBpcyBubyBtZXRhX251bWJlciBpbiB0aGUgYnVmZmVyLiIsDQogICAgICAgICAgICByZWdleDogIFsgIihjb21tYW5kLVswLTldKikqIiwgIihbMC05XSspIiBdLA0KICAgICAgICAgICAgbWF0Y2g6ICBtYXRjaENoYXJhY3Rlck9ubHksDQogICAgICAgICAgICBkaXNhbGxvd01hdGNoZXM6ICBbIDEgXSwNCiAgICAgICAgICAgIGV4ZWM6ICAgImluc2VydHRleHQiLA0KICAgICAgICAgICAgcGFyYW1zOiBbDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBuYW1lOiAidGV4dCIsDQogICAgICAgICAgICAgICAgICAgIG1hdGNoOiAyLA0KICAgICAgICAgICAgICAgICAgICB0eXBlOiAidGV4dCINCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIHJlZ2V4OiBbICJjb21tYW5kLShbMC05XSopIiwgIihjb21tYW5kLVswLTldfFswLTldKSIgXSwNCiAgICAgICAgICAgIGNvbW1lbnQ6ICJTdG9wcyBleGVjdXRpb24gaWYgdGhlIHJlZ2V4IC9tZXRhX1swLTldKy8gbWF0Y2hlcyB0byBhdm9pZCByZXNldHRpbmcgdGhlIGJ1ZmZlci4iDQogICAgICAgIH0NCiAgICBdLA0KICAgICJjLXgiOiBbDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogImN0cmwtZyIsDQogICAgICAgICAgICB0aGVuOiAic3RhcnQiDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogImN0cmwtcyIsDQogICAgICAgICAgICBleGVjOiAic2F2ZSIsDQogICAgICAgICAgICB0aGVuOiAic3RhcnQiDQogICAgICAgIH0NCiAgICBdDQp9Ow0KDQpleHBvcnRzLkVtYWNzID0gbmV3IFN0YXRlSGFuZGxlcihlbWFjc1N0YXRlKTsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBTa3l3cml0ZXIuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBNb3ppbGxhLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwOQ0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICBKdWxpYW4gVmllcmVjayAoanVsaWFuLnZpZXJlY2tAZ21haWwuY29tKQ0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2tleWJvYXJkL3N0YXRlX2hhbmRsZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQovLyBJZiB5b3UncmUgZGV2ZWxvcGluZyBhIG5ldyBrZXltYXBwaW5nIGFuZCB3YW50IHRvIGdldCBhbiBpZGVhIHdoYXQncyBnb2luZw0KLy8gb24sIHRoZW4gZW5hYmxlIGRlYnVnZ2luZy4NCnZhciBERUJVRyA9IGZhbHNlOw0KDQpmdW5jdGlvbiBTdGF0ZUhhbmRsZXIoa2V5bWFwcGluZykgew0KICAgIHRoaXMua2V5bWFwcGluZyA9IHRoaXMuJGJ1aWxkS2V5bWFwcGluZ1JlZ2V4KGtleW1hcHBpbmcpOw0KfQ0KDQpTdGF0ZUhhbmRsZXIucHJvdG90eXBlID0gew0KICAgIC8qKg0KICAgICAqIEJ1aWxkIHRoZSBSZWdFeHAgZnJvbSB0aGUga2V5bWFwcGluZyBhcyBSZWdFeHAgY2FuJ3Qgc3RvcmVkIGRpcmVjdGx5DQogICAgICogaW4gdGhlIG1ldGFkYXRhIEpTT04gYW5kIGFzIHRoZSBSZWdFeHAgdXNlZCB0byBtYXRjaCB0aGUga2V5cy9idWZmZXINCiAgICAgKiBuZWVkIHRvIGJlIGFkYXB0ZWQuDQogICAgICovDQogICAgJGJ1aWxkS2V5bWFwcGluZ1JlZ2V4OiBmdW5jdGlvbihrZXltYXBwaW5nKSB7DQogICAgICAgIGZvciAodmFyIHN0YXRlIGluIGtleW1hcHBpbmcpIHsNCiAgICAgICAgICAgIHRoaXMuJGJ1aWxkQmluZGluZ3NSZWdleChrZXltYXBwaW5nW3N0YXRlXSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGtleW1hcHBpbmc7DQogICAgfSwNCg0KICAgICRidWlsZEJpbmRpbmdzUmVnZXg6IGZ1bmN0aW9uKGJpbmRpbmdzKSB7DQogICAgICAgIC8vIEVzY2FwZSBhIGdpdmVuIFJlZ2V4IHN0cmluZy4NCiAgICAgICAgYmluZGluZ3MuZm9yRWFjaChmdW5jdGlvbihiaW5kaW5nKSB7DQogICAgICAgICAgICBpZiAoYmluZGluZy5rZXkpIHsNCiAgICAgICAgICAgICAgICBiaW5kaW5nLmtleSA9IG5ldyBSZWdFeHAoJ14nICsgYmluZGluZy5rZXkgKyAnJCcpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGJpbmRpbmcucmVnZXgpKSB7DQogICAgICAgICAgICAgICAgaWYgKCEoJ2tleScgaW4gYmluZGluZykpDQogICAgICAgICAgICAgICAgICBiaW5kaW5nLmtleSA9IG5ldyBSZWdFeHAoJ14nICsgYmluZGluZy5yZWdleFsxXSArICckJyk7DQogICAgICAgICAgICAgICAgYmluZGluZy5yZWdleCA9IG5ldyBSZWdFeHAoYmluZGluZy5yZWdleC5qb2luKCcnKSArICckJyk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGJpbmRpbmcucmVnZXgpIHsNCiAgICAgICAgICAgICAgICBiaW5kaW5nLnJlZ2V4ID0gbmV3IFJlZ0V4cChiaW5kaW5nLnJlZ2V4ICsgJyQnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfSwNCg0KICAgICRjb21wb3NlQnVmZmVyOiBmdW5jdGlvbihkYXRhLCBoYXNoSWQsIGtleSwgZSkgew0KICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBkYXRhIG9iamVjdC4NCiAgICAgICAgaWYgKGRhdGEuc3RhdGUgPT0gbnVsbCB8fCBkYXRhLmJ1ZmZlciA9PSBudWxsKSB7DQogICAgICAgICAgICBkYXRhLnN0YXRlID0gInN0YXJ0IjsNCiAgICAgICAgICAgIGRhdGEuYnVmZmVyID0gIiI7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIga2V5QXJyYXkgPSBbXTsNCiAgICAgICAgaWYgKGhhc2hJZCAmIDEpIGtleUFycmF5LnB1c2goImN0cmwiKTsNCiAgICAgICAgaWYgKGhhc2hJZCAmIDgpIGtleUFycmF5LnB1c2goImNvbW1hbmQiKTsNCiAgICAgICAgaWYgKGhhc2hJZCAmIDIpIGtleUFycmF5LnB1c2goIm9wdGlvbiIpOw0KICAgICAgICBpZiAoaGFzaElkICYgNCkga2V5QXJyYXkucHVzaCgic2hpZnQiKTsNCiAgICAgICAgaWYgKGtleSkgICAgICAgIGtleUFycmF5LnB1c2goa2V5KTsNCg0KICAgICAgICB2YXIgc3ltYm9saWNOYW1lID0ga2V5QXJyYXkuam9pbigiLSIpOw0KICAgICAgICB2YXIgYnVmZmVyVG9Vc2UgPSBkYXRhLmJ1ZmZlciArIHN5bWJvbGljTmFtZTsNCg0KICAgICAgICAvLyBEb24ndCBhZGQgdGhlIHN5bWJvbGljIG5hbWUgdG8gdGhlIGtleSBidWZmZXIgaWYgdGhlIGFsdF8ga2V5IGlzDQogICAgICAgIC8vIHBhcnQgb2YgdGhlIHN5bWJvbGljIG5hbWUuIElmIGl0IHN0YXJ0cyB3aXRoIGFsdF8sIHRoaXMgbWVhbnMNCiAgICAgICAgLy8gdGhhdCB0aGUgdXNlciBoaXQgYW4gYWx0IGtleWNvbWJvIGFuZCB0aGVyZSB3aWxsIGJlIGEgc2luZ2xlLA0KICAgICAgICAvLyBuZXcgY2hhcmFjdGVyIGRldGVjdGVkIGFmdGVyIHRoaXMgZXZlbnQsIHdoaWNoIHRoZW4gd2lsbCBiZQ0KICAgICAgICAvLyBhZGRlZCB0byB0aGUgYnVmZmVyIChlLmcuIGFsdF9qIHdpbGwgcmVzdWx0IGluIOKIhikuDQogICAgICAgIC8vDQogICAgICAgIC8vIFdlIHRlc3QgZm9yIDIgYW5kIG5vdCBmb3IgJiAyIGFzIHdlIG9ubHkgd2FudCB0byBleGNsdWRlIHRoZSBjYXNlIHdoZXJlDQogICAgICAgIC8vIHRoZSBvcHRpb24ga2V5IGlzIHByZXNzZWQgYWxvbmUuDQogICAgICAgIGlmIChoYXNoSWQgIT0gMikgew0KICAgICAgICAgICAgZGF0YS5idWZmZXIgPSBidWZmZXJUb1VzZTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBidWZmZXJPYmogPSB7DQogICAgICAgICAgICBidWZmZXJUb1VzZTogYnVmZmVyVG9Vc2UsDQogICAgICAgICAgICBzeW1ib2xpY05hbWU6IHN5bWJvbGljTmFtZSwNCiAgICAgICAgfTsNCg0KICAgICAgICBpZiAoZSkgew0KICAgICAgICAgICAgYnVmZmVyT2JqLmtleUlkZW50aWZpZXIgPSBlLmtleUlkZW50aWZpZXINCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBidWZmZXJPYmo7DQogICAgfSwNCg0KICAgICRmaW5kOiBmdW5jdGlvbihkYXRhLCBidWZmZXIsIHN5bWJvbGljTmFtZSwgaGFzaElkLCBrZXksIGtleUlkZW50aWZpZXIpIHsNCiAgICAgICAgLy8gSG9sZHMgdGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSBhbmQgdGhlIGFyZ3MgaWYgYSBjb21tYW5kIG1hdGNoZWQuDQogICAgICAgIHZhciByZXN1bHQgPSB7fTsNCg0KICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBiaW5kaW5ncyBvZiB0aGUga2V5bWFwIHVudGlsIGEgbWF0Y2ggaXMgZm91bmQuDQogICAgICAgIHRoaXMua2V5bWFwcGluZ1tkYXRhLnN0YXRlXS5zb21lKGZ1bmN0aW9uKGJpbmRpbmcpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaDsNCg0KICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGtleSBtYXRjaGVzLg0KICAgICAgICAgICAgaWYgKGJpbmRpbmcua2V5ICYmICFiaW5kaW5nLmtleS50ZXN0KHN5bWJvbGljTmFtZSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSByZWdleCBtYXRjaGVzLg0KICAgICAgICAgICAgaWYgKGJpbmRpbmcucmVnZXggJiYgIShtYXRjaCA9IGJpbmRpbmcucmVnZXguZXhlYyhidWZmZXIpKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG1hdGNoIGZ1bmN0aW9uIG1hdGNoZXMuDQogICAgICAgICAgICBpZiAoYmluZGluZy5tYXRjaCAmJiAhYmluZGluZy5tYXRjaChidWZmZXIsIGhhc2hJZCwga2V5LCBzeW1ib2xpY05hbWUsIGtleUlkZW50aWZpZXIpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBDaGVjayBmb3IgZGlzYWxsb3dlZCBtYXRjaGVzLg0KICAgICAgICAgICAgaWYgKGJpbmRpbmcuZGlzYWxsb3dNYXRjaGVzKSB7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaW5kaW5nLmRpc2FsbG93TWF0Y2hlcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoISFtYXRjaFtiaW5kaW5nLmRpc2FsbG93TWF0Y2hlc1tpXV0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBjb21tYW5kIHRvIGV4ZWN1dGUsIHRoZW4gZmlndXJlIG91dCB0aGUNCiAgICAgICAgICAgIC8vIGNvbW1hbmQgYW5kIHRoZSBhcmd1bWVudHMuDQogICAgICAgICAgICBpZiAoYmluZGluZy5leGVjKSB7DQogICAgICAgICAgICAgICAgcmVzdWx0LmNvbW1hbmQgPSBiaW5kaW5nLmV4ZWM7DQoNCiAgICAgICAgICAgICAgICAvLyBCdWlsZCB0aGUgYXJndW1lbnRzLg0KICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nLnBhcmFtcykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWU7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcmdzID0ge307DQogICAgICAgICAgICAgICAgICAgIGJpbmRpbmcucGFyYW1zLmZvckVhY2goZnVuY3Rpb24ocGFyYW0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5tYXRjaCAhPSBudWxsICYmIG1hdGNoICE9IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1hdGNoW3BhcmFtLm1hdGNoXSB8fCBwYXJhbS5kZWZhdWx0VmFsdWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyYW0uZGVmYXVsdFZhbHVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0udHlwZSA9PT0gJ251bWJlcicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFyZ3NbcGFyYW0ubmFtZV0gPSB2YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGRhdGEuYnVmZmVyID0gIiI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgJ3RoZW4nIHByb3BlcnR5Lg0KICAgICAgICAgICAgaWYgKGJpbmRpbmcudGhlbikgew0KICAgICAgICAgICAgICAgIGRhdGEuc3RhdGUgPSBiaW5kaW5nLnRoZW47DQogICAgICAgICAgICAgICAgZGF0YS5idWZmZXIgPSAiIjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gSWYgbm8gY29tbWFuZCBpcyBzZXQsIHRoZW4gZXhlY3V0ZSB0aGUgIm51bGwiIGZha2UgY29tbWFuZC4NCiAgICAgICAgICAgIGlmIChyZXN1bHQuY29tbWFuZCA9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgcmVzdWx0LmNvbW1hbmQgPSAibnVsbCI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChERUJVRykgew0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJLZXlib2FyZFN0YXRlTWFwcGVyI2ZpbmQiLCBiaW5kaW5nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9KTsNCg0KICAgICAgICBpZiAocmVzdWx0LmNvbW1hbmQpIHsNCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBkYXRhLmJ1ZmZlciA9ICIiOw0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGtleUJpbmRpbmcuDQogICAgICovDQogICAgaGFuZGxlS2V5Ym9hcmQ6IGZ1bmN0aW9uKGRhdGEsIGhhc2hJZCwga2V5LCBrZXlDb2RlLCBlKSB7DQogICAgICAgIC8vIElmIHdlIHByZXNzZWQgYW55IGNvbW1hbmQga2V5IGJ1dCBubyBvdGhlciBrZXksIHRoZW4gaWdub3JlIHRoZSBpbnB1dC4NCiAgICAgICAgLy8gT3RoZXJ3aXNlICJzaGlmdC0iIGlzIGFkZGVkIHRvIHRoZSBidWZmZXIsIGFuZCBsYXRlciBvbiAic2hpZnQtZyINCiAgICAgICAgLy8gd2hpY2ggcmVzdWx0cyBpbiAic2hpZnQtc2hpZnQtZyIgd2hpY2ggZG9lc24ndCBtYWtlIHNlbnNlLg0KICAgICAgICBpZiAoaGFzaElkICE9IDAgJiYgKGtleSA9PSAiIiB8fCBrZXkgPT0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKSkpIHsNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUga2V5Ym9hcmQgaW5wdXQgYnVmZmVyLg0KICAgICAgICB2YXIgciA9IHRoaXMuJGNvbXBvc2VCdWZmZXIoZGF0YSwgaGFzaElkLCBrZXksIGUpOw0KICAgICAgICB2YXIgYnVmZmVyID0gci5idWZmZXJUb1VzZTsNCiAgICAgICAgdmFyIHN5bWJvbGljTmFtZSA9IHIuc3ltYm9saWNOYW1lOw0KICAgICAgICB2YXIga2V5SWQgPSByLmtleUlkZW50aWZpZXI7DQoNCiAgICAgICAgciA9IHRoaXMuJGZpbmQoZGF0YSwgYnVmZmVyLCBzeW1ib2xpY05hbWUsIGhhc2hJZCwga2V5LCBrZXlJZCk7DQogICAgICAgIGlmIChERUJVRykgew0KICAgICAgICAgICAgY29uc29sZS5sb2coIktleWJvYXJkU3RhdGVNYXBwZXIjbWF0Y2giLCBidWZmZXIsIHN5bWJvbGljTmFtZSwgcik7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gcjsNCiAgICB9DQp9DQoNCi8qKg0KICogVGhpcyBpcyBhIHVzZWZ1bCBtYXRjaGluZyBmdW5jdGlvbiBhbmQgdGhlcmVmb3JlIGlzIGRlZmluZWQgaGVyZSBzbyB0aGF0DQogKiB1c2VycyBvZiBLZXlib2FyZFN0YXRlTWFwcGVyIGNhbiB1c2UgaXQuDQogKg0KICogQHJldHVybiBib29sZWFuDQogKiAgICAgICAgICBJZiBubyBjb21tYW5kIGtleSAoQ29tbWFuZHxPcHRpb258U2hpZnR8Q3RybCkgaXMgcHJlc3NlZCwgaXQNCiAqICAgICAgICAgIHJldHVybnMgdHJ1ZS4gSWYgdGhlIG9ubHkgdGhlIFNoaWZ0IGtleSBpcyBwcmVzc2VkICsgYSBjaGFyYWN0ZXINCiAqICAgICAgICAgIHRydWUgaXMgcmV0dXJuZWQgYXMgd2VsbC4gT3RoZXJ3aXNlLCBmYWxzZSBpcyByZXR1cm5lZC4NCiAqICAgICAgICAgIFN1bW1pbmcgdXAsIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbmV2ZXIgdGhlIHVzZXIgdHlwZWQNCiAqICAgICAgICAgIGEgbm9ybWFsIGNoYXJhY3RlciBvbiB0aGUga2V5Ym9hcmQgYW5kIG5vIHNob3J0Y3V0Lg0KICovDQpleHBvcnRzLm1hdGNoQ2hhcmFjdGVyT25seSA9IGZ1bmN0aW9uKGJ1ZmZlciwgaGFzaElkLCBrZXksIHN5bWJvbGljTmFtZSkgew0KICAgIC8vIElmIG5vIGNvbW1hbmQga2V5cyBhcmUgcHJlc3NlZCwgdGhlbiBjYXRjaCB0aGUgaW5wdXQuDQogICAgaWYgKGhhc2hJZCA9PSAwKSB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCiAgICAvLyBJZiBvbmx5IHRoZSBzaGlmdCBrZXkgaXMgcHJlc3NlZCBhbmQgYSBjaGFyYWN0ZXIga2V5LCB0aGVuDQogICAgLy8gY2F0Y2ggdGhhdCBpbnB1dCBhcyB3ZWxsLg0KICAgIGVsc2UgaWYgKChoYXNoSWQgPT0gNCkgJiYga2V5Lmxlbmd0aCA9PSAxKSB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCiAgICAvLyBPdGhlcndpc2UsIHdlIGxldCB0aGUgaW5wdXQgZ290IHRocm91Z2guDQogICAgZWxzZSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQp9Ow0KDQpleHBvcnRzLlN0YXRlSGFuZGxlciA9IFN0YXRlSGFuZGxlcjsNCn0pOw0KOw0KICAgICAgICAgICAgKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpDQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgIA==]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgU2t5d3JpdGVyLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogTW96aWxsYS4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDkNCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgSnVsaWFuIFZpZXJlY2sgKGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbSkNCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9rZXlib2FyZC9rZXliaW5kaW5nL3ZpbScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2tleWJvYXJkL3N0YXRlX2hhbmRsZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBTdGF0ZUhhbmRsZXIgPSByZXF1aXJlKCIuLi9zdGF0ZV9oYW5kbGVyIikuU3RhdGVIYW5kbGVyOw0KdmFyIG1hdGNoQ2hhcmFjdGVyT25seSA9ICByZXF1aXJlKCIuLi9zdGF0ZV9oYW5kbGVyIikubWF0Y2hDaGFyYWN0ZXJPbmx5Ow0KDQp2YXIgdmltY29tbWFuZCA9IGZ1bmN0aW9uKGtleSwgZXhlYywgdGhlbikgew0KICAgIHJldHVybiB7DQogICAgICAgIHJlZ2V4OiAgWyAiKFswLTldKikiLCBrZXkgXSwNCiAgICAgICAgZXhlYzogICBleGVjLA0KICAgICAgICBwYXJhbXM6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBuYW1lOiAgICAgInRpbWVzIiwNCiAgICAgICAgICAgICAgICBtYXRjaDogICAgMSwNCiAgICAgICAgICAgICAgICB0eXBlOiAgICAgIm51bWJlciIsDQogICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAgICAgMQ0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICB0aGVuOiAgIHRoZW4NCiAgICB9DQp9DQoNCnZhciB2aW1TdGF0ZXMgPSB7DQogICAgc3RhcnQ6IFsNCiAgICAgICAgew0KICAgICAgICAgICAga2V5OiAgICAiaSIsDQogICAgICAgICAgICB0aGVuOiAgICJpbnNlcnRNb2RlIg0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICBrZXk6ICAgICJkIiwNCiAgICAgICAgICAgIHRoZW46ICAgImRlbGV0ZU1vZGUiDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogICAgImEiLA0KICAgICAgICAgICAgZXhlYzogICAiZ290b3JpZ2h0IiwNCiAgICAgICAgICAgIHRoZW46ICAgImluc2VydE1vZGUiDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogICAgInNoaWZ0LWkiLA0KICAgICAgICAgICAgZXhlYzogICAiZ290b2xpbmVzdGFydCIsDQogICAgICAgICAgICB0aGVuOiAgICJpbnNlcnRNb2RlIg0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICBrZXk6ICAgICJzaGlmdC1hIiwNCiAgICAgICAgICAgIGV4ZWM6ICAgImdvdG9saW5lZW5kIiwNCiAgICAgICAgICAgIHRoZW46ICAgImluc2VydE1vZGUiDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogICAgInNoaWZ0LWMiLA0KICAgICAgICAgICAgZXhlYzogICAicmVtb3ZldG9saW5lZW5kIiwNCiAgICAgICAgICAgIHRoZW46ICAgImluc2VydE1vZGUiDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogICAgInNoaWZ0LXIiLA0KICAgICAgICAgICAgZXhlYzogICAib3ZlcndyaXRlIiwNCiAgICAgICAgICAgIHRoZW46ICAgInJlcGxhY2VNb2RlIg0KICAgICAgICB9LA0KICAgICAgICB2aW1jb21tYW5kKCIoa3x1cCkiLCAiZ29saW5ldXAiKSwNCiAgICAgICAgdmltY29tbWFuZCgiKGp8ZG93bikiLCAiZ29saW5lZG93biIpLA0KICAgICAgICB2aW1jb21tYW5kKCIobHxyaWdodCkiLCAiZ290b3JpZ2h0IiksDQogICAgICAgIHZpbWNvbW1hbmQoIihofGxlZnQpIiwgImdvdG9sZWZ0IiksDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogICAgInNoaWZ0LWciLA0KICAgICAgICAgICAgZXhlYzogICAiZ290b2VuZCINCiAgICAgICAgfSwNCiAgICAgICAgdmltY29tbWFuZCgiYiIsICJnb3Rvd29yZGxlZnQiKSwNCiAgICAgICAgdmltY29tbWFuZCgiZSIsICJnb3Rvd29yZHJpZ2h0IiksDQogICAgICAgIHZpbWNvbW1hbmQoIngiLCAiZGVsIiksDQogICAgICAgIHZpbWNvbW1hbmQoInNoaWZ0LXgiLCAiYmFja3NwYWNlIiksDQogICAgICAgIHZpbWNvbW1hbmQoInNoaWZ0LWQiLCAicmVtb3ZldG9saW5lZW5kIiksDQogICAgICAgIHZpbWNvbW1hbmQoInUiLCAidW5kbyIpLCAvLyBbY291bnRdIG9uIHRoaXMgbWF5L21heSBub3Qgd29yaywgZGVwZW5kaW5nIG9uIGJyb3dzZXIgaW1wbGVtZW50YXRpb24uLi4NCiAgICAgICAgew0KICAgICAgICAgICAgY29tbWVudDogICAgIkNhdGNoIHNvbWUga2V5Ym9hcmQgaW5wdXQgdG8gc3RvcCBpdCBoZXJlIiwNCiAgICAgICAgICAgIG1hdGNoOiAgICAgIG1hdGNoQ2hhcmFjdGVyT25seQ0KICAgICAgICB9DQogICAgXSwNCiAgICBpbnNlcnRNb2RlOiBbDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogICAgICAiZXNjIiwNCiAgICAgICAgICAgIHRoZW46ICAgICAic3RhcnQiDQogICAgICAgIH0NCiAgICBdLA0KICAgIHJlcGxhY2VNb2RlOiBbDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogICAgICAiZXNjIiwNCiAgICAgICAgICAgIGV4ZWM6ICAgICAib3ZlcndyaXRlIiwNCiAgICAgICAgICAgIHRoZW46ICAgICAic3RhcnQiDQogICAgICAgIH0NCiAgICBdLA0KICAgIGRlbGV0ZU1vZGU6IFsNCiAgICAgICAgew0KICAgICAgICAgICAga2V5OiAgICAgICJkIiwNCiAgICAgICAgICAgIGV4ZWM6ICAgICAicmVtb3ZlbGluZSIsDQogICAgICAgICAgICB0aGVuOiAgICAgInN0YXJ0Ig0KICAgICAgICB9DQogICAgXQ0KfTsNCg0KZXhwb3J0cy5WaW0gPSBuZXcgU3RhdGVIYW5kbGVyKHZpbVN0YXRlcyk7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgU2t5d3JpdGVyLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogTW96aWxsYS4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDkNCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgSnVsaWFuIFZpZXJlY2sgKGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbSkNCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9rZXlib2FyZC9zdGF0ZV9oYW5kbGVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KLy8gSWYgeW91J3JlIGRldmVsb3BpbmcgYSBuZXcga2V5bWFwcGluZyBhbmQgd2FudCB0byBnZXQgYW4gaWRlYSB3aGF0J3MgZ29pbmcNCi8vIG9uLCB0aGVuIGVuYWJsZSBkZWJ1Z2dpbmcuDQp2YXIgREVCVUcgPSBmYWxzZTsNCg0KZnVuY3Rpb24gU3RhdGVIYW5kbGVyKGtleW1hcHBpbmcpIHsNCiAgICB0aGlzLmtleW1hcHBpbmcgPSB0aGlzLiRidWlsZEtleW1hcHBpbmdSZWdleChrZXltYXBwaW5nKTsNCn0NCg0KU3RhdGVIYW5kbGVyLnByb3RvdHlwZSA9IHsNCiAgICAvKioNCiAgICAgKiBCdWlsZCB0aGUgUmVnRXhwIGZyb20gdGhlIGtleW1hcHBpbmcgYXMgUmVnRXhwIGNhbid0IHN0b3JlZCBkaXJlY3RseQ0KICAgICAqIGluIHRoZSBtZXRhZGF0YSBKU09OIGFuZCBhcyB0aGUgUmVnRXhwIHVzZWQgdG8gbWF0Y2ggdGhlIGtleXMvYnVmZmVyDQogICAgICogbmVlZCB0byBiZSBhZGFwdGVkLg0KICAgICAqLw0KICAgICRidWlsZEtleW1hcHBpbmdSZWdleDogZnVuY3Rpb24oa2V5bWFwcGluZykgew0KICAgICAgICBmb3IgKHZhciBzdGF0ZSBpbiBrZXltYXBwaW5nKSB7DQogICAgICAgICAgICB0aGlzLiRidWlsZEJpbmRpbmdzUmVnZXgoa2V5bWFwcGluZ1tzdGF0ZV0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBrZXltYXBwaW5nOw0KICAgIH0sDQoNCiAgICAkYnVpbGRCaW5kaW5nc1JlZ2V4OiBmdW5jdGlvbihiaW5kaW5ncykgew0KICAgICAgICAvLyBFc2NhcGUgYSBnaXZlbiBSZWdleCBzdHJpbmcuDQogICAgICAgIGJpbmRpbmdzLmZvckVhY2goZnVuY3Rpb24oYmluZGluZykgew0KICAgICAgICAgICAgaWYgKGJpbmRpbmcua2V5KSB7DQogICAgICAgICAgICAgICAgYmluZGluZy5rZXkgPSBuZXcgUmVnRXhwKCdeJyArIGJpbmRpbmcua2V5ICsgJyQnKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShiaW5kaW5nLnJlZ2V4KSkgew0KICAgICAgICAgICAgICAgIGlmICghKCdrZXknIGluIGJpbmRpbmcpKQ0KICAgICAgICAgICAgICAgICAgYmluZGluZy5rZXkgPSBuZXcgUmVnRXhwKCdeJyArIGJpbmRpbmcucmVnZXhbMV0gKyAnJCcpOw0KICAgICAgICAgICAgICAgIGJpbmRpbmcucmVnZXggPSBuZXcgUmVnRXhwKGJpbmRpbmcucmVnZXguam9pbignJykgKyAnJCcpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChiaW5kaW5nLnJlZ2V4KSB7DQogICAgICAgICAgICAgICAgYmluZGluZy5yZWdleCA9IG5ldyBSZWdFeHAoYmluZGluZy5yZWdleCArICckJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0sDQoNCiAgICAkY29tcG9zZUJ1ZmZlcjogZnVuY3Rpb24oZGF0YSwgaGFzaElkLCBrZXksIGUpIHsNCiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZGF0YSBvYmplY3QuDQogICAgICAgIGlmIChkYXRhLnN0YXRlID09IG51bGwgfHwgZGF0YS5idWZmZXIgPT0gbnVsbCkgew0KICAgICAgICAgICAgZGF0YS5zdGF0ZSA9ICJzdGFydCI7DQogICAgICAgICAgICBkYXRhLmJ1ZmZlciA9ICIiOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGtleUFycmF5ID0gW107DQogICAgICAgIGlmIChoYXNoSWQgJiAxKSBrZXlBcnJheS5wdXNoKCJjdHJsIik7DQogICAgICAgIGlmIChoYXNoSWQgJiA4KSBrZXlBcnJheS5wdXNoKCJjb21tYW5kIik7DQogICAgICAgIGlmIChoYXNoSWQgJiAyKSBrZXlBcnJheS5wdXNoKCJvcHRpb24iKTsNCiAgICAgICAgaWYgKGhhc2hJZCAmIDQpIGtleUFycmF5LnB1c2goInNoaWZ0Iik7DQogICAgICAgIGlmIChrZXkpICAgICAgICBrZXlBcnJheS5wdXNoKGtleSk7DQoNCiAgICAgICAgdmFyIHN5bWJvbGljTmFtZSA9IGtleUFycmF5LmpvaW4oIi0iKTsNCiAgICAgICAgdmFyIGJ1ZmZlclRvVXNlID0gZGF0YS5idWZmZXIgKyBzeW1ib2xpY05hbWU7DQoNCiAgICAgICAgLy8gRG9uJ3QgYWRkIHRoZSBzeW1ib2xpYyBuYW1lIHRvIHRoZSBrZXkgYnVmZmVyIGlmIHRoZSBhbHRfIGtleSBpcw0KICAgICAgICAvLyBwYXJ0IG9mIHRoZSBzeW1ib2xpYyBuYW1lLiBJZiBpdCBzdGFydHMgd2l0aCBhbHRfLCB0aGlzIG1lYW5zDQogICAgICAgIC8vIHRoYXQgdGhlIHVzZXIgaGl0IGFuIGFsdCBrZXljb21ibyBhbmQgdGhlcmUgd2lsbCBiZSBhIHNpbmdsZSwNCiAgICAgICAgLy8gbmV3IGNoYXJhY3RlciBkZXRlY3RlZCBhZnRlciB0aGlzIGV2ZW50LCB3aGljaCB0aGVuIHdpbGwgYmUNCiAgICAgICAgLy8gYWRkZWQgdG8gdGhlIGJ1ZmZlciAoZS5nLiBhbHRfaiB3aWxsIHJlc3VsdCBpbiDiiIYpLg0KICAgICAgICAvLw0KICAgICAgICAvLyBXZSB0ZXN0IGZvciAyIGFuZCBub3QgZm9yICYgMiBhcyB3ZSBvbmx5IHdhbnQgdG8gZXhjbHVkZSB0aGUgY2FzZSB3aGVyZQ0KICAgICAgICAvLyB0aGUgb3B0aW9uIGtleSBpcyBwcmVzc2VkIGFsb25lLg0KICAgICAgICBpZiAoaGFzaElkICE9IDIpIHsNCiAgICAgICAgICAgIGRhdGEuYnVmZmVyID0gYnVmZmVyVG9Vc2U7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgYnVmZmVyT2JqID0gew0KICAgICAgICAgICAgYnVmZmVyVG9Vc2U6IGJ1ZmZlclRvVXNlLA0KICAgICAgICAgICAgc3ltYm9saWNOYW1lOiBzeW1ib2xpY05hbWUsDQogICAgICAgIH07DQoNCiAgICAgICAgaWYgKGUpIHsNCiAgICAgICAgICAgIGJ1ZmZlck9iai5rZXlJZGVudGlmaWVyID0gZS5rZXlJZGVudGlmaWVyDQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gYnVmZmVyT2JqOw0KICAgIH0sDQoNCiAgICAkZmluZDogZnVuY3Rpb24oZGF0YSwgYnVmZmVyLCBzeW1ib2xpY05hbWUsIGhhc2hJZCwga2V5LCBrZXlJZGVudGlmaWVyKSB7DQogICAgICAgIC8vIEhvbGRzIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgYW5kIHRoZSBhcmdzIGlmIGEgY29tbWFuZCBtYXRjaGVkLg0KICAgICAgICB2YXIgcmVzdWx0ID0ge307DQoNCiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgYmluZGluZ3Mgb2YgdGhlIGtleW1hcCB1bnRpbCBhIG1hdGNoIGlzIGZvdW5kLg0KICAgICAgICB0aGlzLmtleW1hcHBpbmdbZGF0YS5zdGF0ZV0uc29tZShmdW5jdGlvbihiaW5kaW5nKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2g7DQoNCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgbWF0Y2hlcy4NCiAgICAgICAgICAgIGlmIChiaW5kaW5nLmtleSAmJiAhYmluZGluZy5rZXkudGVzdChzeW1ib2xpY05hbWUpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVnZXggbWF0Y2hlcy4NCiAgICAgICAgICAgIGlmIChiaW5kaW5nLnJlZ2V4ICYmICEobWF0Y2ggPSBiaW5kaW5nLnJlZ2V4LmV4ZWMoYnVmZmVyKSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBtYXRjaCBmdW5jdGlvbiBtYXRjaGVzLg0KICAgICAgICAgICAgaWYgKGJpbmRpbmcubWF0Y2ggJiYgIWJpbmRpbmcubWF0Y2goYnVmZmVyLCBoYXNoSWQsIGtleSwgc3ltYm9saWNOYW1lLCBrZXlJZGVudGlmaWVyKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGRpc2FsbG93ZWQgbWF0Y2hlcy4NCiAgICAgICAgICAgIGlmIChiaW5kaW5nLmRpc2FsbG93TWF0Y2hlcykgew0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmluZGluZy5kaXNhbGxvd01hdGNoZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCEhbWF0Y2hbYmluZGluZy5kaXNhbGxvd01hdGNoZXNbaV1dKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgY29tbWFuZCB0byBleGVjdXRlLCB0aGVuIGZpZ3VyZSBvdXQgdGhlDQogICAgICAgICAgICAvLyBjb21tYW5kIGFuZCB0aGUgYXJndW1lbnRzLg0KICAgICAgICAgICAgaWYgKGJpbmRpbmcuZXhlYykgew0KICAgICAgICAgICAgICAgIHJlc3VsdC5jb21tYW5kID0gYmluZGluZy5leGVjOw0KDQogICAgICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGFyZ3VtZW50cy4NCiAgICAgICAgICAgICAgICBpZiAoYmluZGluZy5wYXJhbXMpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlOw0KICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXJncyA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLnBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uKHBhcmFtKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0ubWF0Y2ggIT0gbnVsbCAmJiBtYXRjaCAhPSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtYXRjaFtwYXJhbS5tYXRjaF0gfHwgcGFyYW0uZGVmYXVsdFZhbHVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcmFtLmRlZmF1bHRWYWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLnR5cGUgPT09ICdudW1iZXInKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcmdzW3BhcmFtLm5hbWVdID0gdmFsdWU7DQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBkYXRhLmJ1ZmZlciA9ICIiOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBIYW5kbGUgdGhlICd0aGVuJyBwcm9wZXJ0eS4NCiAgICAgICAgICAgIGlmIChiaW5kaW5nLnRoZW4pIHsNCiAgICAgICAgICAgICAgICBkYXRhLnN0YXRlID0gYmluZGluZy50aGVuOw0KICAgICAgICAgICAgICAgIGRhdGEuYnVmZmVyID0gIiI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIElmIG5vIGNvbW1hbmQgaXMgc2V0LCB0aGVuIGV4ZWN1dGUgdGhlICJudWxsIiBmYWtlIGNvbW1hbmQuDQogICAgICAgICAgICBpZiAocmVzdWx0LmNvbW1hbmQgPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIHJlc3VsdC5jb21tYW5kID0gIm51bGwiOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoREVCVUcpIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiS2V5Ym9hcmRTdGF0ZU1hcHBlciNmaW5kIiwgYmluZGluZyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgaWYgKHJlc3VsdC5jb21tYW5kKSB7DQogICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZGF0YS5idWZmZXIgPSAiIjsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBrZXlCaW5kaW5nLg0KICAgICAqLw0KICAgIGhhbmRsZUtleWJvYXJkOiBmdW5jdGlvbihkYXRhLCBoYXNoSWQsIGtleSwga2V5Q29kZSwgZSkgew0KICAgICAgICAvLyBJZiB3ZSBwcmVzc2VkIGFueSBjb21tYW5kIGtleSBidXQgbm8gb3RoZXIga2V5LCB0aGVuIGlnbm9yZSB0aGUgaW5wdXQuDQogICAgICAgIC8vIE90aGVyd2lzZSAic2hpZnQtIiBpcyBhZGRlZCB0byB0aGUgYnVmZmVyLCBhbmQgbGF0ZXIgb24gInNoaWZ0LWciDQogICAgICAgIC8vIHdoaWNoIHJlc3VsdHMgaW4gInNoaWZ0LXNoaWZ0LWciIHdoaWNoIGRvZXNuJ3QgbWFrZSBzZW5zZS4NCiAgICAgICAgaWYgKGhhc2hJZCAhPSAwICYmIChrZXkgPT0gIiIgfHwga2V5ID09IFN0cmluZy5mcm9tQ2hhckNvZGUoMCkpKSB7DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIENvbXB1dGUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGtleWJvYXJkIGlucHV0IGJ1ZmZlci4NCiAgICAgICAgdmFyIHIgPSB0aGlzLiRjb21wb3NlQnVmZmVyKGRhdGEsIGhhc2hJZCwga2V5LCBlKTsNCiAgICAgICAgdmFyIGJ1ZmZlciA9IHIuYnVmZmVyVG9Vc2U7DQogICAgICAgIHZhciBzeW1ib2xpY05hbWUgPSByLnN5bWJvbGljTmFtZTsNCiAgICAgICAgdmFyIGtleUlkID0gci5rZXlJZGVudGlmaWVyOw0KDQogICAgICAgIHIgPSB0aGlzLiRmaW5kKGRhdGEsIGJ1ZmZlciwgc3ltYm9saWNOYW1lLCBoYXNoSWQsIGtleSwga2V5SWQpOw0KICAgICAgICBpZiAoREVCVUcpIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJLZXlib2FyZFN0YXRlTWFwcGVyI21hdGNoIiwgYnVmZmVyLCBzeW1ib2xpY05hbWUsIHIpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHI7DQogICAgfQ0KfQ0KDQovKioNCiAqIFRoaXMgaXMgYSB1c2VmdWwgbWF0Y2hpbmcgZnVuY3Rpb24gYW5kIHRoZXJlZm9yZSBpcyBkZWZpbmVkIGhlcmUgc28gdGhhdA0KICogdXNlcnMgb2YgS2V5Ym9hcmRTdGF0ZU1hcHBlciBjYW4gdXNlIGl0Lg0KICoNCiAqIEByZXR1cm4gYm9vbGVhbg0KICogICAgICAgICAgSWYgbm8gY29tbWFuZCBrZXkgKENvbW1hbmR8T3B0aW9ufFNoaWZ0fEN0cmwpIGlzIHByZXNzZWQsIGl0DQogKiAgICAgICAgICByZXR1cm5zIHRydWUuIElmIHRoZSBvbmx5IHRoZSBTaGlmdCBrZXkgaXMgcHJlc3NlZCArIGEgY2hhcmFjdGVyDQogKiAgICAgICAgICB0cnVlIGlzIHJldHVybmVkIGFzIHdlbGwuIE90aGVyd2lzZSwgZmFsc2UgaXMgcmV0dXJuZWQuDQogKiAgICAgICAgICBTdW1taW5nIHVwLCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW5ldmVyIHRoZSB1c2VyIHR5cGVkDQogKiAgICAgICAgICBhIG5vcm1hbCBjaGFyYWN0ZXIgb24gdGhlIGtleWJvYXJkIGFuZCBubyBzaG9ydGN1dC4NCiAqLw0KZXhwb3J0cy5tYXRjaENoYXJhY3Rlck9ubHkgPSBmdW5jdGlvbihidWZmZXIsIGhhc2hJZCwga2V5LCBzeW1ib2xpY05hbWUpIHsNCiAgICAvLyBJZiBubyBjb21tYW5kIGtleXMgYXJlIHByZXNzZWQsIHRoZW4gY2F0Y2ggdGhlIGlucHV0Lg0KICAgIGlmIChoYXNoSWQgPT0gMCkgew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQogICAgLy8gSWYgb25seSB0aGUgc2hpZnQga2V5IGlzIHByZXNzZWQgYW5kIGEgY2hhcmFjdGVyIGtleSwgdGhlbg0KICAgIC8vIGNhdGNoIHRoYXQgaW5wdXQgYXMgd2VsbC4NCiAgICBlbHNlIGlmICgoaGFzaElkID09IDQpICYmIGtleS5sZW5ndGggPT0gMSkgew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQogICAgLy8gT3RoZXJ3aXNlLCB3ZSBsZXQgdGhlIGlucHV0IGdvdCB0aHJvdWdoLg0KICAgIGVsc2Ugew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KfTsNCg0KZXhwb3J0cy5TdGF0ZUhhbmRsZXIgPSBTdGF0ZUhhbmRsZXI7DQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBTaGxvbW8gWmFsbWFuIEhlaWdoIDxzaGxvbW96YWxtYW5oZWlnaCBBVCBnbWFpbCBET1QgY29tPg0KICogICAgICBDYXJpbiBNZWllcg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvY2xvanVyZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2Nsb2p1cmVfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX3BhcmVuc19vdXRkZW50JywgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIENsb2p1cmVIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vY2xvanVyZV9oaWdobGlnaHRfcnVsZXMiKS5DbG9qdXJlSGlnaGxpZ2h0UnVsZXM7DQp2YXIgTWF0Y2hpbmdQYXJlbnNPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19wYXJlbnNfb3V0ZGVudCIpLk1hdGNoaW5nUGFyZW5zT3V0ZGVudDsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgQ2xvanVyZUhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ1BhcmVuc091dGRlbnQoKTsNCn07DQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOw0KICAgICAgICB2YXIgcmUgPSAvXihccyopIy87DQoNCiAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG91dGRlbnQpIHsNCiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIjsiKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOw0KDQogICAgICAgIHZhciB0b2tlbml6ZWRMaW5lID0gdGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMobGluZSwgc3RhdGUpOw0KICAgICAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVkTGluZS50b2tlbnM7DQoNCiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV0udHlwZSA9PSAiY29tbWVudCIpIHsNCiAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmIChzdGF0ZSA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9bXChcW10vKTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiICAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbWF0Y2ggPSBsaW5lLm1hdGNoKC9bXCldLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgaW5kZW50ID0gIiI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgIH07DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7DQogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIFNobG9tbyBaYWxtYW4gSGVpZ2ggPHNobG9tb3phbG1hbmhlaWdoIEFUIGdtYWlsIERPVCBjb20+DQogKiAgICAgIENhcmluIE1laWVyDQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jbG9qdXJlX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCg0KDQp2YXIgQ2xvanVyZUhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICAgICB2YXIgYnVpbHRpbkZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCcqICoxICoyICozICphZ2VudCogKmFsbG93LXVucmVzb2x2ZWQtdmFycyogKmFzc2VydCogKmNsb2p1cmUtdmVyc2lvbiogJyArDQogICAgICAgICAgICAnKmNvbW1hbmQtbGluZS1hcmdzKiAqY29tcGlsZS1maWxlcyogKmNvbXBpbGUtcGF0aCogKmUgKmVyciogKmZpbGUqICcgKw0KICAgICAgICAgICAgJypmbHVzaC1vbi1uZXdsaW5lKiAqaW4qICptYWNyby1tZXRhKiAqbWF0aC1jb250ZXh0KiAqbnMqICpvdXQqICcgKw0KICAgICAgICAgICAgJypwcmludC1kdXAqICpwcmludC1sZW5ndGgqICpwcmludC1sZXZlbCogKnByaW50LW1ldGEqICpwcmludC1yZWFkYWJseSogJyArDQogICAgICAgICAgICAnKnJlYWQtZXZhbCogKnNvdXJjZS1wYXRoKiAqdXNlLWNvbnRleHQtY2xhc3Nsb2FkZXIqICcgKw0KICAgICAgICAgICAgJyp3YXJuLW9uLXJlZmxlY3Rpb24qICsgLSAtPiAtJmd0OyAtPj4gLSZndDsmZ3Q7IC4uIC8gPCAmbHQ7IDw9ICZsdDs9ID0gJyArDQogICAgICAgICAgICAnPT0gPiAmZ3Q7ID49ICZndDs9IGFjY2Vzc29yIGFjbG9uZSAnICsNCiAgICAgICAgICAgICdhZGQtY2xhc3NwYXRoIGFkZC13YXRjaCBhZ2VudCBhZ2VudC1lcnJvcnMgYWdldCBhbGVuZ3RoIGFsaWFzIGFsbC1ucyAnICsNCiAgICAgICAgICAgICdhbHRlciBhbHRlci1tZXRhISBhbHRlci12YXItcm9vdCBhbWFwIGFuY2VzdG9ycyBhbmQgYXBwbHkgYXJlZHVjZSAnICsNCiAgICAgICAgICAgICdhcnJheS1tYXAgYXNldCBhc2V0LWJvb2xlYW4gYXNldC1ieXRlIGFzZXQtY2hhciBhc2V0LWRvdWJsZSBhc2V0LWZsb2F0ICcgKw0KICAgICAgICAgICAgJ2FzZXQtaW50IGFzZXQtbG9uZyBhc2V0LXNob3J0IGFzc2VydCBhc3NvYyBhc3NvYyEgYXNzb2MtaW4gYXNzb2NpYXRpdmU/ICcgKw0KICAgICAgICAgICAgJ2F0b20gYXdhaXQgYXdhaXQtZm9yIGF3YWl0MSBiYXNlcyBiZWFuIGJpZ2RlYyBiaWdpbnQgYmluZGluZyBiaXQtYW5kICcgKw0KICAgICAgICAgICAgJ2JpdC1hbmQtbm90IGJpdC1jbGVhciBiaXQtZmxpcCBiaXQtbm90IGJpdC1vciBiaXQtc2V0IGJpdC1zaGlmdC1sZWZ0ICcgKw0KICAgICAgICAgICAgJ2JpdC1zaGlmdC1yaWdodCBiaXQtdGVzdCBiaXQteG9yIGJvb2xlYW4gYm9vbGVhbi1hcnJheSBib29sZWFucyAnICsNCiAgICAgICAgICAgICdib3VuZC1mbiBib3VuZC1mbiogYnV0bGFzdCBieXRlIGJ5dGUtYXJyYXkgYnl0ZXMgY2FzdCBjaGFyIGNoYXItYXJyYXkgJyArDQogICAgICAgICAgICAnY2hhci1lc2NhcGUtc3RyaW5nIGNoYXItbmFtZS1zdHJpbmcgY2hhcj8gY2hhcnMgY2h1bmsgY2h1bmstYXBwZW5kICcgKw0KICAgICAgICAgICAgJ2NodW5rLWJ1ZmZlciBjaHVuay1jb25zIGNodW5rLWZpcnN0IGNodW5rLW5leHQgY2h1bmstcmVzdCBjaHVua2VkLXNlcT8gJyArDQogICAgICAgICAgICAnY2xhc3MgY2xhc3M/IGNsZWFyLWFnZW50LWVycm9ycyBjbG9qdXJlLXZlcnNpb24gY29sbD8gY29tbWVudCBjb21tdXRlICcgKw0KICAgICAgICAgICAgJ2NvbXAgY29tcGFyYXRvciBjb21wYXJlIGNvbXBhcmUtYW5kLXNldCEgY29tcGlsZSBjb21wbGVtZW50IGNvbmNhdCBjb25kICcgKw0KICAgICAgICAgICAgJ2NvbmRwIGNvbmogY29uaiEgY29ucyBjb25zdGFudGx5IGNvbnN0cnVjdC1wcm94eSBjb250YWlucz8gY291bnQgJyArDQogICAgICAgICAgICAnY291bnRlZD8gY3JlYXRlLW5zIGNyZWF0ZS1zdHJ1Y3QgY3ljbGUgZGVjIGRlY2ltYWw/IGRlY2xhcmUgZGVmaW5saW5lICcgKw0KICAgICAgICAgICAgJ2RlZm1hY3JvIGRlZm1ldGhvZCBkZWZtdWx0aSBkZWZuIGRlZm4tIGRlZm9uY2UgZGVmc3RydWN0IGRlbGF5IGRlbGF5PyAnICsNCiAgICAgICAgICAgICdkZWxpdmVyIGRlcmVmIGRlcml2ZSBkZXNjZW5kYW50cyBkZXN0cnVjdHVyZSBkaXNqIGRpc2ohIGRpc3NvYyBkaXNzb2MhICcgKw0KICAgICAgICAgICAgJ2Rpc3RpbmN0IGRpc3RpbmN0PyBkb2FsbCBkb2MgZG9ydW4gZG9zZXEgZG9zeW5jIGRvdGltZXMgZG90byBkb3VibGUgJyArDQogICAgICAgICAgICAnZG91YmxlLWFycmF5IGRvdWJsZXMgZHJvcCBkcm9wLWxhc3QgZHJvcC13aGlsZSBlbXB0eSBlbXB0eT8gZW5zdXJlICcgKw0KICAgICAgICAgICAgJ2VudW1lcmF0aW9uLXNlcSBldmFsIGV2ZW4/IGV2ZXJ5PyBmYWxzZT8gZmZpcnN0IGZpbGUtc2VxIGZpbHRlciBmaW5kICcgKw0KICAgICAgICAgICAgJ2ZpbmQtZG9jIGZpbmQtbnMgZmluZC12YXIgZmlyc3QgZmxvYXQgZmxvYXQtYXJyYXkgZmxvYXQ/IGZsb2F0cyBmbHVzaCAnICsNCiAgICAgICAgICAgICdmbiBmbj8gZm5leHQgZm9yIGZvcmNlIGZvcm1hdCBmdXR1cmUgZnV0dXJlLWNhbGwgZnV0dXJlLWNhbmNlbCAnICsNCiAgICAgICAgICAgICdmdXR1cmUtY2FuY2VsbGVkPyBmdXR1cmUtZG9uZT8gZnV0dXJlPyBnZW4tY2xhc3MgZ2VuLWludGVyZmFjZSBnZW5zeW0gJyArDQogICAgICAgICAgICAnZ2V0IGdldC1pbiBnZXQtbWV0aG9kIGdldC1wcm94eS1jbGFzcyBnZXQtdGhyZWFkLWJpbmRpbmdzIGdldC12YWxpZGF0b3IgJyArDQogICAgICAgICAgICAnaGFzaCBoYXNoLW1hcCBoYXNoLXNldCBpZGVudGljYWw/IGlkZW50aXR5IGlmLWxldCBpZi1ub3QgaWZuPyBpbXBvcnQgJyArDQogICAgICAgICAgICAnaW4tbnMgaW5jIGluaXQtcHJveHkgaW5zdGFuY2U/IGludCBpbnQtYXJyYXkgaW50ZWdlcj8gaW50ZXJsZWF2ZSBpbnRlcm4gJyArDQogICAgICAgICAgICAnaW50ZXJwb3NlIGludG8gaW50by1hcnJheSBpbnRzIGlvISBpc2E/IGl0ZXJhdGUgaXRlcmF0b3Itc2VxIGp1eHQga2V5ICcgKw0KICAgICAgICAgICAgJ2tleXMga2V5d29yZCBrZXl3b3JkPyBsYXN0IGxhenktY2F0IGxhenktc2VxIGxldCBsZXRmbiBsaW5lLXNlcSBsaXN0ICcgKw0KICAgICAgICAgICAgJ2xpc3QqIGxpc3Q/IGxvYWQgbG9hZC1maWxlIGxvYWQtcmVhZGVyIGxvYWQtc3RyaW5nIGxvYWRlZC1saWJzIGxvY2tpbmcgJyArDQogICAgICAgICAgICAnbG9uZyBsb25nLWFycmF5IGxvbmdzIGxvb3AgbWFjcm9leHBhbmQgbWFjcm9leHBhbmQtMSBtYWtlLWFycmF5ICcgKw0KICAgICAgICAgICAgJ21ha2UtaGllcmFyY2h5IG1hcCBtYXA/IG1hcGNhdCBtYXggbWF4LWtleSBtZW1mbiBtZW1vaXplIG1lcmdlICcgKw0KICAgICAgICAgICAgJ21lcmdlLXdpdGggbWV0YSBtZXRob2Qtc2lnIG1ldGhvZHMgbWluIG1pbi1rZXkgbW9kIG5hbWUgbmFtZXNwYWNlIG5lZz8gJyArDQogICAgICAgICAgICAnbmV3bGluZSBuZXh0IG5maXJzdCBuaWw/IG5uZXh0IG5vdCBub3QtYW55PyBub3QtZW1wdHkgbm90LWV2ZXJ5PyBub3Q9ICcgKw0KICAgICAgICAgICAgJ25zIG5zLWFsaWFzZXMgbnMtaW1wb3J0cyBucy1pbnRlcm5zIG5zLW1hcCBucy1uYW1lIG5zLXB1YmxpY3MgJyArDQogICAgICAgICAgICAnbnMtcmVmZXJzIG5zLXJlc29sdmUgbnMtdW5hbGlhcyBucy11bm1hcCBudGggbnRobmV4dCBudW0gbnVtYmVyPyBvZGQ/ICcgKw0KICAgICAgICAgICAgJ29yIHBhcmVudHMgcGFydGlhbCBwYXJ0aXRpb24gcGNhbGxzIHBlZWsgcGVyc2lzdGVudCEgcG1hcCBwb3AgcG9wISAnICsNCiAgICAgICAgICAgICdwb3AtdGhyZWFkLWJpbmRpbmdzIHBvcz8gcHIgcHItc3RyIHByZWZlci1tZXRob2QgcHJlZmVycyAnICsNCiAgICAgICAgICAgICdwcmltaXRpdmVzLWNsYXNzbmFtZXMgcHJpbnQgcHJpbnQtY3RvciBwcmludC1kb2MgcHJpbnQtZHVwIHByaW50LW1ldGhvZCAnICsNCiAgICAgICAgICAgICdwcmludC1uYW1lc3BhY2UtZG9jIHByaW50LXNpbXBsZSBwcmludC1zcGVjaWFsLWRvYyBwcmludC1zdHIgcHJpbnRmICcgKw0KICAgICAgICAgICAgJ3ByaW50bG4gcHJpbnRsbi1zdHIgcHJuIHBybi1zdHIgcHJvbWlzZSBwcm94eSBwcm94eS1jYWxsLXdpdGgtc3VwZXIgJyArDQogICAgICAgICAgICAncHJveHktbWFwcGluZ3MgcHJveHktbmFtZSBwcm94eS1zdXBlciBwdXNoLXRocmVhZC1iaW5kaW5ncyBwdmFsdWVzIHF1b3QgJyArDQogICAgICAgICAgICAncmFuZCByYW5kLWludCByYW5nZSByYXRpbz8gcmF0aW9uYWw/IHJhdGlvbmFsaXplIHJlLWZpbmQgcmUtZ3JvdXBzICcgKw0KICAgICAgICAgICAgJ3JlLW1hdGNoZXIgcmUtbWF0Y2hlcyByZS1wYXR0ZXJuIHJlLXNlcSByZWFkIHJlYWQtbGluZSByZWFkLXN0cmluZyAnICsNCiAgICAgICAgICAgICdyZWR1Y2UgcmVmIHJlZi1oaXN0b3J5LWNvdW50IHJlZi1tYXgtaGlzdG9yeSByZWYtbWluLWhpc3RvcnkgcmVmLXNldCAnICsNCiAgICAgICAgICAgICdyZWZlciByZWZlci1jbG9qdXJlIHJlbGVhc2UtcGVuZGluZy1zZW5kcyByZW0gcmVtb3ZlIHJlbW92ZS1tZXRob2QgJyArDQogICAgICAgICAgICAncmVtb3ZlLW5zIHJlbW92ZS13YXRjaCByZXBlYXQgcmVwZWF0ZWRseSByZXBsYWNlIHJlcGxpY2F0ZSByZXF1aXJlICcgKw0KICAgICAgICAgICAgJ3Jlc2V0ISByZXNldC1tZXRhISByZXNvbHZlIHJlc3QgcmVzdWx0c2V0LXNlcSByZXZlcnNlIHJldmVyc2libGU/IHJzZXEgJyArDQogICAgICAgICAgICAncnN1YnNlcSBzZWNvbmQgc2VsZWN0LWtleXMgc2VuZCBzZW5kLW9mZiBzZXEgc2VxPyBzZXF1ZSBzZXF1ZW5jZSAnICsNCiAgICAgICAgICAgICdzZXF1ZW50aWFsPyBzZXQgc2V0LXZhbGlkYXRvciEgc2V0PyBzaG9ydCBzaG9ydC1hcnJheSBzaG9ydHMgJyArDQogICAgICAgICAgICAnc2h1dGRvd24tYWdlbnRzIHNsdXJwIHNvbWUgc29ydCBzb3J0LWJ5IHNvcnRlZC1tYXAgc29ydGVkLW1hcC1ieSAnICsNCiAgICAgICAgICAgICdzb3J0ZWQtc2V0IHNvcnRlZC1zZXQtYnkgc29ydGVkPyBzcGVjaWFsLWZvcm0tYW5jaG9yIHNwZWNpYWwtc3ltYm9sPyAnICsNCiAgICAgICAgICAgICdzcGxpdC1hdCBzcGxpdC13aXRoIHN0ciBzdHJlYW0/IHN0cmluZz8gc3RydWN0IHN0cnVjdC1tYXAgc3VicyBzdWJzZXEgJyArDQogICAgICAgICAgICAnc3VidmVjIHN1cGVycyBzd2FwISBzeW1ib2wgc3ltYm9sPyBzeW5jIHN5bnRheC1zeW1ib2wtYW5jaG9yIHRha2UgJyArDQogICAgICAgICAgICAndGFrZS1sYXN0IHRha2UtbnRoIHRha2Utd2hpbGUgdGVzdCB0aGUtbnMgdGltZSB0by1hcnJheSB0by1hcnJheS0yZCAnICsNCiAgICAgICAgICAgICd0cmFtcG9saW5lIHRyYW5zaWVudCB0cmVlLXNlcSB0cnVlPyB0eXBlIHVuY2hlY2tlZC1hZGQgdW5jaGVja2VkLWRlYyAnICsNCiAgICAgICAgICAgICd1bmNoZWNrZWQtZGl2aWRlIHVuY2hlY2tlZC1pbmMgdW5jaGVja2VkLW11bHRpcGx5IHVuY2hlY2tlZC1uZWdhdGUgJyArDQogICAgICAgICAgICAndW5jaGVja2VkLXJlbWFpbmRlciB1bmNoZWNrZWQtc3VidHJhY3QgdW5kZXJpdmUgdW5xdW90ZSAnICsNCiAgICAgICAgICAgICd1bnF1b3RlLXNwbGljaW5nIHVwZGF0ZS1pbiB1cGRhdGUtcHJveHkgdXNlIHZhbCB2YWxzIHZhci1nZXQgdmFyLXNldCAnICsNCiAgICAgICAgICAgICd2YXI/IHZhcnktbWV0YSB2ZWMgdmVjdG9yIHZlY3Rvcj8gd2hlbiB3aGVuLWZpcnN0IHdoZW4tbGV0IHdoZW4tbm90ICcgKw0KICAgICAgICAgICAgJ3doaWxlIHdpdGgtYmluZGluZ3Mgd2l0aC1iaW5kaW5ncyogd2l0aC1pbi1zdHIgd2l0aC1sb2FkaW5nLWNvbnRleHQgJyArDQogICAgICAgICAgICAnd2l0aC1sb2NhbC12YXJzIHdpdGgtbWV0YSB3aXRoLW9wZW4gd2l0aC1vdXQtc3RyIHdpdGgtcHJlY2lzaW9uIHhtbC1zZXEgJyArDQogICAgICAgICAgICAnemVybz8gemlwbWFwICcpLnNwbGl0KCIgIikNCiAgICApOw0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoJ2RlZiBkbyBmbiBpZiBsZXQgbG9vcCBtb25pdG9yLWVudGVyIG1vbml0b3ItZXhpdCBuZXcgcXVvdGUgcmVjdXIgc2V0ISAnICsNCiAgICAgICAgICAgICd0aHJvdyB0cnkgdmFyJykuc3BsaXQoIiAiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJ0cnVlIGZhbHNlIG5pbCIpLnNwbGl0KCIgIikNCiAgICApOw0KDQoNCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiOy4qJCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgICAgICByZWdleCA6ICJeXD1iZWdpbiQiLA0KICAgICAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsIC8vcGFyZW5zDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcKHxcXCldIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLCAvL2xpc3RzDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcJ1xcKF0iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsIC8vdmVjdG9ycw0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXFt8XFxdXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwgLy9zZXRzIGFuZCBtYXBzDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xce3xcXH18XFwjXFx7fFxcI1xcfV0iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLCAvLyBhbXBlcnNhbmRzDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1tcXCZdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwgLy8gbWV0YWRhdGENCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAnW1xcI1xcXlxce10nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLCAvLyBhbm9ueW1vdXMgZm4gc3ludGFjdGljIHN1Z2FyDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1tcXCVdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwgLy8gZGVyZWYgcmVhZGVyIG1hY3JvDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1tAXScNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1shfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x8PXwhPXw8PXw+PXw8Pnw8fD58IXwmJl0nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbGRpbkNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5GdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIC8vIFRPRE86IFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcw0KICAgICAgICAgICAgICAgIC8vIFRPRE86IFVuaWNvZGUgaWRlbnRpZmllcnMNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHN5bWJvbA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIls6XSg/OlthLXpBLVpdfFxkKSsiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmcucmVnZXhwIiwgLy9SZWd1bGFyIEV4cHJlc3Npb25zDQogICAgICAgICAgICByZWdleCA6ICcvIyIoPzpcLnwoXFxcIil8W15cIiJcbl0pKiIvZycNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgDQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiXlw9ZW5kJCIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhDbG9qdXJlSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuQ2xvanVyZUhpZ2hsaWdodFJ1bGVzID0gQ2xvanVyZUhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19wYXJlbnNfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTWF0Y2hpbmdQYXJlbnNPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgcmV0dXJuIC9eXHMqXCkvLnRlc3QoaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlwpKS8pOw0KDQogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7DQogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7DQoNCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KfSkuY2FsbChNYXRjaGluZ1BhcmVuc091dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ1BhcmVuc091dGRlbnQgPSBNYXRjaGluZ1BhcmVuc091dGRlbnQ7DQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBTYXRvc2hpIE11cmFrYW1pIDxtdXJreS5zYXR5ciBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvY29mZmVlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2NvZmZlZV9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvbW9kZS9mb2xkaW5nL3B5dGhvbmljJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsICdhY2UvbGliL29vcCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBSdWxlcyA9IHJlcXVpcmUoIi4vY29mZmVlX2hpZ2hsaWdodF9ydWxlcyIpLkNvZmZlZUhpZ2hsaWdodFJ1bGVzOw0KdmFyIE91dGRlbnQgPSByZXF1aXJlKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudDsNCnZhciBQeXRob25Gb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9weXRob25pYyIpLkZvbGRNb2RlOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgV29ya2VyQ2xpZW50ID0gcmVxdWlyZSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQ7DQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KDQpmdW5jdGlvbiBNb2RlKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kb3V0ZGVudCAgID0gbmV3IE91dGRlbnQoKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBQeXRob25Gb2xkTW9kZSgiPXw9PnwtPnxcXHMqY2xhc3MgW14jXSoiKTsNCn0NCg0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHZhciBpbmRlbnRlciA9IC8oPzpbKHtbPTpdfFstPV0+fFxiKD86ZWxzZXxzd2l0Y2h8dHJ5fGNhdGNoKD86XHMqWyRBLVphLXpfXHg3Zi1cdWZmZmZdWyRcd1x4N2YtXHVmZmZmXSopP3xmaW5hbGx5KSlccyokLzsNCiAgICB2YXIgY29tbWVudExpbmUgPSAvXihccyopIy87DQogICAgdmFyIGhlcmVDb21tZW50ID0gL15ccyojIyMoPyEjKS87DQogICAgdmFyIGluZGVudGF0aW9uID0gL15ccyovOw0KICAgIA0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQogICAgICAgIHZhciB0b2tlbnMgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSkudG9rZW5zOw0KICAgIA0KICAgICAgICBpZiAoISh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0udHlwZSA9PT0gJ2NvbW1lbnQnKSAmJg0KICAgICAgICAgICAgc3RhdGUgPT09ICdzdGFydCcgJiYgaW5kZW50ZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIGluZGVudCArPSB0YWI7DQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCiAgICANCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpew0KICAgICAgICBjb25zb2xlLmxvZygidG9nZ2xlIik7DQogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0Um93OyBpIDw9IGVuZFJvdzsgKytpKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgaWYgKGhlcmVDb21tZW50LnRlc3QobGluZSkpDQogICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoY29tbWVudExpbmUudGVzdChsaW5lKSkNCiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKGNvbW1lbnRMaW5lLCAnJDEnKTsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKGluZGVudGF0aW9uLCAnJCYjJyk7DQogICAgDQogICAgICAgICAgICByYW5nZS5lbmQucm93ID0gcmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gPSBsaW5lLmxlbmd0aCArIDE7DQogICAgICAgICAgICBkb2MucmVwbGFjZShyYW5nZSwgbGluZSk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7DQogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOw0KICAgIH07DQogICAgDQogICAgdGhpcy5jcmVhdGVXb3JrZXIgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyQ2xpZW50KFsiYWNlIl0sICJ3b3JrZXItY29mZmVlLmpzIiwgImFjZS9tb2RlL2NvZmZlZV93b3JrZXIiLCAiV29ya2VyIik7DQogICAgICAgIHdvcmtlci5hdHRhY2hUb0RvY3VtZW50KHNlc3Npb24uZ2V0RG9jdW1lbnQoKSk7DQogICAgICAgIA0KICAgICAgICB3b3JrZXIub24oImVycm9yIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhbZS5kYXRhXSk7DQogICAgICAgIH0pOw0KICAgICAgICANCiAgICAgICAgd29ya2VyLm9uKCJvayIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHNlc3Npb24uY2xlYXJBbm5vdGF0aW9ucygpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHJldHVybiB3b3JrZXI7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgU2F0b3NoaSBNdXJha2FtaSA8bXVya3kuc2F0eXIgQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2NvZmZlZV9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvbGFuZycsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KICAgIHZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCiAgICB2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KICAgIHZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KICAgIA0KICAgIG9vcC5pbmhlcml0cyhDb2ZmZWVIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KICAgIGZ1bmN0aW9uIENvZmZlZUhpZ2hsaWdodFJ1bGVzKCkgew0KICAgICAgICB2YXIgaWRlbnRpZmllciA9ICJbJEEtWmEtel9cXHg3Zi1cXHVmZmZmXVskXFx3XFx4N2YtXFx1ZmZmZl0qIjsNCiAgICAgICAgdmFyIHN0cmluZ2ZpbGwgPSB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgIH07DQoNCiAgICAgICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKCgNCiAgICAgICAgICAgICJ0aGlzfHRocm93fHRoZW58dHJ5fHR5cGVvZnxzdXBlcnxzd2l0Y2h8cmV0dXJufGJyZWFrfGJ5KXxjb250aW51ZXwiICsNCiAgICAgICAgICAgICJjYXRjaHxjbGFzc3xpbnxpbnN0YW5jZW9mfGlzfGlzbnR8aWZ8ZWxzZXxleHRlbmRzfGZvcnxmb3Jvd258IiArDQogICAgICAgICAgICAiZmluYWxseXxmdW5jdGlvbnx3aGlsZXx3aGVufG5ld3xub3xub3R8ZGVsZXRlfGRlYnVnZ2VyfGRvfGxvb3B8b2Z8b2ZmfCIgKw0KICAgICAgICAgICAgIm9yfG9ufHVubGVzc3x1bnRpbHxhbmR8eWVzIikuc3BsaXQoInwiKQ0KICAgICAgICApOw0KICAgICAgICANCiAgICAgICAgdmFyIGxhbmdDb25zdGFudCA9IGxhbmcuYXJyYXlUb01hcCgoDQogICAgICAgICAgICAidHJ1ZXxmYWxzZXxudWxsfHVuZGVmaW5lZCIpLnNwbGl0KCJ8IikNCiAgICAgICAgKTsNCiAgICAgICAgDQogICAgICAgIHZhciBpbGxlZ2FsID0gbGFuZy5hcnJheVRvTWFwKCgNCiAgICAgICAgICAgICJjYXNlfGNvbnN0fGRlZmF1bHR8ZnVuY3Rpb258dmFyfHZvaWR8d2l0aHxlbnVtfGV4cG9ydHxpbXBsZW1lbnRzfCIgKw0KICAgICAgICAgICAgImludGVyZmFjZXxsZXR8cGFja2FnZXxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8c3RhdGljfHlpZWxkfCIgKw0KICAgICAgICAgICAgIl9faGFzUHJvcHxleHRlbmRzfHNsaWNlfGJpbmR8aW5kZXhPZiIpLnNwbGl0KCJ8IikNCiAgICAgICAgKTsNCiAgICAgICAgDQogICAgICAgIHZhciBzdXBwb3J0Q2xhc3MgPSBsYW5nLmFycmF5VG9NYXAoKA0KICAgICAgICAgICAgIkFycmF5fEJvb2xlYW58RGF0ZXxGdW5jdGlvbnxOdW1iZXJ8T2JqZWN0fFJlZ0V4cHxSZWZlcmVuY2VFcnJvcnwiICsNCiAgICAgICAgICAgICJSYW5nZUVycm9yfFN0cmluZ3xTeW50YXhFcnJvcnxFcnJvcnxFdmFsRXJyb3J8VHlwZUVycm9yfFVSSUVycm9yIikuc3BsaXQoInwiKQ0KICAgICAgICApOw0KICAgICAgICANCiAgICAgICAgdmFyIHN1cHBvcnRGdW5jdGlvbiA9IGxhbmcuYXJyYXlUb01hcCgoDQogICAgICAgICAgICAiTWF0aHxKU09OfGlzTmFOfGlzRmluaXRlfHBhcnNlSW50fHBhcnNlRmxvYXR8ZW5jb2RlVVJJfCIgKw0KICAgICAgICAgICAgImVuY29kZVVSSUNvbXBvbmVudHxkZWNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fFJhbmdlRXJyb3J8U3RyaW5nfCIgKw0KICAgICAgICAgICAgIlN5bnRheEVycm9yfEVycm9yfEV2YWxFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3IiKS5zcGxpdCgifCIpDQogICAgICAgICk7DQoNCiAgICAgICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICAgICBzdGFydCA6IFsNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogImlkZW50aWZpZXIiLA0KICAgICAgICAgICAgICAgICAgICByZWdleCA6ICIoPzooPzpcXC58OjopXFxzKikiICsgaWRlbnRpZmllcg0KICAgICAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAidmFyaWFibGUiLA0KICAgICAgICAgICAgICAgICAgICByZWdleCA6ICJAKD86IiArIGlkZW50aWZpZXIgKyAiKT8iDQogICAgICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbjogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxhbmdDb25zdGFudC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbGxlZ2FsLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdXBwb3J0Q2xhc3MuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAibGFuZ3VhZ2Uuc3VwcG9ydC5jbGFzcyI7DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdXBwb3J0RnVuY3Rpb24uaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAibGFuZ3VhZ2Uuc3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiBpZGVudGlmaWVyDQogICAgICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwNCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAiKD86MHhbXFxkYS1mQS1GXSt8KD86XFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKSg/OltlRV1bKy1dP1xcZCspPykiDQogICAgICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogIicnJyIsDQogICAgICAgICAgICAgICAgICAgIG5leHQgOiAicWRvYyINCiAgICAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAnIiIiJywNCiAgICAgICAgICAgICAgICAgICAgbmV4dCA6ICJxcWRvYyINCiAgICAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAiJyIsDQogICAgICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyINCiAgICAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAnIicsDQogICAgICAgICAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciDQogICAgICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogImAiLA0KICAgICAgICAgICAgICAgICAgICBuZXh0IDogImpzIg0KICAgICAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4IiwNCiAgICAgICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICByZWdleCA6ICIvLy8iLA0KICAgICAgICAgICAgICAgICAgICBuZXh0IDogImhlcmVnZXgiDQogICAgICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmcucmVnZXgiLA0KICAgICAgICAgICAgICAgICAgICByZWdleCA6ICIvKD8hXFxzKVteWy9cXG5cXFxcXSooPzogKD86XFxcXC58XFxbW15cXF1cXG5cXFxcXSooPzpcXFxcLlteXFxdXFxuXFxcXF0qKSpcXF0pW15bL1xcblxcXFxdKikqL1tpbWd5XXswLDR9KD8hXFx3KSINCiAgICAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogIiMjIyg/ISMpIiwNCiAgICAgICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogIiMuKiINCiAgICAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFwuIg0KICAgICAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OltcXC09XT58Wy0rKi8lPD4mfF4hPz1dPXw+Pj49P3xcXC1cXC18XFwrXFwrfDo6fCYmPXxcXHxcXHw9fDw8PXw+Pj18XFw/XFwufFxcLnsyLDN9fFxcISkiDQogICAgICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgICAgICByZWdleCA6ICJbKHtbXSINCiAgICAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF19KV0iDQogICAgICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgICAgICB9XSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcWRvYyA6IFt7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj8nJyciLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCBzdHJpbmdmaWxsXSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcXFkb2MgOiBbew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLio/IiIiJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgc3RyaW5nZmlsbF0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIHFzdHJpbmcgOiBbew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW15cXFxcJ10qKD86XFxcXC5bXlxcXFwnXSopKiciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgc3RyaW5nZmlsbF0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIHFxc3RyaW5nIDogW3sNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1teXFxcXCJdKig/OlxcXFwuW15cXFxcIl0qKSoiJywNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHN0cmluZ2ZpbGxdLA0KICAgICAgICAgICAgDQogICAgICAgICAgICBqcyA6IFt7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW15cXFxcYF0qKD86XFxcXC5bXlxcXFxgXSopKmAiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCBzdHJpbmdmaWxsXSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaGVyZWdleCA6IFt7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKj8vLy9baW1neV17MCw0fScsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LnJlZ2V4IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrKD86Iy4qKT8iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxTKyINCiAgICAgICAgICAgIH1dLA0KICAgICAgICAgICAgDQogICAgICAgICAgICBjb21tZW50IDogW3sNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKj8jIyMnLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfV0NCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICBleHBvcnRzLkNvZmZlZUhpZ2hsaWdodFJ1bGVzID0gQ29mZmVlSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOw0KDQogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7DQogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7DQoNCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvcHl0aG9uaWMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbihtYXJrZXJzKSB7DQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBuZXcgUmVnRXhwKCIoPzooW1xcW3tdKXwoIiArIG1hcmtlcnMgKyAiKSkoPzpcXHMqKSg/OiMuKik/JCIpOw0KfTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICBpZiAobWF0Y2hbMV0pDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBtYXRjaC5pbmRleCk7DQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZW50YXRpb25CbG9jayhzZXNzaW9uLCByb3csIG1hdGNoLmluZGV4ICsgbWF0Y2hbMl0ubGVuZ3RoKTsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGVudGF0aW9uQmxvY2soc2Vzc2lvbiwgcm93KTsNCiAgICAgICAgfQ0KICAgIH0NCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSBudWxsOw0KDQogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZw0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJzdGFydCI7DQogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJlbmQiOw0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLmluZGVudGF0aW9uQmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgcmUgPSAvXlxzKi87DQogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOw0KICAgICAgICB2YXIgc3RhcnRMZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkNCiAgICAgICAgDQogICAgICAgIHdoaWxlICgrK3JvdyA8IG1heFJvdykgew0KICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpDQogICAgICAgICAgICAgICAgY29udGludWU7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBlbmRSb3cgPSByb3c7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7DQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsNCiAgICAgICAgdmFyIGVuZCA9IHNlc3Npb24uJGZpbmRDbG9zaW5nQnJhY2tldChicmFja2V0LCBzdGFydCk7DQogICAgICAgIGlmICghZW5kKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107DQogICAgICAgIGlmIChmdyA9PSBudWxsKQ0KICAgICAgICAgICAgZncgPSB0aGlzLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZW5kLnJvdyk7DQoNCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIGVuZC5yb3cgLS07DQogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQoNCnZhciBXb3JrZXJDbGllbnQgPSBmdW5jdGlvbih0b3BMZXZlbE5hbWVzcGFjZXMsIHBhY2thZ2VkSnMsIG1vZCwgY2xhc3NuYW1lKSB7DQoNCiAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gdGhpcy5jaGFuZ2VMaXN0ZW5lci5iaW5kKHRoaXMpOw0KDQogICAgaWYgKG1vZHVsZS5wYWNrYWdlZCkgew0KICAgICAgICB2YXIgYmFzZSA9IHRoaXMuJGd1ZXNzQmFzZVBhdGgoKTsNCiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcihiYXNlICsgcGFja2FnZWRKcyk7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICB2YXIgd29ya2VyVXJsID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybCgiYWNlL3dvcmtlci93b3JrZXIiLCBudWxsLCAiXyIpKTsNCiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJVcmwpOw0KDQogICAgICAgIHZhciB0bG5zID0ge307DQogICAgICAgIGZvciAodmFyIGk9MDsgaTx0b3BMZXZlbE5hbWVzcGFjZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBucyA9IHRvcExldmVsTmFtZXNwYWNlc1tpXTsNCiAgICAgICAgICAgIHZhciBwYXRoID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybChucywgbnVsbCwgIl8iKS5yZXBsYWNlKC8uanMkLywgIiIpKTsNCg0KICAgICAgICAgICAgdGxuc1tuc10gPSBwYXRoOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHsNCiAgICAgICAgaW5pdCA6IHRydWUsDQogICAgICAgIHRsbnM6IHRsbnMsDQogICAgICAgIG1vZHVsZTogbW9kLA0KICAgICAgICBjbGFzc25hbWU6IGNsYXNzbmFtZQ0KICAgIH0pOw0KDQogICAgdGhpcy5jYWxsYmFja0lkID0gMTsNCiAgICB0aGlzLmNhbGxiYWNrcyA9IHt9Ow0KDQogICAgdmFyIF9zZWxmID0gdGhpczsNCiAgICB0aGlzLiR3b3JrZXIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2coZSk7DQogICAgICAgIHRocm93IGU7DQogICAgfTsNCiAgICB0aGlzLiR3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24oZSkgew0KICAgICAgICB2YXIgbXNnID0gZS5kYXRhOw0KICAgICAgICBzd2l0Y2gobXNnLnR5cGUpIHsNCiAgICAgICAgICAgIGNhc2UgImxvZyI6DQogICAgICAgICAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2cobXNnLmRhdGEpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlICJldmVudCI6DQogICAgICAgICAgICAgICAgX3NlbGYuX2VtaXQobXNnLm5hbWUsIHtkYXRhOiBtc2cuZGF0YX0pOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlICJjYWxsIjoNCiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfc2VsZi5jYWxsYmFja3NbbXNnLmlkXTsNCiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsNCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobXNnLmRhdGEpOw0KICAgICAgICAgICAgICAgICAgICBkZWxldGUgX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfTsNCn07DQoNCihmdW5jdGlvbigpew0KDQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KDQogICAgdGhpcy4kbm9ybWFsaXplUGF0aCA9IGZ1bmN0aW9uKHBhdGgpIHsNCiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlthLXpdKzpcL1wvW15cL10rXC8vLCAiIik7IC8vIFJlbW92ZSBkb21haW4gbmFtZSBhbmQgcmVidWlsZCBpdA0KICAgICAgICBwYXRoID0gbG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsgbG9jYXRpb24uaG9zdA0KICAgICAgICAgICAgLy8gcGF0aHMgc3RhcnRpbmcgd2l0aCBhIHNsYXNoIGFyZSByZWxhdGl2ZSB0byB0aGUgcm9vdCAoaG9zdCkNCiAgICAgICAgICAgICsgKHBhdGguY2hhckF0KDApID09ICIvIiA/ICIiIDogbG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywgIiIpKQ0KICAgICAgICAgICAgKyAiLyIgKyBwYXRoLnJlcGxhY2UoL15bXC9dKy8sICIiKTsNCiAgICAgICAgcmV0dXJuIHBhdGg7DQogICAgfTsNCg0KICAgIHRoaXMuJGd1ZXNzQmFzZVBhdGggPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHJlcXVpcmUuYWNlQmFzZVVybCkNCiAgICAgICAgICAgIHJldHVybiByZXF1aXJlLmFjZUJhc2VVcmw7DQoNCiAgICAgICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7DQogICAgICAgIGZvciAodmFyIGk9MDsgaTxzY3JpcHRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgc2NyaXB0ID0gc2NyaXB0c1tpXTsNCg0KICAgICAgICAgICAgdmFyIGJhc2UgPSBzY3JpcHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjZS1iYXNlIik7DQogICAgICAgICAgICBpZiAoYmFzZSkNCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5yZXBsYWNlKC9cLyokLywgIi8iKTsNCg0KICAgICAgICAgICAgdmFyIHNyYyA9IHNjcmlwdC5zcmMgfHwgc2NyaXB0LmdldEF0dHJpYnV0ZSgic3JjIik7DQogICAgICAgICAgICBpZiAoIXNyYykgew0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG0gPSBzcmMubWF0Y2goL14oPzooLipcLylhY2VcLmpzfCguKlwvKWFjZSgtdW5jb21wcmVzc2VkKT8oLW5vY29uZmxpY3QpP1wuanMpKD86XD98JCkvKTsNCiAgICAgICAgICAgIGlmIChtKQ0KICAgICAgICAgICAgICAgIHJldHVybiBtWzFdIHx8IG1bMl07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCiAgICB0aGlzLnRlcm1pbmF0ZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLl9lbWl0KCJ0ZXJtaW5hdGUiLCB7fSk7DQogICAgICAgIHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKTsNCiAgICAgICAgdGhpcy4kd29ya2VyID0gbnVsbDsNCiAgICAgICAgdGhpcy4kZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOw0KICAgICAgICB0aGlzLiRkb2MgPSBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbmQgPSBmdW5jdGlvbihjbWQsIGFyZ3MpIHsNCiAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOiBjbWQsIGFyZ3M6IGFyZ3N9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5jYWxsID0gZnVuY3Rpb24oY21kLCBhcmdzLCBjYWxsYmFjaykgew0KICAgICAgICBpZiAoY2FsbGJhY2spIHsNCiAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuY2FsbGJhY2tJZCsrOw0KICAgICAgICAgICAgdGhpcy5jYWxsYmFja3NbaWRdID0gY2FsbGJhY2s7DQogICAgICAgICAgICBhcmdzLnB1c2goaWQpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuc2VuZChjbWQsIGFyZ3MpOw0KICAgIH07DQoNCiAgICB0aGlzLmVtaXQgPSBmdW5jdGlvbihldmVudCwgZGF0YSkgew0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgLy8gZmlyZWZveCByZWZ1c2VzIHRvIGNsb25lIG9iamVjdHMgd2hpY2ggaGF2ZSBmdW5jdGlvbiBwcm9wZXJ0aWVzDQogICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIGV2ZW50DQogICAgICAgICAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2V2ZW50OiBldmVudCwgZGF0YToge2RhdGE6IGRhdGEuZGF0YX19KTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChleCkge30NCiAgICB9Ow0KDQogICAgdGhpcy5hdHRhY2hUb0RvY3VtZW50ID0gZnVuY3Rpb24oZG9jKSB7DQogICAgICAgIGlmKHRoaXMuJGRvYykNCiAgICAgICAgICAgIHRoaXMudGVybWluYXRlKCk7DQoNCiAgICAgICAgdGhpcy4kZG9jID0gZG9jOw0KICAgICAgICB0aGlzLmNhbGwoInNldFZhbHVlIiwgW2RvYy5nZXRWYWx1ZSgpXSk7DQogICAgICAgIGRvYy5vbigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7DQogICAgfTsNCg0KICAgIHRoaXMuY2hhbmdlTGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIGUucmFuZ2UgPSB7DQogICAgICAgICAgICBzdGFydDogZS5kYXRhLnJhbmdlLnN0YXJ0LA0KICAgICAgICAgICAgZW5kOiBlLmRhdGEucmFuZ2UuZW5kDQogICAgICAgIH07DQogICAgICAgIHRoaXMuZW1pdCgiY2hhbmdlIiwgZSk7DQogICAgfTsNCg0KfSkuY2FsbChXb3JrZXJDbGllbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Xb3JrZXJDbGllbnQgPSBXb3JrZXJDbGllbnQ7DQoNCn0pOw0KOw0KICAgICAgICAgICAgKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpDQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgIA==]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvY29sZGZ1c2lvbicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUveG1sJywgJ2FjZS9tb2RlL2phdmFzY3JpcHQnLCAnYWNlL21vZGUvY3NzJywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvY29sZGZ1c2lvbl9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgWG1sTW9kZSA9IHJlcXVpcmUoIi4veG1sIikuTW9kZTsNCnZhciBKYXZhU2NyaXB0TW9kZSA9IHJlcXVpcmUoIi4vamF2YXNjcmlwdCIpLk1vZGU7DQp2YXIgQ3NzTW9kZSA9IHJlcXVpcmUoIi4vY3NzIikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgQ29sZGZ1c2lvbkhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9jb2xkZnVzaW9uX2hpZ2hsaWdodF9ydWxlcyIpLkNvbGRmdXNpb25IaWdobGlnaHRSdWxlczsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICBYbWxNb2RlLmNhbGwodGhpcyk7DQogICAgDQogICAgdmFyIGhpZ2hsaWdodGVyID0gbmV3IENvbGRmdXNpb25IaWdobGlnaHRSdWxlcygpOw0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIoaGlnaGxpZ2h0ZXIuZ2V0UnVsZXMoKSk7DQogICAgDQogICAgdGhpcy4kZW1iZWRzID0gaGlnaGxpZ2h0ZXIuZ2V0RW1iZWRzKCk7DQogICAgdGhpcy5jcmVhdGVNb2RlRGVsZWdhdGVzKHsNCiAgICAgICJqcy0iOiBKYXZhU2NyaXB0TW9kZSwNCiAgICAgICJjc3MtIjogQ3NzTW9kZQ0KICAgIH0pOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBYbWxNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGdldEluZGVudChsaW5lKTsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgWG1sSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3htbF9oaWdobGlnaHRfcnVsZXMiKS5YbWxIaWdobGlnaHRSdWxlczsNCnZhciBYbWxCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci94bWwiKS5YbWxCZWhhdmlvdXI7DQp2YXIgWG1sRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcveG1sIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgWG1sSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgWG1sQmVoYXZpb3VyKCk7DQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgWG1sRm9sZE1vZGUoKTsNCn07DQoNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCiAgICANCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICByZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS94bWxfdXRpbCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciB4bWxVdGlsID0gcmVxdWlyZSgiLi94bWxfdXRpbCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBYbWxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICBzdGFydCA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXCFcXFtDREFUQVxcWyIsDQogICAgICAgICAgICBuZXh0IDogImNkYXRhIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ4bWxfcGUiLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcPy4qP1xcPz4iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcIS0tIiwNCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLCAvLyBvcGVuaW5nIHRhZw0KICAgICAgICAgICAgcmVnZXggOiAiPFxcLz8iLA0KICAgICAgICAgICAgbmV4dCA6ICJ0YWciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJbXjxdKyINCiAgICAgICAgfV0sDQogICAgICAgIA0KICAgICAgICBjZGF0YSA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcXVxcXT4iLA0KICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxdXXxcXF0oPyFcXF0+KSkrIg0KICAgICAgICB9XSwNCg0KICAgICAgICBjb21tZW50IDogW3sNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgcmVnZXggOiAiLio/LS0+IiwNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgIH1dDQogICAgfTsNCiAgICANCiAgICB4bWxVdGlsLnRhZyh0aGlzLiRydWxlcywgInRhZyIsICJzdGFydCIpOw0KfTsNCg0Kb29wLmluaGVyaXRzKFhtbEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLlhtbEhpZ2hsaWdodFJ1bGVzID0gWG1sSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3htbF91dGlsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2xhbmcnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCg0KdmFyIGZvcm1UYWdzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICgiYnV0dG9ufGZvcm18aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhIikuc3BsaXQoInwiKQ0KKTsNCg0KdmFyIHRhYmxlVGFncyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAoInRhYmxlfHRib2R5fHRkfHRmb290fHRofHRyIikuc3BsaXQoInwiKQ0KKTsNCg0KZnVuY3Rpb24gc3RyaW5nKHN0YXRlKSB7DQogICAgcmV0dXJuIFt7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgIHJlZ2V4IDogJyIuKj8iJw0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICdbIl0uKicsDQogICAgICAgIG5leHQgOiBzdGF0ZSArICJfcXFzdHJpbmciDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICByZWdleCA6ICInLio/JyINCiAgICB9LCB7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgcmVnZXggOiAiWyddLioiLA0KICAgICAgICBuZXh0IDogc3RhdGUgKyAiX3FzdHJpbmciDQogICAgfV07DQp9DQoNCmZ1bmN0aW9uIG11bHRpTGluZVN0cmluZyhxdW90ZSwgc3RhdGUpIHsNCiAgICByZXR1cm4gW3sNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICIuKj8iICsgcXVvdGUsDQogICAgICAgIG5leHQgOiBzdGF0ZQ0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICcuKycNCiAgICB9XTsNCn0NCg0KZXhwb3J0cy50YWcgPSBmdW5jdGlvbihzdGF0ZXMsIG5hbWUsIG5leHRTdGF0ZSkgew0KICAgIHN0YXRlc1tuYW1lXSA9IFt7DQogICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgIH0sIHsNCiAgICAgICAgLy90b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgIA0KICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgIGlmICggdmFsdWU9PT0nYScgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5hbmNob3IiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlPT09J2ltZycgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5pbWFnZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc2NyaXB0JyApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLnNjcmlwdCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc3R5bGUnICkgew0KICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuc3R5bGUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoZm9ybVRhZ3MuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLmZvcm0iOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGFibGVUYWdzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy50YWJsZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwgICAgICAgIA0KICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgIHJlZ2V4IDogIlstX2EtekEtWjAtOTohXSsiLA0KICAgICAgICBuZXh0IDogbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiIA0KICAgIH0sIHsNCiAgICAgICAgdG9rZW46ICJlbXB0eSIsDQogICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgbmV4dCA6IG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Ig0KICAgIH1dOw0KDQogICAgc3RhdGVzW25hbWUgKyAiX3FzdHJpbmciXSA9IG11bHRpTGluZVN0cmluZygiJyIsIG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Iik7DQogICAgc3RhdGVzW25hbWUgKyAiX3Fxc3RyaW5nIl0gPSBtdWx0aUxpbmVTdHJpbmcoIlwiIiwgbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiKTsNCiAgICANCiAgICBzdGF0ZXNbbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiXSA9IFt7DQogICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICJcLz8+IiwNCiAgICAgICAgbmV4dCA6IG5leHRTdGF0ZQ0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgIHJlZ2V4IDogIj0iDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUiLA0KICAgICAgICByZWdleCA6ICJbLV9hLXpBLVowLTk6XSsiDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICB9XS5jb25jYXQoc3RyaW5nKG5hbWUpKTsNCn07DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXI7DQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQoNCnZhciBYbWxCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQogICAgDQogICAgdGhpcy5pbmhlcml0KENzdHlsZUJlaGF2aW91ciwgWyJzdHJpbmdfZHF1b3RlcyJdKTsgLy8gR2V0IHN0cmluZyBiZWhhdmlvdXINCiAgICANCiAgICB0aGlzLmFkZCgiYnJhY2tldHMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnPCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJzw+JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnPicpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICc+JykgeyAvLyBuZWVkIHNvbWUga2luZCBvZiBtYXRjaGluZyBjaGVjayBoZXJlDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhcnMgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFycyA9PSAnPC8nKSB7DQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpKSArIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCiAgICANCn0NCm9vcC5pbmhlcml0cyhYbWxCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuWG1sQmVoYXZpb3VyID0gWG1sQmVoYXZpb3VyOw0KfSk7LyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmVoYXZpb3VyID0gcmVxdWlyZSgnLi4vYmVoYXZpb3VyJykuQmVoYXZpb3VyOw0KDQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgew0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3snICsgc2VsZWN0ZWQgKyAnfScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7fScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJ30nKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJ30nLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiArIDF9KTsNCiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykNCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KDQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCcgKyBzZWxlY3RlZCArICcpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnKScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnKScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7DQoNCiAgICAgICAgICAgICAgICAvLyBXZSdyZSBlc2NhcGVkLg0KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIEZpbmQgd2hhdCB0b2tlbiB3ZSdyZSBpbnNpZGUuDQogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHNlbGVjdGlvbi5zdGFydC5yb3csIHNlbGVjdGlvbi5zdGFydC5yb3cpWzBdLnRva2VuczsNCiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47DQogICAgICAgICAgICAgICAgdmFyIHF1b3RlcG9zID0gLTE7IC8vIFRyYWNrIHdoZXRoZXIgd2UncmUgaW5zaWRlIGFuIG9wZW4gcXVvdGUuDQoNCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1t4XTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1b3RlcG9zIDwgMCkgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gdG9rZW4udmFsdWUuaW5kZXhPZignIicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgodG9rZW4udmFsdWUubGVuZ3RoICsgY29sKSA+IHNlbGVjdGlvbi5zdGFydC5jb2x1bW4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbCArPSB0b2tlbnNbeF0udmFsdWUubGVuZ3RoOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIFRyeSBhbmQgYmUgc21hcnQgYWJvdXQgd2hlbiB3ZSBhdXRvIGluc2VydC4NCiAgICAgICAgICAgICAgICBpZiAoIXRva2VuIHx8IChxdW90ZXBvcyA8IDAgJiYgdG9rZW4udHlwZSAhPT0gImNvbW1lbnQiICYmICh0b2tlbi50eXBlICE9PSAic3RyaW5nIiB8fCAoKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gIT09IHRva2VuLnZhbHVlLmxlbmd0aCtjb2wtMSkgJiYgdG9rZW4udmFsdWUubGFzdEluZGV4T2YoJyInKSA9PT0gdG9rZW4udmFsdWUubGVuZ3RoLTEpKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICciIicsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgPT09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnB1dCBhbmQgbW92ZSByaWdodCBvbmUgaWYgd2UncmUgdHlwaW5nIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuDQogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCn0NCm9vcC5pbmhlcml0cyhDc3R5bGVCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOw0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy94bWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCAnYWNlL3Rva2VuX2l0ZXJhdG9yJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi8uLi9saWIvbGFuZyIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KdmFyIFRva2VuSXRlcmF0b3IgPSByZXF1aXJlKCIuLi8uLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3I7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbih2b2lkRWxlbWVudHMpIHsNCiAgICBCYXNlRm9sZE1vZGUuY2FsbCh0aGlzKTsNCiAgICB0aGlzLnZvaWRFbGVtZW50cyA9IHZvaWRFbGVtZW50cyB8fCB7fTsNCn07DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciB0YWcgPSB0aGlzLl9nZXRGaXJzdFRhZ0luTGluZShzZXNzaW9uLCByb3cpOw0KDQogICAgICAgIGlmICh0YWcuY2xvc2luZykNCiAgICAgICAgICAgIHJldHVybiBmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCIgPyAiZW5kIiA6ICIiOw0KDQogICAgICAgIGlmICghdGFnLnRhZ05hbWUgfHwgdGhpcy52b2lkRWxlbWVudHNbdGFnLnRhZ05hbWUudG9Mb3dlckNhc2UoKV0pDQogICAgICAgICAgICByZXR1cm4gIiI7DQoNCiAgICAgICAgaWYgKHRhZy5zZWxmQ2xvc2luZykNCiAgICAgICAgICAgIHJldHVybiAiIjsNCg0KICAgICAgICBpZiAodGFnLnZhbHVlLmluZGV4T2YoIi8iICsgdGFnLnRhZ05hbWUpICE9PSAtMSkNCiAgICAgICAgICAgIHJldHVybiAiIjsNCg0KICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93KSB7DQogICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2Vucyhyb3csIHJvdylbMF0udG9rZW5zOw0KICAgICAgICB2YXIgdmFsdWUgPSAiIjsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsNCiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlLmluZGV4T2YoIm1ldGEudGFnIikgPT09IDApDQogICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW4udmFsdWU7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgdmFsdWUgKz0gbGFuZy5zdHJpbmdSZXBlYXQoIiAiLCB0b2tlbi52YWx1ZS5sZW5ndGgpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgIH07DQoNCiAgICB0aGlzLnRhZ1JlID0gL14oXHMqKSg8PyhcLz8pKFstX2EtekEtWjAtOTohXSopXHMqKFwvPyk+PykvOw0KICAgIHRoaXMuX3BhcnNlVGFnID0gZnVuY3Rpb24odGFnKSB7DQogICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSB0aGlzLnRhZ1JlLmV4ZWModGFnKTsNCiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMudGFnUmUubGFzdEluZGV4IHx8IDA7DQogICAgICAgIHRoaXMudGFnUmUubGFzdEluZGV4ID0gMDsNCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdmFsdWU6IHRhZywNCiAgICAgICAgICAgIG1hdGNoOiBtYXRjaCA/IG1hdGNoWzJdIDogIiIsDQogICAgICAgICAgICBjbG9zaW5nOiBtYXRjaCA/ICEhbWF0Y2hbM10gOiBmYWxzZSwNCiAgICAgICAgICAgIHNlbGZDbG9zaW5nOiBtYXRjaCA/ICEhbWF0Y2hbNV0gfHwgbWF0Y2hbMl0gPT0gIi8+IiA6IGZhbHNlLA0KICAgICAgICAgICAgdGFnTmFtZTogbWF0Y2ggPyBtYXRjaFs0XSA6ICIiLA0KICAgICAgICAgICAgY29sdW1uOiBtYXRjaFsxXSA/IGNvbHVtbiArIG1hdGNoWzFdLmxlbmd0aCA6IGNvbHVtbg0KICAgICAgICB9Ow0KICAgIH07DQogICAgDQogICAgLyoqDQogICAgICogcmVhZHMgYSBmdWxsIHRhZyBhbmQgcGxhY2VzIHRoZSBpdGVyYXRvciBhZnRlciB0aGUgdGFnDQogICAgICovDQogICAgdGhpcy5fcmVhZFRhZ0ZvcndhcmQgPSBmdW5jdGlvbihpdGVyYXRvcikgew0KICAgICAgICB2YXIgdG9rZW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW4oKTsNCiAgICAgICAgaWYgKCF0b2tlbikNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciB2YWx1ZSA9ICIiOw0KICAgICAgICB2YXIgc3RhcnQ7DQogICAgICAgIA0KICAgICAgICBkbyB7DQogICAgICAgICAgICBpZiAodG9rZW4udHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpID09PSAwKSB7DQogICAgICAgICAgICAgICAgaWYgKCFzdGFydCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YWx1ZSArPSB0b2tlbi52YWx1ZTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiPiIpICE9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQgPSBzdGFydDsNCiAgICAgICAgICAgICAgICAgICAgdGFnLmVuZCA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoDQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnN0ZXBGb3J3YXJkKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IHdoaWxlKHRva2VuID0gaXRlcmF0b3Iuc3RlcEZvcndhcmQoKSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX3JlYWRUYWdCYWNrd2FyZCA9IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogICAgICAgIHZhciB0b2tlbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbigpOw0KICAgICAgICBpZiAoIXRva2VuKQ0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICANCiAgICAgICAgdmFyIHZhbHVlID0gIiI7DQogICAgICAgIHZhciBlbmQ7DQoNCiAgICAgICAgZG8gew0KICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUuaW5kZXhPZigibWV0YS50YWciKSA9PT0gMCkgew0KICAgICAgICAgICAgICAgIGlmICghZW5kKSB7DQogICAgICAgICAgICAgICAgICAgIGVuZCA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoDQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhbHVlID0gdG9rZW4udmFsdWUgKyB2YWx1ZTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiPCIpICE9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICB0YWcuZW5kID0gZW5kOw0KICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zdGVwQmFja3dhcmQoKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gd2hpbGUodG9rZW4gPSBpdGVyYXRvci5zdGVwQmFja3dhcmQoKSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX3BvcCA9IGZ1bmN0aW9uKHN0YWNrLCB0YWcpIHsNCiAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkgew0KICAgICAgICAgICAgDQogICAgICAgICAgICB2YXIgdG9wID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdOw0KICAgICAgICAgICAgaWYgKCF0YWcgfHwgdG9wLnRhZ05hbWUgPT0gdGFnLnRhZ05hbWUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucG9wKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZvaWRFbGVtZW50c1t0YWcudGFnTmFtZV0pIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZvaWRFbGVtZW50c1t0b3AudGFnTmFtZV0pIHsNCiAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTsNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGZpcnN0VGFnID0gdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoc2Vzc2lvbiwgcm93KTsNCiAgICAgICAgDQogICAgICAgIGlmICghZmlyc3RUYWcubWF0Y2gpDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgDQogICAgICAgIHZhciBpc0JhY2t3YXJkID0gZmlyc3RUYWcuY2xvc2luZyB8fCBmaXJzdFRhZy5zZWxmQ2xvc2luZzsNCiAgICAgICAgdmFyIHN0YWNrID0gW107DQogICAgICAgIHZhciB0YWc7DQogICAgICAgIA0KICAgICAgICBpZiAoIWlzQmFja3dhcmQpIHsNCiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IG5ldyBUb2tlbkl0ZXJhdG9yKHNlc3Npb24sIHJvdywgZmlyc3RUYWcuY29sdW1uKTsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IHJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IGZpcnN0VGFnLmNvbHVtbiArIGZpcnN0VGFnLnRhZ05hbWUubGVuZ3RoICsgMg0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHdoaWxlICh0YWcgPSB0aGlzLl9yZWFkVGFnRm9yd2FyZChpdGVyYXRvcikpIHsNCiAgICAgICAgICAgICAgICBpZiAodGFnLnNlbGZDbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCB0YWcuZW5kKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHRhZy5jbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcChzdGFjaywgdGFnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIHRhZy5zdGFydCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRhZykNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcihzZXNzaW9uLCByb3csIGZpcnN0VGFnLmNvbHVtbiArIGZpcnN0VGFnLm1hdGNoLmxlbmd0aCk7DQogICAgICAgICAgICB2YXIgZW5kID0gew0KICAgICAgICAgICAgICAgIHJvdzogcm93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogZmlyc3RUYWcuY29sdW1uDQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgDQogICAgICAgICAgICB3aGlsZSAodGFnID0gdGhpcy5fcmVhZFRhZ0JhY2t3YXJkKGl0ZXJhdG9yKSkgew0KICAgICAgICAgICAgICAgIGlmICh0YWcuc2VsZkNsb3NpbmcpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFjay5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5zdGFydC5jb2x1bW4gKz0gdGFnLnRhZ05hbWUubGVuZ3RoICsgMjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIHRhZy5lbmQpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoIXRhZy5jbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcChzdGFjaywgdGFnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIGVuZCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godGFnKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9qYXZhc2NyaXB0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnLCAnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KdmFyIFdvcmtlckNsaWVudCA9IHJlcXVpcmUoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50Ow0KdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOw0KICAgICAgICB2YXIgcmUgPSAvXihccyopXC9cLy87DQoNCiAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG91dGRlbnQpIHsNCiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi8vIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KICAgICAgICB2YXIgZW5kU3RhdGUgPSB0b2tlbml6ZWRMaW5lLnN0YXRlOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09ICJkb2Mtc3RhcnQiKSB7DQogICAgICAgICAgICBpZiAoZW5kU3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eXHMqKFwvPylcKi8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7DQogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAiICI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiKiAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlckNsaWVudChbImFjZSJdLCAid29ya2VyLWphdmFzY3JpcHQuanMiLCAiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCAiSmF2YVNjcmlwdFdvcmtlciIpOw0KICAgICAgICB3b3JrZXIuYXR0YWNoVG9Eb2N1bWVudChzZXNzaW9uLmdldERvY3VtZW50KCkpOw0KICAgICAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigianNsaW50IiwgZnVuY3Rpb24ocmVzdWx0cykgew0KICAgICAgICAgICAgdmFyIGVycm9ycyA9IFtdOw0KICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHJlc3VsdHMuZGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IHJlc3VsdHMuZGF0YVtpXTsNCiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpDQogICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZXJyb3IubGluZS0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBlcnJvci5jaGFyYWN0ZXItMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yLnJlYXNvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbnQ6IGVycm9yDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhlcnJvcnMpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigibmFyY2lzc3VzIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhbZS5kYXRhXSk7DQogICAgICAgIH0pOw0KICAgICAgICANCiAgICAgICAgd29ya2VyLm9uKCJ0ZXJtaW5hdGUiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHNlc3Npb24uY2xlYXJBbm5vdGF0aW9ucygpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHJldHVybiB3b3JrZXI7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvdW5pY29kZScsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgdW5pY29kZSA9IHJlcXVpcmUoIi4uL3VuaWNvZGUiKTsNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICAvLyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzDQogICAgdmFyIGdsb2JhbHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAvLyBDb25zdHJ1Y3RvcnMNCiAgICAgICAgKCJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fCIgKw0KICAgICAgLy8gRTRYDQogICAgICAgICAiTmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fCIgKw0KICAgICAgICAgIkFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXwiICsNCiAgICAgICAgICJVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fCIgKw0KICAgICAgLy8gRXJyb3JzDQogICAgICAgICJFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258IiArDQogICAgICAgICJTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8IiArDQogICAgICAvLyAgTm9uLWNvbnN0cnVjdG9yIGZ1bmN0aW9ucw0KICAgICAgICAiZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8IiArDQogICAgICAgICJpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fCIgKw0KICAgICAgLy8gT3RoZXINCiAgICAgICAgIkpTT058TWF0aHwiICsNCiAgICAgIC8vIFBzZXVkbw0KICAgICAgICAidGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCINCiAgICAgICkuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufCIgKw0KICAgICAgICAiaWZ8aW58aW5zdGFuY2VvZnxuZXd8cmV0dXJufHN3aXRjaHx0aHJvd3x0cnl8dHlwZW9mfGxldHx2YXJ8d2hpbGV8d2l0aHwiICsNCiAgICAgICAgImNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Iikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyBrZXl3b3JkcyB3aGljaCBjYW4gYmUgZm9sbG93ZWQgYnkgcmVndWxhciBleHByZXNzaW9ucw0KICAgIHZhciBrd0JlZm9yZVJlID0gImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGQiOw0KDQogICAgdmFyIGRlcHJlY2F0ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZGVmaW5pdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoKCJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIikuc3BsaXQoInwiKSk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBmdXR1cmVSZXNlcnZlZCA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXwiICsNCiAgICAgICAgInB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMNCiAgICB2YXIgaWRlbnRpZmllclJlID0gIlsiICsgdW5pY29kZS5wYWNrYWdlcy5MICsgIlxcJF9dWyIgDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5MDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5NbiArIHVuaWNvZGUucGFja2FnZXMuTWMNCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLk5kDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5QYyArICJcXCRfXSpcXGIiOw0KICAgICAgICANCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXS4qXFxcXCQnLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXS4qXFxcXCQiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiBbImtleXdvcmQuZGVmaW5pdGlvbiIsICJ0ZXh0IiwgImVudGl0eS5uYW1lLmZ1bmN0aW9uIl0sDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKGZ1bmN0aW9uKShcXHMrKSgiICsgaWRlbnRpZmllclJlICsgIikiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86dHJ1ZXxmYWxzZSlcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86IiArIGt3QmVmb3JlUmUgKyAiKVxcYiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlcHJlY2F0ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmRlcHJlY2F0ZWQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWZpbml0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQuZGVmaW5pdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1dHVyZVJlc2VydmVkLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gImRlYnVnZ2VyIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogaWRlbnRpZmllclJlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXD98XFw6fFxcLHxcXDt8XFwuIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iLA0KICAgICAgICAgICAgICAgIG5leHQgIDogInJlZ2V4X2FsbG93ZWQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLz0/IiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJeIyEuKiQiIA0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIG9ubHkgYWxsb3dlZCBhZnRlciBjZXJ0YWluIHRva2Vucy4gVGhpcw0KICAgICAgICAvLyBtYWtlcyBzdXJlIHdlIGRvbid0IG1peCB1cCByZWdleHBzIHdpdGggdGhlIGRpdmlzb24gb3BlcmF0b3INCiAgICAgICAgInJlZ2V4X2FsbG93ZWQiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudF9yZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSByZXR1cm4gdG8gdGhlIHN0YXJ0IG1vZGUgd2l0aG91dCBtYXRjaGluZw0KICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nDQogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJyZWdleCI6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiDQogICAgICAgICAgICB9LCB7DQoJCQkJLy8gZmxhZw0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiL1xcdyoiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUgDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXC9cXFtdKyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFxbIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiANCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyI6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiW15cXFxcXFxdXSsiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiIA0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudF9yZWdleF9hbGxvd2VkIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXFzdHJpbmciIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCAiZG9jLSIsDQogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IEphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MudGFnIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIkBbXFx3XFxkX10rIiAvLyBUT0RPOiBmaXggZW1haWwgYWRkcmVzc2VzDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlRPRE8iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlteQFxcKl0rIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICIuIg0KICAgICAgICB9XQ0KICAgIH07DQp9Ow0KDQpvb3AuaW5oZXJpdHMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmdldFN0YXJ0UnVsZSA9IGZ1bmN0aW9uKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGRvYyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXC9cXCooPz1cXCopIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0RW5kUnVsZSA9IGZ1bmN0aW9uIChzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcKlxcLyIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCg0KfSkuY2FsbChEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7DQogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7DQoNCiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsNCiAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IGRvYy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59KTsNCg0KICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQoNCnZhciBXb3JrZXJDbGllbnQgPSBmdW5jdGlvbih0b3BMZXZlbE5hbWVzcGFjZXMsIHBhY2thZ2VkSnMsIG1vZCwgY2xhc3NuYW1lKSB7DQoNCiAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gdGhpcy5jaGFuZ2VMaXN0ZW5lci5iaW5kKHRoaXMpOw0KDQogICAgaWYgKG1vZHVsZS5wYWNrYWdlZCkgew0KICAgICAgICB2YXIgYmFzZSA9IHRoaXMuJGd1ZXNzQmFzZVBhdGgoKTsNCiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcihiYXNlICsgcGFja2FnZWRKcyk7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICB2YXIgd29ya2VyVXJsID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybCgiYWNlL3dvcmtlci93b3JrZXIiLCBudWxsLCAiXyIpKTsNCiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJVcmwpOw0KDQogICAgICAgIHZhciB0bG5zID0ge307DQogICAgICAgIGZvciAodmFyIGk9MDsgaTx0b3BMZXZlbE5hbWVzcGFjZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBucyA9IHRvcExldmVsTmFtZXNwYWNlc1tpXTsNCiAgICAgICAgICAgIHZhciBwYXRoID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybChucywgbnVsbCwgIl8iKS5yZXBsYWNlKC8uanMkLywgIiIpKTsNCg0KICAgICAgICAgICAgdGxuc1tuc10gPSBwYXRoOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHsNCiAgICAgICAgaW5pdCA6IHRydWUsDQogICAgICAgIHRsbnM6IHRsbnMsDQogICAgICAgIG1vZHVsZTogbW9kLA0KICAgICAgICBjbGFzc25hbWU6IGNsYXNzbmFtZQ0KICAgIH0pOw0KDQogICAgdGhpcy5jYWxsYmFja0lkID0gMTsNCiAgICB0aGlzLmNhbGxiYWNrcyA9IHt9Ow0KDQogICAgdmFyIF9zZWxmID0gdGhpczsNCiAgICB0aGlzLiR3b3JrZXIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2coZSk7DQogICAgICAgIHRocm93IGU7DQogICAgfTsNCiAgICB0aGlzLiR3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24oZSkgew0KICAgICAgICB2YXIgbXNnID0gZS5kYXRhOw0KICAgICAgICBzd2l0Y2gobXNnLnR5cGUpIHsNCiAgICAgICAgICAgIGNhc2UgImxvZyI6DQogICAgICAgICAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2cobXNnLmRhdGEpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlICJldmVudCI6DQogICAgICAgICAgICAgICAgX3NlbGYuX2VtaXQobXNnLm5hbWUsIHtkYXRhOiBtc2cuZGF0YX0pOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlICJjYWxsIjoNCiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfc2VsZi5jYWxsYmFja3NbbXNnLmlkXTsNCiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsNCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobXNnLmRhdGEpOw0KICAgICAgICAgICAgICAgICAgICBkZWxldGUgX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfTsNCn07DQoNCihmdW5jdGlvbigpew0KDQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KDQogICAgdGhpcy4kbm9ybWFsaXplUGF0aCA9IGZ1bmN0aW9uKHBhdGgpIHsNCiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlthLXpdKzpcL1wvW15cL10rXC8vLCAiIik7IC8vIFJlbW92ZSBkb21haW4gbmFtZSBhbmQgcmVidWlsZCBpdA0KICAgICAgICBwYXRoID0gbG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsgbG9jYXRpb24uaG9zdA0KICAgICAgICAgICAgLy8gcGF0aHMgc3RhcnRpbmcgd2l0aCBhIHNsYXNoIGFyZSByZWxhdGl2ZSB0byB0aGUgcm9vdCAoaG9zdCkNCiAgICAgICAgICAgICsgKHBhdGguY2hhckF0KDApID09ICIvIiA/ICIiIDogbG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywgIiIpKQ0KICAgICAgICAgICAgKyAiLyIgKyBwYXRoLnJlcGxhY2UoL15bXC9dKy8sICIiKTsNCiAgICAgICAgcmV0dXJuIHBhdGg7DQogICAgfTsNCg0KICAgIHRoaXMuJGd1ZXNzQmFzZVBhdGggPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHJlcXVpcmUuYWNlQmFzZVVybCkNCiAgICAgICAgICAgIHJldHVybiByZXF1aXJlLmFjZUJhc2VVcmw7DQoNCiAgICAgICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7DQogICAgICAgIGZvciAodmFyIGk9MDsgaTxzY3JpcHRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgc2NyaXB0ID0gc2NyaXB0c1tpXTsNCg0KICAgICAgICAgICAgdmFyIGJhc2UgPSBzY3JpcHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjZS1iYXNlIik7DQogICAgICAgICAgICBpZiAoYmFzZSkNCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5yZXBsYWNlKC9cLyokLywgIi8iKTsNCg0KICAgICAgICAgICAgdmFyIHNyYyA9IHNjcmlwdC5zcmMgfHwgc2NyaXB0LmdldEF0dHJpYnV0ZSgic3JjIik7DQogICAgICAgICAgICBpZiAoIXNyYykgew0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG0gPSBzcmMubWF0Y2goL14oPzooLipcLylhY2VcLmpzfCguKlwvKWFjZSgtdW5jb21wcmVzc2VkKT8oLW5vY29uZmxpY3QpP1wuanMpKD86XD98JCkvKTsNCiAgICAgICAgICAgIGlmIChtKQ0KICAgICAgICAgICAgICAgIHJldHVybiBtWzFdIHx8IG1bMl07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCiAgICB0aGlzLnRlcm1pbmF0ZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLl9lbWl0KCJ0ZXJtaW5hdGUiLCB7fSk7DQogICAgICAgIHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKTsNCiAgICAgICAgdGhpcy4kd29ya2VyID0gbnVsbDsNCiAgICAgICAgdGhpcy4kZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOw0KICAgICAgICB0aGlzLiRkb2MgPSBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbmQgPSBmdW5jdGlvbihjbWQsIGFyZ3MpIHsNCiAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOiBjbWQsIGFyZ3M6IGFyZ3N9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5jYWxsID0gZnVuY3Rpb24oY21kLCBhcmdzLCBjYWxsYmFjaykgew0KICAgICAgICBpZiAoY2FsbGJhY2spIHsNCiAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuY2FsbGJhY2tJZCsrOw0KICAgICAgICAgICAgdGhpcy5jYWxsYmFja3NbaWRdID0gY2FsbGJhY2s7DQogICAgICAgICAgICBhcmdzLnB1c2goaWQpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuc2VuZChjbWQsIGFyZ3MpOw0KICAgIH07DQoNCiAgICB0aGlzLmVtaXQgPSBmdW5jdGlvbihldmVudCwgZGF0YSkgew0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgLy8gZmlyZWZveCByZWZ1c2VzIHRvIGNsb25lIG9iamVjdHMgd2hpY2ggaGF2ZSBmdW5jdGlvbiBwcm9wZXJ0aWVzDQogICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIGV2ZW50DQogICAgICAgICAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2V2ZW50OiBldmVudCwgZGF0YToge2RhdGE6IGRhdGEuZGF0YX19KTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChleCkge30NCiAgICB9Ow0KDQogICAgdGhpcy5hdHRhY2hUb0RvY3VtZW50ID0gZnVuY3Rpb24oZG9jKSB7DQogICAgICAgIGlmKHRoaXMuJGRvYykNCiAgICAgICAgICAgIHRoaXMudGVybWluYXRlKCk7DQoNCiAgICAgICAgdGhpcy4kZG9jID0gZG9jOw0KICAgICAgICB0aGlzLmNhbGwoInNldFZhbHVlIiwgW2RvYy5nZXRWYWx1ZSgpXSk7DQogICAgICAgIGRvYy5vbigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7DQogICAgfTsNCg0KICAgIHRoaXMuY2hhbmdlTGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIGUucmFuZ2UgPSB7DQogICAgICAgICAgICBzdGFydDogZS5kYXRhLnJhbmdlLnN0YXJ0LA0KICAgICAgICAgICAgZW5kOiBlLmRhdGEucmFuZ2UuZW5kDQogICAgICAgIH07DQogICAgICAgIHRoaXMuZW1pdCgiY2hhbmdlIiwgZSk7DQogICAgfTsNCg0KfSkuY2FsbChXb3JrZXJDbGllbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Xb3JrZXJDbGllbnQgPSBXb3JrZXJDbGllbnQ7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gLyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS87DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOw0KDQogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpICsgbWF0Y2hbMF0ubGVuZ3RoKTsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChmb2xkU3R5bGUgIT09ICJtYXJrYmVnaW5lbmQiKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7DQogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBpfTsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKCFzdGFydCkNCiAgICAgICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgICAgIHN0YXJ0LmNvbHVtbisrOw0KICAgICAgICAgICAgZW5kLmNvbHVtbi0tOw0KDQogICAgICAgICAgICByZXR1cm4gIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jc3MnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgQ3NzSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIFdvcmtlckNsaWVudCA9IHJlcXVpcmUoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50Ow0KdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IENzc0hpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSwgImkiKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgQ1N0eWxlRm9sZE1vZGUoKTsNCn07DQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9ICJjU3R5bGUiOw0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICAvLyBpZ25vcmUgYnJhY2VzIGluIGNvbW1lbnRzDQogICAgICAgIHZhciB0b2tlbnMgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSkudG9rZW5zOw0KICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50Iikgew0KICAgICAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKlx7XHMqJC8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIGluZGVudCArPSB0YWI7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgIH07DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7DQogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOw0KICAgIH07DQogICAgDQogICAgdGhpcy5jcmVhdGVXb3JrZXIgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyQ2xpZW50KFsiYWNlIl0sICJ3b3JrZXItY3NzLmpzIiwgImFjZS9tb2RlL2Nzc193b3JrZXIiLCAiV29ya2VyIik7DQogICAgICAgIHdvcmtlci5hdHRhY2hUb0RvY3VtZW50KHNlc3Npb24uZ2V0RG9jdW1lbnQoKSk7DQogICAgICAgIA0KICAgICAgICB3b3JrZXIub24oImNzc2xpbnQiLCBmdW5jdGlvbihlKSB7DQogICAgICAgICAgICB2YXIgZXJyb3JzID0gW107DQogICAgICAgICAgICBlLmRhdGEuZm9yRWFjaChmdW5jdGlvbihtZXNzYWdlKSB7DQogICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICByb3c6IG1lc3NhZ2UubGluZSAtIDEsDQogICAgICAgICAgICAgICAgICAgIGNvbHVtbjogbWVzc2FnZS5jb2wgLSAxLA0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiBtZXNzYWdlLm1lc3NhZ2UsDQogICAgICAgICAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2UudHlwZSwNCiAgICAgICAgICAgICAgICAgICAgbGludDogbWVzc2FnZQ0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsNCiAgICAgICAgfSk7DQogICAgICAgIHJldHVybiB3b3JrZXI7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvY3NzX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBDc3NIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdmFyIHByb3BlcnRpZXMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiLW1vei1hcHBlYXJhbmNlfC1tb3otYm94LXNpemluZ3wtd2Via2l0LWJveC1zaXppbmd8LW1vei1vdXRsaW5lLXJhZGl1c3wtbW96LXRyYW5zZm9ybXwtd2Via2l0LXRyYW5zZm9ybXwiICsNCiAgICAgICAgImFwcGVhcmFuY2V8YXppbXV0aHxiYWNrZ3JvdW5kLWF0dGFjaG1lbnR8YmFja2dyb3VuZC1jb2xvcnxiYWNrZ3JvdW5kLWltYWdlfCIgKw0KICAgICAgICAiYmFja2dyb3VuZC1vcmlnaW58YmFja2dyb3VuZC1wb3NpdGlvbnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kfGJvcmRlci1ib3R0b20tY29sb3J8IiArDQogICAgICAgICJib3JkZXItYm90dG9tLXN0eWxlfGJvcmRlci1ib3R0b20td2lkdGh8Ym9yZGVyLWJvdHRvbXxib3JkZXItY29sbGFwc2V8IiArDQogICAgICAgICJib3JkZXItY29sb3J8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtd2lkdGh8IiArDQogICAgICAgICJib3JkZXItbGVmdHxib3JkZXItcmlnaHQtY29sb3J8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC13aWR0aHwiICsNCiAgICAgICAgImJvcmRlci1yaWdodHxib3JkZXItc3BhY2luZ3xib3JkZXItc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnwiICsNCiAgICAgICAgImJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC13aWR0aHxib3JkZXItdG9wfGJvcmRlci13aWR0aHxib3JkZXJ8IiArDQogICAgICAgICJib3R0b218Ym94LXNpemluZ3xjYXB0aW9uLXNpZGV8Y2xlYXJ8Y2xpcHxjb2xvcnxjb250ZW50fGNvdW50ZXItaW5jcmVtZW50fCIgKw0KICAgICAgICAiY291bnRlci1yZXNldHxjdWUtYWZ0ZXJ8Y3VlLWJlZm9yZXxjdWV8Y3Vyc29yfGRpcmVjdGlvbnxkaXNwbGF5fCIgKw0KICAgICAgICAiZWxldmF0aW9ufGVtcHR5LWNlbGxzfGZsb2F0fGZvbnQtZmFtaWx5fGZvbnQtc2l6ZS1hZGp1c3R8Zm9udC1zaXplfCIgKw0KICAgICAgICAiZm9udC1zdHJldGNofGZvbnQtc3R5bGV8Zm9udC12YXJpYW50fGZvbnQtd2VpZ2h0fGZvbnR8aGVpZ2h0fGxlZnR8IiArDQogICAgICAgICJsZXR0ZXItc3BhY2luZ3xsaW5lLWhlaWdodHxsaXN0LXN0eWxlLWltYWdlfGxpc3Qtc3R5bGUtcG9zaXRpb258IiArDQogICAgICAgICJsaXN0LXN0eWxlLXR5cGV8bGlzdC1zdHlsZXxtYXJnaW4tYm90dG9tfG1hcmdpbi1sZWZ0fG1hcmdpbi1yaWdodHwiICsNCiAgICAgICAgIm1hcmdpbi10b3B8bWFya2VyLW9mZnNldHxtYXJnaW58bWFya3N8bWF4LWhlaWdodHxtYXgtd2lkdGh8bWluLWhlaWdodHwiICsNCiAgICAgICAgIm1pbi13aWR0aHwtbW96LWJvcmRlci1yYWRpdXN8b3BhY2l0eXxvcnBoYW5zfG91dGxpbmUtY29sb3J8b3V0bGluZS1vZmZzZXR8b3V0bGluZS1yYWRpdXN8IiArDQogICAgICAgICJvdXRsaW5lLXN0eWxlfG91dGxpbmUtd2lkdGh8b3V0bGluZXxvdmVyZmxvd3xvdmVyZmxvdy14fG92ZXJmbG93LXl8cGFkZGluZy1ib3R0b218IiArDQogICAgICAgICJwYWRkaW5nLWxlZnR8cGFkZGluZy1yaWdodHxwYWRkaW5nLXRvcHxwYWRkaW5nfHBhZ2UtYnJlYWstYWZ0ZXJ8IiArDQogICAgICAgICJwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlfHBhdXNlLWFmdGVyfHBhdXNlLWJlZm9yZXwiICsNCiAgICAgICAgInBhdXNlfHBpdGNoLXJhbmdlfHBpdGNofHBsYXktZHVyaW5nfHBvaW50ZXItZXZlbnRzfHBvc2l0aW9ufHF1b3Rlc3xyZXNpemV8cmljaG5lc3N8cmlnaHR8IiArDQogICAgICAgICJzaXplfHNwZWFrLWhlYWRlcnxzcGVhay1udW1lcmFsfHNwZWFrLXB1bmN0dWF0aW9ufHNwZWVjaC1yYXRlfHNwZWFrfCIgKw0KICAgICAgICAic3RyZXNzfHRhYmxlLWxheW91dHx0ZXh0LWFsaWdufHRleHQtZGVjb3JhdGlvbnx0ZXh0LWluZGVudHwiICsNCiAgICAgICAgInRleHQtc2hhZG93fHRleHQtdHJhbnNmb3JtfHRvcHx0cmFuc2Zvcm18dW5pY29kZS1iaWRpfHZlcnRpY2FsLWFsaWdufCIgKw0KICAgICAgICAidmlzaWJpbGl0eXx2b2ljZS1mYW1pbHl8dm9sdW1lfHdoaXRlLXNwYWNlfHdpZG93c3x3aWR0aHx3b3JkLXNwYWNpbmd8IiArDQogICAgICAgICJ6LWluZGV4Iikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoInJnYnxyZ2JhfHVybHxhdHRyfGNvdW50ZXJ8Y291bnRlcnMiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBjb25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYWJzb2x1dGV8YWxsLXNjcm9sbHxhbHdheXN8YXJtZW5pYW58YXV0b3xiYXNlbGluZXxiZWxvd3xiaWRpLW92ZXJyaWRlfCIgKw0KICAgICAgICAiYmxvY2t8Ym9sZHxib2xkZXJ8Ym9yZGVyLWJveHxib3RofGJvdHRvbXxicmVhay1hbGx8YnJlYWstd29yZHxjYXBpdGFsaXplfGNlbnRlcnwiICsNCiAgICAgICAgImNoYXJ8Y2lyY2xlfGNqay1pZGVvZ3JhcGhpY3xjb2wtcmVzaXplfGNvbGxhcHNlfGNvbnRlbnQtYm94fGNyb3NzaGFpcnxkYXNoZWR8IiArDQogICAgICAgICJkZWNpbWFsLWxlYWRpbmctemVyb3xkZWNpbWFsfGRlZmF1bHR8ZGlzYWJsZWR8ZGlzY3wiICsNCiAgICAgICAgImRpc3RyaWJ1dGUtYWxsLWxpbmVzfGRpc3RyaWJ1dGUtbGV0dGVyfGRpc3RyaWJ1dGUtc3BhY2V8IiArDQogICAgICAgICJkaXN0cmlidXRlfGRvdHRlZHxkb3VibGV8ZS1yZXNpemV8ZWxsaXBzaXN8Zml4ZWR8Z2VvcmdpYW58Z3Jvb3ZlfCIgKw0KICAgICAgICAiaGFuZHxoZWJyZXd8aGVscHxoaWRkZW58aGlyYWdhbmEtaXJvaGF8aGlyYWdhbmF8aG9yaXpvbnRhbHwiICsNCiAgICAgICAgImlkZW9ncmFwaC1hbHBoYXxpZGVvZ3JhcGgtbnVtZXJpY3xpZGVvZ3JhcGgtcGFyZW50aGVzaXN8IiArDQogICAgICAgICJpZGVvZ3JhcGgtc3BhY2V8aW5hY3RpdmV8aW5oZXJpdHxpbmxpbmUtYmxvY2t8aW5saW5lfGluc2V0fGluc2lkZXwiICsNCiAgICAgICAgImludGVyLWlkZW9ncmFwaHxpbnRlci13b3JkfGl0YWxpY3xqdXN0aWZ5fGthdGFrYW5hLWlyb2hhfGthdGFrYW5hfCIgKw0KICAgICAgICAia2VlcC1hbGx8bGVmdHxsaWdodGVyfGxpbmUtZWRnZXxsaW5lLXRocm91Z2h8bGluZXxsaXN0LWl0ZW18bG9vc2V8IiArDQogICAgICAgICJsb3dlci1hbHBoYXxsb3dlci1ncmVla3xsb3dlci1sYXRpbnxsb3dlci1yb21hbnxsb3dlcmNhc2V8bHItdGJ8bHRyfCIgKw0KICAgICAgICAibWVkaXVtfG1pZGRsZXxtb3ZlfG4tcmVzaXplfG5lLXJlc2l6ZXxuZXdzcGFwZXJ8bm8tZHJvcHxuby1yZXBlYXR8IiArDQogICAgICAgICJudy1yZXNpemV8bm9uZXxub3JtYWx8bm90LWFsbG93ZWR8bm93cmFwfG9ibGlxdWV8b3V0c2V0fG91dHNpZGV8IiArDQogICAgICAgICJvdmVybGluZXxwb2ludGVyfHByb2dyZXNzfHJlbGF0aXZlfHJlcGVhdC14fHJlcGVhdC15fHJlcGVhdHxyaWdodHwiICsNCiAgICAgICAgInJpZGdlfHJvdy1yZXNpemV8cnRsfHMtcmVzaXplfHNjcm9sbHxzZS1yZXNpemV8c2VwYXJhdGV8c21hbGwtY2Fwc3wiICsNCiAgICAgICAgInNvbGlkfHNxdWFyZXxzdGF0aWN8c3RyaWN0fHN1cGVyfHN3LXJlc2l6ZXx0YWJsZS1mb290ZXItZ3JvdXB8IiArDQogICAgICAgICJ0YWJsZS1oZWFkZXItZ3JvdXB8dGItcmx8dGV4dC1ib3R0b218dGV4dC10b3B8dGV4dHx0aGlja3x0aGlufHRvcHwiICsNCiAgICAgICAgInRyYW5zcGFyZW50fHVuZGVybGluZXx1cHBlci1hbHBoYXx1cHBlci1sYXRpbnx1cHBlci1yb21hbnx1cHBlcmNhc2V8IiArDQogICAgICAgICJ2ZXJ0aWNhbC1pZGVvZ3JhcGhpY3x2ZXJ0aWNhbC10ZXh0fHZpc2libGV8dy1yZXNpemV8d2FpdHx3aGl0ZXNwYWNlfCIgKw0KICAgICAgICAiemVybyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGNvbG9ycyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJhcXVhfGJsYWNrfGJsdWV8ZnVjaHNpYXxncmF5fGdyZWVufGxpbWV8bWFyb29ufG5hdnl8b2xpdmV8b3JhbmdlfCIgKw0KICAgICAgICAicHVycGxlfHJlZHxzaWx2ZXJ8dGVhbHx3aGl0ZXx5ZWxsb3ciKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4NCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkDQoNCiAgICB2YXIgbnVtUmUgPSAiXFwtPyg/Oig/OlswLTldKyl8KD86WzAtOV0qXFwuWzAtOV0rKSkiOw0KDQogICAgdmFyIGJhc2VfcnVsZXNldCA9IFsNCiAgICAgICAgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgIG5leHQgOiAicnVsZXNldF9jb21tZW50Ig0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsDQogICAgICAgICAgICByZWdleCA6IG51bVJlICsgIig/OmVtfGV4fHB4fGNtfG1tfGlufHB0fHBjfGRlZ3xyYWR8Z3JhZHxtc3xzfGh6fGtoenwlKSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsICAvLyBoZXg2IGNvbG9yDQogICAgICAgICAgICByZWdleCA6ICIjW2EtZjAtOV17Nn0iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgzIGNvbG9yDQogICAgICAgICAgICByZWdleCA6ICIjW2EtZjAtOV17M30iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQudHlwZSI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmNvbnN0YW50IjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sb3JzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5jb25zdGFudC5jb2xvciI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gInRleHQiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICByZWdleCA6ICJcXC0/W2EtekEtWl9dW2EtekEtWjAtOV9cXC1dKiINCiAgICAgICAgfQ0KICAgICAgXTsNCg0KICAgIHZhciBydWxlc2V0ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9ydWxlc2V0KTsNCiAgICBydWxlc2V0LnVuc2hpZnQoew0KICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICByZWdleCA6ICJcXH0iLA0KICAgICAgICBuZXh0OiAgICJzdGFydCINCiAgICB9KTsNCg0KICAgIHZhciBtZWRpYV9ydWxlc2V0ID0gbGFuZy5jb3B5QXJyYXkoIGJhc2VfcnVsZXNldCApOw0KICAgIG1lZGlhX3J1bGVzZXQudW5zaGlmdCh7DQogICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgIHJlZ2V4IDogIlxcfSIsDQogICAgICAgIG5leHQ6ICAgIm1lZGlhIg0KICAgIH0pOw0KDQogICAgdmFyIGJhc2VfY29tbWVudCA9IFt7DQogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICByZWdleCA6ICIuKyINCiAgICB9XTsNCg0KICAgIHZhciBjb21tZW50ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9jb21tZW50KTsNCiAgICBjb21tZW50LnVuc2hpZnQoew0KICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgfSk7DQoNCiAgICB2YXIgbWVkaWFfY29tbWVudCA9IGxhbmcuY29weUFycmF5KGJhc2VfY29tbWVudCk7DQogICAgbWVkaWFfY29tbWVudC51bnNoaWZ0KHsNCiAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICBuZXh0IDogIm1lZGlhIg0KICAgIH0pOw0KDQogICAgdmFyIHJ1bGVzZXRfY29tbWVudCA9IGxhbmcuY29weUFycmF5KGJhc2VfY29tbWVudCk7DQogICAgcnVsZXNldF9jb21tZW50LnVuc2hpZnQoew0KICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgIG5leHQgOiAicnVsZXNldCINCiAgICB9KTsNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogW3sNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuOiAicGFyZW4ubHBhcmVuIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiXFx7IiwNCiAgICAgICAgICAgIG5leHQ6ICAicnVsZXNldCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW46ICJzdHJpbmciLA0KICAgICAgICAgICAgcmVnZXg6ICJALio/eyIsDQogICAgICAgICAgICBuZXh0OiAgIm1lZGlhIg0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAia2V5d29yZCIsDQogICAgICAgICAgICByZWdleDogIiNbYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogInZhcmlhYmxlIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiXFwuW2EtejAtOS1fXSsiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJzdHJpbmciLA0KICAgICAgICAgICAgcmVnZXg6ICI6W2EtejAtOS1fXSsiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJjb25zdGFudCIsDQogICAgICAgICAgICByZWdleDogIlthLXowLTktX10rIg0KICAgICAgICB9XSwNCg0KICAgICAgICAibWVkaWEiIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgbmV4dCA6ICJtZWRpYV9jb21tZW50Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbjogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICByZWdleDogIlxceyIsDQogICAgICAgICAgICBuZXh0OiAgIm1lZGlhX3J1bGVzZXQiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJzdHJpbmciLA0KICAgICAgICAgICAgcmVnZXg6ICJcXH0iLA0KICAgICAgICAgICAgbmV4dDogICJzdGFydCINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogImtleXdvcmQiLA0KICAgICAgICAgICAgcmVnZXg6ICIjW2EtejAtOS1fXSsiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJ2YXJpYWJsZSIsDQogICAgICAgICAgICByZWdleDogIlxcLlthLXowLTktX10rIg0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAic3RyaW5nIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiOlthLXowLTktX10rIg0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAiY29uc3RhbnQiLA0KICAgICAgICAgICAgcmVnZXg6ICJbYS16MC05LV9dKyINCiAgICAgICAgfV0sDQoNCiAgICAgICAgImNvbW1lbnQiIDogY29tbWVudCwNCg0KICAgICAgICAicnVsZXNldCIgOiBydWxlc2V0LA0KICAgICAgICAicnVsZXNldF9jb21tZW50IiA6IHJ1bGVzZXRfY29tbWVudCwNCg0KICAgICAgICAibWVkaWFfcnVsZXNldCIgOiBtZWRpYV9ydWxlc2V0LA0KICAgICAgICAibWVkaWFfY29tbWVudCIgOiBtZWRpYV9jb21tZW50DQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhDc3NIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5Dc3NIaWdobGlnaHRSdWxlcyA9IENzc0hpZ2hsaWdodFJ1bGVzOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2NvbGRmdXNpb25faGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3htbF91dGlsJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIENzc0hpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9jc3NfaGlnaGxpZ2h0X3J1bGVzIikuQ3NzSGlnaGxpZ2h0UnVsZXM7DQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KdmFyIHhtbF91dGlsID0gcmVxdWlyZSgiLi94bWxfdXRpbCIpOw0KDQp2YXIgQ29sZGZ1c2lvbkhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMNCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkDQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgc3RhcnQgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcIVxcW0NEQVRBXFxbIiwNCiAgICAgICAgICAgIG5leHQgOiAiY2RhdGEiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInhtbF9wZSIsDQogICAgICAgICAgICByZWdleCA6ICI8XFw/Lio/XFw/PiINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICI8XFwhLS0iLA0KICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgICAgICByZWdleCA6ICI8KD89XHMqc2NyaXB0KSIsDQogICAgICAgICAgICBuZXh0IDogInNjcmlwdCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLA0KICAgICAgICAgICAgcmVnZXggOiAiPCg/PVxzKnN0eWxlKSIsDQogICAgICAgICAgICBuZXh0IDogInN0eWxlIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsIC8vIG9wZW5pbmcgdGFnDQogICAgICAgICAgICByZWdleCA6ICI8XFwvPyIsDQogICAgICAgICAgICBuZXh0IDogInRhZyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIltePF0rIg0KICAgICAgICB9IF0sDQogICAgDQogICAgICAgIGNkYXRhIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcXVxcXT4iLA0KICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICB9IF0sDQoNCiAgICAgICAgY29tbWVudCA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICByZWdleCA6ICIuKj8tLT4iLA0KICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgfSBdDQogICAgfTsNCiAgICANCiAgICB4bWxfdXRpbC50YWcodGhpcy4kcnVsZXMsICJ0YWciLCAic3RhcnQiKTsNCiAgICB4bWxfdXRpbC50YWcodGhpcy4kcnVsZXMsICJzdHlsZSIsICJjc3Mtc3RhcnQiKTsNCiAgICB4bWxfdXRpbC50YWcodGhpcy4kcnVsZXMsICJzY3JpcHQiLCAianMtc3RhcnQiKTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLCAianMtIiwgW3sNCiAgICAgICAgdG9rZW46ICJjb21tZW50IiwNCiAgICAgICAgcmVnZXg6ICJcXC9cXC8uKig/PTxcXC9zY3JpcHQ+KSIsDQogICAgICAgIG5leHQ6ICJ0YWciDQogICAgfSwgew0KICAgICAgICB0b2tlbjogIm1ldGEudGFnIiwNCiAgICAgICAgcmVnZXg6ICI8XFwvKD89c2NyaXB0KSIsDQogICAgICAgIG5leHQ6ICJ0YWciDQogICAgfV0pOw0KICAgIA0KICAgIHRoaXMuZW1iZWRSdWxlcyhDc3NIaWdobGlnaHRSdWxlcywgImNzcy0iLCBbew0KICAgICAgICB0b2tlbjogIm1ldGEudGFnIiwNCiAgICAgICAgcmVnZXg6ICI8XFwvKD89c3R5bGUpIiwNCiAgICAgICAgbmV4dDogInRhZyINCiAgICB9XSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoQ29sZGZ1c2lvbkhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkNvbGRmdXNpb25IaWdobGlnaHRSdWxlcyA9IENvbGRmdXNpb25IaWdobGlnaHRSdWxlczsNCn0pOw0KOw0KICAgICAgICAgICAgKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpDQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-coldfusion.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9jb2xkZnVzaW9uIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS94bWwiLCJhY2UvbW9kZS9qYXZhc2NyaXB0IiwiYWNlL21vZGUvY3NzIiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2NvbGRmdXNpb25faGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3htbCIpLk1vZGUsZj1hKCIuL2phdmFzY3JpcHQiKS5Nb2RlLGc9YSgiLi9jc3MiKS5Nb2RlLGg9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGk9YSgiLi9jb2xkZnVzaW9uX2hpZ2hsaWdodF9ydWxlcyIpLkNvbGRmdXNpb25IaWdobGlnaHRSdWxlcyxqPWZ1bmN0aW9uKCl7ZS5jYWxsKHRoaXMpO3ZhciBhPW5ldyBpO3RoaXMuJHRva2VuaXplcj1uZXcgaChhLmdldFJ1bGVzKCkpLHRoaXMuJGVtYmVkcz1hLmdldEVtYmVkcygpLHRoaXMuY3JlYXRlTW9kZURlbGVnYXRlcyh7ImpzLSI6ZiwiY3NzLSI6Z30pfTtkLmluaGVyaXRzKGosZSksZnVuY3Rpb24oKXt0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGIpfX0uY2FsbChqLnByb3RvdHlwZSksYi5Nb2RlPWp9KSxkZWZpbmUoImFjZS9tb2RlL3htbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvYmVoYXZpb3VyL3htbCIsImFjZS9tb2RlL2ZvbGRpbmcveG1sIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi94bWxfaGlnaGxpZ2h0X3J1bGVzIikuWG1sSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL2JlaGF2aW91ci94bWwiKS5YbWxCZWhhdmlvdXIsaT1hKCIuL2ZvbGRpbmcveG1sIikuRm9sZE1vZGUsaj1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpLHRoaXMuJGJlaGF2aW91cj1uZXcgaCx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgaX07ZC5pbmhlcml0cyhqLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJGdldEluZGVudChiKX19LmNhbGwoai5wcm90b3R5cGUpLGIuTW9kZT1qfSksZGVmaW5lKCJhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS94bWxfdXRpbCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3htbF91dGlsIiksZj1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGc9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoidGV4dCIscmVnZXg6IjxcXCFcXFtDREFUQVxcWyIsbmV4dDoiY2RhdGEifSx7dG9rZW46InhtbF9wZSIscmVnZXg6IjxcXD8uKj9cXD8+In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiPFxcIS0tIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjxcXC8/IixuZXh0OiJ0YWcifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiW148XSsifV0sY2RhdGE6W3t0b2tlbjoidGV4dCIscmVnZXg6IlxcXVxcXT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6Iig/OlteXFxdXXxcXF0oPyFcXF0+KSkrIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qPy0tPiIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sZS50YWcodGhpcy4kcnVsZXMsInRhZyIsInN0YXJ0Iil9O2QuaW5oZXJpdHMoZyxmKSxiLlhtbEhpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL3htbF91dGlsIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGcoYSl7cmV0dXJuW3t0b2tlbjoic3RyaW5nIixyZWdleDonIi4qPyInfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qJyxuZXh0OmErIl9xcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiJy4qPycifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6IlsnXS4qIixuZXh0OmErIl9xc3RyaW5nIn1dfWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm5be3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKj8iK2EsbmV4dDpifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvbGFuZyIpLGU9ZC5hcnJheVRvTWFwKCJidXR0b258Zm9ybXxpbnB1dHxsYWJlbHxzZWxlY3R8dGV4dGFyZWEiLnNwbGl0KCJ8IikpLGY9ZC5hcnJheVRvTWFwKCJ0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0ciIuc3BsaXQoInwiKSk7Yi50YWc9ZnVuY3Rpb24oYSxiLGMpe2FbYl09W3t0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT0iYSI/Im1ldGEudGFnLmFuY2hvciI6YT09PSJpbWciPyJtZXRhLnRhZy5pbWFnZSI6YT09PSJzY3JpcHQiPyJtZXRhLnRhZy5zY3JpcHQiOmE9PT0ic3R5bGUiPyJtZXRhLnRhZy5zdHlsZSI6ZS5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpPyJtZXRhLnRhZy5mb3JtIjpmLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/Im1ldGEudGFnLnRhYmxlIjoibWV0YS50YWcifSxtZXJnZTohMCxyZWdleDoiWy1fYS16QS1aMC05OiFdKyIsbmV4dDpiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OmIrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCJ9XSxhW2IrIl9xc3RyaW5nIl09aCgiJyIsYisiX2VtYmVkX2F0dHJpYnV0ZV9saXN0IiksYVtiKyJfcXFzdHJpbmciXT1oKCciJyxiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QiKSxhW2IrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCJdPVt7dG9rZW46Im1ldGEudGFnIixtZXJnZTohMCxyZWdleDoiLz8+IixuZXh0OmN9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6Ij0ifSx7dG9rZW46ImVudGl0eS5vdGhlci5hdHRyaWJ1dGUtbmFtZSIscmVnZXg6IlstX2EtekEtWjAtOTpdKyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XS5jb25jYXQoZyhiKSl9fSksZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIveG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9iZWhhdmlvdXIiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1hKCIuL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixnPWZ1bmN0aW9uKCl7dGhpcy5pbmhlcml0KGYsWyJzdHJpbmdfZHF1b3RlcyJdKSx0aGlzLmFkZCgiYnJhY2tldHMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09IjwiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj8hMTp7dGV4dDoiPD4iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09Ij4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSI+IilyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaz1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisyKTtpZihrPT0iPC8iKXt2YXIgbD10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShoLnJvdykpK2QuZ2V0VGFiU3RyaW5nKCksbT10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShoLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbCsiXG4iK20sc2VsZWN0aW9uOlsxLGwubGVuZ3RoLDEsbC5sZW5ndGhdfX19fSl9O2QuaW5oZXJpdHMoZyxlKSxiLlhtbEJlaGF2aW91cj1nfSksZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9iZWhhdmlvdXIiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uL2JlaGF2aW91ciIpLkJlaGF2aW91cixmPWZ1bmN0aW9uKCl7dGhpcy5hZGQoImJyYWNlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0ieyIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiJ7IitnKyJ9IixzZWxlY3Rpb246ITF9Ont0ZXh0OiJ7fSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0ifSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09In0iKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIn0iLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX1lbHNlIGlmKGU9PSJcbiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09In0iKXt2YXIgbD1kLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpoLnJvdyxjb2x1bW46aC5jb2x1bW4rMX0pO2lmKCFsKXJldHVybiBudWxsO3ZhciBtPXRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoYSxpLnN1YnN0cmluZygwLGkubGVuZ3RoLTEpLGQuZ2V0VGFiU3RyaW5nKCkpLG49dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUobC5yb3cpKTtyZXR1cm57dGV4dDoiXG4iK20rIlxuIituLHNlbGVjdGlvbjpbMSxtLmxlbmd0aCwxLG0ubGVuZ3RoXX19fX0pLHRoaXMuYWRkKCJicmFjZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09InsiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuZW5kLmNvbHVtbixlLmVuZC5jb2x1bW4rMSk7aWYoaD09In0iKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09IigiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoiKCIrZysiKSIsc2VsZWN0aW9uOiExfTp7dGV4dDoiKCkiLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09IikiKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSIpIil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCIpIix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInBhcmVucyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0iKCIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0iKSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSciJyl7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO2lmKGchPT0iIilyZXR1cm57dGV4dDonIicrZysnIicsc2VsZWN0aW9uOiExfTt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLTEsaC5jb2x1bW4pO2lmKGo9PSJcXCIpcmV0dXJuIG51bGw7dmFyIGs9ZC5nZXRUb2tlbnMoZi5zdGFydC5yb3csZi5zdGFydC5yb3cpWzBdLnRva2VucyxsPTAsbSxuPS0xO2Zvcih2YXIgbz0wO288ay5sZW5ndGg7bysrKXttPWtbb10sbS50eXBlPT0ic3RyaW5nIj9uPS0xOm48MCYmKG49bS52YWx1ZS5pbmRleE9mKCciJykpO2lmKG0udmFsdWUubGVuZ3RoK2w+Zi5zdGFydC5jb2x1bW4pYnJlYWs7bCs9a1tvXS52YWx1ZS5sZW5ndGh9aWYoIW18fG48MCYmbS50eXBlIT09ImNvbW1lbnQiJiYobS50eXBlIT09InN0cmluZyJ8fGYuc3RhcnQuY29sdW1uIT09bS52YWx1ZS5sZW5ndGgrbC0xJiZtLnZhbHVlLmxhc3RJbmRleE9mKCciJyk9PT1tLnZhbHVlLmxlbmd0aC0xKSlyZXR1cm57dGV4dDonIiInLHNlbGVjdGlvbjpbMSwxXX07aWYobSYmbS50eXBlPT09InN0cmluZyIpe3ZhciBwPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKHA9PSciJylyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09JyInKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09JyInKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pfTtkLmluaGVyaXRzKGYsZSksYi5Dc3R5bGVCZWhhdmlvdXI9Zn0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy94bWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi8uLi9saWIvbGFuZyIpLGY9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxnPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsaD1hKCIuLi8uLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3IsaT1iLkZvbGRNb2RlPWZ1bmN0aW9uKGEpe2cuY2FsbCh0aGlzKSx0aGlzLnZvaWRFbGVtZW50cz1hfHx7fX07ZC5pbmhlcml0cyhpLGcpLGZ1bmN0aW9uKCl7dGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9nZXRGaXJzdFRhZ0luTGluZShhLGMpO3JldHVybiBkLmNsb3Npbmc/Yj09Im1hcmtiZWdpbmVuZCI/ImVuZCI6IiI6IWQudGFnTmFtZXx8dGhpcy52b2lkRWxlbWVudHNbZC50YWdOYW1lLnRvTG93ZXJDYXNlKCldPyIiOmQuc2VsZkNsb3Npbmc/IiI6ZC52YWx1ZS5pbmRleE9mKCIvIitkLnRhZ05hbWUpIT09LTE/IiI6InN0YXJ0In0sdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldFRva2VucyhiLGIpWzBdLnRva2VucyxkPSIiO2Zvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKXt2YXIgZz1jW2ZdO2cudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MD9kKz1nLnZhbHVlOmQrPWUuc3RyaW5nUmVwZWF0KCIgIixnLnZhbHVlLmxlbmd0aCl9cmV0dXJuIHRoaXMuX3BhcnNlVGFnKGQpfSx0aGlzLnRhZ1JlPS9eKFxzKikoPD8oXC8/KShbLV9hLXpBLVowLTk6IV0qKVxzKihcLz8pPj8pLyx0aGlzLl9wYXJzZVRhZz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnRhZ1JlLmV4ZWMoYSksYz10aGlzLnRhZ1JlLmxhc3RJbmRleHx8MDtyZXR1cm4gdGhpcy50YWdSZS5sYXN0SW5kZXg9MCx7dmFsdWU6YSxtYXRjaDpiP2JbMl06IiIsY2xvc2luZzpiPyEhYlszXTohMSxzZWxmQ2xvc2luZzpiPyEhYls1XXx8YlsyXT09Ii8+IjohMSx0YWdOYW1lOmI/Yls0XToiIixjb2x1bW46YlsxXT9jK2JbMV0ubGVuZ3RoOmN9fSx0aGlzLl9yZWFkVGFnRm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYj1hLmdldEN1cnJlbnRUb2tlbigpO2lmKCFiKXJldHVybiBudWxsO3ZhciBjPSIiLGQ7ZG8gaWYoYi50eXBlLmluZGV4T2YoIm1ldGEudGFnIik9PT0wKXtpZighZCl2YXIgZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9O2MrPWIudmFsdWU7aWYoYy5pbmRleE9mKCI+IikhPT0tMSl7dmFyIGU9dGhpcy5fcGFyc2VUYWcoYyk7cmV0dXJuIGUuc3RhcnQ9ZCxlLmVuZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrYi52YWx1ZS5sZW5ndGh9LGEuc3RlcEZvcndhcmQoKSxlfX13aGlsZShiPWEuc3RlcEZvcndhcmQoKSk7cmV0dXJuIG51bGx9LHRoaXMuX3JlYWRUYWdCYWNrd2FyZD1mdW5jdGlvbihhKXt2YXIgYj1hLmdldEN1cnJlbnRUb2tlbigpO2lmKCFiKXJldHVybiBudWxsO3ZhciBjPSIiLGQ7ZG8gaWYoYi50eXBlLmluZGV4T2YoIm1ldGEudGFnIik9PT0wKXtkfHwoZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrYi52YWx1ZS5sZW5ndGh9KSxjPWIudmFsdWUrYztpZihjLmluZGV4T2YoIjwiKSE9PS0xKXt2YXIgZT10aGlzLl9wYXJzZVRhZyhjKTtyZXR1cm4gZS5lbmQ9ZCxlLnN0YXJ0PXtyb3c6YS5nZXRDdXJyZW50VG9rZW5Sb3coKSxjb2x1bW46YS5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKX0sYS5zdGVwQmFja3dhcmQoKSxlfX13aGlsZShiPWEuc3RlcEJhY2t3YXJkKCkpO3JldHVybiBudWxsfSx0aGlzLl9wb3A9ZnVuY3Rpb24oYSxiKXt3aGlsZShhLmxlbmd0aCl7dmFyIGM9YVthLmxlbmd0aC0xXTtpZighYnx8Yy50YWdOYW1lPT1iLnRhZ05hbWUpcmV0dXJuIGEucG9wKCk7aWYodGhpcy52b2lkRWxlbWVudHNbYi50YWdOYW1lXSlyZXR1cm47aWYodGhpcy52b2lkRWxlbWVudHNbYy50YWdOYW1lXSl7YS5wb3AoKTtjb250aW51ZX1yZXR1cm4gbnVsbH19LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9nZXRGaXJzdFRhZ0luTGluZShhLGMpO2lmKCFkLm1hdGNoKXJldHVybiBudWxsO3ZhciBlPWQuY2xvc2luZ3x8ZC5zZWxmQ2xvc2luZyxnPVtdLGk7aWYoIWUpe3ZhciBqPW5ldyBoKGEsYyxkLmNvbHVtbiksaz17cm93OmMsY29sdW1uOmQuY29sdW1uK2QudGFnTmFtZS5sZW5ndGgrMn07d2hpbGUoaT10aGlzLl9yZWFkVGFnRm9yd2FyZChqKSl7aWYoaS5zZWxmQ2xvc2luZyl7aWYoIWcubGVuZ3RoKXJldHVybiBpLnN0YXJ0LmNvbHVtbis9aS50YWdOYW1lLmxlbmd0aCsyLGkuZW5kLmNvbHVtbi09MixmLmZyb21Qb2ludHMoaS5zdGFydCxpLmVuZCk7Y29udGludWV9aWYoaS5jbG9zaW5nKXt0aGlzLl9wb3AoZyxpKTtpZihnLmxlbmd0aD09MClyZXR1cm4gZi5mcm9tUG9pbnRzKGssaS5zdGFydCl9ZWxzZSBnLnB1c2goaSl9fWVsc2V7dmFyIGo9bmV3IGgoYSxjLGQuY29sdW1uK2QubWF0Y2gubGVuZ3RoKSxsPXtyb3c6Yyxjb2x1bW46ZC5jb2x1bW59O3doaWxlKGk9dGhpcy5fcmVhZFRhZ0JhY2t3YXJkKGopKXtpZihpLnNlbGZDbG9zaW5nKXtpZighZy5sZW5ndGgpcmV0dXJuIGkuc3RhcnQuY29sdW1uKz1pLnRhZ05hbWUubGVuZ3RoKzIsaS5lbmQuY29sdW1uLT0yLGYuZnJvbVBvaW50cyhpLnN0YXJ0LGkuZW5kKTtjb250aW51ZX1pZighaS5jbG9zaW5nKXt0aGlzLl9wb3AoZyxpKTtpZihnLmxlbmd0aD09MClyZXR1cm4gaS5zdGFydC5jb2x1bW4rPWkudGFnTmFtZS5sZW5ndGgrMixmLmZyb21Qb2ludHMoaS5zdGFydCxsKX1lbHNlIGcucHVzaChpKX19fX0uY2FsbChpLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IiwiYWNlL3JhbmdlIiwiYWNlL3dvcmtlci93b3JrZXJfY2xpZW50IiwiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyxoPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGk9YSgiLi4vcmFuZ2UiKS5SYW5nZSxqPWEoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50LGs9YSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLGw9YSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlLG09ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRvdXRkZW50PW5ldyBoLHRoaXMuJGJlaGF2aW91cj1uZXcgayx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgbH07ZC5pbmhlcml0cyhtLGUpLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ITAsZj0vXihccyopXC9cLy87Zm9yKHZhciBnPWM7Zzw9ZDtnKyspaWYoIWYudGVzdChiLmdldExpbmUoZykpKXtlPSExO2JyZWFrfWlmKGUpe3ZhciBoPW5ldyBpKDAsMCwwLDApO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKXt2YXIgaj1iLmdldExpbmUoZyksaz1qLm1hdGNoKGYpO2guc3RhcnQucm93PWcsaC5lbmQucm93PWcsaC5lbmQuY29sdW1uPWtbMF0ubGVuZ3RoLGIucmVwbGFjZShoLGtbMV0pfX1lbHNlIGIuaW5kZW50Um93cyhjLGQsIi8vIil9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucyxnPWUuc3RhdGU7aWYoZi5sZW5ndGgmJmZbZi5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiBkO2lmKGE9PSJzdGFydCJ8fGE9PSJyZWdleF9hbGxvd2VkIil7dmFyIGg9Yi5tYXRjaCgvXi4qKD86XGJjYXNlXGIuKlw6fFtce1woXFtdKVxzKiQvKTtoJiYoZCs9Yyl9ZWxzZSBpZihhPT0iZG9jLXN0YXJ0Iil7aWYoZz09InN0YXJ0Inx8YT09InJlZ2V4X2FsbG93ZWQiKXJldHVybiIiO3ZhciBoPWIubWF0Y2goL15ccyooXC8/KVwqLyk7aCYmKGhbMV0mJihkKz0iICIpLGQrPSIqICIpfXJldHVybiBkfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGooWyJhY2UiXSwid29ya2VyLWphdmFzY3JpcHQuanMiLCJhY2UvbW9kZS9qYXZhc2NyaXB0X3dvcmtlciIsIkphdmFTY3JpcHRXb3JrZXIiKTtyZXR1cm4gYi5hdHRhY2hUb0RvY3VtZW50KGEuZ2V0RG9jdW1lbnQoKSksYi5vbigianNsaW50IixmdW5jdGlvbihiKXt2YXIgYz1bXTtmb3IodmFyIGQ9MDtkPGIuZGF0YS5sZW5ndGg7ZCsrKXt2YXIgZT1iLmRhdGFbZF07ZSYmYy5wdXNoKHtyb3c6ZS5saW5lLTEsY29sdW1uOmUuY2hhcmFjdGVyLTEsdGV4dDplLnJlYXNvbix0eXBlOiJ3YXJuaW5nIixsaW50OmV9KX1hLnNldEFubm90YXRpb25zKGMpfSksYi5vbigibmFyY2lzc3VzIixmdW5jdGlvbihiKXthLnNldEFubm90YXRpb25zKFtiLmRhdGFdKX0pLGIub24oInRlcm1pbmF0ZSIsZnVuY3Rpb24oKXthLmNsZWFyQW5ub3RhdGlvbnMoKX0pLGJ9fS5jYWxsKG0ucHJvdG90eXBlKSxiLk1vZGU9bX0pLGRlZmluZSgiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS91bmljb2RlIiwiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4uL2xpYi9sYW5nIiksZj1hKCIuLi91bmljb2RlIiksZz1hKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyxoPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsaT1mdW5jdGlvbigpe3ZhciBhPWUuYXJyYXlUb01hcCgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXxOYW1lc3BhY2V8UU5hbWV8WE1MfFhNTExpc3R8QXJyYXlCdWZmZXJ8RmxvYXQzMkFycmF5fEZsb2F0NjRBcnJheXxJbnQxNkFycmF5fEludDMyQXJyYXl8SW50OEFycmF5fFVpbnQxNkFycmF5fFVpbnQzMkFycmF5fFVpbnQ4QXJyYXl8VWludDhDbGFtcGVkQXJyYXl8RXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufFN5bnRheEVycm9yfFR5cGVFcnJvcnxVUklFcnJvcnxkZWNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxlbmNvZGVVUklDb21wb25lbnR8ZXZhbHxpc0Zpbml0ZXxpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fEpTT058TWF0aHx0aGlzfGFyZ3VtZW50c3xwcm90b3R5cGV8d2luZG93fGRvY3VtZW50Ii5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgiYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufGlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8Y29uc3R8eWllbGR8aW1wb3J0fGdldHxzZXQiLnNwbGl0KCJ8IikpLGM9ImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGQiLGQ9ZS5hcnJheVRvTWFwKCJfX3BhcmVudF9ffF9fY291bnRfX3xlc2NhcGV8dW5lc2NhcGV8d2l0aHxfX3Byb3RvX18iLnNwbGl0KCJ8IikpLGg9ZS5hcnJheVRvTWFwKCJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIi5zcGxpdCgifCIpKSxpPWUuYXJyYXlUb01hcCgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIi5zcGxpdCgifCIpKSxqPWUuYXJyYXlUb01hcCgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8cHVibGljfGludGVyZmFjZXxwYWNrYWdlfHByb3RlY3RlZHxzdGF0aWMiLnNwbGl0KCJ8IikpLGs9IlsiK2YucGFja2FnZXMuTCsiXFwkX11bIitmLnBhY2thZ2VzLkwrZi5wYWNrYWdlcy5NbitmLnBhY2thZ2VzLk1jK2YucGFja2FnZXMuTmQrZi5wYWNrYWdlcy5QYysiXFwkX10qXFxiIjt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qJCJ9LChuZXcgZykuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qXFxcXCQnLG5leHQ6InFxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKlxcXFwkIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiMFt4WF1bMC05YS1mQS1GXStcXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjpbImtleXdvcmQuZGVmaW5pdGlvbiIsInRleHQiLCJlbnRpdHkubmFtZS5mdW5jdGlvbiJdLHJlZ2V4OiIoZnVuY3Rpb24pKFxccyspKCIraysiKSJ9LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIscmVnZXg6Iig/OnRydWV8ZmFsc2UpXFxiIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiKD86IitjKyIpXFxiIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOmZ1bmN0aW9uKGMpe3JldHVybiBhLmhhc093blByb3BlcnR5KGMpPyJ2YXJpYWJsZS5sYW5ndWFnZSI6ZC5oYXNPd25Qcm9wZXJ0eShjKT8iaW52YWxpZC5kZXByZWNhdGVkIjpoLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkLmRlZmluaXRpb24iOmIuaGFzT3duUHJvcGVydHkoYyk/ImtleXdvcmQiOmkuaGFzT3duUHJvcGVydHkoYyk/ImNvbnN0YW50Lmxhbmd1YWdlIjpqLmhhc093blByb3BlcnR5KGMpPyJpbnZhbGlkLmlsbGVnYWwiOmM9PSJkZWJ1Z2dlciI/ImludmFsaWQuZGVwcmVjYXRlZCI6ImlkZW50aWZpZXIifSxyZWdleDprfSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkiLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDoiXFw/fFxcOnxcXCx8XFw7fFxcLiIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoicGFyZW4ubHBhcmVuIixyZWdleDoiW1soe10iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IltcXF0pfV0ifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXC89PyIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6Il4jIS4qJCJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0scmVnZXhfYWxsb3dlZDpbe3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50X3JlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJcXC8iLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLHJlZ2V4Olt7dG9rZW46InJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikiLG5leHQ6InJlZ2V4In0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiL1xcdyoiLG5leHQ6InN0YXJ0IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiW15cXFxcL1xcW10rIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLHJlZ2V4OiJcXFsiLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsbWVyZ2U6ITB9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLHJlZ2V4X2NoYXJhY3Rlcl9jbGFzczpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MifSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiXSIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiW15cXFxcXFxdXSsiLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsbWVyZ2U6ITB9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLGNvbW1lbnRfcmVnZXhfYWxsb3dlZDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixtZXJnZTohMCxuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixtZXJnZTohMCxuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Jyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSx0aGlzLmVtYmVkUnVsZXMoZywiZG9jLSIsWyhuZXcgZykuZ2V0RW5kUnVsZSgic3RhcnQiKV0pfTtkLmluaGVyaXRzKGksaCksYi5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM9aX0pLGRlZmluZSgiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQuZG9jLnRhZyIscmVnZXg6IkBbXFx3XFxkX10rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxccysifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiVE9ETyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJbXkBcXCpdKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiIuIn1dfX07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXRTdGFydFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKig/PVxcKikiLG5leHQ6YX19LHRoaXMuZ2V0RW5kUnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwqXFwvIixuZXh0OmF9fX0uY2FsbChmLnByb3RvdHlwZSksYi5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9Zn0pLGRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4vXlxzKyQvLnRlc3QoYSk/L15ccypcfS8udGVzdChiKTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0TGluZShiKSxlPWMubWF0Y2goL14oXHMqXH0pLyk7aWYoIWUpcmV0dXJuIDA7dmFyIGY9ZVsxXS5sZW5ndGgsZz1hLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpiLGNvbHVtbjpmfSk7aWYoIWd8fGcucm93PT1iKXJldHVybiAwO3ZhciBoPXRoaXMuJGdldEluZGVudChhLmdldExpbmUoZy5yb3cpKTthLnJlcGxhY2UobmV3IGQoYiwwLGIsZi0xKSxoKX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9ZX0pLGRlZmluZSgiYWNlL3dvcmtlci93b3JrZXJfY2xpZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLGY9ZnVuY3Rpb24oYixkLGUsZil7dGhpcy5jaGFuZ2VMaXN0ZW5lcj10aGlzLmNoYW5nZUxpc3RlbmVyLmJpbmQodGhpcyk7aWYoYy5wYWNrYWdlZCl7dmFyIGc9dGhpcy4kZ3Vlc3NCYXNlUGF0aCgpO3RoaXMuJHdvcmtlcj1uZXcgV29ya2VyKGcrZCl9ZWxzZXt2YXIgaD10aGlzLiRub3JtYWxpemVQYXRoKGEubmFtZVRvVXJsKCJhY2Uvd29ya2VyL3dvcmtlciIsbnVsbCwiXyIpKTt0aGlzLiR3b3JrZXI9bmV3IFdvcmtlcihoKTt2YXIgaT17fTtmb3IodmFyIGo9MDtqPGIubGVuZ3RoO2orKyl7dmFyIGs9YltqXSxsPXRoaXMuJG5vcm1hbGl6ZVBhdGgoYS5uYW1lVG9VcmwoayxudWxsLCJfIikucmVwbGFjZSgvLmpzJC8sIiIpKTtpW2tdPWx9fXRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7aW5pdDohMCx0bG5zOmksbW9kdWxlOmUsY2xhc3NuYW1lOmZ9KSx0aGlzLmNhbGxiYWNrSWQ9MSx0aGlzLmNhbGxiYWNrcz17fTt2YXIgbT10aGlzO3RoaXMuJHdvcmtlci5vbmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IHdpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZyYmY29uc29sZS5sb2coYSksYX0sdGhpcy4kd29ya2VyLm9ubWVzc2FnZT1mdW5jdGlvbihhKXt2YXIgYj1hLmRhdGE7c3dpdGNoKGIudHlwZSl7Y2FzZSJsb2ciOndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZyYmY29uc29sZS5sb2coYi5kYXRhKTticmVhaztjYXNlImV2ZW50IjptLl9lbWl0KGIubmFtZSx7ZGF0YTpiLmRhdGF9KTticmVhaztjYXNlImNhbGwiOnZhciBjPW0uY2FsbGJhY2tzW2IuaWRdO2MmJihjKGIuZGF0YSksZGVsZXRlIG0uY2FsbGJhY2tzW2IuaWRdKX19fTsoKGZ1bmN0aW9uKCl7ZC5pbXBsZW1lbnQodGhpcyxlKSx0aGlzLiRub3JtYWxpemVQYXRoPWZ1bmN0aW9uKGEpe3JldHVybiBhPWEucmVwbGFjZSgvXlthLXpdKzpcL1wvW15cL10rXC8vLCIiKSxhPWxvY2F0aW9uLnByb3RvY29sKyIvLyIrbG9jYXRpb24uaG9zdCsoYS5jaGFyQXQoMCk9PSIvIj8iIjpsb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKC9cL1teXC9dKiQvLCIiKSkrIi8iK2EucmVwbGFjZSgvXltcL10rLywiIiksYX0sdGhpcy4kZ3Vlc3NCYXNlUGF0aD1mdW5jdGlvbigpe2lmKGEuYWNlQmFzZVVybClyZXR1cm4gYS5hY2VCYXNlVXJsO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXSxlPWQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjZS1iYXNlIik7aWYoZSlyZXR1cm4gZS5yZXBsYWNlKC9cLyokLywiLyIpO3ZhciBmPWQuc3JjfHxkLmdldEF0dHJpYnV0ZSgic3JjIik7aWYoIWYpY29udGludWU7dmFyIGc9Zi5tYXRjaCgvXig/OiguKlwvKWFjZVwuanN8KC4qXC8pYWNlKC11bmNvbXByZXNzZWQpPygtbm9jb25mbGljdCk/XC5qcykoPzpcP3wkKS8pO2lmKGcpcmV0dXJuIGdbMV18fGdbMl19cmV0dXJuIiJ9LHRoaXMudGVybWluYXRlPWZ1bmN0aW9uKCl7dGhpcy5fZW1pdCgidGVybWluYXRlIix7fSksdGhpcy4kd29ya2VyLnRlcm1pbmF0ZSgpLHRoaXMuJHdvcmtlcj1udWxsLHRoaXMuJGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHRoaXMuY2hhbmdlTGlzdGVuZXIpLHRoaXMuJGRvYz1udWxsfSx0aGlzLnNlbmQ9ZnVuY3Rpb24oYSxiKXt0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6YSxhcmdzOmJ9KX0sdGhpcy5jYWxsPWZ1bmN0aW9uKGEsYixjKXtpZihjKXt2YXIgZD10aGlzLmNhbGxiYWNrSWQrKzt0aGlzLmNhbGxiYWNrc1tkXT1jLGIucHVzaChkKX10aGlzLnNlbmQoYSxiKX0sdGhpcy5lbWl0PWZ1bmN0aW9uKGEsYil7dHJ5e3RoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7ZXZlbnQ6YSxkYXRhOntkYXRhOmIuZGF0YX19KX1jYXRjaChjKXt9fSx0aGlzLmF0dGFjaFRvRG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dGhpcy4kZG9jJiZ0aGlzLnRlcm1pbmF0ZSgpLHRoaXMuJGRvYz1hLHRoaXMuY2FsbCgic2V0VmFsdWUiLFthLmdldFZhbHVlKCldKSxhLm9uKCJjaGFuZ2UiLHRoaXMuY2hhbmdlTGlzdGVuZXIpfSx0aGlzLmNoYW5nZUxpc3RlbmVyPWZ1bmN0aW9uKGEpe2EucmFuZ2U9e3N0YXJ0OmEuZGF0YS5yYW5nZS5zdGFydCxlbmQ6YS5kYXRhLnJhbmdlLmVuZH0sdGhpcy5lbWl0KCJjaGFuZ2UiLGEpfX0pKS5jYWxsKGYucHJvdG90eXBlKSxiLldvcmtlckNsaWVudD1mfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZj1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGc9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307ZC5pbmhlcml0cyhnLGYpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9Lyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS8sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKSxmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXg7aWYoZlsxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGEsZlsxXSxjLGcpO3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcrZlswXS5sZW5ndGgpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH1pZihiIT09Im1hcmtiZWdpbmVuZCIpcmV0dXJuO3ZhciBmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleCtmWzBdLmxlbmd0aDtpZihmWzJdKXt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9dmFyIGk9e3JvdzpjLGNvbHVtbjpnfSxqPWEuJGZpbmRPcGVuaW5nQnJhY2tldChmWzFdLGkpO2lmKCFqKXJldHVybjtyZXR1cm4gai5jb2x1bW4rKyxpLmNvbHVtbi0tLGUuZnJvbVBvaW50cyhqLGkpfX19LmNhbGwoZy5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9jc3MiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvY3NzX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzLGg9YSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsaT1hKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxqPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxrPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSwiaSIpLHRoaXMuJG91dGRlbnQ9bmV3IGgsdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGp9O2QuaW5oZXJpdHMoayxlKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1J1bGVzPSJjU3R5bGUiLHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSkudG9rZW5zO2lmKGUubGVuZ3RoJiZlW2UubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDt2YXIgZj1iLm1hdGNoKC9eLipce1xzKiQvKTtyZXR1cm4gZiYmKGQrPWMpLGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfSx0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgaShbImFjZSJdLCJ3b3JrZXItY3NzLmpzIiwiYWNlL21vZGUvY3NzX3dvcmtlciIsIldvcmtlciIpO3JldHVybiBiLmF0dGFjaFRvRG9jdW1lbnQoYS5nZXREb2N1bWVudCgpKSxiLm9uKCJjc3NsaW50IixmdW5jdGlvbihiKXt2YXIgYz1bXTtiLmRhdGEuZm9yRWFjaChmdW5jdGlvbihhKXtjLnB1c2goe3JvdzphLmxpbmUtMSxjb2x1bW46YS5jb2wtMSx0ZXh0OmEubWVzc2FnZSx0eXBlOmEudHlwZSxsaW50OmF9KX0pLGEuc2V0QW5ub3RhdGlvbnMoYyl9KSxifX0uY2FsbChrLnByb3RvdHlwZSksYi5Nb2RlPWt9KSxkZWZpbmUoImFjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCItbW96LWFwcGVhcmFuY2V8LW1vei1ib3gtc2l6aW5nfC13ZWJraXQtYm94LXNpemluZ3wtbW96LW91dGxpbmUtcmFkaXVzfC1tb3otdHJhbnNmb3JtfC13ZWJraXQtdHJhbnNmb3JtfGFwcGVhcmFuY2V8YXppbXV0aHxiYWNrZ3JvdW5kLWF0dGFjaG1lbnR8YmFja2dyb3VuZC1jb2xvcnxiYWNrZ3JvdW5kLWltYWdlfGJhY2tncm91bmQtb3JpZ2lufGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1yZXBlYXR8YmFja2dyb3VuZHxib3JkZXItYm90dG9tLWNvbG9yfGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS13aWR0aHxib3JkZXItYm90dG9tfGJvcmRlci1jb2xsYXBzZXxib3JkZXItY29sb3J8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnR8Ym9yZGVyLXJpZ2h0LWNvbG9yfGJvcmRlci1yaWdodC1zdHlsZXxib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0fGJvcmRlci1zcGFjaW5nfGJvcmRlci1zdHlsZXxib3JkZXItdG9wLWNvbG9yfGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC13aWR0aHxib3JkZXItdG9wfGJvcmRlci13aWR0aHxib3JkZXJ8Ym90dG9tfGJveC1zaXppbmd8Y2FwdGlvbi1zaWRlfGNsZWFyfGNsaXB8Y29sb3J8Y29udGVudHxjb3VudGVyLWluY3JlbWVudHxjb3VudGVyLXJlc2V0fGN1ZS1hZnRlcnxjdWUtYmVmb3JlfGN1ZXxjdXJzb3J8ZGlyZWN0aW9ufGRpc3BsYXl8ZWxldmF0aW9ufGVtcHR5LWNlbGxzfGZsb2F0fGZvbnQtZmFtaWx5fGZvbnQtc2l6ZS1hZGp1c3R8Zm9udC1zaXplfGZvbnQtc3RyZXRjaHxmb250LXN0eWxlfGZvbnQtdmFyaWFudHxmb250LXdlaWdodHxmb250fGhlaWdodHxsZWZ0fGxldHRlci1zcGFjaW5nfGxpbmUtaGVpZ2h0fGxpc3Qtc3R5bGUtaW1hZ2V8bGlzdC1zdHlsZS1wb3NpdGlvbnxsaXN0LXN0eWxlLXR5cGV8bGlzdC1zdHlsZXxtYXJnaW4tYm90dG9tfG1hcmdpbi1sZWZ0fG1hcmdpbi1yaWdodHxtYXJnaW4tdG9wfG1hcmtlci1vZmZzZXR8bWFyZ2lufG1hcmtzfG1heC1oZWlnaHR8bWF4LXdpZHRofG1pbi1oZWlnaHR8bWluLXdpZHRofC1tb3otYm9yZGVyLXJhZGl1c3xvcGFjaXR5fG9ycGhhbnN8b3V0bGluZS1jb2xvcnxvdXRsaW5lLW9mZnNldHxvdXRsaW5lLXJhZGl1c3xvdXRsaW5lLXN0eWxlfG91dGxpbmUtd2lkdGh8b3V0bGluZXxvdmVyZmxvd3xvdmVyZmxvdy14fG92ZXJmbG93LXl8cGFkZGluZy1ib3R0b218cGFkZGluZy1sZWZ0fHBhZGRpbmctcmlnaHR8cGFkZGluZy10b3B8cGFkZGluZ3xwYWdlLWJyZWFrLWFmdGVyfHBhZ2UtYnJlYWstYmVmb3JlfHBhZ2UtYnJlYWstaW5zaWRlfHBhZ2V8cGF1c2UtYWZ0ZXJ8cGF1c2UtYmVmb3JlfHBhdXNlfHBpdGNoLXJhbmdlfHBpdGNofHBsYXktZHVyaW5nfHBvaW50ZXItZXZlbnRzfHBvc2l0aW9ufHF1b3Rlc3xyZXNpemV8cmljaG5lc3N8cmlnaHR8c2l6ZXxzcGVhay1oZWFkZXJ8c3BlYWstbnVtZXJhbHxzcGVhay1wdW5jdHVhdGlvbnxzcGVlY2gtcmF0ZXxzcGVha3xzdHJlc3N8dGFibGUtbGF5b3V0fHRleHQtYWxpZ258dGV4dC1kZWNvcmF0aW9ufHRleHQtaW5kZW50fHRleHQtc2hhZG93fHRleHQtdHJhbnNmb3JtfHRvcHx0cmFuc2Zvcm18dW5pY29kZS1iaWRpfHZlcnRpY2FsLWFsaWdufHZpc2liaWxpdHl8dm9pY2UtZmFtaWx5fHZvbHVtZXx3aGl0ZS1zcGFjZXx3aWRvd3N8d2lkdGh8d29yZC1zcGFjaW5nfHotaW5kZXgiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJyZ2J8cmdiYXx1cmx8YXR0cnxjb3VudGVyfGNvdW50ZXJzIi5zcGxpdCgifCIpKSxjPWUuYXJyYXlUb01hcCgiYWJzb2x1dGV8YWxsLXNjcm9sbHxhbHdheXN8YXJtZW5pYW58YXV0b3xiYXNlbGluZXxiZWxvd3xiaWRpLW92ZXJyaWRlfGJsb2NrfGJvbGR8Ym9sZGVyfGJvcmRlci1ib3h8Ym90aHxib3R0b218YnJlYWstYWxsfGJyZWFrLXdvcmR8Y2FwaXRhbGl6ZXxjZW50ZXJ8Y2hhcnxjaXJjbGV8Y2prLWlkZW9ncmFwaGljfGNvbC1yZXNpemV8Y29sbGFwc2V8Y29udGVudC1ib3h8Y3Jvc3NoYWlyfGRhc2hlZHxkZWNpbWFsLWxlYWRpbmctemVyb3xkZWNpbWFsfGRlZmF1bHR8ZGlzYWJsZWR8ZGlzY3xkaXN0cmlidXRlLWFsbC1saW5lc3xkaXN0cmlidXRlLWxldHRlcnxkaXN0cmlidXRlLXNwYWNlfGRpc3RyaWJ1dGV8ZG90dGVkfGRvdWJsZXxlLXJlc2l6ZXxlbGxpcHNpc3xmaXhlZHxnZW9yZ2lhbnxncm9vdmV8aGFuZHxoZWJyZXd8aGVscHxoaWRkZW58aGlyYWdhbmEtaXJvaGF8aGlyYWdhbmF8aG9yaXpvbnRhbHxpZGVvZ3JhcGgtYWxwaGF8aWRlb2dyYXBoLW51bWVyaWN8aWRlb2dyYXBoLXBhcmVudGhlc2lzfGlkZW9ncmFwaC1zcGFjZXxpbmFjdGl2ZXxpbmhlcml0fGlubGluZS1ibG9ja3xpbmxpbmV8aW5zZXR8aW5zaWRlfGludGVyLWlkZW9ncmFwaHxpbnRlci13b3JkfGl0YWxpY3xqdXN0aWZ5fGthdGFrYW5hLWlyb2hhfGthdGFrYW5hfGtlZXAtYWxsfGxlZnR8bGlnaHRlcnxsaW5lLWVkZ2V8bGluZS10aHJvdWdofGxpbmV8bGlzdC1pdGVtfGxvb3NlfGxvd2VyLWFscGhhfGxvd2VyLWdyZWVrfGxvd2VyLWxhdGlufGxvd2VyLXJvbWFufGxvd2VyY2FzZXxsci10YnxsdHJ8bWVkaXVtfG1pZGRsZXxtb3ZlfG4tcmVzaXplfG5lLXJlc2l6ZXxuZXdzcGFwZXJ8bm8tZHJvcHxuby1yZXBlYXR8bnctcmVzaXplfG5vbmV8bm9ybWFsfG5vdC1hbGxvd2VkfG5vd3JhcHxvYmxpcXVlfG91dHNldHxvdXRzaWRlfG92ZXJsaW5lfHBvaW50ZXJ8cHJvZ3Jlc3N8cmVsYXRpdmV8cmVwZWF0LXh8cmVwZWF0LXl8cmVwZWF0fHJpZ2h0fHJpZGdlfHJvdy1yZXNpemV8cnRsfHMtcmVzaXplfHNjcm9sbHxzZS1yZXNpemV8c2VwYXJhdGV8c21hbGwtY2Fwc3xzb2xpZHxzcXVhcmV8c3RhdGljfHN0cmljdHxzdXBlcnxzdy1yZXNpemV8dGFibGUtZm9vdGVyLWdyb3VwfHRhYmxlLWhlYWRlci1ncm91cHx0Yi1ybHx0ZXh0LWJvdHRvbXx0ZXh0LXRvcHx0ZXh0fHRoaWNrfHRoaW58dG9wfHRyYW5zcGFyZW50fHVuZGVybGluZXx1cHBlci1hbHBoYXx1cHBlci1sYXRpbnx1cHBlci1yb21hbnx1cHBlcmNhc2V8dmVydGljYWwtaWRlb2dyYXBoaWN8dmVydGljYWwtdGV4dHx2aXNpYmxlfHctcmVzaXplfHdhaXR8d2hpdGVzcGFjZXx6ZXJvIi5zcGxpdCgifCIpKSxkPWUuYXJyYXlUb01hcCgiYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXxwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvdyIuc3BsaXQoInwiKSksZj0iXFwtPyg/Oig/OlswLTldKyl8KD86WzAtOV0qXFwuWzAtOV0rKSkiLGc9W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoicnVsZXNldF9jb21tZW50In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDpmKyIoPzplbXxleHxweHxjbXxtbXxpbnxwdHxwY3xkZWd8cmFkfGdyYWR8bXN8c3xoenxraHp8JSkifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIjW2EtZjAtOV17Nn0ifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIjW2EtZjAtOV17M30ifSx7dG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8ic3VwcG9ydC50eXBlIjpiLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/InN1cHBvcnQuZnVuY3Rpb24iOmMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8ic3VwcG9ydC5jb25zdGFudCI6ZC5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpPyJzdXBwb3J0LmNvbnN0YW50LmNvbG9yIjoidGV4dCJ9LHJlZ2V4OiJcXC0/W2EtekEtWl9dW2EtekEtWjAtOV9cXC1dKiJ9XSxoPWUuY29weUFycmF5KGcpO2gudW5zaGlmdCh7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IlxcfSIsbmV4dDoic3RhcnQifSk7dmFyIGk9ZS5jb3B5QXJyYXkoZyk7aS51bnNoaWZ0KHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiXFx9IixuZXh0OiJtZWRpYSJ9KTt2YXIgaj1be3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0saz1lLmNvcHlBcnJheShqKTtrLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9KTt2YXIgbD1lLmNvcHlBcnJheShqKTtsLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJtZWRpYSJ9KTt2YXIgbT1lLmNvcHlBcnJheShqKTttLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJydWxlc2V0In0pLHRoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJcXHsiLG5leHQ6InJ1bGVzZXQifSx7dG9rZW46InN0cmluZyIscmVnZXg6IkAuKj97IixuZXh0OiJtZWRpYSJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6IiNbYS16MC05LV9dKyJ9LHt0b2tlbjoidmFyaWFibGUiLHJlZ2V4OiJcXC5bYS16MC05LV9dKyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiOlthLXowLTktX10rIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6IlthLXowLTktX10rIn1dLG1lZGlhOlt7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6Im1lZGlhX2NvbW1lbnQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IlxceyIsbmV4dDoibWVkaWFfcnVsZXNldCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXFx9IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6IiNbYS16MC05LV9dKyJ9LHt0b2tlbjoidmFyaWFibGUiLHJlZ2V4OiJcXC5bYS16MC05LV9dKyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiOlthLXowLTktX10rIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6IlthLXowLTktX10rIn1dLGNvbW1lbnQ6ayxydWxlc2V0OmgscnVsZXNldF9jb21tZW50Om0sbWVkaWFfcnVsZXNldDppLG1lZGlhX2NvbW1lbnQ6bH19O2QuaW5oZXJpdHMoZyxmKSxiLkNzc0hpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL2NvbGRmdXNpb25faGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3htbF91dGlsIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlcyxmPWEoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsZz1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi94bWxfdXRpbCIpLGk9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoidGV4dCIsbWVyZ2U6ITAscmVnZXg6IjxcXCFcXFtDREFUQVxcWyIsbmV4dDoiY2RhdGEifSx7dG9rZW46InhtbF9wZSIscmVnZXg6IjxcXD8uKj9cXD8+In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiPFxcIS0tIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjwoPz1zKnNjcmlwdCkiLG5leHQ6InNjcmlwdCJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8KD89cypzdHlsZSkiLG5leHQ6InN0eWxlIn0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjxcXC8/IixuZXh0OiJ0YWcifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiW148XSsifV0sY2RhdGE6W3t0b2tlbjoidGV4dCIscmVnZXg6IlxcXVxcXT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJ0ZXh0IixtZXJnZTohMCxyZWdleDoiXFxzKyJ9LHt0b2tlbjoidGV4dCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qPy0tPiIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0saC50YWcodGhpcy4kcnVsZXMsInRhZyIsInN0YXJ0IiksaC50YWcodGhpcy4kcnVsZXMsInN0eWxlIiwiY3NzLXN0YXJ0IiksaC50YWcodGhpcy4kcnVsZXMsInNjcmlwdCIsImpzLXN0YXJ0IiksdGhpcy5lbWJlZFJ1bGVzKGYsImpzLSIsW3t0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qKD89PFxcL3NjcmlwdD4pIixuZXh0OiJ0YWcifSx7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPFxcLyg/PXNjcmlwdCkiLG5leHQ6InRhZyJ9XSksdGhpcy5lbWJlZFJ1bGVzKGUsImNzcy0iLFt7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPFxcLyg/PXN0eWxlKSIsbmV4dDoidGFnIn1dKX07ZC5pbmhlcml0cyhpLGcpLGIuQ29sZGZ1c2lvbkhpZ2hsaWdodFJ1bGVzPWl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-csharp-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCdhY2UvbW9kZS9jc2hhcnAnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9jc2hhcnBfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIENTaGFycEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9jc2hhcnBfaGlnaGxpZ2h0X3J1bGVzIikuQ1NoYXJwSGlnaGxpZ2h0UnVsZXM7DQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSByZXF1aXJlKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudDsNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgQ1NoYXJwSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQogIA0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KICANCiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV0udHlwZSA9PSAiY29tbWVudCIpIHsNCiAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgICAgIH0NCiAgICANCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKltce1woXFtdXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICANCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KICANCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7DQogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOw0KICAgIH07DQoNCg0KICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KZGVmaW5lKCdhY2UvbW9kZS9jc2hhcnBfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBDU2hhcnBIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAoImFic3RyYWN0fGV2ZW50fG5ld3xzdHJ1Y3R8YXN8ZXhwbGljaXR8bnVsbHxzd2l0Y2h8YmFzZXxleHRlcm58b2JqZWN0fHRoaXN8Ym9vbHxmYWxzZXxvcGVyYXRvcnx0aHJvd3xicmVha3xmaW5hbGx5fG91dHx0cnVlfGJ5dGV8Zml4ZWR8b3ZlcnJpZGV8dHJ5fGNhc2V8ZmxvYXR8cGFyYW1zfHR5cGVvZnxjYXRjaHxmb3J8cHJpdmF0ZXx1aW50fGNoYXJ8Zm9yZWFjaHxwcm90ZWN0ZWR8dWxvbmd8Y2hlY2tlZHxnb3RvfHB1YmxpY3x1bmNoZWNrZWR8Y2xhc3N8aWZ8cmVhZG9ubHl8dW5zYWZlfGNvbnN0fGltcGxpY2l0fHJlZnx1c2hvcnR8Y29udGludWV8aW58cmV0dXJufHVzaW5nfGRlY2ltYWx8aW50fHNieXRlfHZpcnR1YWx8ZGVmYXVsdHxpbnRlcmZhY2V8c2VhbGVkfHZvbGF0aWxlfGRlbGVnYXRlfGludGVybmFsfHNob3J0fHZvaWR8ZG98aXN8c2l6ZW9mfHdoaWxlfGRvdWJsZXxsb2NrfHN0YWNrYWxsb2N8ZWxzZXxsb25nfHN0YXRpY3xlbnVtfG5hbWVzcGFjZXxzdHJpbmd8dmFyfGR5bmFtaWMiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsZGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIm51bGx8dHJ1ZXxmYWxzZSIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQoNCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWy9dKD86KD86XFxbKD86XFxcXF18W15cXF1dKStcXF0pfCg/OlxcXFwvfFteXFxdL10pKSpbL11cXHcqXFxzKig/PVspLiw7XXwkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgNCiAgICAgICAgICAgICAgICByZWdleCA6ICIwW3hYXVswLTlhLWZBLUZdK1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzp0cnVlfGZhbHNlKVxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAidGhpcyIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbGRpbkNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIC8vIFRPRE86IFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcw0KICAgICAgICAgICAgICAgIC8vIFRPRE86IFVuaWNvZGUgaWRlbnRpZmllcnMNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXD98XFw6fFxcLHxcXDt8XFwuIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZW1iZWRSdWxlcyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsICJkb2MtIiwNCiAgICAgICAgWyBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0RW5kUnVsZSgic3RhcnQiKSBdKTsNCn07DQoNCm9vcC5pbmhlcml0cyhDU2hhcnBIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5DU2hhcnBIaWdobGlnaHRSdWxlcyA9IENTaGFycEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYy50YWciLA0KICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiVE9ETyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4iDQogICAgICAgIH1dDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0U3RhcnRSdWxlID0gZnVuY3Rpb24oc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKig/PVxcKikiLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRFbmRSdWxlID0gZnVuY3Rpb24gKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwqXFwvIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KDQp9KS5jYWxsKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcy5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91ciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7DQoNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAneycgKyBzZWxlY3RlZCArICd9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnfScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBzZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1uICsgMX0pOw0KICAgICAgICAgICAgICAgIGlmICghb3BlbkJyYWNlUG9zKQ0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQoNCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5nZXROZXh0TGluZUluZGVudChzdGF0ZSwgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSwgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5lbmQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoJyArIHNlbGVjdGVkICsgJyknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICcpJykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICcoJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICciJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJyInICsgc2VsZWN0ZWQgKyAnIicsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICAgICAgdmFyIGxlZnRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbi0xLCBjdXJzb3IuY29sdW1uKTsNCg0KICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGVzY2FwZWQuDQogICAgICAgICAgICAgICAgaWYgKGxlZnRDaGFyID09ICdcXCcpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMoc2VsZWN0aW9uLnN0YXJ0LnJvdywgc2VsZWN0aW9uLnN0YXJ0LnJvdylbMF0udG9rZW5zOw0KICAgICAgICAgICAgICAgIHZhciBjb2wgPSAwLCB0b2tlbjsNCiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4NCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdG9rZW5zLmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOw0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gLTE7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSB0b2tlbi52YWx1ZS5pbmRleE9mKCciJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0Lg0KICAgICAgICAgICAgICAgIGlmICghdG9rZW4gfHwgKHF1b3RlcG9zIDwgMCAmJiB0b2tlbi50eXBlICE9PSAiY29tbWVudCIgJiYgKHRva2VuLnR5cGUgIT09ICJzdHJpbmciIHx8ICgoc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbiAhPT0gdG9rZW4udmFsdWUubGVuZ3RoK2NvbC0xKSAmJiB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZignIicpID09PSB0b2tlbi52YWx1ZS5sZW5ndGgtMSkpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGlucHV0IGFuZCBtb3ZlIHJpZ2h0IG9uZSBpZiB3ZSdyZSB0eXBpbmcgb3ZlciB0aGUgY2xvc2luZyBxdW90ZS4NCiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICciJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KfQ0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsNCg0KZXhwb3J0cy5Dc3R5bGVCZWhhdmlvdXIgPSBDc3R5bGVCZWhhdmlvdXI7DQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOw0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9Ow0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoIXN0YXJ0KQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7DQogICAgICAgICAgICBlbmQuY29sdW1uLS07DQoNCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvY3NzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvY3NzX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIENzc0hpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9jc3NfaGlnaGxpZ2h0X3J1bGVzIikuQ3NzSGlnaGxpZ2h0UnVsZXM7DQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSByZXF1aXJlKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudDsNCnZhciBXb3JrZXJDbGllbnQgPSByZXF1aXJlKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudDsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBDc3NIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCksICJpIik7DQogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSAiY1N0eWxlIjsNCg0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQoNCiAgICAgICAgLy8gaWdub3JlIGJyYWNlcyBpbiBjb21tZW50cw0KICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMobGluZSwgc3RhdGUpLnRva2VuczsNCiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV0udHlwZSA9PSAiY29tbWVudCIpIHsNCiAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLipce1xzKiQvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlckNsaWVudChbImFjZSJdLCAid29ya2VyLWNzcy5qcyIsICJhY2UvbW9kZS9jc3Nfd29ya2VyIiwgIldvcmtlciIpOw0KICAgICAgICB3b3JrZXIuYXR0YWNoVG9Eb2N1bWVudChzZXNzaW9uLmdldERvY3VtZW50KCkpOw0KICAgICAgICANCiAgICAgICAgd29ya2VyLm9uKCJjc3NsaW50IiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgdmFyIGVycm9ycyA9IFtdOw0KICAgICAgICAgICAgZS5kYXRhLmZvckVhY2goZnVuY3Rpb24obWVzc2FnZSkgew0KICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgcm93OiBtZXNzYWdlLmxpbmUgLSAxLA0KICAgICAgICAgICAgICAgICAgICBjb2x1bW46IG1lc3NhZ2UuY29sIC0gMSwNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogbWVzc2FnZS5tZXNzYWdlLA0KICAgICAgICAgICAgICAgICAgICB0eXBlOiBtZXNzYWdlLnR5cGUsDQogICAgICAgICAgICAgICAgICAgIGxpbnQ6IG1lc3NhZ2UNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBzZXNzaW9uLnNldEFubm90YXRpb25zKGVycm9ycyk7DQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4gd29ya2VyOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgQ3NzSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIHZhciBwcm9wZXJ0aWVzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIi1tb3otYXBwZWFyYW5jZXwtbW96LWJveC1zaXppbmd8LXdlYmtpdC1ib3gtc2l6aW5nfC1tb3otb3V0bGluZS1yYWRpdXN8LW1vei10cmFuc2Zvcm18LXdlYmtpdC10cmFuc2Zvcm18IiArDQogICAgICAgICJhcHBlYXJhbmNlfGF6aW11dGh8YmFja2dyb3VuZC1hdHRhY2htZW50fGJhY2tncm91bmQtY29sb3J8YmFja2dyb3VuZC1pbWFnZXwiICsNCiAgICAgICAgImJhY2tncm91bmQtb3JpZ2lufGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1yZXBlYXR8YmFja2dyb3VuZHxib3JkZXItYm90dG9tLWNvbG9yfCIgKw0KICAgICAgICAiYm9yZGVyLWJvdHRvbS1zdHlsZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b218Ym9yZGVyLWNvbGxhcHNlfCIgKw0KICAgICAgICAiYm9yZGVyLWNvbG9yfGJvcmRlci1sZWZ0LWNvbG9yfGJvcmRlci1sZWZ0LXN0eWxlfGJvcmRlci1sZWZ0LXdpZHRofCIgKw0KICAgICAgICAiYm9yZGVyLWxlZnR8Ym9yZGVyLXJpZ2h0LWNvbG9yfGJvcmRlci1yaWdodC1zdHlsZXxib3JkZXItcmlnaHQtd2lkdGh8IiArDQogICAgICAgICJib3JkZXItcmlnaHR8Ym9yZGVyLXNwYWNpbmd8Ym9yZGVyLXN0eWxlfGJvcmRlci10b3AtY29sb3J8IiArDQogICAgICAgICJib3JkZXItdG9wLXN0eWxlfGJvcmRlci10b3Atd2lkdGh8Ym9yZGVyLXRvcHxib3JkZXItd2lkdGh8Ym9yZGVyfCIgKw0KICAgICAgICAiYm90dG9tfGJveC1zaXppbmd8Y2FwdGlvbi1zaWRlfGNsZWFyfGNsaXB8Y29sb3J8Y29udGVudHxjb3VudGVyLWluY3JlbWVudHwiICsNCiAgICAgICAgImNvdW50ZXItcmVzZXR8Y3VlLWFmdGVyfGN1ZS1iZWZvcmV8Y3VlfGN1cnNvcnxkaXJlY3Rpb258ZGlzcGxheXwiICsNCiAgICAgICAgImVsZXZhdGlvbnxlbXB0eS1jZWxsc3xmbG9hdHxmb250LWZhbWlseXxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXwiICsNCiAgICAgICAgImZvbnQtc3RyZXRjaHxmb250LXN0eWxlfGZvbnQtdmFyaWFudHxmb250LXdlaWdodHxmb250fGhlaWdodHxsZWZ0fCIgKw0KICAgICAgICAibGV0dGVyLXNwYWNpbmd8bGluZS1oZWlnaHR8bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlLXBvc2l0aW9ufCIgKw0KICAgICAgICAibGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGV8bWFyZ2luLWJvdHRvbXxtYXJnaW4tbGVmdHxtYXJnaW4tcmlnaHR8IiArDQogICAgICAgICJtYXJnaW4tdG9wfG1hcmtlci1vZmZzZXR8bWFyZ2lufG1hcmtzfG1heC1oZWlnaHR8bWF4LXdpZHRofG1pbi1oZWlnaHR8IiArDQogICAgICAgICJtaW4td2lkdGh8LW1vei1ib3JkZXItcmFkaXVzfG9wYWNpdHl8b3JwaGFuc3xvdXRsaW5lLWNvbG9yfG91dGxpbmUtb2Zmc2V0fG91dGxpbmUtcmFkaXVzfCIgKw0KICAgICAgICAib3V0bGluZS1zdHlsZXxvdXRsaW5lLXdpZHRofG91dGxpbmV8b3ZlcmZsb3d8b3ZlcmZsb3cteHxvdmVyZmxvdy15fHBhZGRpbmctYm90dG9tfCIgKw0KICAgICAgICAicGFkZGluZy1sZWZ0fHBhZGRpbmctcmlnaHR8cGFkZGluZy10b3B8cGFkZGluZ3xwYWdlLWJyZWFrLWFmdGVyfCIgKw0KICAgICAgICAicGFnZS1icmVhay1iZWZvcmV8cGFnZS1icmVhay1pbnNpZGV8cGFnZXxwYXVzZS1hZnRlcnxwYXVzZS1iZWZvcmV8IiArDQogICAgICAgICJwYXVzZXxwaXRjaC1yYW5nZXxwaXRjaHxwbGF5LWR1cmluZ3xwb2ludGVyLWV2ZW50c3xwb3NpdGlvbnxxdW90ZXN8cmVzaXplfHJpY2huZXNzfHJpZ2h0fCIgKw0KICAgICAgICAic2l6ZXxzcGVhay1oZWFkZXJ8c3BlYWstbnVtZXJhbHxzcGVhay1wdW5jdHVhdGlvbnxzcGVlY2gtcmF0ZXxzcGVha3wiICsNCiAgICAgICAgInN0cmVzc3x0YWJsZS1sYXlvdXR8dGV4dC1hbGlnbnx0ZXh0LWRlY29yYXRpb258dGV4dC1pbmRlbnR8IiArDQogICAgICAgICJ0ZXh0LXNoYWRvd3x0ZXh0LXRyYW5zZm9ybXx0b3B8dHJhbnNmb3JtfHVuaWNvZGUtYmlkaXx2ZXJ0aWNhbC1hbGlnbnwiICsNCiAgICAgICAgInZpc2liaWxpdHl8dm9pY2UtZmFtaWx5fHZvbHVtZXx3aGl0ZS1zcGFjZXx3aWRvd3N8d2lkdGh8d29yZC1zcGFjaW5nfCIgKw0KICAgICAgICAiei1pbmRleCIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJyZ2J8cmdiYXx1cmx8YXR0cnxjb3VudGVyfGNvdW50ZXJzIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgY29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImFic29sdXRlfGFsbC1zY3JvbGx8YWx3YXlzfGFybWVuaWFufGF1dG98YmFzZWxpbmV8YmVsb3d8YmlkaS1vdmVycmlkZXwiICsNCiAgICAgICAgImJsb2NrfGJvbGR8Ym9sZGVyfGJvcmRlci1ib3h8Ym90aHxib3R0b218YnJlYWstYWxsfGJyZWFrLXdvcmR8Y2FwaXRhbGl6ZXxjZW50ZXJ8IiArDQogICAgICAgICJjaGFyfGNpcmNsZXxjamstaWRlb2dyYXBoaWN8Y29sLXJlc2l6ZXxjb2xsYXBzZXxjb250ZW50LWJveHxjcm9zc2hhaXJ8ZGFzaGVkfCIgKw0KICAgICAgICAiZGVjaW1hbC1sZWFkaW5nLXplcm98ZGVjaW1hbHxkZWZhdWx0fGRpc2FibGVkfGRpc2N8IiArDQogICAgICAgICJkaXN0cmlidXRlLWFsbC1saW5lc3xkaXN0cmlidXRlLWxldHRlcnxkaXN0cmlidXRlLXNwYWNlfCIgKw0KICAgICAgICAiZGlzdHJpYnV0ZXxkb3R0ZWR8ZG91YmxlfGUtcmVzaXplfGVsbGlwc2lzfGZpeGVkfGdlb3JnaWFufGdyb292ZXwiICsNCiAgICAgICAgImhhbmR8aGVicmV3fGhlbHB8aGlkZGVufGhpcmFnYW5hLWlyb2hhfGhpcmFnYW5hfGhvcml6b250YWx8IiArDQogICAgICAgICJpZGVvZ3JhcGgtYWxwaGF8aWRlb2dyYXBoLW51bWVyaWN8aWRlb2dyYXBoLXBhcmVudGhlc2lzfCIgKw0KICAgICAgICAiaWRlb2dyYXBoLXNwYWNlfGluYWN0aXZlfGluaGVyaXR8aW5saW5lLWJsb2NrfGlubGluZXxpbnNldHxpbnNpZGV8IiArDQogICAgICAgICJpbnRlci1pZGVvZ3JhcGh8aW50ZXItd29yZHxpdGFsaWN8anVzdGlmeXxrYXRha2FuYS1pcm9oYXxrYXRha2FuYXwiICsNCiAgICAgICAgImtlZXAtYWxsfGxlZnR8bGlnaHRlcnxsaW5lLWVkZ2V8bGluZS10aHJvdWdofGxpbmV8bGlzdC1pdGVtfGxvb3NlfCIgKw0KICAgICAgICAibG93ZXItYWxwaGF8bG93ZXItZ3JlZWt8bG93ZXItbGF0aW58bG93ZXItcm9tYW58bG93ZXJjYXNlfGxyLXRifGx0cnwiICsNCiAgICAgICAgIm1lZGl1bXxtaWRkbGV8bW92ZXxuLXJlc2l6ZXxuZS1yZXNpemV8bmV3c3BhcGVyfG5vLWRyb3B8bm8tcmVwZWF0fCIgKw0KICAgICAgICAibnctcmVzaXplfG5vbmV8bm9ybWFsfG5vdC1hbGxvd2VkfG5vd3JhcHxvYmxpcXVlfG91dHNldHxvdXRzaWRlfCIgKw0KICAgICAgICAib3ZlcmxpbmV8cG9pbnRlcnxwcm9ncmVzc3xyZWxhdGl2ZXxyZXBlYXQteHxyZXBlYXQteXxyZXBlYXR8cmlnaHR8IiArDQogICAgICAgICJyaWRnZXxyb3ctcmVzaXplfHJ0bHxzLXJlc2l6ZXxzY3JvbGx8c2UtcmVzaXplfHNlcGFyYXRlfHNtYWxsLWNhcHN8IiArDQogICAgICAgICJzb2xpZHxzcXVhcmV8c3RhdGljfHN0cmljdHxzdXBlcnxzdy1yZXNpemV8dGFibGUtZm9vdGVyLWdyb3VwfCIgKw0KICAgICAgICAidGFibGUtaGVhZGVyLWdyb3VwfHRiLXJsfHRleHQtYm90dG9tfHRleHQtdG9wfHRleHR8dGhpY2t8dGhpbnx0b3B8IiArDQogICAgICAgICJ0cmFuc3BhcmVudHx1bmRlcmxpbmV8dXBwZXItYWxwaGF8dXBwZXItbGF0aW58dXBwZXItcm9tYW58dXBwZXJjYXNlfCIgKw0KICAgICAgICAidmVydGljYWwtaWRlb2dyYXBoaWN8dmVydGljYWwtdGV4dHx2aXNpYmxlfHctcmVzaXplfHdhaXR8d2hpdGVzcGFjZXwiICsNCiAgICAgICAgInplcm8iKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBjb2xvcnMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXwiICsNCiAgICAgICAgInB1cnBsZXxyZWR8c2lsdmVyfHRlYWx8d2hpdGV8eWVsbG93Iikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdmFyIG51bVJlID0gIlxcLT8oPzooPzpbMC05XSspfCg/OlswLTldKlxcLlswLTldKykpIjsNCg0KICAgIHZhciBiYXNlX3J1bGVzZXQgPSBbDQogICAgICAgIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICBuZXh0IDogInJ1bGVzZXRfY29tbWVudCINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLA0KICAgICAgICAgICAgcmVnZXggOiBudW1SZSArICIoPzplbXxleHxweHxjbXxtbXxpbnxwdHxwY3xkZWd8cmFkfGdyYWR8bXN8c3xoenxraHp8JSkiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAgLy8gaGV4NiBjb2xvcg0KICAgICAgICAgICAgcmVnZXggOiAiI1thLWYwLTldezZ9Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4MyBjb2xvcg0KICAgICAgICAgICAgcmVnZXggOiAiI1thLWYwLTldezN9Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LnR5cGUiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChmdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoY29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5jb25zdGFudCI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbG9ycy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuY29uc3RhbnQuY29sb3IiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ0ZXh0IjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgcmVnZXggOiAiXFwtP1thLXpBLVpfXVthLXpBLVowLTlfXFwtXSoiDQogICAgICAgIH0NCiAgICAgIF07DQoNCiAgICB2YXIgcnVsZXNldCA9IGxhbmcuY29weUFycmF5KGJhc2VfcnVsZXNldCk7DQogICAgcnVsZXNldC51bnNoaWZ0KHsNCiAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgcmVnZXggOiAiXFx9IiwNCiAgICAgICAgbmV4dDogICAic3RhcnQiDQogICAgfSk7DQoNCiAgICB2YXIgbWVkaWFfcnVsZXNldCA9IGxhbmcuY29weUFycmF5KCBiYXNlX3J1bGVzZXQgKTsNCiAgICBtZWRpYV9ydWxlc2V0LnVuc2hpZnQoew0KICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICByZWdleCA6ICJcXH0iLA0KICAgICAgICBuZXh0OiAgICJtZWRpYSINCiAgICB9KTsNCg0KICAgIHZhciBiYXNlX2NvbW1lbnQgPSBbew0KICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgcmVnZXggOiAiLisiDQogICAgfV07DQoNCiAgICB2YXIgY29tbWVudCA9IGxhbmcuY29weUFycmF5KGJhc2VfY29tbWVudCk7DQogICAgY29tbWVudC51bnNoaWZ0KHsNCiAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgIH0pOw0KDQogICAgdmFyIG1lZGlhX2NvbW1lbnQgPSBsYW5nLmNvcHlBcnJheShiYXNlX2NvbW1lbnQpOw0KICAgIG1lZGlhX2NvbW1lbnQudW5zaGlmdCh7DQogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgbmV4dCA6ICJtZWRpYSINCiAgICB9KTsNCg0KICAgIHZhciBydWxlc2V0X2NvbW1lbnQgPSBsYW5nLmNvcHlBcnJheShiYXNlX2NvbW1lbnQpOw0KICAgIHJ1bGVzZXRfY29tbWVudC51bnNoaWZ0KHsNCiAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICBuZXh0IDogInJ1bGVzZXQiDQogICAgfSk7DQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbjogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICByZWdleDogIlxceyIsDQogICAgICAgICAgICBuZXh0OiAgInJ1bGVzZXQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuOiAic3RyaW5nIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiQC4qP3siLA0KICAgICAgICAgICAgbmV4dDogICJtZWRpYSINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogImtleXdvcmQiLA0KICAgICAgICAgICAgcmVnZXg6ICIjW2EtejAtOS1fXSsiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJ2YXJpYWJsZSIsDQogICAgICAgICAgICByZWdleDogIlxcLlthLXowLTktX10rIg0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAic3RyaW5nIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiOlthLXowLTktX10rIg0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAiY29uc3RhbnQiLA0KICAgICAgICAgICAgcmVnZXg6ICJbYS16MC05LV9dKyINCiAgICAgICAgfV0sDQoNCiAgICAgICAgIm1lZGlhIiA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgIG5leHQgOiAibWVkaWFfY29tbWVudCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW46ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgcmVnZXg6ICJcXHsiLA0KICAgICAgICAgICAgbmV4dDogICJtZWRpYV9ydWxlc2V0Ig0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAic3RyaW5nIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiXFx9IiwNCiAgICAgICAgICAgIG5leHQ6ICAic3RhcnQiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJrZXl3b3JkIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiI1thLXowLTktX10rIg0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAidmFyaWFibGUiLA0KICAgICAgICAgICAgcmVnZXg6ICJcXC5bYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsDQogICAgICAgICAgICByZWdleDogIjpbYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogImNvbnN0YW50IiwNCiAgICAgICAgICAgIHJlZ2V4OiAiW2EtejAtOS1fXSsiDQogICAgICAgIH1dLA0KDQogICAgICAgICJjb21tZW50IiA6IGNvbW1lbnQsDQoNCiAgICAgICAgInJ1bGVzZXQiIDogcnVsZXNldCwNCiAgICAgICAgInJ1bGVzZXRfY29tbWVudCIgOiBydWxlc2V0X2NvbW1lbnQsDQoNCiAgICAgICAgIm1lZGlhX3J1bGVzZXQiIDogbWVkaWFfcnVsZXNldCwNCiAgICAgICAgIm1lZGlhX2NvbW1lbnQiIDogbWVkaWFfY29tbWVudA0KICAgIH07DQp9Ow0KDQpvb3AuaW5oZXJpdHMoQ3NzSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuQ3NzSGlnaGxpZ2h0UnVsZXMgPSBDc3NIaWdobGlnaHRSdWxlczsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsNCg0KdmFyIFdvcmtlckNsaWVudCA9IGZ1bmN0aW9uKHRvcExldmVsTmFtZXNwYWNlcywgcGFja2FnZWRKcywgbW9kLCBjbGFzc25hbWUpIHsNCg0KICAgIHRoaXMuY2hhbmdlTGlzdGVuZXIgPSB0aGlzLmNoYW5nZUxpc3RlbmVyLmJpbmQodGhpcyk7DQoNCiAgICBpZiAobW9kdWxlLnBhY2thZ2VkKSB7DQogICAgICAgIHZhciBiYXNlID0gdGhpcy4kZ3Vlc3NCYXNlUGF0aCgpOw0KICAgICAgICB0aGlzLiR3b3JrZXIgPSBuZXcgV29ya2VyKGJhc2UgKyBwYWNrYWdlZEpzKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIHZhciB3b3JrZXJVcmwgPSB0aGlzLiRub3JtYWxpemVQYXRoKHJlcXVpcmUubmFtZVRvVXJsKCJhY2Uvd29ya2VyL3dvcmtlciIsIG51bGwsICJfIikpOw0KICAgICAgICB0aGlzLiR3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclVybCk7DQoNCiAgICAgICAgdmFyIHRsbnMgPSB7fTsNCiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRvcExldmVsTmFtZXNwYWNlcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIG5zID0gdG9wTGV2ZWxOYW1lc3BhY2VzW2ldOw0KICAgICAgICAgICAgdmFyIHBhdGggPSB0aGlzLiRub3JtYWxpemVQYXRoKHJlcXVpcmUubmFtZVRvVXJsKG5zLCBudWxsLCAiXyIpLnJlcGxhY2UoLy5qcyQvLCAiIikpOw0KDQogICAgICAgICAgICB0bG5zW25zXSA9IHBhdGg7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoew0KICAgICAgICBpbml0IDogdHJ1ZSwNCiAgICAgICAgdGxuczogdGxucywNCiAgICAgICAgbW9kdWxlOiBtb2QsDQogICAgICAgIGNsYXNzbmFtZTogY2xhc3NuYW1lDQogICAgfSk7DQoNCiAgICB0aGlzLmNhbGxiYWNrSWQgPSAxOw0KICAgIHRoaXMuY2FsbGJhY2tzID0ge307DQoNCiAgICB2YXIgX3NlbGYgPSB0aGlzOw0KICAgIHRoaXMuJHdvcmtlci5vbmVycm9yID0gZnVuY3Rpb24oZSkgew0KICAgICAgICB3aW5kb3cuY29uc29sZSAmJiBjb25zb2xlLmxvZyAmJiBjb25zb2xlLmxvZyhlKTsNCiAgICAgICAgdGhyb3cgZTsNCiAgICB9Ow0KICAgIHRoaXMuJHdvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIHZhciBtc2cgPSBlLmRhdGE7DQogICAgICAgIHN3aXRjaChtc2cudHlwZSkgew0KICAgICAgICAgICAgY2FzZSAibG9nIjoNCiAgICAgICAgICAgICAgICB3aW5kb3cuY29uc29sZSAmJiBjb25zb2xlLmxvZyAmJiBjb25zb2xlLmxvZyhtc2cuZGF0YSk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGNhc2UgImV2ZW50IjoNCiAgICAgICAgICAgICAgICBfc2VsZi5fZW1pdChtc2cubmFtZSwge2RhdGE6IG1zZy5kYXRhfSk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGNhc2UgImNhbGwiOg0KICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IF9zZWxmLmNhbGxiYWNrc1ttc2cuaWRdOw0KICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgew0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhtc2cuZGF0YSk7DQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBfc2VsZi5jYWxsYmFja3NbbXNnLmlkXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9Ow0KfTsNCg0KKGZ1bmN0aW9uKCl7DQoNCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7DQoNCiAgICB0aGlzLiRub3JtYWxpemVQYXRoID0gZnVuY3Rpb24ocGF0aCkgew0KICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eW2Etel0rOlwvXC9bXlwvXStcLy8sICIiKTsgLy8gUmVtb3ZlIGRvbWFpbiBuYW1lIGFuZCByZWJ1aWxkIGl0DQogICAgICAgIHBhdGggPSBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKyBsb2NhdGlvbi5ob3N0DQogICAgICAgICAgICAvLyBwYXRocyBzdGFydGluZyB3aXRoIGEgc2xhc2ggYXJlIHJlbGF0aXZlIHRvIHRoZSByb290IChob3N0KQ0KICAgICAgICAgICAgKyAocGF0aC5jaGFyQXQoMCkgPT0gIi8iID8gIiIgOiBsb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKC9cL1teXC9dKiQvLCAiIikpDQogICAgICAgICAgICArICIvIiArIHBhdGgucmVwbGFjZSgvXltcL10rLywgIiIpOw0KICAgICAgICByZXR1cm4gcGF0aDsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ3Vlc3NCYXNlUGF0aCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAocmVxdWlyZS5hY2VCYXNlVXJsKQ0KICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUuYWNlQmFzZVVybDsNCg0KICAgICAgICB2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKTsNCiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNjcmlwdHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBzY3JpcHRzW2ldOw0KDQogICAgICAgICAgICB2YXIgYmFzZSA9IHNjcmlwdC5nZXRBdHRyaWJ1dGUoImRhdGEtYWNlLWJhc2UiKTsNCiAgICAgICAgICAgIGlmIChiYXNlKQ0KICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLnJlcGxhY2UoL1wvKiQvLCAiLyIpOw0KDQogICAgICAgICAgICB2YXIgc3JjID0gc2NyaXB0LnNyYyB8fCBzY3JpcHQuZ2V0QXR0cmlidXRlKCJzcmMiKTsNCiAgICAgICAgICAgIGlmICghc3JjKSB7DQogICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgbSA9IHNyYy5tYXRjaCgvXig/OiguKlwvKWFjZVwuanN8KC4qXC8pYWNlKC11bmNvbXByZXNzZWQpPygtbm9jb25mbGljdCk/XC5qcykoPzpcP3wkKS8pOw0KICAgICAgICAgICAgaWYgKG0pDQogICAgICAgICAgICAgICAgcmV0dXJuIG1bMV0gfHwgbVsyXTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KICAgIHRoaXMudGVybWluYXRlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuX2VtaXQoInRlcm1pbmF0ZSIsIHt9KTsNCiAgICAgICAgdGhpcy4kd29ya2VyLnRlcm1pbmF0ZSgpOw0KICAgICAgICB0aGlzLiR3b3JrZXIgPSBudWxsOw0KICAgICAgICB0aGlzLiRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7DQogICAgICAgIHRoaXMuJGRvYyA9IG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuc2VuZCA9IGZ1bmN0aW9uKGNtZCwgYXJncykgew0KICAgICAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IGNtZCwgYXJnczogYXJnc30pOw0KICAgIH07DQoNCiAgICB0aGlzLmNhbGwgPSBmdW5jdGlvbihjbWQsIGFyZ3MsIGNhbGxiYWNrKSB7DQogICAgICAgIGlmIChjYWxsYmFjaykgew0KICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5jYWxsYmFja0lkKys7DQogICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0gPSBjYWxsYmFjazsNCiAgICAgICAgICAgIGFyZ3MucHVzaChpZCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5zZW5kKGNtZCwgYXJncyk7DQogICAgfTsNCg0KICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uKGV2ZW50LCBkYXRhKSB7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICAvLyBmaXJlZm94IHJlZnVzZXMgdG8gY2xvbmUgb2JqZWN0cyB3aGljaCBoYXZlIGZ1bmN0aW9uIHByb3BlcnRpZXMNCiAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgZXZlbnQNCiAgICAgICAgICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7ZXZlbnQ6IGV2ZW50LCBkYXRhOiB7ZGF0YTogZGF0YS5kYXRhfX0pOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoKGV4KSB7fQ0KICAgIH07DQoNCiAgICB0aGlzLmF0dGFjaFRvRG9jdW1lbnQgPSBmdW5jdGlvbihkb2MpIHsNCiAgICAgICAgaWYodGhpcy4kZG9jKQ0KICAgICAgICAgICAgdGhpcy50ZXJtaW5hdGUoKTsNCg0KICAgICAgICB0aGlzLiRkb2MgPSBkb2M7DQogICAgICAgIHRoaXMuY2FsbCgic2V0VmFsdWUiLCBbZG9jLmdldFZhbHVlKCldKTsNCiAgICAgICAgZG9jLm9uKCJjaGFuZ2UiLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgZS5yYW5nZSA9IHsNCiAgICAgICAgICAgIHN0YXJ0OiBlLmRhdGEucmFuZ2Uuc3RhcnQsDQogICAgICAgICAgICBlbmQ6IGUuZGF0YS5yYW5nZS5lbmQNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5lbWl0KCJjaGFuZ2UiLCBlKTsNCiAgICB9Ow0KDQp9KS5jYWxsKFdvcmtlckNsaWVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLldvcmtlckNsaWVudCA9IFdvcmtlckNsaWVudDsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOw0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9Ow0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoIXN0YXJ0KQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7DQogICAgICAgICAgICBlbmQuY29sdW1uLS07DQoNCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBHYXN0w7NuIEtsZWltYW4gPGdhc3Rvbi5rbGVpbWFuIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jX2NwcCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2NfY3BwX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgY19jcHBIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vY19jcHBfaGlnaGxpZ2h0X3J1bGVzIikuY19jcHBIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgY19jcHBIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOw0KICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsNCiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgQ3N0eWxlQmVoYXZpb3VyKCk7DQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgQ1N0eWxlRm9sZE1vZGUoKTsNCn07DQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOw0KICAgICAgICB2YXIgcmUgPSAvXihccyopXC9cLy87DQoNCiAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG91dGRlbnQpIHsNCiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi8vIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KICAgICAgICB2YXIgZW5kU3RhdGUgPSB0b2tlbml6ZWRMaW5lLnN0YXRlOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKltce1woXFtdXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSAiZG9jLXN0YXJ0Iikgew0KICAgICAgICAgICAgaWYgKGVuZFN0YXRlID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eXHMqKFwvPylcKi8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7DQogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAiICI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiKiAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBHYXN0w7NuIEtsZWltYW4gPGdhc3Rvbi5rbGVpbWFuIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQmFzZWQgb24gQmVzcGluJ3MgQy9DKysgU3ludGF4IFBsdWdpbiBieSBNYXJjIE1jSW50eXJlLg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvY19jcHBfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBjX2NwcEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYW5kfGRvdWJsZXxub3RfZXF8dGhyb3d8YW5kX2VxfGR5bmFtaWNfY2FzdHxvcGVyYXRvcnx0cnVlfCIgKw0KICAgICAgICAiYXNtfGVsc2V8b3J8dHJ5fGF1dG98ZW51bXxvcl9lcXx0eXBlZGVmfGJpdGFuZHxleHBsaWNpdHxwcml2YXRlfCIgKw0KICAgICAgICAidHlwZWlkfGJpdG9yfGV4dGVybnxwcm90ZWN0ZWR8dHlwZW5hbWV8Ym9vbHxmYWxzZXxwdWJsaWN8dW5pb258IiArDQogICAgICAgICJicmVha3xmbG9hdHxyZWdpc3Rlcnx1bnNpZ25lZHxjYXNlfGZyb3xyZWludGVycHJldC1jYXN0fHVzaW5nfGNhdGNofCIgKw0KICAgICAgICAiZnJpZW5kfHJldHVybnx2aXJ0dWFsfGNoYXJ8Z290b3xzaG9ydHx2b2lkfGNsYXNzfGlmfHNpZ25lZHx2b2xhdGlsZXwiICsNCiAgICAgICAgImNvbXBsfGlubGluZXxzaXplb2Z8d2NoYXJfdHxjb25zdHxpbnR8c3RhdGljfHdoaWxlfGNvbnN0LWNhc3R8bG9uZ3wiICsNCiAgICAgICAgInN0YXRpY19jYXN0fHhvcnxjb250aW51ZXxtdXRhYmxlfHN0cnVjdHx4b3JfZXF8ZGVmYXVsdHxuYW1lc3BhY2V8IiArDQogICAgICAgICJzd2l0Y2h8ZGVsZXRlfG5ld3x0ZW1wbGF0ZXxkb3xub3R8dGhpc3xmb3IiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsZGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIk5VTEwiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4NCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkDQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdLipcXFxcJCcsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJxcXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddLipcXFxcJCIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJxc3RyaW5nIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgNCiAgICAgICAgICAgICAgICByZWdleCA6ICIwW3hYXVswLTlhLWZBLUZdK1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQiLCAvLyA8Q09OU1RBTlQ+DQogICAgICAgICAgICAgIHJlZ2V4IDogIjxbYS16QS1aMC05Ll0rPiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsIC8vIHByZS1jb21waWxlciBkaXJlY3RpdnMNCiAgICAgICAgICAgICAgcmVnZXggOiAiKD86I2luY2x1ZGV8I3ByYWdtYXwjbGluZXwjZGVmaW5lfCN1bmRlZnwjaWZkZWZ8I2Vsc2V8I2VsaWZ8I2VuZGlmfCNpZm5kZWYpIg0KICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAidGhpcyIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbGRpbkNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09fD18IT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgdG9rZW4gOiAicHVuY3R1YXRpb24ub3BlcmF0b3IiLA0KICAgICAgICAgICAgICByZWdleCA6ICJcXD98XFw6fFxcLHxcXDt8XFwuIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxcXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcoPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/IicsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFzdHJpbmciIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZW1iZWRSdWxlcyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsICJkb2MtIiwNCiAgICAgICAgWyBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0RW5kUnVsZSgic3RhcnQiKSBdKTsNCn07DQoNCm9vcC5pbmhlcml0cyhjX2NwcEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLmNfY3BwSGlnaGxpZ2h0UnVsZXMgPSBjX2NwcEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYy50YWciLA0KICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiVE9ETyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4iDQogICAgICAgIH1dDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0U3RhcnRSdWxlID0gZnVuY3Rpb24oc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKig/PVxcKikiLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRFbmRSdWxlID0gZnVuY3Rpb24gKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwqXFwvIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KDQp9KS5jYWxsKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcy5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91ciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7DQoNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAneycgKyBzZWxlY3RlZCArICd9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnfScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBzZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1uICsgMX0pOw0KICAgICAgICAgICAgICAgIGlmICghb3BlbkJyYWNlUG9zKQ0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQoNCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5nZXROZXh0TGluZUluZGVudChzdGF0ZSwgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSwgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5lbmQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoJyArIHNlbGVjdGVkICsgJyknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICcpJykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICcoJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICciJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJyInICsgc2VsZWN0ZWQgKyAnIicsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICAgICAgdmFyIGxlZnRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbi0xLCBjdXJzb3IuY29sdW1uKTsNCg0KICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGVzY2FwZWQuDQogICAgICAgICAgICAgICAgaWYgKGxlZnRDaGFyID09ICdcXCcpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMoc2VsZWN0aW9uLnN0YXJ0LnJvdywgc2VsZWN0aW9uLnN0YXJ0LnJvdylbMF0udG9rZW5zOw0KICAgICAgICAgICAgICAgIHZhciBjb2wgPSAwLCB0b2tlbjsNCiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4NCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdG9rZW5zLmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOw0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gLTE7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSB0b2tlbi52YWx1ZS5pbmRleE9mKCciJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0Lg0KICAgICAgICAgICAgICAgIGlmICghdG9rZW4gfHwgKHF1b3RlcG9zIDwgMCAmJiB0b2tlbi50eXBlICE9PSAiY29tbWVudCIgJiYgKHRva2VuLnR5cGUgIT09ICJzdHJpbmciIHx8ICgoc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbiAhPT0gdG9rZW4udmFsdWUubGVuZ3RoK2NvbC0xKSAmJiB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZignIicpID09PSB0b2tlbi52YWx1ZS5sZW5ndGgtMSkpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGlucHV0IGFuZCBtb3ZlIHJpZ2h0IG9uZSBpZiB3ZSdyZSB0eXBpbmcgb3ZlciB0aGUgY2xvc2luZyBxdW90ZS4NCiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICciJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KfQ0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsNCg0KZXhwb3J0cy5Dc3R5bGVCZWhhdmlvdXIgPSBDc3R5bGVCZWhhdmlvdXI7DQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOw0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9Ow0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoIXN0YXJ0KQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7DQogICAgICAgICAgICBlbmQuY29sdW1uLS07DQoNCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[ZGVmaW5lKCdhY2UvbW9kZS9ncm9vdnknLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2phdmFzY3JpcHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9ncm9vdnlfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIEphdmFTY3JpcHRNb2RlID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgR3Jvb3Z5SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2dyb292eV9oaWdobGlnaHRfcnVsZXMiKS5Hcm9vdnlIaWdobGlnaHRSdWxlczsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICBKYXZhU2NyaXB0TW9kZS5jYWxsKHRoaXMpOw0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IEdyb292eUhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIEphdmFTY3JpcHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jcmVhdGVXb3JrZXIgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9qYXZhc2NyaXB0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnLCAnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KdmFyIFdvcmtlckNsaWVudCA9IHJlcXVpcmUoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50Ow0KdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOw0KICAgICAgICB2YXIgcmUgPSAvXihccyopXC9cLy87DQoNCiAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG91dGRlbnQpIHsNCiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi8vIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KICAgICAgICB2YXIgZW5kU3RhdGUgPSB0b2tlbml6ZWRMaW5lLnN0YXRlOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09ICJkb2Mtc3RhcnQiKSB7DQogICAgICAgICAgICBpZiAoZW5kU3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eXHMqKFwvPylcKi8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7DQogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAiICI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiKiAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlckNsaWVudChbImFjZSJdLCAid29ya2VyLWphdmFzY3JpcHQuanMiLCAiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCAiSmF2YVNjcmlwdFdvcmtlciIpOw0KICAgICAgICB3b3JrZXIuYXR0YWNoVG9Eb2N1bWVudChzZXNzaW9uLmdldERvY3VtZW50KCkpOw0KICAgICAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigianNsaW50IiwgZnVuY3Rpb24ocmVzdWx0cykgew0KICAgICAgICAgICAgdmFyIGVycm9ycyA9IFtdOw0KICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHJlc3VsdHMuZGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IHJlc3VsdHMuZGF0YVtpXTsNCiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpDQogICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZXJyb3IubGluZS0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBlcnJvci5jaGFyYWN0ZXItMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yLnJlYXNvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbnQ6IGVycm9yDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhlcnJvcnMpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigibmFyY2lzc3VzIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhbZS5kYXRhXSk7DQogICAgICAgIH0pOw0KICAgICAgICANCiAgICAgICAgd29ya2VyLm9uKCJ0ZXJtaW5hdGUiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHNlc3Npb24uY2xlYXJBbm5vdGF0aW9ucygpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHJldHVybiB3b3JrZXI7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvdW5pY29kZScsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgdW5pY29kZSA9IHJlcXVpcmUoIi4uL3VuaWNvZGUiKTsNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICAvLyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzDQogICAgdmFyIGdsb2JhbHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAvLyBDb25zdHJ1Y3RvcnMNCiAgICAgICAgKCJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fCIgKw0KICAgICAgLy8gRTRYDQogICAgICAgICAiTmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fCIgKw0KICAgICAgICAgIkFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXwiICsNCiAgICAgICAgICJVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fCIgKw0KICAgICAgLy8gRXJyb3JzDQogICAgICAgICJFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258IiArDQogICAgICAgICJTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8IiArDQogICAgICAvLyAgTm9uLWNvbnN0cnVjdG9yIGZ1bmN0aW9ucw0KICAgICAgICAiZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8IiArDQogICAgICAgICJpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fCIgKw0KICAgICAgLy8gT3RoZXINCiAgICAgICAgIkpTT058TWF0aHwiICsNCiAgICAgIC8vIFBzZXVkbw0KICAgICAgICAidGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCINCiAgICAgICkuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufCIgKw0KICAgICAgICAiaWZ8aW58aW5zdGFuY2VvZnxuZXd8cmV0dXJufHN3aXRjaHx0aHJvd3x0cnl8dHlwZW9mfGxldHx2YXJ8d2hpbGV8d2l0aHwiICsNCiAgICAgICAgImNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Iikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyBrZXl3b3JkcyB3aGljaCBjYW4gYmUgZm9sbG93ZWQgYnkgcmVndWxhciBleHByZXNzaW9ucw0KICAgIHZhciBrd0JlZm9yZVJlID0gImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGQiOw0KDQogICAgdmFyIGRlcHJlY2F0ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZGVmaW5pdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoKCJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIikuc3BsaXQoInwiKSk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBmdXR1cmVSZXNlcnZlZCA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXwiICsNCiAgICAgICAgInB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMNCiAgICB2YXIgaWRlbnRpZmllclJlID0gIlsiICsgdW5pY29kZS5wYWNrYWdlcy5MICsgIlxcJF9dWyIgDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5MDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5NbiArIHVuaWNvZGUucGFja2FnZXMuTWMNCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLk5kDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5QYyArICJcXCRfXSpcXGIiOw0KICAgICAgICANCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXS4qXFxcXCQnLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXS4qXFxcXCQiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiBbImtleXdvcmQuZGVmaW5pdGlvbiIsICJ0ZXh0IiwgImVudGl0eS5uYW1lLmZ1bmN0aW9uIl0sDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKGZ1bmN0aW9uKShcXHMrKSgiICsgaWRlbnRpZmllclJlICsgIikiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86dHJ1ZXxmYWxzZSlcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86IiArIGt3QmVmb3JlUmUgKyAiKVxcYiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlcHJlY2F0ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmRlcHJlY2F0ZWQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWZpbml0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQuZGVmaW5pdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1dHVyZVJlc2VydmVkLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gImRlYnVnZ2VyIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogaWRlbnRpZmllclJlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXD98XFw6fFxcLHxcXDt8XFwuIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iLA0KICAgICAgICAgICAgICAgIG5leHQgIDogInJlZ2V4X2FsbG93ZWQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLz0/IiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJeIyEuKiQiIA0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIG9ubHkgYWxsb3dlZCBhZnRlciBjZXJ0YWluIHRva2Vucy4gVGhpcw0KICAgICAgICAvLyBtYWtlcyBzdXJlIHdlIGRvbid0IG1peCB1cCByZWdleHBzIHdpdGggdGhlIGRpdmlzb24gb3BlcmF0b3INCiAgICAgICAgInJlZ2V4X2FsbG93ZWQiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudF9yZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSByZXR1cm4gdG8gdGhlIHN0YXJ0IG1vZGUgd2l0aG91dCBtYXRjaGluZw0KICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nDQogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJyZWdleCI6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiDQogICAgICAgICAgICB9LCB7DQoJCQkJLy8gZmxhZw0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiL1xcdyoiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUgDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXC9cXFtdKyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFxbIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiANCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyI6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiW15cXFxcXFxdXSsiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiIA0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudF9yZWdleF9hbGxvd2VkIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXFzdHJpbmciIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCAiZG9jLSIsDQogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IEphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MudGFnIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIkBbXFx3XFxkX10rIiAvLyBUT0RPOiBmaXggZW1haWwgYWRkcmVzc2VzDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlRPRE8iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlteQFxcKl0rIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICIuIg0KICAgICAgICB9XQ0KICAgIH07DQp9Ow0KDQpvb3AuaW5oZXJpdHMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmdldFN0YXJ0UnVsZSA9IGZ1bmN0aW9uKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGRvYyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXC9cXCooPz1cXCopIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0RW5kUnVsZSA9IGZ1bmN0aW9uIChzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcKlxcLyIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCg0KfSkuY2FsbChEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7DQogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7DQoNCiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsNCiAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IGRvYy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59KTsNCg0KICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQoNCnZhciBXb3JrZXJDbGllbnQgPSBmdW5jdGlvbih0b3BMZXZlbE5hbWVzcGFjZXMsIHBhY2thZ2VkSnMsIG1vZCwgY2xhc3NuYW1lKSB7DQoNCiAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gdGhpcy5jaGFuZ2VMaXN0ZW5lci5iaW5kKHRoaXMpOw0KDQogICAgaWYgKG1vZHVsZS5wYWNrYWdlZCkgew0KICAgICAgICB2YXIgYmFzZSA9IHRoaXMuJGd1ZXNzQmFzZVBhdGgoKTsNCiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcihiYXNlICsgcGFja2FnZWRKcyk7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICB2YXIgd29ya2VyVXJsID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybCgiYWNlL3dvcmtlci93b3JrZXIiLCBudWxsLCAiXyIpKTsNCiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJVcmwpOw0KDQogICAgICAgIHZhciB0bG5zID0ge307DQogICAgICAgIGZvciAodmFyIGk9MDsgaTx0b3BMZXZlbE5hbWVzcGFjZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBucyA9IHRvcExldmVsTmFtZXNwYWNlc1tpXTsNCiAgICAgICAgICAgIHZhciBwYXRoID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybChucywgbnVsbCwgIl8iKS5yZXBsYWNlKC8uanMkLywgIiIpKTsNCg0KICAgICAgICAgICAgdGxuc1tuc10gPSBwYXRoOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHsNCiAgICAgICAgaW5pdCA6IHRydWUsDQogICAgICAgIHRsbnM6IHRsbnMsDQogICAgICAgIG1vZHVsZTogbW9kLA0KICAgICAgICBjbGFzc25hbWU6IGNsYXNzbmFtZQ0KICAgIH0pOw0KDQogICAgdGhpcy5jYWxsYmFja0lkID0gMTsNCiAgICB0aGlzLmNhbGxiYWNrcyA9IHt9Ow0KDQogICAgdmFyIF9zZWxmID0gdGhpczsNCiAgICB0aGlzLiR3b3JrZXIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2coZSk7DQogICAgICAgIHRocm93IGU7DQogICAgfTsNCiAgICB0aGlzLiR3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24oZSkgew0KICAgICAgICB2YXIgbXNnID0gZS5kYXRhOw0KICAgICAgICBzd2l0Y2gobXNnLnR5cGUpIHsNCiAgICAgICAgICAgIGNhc2UgImxvZyI6DQogICAgICAgICAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2cobXNnLmRhdGEpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlICJldmVudCI6DQogICAgICAgICAgICAgICAgX3NlbGYuX2VtaXQobXNnLm5hbWUsIHtkYXRhOiBtc2cuZGF0YX0pOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlICJjYWxsIjoNCiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfc2VsZi5jYWxsYmFja3NbbXNnLmlkXTsNCiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsNCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobXNnLmRhdGEpOw0KICAgICAgICAgICAgICAgICAgICBkZWxldGUgX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfTsNCn07DQoNCihmdW5jdGlvbigpew0KDQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KDQogICAgdGhpcy4kbm9ybWFsaXplUGF0aCA9IGZ1bmN0aW9uKHBhdGgpIHsNCiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlthLXpdKzpcL1wvW15cL10rXC8vLCAiIik7IC8vIFJlbW92ZSBkb21haW4gbmFtZSBhbmQgcmVidWlsZCBpdA0KICAgICAgICBwYXRoID0gbG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsgbG9jYXRpb24uaG9zdA0KICAgICAgICAgICAgLy8gcGF0aHMgc3RhcnRpbmcgd2l0aCBhIHNsYXNoIGFyZSByZWxhdGl2ZSB0byB0aGUgcm9vdCAoaG9zdCkNCiAgICAgICAgICAgICsgKHBhdGguY2hhckF0KDApID09ICIvIiA/ICIiIDogbG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywgIiIpKQ0KICAgICAgICAgICAgKyAiLyIgKyBwYXRoLnJlcGxhY2UoL15bXC9dKy8sICIiKTsNCiAgICAgICAgcmV0dXJuIHBhdGg7DQogICAgfTsNCg0KICAgIHRoaXMuJGd1ZXNzQmFzZVBhdGggPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHJlcXVpcmUuYWNlQmFzZVVybCkNCiAgICAgICAgICAgIHJldHVybiByZXF1aXJlLmFjZUJhc2VVcmw7DQoNCiAgICAgICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7DQogICAgICAgIGZvciAodmFyIGk9MDsgaTxzY3JpcHRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgc2NyaXB0ID0gc2NyaXB0c1tpXTsNCg0KICAgICAgICAgICAgdmFyIGJhc2UgPSBzY3JpcHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjZS1iYXNlIik7DQogICAgICAgICAgICBpZiAoYmFzZSkNCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5yZXBsYWNlKC9cLyokLywgIi8iKTsNCg0KICAgICAgICAgICAgdmFyIHNyYyA9IHNjcmlwdC5zcmMgfHwgc2NyaXB0LmdldEF0dHJpYnV0ZSgic3JjIik7DQogICAgICAgICAgICBpZiAoIXNyYykgew0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG0gPSBzcmMubWF0Y2goL14oPzooLipcLylhY2VcLmpzfCguKlwvKWFjZSgtdW5jb21wcmVzc2VkKT8oLW5vY29uZmxpY3QpP1wuanMpKD86XD98JCkvKTsNCiAgICAgICAgICAgIGlmIChtKQ0KICAgICAgICAgICAgICAgIHJldHVybiBtWzFdIHx8IG1bMl07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCiAgICB0aGlzLnRlcm1pbmF0ZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLl9lbWl0KCJ0ZXJtaW5hdGUiLCB7fSk7DQogICAgICAgIHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKTsNCiAgICAgICAgdGhpcy4kd29ya2VyID0gbnVsbDsNCiAgICAgICAgdGhpcy4kZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOw0KICAgICAgICB0aGlzLiRkb2MgPSBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbmQgPSBmdW5jdGlvbihjbWQsIGFyZ3MpIHsNCiAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOiBjbWQsIGFyZ3M6IGFyZ3N9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5jYWxsID0gZnVuY3Rpb24oY21kLCBhcmdzLCBjYWxsYmFjaykgew0KICAgICAgICBpZiAoY2FsbGJhY2spIHsNCiAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuY2FsbGJhY2tJZCsrOw0KICAgICAgICAgICAgdGhpcy5jYWxsYmFja3NbaWRdID0gY2FsbGJhY2s7DQogICAgICAgICAgICBhcmdzLnB1c2goaWQpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuc2VuZChjbWQsIGFyZ3MpOw0KICAgIH07DQoNCiAgICB0aGlzLmVtaXQgPSBmdW5jdGlvbihldmVudCwgZGF0YSkgew0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgLy8gZmlyZWZveCByZWZ1c2VzIHRvIGNsb25lIG9iamVjdHMgd2hpY2ggaGF2ZSBmdW5jdGlvbiBwcm9wZXJ0aWVzDQogICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIGV2ZW50DQogICAgICAgICAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2V2ZW50OiBldmVudCwgZGF0YToge2RhdGE6IGRhdGEuZGF0YX19KTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChleCkge30NCiAgICB9Ow0KDQogICAgdGhpcy5hdHRhY2hUb0RvY3VtZW50ID0gZnVuY3Rpb24oZG9jKSB7DQogICAgICAgIGlmKHRoaXMuJGRvYykNCiAgICAgICAgICAgIHRoaXMudGVybWluYXRlKCk7DQoNCiAgICAgICAgdGhpcy4kZG9jID0gZG9jOw0KICAgICAgICB0aGlzLmNhbGwoInNldFZhbHVlIiwgW2RvYy5nZXRWYWx1ZSgpXSk7DQogICAgICAgIGRvYy5vbigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7DQogICAgfTsNCg0KICAgIHRoaXMuY2hhbmdlTGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIGUucmFuZ2UgPSB7DQogICAgICAgICAgICBzdGFydDogZS5kYXRhLnJhbmdlLnN0YXJ0LA0KICAgICAgICAgICAgZW5kOiBlLmRhdGEucmFuZ2UuZW5kDQogICAgICAgIH07DQogICAgICAgIHRoaXMuZW1pdCgiY2hhbmdlIiwgZSk7DQogICAgfTsNCg0KfSkuY2FsbChXb3JrZXJDbGllbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Xb3JrZXJDbGllbnQgPSBXb3JrZXJDbGllbnQ7DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmVoYXZpb3VyID0gcmVxdWlyZSgnLi4vYmVoYXZpb3VyJykuQmVoYXZpb3VyOw0KDQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgew0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3snICsgc2VsZWN0ZWQgKyAnfScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7fScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJ30nKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJ30nLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiArIDF9KTsNCiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykNCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KDQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCcgKyBzZWxlY3RlZCArICcpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnKScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnKScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7DQoNCiAgICAgICAgICAgICAgICAvLyBXZSdyZSBlc2NhcGVkLg0KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIEZpbmQgd2hhdCB0b2tlbiB3ZSdyZSBpbnNpZGUuDQogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHNlbGVjdGlvbi5zdGFydC5yb3csIHNlbGVjdGlvbi5zdGFydC5yb3cpWzBdLnRva2VuczsNCiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47DQogICAgICAgICAgICAgICAgdmFyIHF1b3RlcG9zID0gLTE7IC8vIFRyYWNrIHdoZXRoZXIgd2UncmUgaW5zaWRlIGFuIG9wZW4gcXVvdGUuDQoNCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1t4XTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1b3RlcG9zIDwgMCkgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gdG9rZW4udmFsdWUuaW5kZXhPZignIicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgodG9rZW4udmFsdWUubGVuZ3RoICsgY29sKSA+IHNlbGVjdGlvbi5zdGFydC5jb2x1bW4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbCArPSB0b2tlbnNbeF0udmFsdWUubGVuZ3RoOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIFRyeSBhbmQgYmUgc21hcnQgYWJvdXQgd2hlbiB3ZSBhdXRvIGluc2VydC4NCiAgICAgICAgICAgICAgICBpZiAoIXRva2VuIHx8IChxdW90ZXBvcyA8IDAgJiYgdG9rZW4udHlwZSAhPT0gImNvbW1lbnQiICYmICh0b2tlbi50eXBlICE9PSAic3RyaW5nIiB8fCAoKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gIT09IHRva2VuLnZhbHVlLmxlbmd0aCtjb2wtMSkgJiYgdG9rZW4udmFsdWUubGFzdEluZGV4T2YoJyInKSA9PT0gdG9rZW4udmFsdWUubGVuZ3RoLTEpKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICciIicsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgPT09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnB1dCBhbmQgbW92ZSByaWdodCBvbmUgaWYgd2UncmUgdHlwaW5nIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuDQogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCn0NCm9vcC5pbmhlcml0cyhDc3R5bGVCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOw0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gLyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS87DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOw0KDQogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpICsgbWF0Y2hbMF0ubGVuZ3RoKTsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChmb2xkU3R5bGUgIT09ICJtYXJrYmVnaW5lbmQiKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7DQogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBpfTsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKCFzdGFydCkNCiAgICAgICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgICAgIHN0YXJ0LmNvbHVtbisrOw0KICAgICAgICAgICAgZW5kLmNvbHVtbi0tOw0KDQogICAgICAgICAgICByZXR1cm4gIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSBudWxsOw0KDQogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZw0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJzdGFydCI7DQogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJlbmQiOw0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLmluZGVudGF0aW9uQmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgcmUgPSAvXlxzKi87DQogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOw0KICAgICAgICB2YXIgc3RhcnRMZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkNCiAgICAgICAgDQogICAgICAgIHdoaWxlICgrK3JvdyA8IG1heFJvdykgew0KICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpDQogICAgICAgICAgICAgICAgY29udGludWU7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBlbmRSb3cgPSByb3c7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7DQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsNCiAgICAgICAgdmFyIGVuZCA9IHNlc3Npb24uJGZpbmRDbG9zaW5nQnJhY2tldChicmFja2V0LCBzdGFydCk7DQogICAgICAgIGlmICghZW5kKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107DQogICAgICAgIGlmIChmdyA9PSBudWxsKQ0KICAgICAgICAgICAgZncgPSB0aGlzLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZW5kLnJvdyk7DQoNCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIGVuZC5yb3cgLS07DQogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOw0KZGVmaW5lKCdhY2UvbW9kZS9ncm9vdnlfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBHcm9vdnlIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICgiYXNzZXJ0fHdpdGh8YWJzdHJhY3R8Y29udGludWV8Zm9yfG5ld3xzd2l0Y2h8IiArDQogICAgImFzc2VydHxkZWZhdWx0fGdvdG98cGFja2FnZXxzeW5jaHJvbml6ZWR8IiArDQogICAgImJvb2xlYW58ZG98aWZ8cHJpdmF0ZXx0aGlzfCIgKw0KICAgICJicmVha3xkb3VibGV8aW1wbGVtZW50c3xwcm90ZWN0ZWR8dGhyb3d8IiArDQogICAgImJ5dGV8ZWxzZXxpbXBvcnR8cHVibGljfHRocm93c3wiICsNCiAgICAiY2FzZXxlbnVtfGluc3RhbmNlb2Z8cmV0dXJufHRyYW5zaWVudHwiICsNCiAgICAiY2F0Y2h8ZXh0ZW5kc3xpbnR8c2hvcnR8dHJ5fCIgKw0KICAgICJjaGFyfGZpbmFsfGludGVyZmFjZXxzdGF0aWN8dm9pZHwiICsNCiAgICAiY2xhc3N8ZmluYWxseXxsb25nfHN0cmljdGZwfHZvbGF0aWxlfCIgKw0KICAgICJkZWZ8ZmxvYXR8bmF0aXZlfHN1cGVyfHdoaWxlIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBsYW5nQ2xhc3NlcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJBYnN0cmFjdE1ldGhvZEVycm9yfEFzc2VydGlvbkVycm9yfENsYXNzQ2lyY3VsYXJpdHlFcnJvcnwiKw0KICAgICAgICAiQ2xhc3NGb3JtYXRFcnJvcnxEZXByZWNhdGVkfEVudW1Db25zdGFudE5vdFByZXNlbnRFeGNlcHRpb258IisNCiAgICAgICAgIkV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcnxJbGxlZ2FsQWNjZXNzRXJyb3J8IisNCiAgICAgICAgIklsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbnxJbnN0YW50aWF0aW9uRXJyb3J8SW50ZXJuYWxFcnJvcnwiKw0KICAgICAgICAiTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb258Tm9TdWNoRmllbGRFcnJvcnxPdmVycmlkZXxQcm9jZXNzfCIrDQogICAgICAgICJQcm9jZXNzQnVpbGRlcnxTZWN1cml0eU1hbmFnZXJ8U3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnwiKw0KICAgICAgICAiU3VwcHJlc3NXYXJuaW5nc3xUeXBlTm90UHJlc2VudEV4Y2VwdGlvbnxVbmtub3duRXJyb3J8IisNCiAgICAgICAgIlVuc2F0aXNmaWVkTGlua0Vycm9yfFVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3J8VmVyaWZ5RXJyb3J8IisNCiAgICAgICAgIkluc3RhbnRpYXRpb25FeGNlcHRpb258SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnwiKw0KICAgICAgICAiQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9ufCIrDQogICAgICAgICJOb1N1Y2hGaWVsZEV4Y2VwdGlvbnxJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb258TnVtYmVyRm9ybWF0RXhjZXB0aW9ufCIrDQogICAgICAgICJTZWN1cml0eUV4Y2VwdGlvbnxWb2lkfEluaGVyaXRhYmxlVGhyZWFkTG9jYWx8SWxsZWdhbFN0YXRlRXhjZXB0aW9ufCIrDQogICAgICAgICJJbnRlcnJ1cHRlZEV4Y2VwdGlvbnxOb1N1Y2hNZXRob2RFeGNlcHRpb258SWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbnwiKw0KICAgICAgICAiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb258RW51bXxTdHJpY3RNYXRofFBhY2thZ2V8Q29tcGlsZXJ8IisNCiAgICAgICAgIlJlYWRhYmxlfFJ1bnRpbWV8U3RyaW5nQnVpbGRlcnxNYXRofEluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3J8IisNCiAgICAgICAgIk5vU3VjaE1ldGhvZEVycm9yfFRocmVhZExvY2FsfFJ1bnRpbWVQZXJtaXNzaW9ufEFyaXRobWV0aWNFeGNlcHRpb258IisNCiAgICAgICAgIk51bGxQb2ludGVyRXhjZXB0aW9ufExvbmd8SW50ZWdlcnxTaG9ydHxCeXRlfERvdWJsZXxOdW1iZXJ8RmxvYXR8IisNCiAgICAgICAgIkNoYXJhY3RlcnxCb29sZWFufFN0YWNrVHJhY2VFbGVtZW50fEFwcGVuZGFibGV8U3RyaW5nQnVmZmVyfCIrDQogICAgICAgICJJdGVyYWJsZXxUaHJlYWRHcm91cHxSdW5uYWJsZXxUaHJlYWR8SWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbnwiKw0KICAgICAgICAiU3RhY2tPdmVyZmxvd0Vycm9yfE91dE9mTWVtb3J5RXJyb3J8VmlydHVhbE1hY2hpbmVFcnJvcnwiKw0KICAgICAgICAiQXJyYXlTdG9yZUV4Y2VwdGlvbnxDbGFzc0Nhc3RFeGNlcHRpb258TGlua2FnZUVycm9yfCIrDQogICAgICAgICJOb0NsYXNzRGVmRm91bmRFcnJvcnxDbGFzc05vdEZvdW5kRXhjZXB0aW9ufFJ1bnRpbWVFeGNlcHRpb258IisNCiAgICAgICAgIkV4Y2VwdGlvbnxUaHJlYWREZWF0aHxFcnJvcnxUaHJvd2FibGV8U3lzdGVtfENsYXNzTG9hZGVyfCIrDQogICAgICAgICJDbG9uZWFibGV8Q2xhc3N8Q2hhclNlcXVlbmNlfENvbXBhcmFibGV8U3RyaW5nfE9iamVjdCIpLnNwbGl0KCJ8IikNCiAgICApOw0KICAgIA0KICAgIHZhciBpbXBvcnRDbGFzc2VzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIiIpLnNwbGl0KCJ8IikNCiAgICApOw0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4NCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkDQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbL10oPzooPzpcXFsoPzpcXFxcXXxbXlxcXV0pK1xcXSl8KD86XFxcXC98W15cXF0vXSkpKlsvXVxcdypcXHMqKD89WykuLDtdfCQpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJ0aGlzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsYW5nQ2xhc3Nlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbXBvcnRDbGFzc2VzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGlkZW50aWZpZXJzDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcPzp8XFw/XFwufFxcKlxcLnw8PT58PX58PT1+fFxcLkB8XFwqXFwuQHxcXC4mfGFzfGlufGlzfCF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJscGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCAiZG9jLSIsDQogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoR3Jvb3Z5SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuR3Jvb3Z5SGlnaGxpZ2h0UnVsZXMgPSBHcm9vdnlIaWdobGlnaHRSdWxlczsNCn0pOw0KOw0KICAgICAgICAgICAgKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpDQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgIA==]]></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[ZGVmaW5lKCdhY2UvbW9kZS9oYXhlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvaGF4ZV9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgSGF4ZUhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9oYXhlX2hpZ2hsaWdodF9ydWxlcyIpLkhheGVIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBIYXhlSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQoNCiAgICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVkTGluZS50b2tlbnM7DQoNCiAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50Iikgew0KICAgICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICAgIH0NCg0KICAgICAgICAgIGlmIChzdGF0ZSA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKltce1woXFtdXHMqJC8pOw0KICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWI7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQoNCiAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgfTsNCg0KICAgICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOw0KICAgICAgfTsNCg0KICAgICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOw0KICAgICAgfTsNCg0KDQogICAgdGhpcy5jcmVhdGVXb3JrZXIgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQpkZWZpbmUoJ2FjZS9tb2RlL2hheGVfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBIYXhlSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJicmVha3xjYXNlfGNhc3R8Y2F0Y2h8Y2xhc3N8Y29udGludWV8ZGVmYXVsdHxlbHNlfGVudW18ZXh0ZW5kc3xmb3J8ZnVuY3Rpb258aWZ8aW1wbGVtZW50c3xpbXBvcnR8aW58aW5saW5lfGludGVyZmFjZXxuZXd8b3ZlcnJpZGV8cGFja2FnZXxwcml2YXRlfHB1YmxpY3xyZXR1cm58c3RhdGljfHN1cGVyfHN3aXRjaHx0aGlzfHRocm93fHRyYWNlfHRyeXx0eXBlZGVmfHVudHlwZWR8dmFyfHdoaWxlfEFycmF5fFZvaWR8Qm9vbHxJbnR8VUludHxGbG9hdHxEeW5hbWljfFN0cmluZ3xMaXN0fEhhc2h8SW50SGFzaHxFcnJvcnxVbmtub3dufFR5cGV8U3RkIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJudWxsfHRydWV8ZmFsc2UiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZy5yZWdleHAiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dXFx3KlxccyooPz1bKS4sO118JCkiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86dHJ1ZXxmYWxzZSlcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gInRoaXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGlkZW50aWZpZXJzDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwdW5jdHVhdGlvbi5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFw7fFxcLiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHs8XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfT5dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9Ow0KDQogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLA0KICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEhheGVIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5IYXhlSGlnaGxpZ2h0UnVsZXMgPSBIYXhlSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jLnRhZyIsDQogICAgICAgICAgICByZWdleCA6ICJAW1xcd1xcZF9dKyIgLy8gVE9ETzogZml4IGVtYWlsIGFkZHJlc3Nlcw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJUT0RPIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJbXkBcXCpdKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLiINCiAgICAgICAgfV0NCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBkb2MgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqKD89XFwqKSIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXCpcXC8iLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQoNCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOw0KDQogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7DQogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7DQoNCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvYmVoYXZpb3VyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoJy4uL2JlaGF2aW91cicpLkJlaGF2aW91cjsNCg0KdmFyIENzdHlsZUJlaGF2aW91ciA9IGZ1bmN0aW9uICgpIHsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAne30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9Jykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCd9Jywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7DQogICAgICAgICAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MpDQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCg0KICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLmdldE5leHRMaW5lSW5kZW50KHN0YXRlLCBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCAtIDEpLCBzZXNzaW9uLmdldFRhYlN0cmluZygpKTsNCiAgICAgICAgICAgICAgICB2YXIgbmV4dF9pbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXG4nICsgaW5kZW50ICsgJ1xuJyArIG5leHRfaW5kZW50LA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLmVuZC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICcoJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJyknLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIicgKyBzZWxlY3RlZCArICciJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgICAgICB2YXIgbGVmdENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLTEsIGN1cnNvci5jb2x1bW4pOw0KDQogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4NCiAgICAgICAgICAgICAgICBpZiAobGVmdENoYXIgPT0gJ1xcJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBGaW5kIHdoYXQgdG9rZW4gd2UncmUgaW5zaWRlLg0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7DQogICAgICAgICAgICAgICAgdmFyIGNvbCA9IDAsIHRva2VuOw0KICAgICAgICAgICAgICAgIHZhciBxdW90ZXBvcyA9IC0xOyAvLyBUcmFjayB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhbiBvcGVuIHF1b3RlLg0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0b2tlbnMubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbeF07DQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdW90ZXBvcyA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRva2VuLnZhbHVlLmxlbmd0aCArIGNvbCkgPiBzZWxlY3Rpb24uc3RhcnQuY29sdW1uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb2wgKz0gdG9rZW5zW3hdLnZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBUcnkgYW5kIGJlIHNtYXJ0IGFib3V0IHdoZW4gd2UgYXV0byBpbnNlcnQuDQogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIiInLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLg0KICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQp9DQpvb3AuaW5oZXJpdHMoQ3N0eWxlQmVoYXZpb3VyLCBCZWhhdmlvdXIpOw0KDQpleHBvcnRzLkNzdHlsZUJlaGF2aW91ciA9IENzdHlsZUJlaGF2aW91cjsNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSAvXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS87DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4Ow0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMV0pDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBpKTsNCg0KICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7DQogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgew0KICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkpOw0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07DQogICAgICAgICAgICB2YXIgc3RhcnQgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQobWF0Y2hbMV0sIGVuZCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICghc3RhcnQpDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4tLTsNCg0KICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgICAgICB9DQogICAgfTsNCiAgICANCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gbnVsbDsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsNCg0KICAgIC8vIG11c3QgcmV0dXJuICIiIGlmIHRoZXJlJ3Mgbm8gZm9sZCwgdG8gZW5hYmxlIGNhY2hpbmcNCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICBpZiAodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOw0KICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlcg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHJlID0gL15ccyovOw0KICAgICAgICB2YXIgc3RhcnRSb3cgPSByb3c7DQogICAgICAgIHZhciBlbmRSb3cgPSByb3c7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBzdGFydENvbHVtbiA9IGNvbHVtbiB8fCBsaW5lLmxlbmd0aDsNCiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpDQogICAgICAgIA0KICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsNCiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgICAgIHZhciBsZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgZW5kUm93ID0gcm93Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7DQogICAgICAgICAgICB2YXIgZW5kQ29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZFJvdykubGVuZ3RoOw0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1uICsgMX07DQogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOw0KICAgICAgICBpZiAoIWVuZCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOw0KICAgICAgICBpZiAoZncgPT0gbnVsbCkNCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOw0KDQogICAgICAgIGlmIChmdyA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICBlbmQucm93IC0tOw0KICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgfTsNCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvaHRtbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvbW9kZS9qYXZhc2NyaXB0JywgJ2FjZS9tb2RlL2NzcycsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2h0bWxfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL2JlaGF2aW91ci94bWwnLCAnYWNlL21vZGUvZm9sZGluZy9odG1sJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBKYXZhU2NyaXB0TW9kZSA9IHJlcXVpcmUoIi4vamF2YXNjcmlwdCIpLk1vZGU7DQp2YXIgQ3NzTW9kZSA9IHJlcXVpcmUoIi4vY3NzIikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgSHRtbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9odG1sX2hpZ2hsaWdodF9ydWxlcyIpLkh0bWxIaWdobGlnaHRSdWxlczsNCnZhciBYbWxCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci94bWwiKS5YbWxCZWhhdmlvdXI7DQp2YXIgSHRtbEZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2h0bWwiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgaGlnaGxpZ2h0ZXIgPSBuZXcgSHRtbEhpZ2hsaWdodFJ1bGVzKCk7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihoaWdobGlnaHRlci5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgWG1sQmVoYXZpb3VyKCk7DQogICAgDQogICAgdGhpcy4kZW1iZWRzID0gaGlnaGxpZ2h0ZXIuZ2V0RW1iZWRzKCk7DQogICAgdGhpcy5jcmVhdGVNb2RlRGVsZWdhdGVzKHsNCiAgICAgICAgImpzLSI6IEphdmFTY3JpcHRNb2RlLA0KICAgICAgICAiY3NzLSI6IENzc01vZGUNCiAgICB9KTsNCiAgICANCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBIdG1sRm9sZE1vZGUoKTsNCn07DQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICANCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3JhbmdlJywgJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBXb3JrZXJDbGllbnQgPSByZXF1aXJlKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudDsNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOw0KICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBDc3R5bGVCZWhhdmlvdXIoKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIHJlID0gL14oXHMqKVwvXC8vOw0KDQogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgew0KICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICIvLyIpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQoNCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7DQogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsNCiAgICAgICAgdmFyIGVuZFN0YXRlID0gdG9rZW5pemVkTGluZS5zdGF0ZTsNCg0KICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50Iikgew0KICAgICAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qXDp8W1x7XChcW10pXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSAiZG9jLXN0YXJ0Iikgew0KICAgICAgICAgICAgaWYgKGVuZFN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICIiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXlxzKihcLz8pXCovKTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIGlmIChtYXRjaFsxXSkgew0KICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiAiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiogIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXJDbGllbnQoWyJhY2UiXSwgIndvcmtlci1qYXZhc2NyaXB0LmpzIiwgImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwgIkphdmFTY3JpcHRXb3JrZXIiKTsNCiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsNCiAgICAgICAgICAgIA0KICAgICAgICB3b3JrZXIub24oImpzbGludCIsIGZ1bmN0aW9uKHJlc3VsdHMpIHsNCiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxyZXN1bHRzLmRhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSByZXN1bHRzLmRhdGFbaV07DQogICAgICAgICAgICAgICAgaWYgKGVycm9yKQ0KICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGVycm9yLmxpbmUtMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZXJyb3IuY2hhcmFjdGVyLTEsDQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvci5yZWFzb24sDQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICBsaW50OiBlcnJvcg0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICB3b3JrZXIub24oIm5hcmNpc3N1cyIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoW2UuZGF0YV0pOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigidGVybWluYXRlIiwgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBzZXNzaW9uLmNsZWFyQW5ub3RhdGlvbnMoKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gd29ya2VyOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL3VuaWNvZGUnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIHVuaWNvZGUgPSByZXF1aXJlKCIuLi91bmljb2RlIik7DQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cw0KICAgIHZhciBnbG9iYWxzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgLy8gQ29uc3RydWN0b3JzDQogICAgICAgICgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXwiICsNCiAgICAgIC8vIEU0WA0KICAgICAgICAgIk5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHwiICsNCiAgICAgICAgICJBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8IiArDQogICAgICAgICAiVWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXwiICsNCiAgICAgIC8vIEVycm9ycw0KICAgICAgICAiRXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufCIgKw0KICAgICAgICAiU3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfCIgKw0KICAgICAgLy8gIE5vbi1jb25zdHJ1Y3RvciBmdW5jdGlvbnMNCiAgICAgICAgImRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfCIgKw0KICAgICAgICAiaXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHwiICsNCiAgICAgIC8vIE90aGVyDQogICAgICAgICJKU09OfE1hdGh8IiArDQogICAgICAvLyBQc2V1ZG8NCiAgICAgICAgInRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiDQogICAgICApLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnwiICsNCiAgICAgICAgImlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8IiArDQogICAgICAgICJjb25zdHx5aWVsZHxpbXBvcnR8Z2V0fHNldCIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8ga2V5d29yZHMgd2hpY2ggY2FuIGJlIGZvbGxvd2VkIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbnMNCiAgICB2YXIga3dCZWZvcmVSZSA9ICJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIjsNCg0KICAgIHZhciBkZXByZWNhdGVkID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIl9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fXyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGRlZmluaXRpb25zID0gbGFuZy5hcnJheVRvTWFwKCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIpLnNwbGl0KCJ8IikpOw0KDQogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZnV0dXJlUmVzZXJ2ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8IiArDQogICAgICAgICJwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzDQogICAgdmFyIGlkZW50aWZpZXJSZSA9ICJbIiArIHVuaWNvZGUucGFja2FnZXMuTCArICJcXCRfXVsiIA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTW4gKyB1bmljb2RlLnBhY2thZ2VzLk1jDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5OZA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuUGMgKyAiXFwkX10qXFxiIjsNCiAgICAgICAgDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0uKlxcXFwkJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInFxc3RyaW5nIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogWyJrZXl3b3JkLmRlZmluaXRpb24iLCAidGV4dCIsICJlbnRpdHkubmFtZS5mdW5jdGlvbiJdLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIihmdW5jdGlvbikoXFxzKykoIiArIGlkZW50aWZpZXJSZSArICIpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OiIgKyBrd0JlZm9yZVJlICsgIilcXGIiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXByZWNhdGVkLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmaW5pdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkLmRlZmluaXRpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJkZWJ1Z2dlciIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZWdleCA6IGlkZW50aWZpZXJSZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwdW5jdHVhdGlvbi5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFw7fFxcLiIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC89PyIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXiMhLiokIiANCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBvbmx5IGFsbG93ZWQgYWZ0ZXIgY2VydGFpbiB0b2tlbnMuIFRoaXMNCiAgICAgICAgLy8gbWFrZXMgc3VyZSB3ZSBkb24ndCBtaXggdXAgcmVnZXhwcyB3aXRoIHRoZSBkaXZpc29uIG9wZXJhdG9yDQogICAgICAgICJyZWdleF9hbGxvd2VkIjogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnRfcmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcLyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmV0dXJuIHRvIHRoZSBzdGFydCBtb2RlIHdpdGhvdXQgbWF0Y2hpbmcNCiAgICAgICAgICAgICAgICAvLyBhbnl0aGluZw0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0Ig0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicmVnZXgiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4Ig0KICAgICAgICAgICAgfSwgew0KCQkJCS8vIGZsYWcNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLCANCiAgICAgICAgICAgICAgICByZWdleDogIi9cXHcqIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlIA0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJbXlxcXFwvXFxbXSsiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcWyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImVtcHR5IiwgDQogICAgICAgICAgICAgICAgcmVnZXg6ICIiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIgDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIl0iLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXFxcXV0rIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiANCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgImNvbW1lbnRfcmVnZXhfYWxsb3dlZCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLA0KICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jLnRhZyIsDQogICAgICAgICAgICByZWdleCA6ICJAW1xcd1xcZF9dKyIgLy8gVE9ETzogZml4IGVtYWlsIGFkZHJlc3Nlcw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJUT0RPIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJbXkBcXCpdKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLiINCiAgICAgICAgfV0NCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBkb2MgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqKD89XFwqKSIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXCpcXC8iLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQoNCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOw0KDQogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7DQogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7DQoNCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KDQp2YXIgV29ya2VyQ2xpZW50ID0gZnVuY3Rpb24odG9wTGV2ZWxOYW1lc3BhY2VzLCBwYWNrYWdlZEpzLCBtb2QsIGNsYXNzbmFtZSkgew0KDQogICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IHRoaXMuY2hhbmdlTGlzdGVuZXIuYmluZCh0aGlzKTsNCg0KICAgIGlmIChtb2R1bGUucGFja2FnZWQpIHsNCiAgICAgICAgdmFyIGJhc2UgPSB0aGlzLiRndWVzc0Jhc2VQYXRoKCk7DQogICAgICAgIHRoaXMuJHdvcmtlciA9IG5ldyBXb3JrZXIoYmFzZSArIHBhY2thZ2VkSnMpOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgdmFyIHdvcmtlclVybCA9IHRoaXMuJG5vcm1hbGl6ZVBhdGgocmVxdWlyZS5uYW1lVG9VcmwoImFjZS93b3JrZXIvd29ya2VyIiwgbnVsbCwgIl8iKSk7DQogICAgICAgIHRoaXMuJHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyVXJsKTsNCg0KICAgICAgICB2YXIgdGxucyA9IHt9Ow0KICAgICAgICBmb3IgKHZhciBpPTA7IGk8dG9wTGV2ZWxOYW1lc3BhY2VzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXNbaV07DQogICAgICAgICAgICB2YXIgcGF0aCA9IHRoaXMuJG5vcm1hbGl6ZVBhdGgocmVxdWlyZS5uYW1lVG9VcmwobnMsIG51bGwsICJfIikucmVwbGFjZSgvLmpzJC8sICIiKSk7DQoNCiAgICAgICAgICAgIHRsbnNbbnNdID0gcGF0aDsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7DQogICAgICAgIGluaXQgOiB0cnVlLA0KICAgICAgICB0bG5zOiB0bG5zLA0KICAgICAgICBtb2R1bGU6IG1vZCwNCiAgICAgICAgY2xhc3NuYW1lOiBjbGFzc25hbWUNCiAgICB9KTsNCg0KICAgIHRoaXMuY2FsbGJhY2tJZCA9IDE7DQogICAgdGhpcy5jYWxsYmFja3MgPSB7fTsNCg0KICAgIHZhciBfc2VsZiA9IHRoaXM7DQogICAgdGhpcy4kd29ya2VyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICYmIGNvbnNvbGUubG9nKGUpOw0KICAgICAgICB0aHJvdyBlOw0KICAgIH07DQogICAgdGhpcy4kd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIG1zZyA9IGUuZGF0YTsNCiAgICAgICAgc3dpdGNoKG1zZy50eXBlKSB7DQogICAgICAgICAgICBjYXNlICJsb2ciOg0KICAgICAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICYmIGNvbnNvbGUubG9nKG1zZy5kYXRhKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgY2FzZSAiZXZlbnQiOg0KICAgICAgICAgICAgICAgIF9zZWxmLl9lbWl0KG1zZy5uYW1lLCB7ZGF0YTogbXNnLmRhdGF9KTsNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgY2FzZSAiY2FsbCI6DQogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07DQogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7DQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1zZy5kYXRhKTsNCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIF9zZWxmLmNhbGxiYWNrc1ttc2cuaWRdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH07DQp9Ow0KDQooZnVuY3Rpb24oKXsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCg0KICAgIHRoaXMuJG5vcm1hbGl6ZVBhdGggPSBmdW5jdGlvbihwYXRoKSB7DQogICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15bYS16XSs6XC9cL1teXC9dK1wvLywgIiIpOyAvLyBSZW1vdmUgZG9tYWluIG5hbWUgYW5kIHJlYnVpbGQgaXQNCiAgICAgICAgcGF0aCA9IGxvY2F0aW9uLnByb3RvY29sICsgIi8vIiArIGxvY2F0aW9uLmhvc3QNCiAgICAgICAgICAgIC8vIHBhdGhzIHN0YXJ0aW5nIHdpdGggYSBzbGFzaCBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgKGhvc3QpDQogICAgICAgICAgICArIChwYXRoLmNoYXJBdCgwKSA9PSAiLyIgPyAiIiA6IGxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1wvW15cL10qJC8sICIiKSkNCiAgICAgICAgICAgICsgIi8iICsgcGF0aC5yZXBsYWNlKC9eW1wvXSsvLCAiIik7DQogICAgICAgIHJldHVybiBwYXRoOw0KICAgIH07DQoNCiAgICB0aGlzLiRndWVzc0Jhc2VQYXRoID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmIChyZXF1aXJlLmFjZUJhc2VVcmwpDQogICAgICAgICAgICByZXR1cm4gcmVxdWlyZS5hY2VCYXNlVXJsOw0KDQogICAgICAgIHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpOw0KICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2NyaXB0cy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIHNjcmlwdCA9IHNjcmlwdHNbaV07DQoNCiAgICAgICAgICAgIHZhciBiYXNlID0gc2NyaXB0LmdldEF0dHJpYnV0ZSgiZGF0YS1hY2UtYmFzZSIpOw0KICAgICAgICAgICAgaWYgKGJhc2UpDQogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UucmVwbGFjZSgvXC8qJC8sICIvIik7DQoNCiAgICAgICAgICAgIHZhciBzcmMgPSBzY3JpcHQuc3JjIHx8IHNjcmlwdC5nZXRBdHRyaWJ1dGUoInNyYyIpOw0KICAgICAgICAgICAgaWYgKCFzcmMpIHsNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBtID0gc3JjLm1hdGNoKC9eKD86KC4qXC8pYWNlXC5qc3woLipcLylhY2UoLXVuY29tcHJlc3NlZCk/KC1ub2NvbmZsaWN0KT9cLmpzKSg/Olw/fCQpLyk7DQogICAgICAgICAgICBpZiAobSkNCiAgICAgICAgICAgICAgICByZXR1cm4gbVsxXSB8fCBtWzJdOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQogICAgdGhpcy50ZXJtaW5hdGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5fZW1pdCgidGVybWluYXRlIiwge30pOw0KICAgICAgICB0aGlzLiR3b3JrZXIudGVybWluYXRlKCk7DQogICAgICAgIHRoaXMuJHdvcmtlciA9IG51bGw7DQogICAgICAgIHRoaXMuJGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsNCiAgICAgICAgdGhpcy4kZG9jID0gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5zZW5kID0gZnVuY3Rpb24oY21kLCBhcmdzKSB7DQogICAgICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7Y29tbWFuZDogY21kLCBhcmdzOiBhcmdzfSk7DQogICAgfTsNCg0KICAgIHRoaXMuY2FsbCA9IGZ1bmN0aW9uKGNtZCwgYXJncywgY2FsbGJhY2spIHsNCiAgICAgICAgaWYgKGNhbGxiYWNrKSB7DQogICAgICAgICAgICB2YXIgaWQgPSB0aGlzLmNhbGxiYWNrSWQrKzsNCiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzW2lkXSA9IGNhbGxiYWNrOw0KICAgICAgICAgICAgYXJncy5wdXNoKGlkKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnNlbmQoY21kLCBhcmdzKTsNCiAgICB9Ow0KDQogICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIC8vIGZpcmVmb3ggcmVmdXNlcyB0byBjbG9uZSBvYmplY3RzIHdoaWNoIGhhdmUgZnVuY3Rpb24gcHJvcGVydGllcw0KICAgICAgICAgICAgLy8gVE9ETzogY2xlYW51cCBldmVudA0KICAgICAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtldmVudDogZXZlbnQsIGRhdGE6IHtkYXRhOiBkYXRhLmRhdGF9fSk7DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2goZXgpIHt9DQogICAgfTsNCg0KICAgIHRoaXMuYXR0YWNoVG9Eb2N1bWVudCA9IGZ1bmN0aW9uKGRvYykgew0KICAgICAgICBpZih0aGlzLiRkb2MpDQogICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZSgpOw0KDQogICAgICAgIHRoaXMuJGRvYyA9IGRvYzsNCiAgICAgICAgdGhpcy5jYWxsKCJzZXRWYWx1ZSIsIFtkb2MuZ2V0VmFsdWUoKV0pOw0KICAgICAgICBkb2Mub24oImNoYW5nZSIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOw0KICAgIH07DQoNCiAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gZnVuY3Rpb24oZSkgew0KICAgICAgICBlLnJhbmdlID0gew0KICAgICAgICAgICAgc3RhcnQ6IGUuZGF0YS5yYW5nZS5zdGFydCwNCiAgICAgICAgICAgIGVuZDogZS5kYXRhLnJhbmdlLmVuZA0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmVtaXQoImNoYW5nZSIsIGUpOw0KICAgIH07DQoNCn0pLmNhbGwoV29ya2VyQ2xpZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuV29ya2VyQ2xpZW50ID0gV29ya2VyQ2xpZW50Ow0KDQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvYmVoYXZpb3VyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoJy4uL2JlaGF2aW91cicpLkJlaGF2aW91cjsNCg0KdmFyIENzdHlsZUJlaGF2aW91ciA9IGZ1bmN0aW9uICgpIHsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAne30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9Jykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCd9Jywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7DQogICAgICAgICAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MpDQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCg0KICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLmdldE5leHRMaW5lSW5kZW50KHN0YXRlLCBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCAtIDEpLCBzZXNzaW9uLmdldFRhYlN0cmluZygpKTsNCiAgICAgICAgICAgICAgICB2YXIgbmV4dF9pbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXG4nICsgaW5kZW50ICsgJ1xuJyArIG5leHRfaW5kZW50LA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLmVuZC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICcoJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJyknLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIicgKyBzZWxlY3RlZCArICciJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgICAgICB2YXIgbGVmdENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLTEsIGN1cnNvci5jb2x1bW4pOw0KDQogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4NCiAgICAgICAgICAgICAgICBpZiAobGVmdENoYXIgPT0gJ1xcJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBGaW5kIHdoYXQgdG9rZW4gd2UncmUgaW5zaWRlLg0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7DQogICAgICAgICAgICAgICAgdmFyIGNvbCA9IDAsIHRva2VuOw0KICAgICAgICAgICAgICAgIHZhciBxdW90ZXBvcyA9IC0xOyAvLyBUcmFjayB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhbiBvcGVuIHF1b3RlLg0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0b2tlbnMubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbeF07DQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdW90ZXBvcyA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRva2VuLnZhbHVlLmxlbmd0aCArIGNvbCkgPiBzZWxlY3Rpb24uc3RhcnQuY29sdW1uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb2wgKz0gdG9rZW5zW3hdLnZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBUcnkgYW5kIGJlIHNtYXJ0IGFib3V0IHdoZW4gd2UgYXV0byBpbnNlcnQuDQogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIiInLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLg0KICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQp9DQpvb3AuaW5oZXJpdHMoQ3N0eWxlQmVoYXZpb3VyLCBCZWhhdmlvdXIpOw0KDQpleHBvcnRzLkNzdHlsZUJlaGF2aW91ciA9IENzdHlsZUJlaGF2aW91cjsNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSAvXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS87DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4Ow0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMV0pDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBpKTsNCg0KICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7DQogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgew0KICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkpOw0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07DQogICAgICAgICAgICB2YXIgc3RhcnQgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQobWF0Y2hbMV0sIGVuZCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICghc3RhcnQpDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4tLTsNCg0KICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgICAgICB9DQogICAgfTsNCiAgICANCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gbnVsbDsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsNCg0KICAgIC8vIG11c3QgcmV0dXJuICIiIGlmIHRoZXJlJ3Mgbm8gZm9sZCwgdG8gZW5hYmxlIGNhY2hpbmcNCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICBpZiAodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOw0KICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlcg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHJlID0gL15ccyovOw0KICAgICAgICB2YXIgc3RhcnRSb3cgPSByb3c7DQogICAgICAgIHZhciBlbmRSb3cgPSByb3c7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBzdGFydENvbHVtbiA9IGNvbHVtbiB8fCBsaW5lLmxlbmd0aDsNCiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpDQogICAgICAgIA0KICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsNCiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgICAgIHZhciBsZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgZW5kUm93ID0gcm93Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7DQogICAgICAgICAgICB2YXIgZW5kQ29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZFJvdykubGVuZ3RoOw0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1uICsgMX07DQogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOw0KICAgICAgICBpZiAoIWVuZCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOw0KICAgICAgICBpZiAoZncgPT0gbnVsbCkNCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOw0KDQogICAgICAgIGlmIChmdyA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICBlbmQucm93IC0tOw0KICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgfTsNCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2NzcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBDc3NIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgV29ya2VyQ2xpZW50ID0gcmVxdWlyZSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQ7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgQ3NzSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpLCAiaSIpOw0KICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gImNTdHlsZSI7DQoNCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOw0KDQogICAgICAgIC8vIGlnbm9yZSBicmFjZXMgaW4gY29tbWVudHMNCiAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKS50b2tlbnM7DQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXi4qXHtccyokLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXJDbGllbnQoWyJhY2UiXSwgIndvcmtlci1jc3MuanMiLCAiYWNlL21vZGUvY3NzX3dvcmtlciIsICJXb3JrZXIiKTsNCiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigiY3NzbGludCIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsNCiAgICAgICAgICAgIGUuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKG1lc3NhZ2UpIHsNCiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgIHJvdzogbWVzc2FnZS5saW5lIC0gMSwNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBtZXNzYWdlLmNvbCAtIDEsDQogICAgICAgICAgICAgICAgICAgIHRleHQ6IG1lc3NhZ2UubWVzc2FnZSwNCiAgICAgICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZS50eXBlLA0KICAgICAgICAgICAgICAgICAgICBsaW50OiBtZXNzYWdlDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhlcnJvcnMpOw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuIHdvcmtlcjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIENzc0hpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB2YXIgcHJvcGVydGllcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCItbW96LWFwcGVhcmFuY2V8LW1vei1ib3gtc2l6aW5nfC13ZWJraXQtYm94LXNpemluZ3wtbW96LW91dGxpbmUtcmFkaXVzfC1tb3otdHJhbnNmb3JtfC13ZWJraXQtdHJhbnNmb3JtfCIgKw0KICAgICAgICAiYXBwZWFyYW5jZXxhemltdXRofGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtaW1hZ2V8IiArDQogICAgICAgICJiYWNrZ3JvdW5kLW9yaWdpbnxiYWNrZ3JvdW5kLXBvc2l0aW9ufGJhY2tncm91bmQtcmVwZWF0fGJhY2tncm91bmR8Ym9yZGVyLWJvdHRvbS1jb2xvcnwiICsNCiAgICAgICAgImJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS13aWR0aHxib3JkZXItYm90dG9tfGJvcmRlci1jb2xsYXBzZXwiICsNCiAgICAgICAgImJvcmRlci1jb2xvcnxib3JkZXItbGVmdC1jb2xvcnxib3JkZXItbGVmdC1zdHlsZXxib3JkZXItbGVmdC13aWR0aHwiICsNCiAgICAgICAgImJvcmRlci1sZWZ0fGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHQtc3R5bGV8Ym9yZGVyLXJpZ2h0LXdpZHRofCIgKw0KICAgICAgICAiYm9yZGVyLXJpZ2h0fGJvcmRlci1zcGFjaW5nfGJvcmRlci1zdHlsZXxib3JkZXItdG9wLWNvbG9yfCIgKw0KICAgICAgICAiYm9yZGVyLXRvcC1zdHlsZXxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3B8Ym9yZGVyLXdpZHRofGJvcmRlcnwiICsNCiAgICAgICAgImJvdHRvbXxib3gtc2l6aW5nfGNhcHRpb24tc2lkZXxjbGVhcnxjbGlwfGNvbG9yfGNvbnRlbnR8Y291bnRlci1pbmNyZW1lbnR8IiArDQogICAgICAgICJjb3VudGVyLXJlc2V0fGN1ZS1hZnRlcnxjdWUtYmVmb3JlfGN1ZXxjdXJzb3J8ZGlyZWN0aW9ufGRpc3BsYXl8IiArDQogICAgICAgICJlbGV2YXRpb258ZW1wdHktY2VsbHN8ZmxvYXR8Zm9udC1mYW1pbHl8Zm9udC1zaXplLWFkanVzdHxmb250LXNpemV8IiArDQogICAgICAgICJmb250LXN0cmV0Y2h8Zm9udC1zdHlsZXxmb250LXZhcmlhbnR8Zm9udC13ZWlnaHR8Zm9udHxoZWlnaHR8bGVmdHwiICsNCiAgICAgICAgImxldHRlci1zcGFjaW5nfGxpbmUtaGVpZ2h0fGxpc3Qtc3R5bGUtaW1hZ2V8bGlzdC1zdHlsZS1wb3NpdGlvbnwiICsNCiAgICAgICAgImxpc3Qtc3R5bGUtdHlwZXxsaXN0LXN0eWxlfG1hcmdpbi1ib3R0b218bWFyZ2luLWxlZnR8bWFyZ2luLXJpZ2h0fCIgKw0KICAgICAgICAibWFyZ2luLXRvcHxtYXJrZXItb2Zmc2V0fG1hcmdpbnxtYXJrc3xtYXgtaGVpZ2h0fG1heC13aWR0aHxtaW4taGVpZ2h0fCIgKw0KICAgICAgICAibWluLXdpZHRofC1tb3otYm9yZGVyLXJhZGl1c3xvcGFjaXR5fG9ycGhhbnN8b3V0bGluZS1jb2xvcnxvdXRsaW5lLW9mZnNldHxvdXRsaW5lLXJhZGl1c3wiICsNCiAgICAgICAgIm91dGxpbmUtc3R5bGV8b3V0bGluZS13aWR0aHxvdXRsaW5lfG92ZXJmbG93fG92ZXJmbG93LXh8b3ZlcmZsb3cteXxwYWRkaW5nLWJvdHRvbXwiICsNCiAgICAgICAgInBhZGRpbmctbGVmdHxwYWRkaW5nLXJpZ2h0fHBhZGRpbmctdG9wfHBhZGRpbmd8cGFnZS1icmVhay1hZnRlcnwiICsNCiAgICAgICAgInBhZ2UtYnJlYWstYmVmb3JlfHBhZ2UtYnJlYWstaW5zaWRlfHBhZ2V8cGF1c2UtYWZ0ZXJ8cGF1c2UtYmVmb3JlfCIgKw0KICAgICAgICAicGF1c2V8cGl0Y2gtcmFuZ2V8cGl0Y2h8cGxheS1kdXJpbmd8cG9pbnRlci1ldmVudHN8cG9zaXRpb258cXVvdGVzfHJlc2l6ZXxyaWNobmVzc3xyaWdodHwiICsNCiAgICAgICAgInNpemV8c3BlYWstaGVhZGVyfHNwZWFrLW51bWVyYWx8c3BlYWstcHVuY3R1YXRpb258c3BlZWNoLXJhdGV8c3BlYWt8IiArDQogICAgICAgICJzdHJlc3N8dGFibGUtbGF5b3V0fHRleHQtYWxpZ258dGV4dC1kZWNvcmF0aW9ufHRleHQtaW5kZW50fCIgKw0KICAgICAgICAidGV4dC1zaGFkb3d8dGV4dC10cmFuc2Zvcm18dG9wfHRyYW5zZm9ybXx1bmljb2RlLWJpZGl8dmVydGljYWwtYWxpZ258IiArDQogICAgICAgICJ2aXNpYmlsaXR5fHZvaWNlLWZhbWlseXx2b2x1bWV8d2hpdGUtc3BhY2V8d2lkb3dzfHdpZHRofHdvcmQtc3BhY2luZ3wiICsNCiAgICAgICAgInotaW5kZXgiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBmdW5jdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgicmdifHJnYmF8dXJsfGF0dHJ8Y291bnRlcnxjb3VudGVycyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJhYnNvbHV0ZXxhbGwtc2Nyb2xsfGFsd2F5c3xhcm1lbmlhbnxhdXRvfGJhc2VsaW5lfGJlbG93fGJpZGktb3ZlcnJpZGV8IiArDQogICAgICAgICJibG9ja3xib2xkfGJvbGRlcnxib3JkZXItYm94fGJvdGh8Ym90dG9tfGJyZWFrLWFsbHxicmVhay13b3JkfGNhcGl0YWxpemV8Y2VudGVyfCIgKw0KICAgICAgICAiY2hhcnxjaXJjbGV8Y2prLWlkZW9ncmFwaGljfGNvbC1yZXNpemV8Y29sbGFwc2V8Y29udGVudC1ib3h8Y3Jvc3NoYWlyfGRhc2hlZHwiICsNCiAgICAgICAgImRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGVmYXVsdHxkaXNhYmxlZHxkaXNjfCIgKw0KICAgICAgICAiZGlzdHJpYnV0ZS1hbGwtbGluZXN8ZGlzdHJpYnV0ZS1sZXR0ZXJ8ZGlzdHJpYnV0ZS1zcGFjZXwiICsNCiAgICAgICAgImRpc3RyaWJ1dGV8ZG90dGVkfGRvdWJsZXxlLXJlc2l6ZXxlbGxpcHNpc3xmaXhlZHxnZW9yZ2lhbnxncm9vdmV8IiArDQogICAgICAgICJoYW5kfGhlYnJld3xoZWxwfGhpZGRlbnxoaXJhZ2FuYS1pcm9oYXxoaXJhZ2FuYXxob3Jpem9udGFsfCIgKw0KICAgICAgICAiaWRlb2dyYXBoLWFscGhhfGlkZW9ncmFwaC1udW1lcmljfGlkZW9ncmFwaC1wYXJlbnRoZXNpc3wiICsNCiAgICAgICAgImlkZW9ncmFwaC1zcGFjZXxpbmFjdGl2ZXxpbmhlcml0fGlubGluZS1ibG9ja3xpbmxpbmV8aW5zZXR8aW5zaWRlfCIgKw0KICAgICAgICAiaW50ZXItaWRlb2dyYXBofGludGVyLXdvcmR8aXRhbGljfGp1c3RpZnl8a2F0YWthbmEtaXJvaGF8a2F0YWthbmF8IiArDQogICAgICAgICJrZWVwLWFsbHxsZWZ0fGxpZ2h0ZXJ8bGluZS1lZGdlfGxpbmUtdGhyb3VnaHxsaW5lfGxpc3QtaXRlbXxsb29zZXwiICsNCiAgICAgICAgImxvd2VyLWFscGhhfGxvd2VyLWdyZWVrfGxvd2VyLWxhdGlufGxvd2VyLXJvbWFufGxvd2VyY2FzZXxsci10YnxsdHJ8IiArDQogICAgICAgICJtZWRpdW18bWlkZGxlfG1vdmV8bi1yZXNpemV8bmUtcmVzaXplfG5ld3NwYXBlcnxuby1kcm9wfG5vLXJlcGVhdHwiICsNCiAgICAgICAgIm53LXJlc2l6ZXxub25lfG5vcm1hbHxub3QtYWxsb3dlZHxub3dyYXB8b2JsaXF1ZXxvdXRzZXR8b3V0c2lkZXwiICsNCiAgICAgICAgIm92ZXJsaW5lfHBvaW50ZXJ8cHJvZ3Jlc3N8cmVsYXRpdmV8cmVwZWF0LXh8cmVwZWF0LXl8cmVwZWF0fHJpZ2h0fCIgKw0KICAgICAgICAicmlkZ2V8cm93LXJlc2l6ZXxydGx8cy1yZXNpemV8c2Nyb2xsfHNlLXJlc2l6ZXxzZXBhcmF0ZXxzbWFsbC1jYXBzfCIgKw0KICAgICAgICAic29saWR8c3F1YXJlfHN0YXRpY3xzdHJpY3R8c3VwZXJ8c3ctcmVzaXplfHRhYmxlLWZvb3Rlci1ncm91cHwiICsNCiAgICAgICAgInRhYmxlLWhlYWRlci1ncm91cHx0Yi1ybHx0ZXh0LWJvdHRvbXx0ZXh0LXRvcHx0ZXh0fHRoaWNrfHRoaW58dG9wfCIgKw0KICAgICAgICAidHJhbnNwYXJlbnR8dW5kZXJsaW5lfHVwcGVyLWFscGhhfHVwcGVyLWxhdGlufHVwcGVyLXJvbWFufHVwcGVyY2FzZXwiICsNCiAgICAgICAgInZlcnRpY2FsLWlkZW9ncmFwaGljfHZlcnRpY2FsLXRleHR8dmlzaWJsZXx3LXJlc2l6ZXx3YWl0fHdoaXRlc3BhY2V8IiArDQogICAgICAgICJ6ZXJvIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgY29sb3JzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImFxdWF8YmxhY2t8Ymx1ZXxmdWNoc2lhfGdyYXl8Z3JlZW58bGltZXxtYXJvb258bmF2eXxvbGl2ZXxvcmFuZ2V8IiArDQogICAgICAgICJwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvdyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHZhciBudW1SZSA9ICJcXC0/KD86KD86WzAtOV0rKXwoPzpbMC05XSpcXC5bMC05XSspKSI7DQoNCiAgICB2YXIgYmFzZV9ydWxlc2V0ID0gWw0KICAgICAgICB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgbmV4dCA6ICJydWxlc2V0X2NvbW1lbnQiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwNCiAgICAgICAgICAgIHJlZ2V4IDogbnVtUmUgKyAiKD86ZW18ZXh8cHh8Y218bW18aW58cHR8cGN8ZGVnfHJhZHxncmFkfG1zfHN8aHp8a2h6fCUpIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgIC8vIGhleDYgY29sb3INCiAgICAgICAgICAgIHJlZ2V4IDogIiNbYS1mMC05XXs2fSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleDMgY29sb3INCiAgICAgICAgICAgIHJlZ2V4IDogIiNbYS1mMC05XXszfSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC50eXBlIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuY29uc3RhbnQiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xvcnMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmNvbnN0YW50LmNvbG9yIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAidGV4dCI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcLT9bYS16QS1aX11bYS16QS1aMC05X1xcLV0qIg0KICAgICAgICB9DQogICAgICBdOw0KDQogICAgdmFyIHJ1bGVzZXQgPSBsYW5nLmNvcHlBcnJheShiYXNlX3J1bGVzZXQpOw0KICAgIHJ1bGVzZXQudW5zaGlmdCh7DQogICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgIHJlZ2V4IDogIlxcfSIsDQogICAgICAgIG5leHQ6ICAgInN0YXJ0Ig0KICAgIH0pOw0KDQogICAgdmFyIG1lZGlhX3J1bGVzZXQgPSBsYW5nLmNvcHlBcnJheSggYmFzZV9ydWxlc2V0ICk7DQogICAgbWVkaWFfcnVsZXNldC51bnNoaWZ0KHsNCiAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgcmVnZXggOiAiXFx9IiwNCiAgICAgICAgbmV4dDogICAibWVkaWEiDQogICAgfSk7DQoNCiAgICB2YXIgYmFzZV9jb21tZW50ID0gW3sNCiAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgIH1dOw0KDQogICAgdmFyIGNvbW1lbnQgPSBsYW5nLmNvcHlBcnJheShiYXNlX2NvbW1lbnQpOw0KICAgIGNvbW1lbnQudW5zaGlmdCh7DQogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICB9KTsNCg0KICAgIHZhciBtZWRpYV9jb21tZW50ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9jb21tZW50KTsNCiAgICBtZWRpYV9jb21tZW50LnVuc2hpZnQoew0KICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgIG5leHQgOiAibWVkaWEiDQogICAgfSk7DQoNCiAgICB2YXIgcnVsZXNldF9jb21tZW50ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9jb21tZW50KTsNCiAgICBydWxlc2V0X2NvbW1lbnQudW5zaGlmdCh7DQogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgbmV4dCA6ICJydWxlc2V0Ig0KICAgIH0pOw0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW46ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgcmVnZXg6ICJcXHsiLA0KICAgICAgICAgICAgbmV4dDogICJydWxlc2V0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsDQogICAgICAgICAgICByZWdleDogIkAuKj97IiwNCiAgICAgICAgICAgIG5leHQ6ICAibWVkaWEiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJrZXl3b3JkIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiI1thLXowLTktX10rIg0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAidmFyaWFibGUiLA0KICAgICAgICAgICAgcmVnZXg6ICJcXC5bYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsDQogICAgICAgICAgICByZWdleDogIjpbYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogImNvbnN0YW50IiwNCiAgICAgICAgICAgIHJlZ2V4OiAiW2EtejAtOS1fXSsiDQogICAgICAgIH1dLA0KDQogICAgICAgICJtZWRpYSIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICBuZXh0IDogIm1lZGlhX2NvbW1lbnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuOiAicGFyZW4ubHBhcmVuIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiXFx7IiwNCiAgICAgICAgICAgIG5leHQ6ICAibWVkaWFfcnVsZXNldCINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsDQogICAgICAgICAgICByZWdleDogIlxcfSIsDQogICAgICAgICAgICBuZXh0OiAgInN0YXJ0Ig0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAia2V5d29yZCIsDQogICAgICAgICAgICByZWdleDogIiNbYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogInZhcmlhYmxlIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiXFwuW2EtejAtOS1fXSsiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJzdHJpbmciLA0KICAgICAgICAgICAgcmVnZXg6ICI6W2EtejAtOS1fXSsiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJjb25zdGFudCIsDQogICAgICAgICAgICByZWdleDogIlthLXowLTktX10rIg0KICAgICAgICB9XSwNCg0KICAgICAgICAiY29tbWVudCIgOiBjb21tZW50LA0KDQogICAgICAgICJydWxlc2V0IiA6IHJ1bGVzZXQsDQogICAgICAgICJydWxlc2V0X2NvbW1lbnQiIDogcnVsZXNldF9jb21tZW50LA0KDQogICAgICAgICJtZWRpYV9ydWxlc2V0IiA6IG1lZGlhX3J1bGVzZXQsDQogICAgICAgICJtZWRpYV9jb21tZW50IiA6IG1lZGlhX2NvbW1lbnQNCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKENzc0hpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkNzc0hpZ2hsaWdodFJ1bGVzID0gQ3NzSGlnaGxpZ2h0UnVsZXM7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvaHRtbF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUveG1sX3V0aWwnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgQ3NzSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlczsNCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOw0KdmFyIHhtbFV0aWwgPSByZXF1aXJlKCIuL3htbF91dGlsIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIEh0bWxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICBzdGFydCA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXCFcXFtDREFUQVxcWyIsDQogICAgICAgICAgICBuZXh0IDogImNkYXRhIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ4bWxfcGUiLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcPy4qP1xcPz4iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcIS0tIiwNCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLA0KICAgICAgICAgICAgcmVnZXggOiAiPCg/PVxzKnNjcmlwdFxcYikiLA0KICAgICAgICAgICAgbmV4dCA6ICJzY3JpcHQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIjwoPz1ccypzdHlsZVxcYikiLA0KICAgICAgICAgICAgbmV4dCA6ICJzdHlsZSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLCAvLyBvcGVuaW5nIHRhZw0KICAgICAgICAgICAgcmVnZXggOiAiPFxcLz8iLA0KICAgICAgICAgICAgbmV4dCA6ICJ0YWciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJbXjxdKyINCiAgICAgICAgfSBdLA0KICAgIA0KICAgICAgICBjZGF0YSA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJcXF1cXF0+IiwNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgfSBdLA0KDQogICAgICAgIGNvbW1lbnQgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgcmVnZXggOiAiLio/LS0+IiwNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgIH0gXQ0KICAgIH07DQogICAgDQogICAgeG1sVXRpbC50YWcodGhpcy4kcnVsZXMsICJ0YWciLCAic3RhcnQiKTsNCiAgICB4bWxVdGlsLnRhZyh0aGlzLiRydWxlcywgInN0eWxlIiwgImNzcy1zdGFydCIpOw0KICAgIHhtbFV0aWwudGFnKHRoaXMuJHJ1bGVzLCAic2NyaXB0IiwgImpzLXN0YXJ0Iik7DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcywgImpzLSIsIFt7DQogICAgICAgIHRva2VuOiAiY29tbWVudCIsDQogICAgICAgIHJlZ2V4OiAiXFwvXFwvLiooPz08XFwvc2NyaXB0PikiLA0KICAgICAgICBuZXh0OiAidGFnIg0KICAgIH0sIHsNCiAgICAgICAgdG9rZW46ICJtZXRhLnRhZyIsDQogICAgICAgIHJlZ2V4OiAiPFxcLyg/PXNjcmlwdCkiLA0KICAgICAgICBuZXh0OiAidGFnIg0KICAgIH1dKTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoQ3NzSGlnaGxpZ2h0UnVsZXMsICJjc3MtIiwgW3sNCiAgICAgICAgdG9rZW46ICJtZXRhLnRhZyIsDQogICAgICAgIHJlZ2V4OiAiPFxcLyg/PXN0eWxlKSIsDQogICAgICAgIG5leHQ6ICJ0YWciDQogICAgfV0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEh0bWxIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5IdG1sSGlnaGxpZ2h0UnVsZXMgPSBIdG1sSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3htbF91dGlsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2xhbmcnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCg0KdmFyIGZvcm1UYWdzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICgiYnV0dG9ufGZvcm18aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhIikuc3BsaXQoInwiKQ0KKTsNCg0KdmFyIHRhYmxlVGFncyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAoInRhYmxlfHRib2R5fHRkfHRmb290fHRofHRyIikuc3BsaXQoInwiKQ0KKTsNCg0KZnVuY3Rpb24gc3RyaW5nKHN0YXRlKSB7DQogICAgcmV0dXJuIFt7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgIHJlZ2V4IDogJyIuKj8iJw0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICdbIl0uKicsDQogICAgICAgIG5leHQgOiBzdGF0ZSArICJfcXFzdHJpbmciDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICByZWdleCA6ICInLio/JyINCiAgICB9LCB7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgcmVnZXggOiAiWyddLioiLA0KICAgICAgICBuZXh0IDogc3RhdGUgKyAiX3FzdHJpbmciDQogICAgfV07DQp9DQoNCmZ1bmN0aW9uIG11bHRpTGluZVN0cmluZyhxdW90ZSwgc3RhdGUpIHsNCiAgICByZXR1cm4gW3sNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICIuKj8iICsgcXVvdGUsDQogICAgICAgIG5leHQgOiBzdGF0ZQ0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICcuKycNCiAgICB9XTsNCn0NCg0KZXhwb3J0cy50YWcgPSBmdW5jdGlvbihzdGF0ZXMsIG5hbWUsIG5leHRTdGF0ZSkgew0KICAgIHN0YXRlc1tuYW1lXSA9IFt7DQogICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgIH0sIHsNCiAgICAgICAgLy90b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgIA0KICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgIGlmICggdmFsdWU9PT0nYScgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5hbmNob3IiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlPT09J2ltZycgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5pbWFnZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc2NyaXB0JyApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLnNjcmlwdCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc3R5bGUnICkgew0KICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuc3R5bGUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoZm9ybVRhZ3MuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLmZvcm0iOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGFibGVUYWdzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy50YWJsZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwgICAgICAgIA0KICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgIHJlZ2V4IDogIlstX2EtekEtWjAtOTohXSsiLA0KICAgICAgICBuZXh0IDogbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiIA0KICAgIH0sIHsNCiAgICAgICAgdG9rZW46ICJlbXB0eSIsDQogICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgbmV4dCA6IG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Ig0KICAgIH1dOw0KDQogICAgc3RhdGVzW25hbWUgKyAiX3FzdHJpbmciXSA9IG11bHRpTGluZVN0cmluZygiJyIsIG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Iik7DQogICAgc3RhdGVzW25hbWUgKyAiX3Fxc3RyaW5nIl0gPSBtdWx0aUxpbmVTdHJpbmcoIlwiIiwgbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiKTsNCiAgICANCiAgICBzdGF0ZXNbbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiXSA9IFt7DQogICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICJcLz8+IiwNCiAgICAgICAgbmV4dCA6IG5leHRTdGF0ZQ0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgIHJlZ2V4IDogIj0iDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUiLA0KICAgICAgICByZWdleCA6ICJbLV9hLXpBLVowLTk6XSsiDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICB9XS5jb25jYXQoc3RyaW5nKG5hbWUpKTsNCn07DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXI7DQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQoNCnZhciBYbWxCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQogICAgDQogICAgdGhpcy5pbmhlcml0KENzdHlsZUJlaGF2aW91ciwgWyJzdHJpbmdfZHF1b3RlcyJdKTsgLy8gR2V0IHN0cmluZyBiZWhhdmlvdXINCiAgICANCiAgICB0aGlzLmFkZCgiYnJhY2tldHMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnPCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJzw+JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnPicpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICc+JykgeyAvLyBuZWVkIHNvbWUga2luZCBvZiBtYXRjaGluZyBjaGVjayBoZXJlDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhcnMgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFycyA9PSAnPC8nKSB7DQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpKSArIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCiAgICANCn0NCm9vcC5pbmhlcml0cyhYbWxCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuWG1sQmVoYXZpb3VyID0gWG1sQmVoYXZpb3VyOw0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9odG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9mb2xkaW5nL21peGVkJywgJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIE1peGVkRm9sZE1vZGUgPSByZXF1aXJlKCIuL21peGVkIikuRm9sZE1vZGU7DQp2YXIgWG1sRm9sZE1vZGUgPSByZXF1aXJlKCIuL3htbCIpLkZvbGRNb2RlOw0KdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIE1peGVkRm9sZE1vZGUuY2FsbCh0aGlzLCBuZXcgWG1sRm9sZE1vZGUoew0KICAgICAgICAvLyB2b2lkIGVsZW1lbnRzDQogICAgICAgICJhcmVhIjogMSwNCiAgICAgICAgImJhc2UiOiAxLA0KICAgICAgICAiYnIiOiAxLA0KICAgICAgICAiY29sIjogMSwNCiAgICAgICAgImNvbW1hbmQiOiAxLA0KICAgICAgICAiZW1iZWQiOiAxLA0KICAgICAgICAiaHIiOiAxLA0KICAgICAgICAiaW1nIjogMSwNCiAgICAgICAgImlucHV0IjogMSwNCiAgICAgICAgImtleWdlbiI6IDEsDQogICAgICAgICJsaW5rIjogMSwNCiAgICAgICAgIm1ldGEiOiAxLA0KICAgICAgICAicGFyYW0iOiAxLA0KICAgICAgICAic291cmNlIjogMSwNCiAgICAgICAgInRyYWNrIjogMSwNCiAgICAgICAgIndiciI6IDEsDQogICAgICAgIA0KICAgICAgICAvLyBvcHRpb25hbCB0YWdzIA0KICAgICAgICAibGkiOiAxLA0KICAgICAgICAiZHQiOiAxLA0KICAgICAgICAiZGQiOiAxLA0KICAgICAgICAicCI6IDEsDQogICAgICAgICJydCI6IDEsDQogICAgICAgICJycCI6IDEsDQogICAgICAgICJvcHRncm91cCI6IDEsDQogICAgICAgICJvcHRpb24iOiAxLA0KICAgICAgICAiY29sZ3JvdXAiOiAxLA0KICAgICAgICAidGQiOiAxLA0KICAgICAgICAidGgiOiAxDQogICAgfSksIHsNCiAgICAgICAgImpzLSI6IG5ldyBDU3R5bGVGb2xkTW9kZSgpLA0KICAgICAgICAiY3NzLSI6IG5ldyBDU3R5bGVGb2xkTW9kZSgpDQogICAgfSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIE1peGVkRm9sZE1vZGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL21peGVkJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oZGVmYXVsdE1vZGUsIHN1Yk1vZGVzKSB7DQogICAgdGhpcy5kZWZhdWx0TW9kZSA9IGRlZmF1bHRNb2RlOw0KICAgIHRoaXMuc3ViTW9kZXMgPSBzdWJNb2RlczsNCn07DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KDQogICAgdGhpcy4kZ2V0TW9kZSA9IGZ1bmN0aW9uKHN0YXRlKSB7DQogICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnN1Yk1vZGVzKSB7DQogICAgICAgICAgICBpZiAoc3RhdGUuaW5kZXhPZihrZXkpID09PSAwKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1Yk1vZGVzW2tleV07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCiAgICANCiAgICB0aGlzLiR0cnlNb2RlID0gZnVuY3Rpb24oc3RhdGUsIHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBtb2RlID0gdGhpcy4kZ2V0TW9kZShzdGF0ZSk7DQogICAgICAgIHJldHVybiAobW9kZSA/IG1vZGUuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgOiAiIik7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHJldHVybiAoDQogICAgICAgICAgICB0aGlzLiR0cnlNb2RlKHNlc3Npb24uZ2V0U3RhdGUocm93LTEpLCBzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgfHwNCiAgICAgICAgICAgIHRoaXMuJHRyeU1vZGUoc2Vzc2lvbi5nZXRTdGF0ZShyb3cpLCBzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgfHwNCiAgICAgICAgICAgIHRoaXMuZGVmYXVsdE1vZGUuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykNCiAgICAgICAgKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbW9kZSA9IHRoaXMuJGdldE1vZGUoc2Vzc2lvbi5nZXRTdGF0ZShyb3ctMSkpOw0KICAgICAgICANCiAgICAgICAgaWYgKCFtb2RlIHx8ICFtb2RlLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpKQ0KICAgICAgICAgICAgbW9kZSA9IHRoaXMuJGdldE1vZGUoc2Vzc2lvbi5nZXRTdGF0ZShyb3cpKTsNCiAgICAgICAgDQogICAgICAgIGlmICghbW9kZSB8fCAhbW9kZS5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSkNCiAgICAgICAgICAgIG1vZGUgPSB0aGlzLmRlZmF1bHRNb2RlOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIG1vZGUuZ2V0Rm9sZFdpZGdldFJhbmdlKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KTsNCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgJ2FjZS90b2tlbl9pdGVyYXRvciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vLi4vbGliL2xhbmciKTsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCnZhciBUb2tlbkl0ZXJhdG9yID0gcmVxdWlyZSgiLi4vLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24odm9pZEVsZW1lbnRzKSB7DQogICAgQmFzZUZvbGRNb2RlLmNhbGwodGhpcyk7DQogICAgdGhpcy52b2lkRWxlbWVudHMgPSB2b2lkRWxlbWVudHMgfHwge307DQp9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgdGFnID0gdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoc2Vzc2lvbiwgcm93KTsNCg0KICAgICAgICBpZiAodGFnLmNsb3NpbmcpDQogICAgICAgICAgICByZXR1cm4gZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiID8gImVuZCIgOiAiIjsNCg0KICAgICAgICBpZiAoIXRhZy50YWdOYW1lIHx8IHRoaXMudm9pZEVsZW1lbnRzW3RhZy50YWdOYW1lLnRvTG93ZXJDYXNlKCldKQ0KICAgICAgICAgICAgcmV0dXJuICIiOw0KDQogICAgICAgIGlmICh0YWcuc2VsZkNsb3NpbmcpDQogICAgICAgICAgICByZXR1cm4gIiI7DQoNCiAgICAgICAgaWYgKHRhZy52YWx1ZS5pbmRleE9mKCIvIiArIHRhZy50YWdOYW1lKSAhPT0gLTEpDQogICAgICAgICAgICByZXR1cm4gIiI7DQoNCiAgICAgICAgcmV0dXJuICJzdGFydCI7DQogICAgfTsNCiAgICANCiAgICB0aGlzLl9nZXRGaXJzdFRhZ0luTGluZSA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdykgew0KICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMocm93LCByb3cpWzBdLnRva2VuczsNCiAgICAgICAgdmFyIHZhbHVlID0gIiI7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07DQogICAgICAgICAgICBpZiAodG9rZW4udHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpID09PSAwKQ0KICAgICAgICAgICAgICAgIHZhbHVlICs9IHRva2VuLnZhbHVlOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHZhbHVlICs9IGxhbmcuc3RyaW5nUmVwZWF0KCIgIiwgdG9rZW4udmFsdWUubGVuZ3RoKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsNCiAgICB9Ow0KDQogICAgdGhpcy50YWdSZSA9IC9eKFxzKikoPD8oXC8/KShbLV9hLXpBLVowLTk6IV0qKVxzKihcLz8pPj8pLzsNCiAgICB0aGlzLl9wYXJzZVRhZyA9IGZ1bmN0aW9uKHRhZykgew0KICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gdGhpcy50YWdSZS5leGVjKHRhZyk7DQogICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLnRhZ1JlLmxhc3RJbmRleCB8fCAwOw0KICAgICAgICB0aGlzLnRhZ1JlLmxhc3RJbmRleCA9IDA7DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHZhbHVlOiB0YWcsDQogICAgICAgICAgICBtYXRjaDogbWF0Y2ggPyBtYXRjaFsyXSA6ICIiLA0KICAgICAgICAgICAgY2xvc2luZzogbWF0Y2ggPyAhIW1hdGNoWzNdIDogZmFsc2UsDQogICAgICAgICAgICBzZWxmQ2xvc2luZzogbWF0Y2ggPyAhIW1hdGNoWzVdIHx8IG1hdGNoWzJdID09ICIvPiIgOiBmYWxzZSwNCiAgICAgICAgICAgIHRhZ05hbWU6IG1hdGNoID8gbWF0Y2hbNF0gOiAiIiwNCiAgICAgICAgICAgIGNvbHVtbjogbWF0Y2hbMV0gPyBjb2x1bW4gKyBtYXRjaFsxXS5sZW5ndGggOiBjb2x1bW4NCiAgICAgICAgfTsNCiAgICB9Ow0KICAgIA0KICAgIC8qKg0KICAgICAqIHJlYWRzIGEgZnVsbCB0YWcgYW5kIHBsYWNlcyB0aGUgaXRlcmF0b3IgYWZ0ZXIgdGhlIHRhZw0KICAgICAqLw0KICAgIHRoaXMuX3JlYWRUYWdGb3J3YXJkID0gZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICAgICAgdmFyIHRva2VuID0gaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuKCk7DQogICAgICAgIGlmICghdG9rZW4pDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgdmFsdWUgPSAiIjsNCiAgICAgICAgdmFyIHN0YXJ0Ow0KICAgICAgICANCiAgICAgICAgZG8gew0KICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUuaW5kZXhPZigibWV0YS50YWciKSA9PT0gMCkgew0KICAgICAgICAgICAgICAgIGlmICghc3RhcnQpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkNCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW4udmFsdWU7DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoIj4iKSAhPT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHRhZyA9IHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0ID0gc3RhcnQ7DQogICAgICAgICAgICAgICAgICAgIHRhZy5lbmQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSArIHRva2VuLnZhbHVlLmxlbmd0aA0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zdGVwRm9yd2FyZCgpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSB3aGlsZSh0b2tlbiA9IGl0ZXJhdG9yLnN0ZXBGb3J3YXJkKCkpOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCiAgICANCiAgICB0aGlzLl9yZWFkVGFnQmFja3dhcmQgPSBmdW5jdGlvbihpdGVyYXRvcikgew0KICAgICAgICB2YXIgdG9rZW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW4oKTsNCiAgICAgICAgaWYgKCF0b2tlbikNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciB2YWx1ZSA9ICIiOw0KICAgICAgICB2YXIgZW5kOw0KDQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlLmluZGV4T2YoIm1ldGEudGFnIikgPT09IDApIHsNCiAgICAgICAgICAgICAgICBpZiAoIWVuZCkgew0KICAgICAgICAgICAgICAgICAgICBlbmQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSArIHRva2VuLnZhbHVlLmxlbmd0aA0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRva2VuLnZhbHVlICsgdmFsdWU7DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoIjwiKSAhPT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHRhZyA9IHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgdGFnLmVuZCA9IGVuZDsNCiAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0ID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkNCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3Iuc3RlcEJhY2t3YXJkKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IHdoaWxlKHRva2VuID0gaXRlcmF0b3Iuc3RlcEJhY2t3YXJkKCkpOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCiAgICANCiAgICB0aGlzLl9wb3AgPSBmdW5jdGlvbihzdGFjaywgdGFnKSB7DQogICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdmFyIHRvcCA9IHN0YWNrW3N0YWNrLmxlbmd0aC0xXTsNCiAgICAgICAgICAgIGlmICghdGFnIHx8IHRvcC50YWdOYW1lID09IHRhZy50YWdOYW1lKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnBvcCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52b2lkRWxlbWVudHNbdGFnLnRhZ05hbWVdKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52b2lkRWxlbWVudHNbdG9wLnRhZ05hbWVdKSB7DQogICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7DQogICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBmaXJzdFRhZyA9IHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lKHNlc3Npb24sIHJvdyk7DQogICAgICAgIA0KICAgICAgICBpZiAoIWZpcnN0VGFnLm1hdGNoKQ0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgIA0KICAgICAgICB2YXIgaXNCYWNrd2FyZCA9IGZpcnN0VGFnLmNsb3NpbmcgfHwgZmlyc3RUYWcuc2VsZkNsb3Npbmc7DQogICAgICAgIHZhciBzdGFjayA9IFtdOw0KICAgICAgICB2YXIgdGFnOw0KICAgICAgICANCiAgICAgICAgaWYgKCFpc0JhY2t3YXJkKSB7DQogICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcihzZXNzaW9uLCByb3csIGZpcnN0VGFnLmNvbHVtbik7DQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgcm93OiByb3csDQogICAgICAgICAgICAgICAgY29sdW1uOiBmaXJzdFRhZy5jb2x1bW4gKyBmaXJzdFRhZy50YWdOYW1lLmxlbmd0aCArIDINCiAgICAgICAgICAgIH07DQogICAgICAgICAgICB3aGlsZSAodGFnID0gdGhpcy5fcmVhZFRhZ0ZvcndhcmQoaXRlcmF0b3IpKSB7DQogICAgICAgICAgICAgICAgaWYgKHRhZy5zZWxmQ2xvc2luZykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0LmNvbHVtbiArPSB0YWcudGFnTmFtZS5sZW5ndGggKyAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRhZy5zdGFydCwgdGFnLmVuZCk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0YWcuY2xvc2luZykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3Aoc3RhY2ssIHRhZyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCB0YWcuc3RhcnQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0YWcpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbmV3IFRva2VuSXRlcmF0b3Ioc2Vzc2lvbiwgcm93LCBmaXJzdFRhZy5jb2x1bW4gKyBmaXJzdFRhZy5tYXRjaC5sZW5ndGgpOw0KICAgICAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IHJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IGZpcnN0VGFnLmNvbHVtbg0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgd2hpbGUgKHRhZyA9IHRoaXMuX3JlYWRUYWdCYWNrd2FyZChpdGVyYXRvcikpIHsNCiAgICAgICAgICAgICAgICBpZiAodGFnLnNlbGZDbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCB0YWcuZW5kKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCF0YWcuY2xvc2luZykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3Aoc3RhY2ssIHRhZyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0LmNvbHVtbiArPSB0YWcudGFnTmFtZS5sZW5ndGggKyAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCBlbmQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRhZykNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgfTsNCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTs7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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/PXMqc2NyaXB0XFxiKSIsbmV4dDoic2NyaXB0In0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjwoPz1zKnN0eWxlXFxiKSIsbmV4dDoic3R5bGUifSx7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPFxcLz8iLG5leHQ6InRhZyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46InRleHQiLHJlZ2V4OiJbXjxdKyJ9XSxjZGF0YTpbe3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxdXFxdPiIsbmV4dDoic3RhcnQifSx7dG9rZW46InRleHQiLG1lcmdlOiEwLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJ0ZXh0IixtZXJnZTohMCxyZWdleDoiLisifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/LS0+IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSxnLnRhZyh0aGlzLiRydWxlcywidGFnIiwic3RhcnQiKSxnLnRhZyh0aGlzLiRydWxlcywic3R5bGUiLCJjc3Mtc3RhcnQiKSxnLnRhZyh0aGlzLiRydWxlcywic2NyaXB0IiwianMtc3RhcnQiKSx0aGlzLmVtYmVkUnVsZXMoZiwianMtIixbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiooPz08XFwvc2NyaXB0PikiLG5leHQ6InRhZyJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8XFwvKD89c2NyaXB0KSIsbmV4dDoidGFnIn1dKSx0aGlzLmVtYmVkUnVsZXMoZSwiY3NzLSIsW3t0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8XFwvKD89c3R5bGUpIixuZXh0OiJ0YWcifV0pfTtkLmluaGVyaXRzKGksaCksYi5IdG1sSGlnaGxpZ2h0UnVsZXM9aX0pLGRlZmluZSgiYWNlL21vZGUveG1sX3V0aWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2xhbmciXSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZyhhKXtyZXR1cm5be3Rva2VuOiJzdHJpbmciLHJlZ2V4OiciLio/Iid9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDonWyJdLionLG5leHQ6YSsiX3Fxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiInLio/JyJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiWyddLioiLG5leHQ6YSsiX3FzdHJpbmcifV19ZnVuY3Rpb24gaChhLGIpe3JldHVyblt7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4qPyIrYSxuZXh0OmJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV19InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9sYW5nIiksZT1kLmFycmF5VG9NYXAoImJ1dHRvbnxmb3JtfGlucHV0fGxhYmVsfHNlbGVjdHx0ZXh0YXJlYSIuc3BsaXQoInwiKSksZj1kLmFycmF5VG9NYXAoInRhYmxlfHRib2R5fHRkfHRmb290fHRofHRyIi5zcGxpdCgifCIpKTtiLnRhZz1mdW5jdGlvbihhLGIsYyl7YVtiXT1be3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjpmdW5jdGlvbihhKXtyZXR1cm4gYT09PSJhIj8ibWV0YS50YWcuYW5jaG9yIjphPT09ImltZyI/Im1ldGEudGFnLmltYWdlIjphPT09InNjcmlwdCI/Im1ldGEudGFnLnNjcmlwdCI6YT09PSJzdHlsZSI/Im1ldGEudGFnLnN0eWxlIjplLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/Im1ldGEudGFnLmZvcm0iOmYuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT8ibWV0YS50YWcudGFibGUiOiJtZXRhLnRhZyJ9LG1lcmdlOiEwLHJlZ2V4OiJbLV9hLXpBLVowLTk6IV0rIixuZXh0OmIrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCJ9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6YisiX2VtYmVkX2F0dHJpYnV0ZV9saXN0In1dLGFbYisiX3FzdHJpbmciXT1oKCInIixiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QiKSxhW2IrIl9xcXN0cmluZyJdPWgoJyInLGIrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCIpLGFbYisiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Il09W3t0b2tlbjoibWV0YS50YWciLG1lcmdlOiEwLHJlZ2V4OiIvPz4iLG5leHQ6Y30se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiPSJ9LHt0b2tlbjoiZW50aXR5Lm90aGVyLmF0dHJpYnV0ZS1uYW1lIixyZWdleDoiWy1fYS16QS1aMC05Ol0rIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/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[ZGVmaW5lKCdhY2UvbW9kZS9qYXZhJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9qYXZhc2NyaXB0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvamF2YV9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgSmF2YVNjcmlwdE1vZGUgPSByZXF1aXJlKCIuL2phdmFzY3JpcHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBKYXZhSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YUhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIEphdmFTY3JpcHRNb2RlLmNhbGwodGhpcyk7DQogICAgDQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgSmF2YUhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIEphdmFTY3JpcHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3JhbmdlJywgJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBXb3JrZXJDbGllbnQgPSByZXF1aXJlKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudDsNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOw0KICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBDc3R5bGVCZWhhdmlvdXIoKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIHJlID0gL14oXHMqKVwvXC8vOw0KDQogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgew0KICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICIvLyIpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQoNCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7DQogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsNCiAgICAgICAgdmFyIGVuZFN0YXRlID0gdG9rZW5pemVkTGluZS5zdGF0ZTsNCg0KICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50Iikgew0KICAgICAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qXDp8W1x7XChcW10pXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSAiZG9jLXN0YXJ0Iikgew0KICAgICAgICAgICAgaWYgKGVuZFN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICIiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXlxzKihcLz8pXCovKTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIGlmIChtYXRjaFsxXSkgew0KICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiAiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiogIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXJDbGllbnQoWyJhY2UiXSwgIndvcmtlci1qYXZhc2NyaXB0LmpzIiwgImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwgIkphdmFTY3JpcHRXb3JrZXIiKTsNCiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsNCiAgICAgICAgICAgIA0KICAgICAgICB3b3JrZXIub24oImpzbGludCIsIGZ1bmN0aW9uKHJlc3VsdHMpIHsNCiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxyZXN1bHRzLmRhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSByZXN1bHRzLmRhdGFbaV07DQogICAgICAgICAgICAgICAgaWYgKGVycm9yKQ0KICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGVycm9yLmxpbmUtMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZXJyb3IuY2hhcmFjdGVyLTEsDQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvci5yZWFzb24sDQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICBsaW50OiBlcnJvcg0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICB3b3JrZXIub24oIm5hcmNpc3N1cyIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoW2UuZGF0YV0pOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigidGVybWluYXRlIiwgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBzZXNzaW9uLmNsZWFyQW5ub3RhdGlvbnMoKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gd29ya2VyOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL3VuaWNvZGUnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIHVuaWNvZGUgPSByZXF1aXJlKCIuLi91bmljb2RlIik7DQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cw0KICAgIHZhciBnbG9iYWxzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgLy8gQ29uc3RydWN0b3JzDQogICAgICAgICgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXwiICsNCiAgICAgIC8vIEU0WA0KICAgICAgICAgIk5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHwiICsNCiAgICAgICAgICJBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8IiArDQogICAgICAgICAiVWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXwiICsNCiAgICAgIC8vIEVycm9ycw0KICAgICAgICAiRXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufCIgKw0KICAgICAgICAiU3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfCIgKw0KICAgICAgLy8gIE5vbi1jb25zdHJ1Y3RvciBmdW5jdGlvbnMNCiAgICAgICAgImRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfCIgKw0KICAgICAgICAiaXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHwiICsNCiAgICAgIC8vIE90aGVyDQogICAgICAgICJKU09OfE1hdGh8IiArDQogICAgICAvLyBQc2V1ZG8NCiAgICAgICAgInRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiDQogICAgICApLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnwiICsNCiAgICAgICAgImlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8IiArDQogICAgICAgICJjb25zdHx5aWVsZHxpbXBvcnR8Z2V0fHNldCIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8ga2V5d29yZHMgd2hpY2ggY2FuIGJlIGZvbGxvd2VkIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbnMNCiAgICB2YXIga3dCZWZvcmVSZSA9ICJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIjsNCg0KICAgIHZhciBkZXByZWNhdGVkID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIl9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fXyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGRlZmluaXRpb25zID0gbGFuZy5hcnJheVRvTWFwKCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIpLnNwbGl0KCJ8IikpOw0KDQogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZnV0dXJlUmVzZXJ2ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8IiArDQogICAgICAgICJwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzDQogICAgdmFyIGlkZW50aWZpZXJSZSA9ICJbIiArIHVuaWNvZGUucGFja2FnZXMuTCArICJcXCRfXVsiIA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTW4gKyB1bmljb2RlLnBhY2thZ2VzLk1jDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5OZA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuUGMgKyAiXFwkX10qXFxiIjsNCiAgICAgICAgDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0uKlxcXFwkJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInFxc3RyaW5nIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogWyJrZXl3b3JkLmRlZmluaXRpb24iLCAidGV4dCIsICJlbnRpdHkubmFtZS5mdW5jdGlvbiJdLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIihmdW5jdGlvbikoXFxzKykoIiArIGlkZW50aWZpZXJSZSArICIpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OiIgKyBrd0JlZm9yZVJlICsgIilcXGIiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXByZWNhdGVkLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmaW5pdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkLmRlZmluaXRpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJkZWJ1Z2dlciIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZWdleCA6IGlkZW50aWZpZXJSZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwdW5jdHVhdGlvbi5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFw7fFxcLiIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC89PyIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXiMhLiokIiANCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBvbmx5IGFsbG93ZWQgYWZ0ZXIgY2VydGFpbiB0b2tlbnMuIFRoaXMNCiAgICAgICAgLy8gbWFrZXMgc3VyZSB3ZSBkb24ndCBtaXggdXAgcmVnZXhwcyB3aXRoIHRoZSBkaXZpc29uIG9wZXJhdG9yDQogICAgICAgICJyZWdleF9hbGxvd2VkIjogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnRfcmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcLyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmV0dXJuIHRvIHRoZSBzdGFydCBtb2RlIHdpdGhvdXQgbWF0Y2hpbmcNCiAgICAgICAgICAgICAgICAvLyBhbnl0aGluZw0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0Ig0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicmVnZXgiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4Ig0KICAgICAgICAgICAgfSwgew0KCQkJCS8vIGZsYWcNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLCANCiAgICAgICAgICAgICAgICByZWdleDogIi9cXHcqIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlIA0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJbXlxcXFwvXFxbXSsiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcWyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImVtcHR5IiwgDQogICAgICAgICAgICAgICAgcmVnZXg6ICIiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIgDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIl0iLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXFxcXV0rIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiANCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgImNvbW1lbnRfcmVnZXhfYWxsb3dlZCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLA0KICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jLnRhZyIsDQogICAgICAgICAgICByZWdleCA6ICJAW1xcd1xcZF9dKyIgLy8gVE9ETzogZml4IGVtYWlsIGFkZHJlc3Nlcw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJUT0RPIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJbXkBcXCpdKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLiINCiAgICAgICAgfV0NCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBkb2MgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqKD89XFwqKSIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXCpcXC8iLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQoNCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOw0KDQogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7DQogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7DQoNCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KDQp2YXIgV29ya2VyQ2xpZW50ID0gZnVuY3Rpb24odG9wTGV2ZWxOYW1lc3BhY2VzLCBwYWNrYWdlZEpzLCBtb2QsIGNsYXNzbmFtZSkgew0KDQogICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IHRoaXMuY2hhbmdlTGlzdGVuZXIuYmluZCh0aGlzKTsNCg0KICAgIGlmIChtb2R1bGUucGFja2FnZWQpIHsNCiAgICAgICAgdmFyIGJhc2UgPSB0aGlzLiRndWVzc0Jhc2VQYXRoKCk7DQogICAgICAgIHRoaXMuJHdvcmtlciA9IG5ldyBXb3JrZXIoYmFzZSArIHBhY2thZ2VkSnMpOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgdmFyIHdvcmtlclVybCA9IHRoaXMuJG5vcm1hbGl6ZVBhdGgocmVxdWlyZS5uYW1lVG9VcmwoImFjZS93b3JrZXIvd29ya2VyIiwgbnVsbCwgIl8iKSk7DQogICAgICAgIHRoaXMuJHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyVXJsKTsNCg0KICAgICAgICB2YXIgdGxucyA9IHt9Ow0KICAgICAgICBmb3IgKHZhciBpPTA7IGk8dG9wTGV2ZWxOYW1lc3BhY2VzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXNbaV07DQogICAgICAgICAgICB2YXIgcGF0aCA9IHRoaXMuJG5vcm1hbGl6ZVBhdGgocmVxdWlyZS5uYW1lVG9VcmwobnMsIG51bGwsICJfIikucmVwbGFjZSgvLmpzJC8sICIiKSk7DQoNCiAgICAgICAgICAgIHRsbnNbbnNdID0gcGF0aDsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7DQogICAgICAgIGluaXQgOiB0cnVlLA0KICAgICAgICB0bG5zOiB0bG5zLA0KICAgICAgICBtb2R1bGU6IG1vZCwNCiAgICAgICAgY2xhc3NuYW1lOiBjbGFzc25hbWUNCiAgICB9KTsNCg0KICAgIHRoaXMuY2FsbGJhY2tJZCA9IDE7DQogICAgdGhpcy5jYWxsYmFja3MgPSB7fTsNCg0KICAgIHZhciBfc2VsZiA9IHRoaXM7DQogICAgdGhpcy4kd29ya2VyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICYmIGNvbnNvbGUubG9nKGUpOw0KICAgICAgICB0aHJvdyBlOw0KICAgIH07DQogICAgdGhpcy4kd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIG1zZyA9IGUuZGF0YTsNCiAgICAgICAgc3dpdGNoKG1zZy50eXBlKSB7DQogICAgICAgICAgICBjYXNlICJsb2ciOg0KICAgICAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICYmIGNvbnNvbGUubG9nKG1zZy5kYXRhKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgY2FzZSAiZXZlbnQiOg0KICAgICAgICAgICAgICAgIF9zZWxmLl9lbWl0KG1zZy5uYW1lLCB7ZGF0YTogbXNnLmRhdGF9KTsNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgY2FzZSAiY2FsbCI6DQogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07DQogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7DQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1zZy5kYXRhKTsNCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIF9zZWxmLmNhbGxiYWNrc1ttc2cuaWRdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH07DQp9Ow0KDQooZnVuY3Rpb24oKXsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCg0KICAgIHRoaXMuJG5vcm1hbGl6ZVBhdGggPSBmdW5jdGlvbihwYXRoKSB7DQogICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15bYS16XSs6XC9cL1teXC9dK1wvLywgIiIpOyAvLyBSZW1vdmUgZG9tYWluIG5hbWUgYW5kIHJlYnVpbGQgaXQNCiAgICAgICAgcGF0aCA9IGxvY2F0aW9uLnByb3RvY29sICsgIi8vIiArIGxvY2F0aW9uLmhvc3QNCiAgICAgICAgICAgIC8vIHBhdGhzIHN0YXJ0aW5nIHdpdGggYSBzbGFzaCBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgKGhvc3QpDQogICAgICAgICAgICArIChwYXRoLmNoYXJBdCgwKSA9PSAiLyIgPyAiIiA6IGxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1wvW15cL10qJC8sICIiKSkNCiAgICAgICAgICAgICsgIi8iICsgcGF0aC5yZXBsYWNlKC9eW1wvXSsvLCAiIik7DQogICAgICAgIHJldHVybiBwYXRoOw0KICAgIH07DQoNCiAgICB0aGlzLiRndWVzc0Jhc2VQYXRoID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmIChyZXF1aXJlLmFjZUJhc2VVcmwpDQogICAgICAgICAgICByZXR1cm4gcmVxdWlyZS5hY2VCYXNlVXJsOw0KDQogICAgICAgIHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpOw0KICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2NyaXB0cy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIHNjcmlwdCA9IHNjcmlwdHNbaV07DQoNCiAgICAgICAgICAgIHZhciBiYXNlID0gc2NyaXB0LmdldEF0dHJpYnV0ZSgiZGF0YS1hY2UtYmFzZSIpOw0KICAgICAgICAgICAgaWYgKGJhc2UpDQogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UucmVwbGFjZSgvXC8qJC8sICIvIik7DQoNCiAgICAgICAgICAgIHZhciBzcmMgPSBzY3JpcHQuc3JjIHx8IHNjcmlwdC5nZXRBdHRyaWJ1dGUoInNyYyIpOw0KICAgICAgICAgICAgaWYgKCFzcmMpIHsNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBtID0gc3JjLm1hdGNoKC9eKD86KC4qXC8pYWNlXC5qc3woLipcLylhY2UoLXVuY29tcHJlc3NlZCk/KC1ub2NvbmZsaWN0KT9cLmpzKSg/Olw/fCQpLyk7DQogICAgICAgICAgICBpZiAobSkNCiAgICAgICAgICAgICAgICByZXR1cm4gbVsxXSB8fCBtWzJdOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQogICAgdGhpcy50ZXJtaW5hdGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5fZW1pdCgidGVybWluYXRlIiwge30pOw0KICAgICAgICB0aGlzLiR3b3JrZXIudGVybWluYXRlKCk7DQogICAgICAgIHRoaXMuJHdvcmtlciA9IG51bGw7DQogICAgICAgIHRoaXMuJGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsNCiAgICAgICAgdGhpcy4kZG9jID0gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5zZW5kID0gZnVuY3Rpb24oY21kLCBhcmdzKSB7DQogICAgICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7Y29tbWFuZDogY21kLCBhcmdzOiBhcmdzfSk7DQogICAgfTsNCg0KICAgIHRoaXMuY2FsbCA9IGZ1bmN0aW9uKGNtZCwgYXJncywgY2FsbGJhY2spIHsNCiAgICAgICAgaWYgKGNhbGxiYWNrKSB7DQogICAgICAgICAgICB2YXIgaWQgPSB0aGlzLmNhbGxiYWNrSWQrKzsNCiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzW2lkXSA9IGNhbGxiYWNrOw0KICAgICAgICAgICAgYXJncy5wdXNoKGlkKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnNlbmQoY21kLCBhcmdzKTsNCiAgICB9Ow0KDQogICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIC8vIGZpcmVmb3ggcmVmdXNlcyB0byBjbG9uZSBvYmplY3RzIHdoaWNoIGhhdmUgZnVuY3Rpb24gcHJvcGVydGllcw0KICAgICAgICAgICAgLy8gVE9ETzogY2xlYW51cCBldmVudA0KICAgICAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtldmVudDogZXZlbnQsIGRhdGE6IHtkYXRhOiBkYXRhLmRhdGF9fSk7DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2goZXgpIHt9DQogICAgfTsNCg0KICAgIHRoaXMuYXR0YWNoVG9Eb2N1bWVudCA9IGZ1bmN0aW9uKGRvYykgew0KICAgICAgICBpZih0aGlzLiRkb2MpDQogICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZSgpOw0KDQogICAgICAgIHRoaXMuJGRvYyA9IGRvYzsNCiAgICAgICAgdGhpcy5jYWxsKCJzZXRWYWx1ZSIsIFtkb2MuZ2V0VmFsdWUoKV0pOw0KICAgICAgICBkb2Mub24oImNoYW5nZSIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOw0KICAgIH07DQoNCiAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gZnVuY3Rpb24oZSkgew0KICAgICAgICBlLnJhbmdlID0gew0KICAgICAgICAgICAgc3RhcnQ6IGUuZGF0YS5yYW5nZS5zdGFydCwNCiAgICAgICAgICAgIGVuZDogZS5kYXRhLnJhbmdlLmVuZA0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmVtaXQoImNoYW5nZSIsIGUpOw0KICAgIH07DQoNCn0pLmNhbGwoV29ya2VyQ2xpZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuV29ya2VyQ2xpZW50ID0gV29ya2VyQ2xpZW50Ow0KDQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvYmVoYXZpb3VyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoJy4uL2JlaGF2aW91cicpLkJlaGF2aW91cjsNCg0KdmFyIENzdHlsZUJlaGF2aW91ciA9IGZ1bmN0aW9uICgpIHsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAne30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9Jykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCd9Jywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7DQogICAgICAgICAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MpDQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCg0KICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLmdldE5leHRMaW5lSW5kZW50KHN0YXRlLCBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCAtIDEpLCBzZXNzaW9uLmdldFRhYlN0cmluZygpKTsNCiAgICAgICAgICAgICAgICB2YXIgbmV4dF9pbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXG4nICsgaW5kZW50ICsgJ1xuJyArIG5leHRfaW5kZW50LA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLmVuZC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICcoJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJyknLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIicgKyBzZWxlY3RlZCArICciJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgICAgICB2YXIgbGVmdENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLTEsIGN1cnNvci5jb2x1bW4pOw0KDQogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4NCiAgICAgICAgICAgICAgICBpZiAobGVmdENoYXIgPT0gJ1xcJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBGaW5kIHdoYXQgdG9rZW4gd2UncmUgaW5zaWRlLg0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7DQogICAgICAgICAgICAgICAgdmFyIGNvbCA9IDAsIHRva2VuOw0KICAgICAgICAgICAgICAgIHZhciBxdW90ZXBvcyA9IC0xOyAvLyBUcmFjayB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhbiBvcGVuIHF1b3RlLg0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0b2tlbnMubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbeF07DQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdW90ZXBvcyA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRva2VuLnZhbHVlLmxlbmd0aCArIGNvbCkgPiBzZWxlY3Rpb24uc3RhcnQuY29sdW1uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb2wgKz0gdG9rZW5zW3hdLnZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBUcnkgYW5kIGJlIHNtYXJ0IGFib3V0IHdoZW4gd2UgYXV0byBpbnNlcnQuDQogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIiInLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLg0KICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQp9DQpvb3AuaW5oZXJpdHMoQ3N0eWxlQmVoYXZpb3VyLCBCZWhhdmlvdXIpOw0KDQpleHBvcnRzLkNzdHlsZUJlaGF2aW91ciA9IENzdHlsZUJlaGF2aW91cjsNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSAvXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS87DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4Ow0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMV0pDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBpKTsNCg0KICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7DQogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgew0KICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkpOw0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07DQogICAgICAgICAgICB2YXIgc3RhcnQgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQobWF0Y2hbMV0sIGVuZCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICghc3RhcnQpDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4tLTsNCg0KICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgICAgICB9DQogICAgfTsNCiAgICANCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gbnVsbDsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsNCg0KICAgIC8vIG11c3QgcmV0dXJuICIiIGlmIHRoZXJlJ3Mgbm8gZm9sZCwgdG8gZW5hYmxlIGNhY2hpbmcNCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICBpZiAodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOw0KICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlcg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHJlID0gL15ccyovOw0KICAgICAgICB2YXIgc3RhcnRSb3cgPSByb3c7DQogICAgICAgIHZhciBlbmRSb3cgPSByb3c7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBzdGFydENvbHVtbiA9IGNvbHVtbiB8fCBsaW5lLmxlbmd0aDsNCiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpDQogICAgICAgIA0KICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsNCiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgICAgIHZhciBsZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgZW5kUm93ID0gcm93Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7DQogICAgICAgICAgICB2YXIgZW5kQ29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZFJvdykubGVuZ3RoOw0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1uICsgMX07DQogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOw0KICAgICAgICBpZiAoIWVuZCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOw0KICAgICAgICBpZiAoZncgPT0gbnVsbCkNCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOw0KDQogICAgICAgIGlmIChmdyA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICBlbmQucm93IC0tOw0KICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgfTsNCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsNCmRlZmluZSgnYWNlL21vZGUvamF2YV9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIEphdmFIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gdGFrZW4gZnJvbSBodHRwOi8vZG93bmxvYWQub3JhY2xlLmNvbS9qYXZhc2UvdHV0b3JpYWwvamF2YS9udXRzYW5kYm9sdHMvX2tleXdvcmRzLmh0bWwNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgKCJhYnN0cmFjdHxjb250aW51ZXxmb3J8bmV3fHN3aXRjaHwiICsNCiAgICAiYXNzZXJ0fGRlZmF1bHR8Z290b3xwYWNrYWdlfHN5bmNocm9uaXplZHwiICsNCiAgICAiYm9vbGVhbnxkb3xpZnxwcml2YXRlfHRoaXN8IiArDQogICAgImJyZWFrfGRvdWJsZXxpbXBsZW1lbnRzfHByb3RlY3RlZHx0aHJvd3wiICsNCiAgICAiYnl0ZXxlbHNlfGltcG9ydHxwdWJsaWN8dGhyb3dzfCIgKw0KICAgICJjYXNlfGVudW18aW5zdGFuY2VvZnxyZXR1cm58dHJhbnNpZW50fCIgKw0KICAgICJjYXRjaHxleHRlbmRzfGludHxzaG9ydHx0cnl8IiArDQogICAgImNoYXJ8ZmluYWx8aW50ZXJmYWNlfHN0YXRpY3x2b2lkfCIgKw0KICAgICJjbGFzc3xmaW5hbGx5fGxvbmd8c3RyaWN0ZnB8dm9sYXRpbGV8IiArDQogICAgImNvbnN0fGZsb2F0fG5hdGl2ZXxzdXBlcnx3aGlsZSIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgbGFuZ0NsYXNzZXMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiQWJzdHJhY3RNZXRob2RFcnJvcnxBc3NlcnRpb25FcnJvcnxDbGFzc0NpcmN1bGFyaXR5RXJyb3J8IisNCiAgICAgICAgIkNsYXNzRm9ybWF0RXJyb3J8RGVwcmVjYXRlZHxFbnVtQ29uc3RhbnROb3RQcmVzZW50RXhjZXB0aW9ufCIrDQogICAgICAgICJFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3J8SWxsZWdhbEFjY2Vzc0Vycm9yfCIrDQogICAgICAgICJJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb258SW5zdGFudGlhdGlvbkVycm9yfEludGVybmFsRXJyb3J8IisNCiAgICAgICAgIk5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9ufE5vU3VjaEZpZWxkRXJyb3J8T3ZlcnJpZGV8UHJvY2Vzc3wiKw0KICAgICAgICAiUHJvY2Vzc0J1aWxkZXJ8U2VjdXJpdHlNYW5hZ2VyfFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258IisNCiAgICAgICAgIlN1cHByZXNzV2FybmluZ3N8VHlwZU5vdFByZXNlbnRFeGNlcHRpb258VW5rbm93bkVycm9yfCIrDQogICAgICAgICJVbnNhdGlzZmllZExpbmtFcnJvcnxVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yfFZlcmlmeUVycm9yfCIrDQogICAgICAgICJJbnN0YW50aWF0aW9uRXhjZXB0aW9ufEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258IisNCiAgICAgICAgIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnxDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbnwiKw0KICAgICAgICAiTm9TdWNoRmllbGRFeGNlcHRpb258SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufE51bWJlckZvcm1hdEV4Y2VwdGlvbnwiKw0KICAgICAgICAiU2VjdXJpdHlFeGNlcHRpb258Vm9pZHxJbmhlcml0YWJsZVRocmVhZExvY2FsfElsbGVnYWxTdGF0ZUV4Y2VwdGlvbnwiKw0KICAgICAgICAiSW50ZXJydXB0ZWRFeGNlcHRpb258Tm9TdWNoTWV0aG9kRXhjZXB0aW9ufElsbGVnYWxBY2Nlc3NFeGNlcHRpb258IisNCiAgICAgICAgIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufEVudW18U3RyaWN0TWF0aHxQYWNrYWdlfENvbXBpbGVyfCIrDQogICAgICAgICJSZWFkYWJsZXxSdW50aW1lfFN0cmluZ0J1aWxkZXJ8TWF0aHxJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yfCIrDQogICAgICAgICJOb1N1Y2hNZXRob2RFcnJvcnxUaHJlYWRMb2NhbHxSdW50aW1lUGVybWlzc2lvbnxBcml0aG1ldGljRXhjZXB0aW9ufCIrDQogICAgICAgICJOdWxsUG9pbnRlckV4Y2VwdGlvbnxMb25nfEludGVnZXJ8U2hvcnR8Qnl0ZXxEb3VibGV8TnVtYmVyfEZsb2F0fCIrDQogICAgICAgICJDaGFyYWN0ZXJ8Qm9vbGVhbnxTdGFja1RyYWNlRWxlbWVudHxBcHBlbmRhYmxlfFN0cmluZ0J1ZmZlcnwiKw0KICAgICAgICAiSXRlcmFibGV8VGhyZWFkR3JvdXB8UnVubmFibGV8VGhyZWFkfElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb258IisNCiAgICAgICAgIlN0YWNrT3ZlcmZsb3dFcnJvcnxPdXRPZk1lbW9yeUVycm9yfFZpcnR1YWxNYWNoaW5lRXJyb3J8IisNCiAgICAgICAgIkFycmF5U3RvcmVFeGNlcHRpb258Q2xhc3NDYXN0RXhjZXB0aW9ufExpbmthZ2VFcnJvcnwiKw0KICAgICAgICAiTm9DbGFzc0RlZkZvdW5kRXJyb3J8Q2xhc3NOb3RGb3VuZEV4Y2VwdGlvbnxSdW50aW1lRXhjZXB0aW9ufCIrDQogICAgICAgICJFeGNlcHRpb258VGhyZWFkRGVhdGh8RXJyb3J8VGhyb3dhYmxlfFN5c3RlbXxDbGFzc0xvYWRlcnwiKw0KICAgICAgICAiQ2xvbmVhYmxlfENsYXNzfENoYXJTZXF1ZW5jZXxDb21wYXJhYmxlfFN0cmluZ3xPYmplY3QiKS5zcGxpdCgifCIpDQogICAgKTsNCiAgICANCiAgICB2YXIgaW1wb3J0Q2xhc3NlcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCIiKS5zcGxpdCgifCIpDQogICAgKTsNCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWy9dKD86KD86XFxbKD86XFxcXF18W15cXF1dKStcXF0pfCg/OlxcXFwvfFteXFxdL10pKSpbL11cXHcqXFxzKig/PVspLiw7XXwkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgNCiAgICAgICAgICAgICAgICByZWdleCA6ICIwW3hYXVswLTlhLWZBLUZdK1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzp0cnVlfGZhbHNlKVxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAidGhpcyIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGFuZ0NsYXNzZXMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW1wb3J0Q2xhc3Nlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzDQogICAgICAgICAgICAgICAgLy8gVE9ETzogVW5pY29kZSBpZGVudGlmaWVycw0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAibHBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbWyh7XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJycGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfV0iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgImNvbW1lbnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLA0KICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEphdmFIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5KYXZhSGlnaGxpZ2h0UnVsZXMgPSBKYXZhSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3JhbmdlJywgJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBXb3JrZXJDbGllbnQgPSByZXF1aXJlKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudDsNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOw0KICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBDc3R5bGVCZWhhdmlvdXIoKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIHJlID0gL14oXHMqKVwvXC8vOw0KDQogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgew0KICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICIvLyIpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQoNCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7DQogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsNCiAgICAgICAgdmFyIGVuZFN0YXRlID0gdG9rZW5pemVkTGluZS5zdGF0ZTsNCg0KICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50Iikgew0KICAgICAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qXDp8W1x7XChcW10pXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSAiZG9jLXN0YXJ0Iikgew0KICAgICAgICAgICAgaWYgKGVuZFN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICIiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXlxzKihcLz8pXCovKTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIGlmIChtYXRjaFsxXSkgew0KICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiAiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiogIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXJDbGllbnQoWyJhY2UiXSwgIndvcmtlci1qYXZhc2NyaXB0LmpzIiwgImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwgIkphdmFTY3JpcHRXb3JrZXIiKTsNCiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsNCiAgICAgICAgICAgIA0KICAgICAgICB3b3JrZXIub24oImpzbGludCIsIGZ1bmN0aW9uKHJlc3VsdHMpIHsNCiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxyZXN1bHRzLmRhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSByZXN1bHRzLmRhdGFbaV07DQogICAgICAgICAgICAgICAgaWYgKGVycm9yKQ0KICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGVycm9yLmxpbmUtMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZXJyb3IuY2hhcmFjdGVyLTEsDQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvci5yZWFzb24sDQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICBsaW50OiBlcnJvcg0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICB3b3JrZXIub24oIm5hcmNpc3N1cyIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoW2UuZGF0YV0pOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigidGVybWluYXRlIiwgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBzZXNzaW9uLmNsZWFyQW5ub3RhdGlvbnMoKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gd29ya2VyOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL3VuaWNvZGUnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIHVuaWNvZGUgPSByZXF1aXJlKCIuLi91bmljb2RlIik7DQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cw0KICAgIHZhciBnbG9iYWxzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgLy8gQ29uc3RydWN0b3JzDQogICAgICAgICgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXwiICsNCiAgICAgIC8vIEU0WA0KICAgICAgICAgIk5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHwiICsNCiAgICAgICAgICJBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8IiArDQogICAgICAgICAiVWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXwiICsNCiAgICAgIC8vIEVycm9ycw0KICAgICAgICAiRXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufCIgKw0KICAgICAgICAiU3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfCIgKw0KICAgICAgLy8gIE5vbi1jb25zdHJ1Y3RvciBmdW5jdGlvbnMNCiAgICAgICAgImRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfCIgKw0KICAgICAgICAiaXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHwiICsNCiAgICAgIC8vIE90aGVyDQogICAgICAgICJKU09OfE1hdGh8IiArDQogICAgICAvLyBQc2V1ZG8NCiAgICAgICAgInRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiDQogICAgICApLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnwiICsNCiAgICAgICAgImlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8IiArDQogICAgICAgICJjb25zdHx5aWVsZHxpbXBvcnR8Z2V0fHNldCIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8ga2V5d29yZHMgd2hpY2ggY2FuIGJlIGZvbGxvd2VkIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbnMNCiAgICB2YXIga3dCZWZvcmVSZSA9ICJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIjsNCg0KICAgIHZhciBkZXByZWNhdGVkID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIl9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fXyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGRlZmluaXRpb25zID0gbGFuZy5hcnJheVRvTWFwKCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIpLnNwbGl0KCJ8IikpOw0KDQogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZnV0dXJlUmVzZXJ2ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8IiArDQogICAgICAgICJwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzDQogICAgdmFyIGlkZW50aWZpZXJSZSA9ICJbIiArIHVuaWNvZGUucGFja2FnZXMuTCArICJcXCRfXVsiIA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTW4gKyB1bmljb2RlLnBhY2thZ2VzLk1jDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5OZA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuUGMgKyAiXFwkX10qXFxiIjsNCiAgICAgICAgDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0uKlxcXFwkJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInFxc3RyaW5nIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogWyJrZXl3b3JkLmRlZmluaXRpb24iLCAidGV4dCIsICJlbnRpdHkubmFtZS5mdW5jdGlvbiJdLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIihmdW5jdGlvbikoXFxzKykoIiArIGlkZW50aWZpZXJSZSArICIpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OiIgKyBrd0JlZm9yZVJlICsgIilcXGIiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXByZWNhdGVkLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmaW5pdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkLmRlZmluaXRpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJkZWJ1Z2dlciIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZWdleCA6IGlkZW50aWZpZXJSZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwdW5jdHVhdGlvbi5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFw7fFxcLiIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC89PyIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXiMhLiokIiANCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBvbmx5IGFsbG93ZWQgYWZ0ZXIgY2VydGFpbiB0b2tlbnMuIFRoaXMNCiAgICAgICAgLy8gbWFrZXMgc3VyZSB3ZSBkb24ndCBtaXggdXAgcmVnZXhwcyB3aXRoIHRoZSBkaXZpc29uIG9wZXJhdG9yDQogICAgICAgICJyZWdleF9hbGxvd2VkIjogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnRfcmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcLyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmV0dXJuIHRvIHRoZSBzdGFydCBtb2RlIHdpdGhvdXQgbWF0Y2hpbmcNCiAgICAgICAgICAgICAgICAvLyBhbnl0aGluZw0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0Ig0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicmVnZXgiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4Ig0KICAgICAgICAgICAgfSwgew0KCQkJCS8vIGZsYWcNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLCANCiAgICAgICAgICAgICAgICByZWdleDogIi9cXHcqIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlIA0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJbXlxcXFwvXFxbXSsiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcWyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImVtcHR5IiwgDQogICAgICAgICAgICAgICAgcmVnZXg6ICIiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIgDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIl0iLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXFxcXV0rIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiANCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgImNvbW1lbnRfcmVnZXhfYWxsb3dlZCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLA0KICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jLnRhZyIsDQogICAgICAgICAgICByZWdleCA6ICJAW1xcd1xcZF9dKyIgLy8gVE9ETzogZml4IGVtYWlsIGFkZHJlc3Nlcw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJUT0RPIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJbXkBcXCpdKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLiINCiAgICAgICAgfV0NCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBkb2MgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqKD89XFwqKSIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXCpcXC8iLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQoNCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOw0KDQogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7DQogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7DQoNCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KDQp2YXIgV29ya2VyQ2xpZW50ID0gZnVuY3Rpb24odG9wTGV2ZWxOYW1lc3BhY2VzLCBwYWNrYWdlZEpzLCBtb2QsIGNsYXNzbmFtZSkgew0KDQogICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IHRoaXMuY2hhbmdlTGlzdGVuZXIuYmluZCh0aGlzKTsNCg0KICAgIGlmIChtb2R1bGUucGFja2FnZWQpIHsNCiAgICAgICAgdmFyIGJhc2UgPSB0aGlzLiRndWVzc0Jhc2VQYXRoKCk7DQogICAgICAgIHRoaXMuJHdvcmtlciA9IG5ldyBXb3JrZXIoYmFzZSArIHBhY2thZ2VkSnMpOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgdmFyIHdvcmtlclVybCA9IHRoaXMuJG5vcm1hbGl6ZVBhdGgocmVxdWlyZS5uYW1lVG9VcmwoImFjZS93b3JrZXIvd29ya2VyIiwgbnVsbCwgIl8iKSk7DQogICAgICAgIHRoaXMuJHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyVXJsKTsNCg0KICAgICAgICB2YXIgdGxucyA9IHt9Ow0KICAgICAgICBmb3IgKHZhciBpPTA7IGk8dG9wTGV2ZWxOYW1lc3BhY2VzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXNbaV07DQogICAgICAgICAgICB2YXIgcGF0aCA9IHRoaXMuJG5vcm1hbGl6ZVBhdGgocmVxdWlyZS5uYW1lVG9VcmwobnMsIG51bGwsICJfIikucmVwbGFjZSgvLmpzJC8sICIiKSk7DQoNCiAgICAgICAgICAgIHRsbnNbbnNdID0gcGF0aDsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7DQogICAgICAgIGluaXQgOiB0cnVlLA0KICAgICAgICB0bG5zOiB0bG5zLA0KICAgICAgICBtb2R1bGU6IG1vZCwNCiAgICAgICAgY2xhc3NuYW1lOiBjbGFzc25hbWUNCiAgICB9KTsNCg0KICAgIHRoaXMuY2FsbGJhY2tJZCA9IDE7DQogICAgdGhpcy5jYWxsYmFja3MgPSB7fTsNCg0KICAgIHZhciBfc2VsZiA9IHRoaXM7DQogICAgdGhpcy4kd29ya2VyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICYmIGNvbnNvbGUubG9nKGUpOw0KICAgICAgICB0aHJvdyBlOw0KICAgIH07DQogICAgdGhpcy4kd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIG1zZyA9IGUuZGF0YTsNCiAgICAgICAgc3dpdGNoKG1zZy50eXBlKSB7DQogICAgICAgICAgICBjYXNlICJsb2ciOg0KICAgICAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICYmIGNvbnNvbGUubG9nKG1zZy5kYXRhKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgY2FzZSAiZXZlbnQiOg0KICAgICAgICAgICAgICAgIF9zZWxmLl9lbWl0KG1zZy5uYW1lLCB7ZGF0YTogbXNnLmRhdGF9KTsNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgY2FzZSAiY2FsbCI6DQogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07DQogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7DQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1zZy5kYXRhKTsNCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIF9zZWxmLmNhbGxiYWNrc1ttc2cuaWRdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH07DQp9Ow0KDQooZnVuY3Rpb24oKXsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCg0KICAgIHRoaXMuJG5vcm1hbGl6ZVBhdGggPSBmdW5jdGlvbihwYXRoKSB7DQogICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15bYS16XSs6XC9cL1teXC9dK1wvLywgIiIpOyAvLyBSZW1vdmUgZG9tYWluIG5hbWUgYW5kIHJlYnVpbGQgaXQNCiAgICAgICAgcGF0aCA9IGxvY2F0aW9uLnByb3RvY29sICsgIi8vIiArIGxvY2F0aW9uLmhvc3QNCiAgICAgICAgICAgIC8vIHBhdGhzIHN0YXJ0aW5nIHdpdGggYSBzbGFzaCBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgKGhvc3QpDQogICAgICAgICAgICArIChwYXRoLmNoYXJBdCgwKSA9PSAiLyIgPyAiIiA6IGxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1wvW15cL10qJC8sICIiKSkNCiAgICAgICAgICAgICsgIi8iICsgcGF0aC5yZXBsYWNlKC9eW1wvXSsvLCAiIik7DQogICAgICAgIHJldHVybiBwYXRoOw0KICAgIH07DQoNCiAgICB0aGlzLiRndWVzc0Jhc2VQYXRoID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmIChyZXF1aXJlLmFjZUJhc2VVcmwpDQogICAgICAgICAgICByZXR1cm4gcmVxdWlyZS5hY2VCYXNlVXJsOw0KDQogICAgICAgIHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpOw0KICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2NyaXB0cy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIHNjcmlwdCA9IHNjcmlwdHNbaV07DQoNCiAgICAgICAgICAgIHZhciBiYXNlID0gc2NyaXB0LmdldEF0dHJpYnV0ZSgiZGF0YS1hY2UtYmFzZSIpOw0KICAgICAgICAgICAgaWYgKGJhc2UpDQogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UucmVwbGFjZSgvXC8qJC8sICIvIik7DQoNCiAgICAgICAgICAgIHZhciBzcmMgPSBzY3JpcHQuc3JjIHx8IHNjcmlwdC5nZXRBdHRyaWJ1dGUoInNyYyIpOw0KICAgICAgICAgICAgaWYgKCFzcmMpIHsNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBtID0gc3JjLm1hdGNoKC9eKD86KC4qXC8pYWNlXC5qc3woLipcLylhY2UoLXVuY29tcHJlc3NlZCk/KC1ub2NvbmZsaWN0KT9cLmpzKSg/Olw/fCQpLyk7DQogICAgICAgICAgICBpZiAobSkNCiAgICAgICAgICAgICAgICByZXR1cm4gbVsxXSB8fCBtWzJdOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQogICAgdGhpcy50ZXJtaW5hdGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5fZW1pdCgidGVybWluYXRlIiwge30pOw0KICAgICAgICB0aGlzLiR3b3JrZXIudGVybWluYXRlKCk7DQogICAgICAgIHRoaXMuJHdvcmtlciA9IG51bGw7DQogICAgICAgIHRoaXMuJGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsNCiAgICAgICAgdGhpcy4kZG9jID0gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5zZW5kID0gZnVuY3Rpb24oY21kLCBhcmdzKSB7DQogICAgICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7Y29tbWFuZDogY21kLCBhcmdzOiBhcmdzfSk7DQogICAgfTsNCg0KICAgIHRoaXMuY2FsbCA9IGZ1bmN0aW9uKGNtZCwgYXJncywgY2FsbGJhY2spIHsNCiAgICAgICAgaWYgKGNhbGxiYWNrKSB7DQogICAgICAgICAgICB2YXIgaWQgPSB0aGlzLmNhbGxiYWNrSWQrKzsNCiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzW2lkXSA9IGNhbGxiYWNrOw0KICAgICAgICAgICAgYXJncy5wdXNoKGlkKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnNlbmQoY21kLCBhcmdzKTsNCiAgICB9Ow0KDQogICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIC8vIGZpcmVmb3ggcmVmdXNlcyB0byBjbG9uZSBvYmplY3RzIHdoaWNoIGhhdmUgZnVuY3Rpb24gcHJvcGVydGllcw0KICAgICAgICAgICAgLy8gVE9ETzogY2xlYW51cCBldmVudA0KICAgICAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtldmVudDogZXZlbnQsIGRhdGE6IHtkYXRhOiBkYXRhLmRhdGF9fSk7DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2goZXgpIHt9DQogICAgfTsNCg0KICAgIHRoaXMuYXR0YWNoVG9Eb2N1bWVudCA9IGZ1bmN0aW9uKGRvYykgew0KICAgICAgICBpZih0aGlzLiRkb2MpDQogICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZSgpOw0KDQogICAgICAgIHRoaXMuJGRvYyA9IGRvYzsNCiAgICAgICAgdGhpcy5jYWxsKCJzZXRWYWx1ZSIsIFtkb2MuZ2V0VmFsdWUoKV0pOw0KICAgICAgICBkb2Mub24oImNoYW5nZSIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOw0KICAgIH07DQoNCiAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gZnVuY3Rpb24oZSkgew0KICAgICAgICBlLnJhbmdlID0gew0KICAgICAgICAgICAgc3RhcnQ6IGUuZGF0YS5yYW5nZS5zdGFydCwNCiAgICAgICAgICAgIGVuZDogZS5kYXRhLnJhbmdlLmVuZA0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmVtaXQoImNoYW5nZSIsIGUpOw0KICAgIH07DQoNCn0pLmNhbGwoV29ya2VyQ2xpZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuV29ya2VyQ2xpZW50ID0gV29ya2VyQ2xpZW50Ow0KDQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvYmVoYXZpb3VyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoJy4uL2JlaGF2aW91cicpLkJlaGF2aW91cjsNCg0KdmFyIENzdHlsZUJlaGF2aW91ciA9IGZ1bmN0aW9uICgpIHsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAne30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9Jykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCd9Jywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7DQogICAgICAgICAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MpDQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCg0KICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLmdldE5leHRMaW5lSW5kZW50KHN0YXRlLCBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCAtIDEpLCBzZXNzaW9uLmdldFRhYlN0cmluZygpKTsNCiAgICAgICAgICAgICAgICB2YXIgbmV4dF9pbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXG4nICsgaW5kZW50ICsgJ1xuJyArIG5leHRfaW5kZW50LA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLmVuZC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICcoJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJyknLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIicgKyBzZWxlY3RlZCArICciJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgICAgICB2YXIgbGVmdENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLTEsIGN1cnNvci5jb2x1bW4pOw0KDQogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4NCiAgICAgICAgICAgICAgICBpZiAobGVmdENoYXIgPT0gJ1xcJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBGaW5kIHdoYXQgdG9rZW4gd2UncmUgaW5zaWRlLg0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7DQogICAgICAgICAgICAgICAgdmFyIGNvbCA9IDAsIHRva2VuOw0KICAgICAgICAgICAgICAgIHZhciBxdW90ZXBvcyA9IC0xOyAvLyBUcmFjayB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhbiBvcGVuIHF1b3RlLg0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0b2tlbnMubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbeF07DQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdW90ZXBvcyA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRva2VuLnZhbHVlLmxlbmd0aCArIGNvbCkgPiBzZWxlY3Rpb24uc3RhcnQuY29sdW1uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb2wgKz0gdG9rZW5zW3hdLnZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBUcnkgYW5kIGJlIHNtYXJ0IGFib3V0IHdoZW4gd2UgYXV0byBpbnNlcnQuDQogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIiInLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLg0KICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQp9DQpvb3AuaW5oZXJpdHMoQ3N0eWxlQmVoYXZpb3VyLCBCZWhhdmlvdXIpOw0KDQpleHBvcnRzLkNzdHlsZUJlaGF2aW91ciA9IENzdHlsZUJlaGF2aW91cjsNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSAvXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS87DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4Ow0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMV0pDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBpKTsNCg0KICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7DQogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgew0KICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkpOw0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07DQogICAgICAgICAgICB2YXIgc3RhcnQgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQobWF0Y2hbMV0sIGVuZCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICghc3RhcnQpDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4tLTsNCg0KICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgICAgICB9DQogICAgfTsNCiAgICANCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gbnVsbDsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsNCg0KICAgIC8vIG11c3QgcmV0dXJuICIiIGlmIHRoZXJlJ3Mgbm8gZm9sZCwgdG8gZW5hYmxlIGNhY2hpbmcNCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICBpZiAodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOw0KICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlcg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHJlID0gL15ccyovOw0KICAgICAgICB2YXIgc3RhcnRSb3cgPSByb3c7DQogICAgICAgIHZhciBlbmRSb3cgPSByb3c7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBzdGFydENvbHVtbiA9IGNvbHVtbiB8fCBsaW5lLmxlbmd0aDsNCiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpDQogICAgICAgIA0KICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsNCiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgICAgIHZhciBsZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgZW5kUm93ID0gcm93Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7DQogICAgICAgICAgICB2YXIgZW5kQ29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZFJvdykubGVuZ3RoOw0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1uICsgMX07DQogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOw0KICAgICAgICBpZiAoIWVuZCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOw0KICAgICAgICBpZiAoZncgPT0gbnVsbCkNCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOw0KDQogICAgICAgIGlmIChmdyA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICBlbmQucm93IC0tOw0KICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgfTsNCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvanNvbicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2pzb25faGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9qc29uX2hpZ2hsaWdodF9ydWxlcyIpLkpzb25IaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOw0KICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsNCiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgQ3N0eWxlQmVoYXZpb3VyKCk7DQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgQ1N0eWxlRm9sZE1vZGUoKTsNCn07DQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOw0KDQogICAgICAgIGlmIChzdGF0ZSA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLipbXHtcKFxbXVxzKiQvKTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgIH07DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7DQogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOw0KICAgIH07DQogICAgDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvanNvbl9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBKc29uSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4NCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgNCiAgICAgICAgICAgICAgICByZWdleCA6ICIwW3hYXVswLTlhLWZBLUZdK1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzp0cnVlfGZhbHNlKVxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJpbnZhbGlkLmlsbGVnYWwiLCAvLyBzaW5nbGUgcXVvdGVkIHN0cmluZ3MgYXJlIG5vdCBhbGxvd2VkDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJpbnZhbGlkLmlsbGVnYWwiLCAvLyBjb21tZW50cyBhcmUgbm90IGFsbG93ZWQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbWyh7XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfV0iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQogICAgDQp9Ow0KDQpvb3AuaW5oZXJpdHMoSnNvbkhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkpzb25IaWdobGlnaHRSdWxlcyA9IEpzb25IaWdobGlnaHRSdWxlczsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7DQogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7DQoNCiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsNCiAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IGRvYy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59KTsNCg0KICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmVoYXZpb3VyID0gcmVxdWlyZSgnLi4vYmVoYXZpb3VyJykuQmVoYXZpb3VyOw0KDQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgew0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3snICsgc2VsZWN0ZWQgKyAnfScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7fScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJ30nKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJ30nLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiArIDF9KTsNCiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykNCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KDQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCcgKyBzZWxlY3RlZCArICcpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnKScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnKScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7DQoNCiAgICAgICAgICAgICAgICAvLyBXZSdyZSBlc2NhcGVkLg0KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIEZpbmQgd2hhdCB0b2tlbiB3ZSdyZSBpbnNpZGUuDQogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHNlbGVjdGlvbi5zdGFydC5yb3csIHNlbGVjdGlvbi5zdGFydC5yb3cpWzBdLnRva2VuczsNCiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47DQogICAgICAgICAgICAgICAgdmFyIHF1b3RlcG9zID0gLTE7IC8vIFRyYWNrIHdoZXRoZXIgd2UncmUgaW5zaWRlIGFuIG9wZW4gcXVvdGUuDQoNCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1t4XTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1b3RlcG9zIDwgMCkgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gdG9rZW4udmFsdWUuaW5kZXhPZignIicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgodG9rZW4udmFsdWUubGVuZ3RoICsgY29sKSA+IHNlbGVjdGlvbi5zdGFydC5jb2x1bW4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbCArPSB0b2tlbnNbeF0udmFsdWUubGVuZ3RoOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIFRyeSBhbmQgYmUgc21hcnQgYWJvdXQgd2hlbiB3ZSBhdXRvIGluc2VydC4NCiAgICAgICAgICAgICAgICBpZiAoIXRva2VuIHx8IChxdW90ZXBvcyA8IDAgJiYgdG9rZW4udHlwZSAhPT0gImNvbW1lbnQiICYmICh0b2tlbi50eXBlICE9PSAic3RyaW5nIiB8fCAoKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gIT09IHRva2VuLnZhbHVlLmxlbmd0aCtjb2wtMSkgJiYgdG9rZW4udmFsdWUubGFzdEluZGV4T2YoJyInKSA9PT0gdG9rZW4udmFsdWUubGVuZ3RoLTEpKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICciIicsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgPT09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnB1dCBhbmQgbW92ZSByaWdodCBvbmUgaWYgd2UncmUgdHlwaW5nIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuDQogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCn0NCm9vcC5pbmhlcml0cyhDc3R5bGVCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOw0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gLyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS87DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOw0KDQogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpICsgbWF0Y2hbMF0ubGVuZ3RoKTsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChmb2xkU3R5bGUgIT09ICJtYXJrYmVnaW5lbmQiKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7DQogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBpfTsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKCFzdGFydCkNCiAgICAgICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgICAgIHN0YXJ0LmNvbHVtbisrOw0KICAgICAgICAgICAgZW5kLmNvbHVtbi0tOw0KDQogICAgICAgICAgICByZXR1cm4gIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSBudWxsOw0KDQogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZw0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJzdGFydCI7DQogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJlbmQiOw0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLmluZGVudGF0aW9uQmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgcmUgPSAvXlxzKi87DQogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOw0KICAgICAgICB2YXIgc3RhcnRMZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkNCiAgICAgICAgDQogICAgICAgIHdoaWxlICgrK3JvdyA8IG1heFJvdykgew0KICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpDQogICAgICAgICAgICAgICAgY29udGludWU7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBlbmRSb3cgPSByb3c7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7DQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsNCiAgICAgICAgdmFyIGVuZCA9IHNlc3Npb24uJGZpbmRDbG9zaW5nQnJhY2tldChicmFja2V0LCBzdGFydCk7DQogICAgICAgIGlmICghZW5kKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107DQogICAgICAgIGlmIChmdyA9PSBudWxsKQ0KICAgICAgICAgICAgZncgPSB0aGlzLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZW5kLnJvdyk7DQoNCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIGVuZC5yb3cgLS07DQogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOw0KOw0KICAgICAgICAgICAgKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpDQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgIA==]]></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[ZGVmaW5lKCdhY2UvbW9kZS9sYXRleCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2xhdGV4X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBMYXRleEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9sYXRleF9oaWdobGlnaHRfcnVsZXMiKS5MYXRleEhpZ2hsaWdodFJ1bGVzOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpDQp7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgTGF0ZXhIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgLy8gVGhpcyBjb2RlIGlzIGFkYXB0ZWQgZnJvbSBydWJ5LmpzDQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgDQogICAgICAgIC8vIExhVGVYIGNvbW1lbnRzIGJlZ2luIHdpdGggJSBhbmQgZ28gdG8gdGhlIGVuZCBvZiB0aGUgbGluZQ0KICAgICAgICB2YXIgY29tbWVudFJlZ0V4ID0gL14oXHMqKVwlLzsNCg0KICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRSb3c7IGkgPD0gZW5kUm93OyBpKyspIHsNCiAgICAgICAgICAgIGlmICghY29tbWVudFJlZ0V4LnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG91dGRlbnQpIHsNCiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydFJvdzsgaSA8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUoaSk7DQogICAgICAgICAgICAgICAgdmFyIG0gPSBsaW5lLm1hdGNoKGNvbW1lbnRSZWdFeCk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIiUiKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQogICAgLy8gVGhlcmUgaXMgbm8gdW5pdmVyc2FsbHkgYWNjZXB0ZWQgd2F5IG9mIGluZGVudGluZyBhIHRleCBkb2N1bWVudA0KICAgIC8vIHNvIGp1c3QgbWFpbnRhaW4gdGhlIGluZGVudGF0aW9uIG9mIHRoZSBwcmV2aW91cyBsaW5lDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGdldEluZGVudChsaW5lKTsNCiAgICB9Ow0KICAgIA0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQoNCn0pOw0KZGVmaW5lKCdhY2UvbW9kZS9sYXRleF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBMYXRleEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7ICAgDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbew0KICAgICAgICAgICAgLy8gQSB0ZXggY29tbWFuZCBlLmcuIFxmb28NCiAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxcXCg/OlteYS16QS1aXXxbYS16QS1aXSspIiwNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgLy8gQ3VybHkgYW5kIHNxdWFyZSBicmFjZXMNCiAgICAgICAgICAgIHRva2VuIDogImxwYXJlbiIsDQogICAgICAgICAgICByZWdleCA6ICJbWyh7XSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgLy8gQ3VybHkgYW5kIHNxdWFyZSBicmFjZXMNCiAgICAgICAgICAgIHRva2VuIDogInJwYXJlbiIsDQogICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICAvLyBJbmxpbmUgbWF0aCBiZXR3ZWVuIHR3byAkIHN5bWJvbHMNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICByZWdleCA6ICJcXCQoPzooPzpcXFxcLil8KD86W15cXCRcXFxcXSkpKj9cXCQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIC8vIEEgY29tbWVudC4gVGV4IGNvbW1lbnRzIHN0YXJ0IHdpdGggJSBhbmQgZ28gdG8gDQogICAgICAgICAgICAvLyB0aGUgZW5kIG9mIHRoZSBsaW5lDQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIiUuKiQiDQogICAgICAgIH1dDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhMYXRleEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkxhdGV4SGlnaGxpZ2h0UnVsZXMgPSBMYXRleEhpZ2hsaWdodFJ1bGVzOw0KDQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCioNCiogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQoqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KKg0KKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiogTGljZW5zZS4NCioNCiogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQoqDQoqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KKiBBamF4Lm9yZyBCLlYuDQoqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKg0KKiBDb250cmlidXRvcihzKToNCiogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KKiAgICAgIENvbGluIEdvdXJsYXkgPGNvbGluIERPVCBqIERPVCBnb3VybGF5IEFUIGdtYWlsIERPVCBjb20+DQoqICAgICAgTGVlIEdhbw0KKg0KKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQoqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQoqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQoqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KKg0KKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2x1YScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2x1YV9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBMdWFIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vbHVhX2hpZ2hsaWdodF9ydWxlcyIpLkx1YUhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IEx1YUhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQoNCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7DQogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsNCgkNCiAgICAgICAgdmFyIGNodW5rcyA9IFsiZnVuY3Rpb24iLCAidGhlbiIsICJkbyIsICJyZXBlYXQiXTsNCiAgICAgICAgDQogICAgICAgIGlmIChzdGF0ZSA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLipbXHtcKFxbXVxzKiQvKTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWI7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdG9rZW5zKXsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOw0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSAhPSAia2V5d29yZCIpIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICB2YXIgY2h1bmtfaSA9IGNodW5rcy5pbmRleE9mKHRva2VuLnZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX2kgIT0gLTEpew0KICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IA0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCiAgICANCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQoNCg0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCioNCiogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQoqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KKg0KKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiogTGljZW5zZS4NCioNCiogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQoqDQoqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KKiBBamF4Lm9yZyBCLlYuDQoqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKg0KKiBDb250cmlidXRvcihzKToNCiogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KKiAgICAgIENvbGluIEdvdXJsYXkgPGNvbGluIERPVCBqIERPVCBnb3VybGF5IEFUIGdtYWlsIERPVCBjb20+DQoqICAgICAgTGVlIEdhbw0KKg0KKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQoqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQoqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQoqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KKg0KKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2x1YV9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgTHVhSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJicmVha3xkb3xlbHNlfGVsc2VpZnxlbmR8Zm9yfGZ1bmN0aW9ufGlmfGlufGxvY2FsfHJlcGVhdHwiKw0KICAgICAgICAgInJldHVybnx0aGVufHVudGlsfHdoaWxlfG9yfGFuZHxub3QiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsdGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoInRydWV8ZmFsc2V8bmlsfF9HfF9WRVJTSU9OIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbHRpbkZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJzdHJpbmd8eHBjYWxsfHBhY2thZ2V8dG9zdHJpbmd8cHJpbnR8b3N8dW5wYWNrfHJlcXVpcmV8IisNCiAgICAgICAgImdldGZlbnZ8c2V0bWV0YXRhYmxlfG5leHR8YXNzZXJ0fHRvbnVtYmVyfGlvfHJhd2VxdWFsfCIrDQogICAgICAgICJjb2xsZWN0Z2FyYmFnZXxnZXRtZXRhdGFibGV8bW9kdWxlfHJhd3NldHxtYXRofGRlYnVnfCIrDQogICAgICAgICJwY2FsbHx0YWJsZXxuZXdwcm94eXx0eXBlfGNvcm91dGluZXxfR3xzZWxlY3R8Z2NpbmZvfCIrDQogICAgICAgICJwYWlyc3xyYXdnZXR8bG9hZHN0cmluZ3xpcGFpcnN8X1ZFUlNJT058ZG9maWxlfHNldGZlbnZ8IisNCiAgICAgICAgImxvYWR8ZXJyb3J8bG9hZGZpbGV8IisNCg0KICAgICAgICAic3VifHVwcGVyfGxlbnxnZmluZHxyZXB8ZmluZHxtYXRjaHxjaGFyfGR1bXB8Z21hdGNofCIrDQogICAgICAgICJyZXZlcnNlfGJ5dGV8Zm9ybWF0fGdzdWJ8bG93ZXJ8cHJlbG9hZHxsb2FkbGlifGxvYWRlZHwiKw0KICAgICAgICAibG9hZGVyc3xjcGF0aHxjb25maWd8cGF0aHxzZWVhbGx8ZXhpdHxzZXRsb2NhbGV8ZGF0ZXwiKw0KICAgICAgICAiZ2V0ZW52fGRpZmZ0aW1lfHJlbW92ZXx0aW1lfGNsb2NrfHRtcG5hbWV8cmVuYW1lfGV4ZWN1dGV8IisNCiAgICAgICAgImxpbmVzfHdyaXRlfGNsb3NlfGZsdXNofG9wZW58b3V0cHV0fHR5cGV8cmVhZHxzdGRlcnJ8IisNCiAgICAgICAgInN0ZGlufGlucHV0fHN0ZG91dHxwb3Blbnx0bXBmaWxlfGxvZ3xtYXh8YWNvc3xodWdlfCIrDQogICAgICAgICJsZGV4cHxwaXxjb3N8dGFuaHxwb3d8ZGVnfHRhbnxjb3NofHNpbmh8cmFuZG9tfHJhbmRvbXNlZWR8IisNCiAgICAgICAgImZyZXhwfGNlaWx8Zmxvb3J8cmFkfGFic3xzcXJ0fG1vZGZ8YXNpbnxtaW58bW9kfGZtb2R8bG9nMTB8IisNCiAgICAgICAgImF0YW4yfGV4cHxzaW58YXRhbnxnZXR1cHZhbHVlfGRlYnVnfHNldGhvb2t8Z2V0bWV0YXRhYmxlfCIrDQogICAgICAgICJnZXRob29rfHNldG1ldGF0YWJsZXxzZXRsb2NhbHx0cmFjZWJhY2t8c2V0ZmVudnxnZXRpbmZvfCIrDQogICAgICAgICJzZXR1cHZhbHVlfGdldGxvY2FsfGdldHJlZ2lzdHJ5fGdldGZlbnZ8c2V0bnxpbnNlcnR8Z2V0bnwiKw0KICAgICAgICAiZm9yZWFjaGl8bWF4bnxmb3JlYWNofGNvbmNhdHxzb3J0fHJlbW92ZXxyZXN1bWV8eWllbGR8IisNCiAgICAgICAgInN0YXR1c3x3cmFwfGNyZWF0ZXxydW5uaW5nIikuc3BsaXQoInwiKQ0KICAgICk7DQogICAgDQogICAgdmFyIHN0ZExpYmFyaWVzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoInN0cmluZ3xwYWNrYWdlfG9zfGlvfG1hdGh8ZGVidWd8dGFibGV8Y29yb3V0aW5lIikuc3BsaXQoInwiKQ0KICAgICk7DQogICAgDQogICAgdmFyIG1ldGF0YWJsZU1ldGhvZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiX19hZGR8X19zdWJ8X19tb2R8X191bm18X19jb25jYXR8X19sdHxfX2luZGV4fF9fY2FsbHxfX2djfF9fbWV0YXRhYmxlfCIrDQogICAgICAgICAiX19tdWx8X19kaXZ8X19wb3d8X19sZW58X19lcXxfX2xlfF9fbmV3aW5kZXh8X190b3N0cmluZ3xfX21vZGV8X190b251bWJlciIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGZ1dHVyZVJlc2VydmVkID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIiIpLnNwbGl0KCJ8IikNCiAgICApOw0KICAgIA0KICAgIHZhciBkZXByZWNhdGVkSW41MTUyID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoInNldG58Zm9yZWFjaHxmb3JlYWNoaXxnY2luZm98bG9nMTB8bWF4biIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIHN0clByZSA9ICIiOw0KDQogICAgdmFyIGRlY2ltYWxJbnRlZ2VyID0gIig/Oig/OlsxLTldXFxkKil8KD86MCkpIjsNCiAgICB2YXIgaGV4SW50ZWdlciA9ICIoPzowW3hYXVtcXGRBLUZhLWZdKykiOw0KICAgIHZhciBpbnRlZ2VyID0gIig/OiIgKyBkZWNpbWFsSW50ZWdlciArICJ8IiArIGhleEludGVnZXIgKyAiKSI7DQoNCiAgICB2YXIgZnJhY3Rpb24gPSAiKD86XFwuXFxkKykiOw0KICAgIHZhciBpbnRQYXJ0ID0gIig/OlxcZCspIjsNCiAgICB2YXIgcG9pbnRGbG9hdCA9ICIoPzooPzoiICsgaW50UGFydCArICI/IiArIGZyYWN0aW9uICsgIil8KD86IiArIGludFBhcnQgKyAiXFwuKSkiOw0KICAgIHZhciBmbG9hdE51bWJlciA9ICIoPzoiICsgcG9pbnRGbG9hdCArICIpIjsNCiAgICANCiAgICB2YXIgY29tbWVudF9zdGFjayA9IFtdOw0KICAgIA0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogDQoNCgkJDQogICAgICAgIC8vIGJyYWNrZXRlZCBjb21tZW50cw0KICAgICAgICBbew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsICAgICAgICAgICAvLyAtLVtbIGNvbW1lbnQNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcWy4qXFxdXFxdJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgICAgICAgICAgIC8vIC0tWz1bIGNvbW1lbnQNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcPVxcWy4qXFxdXFw9XFxdJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgICAgICAgICAgIC8vIC0tWz09WyBjb21tZW50DQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXC1cXC1cXFtcXD17Mn1cXFsuKlxcXVxcPXsyfVxcXScNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsICAgICAgICAgICAvLyAtLVs9PT1bIGNvbW1lbnQNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcPXszfVxcWy4qXFxdXFw9ezN9XFxdJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgICAgICAgICAgIC8vIC0tWz09PT1bIGNvbW1lbnQNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcPXs0fVxcWy4qXFxdXFw9ezR9XFxdJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgICAgICAgICAgIC8vIC0tWz09PT0rWyBjb21tZW50DQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXC1cXC1cXFtcXD17NX1cXD0qXFxbLipcXF1cXD17NX1cXD0qXFxdJw0KICAgICAgICB9LA0KCQkNCgkJLy8gbXVsdGlsaW5lIGJyYWNrZXRlZCBjb21tZW50cw0KCQl7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgICAgICAgICAgIC8vIC0tW1sgY29tbWVudA0KICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnXFwtXFwtXFxbXFxbLiokJywNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIG5leHQgIDogInFjb21tZW50Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgICAgICAgICAgIC8vIC0tWz1bIGNvbW1lbnQNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcPVxcWy4qJCcsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICBuZXh0ICA6ICJxY29tbWVudDEiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAgICAgICAgICAgLy8gLS1bPT1bIGNvbW1lbnQNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcPXsyfVxcWy4qJCcsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICBuZXh0ICA6ICJxY29tbWVudDIiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAgICAgICAgICAgLy8gLS1bPT09WyBjb21tZW50DQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXC1cXC1cXFtcXD17M31cXFsuKiQnLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgbmV4dCAgOiAicWNvbW1lbnQzIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgICAgICAgICAgIC8vIC0tWz09PT1bIGNvbW1lbnQNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcPXs0fVxcWy4qJCcsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICBuZXh0ICA6ICJxY29tbWVudDQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpeyAgICAgLy8gLS1bPT09PStbIGNvbW1lbnQNCiAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiBFWFRSRU1FTFkgU0xPVywgYnV0IHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIGNpcmN1bXZlbnQgdGhlDQogICAgICAgICAgICAgICAgLy8gbGltaXRzIGltcG9zZWQgYnkgdGhlIGN1cnJlbnQgYXV0b21hdG9uLg0KICAgICAgICAgICAgICAgIC8vIEkndmUgbmV2ZXIgcGVyc29uYWxseSBzZWVuIGFueSBwcmFjdGljYWwgY29kZSB3aGVyZSA1IG9yIG1vcmUgJz0ncyBhcmUNCiAgICAgICAgICAgICAgICAvLyB1c2VkIGZvciBzdHJpbmcgb3IgY29tbWVudGluZywgc28gdGhpcyB3aWxsIHJhcmVseSBiZSBpbnZva2VkLg0KICAgICAgICAgICAgICAgIHZhciBwYXR0ZXJuID0gL1wtXC1cWyhcPSspXFsvLCBtYXRjaDsNCiAgICAgICAgICAgICAgICAvLyB5b3UgY2FuIG5ldmVyIGJlIHRvbyBwYXJhbm9pZCA7KQ0KICAgICAgICAgICAgICAgIGlmICgobWF0Y2ggPSBwYXR0ZXJuLmV4ZWModmFsdWUpKSAhPSBudWxsICYmIChtYXRjaCA9IG1hdGNoWzFdKSAhPSB1bmRlZmluZWQpDQogICAgICAgICAgICAgICAgICAgIGNvbW1lbnRfc3RhY2sucHVzaChtYXRjaC5sZW5ndGgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJldHVybiAiY29tbWVudCI7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnXFwtXFwtXFxbXFw9ezV9XFw9KlxcWy4qJCcsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICBuZXh0ICA6ICJxY29tbWVudDUiDQogICAgICAgIH0sDQogICAgICAgIA0KICAgICAgICAvLyBzaW5nbGUgbGluZSBjb21tZW50cw0KICAgICAgICB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcLVxcLS4qJCINCiAgICAgICAgfSwgDQogICAgICAgIA0KICAgICAgICAvLyBicmFja2V0ZWQgc3RyaW5ncw0KCQl7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gW1sgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXFtcXFsuKlxcXVxcXScNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vIFs9WyBzdHJpbmcNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcW1xcPVxcWy4qXFxdXFw9XFxdJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gWz09WyBzdHJpbmcNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcW1xcPXsyfVxcWy4qXFxdXFw9ezJ9XFxdJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gWz09PVsgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXFtcXD17M31cXFsuKlxcXVxcPXszfVxcXScNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vIFs9PT09WyBzdHJpbmcNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcW1xcPXs0fVxcWy4qXFxdXFw9ezR9XFxdJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gWz09PT0rWyBzdHJpbmcNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcW1xcPXs1fVxcPSpcXFsuKlxcXVxcPXs1fVxcPSpcXF0nDQogICAgICAgIH0sDQoJCQ0KCQkvLyBtdWx0aWxpbmUgYnJhY2tldGVkIHN0cmluZ3MNCiAgICAgICAgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vIFtbIHN0cmluZw0KICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnXFxbXFxbLiokJywNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIG5leHQgIDogInFzdHJpbmciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBbPVsgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXFtcXD1cXFsuKiQnLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgbmV4dCAgOiAicXN0cmluZzEiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBbPT1bIHN0cmluZw0KICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnXFxbXFw9ezJ9XFxbLiokJywNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIG5leHQgIDogInFzdHJpbmcyIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gWz09PVsgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXFtcXD17M31cXFsuKiQnLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgbmV4dCAgOiAicXN0cmluZzMiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBbPT09PVsgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXFtcXD17NH1cXFsuKiQnLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgbmV4dCAgOiAicXN0cmluZzQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpeyAgICAgLy8gLS1bPT09PStbIHN0cmluZw0KICAgICAgICAgICAgICAgIC8vIFdBUk5JTkc6IEVYVFJFTUVMWSBTTE9XLCBzZWUgYWJvdmUuDQogICAgICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAvXFsoXD0rKVxbLywgbWF0Y2g7DQogICAgICAgICAgICAgICAgaWYgKChtYXRjaCA9IHBhdHRlcm4uZXhlYyh2YWx1ZSkpICE9IG51bGwgJiYgKG1hdGNoID0gbWF0Y2hbMV0pICE9IHVuZGVmaW5lZCkNCiAgICAgICAgICAgICAgICAgICAgY29tbWVudF9zdGFjay5wdXNoKG1hdGNoLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcW1xcPXs1fVxcPSpcXFsuKiQnLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgbmV4dCAgOiAicXN0cmluZzUiDQogICAgICAgIH0sIA0KICAgICAgICANCiAgICAgICAgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vICIgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICciKD86W15cXFxcXXxcXFxcLikqPyInDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyAnIHN0cmluZw0KICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAiJyg/OlteXFxcXF18XFxcXC4pKj8nIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgIHJlZ2V4IDogZmxvYXROdW1iZXINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGludGVnZXINCiAgICAgICAgICAgIHJlZ2V4IDogaW50ZWdlciArICJcXGIiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGRMaWJhcmllcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGlicmFyeSI7DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVwcmVjYXRlZEluNTE1Mi5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluRnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChtZXRhdGFibGVNZXRob2RzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcK3xcXC18XFwqfFxcL3wlfFxcI3xcXF58fnw8fD58PD18PT58PT18fj18PXxcXDp8XFwuXFwuXFwufFxcLlxcLiINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIltcXFtcXChcXHtdIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICAgICAgcmVnZXggOiAiW1xcXVxcKVxcfV0iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSBdLA0KICAgICAgICANCiAgICAgICAgInFjb21tZW50IjogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxcXF18XFxcXC4pKj9cXF1cXF0iLA0KICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgIH0gXSwNCiAgICAgICAgInFjb21tZW50MSI6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFw9XFxdIiwNCiAgICAgICAgICAgIG5leHQgIDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICB9IF0sDQogICAgICAgICJxY29tbWVudDIiOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgcmVnZXggOiAiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcPXsyfVxcXSIsDQogICAgICAgICAgICBuZXh0ICA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgfSBdLA0KICAgICAgICAicWNvbW1lbnQzIjogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17M31cXF0iLA0KICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgIH0gXSwNCiAgICAgICAgInFjb21tZW50NCI6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFw9ezR9XFxdIiwNCiAgICAgICAgICAgIG5leHQgIDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICB9IF0sDQogICAgICAgICJxY29tbWVudDUiOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpeyANCiAgICAgICAgICAgICAgICAvLyB2ZXJ5IGhhY2tpc2gsIG11dGF0ZXMgdGhlIHFjb21tZW50NSBmaWVsZCBvbiB0aGUgZmx5Lg0KICAgICAgICAgICAgICAgIHZhciBwYXR0ZXJuID0gL1xdKFw9KylcXS8sIHJ1bGUgPSB0aGlzLnJ1bGVzLnFjb21tZW50NVswXSwgbWF0Y2g7DQogICAgICAgICAgICAgICAgcnVsZS5uZXh0ID0gInN0YXJ0IjsNCiAgICAgICAgICAgICAgICBpZiAoKG1hdGNoID0gcGF0dGVybi5leGVjKHZhbHVlKSkgIT0gbnVsbCAmJiAobWF0Y2ggPSBtYXRjaFsxXSkgIT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGZvdW5kID0gbWF0Y2gubGVuZ3RoLCBleHBlY3RlZDsNCiAgICAgICAgICAgICAgICAgICAgaWYgKChleHBlY3RlZCA9IGNvbW1lbnRfc3RhY2sucG9wKCkpICE9IGZvdW5kKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRfc3RhY2sucHVzaChleHBlY3RlZCk7DQogICAgICAgICAgICAgICAgICAgICAgICBydWxlLm5leHQgPSAicWNvbW1lbnQ1IjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByZXR1cm4gImNvbW1lbnQiOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17NX1cXD0qXFxdIiwNCiAgICAgICAgICAgIG5leHQgIDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICB9IF0sDQogICAgICAgIA0KICAgICAgICAicXN0cmluZyI6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxcXF18XFxcXC4pKj9cXF1cXF0iLA0KICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgfSBdLA0KICAgICAgICAicXN0cmluZzEiOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFw9XFxdIiwNCiAgICAgICAgICAgIG5leHQgIDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgIH0gXSwNCiAgICAgICAgInFzdHJpbmcyIjogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgcmVnZXggOiAiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcPXsyfVxcXSIsDQogICAgICAgICAgICBuZXh0ICA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICB9IF0sDQogICAgICAgICJxc3RyaW5nMyI6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17M31cXF0iLA0KICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgfSBdLA0KICAgICAgICAicXN0cmluZzQiOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFw9ezR9XFxdIiwNCiAgICAgICAgICAgIG5leHQgIDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgIH0gXSwNCiAgICAgICAgInFzdHJpbmc1IjogWyB7DQogICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKXsgDQogICAgICAgICAgICAgICAgLy8gdmVyeSBoYWNraXNoLCBtdXRhdGVzIHRoZSBxc3RyaW5nNSBmaWVsZCBvbiB0aGUgZmx5Lg0KICAgICAgICAgICAgICAgIHZhciBwYXR0ZXJuID0gL1xdKFw9KylcXS8sIHJ1bGUgPSB0aGlzLnJ1bGVzLnFzdHJpbmc1WzBdLCBtYXRjaDsNCiAgICAgICAgICAgICAgICBydWxlLm5leHQgPSAic3RhcnQiOw0KICAgICAgICAgICAgICAgIGlmICgobWF0Y2ggPSBwYXR0ZXJuLmV4ZWModmFsdWUpKSAhPSBudWxsICYmIChtYXRjaCA9IG1hdGNoWzFdKSAhPSB1bmRlZmluZWQpew0KICAgICAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSBtYXRjaC5sZW5ndGgsIGV4cGVjdGVkOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKGV4cGVjdGVkID0gY29tbWVudF9zdGFjay5wb3AoKSkgIT0gZm91bmQpew0KICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudF9zdGFjay5wdXNoKGV4cGVjdGVkKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUubmV4dCA9ICJxc3RyaW5nNSI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17NX1cXD0qXFxdIiwNCiAgICAgICAgICAgIG5leHQgIDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgIH0gXQ0KICAgICAgICANCiAgICB9Ow0KDQp9DQoNCm9vcC5pbmhlcml0cyhMdWFIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5MdWFIaWdobGlnaHRSdWxlcyA9IEx1YUhpZ2hsaWdodFJ1bGVzOw0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[LyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPg0KICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL21hcmtkb3duJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS9tb2RlL2phdmFzY3JpcHQnLCAnYWNlL21vZGUveG1sJywgJ2FjZS9tb2RlL2h0bWwnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9tYXJrZG93bl9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIEphdmFTY3JpcHRNb2RlID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0IikuTW9kZTsNCnZhciBYbWxNb2RlID0gcmVxdWlyZSgiLi94bWwiKS5Nb2RlOw0KdmFyIEh0bWxNb2RlID0gcmVxdWlyZSgiLi9odG1sIikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgTWFya2Rvd25IaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vbWFya2Rvd25faGlnaGxpZ2h0X3J1bGVzIikuTWFya2Rvd25IaWdobGlnaHRSdWxlczsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgaGlnaGxpZ2h0ZXIgPSBuZXcgTWFya2Rvd25IaWdobGlnaHRSdWxlcygpOw0KICAgIA0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIoaGlnaGxpZ2h0ZXIuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kZW1iZWRzID0gaGlnaGxpZ2h0ZXIuZ2V0RW1iZWRzKCk7DQogICAgdGhpcy5jcmVhdGVNb2RlRGVsZWdhdGVzKHsNCiAgICAgICJqcy0iOiBKYXZhU2NyaXB0TW9kZSwNCiAgICAgICJ4bWwtIjogWG1sTW9kZSwNCiAgICAgICJodG1sLSI6IEh0bWxNb2RlDQogICAgfSk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIGlmIChzdGF0ZSA9PSAibGlzdGJsb2NrIikgew0KICAgICAgICAgICAgdmFyIG1hdGNoID0gL14oKD86LispPykoWy0rKl1bIF0rKS8uZXhlYyhsaW5lKTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXkobWF0Y2hbMV0ubGVuZ3RoICsgMSkuam9pbigiICIpICsgbWF0Y2hbMl07DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiAiIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQogICAgICAgIH0NCiAgICB9Ow0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9qYXZhc2NyaXB0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnLCAnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KdmFyIFdvcmtlckNsaWVudCA9IHJlcXVpcmUoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50Ow0KdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOw0KICAgICAgICB2YXIgcmUgPSAvXihccyopXC9cLy87DQoNCiAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG91dGRlbnQpIHsNCiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi8vIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KICAgICAgICB2YXIgZW5kU3RhdGUgPSB0b2tlbml6ZWRMaW5lLnN0YXRlOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09ICJkb2Mtc3RhcnQiKSB7DQogICAgICAgICAgICBpZiAoZW5kU3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eXHMqKFwvPylcKi8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7DQogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAiICI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiKiAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlckNsaWVudChbImFjZSJdLCAid29ya2VyLWphdmFzY3JpcHQuanMiLCAiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCAiSmF2YVNjcmlwdFdvcmtlciIpOw0KICAgICAgICB3b3JrZXIuYXR0YWNoVG9Eb2N1bWVudChzZXNzaW9uLmdldERvY3VtZW50KCkpOw0KICAgICAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigianNsaW50IiwgZnVuY3Rpb24ocmVzdWx0cykgew0KICAgICAgICAgICAgdmFyIGVycm9ycyA9IFtdOw0KICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHJlc3VsdHMuZGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IHJlc3VsdHMuZGF0YVtpXTsNCiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpDQogICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZXJyb3IubGluZS0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBlcnJvci5jaGFyYWN0ZXItMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yLnJlYXNvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbnQ6IGVycm9yDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhlcnJvcnMpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigibmFyY2lzc3VzIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhbZS5kYXRhXSk7DQogICAgICAgIH0pOw0KICAgICAgICANCiAgICAgICAgd29ya2VyLm9uKCJ0ZXJtaW5hdGUiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHNlc3Npb24uY2xlYXJBbm5vdGF0aW9ucygpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHJldHVybiB3b3JrZXI7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvdW5pY29kZScsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgdW5pY29kZSA9IHJlcXVpcmUoIi4uL3VuaWNvZGUiKTsNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICAvLyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzDQogICAgdmFyIGdsb2JhbHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAvLyBDb25zdHJ1Y3RvcnMNCiAgICAgICAgKCJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fCIgKw0KICAgICAgLy8gRTRYDQogICAgICAgICAiTmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fCIgKw0KICAgICAgICAgIkFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXwiICsNCiAgICAgICAgICJVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fCIgKw0KICAgICAgLy8gRXJyb3JzDQogICAgICAgICJFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258IiArDQogICAgICAgICJTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8IiArDQogICAgICAvLyAgTm9uLWNvbnN0cnVjdG9yIGZ1bmN0aW9ucw0KICAgICAgICAiZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8IiArDQogICAgICAgICJpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fCIgKw0KICAgICAgLy8gT3RoZXINCiAgICAgICAgIkpTT058TWF0aHwiICsNCiAgICAgIC8vIFBzZXVkbw0KICAgICAgICAidGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCINCiAgICAgICkuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufCIgKw0KICAgICAgICAiaWZ8aW58aW5zdGFuY2VvZnxuZXd8cmV0dXJufHN3aXRjaHx0aHJvd3x0cnl8dHlwZW9mfGxldHx2YXJ8d2hpbGV8d2l0aHwiICsNCiAgICAgICAgImNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Iikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyBrZXl3b3JkcyB3aGljaCBjYW4gYmUgZm9sbG93ZWQgYnkgcmVndWxhciBleHByZXNzaW9ucw0KICAgIHZhciBrd0JlZm9yZVJlID0gImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGQiOw0KDQogICAgdmFyIGRlcHJlY2F0ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZGVmaW5pdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoKCJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIikuc3BsaXQoInwiKSk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBmdXR1cmVSZXNlcnZlZCA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXwiICsNCiAgICAgICAgInB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMNCiAgICB2YXIgaWRlbnRpZmllclJlID0gIlsiICsgdW5pY29kZS5wYWNrYWdlcy5MICsgIlxcJF9dWyIgDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5MDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5NbiArIHVuaWNvZGUucGFja2FnZXMuTWMNCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLk5kDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5QYyArICJcXCRfXSpcXGIiOw0KICAgICAgICANCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXS4qXFxcXCQnLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXS4qXFxcXCQiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiBbImtleXdvcmQuZGVmaW5pdGlvbiIsICJ0ZXh0IiwgImVudGl0eS5uYW1lLmZ1bmN0aW9uIl0sDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKGZ1bmN0aW9uKShcXHMrKSgiICsgaWRlbnRpZmllclJlICsgIikiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86dHJ1ZXxmYWxzZSlcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86IiArIGt3QmVmb3JlUmUgKyAiKVxcYiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlcHJlY2F0ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmRlcHJlY2F0ZWQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWZpbml0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQuZGVmaW5pdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1dHVyZVJlc2VydmVkLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gImRlYnVnZ2VyIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogaWRlbnRpZmllclJlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXD98XFw6fFxcLHxcXDt8XFwuIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iLA0KICAgICAgICAgICAgICAgIG5leHQgIDogInJlZ2V4X2FsbG93ZWQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLz0/IiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJeIyEuKiQiIA0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIG9ubHkgYWxsb3dlZCBhZnRlciBjZXJ0YWluIHRva2Vucy4gVGhpcw0KICAgICAgICAvLyBtYWtlcyBzdXJlIHdlIGRvbid0IG1peCB1cCByZWdleHBzIHdpdGggdGhlIGRpdmlzb24gb3BlcmF0b3INCiAgICAgICAgInJlZ2V4X2FsbG93ZWQiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudF9yZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSByZXR1cm4gdG8gdGhlIHN0YXJ0IG1vZGUgd2l0aG91dCBtYXRjaGluZw0KICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nDQogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJyZWdleCI6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiDQogICAgICAgICAgICB9LCB7DQoJCQkJLy8gZmxhZw0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiL1xcdyoiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUgDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXC9cXFtdKyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFxbIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiANCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyI6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiW15cXFxcXFxdXSsiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiIA0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudF9yZWdleF9hbGxvd2VkIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXFzdHJpbmciIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCAiZG9jLSIsDQogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IEphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MudGFnIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIkBbXFx3XFxkX10rIiAvLyBUT0RPOiBmaXggZW1haWwgYWRkcmVzc2VzDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlRPRE8iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlteQFxcKl0rIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICIuIg0KICAgICAgICB9XQ0KICAgIH07DQp9Ow0KDQpvb3AuaW5oZXJpdHMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmdldFN0YXJ0UnVsZSA9IGZ1bmN0aW9uKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGRvYyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXC9cXCooPz1cXCopIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0RW5kUnVsZSA9IGZ1bmN0aW9uIChzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcKlxcLyIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCg0KfSkuY2FsbChEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7DQogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7DQoNCiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsNCiAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IGRvYy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59KTsNCg0KICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQoNCnZhciBXb3JrZXJDbGllbnQgPSBmdW5jdGlvbih0b3BMZXZlbE5hbWVzcGFjZXMsIHBhY2thZ2VkSnMsIG1vZCwgY2xhc3NuYW1lKSB7DQoNCiAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gdGhpcy5jaGFuZ2VMaXN0ZW5lci5iaW5kKHRoaXMpOw0KDQogICAgaWYgKG1vZHVsZS5wYWNrYWdlZCkgew0KICAgICAgICB2YXIgYmFzZSA9IHRoaXMuJGd1ZXNzQmFzZVBhdGgoKTsNCiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcihiYXNlICsgcGFja2FnZWRKcyk7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICB2YXIgd29ya2VyVXJsID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybCgiYWNlL3dvcmtlci93b3JrZXIiLCBudWxsLCAiXyIpKTsNCiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJVcmwpOw0KDQogICAgICAgIHZhciB0bG5zID0ge307DQogICAgICAgIGZvciAodmFyIGk9MDsgaTx0b3BMZXZlbE5hbWVzcGFjZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBucyA9IHRvcExldmVsTmFtZXNwYWNlc1tpXTsNCiAgICAgICAgICAgIHZhciBwYXRoID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybChucywgbnVsbCwgIl8iKS5yZXBsYWNlKC8uanMkLywgIiIpKTsNCg0KICAgICAgICAgICAgdGxuc1tuc10gPSBwYXRoOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHsNCiAgICAgICAgaW5pdCA6IHRydWUsDQogICAgICAgIHRsbnM6IHRsbnMsDQogICAgICAgIG1vZHVsZTogbW9kLA0KICAgICAgICBjbGFzc25hbWU6IGNsYXNzbmFtZQ0KICAgIH0pOw0KDQogICAgdGhpcy5jYWxsYmFja0lkID0gMTsNCiAgICB0aGlzLmNhbGxiYWNrcyA9IHt9Ow0KDQogICAgdmFyIF9zZWxmID0gdGhpczsNCiAgICB0aGlzLiR3b3JrZXIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2coZSk7DQogICAgICAgIHRocm93IGU7DQogICAgfTsNCiAgICB0aGlzLiR3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24oZSkgew0KICAgICAgICB2YXIgbXNnID0gZS5kYXRhOw0KICAgICAgICBzd2l0Y2gobXNnLnR5cGUpIHsNCiAgICAgICAgICAgIGNhc2UgImxvZyI6DQogICAgICAgICAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2cobXNnLmRhdGEpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlICJldmVudCI6DQogICAgICAgICAgICAgICAgX3NlbGYuX2VtaXQobXNnLm5hbWUsIHtkYXRhOiBtc2cuZGF0YX0pOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlICJjYWxsIjoNCiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfc2VsZi5jYWxsYmFja3NbbXNnLmlkXTsNCiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsNCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobXNnLmRhdGEpOw0KICAgICAgICAgICAgICAgICAgICBkZWxldGUgX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfTsNCn07DQoNCihmdW5jdGlvbigpew0KDQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KDQogICAgdGhpcy4kbm9ybWFsaXplUGF0aCA9IGZ1bmN0aW9uKHBhdGgpIHsNCiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlthLXpdKzpcL1wvW15cL10rXC8vLCAiIik7IC8vIFJlbW92ZSBkb21haW4gbmFtZSBhbmQgcmVidWlsZCBpdA0KICAgICAgICBwYXRoID0gbG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsgbG9jYXRpb24uaG9zdA0KICAgICAgICAgICAgLy8gcGF0aHMgc3RhcnRpbmcgd2l0aCBhIHNsYXNoIGFyZSByZWxhdGl2ZSB0byB0aGUgcm9vdCAoaG9zdCkNCiAgICAgICAgICAgICsgKHBhdGguY2hhckF0KDApID09ICIvIiA/ICIiIDogbG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywgIiIpKQ0KICAgICAgICAgICAgKyAiLyIgKyBwYXRoLnJlcGxhY2UoL15bXC9dKy8sICIiKTsNCiAgICAgICAgcmV0dXJuIHBhdGg7DQogICAgfTsNCg0KICAgIHRoaXMuJGd1ZXNzQmFzZVBhdGggPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHJlcXVpcmUuYWNlQmFzZVVybCkNCiAgICAgICAgICAgIHJldHVybiByZXF1aXJlLmFjZUJhc2VVcmw7DQoNCiAgICAgICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7DQogICAgICAgIGZvciAodmFyIGk9MDsgaTxzY3JpcHRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgc2NyaXB0ID0gc2NyaXB0c1tpXTsNCg0KICAgICAgICAgICAgdmFyIGJhc2UgPSBzY3JpcHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjZS1iYXNlIik7DQogICAgICAgICAgICBpZiAoYmFzZSkNCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5yZXBsYWNlKC9cLyokLywgIi8iKTsNCg0KICAgICAgICAgICAgdmFyIHNyYyA9IHNjcmlwdC5zcmMgfHwgc2NyaXB0LmdldEF0dHJpYnV0ZSgic3JjIik7DQogICAgICAgICAgICBpZiAoIXNyYykgew0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG0gPSBzcmMubWF0Y2goL14oPzooLipcLylhY2VcLmpzfCguKlwvKWFjZSgtdW5jb21wcmVzc2VkKT8oLW5vY29uZmxpY3QpP1wuanMpKD86XD98JCkvKTsNCiAgICAgICAgICAgIGlmIChtKQ0KICAgICAgICAgICAgICAgIHJldHVybiBtWzFdIHx8IG1bMl07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCiAgICB0aGlzLnRlcm1pbmF0ZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLl9lbWl0KCJ0ZXJtaW5hdGUiLCB7fSk7DQogICAgICAgIHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKTsNCiAgICAgICAgdGhpcy4kd29ya2VyID0gbnVsbDsNCiAgICAgICAgdGhpcy4kZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOw0KICAgICAgICB0aGlzLiRkb2MgPSBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbmQgPSBmdW5jdGlvbihjbWQsIGFyZ3MpIHsNCiAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOiBjbWQsIGFyZ3M6IGFyZ3N9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5jYWxsID0gZnVuY3Rpb24oY21kLCBhcmdzLCBjYWxsYmFjaykgew0KICAgICAgICBpZiAoY2FsbGJhY2spIHsNCiAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuY2FsbGJhY2tJZCsrOw0KICAgICAgICAgICAgdGhpcy5jYWxsYmFja3NbaWRdID0gY2FsbGJhY2s7DQogICAgICAgICAgICBhcmdzLnB1c2goaWQpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuc2VuZChjbWQsIGFyZ3MpOw0KICAgIH07DQoNCiAgICB0aGlzLmVtaXQgPSBmdW5jdGlvbihldmVudCwgZGF0YSkgew0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgLy8gZmlyZWZveCByZWZ1c2VzIHRvIGNsb25lIG9iamVjdHMgd2hpY2ggaGF2ZSBmdW5jdGlvbiBwcm9wZXJ0aWVzDQogICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIGV2ZW50DQogICAgICAgICAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2V2ZW50OiBldmVudCwgZGF0YToge2RhdGE6IGRhdGEuZGF0YX19KTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChleCkge30NCiAgICB9Ow0KDQogICAgdGhpcy5hdHRhY2hUb0RvY3VtZW50ID0gZnVuY3Rpb24oZG9jKSB7DQogICAgICAgIGlmKHRoaXMuJGRvYykNCiAgICAgICAgICAgIHRoaXMudGVybWluYXRlKCk7DQoNCiAgICAgICAgdGhpcy4kZG9jID0gZG9jOw0KICAgICAgICB0aGlzLmNhbGwoInNldFZhbHVlIiwgW2RvYy5nZXRWYWx1ZSgpXSk7DQogICAgICAgIGRvYy5vbigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7DQogICAgfTsNCg0KICAgIHRoaXMuY2hhbmdlTGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIGUucmFuZ2UgPSB7DQogICAgICAgICAgICBzdGFydDogZS5kYXRhLnJhbmdlLnN0YXJ0LA0KICAgICAgICAgICAgZW5kOiBlLmRhdGEucmFuZ2UuZW5kDQogICAgICAgIH07DQogICAgICAgIHRoaXMuZW1pdCgiY2hhbmdlIiwgZSk7DQogICAgfTsNCg0KfSkuY2FsbChXb3JrZXJDbGllbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Xb3JrZXJDbGllbnQgPSBXb3JrZXJDbGllbnQ7DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmVoYXZpb3VyID0gcmVxdWlyZSgnLi4vYmVoYXZpb3VyJykuQmVoYXZpb3VyOw0KDQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgew0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3snICsgc2VsZWN0ZWQgKyAnfScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7fScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJ30nKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJ30nLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiArIDF9KTsNCiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykNCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KDQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCcgKyBzZWxlY3RlZCArICcpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnKScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnKScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7DQoNCiAgICAgICAgICAgICAgICAvLyBXZSdyZSBlc2NhcGVkLg0KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIEZpbmQgd2hhdCB0b2tlbiB3ZSdyZSBpbnNpZGUuDQogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHNlbGVjdGlvbi5zdGFydC5yb3csIHNlbGVjdGlvbi5zdGFydC5yb3cpWzBdLnRva2VuczsNCiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47DQogICAgICAgICAgICAgICAgdmFyIHF1b3RlcG9zID0gLTE7IC8vIFRyYWNrIHdoZXRoZXIgd2UncmUgaW5zaWRlIGFuIG9wZW4gcXVvdGUuDQoNCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1t4XTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1b3RlcG9zIDwgMCkgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gdG9rZW4udmFsdWUuaW5kZXhPZignIicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgodG9rZW4udmFsdWUubGVuZ3RoICsgY29sKSA+IHNlbGVjdGlvbi5zdGFydC5jb2x1bW4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbCArPSB0b2tlbnNbeF0udmFsdWUubGVuZ3RoOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIFRyeSBhbmQgYmUgc21hcnQgYWJvdXQgd2hlbiB3ZSBhdXRvIGluc2VydC4NCiAgICAgICAgICAgICAgICBpZiAoIXRva2VuIHx8IChxdW90ZXBvcyA8IDAgJiYgdG9rZW4udHlwZSAhPT0gImNvbW1lbnQiICYmICh0b2tlbi50eXBlICE9PSAic3RyaW5nIiB8fCAoKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gIT09IHRva2VuLnZhbHVlLmxlbmd0aCtjb2wtMSkgJiYgdG9rZW4udmFsdWUubGFzdEluZGV4T2YoJyInKSA9PT0gdG9rZW4udmFsdWUubGVuZ3RoLTEpKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICciIicsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgPT09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnB1dCBhbmQgbW92ZSByaWdodCBvbmUgaWYgd2UncmUgdHlwaW5nIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuDQogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCn0NCm9vcC5pbmhlcml0cyhDc3R5bGVCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOw0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gLyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS87DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOw0KDQogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpICsgbWF0Y2hbMF0ubGVuZ3RoKTsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChmb2xkU3R5bGUgIT09ICJtYXJrYmVnaW5lbmQiKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7DQogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBpfTsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKCFzdGFydCkNCiAgICAgICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgICAgIHN0YXJ0LmNvbHVtbisrOw0KICAgICAgICAgICAgZW5kLmNvbHVtbi0tOw0KDQogICAgICAgICAgICByZXR1cm4gIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSBudWxsOw0KDQogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZw0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJzdGFydCI7DQogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJlbmQiOw0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLmluZGVudGF0aW9uQmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgcmUgPSAvXlxzKi87DQogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOw0KICAgICAgICB2YXIgc3RhcnRMZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkNCiAgICAgICAgDQogICAgICAgIHdoaWxlICgrK3JvdyA8IG1heFJvdykgew0KICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpDQogICAgICAgICAgICAgICAgY29udGludWU7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBlbmRSb3cgPSByb3c7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7DQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsNCiAgICAgICAgdmFyIGVuZCA9IHNlc3Npb24uJGZpbmRDbG9zaW5nQnJhY2tldChicmFja2V0LCBzdGFydCk7DQogICAgICAgIGlmICghZW5kKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107DQogICAgICAgIGlmIChmdyA9PSBudWxsKQ0KICAgICAgICAgICAgZncgPSB0aGlzLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZW5kLnJvdyk7DQoNCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIGVuZC5yb3cgLS07DQogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgWG1sSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3htbF9oaWdobGlnaHRfcnVsZXMiKS5YbWxIaWdobGlnaHRSdWxlczsNCnZhciBYbWxCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci94bWwiKS5YbWxCZWhhdmlvdXI7DQp2YXIgWG1sRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcveG1sIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgWG1sSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgWG1sQmVoYXZpb3VyKCk7DQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgWG1sRm9sZE1vZGUoKTsNCn07DQoNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCiAgICANCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICByZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS94bWxfdXRpbCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciB4bWxVdGlsID0gcmVxdWlyZSgiLi94bWxfdXRpbCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBYbWxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICBzdGFydCA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXCFcXFtDREFUQVxcWyIsDQogICAgICAgICAgICBuZXh0IDogImNkYXRhIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ4bWxfcGUiLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcPy4qP1xcPz4iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcIS0tIiwNCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLCAvLyBvcGVuaW5nIHRhZw0KICAgICAgICAgICAgcmVnZXggOiAiPFxcLz8iLA0KICAgICAgICAgICAgbmV4dCA6ICJ0YWciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJbXjxdKyINCiAgICAgICAgfV0sDQogICAgICAgIA0KICAgICAgICBjZGF0YSA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcXVxcXT4iLA0KICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxdXXxcXF0oPyFcXF0+KSkrIg0KICAgICAgICB9XSwNCg0KICAgICAgICBjb21tZW50IDogW3sNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgcmVnZXggOiAiLio/LS0+IiwNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgIH1dDQogICAgfTsNCiAgICANCiAgICB4bWxVdGlsLnRhZyh0aGlzLiRydWxlcywgInRhZyIsICJzdGFydCIpOw0KfTsNCg0Kb29wLmluaGVyaXRzKFhtbEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLlhtbEhpZ2hsaWdodFJ1bGVzID0gWG1sSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3htbF91dGlsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2xhbmcnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCg0KdmFyIGZvcm1UYWdzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICgiYnV0dG9ufGZvcm18aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhIikuc3BsaXQoInwiKQ0KKTsNCg0KdmFyIHRhYmxlVGFncyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAoInRhYmxlfHRib2R5fHRkfHRmb290fHRofHRyIikuc3BsaXQoInwiKQ0KKTsNCg0KZnVuY3Rpb24gc3RyaW5nKHN0YXRlKSB7DQogICAgcmV0dXJuIFt7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgIHJlZ2V4IDogJyIuKj8iJw0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICdbIl0uKicsDQogICAgICAgIG5leHQgOiBzdGF0ZSArICJfcXFzdHJpbmciDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICByZWdleCA6ICInLio/JyINCiAgICB9LCB7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgcmVnZXggOiAiWyddLioiLA0KICAgICAgICBuZXh0IDogc3RhdGUgKyAiX3FzdHJpbmciDQogICAgfV07DQp9DQoNCmZ1bmN0aW9uIG11bHRpTGluZVN0cmluZyhxdW90ZSwgc3RhdGUpIHsNCiAgICByZXR1cm4gW3sNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICIuKj8iICsgcXVvdGUsDQogICAgICAgIG5leHQgOiBzdGF0ZQ0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICcuKycNCiAgICB9XTsNCn0NCg0KZXhwb3J0cy50YWcgPSBmdW5jdGlvbihzdGF0ZXMsIG5hbWUsIG5leHRTdGF0ZSkgew0KICAgIHN0YXRlc1tuYW1lXSA9IFt7DQogICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgIH0sIHsNCiAgICAgICAgLy90b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgIA0KICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgIGlmICggdmFsdWU9PT0nYScgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5hbmNob3IiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlPT09J2ltZycgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5pbWFnZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc2NyaXB0JyApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLnNjcmlwdCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc3R5bGUnICkgew0KICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuc3R5bGUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoZm9ybVRhZ3MuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLmZvcm0iOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGFibGVUYWdzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy50YWJsZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwgICAgICAgIA0KICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgIHJlZ2V4IDogIlstX2EtekEtWjAtOTohXSsiLA0KICAgICAgICBuZXh0IDogbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiIA0KICAgIH0sIHsNCiAgICAgICAgdG9rZW46ICJlbXB0eSIsDQogICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgbmV4dCA6IG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Ig0KICAgIH1dOw0KDQogICAgc3RhdGVzW25hbWUgKyAiX3FzdHJpbmciXSA9IG11bHRpTGluZVN0cmluZygiJyIsIG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Iik7DQogICAgc3RhdGVzW25hbWUgKyAiX3Fxc3RyaW5nIl0gPSBtdWx0aUxpbmVTdHJpbmcoIlwiIiwgbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiKTsNCiAgICANCiAgICBzdGF0ZXNbbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiXSA9IFt7DQogICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICJcLz8+IiwNCiAgICAgICAgbmV4dCA6IG5leHRTdGF0ZQ0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgIHJlZ2V4IDogIj0iDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUiLA0KICAgICAgICByZWdleCA6ICJbLV9hLXpBLVowLTk6XSsiDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICB9XS5jb25jYXQoc3RyaW5nKG5hbWUpKTsNCn07DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXI7DQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQoNCnZhciBYbWxCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQogICAgDQogICAgdGhpcy5pbmhlcml0KENzdHlsZUJlaGF2aW91ciwgWyJzdHJpbmdfZHF1b3RlcyJdKTsgLy8gR2V0IHN0cmluZyBiZWhhdmlvdXINCiAgICANCiAgICB0aGlzLmFkZCgiYnJhY2tldHMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnPCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJzw+JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnPicpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICc+JykgeyAvLyBuZWVkIHNvbWUga2luZCBvZiBtYXRjaGluZyBjaGVjayBoZXJlDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhcnMgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFycyA9PSAnPC8nKSB7DQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpKSArIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCiAgICANCn0NCm9vcC5pbmhlcml0cyhYbWxCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuWG1sQmVoYXZpb3VyID0gWG1sQmVoYXZpb3VyOw0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy94bWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCAnYWNlL3Rva2VuX2l0ZXJhdG9yJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi8uLi9saWIvbGFuZyIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KdmFyIFRva2VuSXRlcmF0b3IgPSByZXF1aXJlKCIuLi8uLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3I7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbih2b2lkRWxlbWVudHMpIHsNCiAgICBCYXNlRm9sZE1vZGUuY2FsbCh0aGlzKTsNCiAgICB0aGlzLnZvaWRFbGVtZW50cyA9IHZvaWRFbGVtZW50cyB8fCB7fTsNCn07DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciB0YWcgPSB0aGlzLl9nZXRGaXJzdFRhZ0luTGluZShzZXNzaW9uLCByb3cpOw0KDQogICAgICAgIGlmICh0YWcuY2xvc2luZykNCiAgICAgICAgICAgIHJldHVybiBmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCIgPyAiZW5kIiA6ICIiOw0KDQogICAgICAgIGlmICghdGFnLnRhZ05hbWUgfHwgdGhpcy52b2lkRWxlbWVudHNbdGFnLnRhZ05hbWUudG9Mb3dlckNhc2UoKV0pDQogICAgICAgICAgICByZXR1cm4gIiI7DQoNCiAgICAgICAgaWYgKHRhZy5zZWxmQ2xvc2luZykNCiAgICAgICAgICAgIHJldHVybiAiIjsNCg0KICAgICAgICBpZiAodGFnLnZhbHVlLmluZGV4T2YoIi8iICsgdGFnLnRhZ05hbWUpICE9PSAtMSkNCiAgICAgICAgICAgIHJldHVybiAiIjsNCg0KICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93KSB7DQogICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2Vucyhyb3csIHJvdylbMF0udG9rZW5zOw0KICAgICAgICB2YXIgdmFsdWUgPSAiIjsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsNCiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlLmluZGV4T2YoIm1ldGEudGFnIikgPT09IDApDQogICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW4udmFsdWU7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgdmFsdWUgKz0gbGFuZy5zdHJpbmdSZXBlYXQoIiAiLCB0b2tlbi52YWx1ZS5sZW5ndGgpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgIH07DQoNCiAgICB0aGlzLnRhZ1JlID0gL14oXHMqKSg8PyhcLz8pKFstX2EtekEtWjAtOTohXSopXHMqKFwvPyk+PykvOw0KICAgIHRoaXMuX3BhcnNlVGFnID0gZnVuY3Rpb24odGFnKSB7DQogICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSB0aGlzLnRhZ1JlLmV4ZWModGFnKTsNCiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMudGFnUmUubGFzdEluZGV4IHx8IDA7DQogICAgICAgIHRoaXMudGFnUmUubGFzdEluZGV4ID0gMDsNCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdmFsdWU6IHRhZywNCiAgICAgICAgICAgIG1hdGNoOiBtYXRjaCA/IG1hdGNoWzJdIDogIiIsDQogICAgICAgICAgICBjbG9zaW5nOiBtYXRjaCA/ICEhbWF0Y2hbM10gOiBmYWxzZSwNCiAgICAgICAgICAgIHNlbGZDbG9zaW5nOiBtYXRjaCA/ICEhbWF0Y2hbNV0gfHwgbWF0Y2hbMl0gPT0gIi8+IiA6IGZhbHNlLA0KICAgICAgICAgICAgdGFnTmFtZTogbWF0Y2ggPyBtYXRjaFs0XSA6ICIiLA0KICAgICAgICAgICAgY29sdW1uOiBtYXRjaFsxXSA/IGNvbHVtbiArIG1hdGNoWzFdLmxlbmd0aCA6IGNvbHVtbg0KICAgICAgICB9Ow0KICAgIH07DQogICAgDQogICAgLyoqDQogICAgICogcmVhZHMgYSBmdWxsIHRhZyBhbmQgcGxhY2VzIHRoZSBpdGVyYXRvciBhZnRlciB0aGUgdGFnDQogICAgICovDQogICAgdGhpcy5fcmVhZFRhZ0ZvcndhcmQgPSBmdW5jdGlvbihpdGVyYXRvcikgew0KICAgICAgICB2YXIgdG9rZW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW4oKTsNCiAgICAgICAgaWYgKCF0b2tlbikNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciB2YWx1ZSA9ICIiOw0KICAgICAgICB2YXIgc3RhcnQ7DQogICAgICAgIA0KICAgICAgICBkbyB7DQogICAgICAgICAgICBpZiAodG9rZW4udHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpID09PSAwKSB7DQogICAgICAgICAgICAgICAgaWYgKCFzdGFydCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YWx1ZSArPSB0b2tlbi52YWx1ZTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiPiIpICE9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQgPSBzdGFydDsNCiAgICAgICAgICAgICAgICAgICAgdGFnLmVuZCA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoDQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnN0ZXBGb3J3YXJkKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IHdoaWxlKHRva2VuID0gaXRlcmF0b3Iuc3RlcEZvcndhcmQoKSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX3JlYWRUYWdCYWNrd2FyZCA9IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogICAgICAgIHZhciB0b2tlbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbigpOw0KICAgICAgICBpZiAoIXRva2VuKQ0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICANCiAgICAgICAgdmFyIHZhbHVlID0gIiI7DQogICAgICAgIHZhciBlbmQ7DQoNCiAgICAgICAgZG8gew0KICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUuaW5kZXhPZigibWV0YS50YWciKSA9PT0gMCkgew0KICAgICAgICAgICAgICAgIGlmICghZW5kKSB7DQogICAgICAgICAgICAgICAgICAgIGVuZCA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoDQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhbHVlID0gdG9rZW4udmFsdWUgKyB2YWx1ZTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiPCIpICE9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICB0YWcuZW5kID0gZW5kOw0KICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zdGVwQmFja3dhcmQoKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gd2hpbGUodG9rZW4gPSBpdGVyYXRvci5zdGVwQmFja3dhcmQoKSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX3BvcCA9IGZ1bmN0aW9uKHN0YWNrLCB0YWcpIHsNCiAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkgew0KICAgICAgICAgICAgDQogICAgICAgICAgICB2YXIgdG9wID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdOw0KICAgICAgICAgICAgaWYgKCF0YWcgfHwgdG9wLnRhZ05hbWUgPT0gdGFnLnRhZ05hbWUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucG9wKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZvaWRFbGVtZW50c1t0YWcudGFnTmFtZV0pIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZvaWRFbGVtZW50c1t0b3AudGFnTmFtZV0pIHsNCiAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTsNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGZpcnN0VGFnID0gdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoc2Vzc2lvbiwgcm93KTsNCiAgICAgICAgDQogICAgICAgIGlmICghZmlyc3RUYWcubWF0Y2gpDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgDQogICAgICAgIHZhciBpc0JhY2t3YXJkID0gZmlyc3RUYWcuY2xvc2luZyB8fCBmaXJzdFRhZy5zZWxmQ2xvc2luZzsNCiAgICAgICAgdmFyIHN0YWNrID0gW107DQogICAgICAgIHZhciB0YWc7DQogICAgICAgIA0KICAgICAgICBpZiAoIWlzQmFja3dhcmQpIHsNCiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IG5ldyBUb2tlbkl0ZXJhdG9yKHNlc3Npb24sIHJvdywgZmlyc3RUYWcuY29sdW1uKTsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IHJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IGZpcnN0VGFnLmNvbHVtbiArIGZpcnN0VGFnLnRhZ05hbWUubGVuZ3RoICsgMg0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHdoaWxlICh0YWcgPSB0aGlzLl9yZWFkVGFnRm9yd2FyZChpdGVyYXRvcikpIHsNCiAgICAgICAgICAgICAgICBpZiAodGFnLnNlbGZDbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCB0YWcuZW5kKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHRhZy5jbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcChzdGFjaywgdGFnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIHRhZy5zdGFydCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRhZykNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcihzZXNzaW9uLCByb3csIGZpcnN0VGFnLmNvbHVtbiArIGZpcnN0VGFnLm1hdGNoLmxlbmd0aCk7DQogICAgICAgICAgICB2YXIgZW5kID0gew0KICAgICAgICAgICAgICAgIHJvdzogcm93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogZmlyc3RUYWcuY29sdW1uDQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgDQogICAgICAgICAgICB3aGlsZSAodGFnID0gdGhpcy5fcmVhZFRhZ0JhY2t3YXJkKGl0ZXJhdG9yKSkgew0KICAgICAgICAgICAgICAgIGlmICh0YWcuc2VsZkNsb3NpbmcpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFjay5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5zdGFydC5jb2x1bW4gKz0gdGFnLnRhZ05hbWUubGVuZ3RoICsgMjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIHRhZy5lbmQpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoIXRhZy5jbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcChzdGFjaywgdGFnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIGVuZCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godGFnKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2h0bWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL21vZGUvamF2YXNjcmlwdCcsICdhY2UvbW9kZS9jc3MnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9odG1sX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgJ2FjZS9tb2RlL2ZvbGRpbmcvaHRtbCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgSmF2YVNjcmlwdE1vZGUgPSByZXF1aXJlKCIuL2phdmFzY3JpcHQiKS5Nb2RlOw0KdmFyIENzc01vZGUgPSByZXF1aXJlKCIuL2NzcyIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIEh0bWxIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vaHRtbF9oaWdobGlnaHRfcnVsZXMiKS5IdG1sSGlnaGxpZ2h0UnVsZXM7DQp2YXIgWG1sQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9iZWhhdmlvdXIveG1sIikuWG1sQmVoYXZpb3VyOw0KdmFyIEh0bWxGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9odG1sIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdmFyIGhpZ2hsaWdodGVyID0gbmV3IEh0bWxIaWdobGlnaHRSdWxlcygpOw0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIoaGlnaGxpZ2h0ZXIuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IFhtbEJlaGF2aW91cigpOw0KICAgIA0KICAgIHRoaXMuJGVtYmVkcyA9IGhpZ2hsaWdodGVyLmdldEVtYmVkcygpOw0KICAgIHRoaXMuY3JlYXRlTW9kZURlbGVnYXRlcyh7DQogICAgICAgICJqcy0iOiBKYXZhU2NyaXB0TW9kZSwNCiAgICAgICAgImNzcy0iOiBDc3NNb2RlDQogICAgfSk7DQogICAgDQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgSHRtbEZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHJldHVybiAwOw0KICAgIH07DQoNCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICByZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOw0KICAgIH07DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2NzcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBDc3NIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgV29ya2VyQ2xpZW50ID0gcmVxdWlyZSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQ7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgQ3NzSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpLCAiaSIpOw0KICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gImNTdHlsZSI7DQoNCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOw0KDQogICAgICAgIC8vIGlnbm9yZSBicmFjZXMgaW4gY29tbWVudHMNCiAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKS50b2tlbnM7DQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXi4qXHtccyokLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXJDbGllbnQoWyJhY2UiXSwgIndvcmtlci1jc3MuanMiLCAiYWNlL21vZGUvY3NzX3dvcmtlciIsICJXb3JrZXIiKTsNCiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigiY3NzbGludCIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsNCiAgICAgICAgICAgIGUuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKG1lc3NhZ2UpIHsNCiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgIHJvdzogbWVzc2FnZS5saW5lIC0gMSwNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBtZXNzYWdlLmNvbCAtIDEsDQogICAgICAgICAgICAgICAgICAgIHRleHQ6IG1lc3NhZ2UubWVzc2FnZSwNCiAgICAgICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZS50eXBlLA0KICAgICAgICAgICAgICAgICAgICBsaW50OiBtZXNzYWdlDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhlcnJvcnMpOw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuIHdvcmtlcjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIENzc0hpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB2YXIgcHJvcGVydGllcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCItbW96LWFwcGVhcmFuY2V8LW1vei1ib3gtc2l6aW5nfC13ZWJraXQtYm94LXNpemluZ3wtbW96LW91dGxpbmUtcmFkaXVzfC1tb3otdHJhbnNmb3JtfC13ZWJraXQtdHJhbnNmb3JtfCIgKw0KICAgICAgICAiYXBwZWFyYW5jZXxhemltdXRofGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtaW1hZ2V8IiArDQogICAgICAgICJiYWNrZ3JvdW5kLW9yaWdpbnxiYWNrZ3JvdW5kLXBvc2l0aW9ufGJhY2tncm91bmQtcmVwZWF0fGJhY2tncm91bmR8Ym9yZGVyLWJvdHRvbS1jb2xvcnwiICsNCiAgICAgICAgImJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS13aWR0aHxib3JkZXItYm90dG9tfGJvcmRlci1jb2xsYXBzZXwiICsNCiAgICAgICAgImJvcmRlci1jb2xvcnxib3JkZXItbGVmdC1jb2xvcnxib3JkZXItbGVmdC1zdHlsZXxib3JkZXItbGVmdC13aWR0aHwiICsNCiAgICAgICAgImJvcmRlci1sZWZ0fGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHQtc3R5bGV8Ym9yZGVyLXJpZ2h0LXdpZHRofCIgKw0KICAgICAgICAiYm9yZGVyLXJpZ2h0fGJvcmRlci1zcGFjaW5nfGJvcmRlci1zdHlsZXxib3JkZXItdG9wLWNvbG9yfCIgKw0KICAgICAgICAiYm9yZGVyLXRvcC1zdHlsZXxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3B8Ym9yZGVyLXdpZHRofGJvcmRlcnwiICsNCiAgICAgICAgImJvdHRvbXxib3gtc2l6aW5nfGNhcHRpb24tc2lkZXxjbGVhcnxjbGlwfGNvbG9yfGNvbnRlbnR8Y291bnRlci1pbmNyZW1lbnR8IiArDQogICAgICAgICJjb3VudGVyLXJlc2V0fGN1ZS1hZnRlcnxjdWUtYmVmb3JlfGN1ZXxjdXJzb3J8ZGlyZWN0aW9ufGRpc3BsYXl8IiArDQogICAgICAgICJlbGV2YXRpb258ZW1wdHktY2VsbHN8ZmxvYXR8Zm9udC1mYW1pbHl8Zm9udC1zaXplLWFkanVzdHxmb250LXNpemV8IiArDQogICAgICAgICJmb250LXN0cmV0Y2h8Zm9udC1zdHlsZXxmb250LXZhcmlhbnR8Zm9udC13ZWlnaHR8Zm9udHxoZWlnaHR8bGVmdHwiICsNCiAgICAgICAgImxldHRlci1zcGFjaW5nfGxpbmUtaGVpZ2h0fGxpc3Qtc3R5bGUtaW1hZ2V8bGlzdC1zdHlsZS1wb3NpdGlvbnwiICsNCiAgICAgICAgImxpc3Qtc3R5bGUtdHlwZXxsaXN0LXN0eWxlfG1hcmdpbi1ib3R0b218bWFyZ2luLWxlZnR8bWFyZ2luLXJpZ2h0fCIgKw0KICAgICAgICAibWFyZ2luLXRvcHxtYXJrZXItb2Zmc2V0fG1hcmdpbnxtYXJrc3xtYXgtaGVpZ2h0fG1heC13aWR0aHxtaW4taGVpZ2h0fCIgKw0KICAgICAgICAibWluLXdpZHRofC1tb3otYm9yZGVyLXJhZGl1c3xvcGFjaXR5fG9ycGhhbnN8b3V0bGluZS1jb2xvcnxvdXRsaW5lLW9mZnNldHxvdXRsaW5lLXJhZGl1c3wiICsNCiAgICAgICAgIm91dGxpbmUtc3R5bGV8b3V0bGluZS13aWR0aHxvdXRsaW5lfG92ZXJmbG93fG92ZXJmbG93LXh8b3ZlcmZsb3cteXxwYWRkaW5nLWJvdHRvbXwiICsNCiAgICAgICAgInBhZGRpbmctbGVmdHxwYWRkaW5nLXJpZ2h0fHBhZGRpbmctdG9wfHBhZGRpbmd8cGFnZS1icmVhay1hZnRlcnwiICsNCiAgICAgICAgInBhZ2UtYnJlYWstYmVmb3JlfHBhZ2UtYnJlYWstaW5zaWRlfHBhZ2V8cGF1c2UtYWZ0ZXJ8cGF1c2UtYmVmb3JlfCIgKw0KICAgICAgICAicGF1c2V8cGl0Y2gtcmFuZ2V8cGl0Y2h8cGxheS1kdXJpbmd8cG9pbnRlci1ldmVudHN8cG9zaXRpb258cXVvdGVzfHJlc2l6ZXxyaWNobmVzc3xyaWdodHwiICsNCiAgICAgICAgInNpemV8c3BlYWstaGVhZGVyfHNwZWFrLW51bWVyYWx8c3BlYWstcHVuY3R1YXRpb258c3BlZWNoLXJhdGV8c3BlYWt8IiArDQogICAgICAgICJzdHJlc3N8dGFibGUtbGF5b3V0fHRleHQtYWxpZ258dGV4dC1kZWNvcmF0aW9ufHRleHQtaW5kZW50fCIgKw0KICAgICAgICAidGV4dC1zaGFkb3d8dGV4dC10cmFuc2Zvcm18dG9wfHRyYW5zZm9ybXx1bmljb2RlLWJpZGl8dmVydGljYWwtYWxpZ258IiArDQogICAgICAgICJ2aXNpYmlsaXR5fHZvaWNlLWZhbWlseXx2b2x1bWV8d2hpdGUtc3BhY2V8d2lkb3dzfHdpZHRofHdvcmQtc3BhY2luZ3wiICsNCiAgICAgICAgInotaW5kZXgiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBmdW5jdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgicmdifHJnYmF8dXJsfGF0dHJ8Y291bnRlcnxjb3VudGVycyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJhYnNvbHV0ZXxhbGwtc2Nyb2xsfGFsd2F5c3xhcm1lbmlhbnxhdXRvfGJhc2VsaW5lfGJlbG93fGJpZGktb3ZlcnJpZGV8IiArDQogICAgICAgICJibG9ja3xib2xkfGJvbGRlcnxib3JkZXItYm94fGJvdGh8Ym90dG9tfGJyZWFrLWFsbHxicmVhay13b3JkfGNhcGl0YWxpemV8Y2VudGVyfCIgKw0KICAgICAgICAiY2hhcnxjaXJjbGV8Y2prLWlkZW9ncmFwaGljfGNvbC1yZXNpemV8Y29sbGFwc2V8Y29udGVudC1ib3h8Y3Jvc3NoYWlyfGRhc2hlZHwiICsNCiAgICAgICAgImRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGVmYXVsdHxkaXNhYmxlZHxkaXNjfCIgKw0KICAgICAgICAiZGlzdHJpYnV0ZS1hbGwtbGluZXN8ZGlzdHJpYnV0ZS1sZXR0ZXJ8ZGlzdHJpYnV0ZS1zcGFjZXwiICsNCiAgICAgICAgImRpc3RyaWJ1dGV8ZG90dGVkfGRvdWJsZXxlLXJlc2l6ZXxlbGxpcHNpc3xmaXhlZHxnZW9yZ2lhbnxncm9vdmV8IiArDQogICAgICAgICJoYW5kfGhlYnJld3xoZWxwfGhpZGRlbnxoaXJhZ2FuYS1pcm9oYXxoaXJhZ2FuYXxob3Jpem9udGFsfCIgKw0KICAgICAgICAiaWRlb2dyYXBoLWFscGhhfGlkZW9ncmFwaC1udW1lcmljfGlkZW9ncmFwaC1wYXJlbnRoZXNpc3wiICsNCiAgICAgICAgImlkZW9ncmFwaC1zcGFjZXxpbmFjdGl2ZXxpbmhlcml0fGlubGluZS1ibG9ja3xpbmxpbmV8aW5zZXR8aW5zaWRlfCIgKw0KICAgICAgICAiaW50ZXItaWRlb2dyYXBofGludGVyLXdvcmR8aXRhbGljfGp1c3RpZnl8a2F0YWthbmEtaXJvaGF8a2F0YWthbmF8IiArDQogICAgICAgICJrZWVwLWFsbHxsZWZ0fGxpZ2h0ZXJ8bGluZS1lZGdlfGxpbmUtdGhyb3VnaHxsaW5lfGxpc3QtaXRlbXxsb29zZXwiICsNCiAgICAgICAgImxvd2VyLWFscGhhfGxvd2VyLWdyZWVrfGxvd2VyLWxhdGlufGxvd2VyLXJvbWFufGxvd2VyY2FzZXxsci10YnxsdHJ8IiArDQogICAgICAgICJtZWRpdW18bWlkZGxlfG1vdmV8bi1yZXNpemV8bmUtcmVzaXplfG5ld3NwYXBlcnxuby1kcm9wfG5vLXJlcGVhdHwiICsNCiAgICAgICAgIm53LXJlc2l6ZXxub25lfG5vcm1hbHxub3QtYWxsb3dlZHxub3dyYXB8b2JsaXF1ZXxvdXRzZXR8b3V0c2lkZXwiICsNCiAgICAgICAgIm92ZXJsaW5lfHBvaW50ZXJ8cHJvZ3Jlc3N8cmVsYXRpdmV8cmVwZWF0LXh8cmVwZWF0LXl8cmVwZWF0fHJpZ2h0fCIgKw0KICAgICAgICAicmlkZ2V8cm93LXJlc2l6ZXxydGx8cy1yZXNpemV8c2Nyb2xsfHNlLXJlc2l6ZXxzZXBhcmF0ZXxzbWFsbC1jYXBzfCIgKw0KICAgICAgICAic29saWR8c3F1YXJlfHN0YXRpY3xzdHJpY3R8c3VwZXJ8c3ctcmVzaXplfHRhYmxlLWZvb3Rlci1ncm91cHwiICsNCiAgICAgICAgInRhYmxlLWhlYWRlci1ncm91cHx0Yi1ybHx0ZXh0LWJvdHRvbXx0ZXh0LXRvcHx0ZXh0fHRoaWNrfHRoaW58dG9wfCIgKw0KICAgICAgICAidHJhbnNwYXJlbnR8dW5kZXJsaW5lfHVwcGVyLWFscGhhfHVwcGVyLWxhdGlufHVwcGVyLXJvbWFufHVwcGVyY2FzZXwiICsNCiAgICAgICAgInZlcnRpY2FsLWlkZW9ncmFwaGljfHZlcnRpY2FsLXRleHR8dmlzaWJsZXx3LXJlc2l6ZXx3YWl0fHdoaXRlc3BhY2V8IiArDQogICAgICAgICJ6ZXJvIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgY29sb3JzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImFxdWF8YmxhY2t8Ymx1ZXxmdWNoc2lhfGdyYXl8Z3JlZW58bGltZXxtYXJvb258bmF2eXxvbGl2ZXxvcmFuZ2V8IiArDQogICAgICAgICJwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvdyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHZhciBudW1SZSA9ICJcXC0/KD86KD86WzAtOV0rKXwoPzpbMC05XSpcXC5bMC05XSspKSI7DQoNCiAgICB2YXIgYmFzZV9ydWxlc2V0ID0gWw0KICAgICAgICB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgbmV4dCA6ICJydWxlc2V0X2NvbW1lbnQiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwNCiAgICAgICAgICAgIHJlZ2V4IDogbnVtUmUgKyAiKD86ZW18ZXh8cHh8Y218bW18aW58cHR8cGN8ZGVnfHJhZHxncmFkfG1zfHN8aHp8a2h6fCUpIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgIC8vIGhleDYgY29sb3INCiAgICAgICAgICAgIHJlZ2V4IDogIiNbYS1mMC05XXs2fSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleDMgY29sb3INCiAgICAgICAgICAgIHJlZ2V4IDogIiNbYS1mMC05XXszfSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC50eXBlIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuY29uc3RhbnQiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xvcnMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmNvbnN0YW50LmNvbG9yIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAidGV4dCI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcLT9bYS16QS1aX11bYS16QS1aMC05X1xcLV0qIg0KICAgICAgICB9DQogICAgICBdOw0KDQogICAgdmFyIHJ1bGVzZXQgPSBsYW5nLmNvcHlBcnJheShiYXNlX3J1bGVzZXQpOw0KICAgIHJ1bGVzZXQudW5zaGlmdCh7DQogICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgIHJlZ2V4IDogIlxcfSIsDQogICAgICAgIG5leHQ6ICAgInN0YXJ0Ig0KICAgIH0pOw0KDQogICAgdmFyIG1lZGlhX3J1bGVzZXQgPSBsYW5nLmNvcHlBcnJheSggYmFzZV9ydWxlc2V0ICk7DQogICAgbWVkaWFfcnVsZXNldC51bnNoaWZ0KHsNCiAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgcmVnZXggOiAiXFx9IiwNCiAgICAgICAgbmV4dDogICAibWVkaWEiDQogICAgfSk7DQoNCiAgICB2YXIgYmFzZV9jb21tZW50ID0gW3sNCiAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgIH1dOw0KDQogICAgdmFyIGNvbW1lbnQgPSBsYW5nLmNvcHlBcnJheShiYXNlX2NvbW1lbnQpOw0KICAgIGNvbW1lbnQudW5zaGlmdCh7DQogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICB9KTsNCg0KICAgIHZhciBtZWRpYV9jb21tZW50ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9jb21tZW50KTsNCiAgICBtZWRpYV9jb21tZW50LnVuc2hpZnQoew0KICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgIG5leHQgOiAibWVkaWEiDQogICAgfSk7DQoNCiAgICB2YXIgcnVsZXNldF9jb21tZW50ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9jb21tZW50KTsNCiAgICBydWxlc2V0X2NvbW1lbnQudW5zaGlmdCh7DQogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgbmV4dCA6ICJydWxlc2V0Ig0KICAgIH0pOw0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW46ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgcmVnZXg6ICJcXHsiLA0KICAgICAgICAgICAgbmV4dDogICJydWxlc2V0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsDQogICAgICAgICAgICByZWdleDogIkAuKj97IiwNCiAgICAgICAgICAgIG5leHQ6ICAibWVkaWEiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJrZXl3b3JkIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiI1thLXowLTktX10rIg0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAidmFyaWFibGUiLA0KICAgICAgICAgICAgcmVnZXg6ICJcXC5bYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsDQogICAgICAgICAgICByZWdleDogIjpbYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogImNvbnN0YW50IiwNCiAgICAgICAgICAgIHJlZ2V4OiAiW2EtejAtOS1fXSsiDQogICAgICAgIH1dLA0KDQogICAgICAgICJtZWRpYSIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICBuZXh0IDogIm1lZGlhX2NvbW1lbnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuOiAicGFyZW4ubHBhcmVuIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiXFx7IiwNCiAgICAgICAgICAgIG5leHQ6ICAibWVkaWFfcnVsZXNldCINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsDQogICAgICAgICAgICByZWdleDogIlxcfSIsDQogICAgICAgICAgICBuZXh0OiAgInN0YXJ0Ig0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAia2V5d29yZCIsDQogICAgICAgICAgICByZWdleDogIiNbYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogInZhcmlhYmxlIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiXFwuW2EtejAtOS1fXSsiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJzdHJpbmciLA0KICAgICAgICAgICAgcmVnZXg6ICI6W2EtejAtOS1fXSsiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJjb25zdGFudCIsDQogICAgICAgICAgICByZWdleDogIlthLXowLTktX10rIg0KICAgICAgICB9XSwNCg0KICAgICAgICAiY29tbWVudCIgOiBjb21tZW50LA0KDQogICAgICAgICJydWxlc2V0IiA6IHJ1bGVzZXQsDQogICAgICAgICJydWxlc2V0X2NvbW1lbnQiIDogcnVsZXNldF9jb21tZW50LA0KDQogICAgICAgICJtZWRpYV9ydWxlc2V0IiA6IG1lZGlhX3J1bGVzZXQsDQogICAgICAgICJtZWRpYV9jb21tZW50IiA6IG1lZGlhX2NvbW1lbnQNCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKENzc0hpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkNzc0hpZ2hsaWdodFJ1bGVzID0gQ3NzSGlnaGxpZ2h0UnVsZXM7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvaHRtbF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUveG1sX3V0aWwnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgQ3NzSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlczsNCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOw0KdmFyIHhtbFV0aWwgPSByZXF1aXJlKCIuL3htbF91dGlsIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIEh0bWxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICBzdGFydCA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXCFcXFtDREFUQVxcWyIsDQogICAgICAgICAgICBuZXh0IDogImNkYXRhIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ4bWxfcGUiLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcPy4qP1xcPz4iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcIS0tIiwNCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLA0KICAgICAgICAgICAgcmVnZXggOiAiPCg/PVxzKnNjcmlwdFxcYikiLA0KICAgICAgICAgICAgbmV4dCA6ICJzY3JpcHQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIjwoPz1ccypzdHlsZVxcYikiLA0KICAgICAgICAgICAgbmV4dCA6ICJzdHlsZSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLCAvLyBvcGVuaW5nIHRhZw0KICAgICAgICAgICAgcmVnZXggOiAiPFxcLz8iLA0KICAgICAgICAgICAgbmV4dCA6ICJ0YWciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJbXjxdKyINCiAgICAgICAgfSBdLA0KICAgIA0KICAgICAgICBjZGF0YSA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJcXF1cXF0+IiwNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgfSBdLA0KDQogICAgICAgIGNvbW1lbnQgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgcmVnZXggOiAiLio/LS0+IiwNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgIH0gXQ0KICAgIH07DQogICAgDQogICAgeG1sVXRpbC50YWcodGhpcy4kcnVsZXMsICJ0YWciLCAic3RhcnQiKTsNCiAgICB4bWxVdGlsLnRhZyh0aGlzLiRydWxlcywgInN0eWxlIiwgImNzcy1zdGFydCIpOw0KICAgIHhtbFV0aWwudGFnKHRoaXMuJHJ1bGVzLCAic2NyaXB0IiwgImpzLXN0YXJ0Iik7DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcywgImpzLSIsIFt7DQogICAgICAgIHRva2VuOiAiY29tbWVudCIsDQogICAgICAgIHJlZ2V4OiAiXFwvXFwvLiooPz08XFwvc2NyaXB0PikiLA0KICAgICAgICBuZXh0OiAidGFnIg0KICAgIH0sIHsNCiAgICAgICAgdG9rZW46ICJtZXRhLnRhZyIsDQogICAgICAgIHJlZ2V4OiAiPFxcLyg/PXNjcmlwdCkiLA0KICAgICAgICBuZXh0OiAidGFnIg0KICAgIH1dKTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoQ3NzSGlnaGxpZ2h0UnVsZXMsICJjc3MtIiwgW3sNCiAgICAgICAgdG9rZW46ICJtZXRhLnRhZyIsDQogICAgICAgIHJlZ2V4OiAiPFxcLyg/PXN0eWxlKSIsDQogICAgICAgIG5leHQ6ICJ0YWciDQogICAgfV0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEh0bWxIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5IdG1sSGlnaGxpZ2h0UnVsZXMgPSBIdG1sSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvaHRtbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvZm9sZGluZy9taXhlZCcsICdhY2UvbW9kZS9mb2xkaW5nL3htbCcsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBNaXhlZEZvbGRNb2RlID0gcmVxdWlyZSgiLi9taXhlZCIpLkZvbGRNb2RlOw0KdmFyIFhtbEZvbGRNb2RlID0gcmVxdWlyZSgiLi94bWwiKS5Gb2xkTW9kZTsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICBNaXhlZEZvbGRNb2RlLmNhbGwodGhpcywgbmV3IFhtbEZvbGRNb2RlKHsNCiAgICAgICAgLy8gdm9pZCBlbGVtZW50cw0KICAgICAgICAiYXJlYSI6IDEsDQogICAgICAgICJiYXNlIjogMSwNCiAgICAgICAgImJyIjogMSwNCiAgICAgICAgImNvbCI6IDEsDQogICAgICAgICJjb21tYW5kIjogMSwNCiAgICAgICAgImVtYmVkIjogMSwNCiAgICAgICAgImhyIjogMSwNCiAgICAgICAgImltZyI6IDEsDQogICAgICAgICJpbnB1dCI6IDEsDQogICAgICAgICJrZXlnZW4iOiAxLA0KICAgICAgICAibGluayI6IDEsDQogICAgICAgICJtZXRhIjogMSwNCiAgICAgICAgInBhcmFtIjogMSwNCiAgICAgICAgInNvdXJjZSI6IDEsDQogICAgICAgICJ0cmFjayI6IDEsDQogICAgICAgICJ3YnIiOiAxLA0KICAgICAgICANCiAgICAgICAgLy8gb3B0aW9uYWwgdGFncyANCiAgICAgICAgImxpIjogMSwNCiAgICAgICAgImR0IjogMSwNCiAgICAgICAgImRkIjogMSwNCiAgICAgICAgInAiOiAxLA0KICAgICAgICAicnQiOiAxLA0KICAgICAgICAicnAiOiAxLA0KICAgICAgICAib3B0Z3JvdXAiOiAxLA0KICAgICAgICAib3B0aW9uIjogMSwNCiAgICAgICAgImNvbGdyb3VwIjogMSwNCiAgICAgICAgInRkIjogMSwNCiAgICAgICAgInRoIjogMQ0KICAgIH0pLCB7DQogICAgICAgICJqcy0iOiBuZXcgQ1N0eWxlRm9sZE1vZGUoKSwNCiAgICAgICAgImNzcy0iOiBuZXcgQ1N0eWxlRm9sZE1vZGUoKQ0KICAgIH0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBNaXhlZEZvbGRNb2RlKTsNCg0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9taXhlZCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKGRlZmF1bHRNb2RlLCBzdWJNb2Rlcykgew0KICAgIHRoaXMuZGVmYXVsdE1vZGUgPSBkZWZhdWx0TW9kZTsNCiAgICB0aGlzLnN1Yk1vZGVzID0gc3ViTW9kZXM7DQp9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCg0KICAgIHRoaXMuJGdldE1vZGUgPSBmdW5jdGlvbihzdGF0ZSkgew0KICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5zdWJNb2Rlcykgew0KICAgICAgICAgICAgaWYgKHN0YXRlLmluZGV4T2Yoa2V5KSA9PT0gMCkNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdWJNb2Rlc1trZXldOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQogICAgDQogICAgdGhpcy4kdHJ5TW9kZSA9IGZ1bmN0aW9uKHN0YXRlLCBzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbW9kZSA9IHRoaXMuJGdldE1vZGUoc3RhdGUpOw0KICAgICAgICByZXR1cm4gKG1vZGUgPyBtb2RlLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIDogIiIpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICByZXR1cm4gKA0KICAgICAgICAgICAgdGhpcy4kdHJ5TW9kZShzZXNzaW9uLmdldFN0YXRlKHJvdy0xKSwgc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHx8DQogICAgICAgICAgICB0aGlzLiR0cnlNb2RlKHNlc3Npb24uZ2V0U3RhdGUocm93KSwgc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHx8DQogICAgICAgICAgICB0aGlzLmRlZmF1bHRNb2RlLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpDQogICAgICAgICk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIG1vZGUgPSB0aGlzLiRnZXRNb2RlKHNlc3Npb24uZ2V0U3RhdGUocm93LTEpKTsNCiAgICAgICAgDQogICAgICAgIGlmICghbW9kZSB8fCAhbW9kZS5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSkNCiAgICAgICAgICAgIG1vZGUgPSB0aGlzLiRnZXRNb2RlKHNlc3Npb24uZ2V0U3RhdGUocm93KSk7DQogICAgICAgIA0KICAgICAgICBpZiAoIW1vZGUgfHwgIW1vZGUuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykpDQogICAgICAgICAgICBtb2RlID0gdGhpcy5kZWZhdWx0TW9kZTsNCiAgICAgICAgDQogICAgICAgIHJldHVybiBtb2RlLmdldEZvbGRXaWRnZXRSYW5nZShzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdyk7DQogICAgfTsNCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvbWFya2Rvd25faGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL2h0bWxfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOw0KdmFyIFhtbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi94bWxfaGlnaGxpZ2h0X3J1bGVzIikuWG1sSGlnaGxpZ2h0UnVsZXM7DQp2YXIgSHRtbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9odG1sX2hpZ2hsaWdodF9ydWxlcyIpLkh0bWxIaWdobGlnaHRSdWxlczsNCnZhciBDc3NIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzOw0KDQpmdW5jdGlvbiBnaXRodWJfZW1iZWQodGFnLCBwcmVmaXgpIHsNCiAgICByZXR1cm4geyAvLyBHaXRodWIgc3R5bGUgYmxvY2sNCiAgICAgICAgdG9rZW4gOiAic3VwcG9ydC5mdW5jdGlvbiIsDQogICAgICAgIHJlZ2V4IDogIl5gYGAiICsgdGFnICsgIlxccyokIiwNCiAgICAgICAgbmV4dCAgOiBwcmVmaXggKyAic3RhcnQiDQogICAgfTsNCn0NCg0KdmFyIE1hcmtkb3duSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcw0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJlbXB0eV9saW5lIiwNCiAgICAgICAgICAgIHJlZ2V4IDogJ14kJw0KICAgICAgICB9LCB7IC8vIGNvZGUgc3BhbiBgDQogICAgICAgICAgICB0b2tlbiA6ICJzdXBwb3J0LmZ1bmN0aW9uIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIihgKykoW15cXHJdKj9bXmBdKShcXDEpIg0KICAgICAgICB9LCB7IC8vIGNvZGUgYmxvY2sNCiAgICAgICAgICAgIHRva2VuIDogInN1cHBvcnQuZnVuY3Rpb24iLA0KICAgICAgICAgICAgcmVnZXggOiAiXlsgXXs0fS4rIg0KICAgICAgICB9LCB7IC8vIGgxDQogICAgICAgICAgICB0b2tlbjogIm1hcmt1cC5oZWFkaW5nLjEiLA0KICAgICAgICAgICAgcmVnZXg6ICJePSsoPz1cXHMqJCkiDQogICAgICAgIH0sIHsgLy8gaDINCiAgICAgICAgICAgIHRva2VuOiAibWFya3VwLmhlYWRpbmcuMSIsDQogICAgICAgICAgICByZWdleDogIl5cXC0rKD89XFxzKiQpIg0KICAgICAgICB9LCB7IC8vIGhlYWRlcg0KICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAibWFya3VwLmhlYWRpbmcuIiArIHZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICByZWdleCA6ICJeI3sxLDZ9Ig0KICAgICAgICB9LCBnaXRodWJfZW1iZWQoImphdmFzY3JpcHQiLCAianMtIiksDQogICAgICAgICAgIGdpdGh1Yl9lbWJlZCgieG1sIiwgInhtbC0iKSwNCiAgICAgICAgICAgZ2l0aHViX2VtYmVkKCJodG1sIiwgImh0bWwtIiksDQogICAgICAgICAgIGdpdGh1Yl9lbWJlZCgiY3NzIiwgImNzcy0iKSwNCiAgICAgICAgeyAvLyBHaXRodWIgc3R5bGUgYmxvY2sNCiAgICAgICAgICAgIHRva2VuIDogInN1cHBvcnQuZnVuY3Rpb24iLA0KICAgICAgICAgICAgcmVnZXggOiAiXmBgYFthLXpBLVpdK1xccyokIiwNCiAgICAgICAgICAgIG5leHQgIDogImdpdGh1YmJsb2NrIg0KICAgICAgICB9LCB7IC8vIGJsb2NrIHF1b3RlDQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgcmVnZXggOiAiXj5bIF0uKyQiLA0KICAgICAgICAgICAgbmV4dCAgOiAiYmxvY2txdW90ZSINCiAgICAgICAgfSwgeyAvLyByZWZlcmVuY2UNCiAgICAgICAgICAgIHRva2VuIDogWyJ0ZXh0IiwgImNvbnN0YW50IiwgInRleHQiLCAidXJsIiwgInN0cmluZyIsICJ0ZXh0Il0sDQogICAgICAgICAgICByZWdleCA6ICJeKFsgXXswLDN9XFxbKShbXlxcXV0rKShcXF06XFxzKikoW14gXSspKFxccyooPzpbXCJdW15cIl0rW1wiXSk/XFxzKikkIg0KICAgICAgICB9LCB7IC8vIGxpbmsgYnkgcmVmZXJlbmNlDQogICAgICAgICAgICB0b2tlbiA6IFsidGV4dCIsICJzdHJpbmciLCAidGV4dCIsICJjb25zdGFudCIsICJ0ZXh0Il0sDQogICAgICAgICAgICByZWdleCA6ICIoXFxbKSgoPzpbW15cXF1dKlxcXXxbXlxcW1xcXV0pKikoXFxdWyBdPyg/OlxcblsgXSopP1xcWykoLio/KShcXF0pIg0KICAgICAgICB9LCB7IC8vIGxpbmsgYnkgdXJsDQogICAgICAgICAgICB0b2tlbiA6IFsidGV4dCIsICJzdHJpbmciLCAidGV4dCIsICJtYXJrdXAudW5kZXJsaW5lIiwgInN0cmluZyIsICJ0ZXh0Il0sDQogICAgICAgICAgICByZWdleCA6ICIoXFxbKSIrDQogICAgICAgICAgICAgICAgICAgICIoXFxbW15cXF1dKlxcXXxbXlxcW1xcXV0qKSIrDQogICAgICAgICAgICAgICAgICAgICIoXFxdXFwoWyBcXHRdKikiKw0KICAgICAgICAgICAgICAgICAgICAiKDw/KD86KD86W15cXChdKj9cXChbXlxcKV0qP1xcKVxcUyo/KXwoPzouKj8pKT4/KSIrDQogICAgICAgICAgICAgICAgICAgICIoKD86WyBcdF0qXCIoPzouKj8pXCJbIFxcdF0qKT8pIisNCiAgICAgICAgICAgICAgICAgICAgIihcXCkpIg0KICAgICAgICB9LCB7IC8vIEhSICoNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIl5bIF17MCwyfSg/OlsgXT9cXCpbIF0/KXszLH1cXHMqJCINCiAgICAgICAgfSwgeyAvLyBIUiAtDQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudCIsDQogICAgICAgICAgICByZWdleCA6ICJeWyBdezAsMn0oPzpbIF0/XFwtWyBdPyl7Myx9XFxzKiQiDQogICAgICAgIH0sIHsgLy8gSFIgXw0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXlsgXXswLDJ9KD86WyBdP1xcX1sgXT8pezMsfVxccyokIg0KICAgICAgICB9LCB7IC8vIGxpc3QNCiAgICAgICAgICAgIHRva2VuIDogIm1hcmt1cC5saXN0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIl5cXHN7MCwzfSg/OlsqKy1dfFxcZCtcXC4pXFxzKyIsDQogICAgICAgICAgICBuZXh0ICA6ICJsaXN0YmxvY2siDQogICAgICAgIH0sIHsgLy8gc3Ryb25nICoqIF9fDQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgcmVnZXggOiAiKFsqXXsyfXxbX117Mn0oPz1cXFMpKShbXlxccl0qP1xcU1sqX10qKShcXDEpIg0KICAgICAgICB9LCB7IC8vIGVtcGhhc2lzICogXw0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIihbKl18W19dKD89XFxTKSkoW15cXHJdKj9cXFNbKl9dKikoXFwxKSINCiAgICAgICAgfSwgeyAvLyANCiAgICAgICAgICAgIHRva2VuIDogWyJ0ZXh0IiwgInVybCIsICJ0ZXh0Il0sDQogICAgICAgICAgICByZWdleCA6ICIoPCkoIisNCiAgICAgICAgICAgICAgICAgICAgICAiKD86aHR0cHM/fGZ0cHxkaWN0KTpbXidcIj5cXHNdKyIrDQogICAgICAgICAgICAgICAgICAgICAgInwiKw0KICAgICAgICAgICAgICAgICAgICAgICIoPzptYWlsdG86KT9bLS5cXHddK1xcQFstYS16MC05XSsoPzpcXC5bLWEtejAtOV0rKSpcXC5bYS16XSsiKw0KICAgICAgICAgICAgICAgICAgICAiKSg+KSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJbXlxcKl8lJGBcXFsjPD5dKyINCiAgICAgICAgfSBdLA0KICAgICAgICANCiAgICAgICAgImxpc3RibG9jayIgOiBbIHsgLy8gTGlzdHMgb25seSBlc2NhcGUgb24gY29tcGxldGVseSBibGFuayBsaW5lcy4NCiAgICAgICAgICAgIHRva2VuIDogImVtcHR5X2xpbmUiLA0KICAgICAgICAgICAgcmVnZXggOiAiXiQiLA0KICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogIm1hcmt1cC5saXN0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICB9IF0sDQogICAgICAgIA0KICAgICAgICAiYmxvY2txdW90ZSIgOiBbIHsgLy8gQkxvY2txdW90ZXMgb25seSBlc2NhcGUgb24gYmxhbmsgbGluZXMuDQogICAgICAgICAgICB0b2tlbiA6ICJlbXB0eV9saW5lIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIl5cXHMqJCIsDQogICAgICAgICAgICBuZXh0ICA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICB9IF0sDQogICAgICAgIA0KICAgICAgICAiZ2l0aHViYmxvY2siIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdXBwb3J0LmZ1bmN0aW9uIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIl5gYGAiLA0KICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN1cHBvcnQuZnVuY3Rpb24iLA0KICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgIH0gXQ0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcywgImpzLSIsIFt7DQogICAgICAgdG9rZW4gOiAic3VwcG9ydC5mdW5jdGlvbiIsDQogICAgICAgcmVnZXggOiAiXmBgYCIsDQogICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgfV0pOw0KICAgIA0KICAgIHRoaXMuZW1iZWRSdWxlcyhIdG1sSGlnaGxpZ2h0UnVsZXMsICJodG1sLSIsIFt7DQogICAgICAgdG9rZW4gOiAic3VwcG9ydC5mdW5jdGlvbiIsDQogICAgICAgcmVnZXggOiAiXmBgYCIsDQogICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgfV0pOw0KICAgIA0KICAgIHRoaXMuZW1iZWRSdWxlcyhDc3NIaWdobGlnaHRSdWxlcywgImNzcy0iLCBbew0KICAgICAgIHRva2VuIDogInN1cHBvcnQuZnVuY3Rpb24iLA0KICAgICAgIHJlZ2V4IDogIl5gYGAiLA0KICAgICAgIG5leHQgIDogInN0YXJ0Ig0KICAgIH1dKTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoWG1sSGlnaGxpZ2h0UnVsZXMsICJ4bWwtIiwgW3sNCiAgICAgICB0b2tlbiA6ICJzdXBwb3J0LmZ1bmN0aW9uIiwNCiAgICAgICByZWdleCA6ICJeYGBgIiwNCiAgICAgICBuZXh0ICA6ICJzdGFydCINCiAgICB9XSk7DQp9Ow0Kb29wLmluaGVyaXRzKE1hcmtkb3duSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuTWFya2Rvd25IaWdobGlnaHRSdWxlcyA9IE1hcmtkb3duSGlnaGxpZ2h0UnVsZXM7DQp9KTs7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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+IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46InRleHQiLHJlZ2V4OiIoPzpbXlxcXV18XFxdKD8hXFxdPikpKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj8tLT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV19LGUudGFnKHRoaXMuJHJ1bGVzLCJ0YWciLCJzdGFydCIpfTtkLmluaGVyaXRzKGcsZiksYi5YbWxIaWdobGlnaHRSdWxlcz1nfSksZGVmaW5lKCJhY2UvbW9kZS94bWxfdXRpbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBnKGEpe3JldHVyblt7dG9rZW46InN0cmluZyIscmVnZXg6JyIuKj8iJ30se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OidbIl0uKicsbmV4dDphKyJfcXFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6IicuKj8nIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKiIsbmV4dDphKyJfcXN0cmluZyJ9XX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW3t0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLio/IithLG5leHQ6Yn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0idXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2xhbmciKSxlPWQuYXJyYXlUb01hcCgiYnV0dG9ufGZvcm18aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhIi5zcGxpdCgifCIpKSxmPWQuYXJyYXlUb01hcCgidGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dHIiLnNwbGl0KCJ8IikpO2IudGFnPWZ1bmN0aW9uKGEsYixjKXthW2JdPVt7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09ImEiPyJtZXRhLnRhZy5hbmNob3IiOmE9PT0iaW1nIj8ibWV0YS50YWcuaW1hZ2UiOmE9PT0ic2NyaXB0Ij8ibWV0YS50YWcuc2NyaXB0IjphPT09InN0eWxlIj8ibWV0YS50YWcuc3R5bGUiOmUuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT8ibWV0YS50YWcuZm9ybSI6Zi5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpPyJtZXRhLnRhZy50YWJsZSI6Im1ldGEudGFnIn0sbWVyZ2U6ITAscmVnZXg6IlstX2EtekEtWjAtOTohXSsiLG5leHQ6YisiX2VtYmVkX2F0dHJpYnV0ZV9saXN0In0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDpiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QifV0sYVtiKyJfcXN0cmluZyJdPWgoIiciLGIrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCIpLGFbYisiX3Fxc3RyaW5nIl09aCgnIicsYisiX2VtYmVkX2F0dHJpYnV0ZV9saXN0IiksYVtiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QiXT1be3Rva2VuOiJtZXRhLnRhZyIsbWVyZ2U6ITAscmVnZXg6Ii8/PiIsbmV4dDpjfSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiI9In0se3Rva2VuOiJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUiLHJlZ2V4OiJbLV9hLXpBLVowLTk6XSsifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0uY29uY2F0KGcoYikpfX0pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL3htbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIiwiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9YSgiLi9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXIsZz1mdW5jdGlvbigpe3RoaXMuaW5oZXJpdChmLFsic3RyaW5nX2RxdW90ZXMiXSksdGhpcy5hZGQoImJyYWNrZXRzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSI8Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/ITE6e3RleHQ6Ijw+IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSI+Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iPiIpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX1lbHNlIGlmKGU9PSJcbiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGs9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMik7aWYoaz09IjwvIil7dmFyIGw9dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUoaC5yb3cpKStkLmdldFRhYlN0cmluZygpLG09dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUoaC5yb3cpKTtyZXR1cm57dGV4dDoiXG4iK2wrIlxuIittLHNlbGVjdGlvbjpbMSxsLmxlbmd0aCwxLGwubGVuZ3RoXX19fX0pfTtkLmluaGVyaXRzKGcsZSksYi5YbWxCZWhhdmlvdXI9Z30pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy94bWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi8uLi9saWIvbGFuZyIpLGY9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxnPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsaD1hKCIuLi8uLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3IsaT1iLkZvbGRNb2RlPWZ1bmN0aW9uKGEpe2cuY2FsbCh0aGlzKSx0aGlzLnZvaWRFbGVtZW50cz1hfHx7fX07ZC5pbmhlcml0cyhpLGcpLGZ1bmN0aW9uKCl7dGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9nZXRGaXJzdFRhZ0luTGluZShhLGMpO3JldHVybiBkLmNsb3Npbmc/Yj09Im1hcmtiZWdpbmVuZCI/ImVuZCI6IiI6IWQudGFnTmFtZXx8dGhpcy52b2lkRWxlbWVudHNbZC50YWdOYW1lLnRvTG93ZXJDYXNlKCldPyIiOmQuc2VsZkNsb3Npbmc/IiI6ZC52YWx1ZS5pbmRleE9mKCIvIitkLnRhZ05hbWUpIT09LTE/IiI6InN0YXJ0In0sdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldFRva2VucyhiLGIpWzBdLnRva2VucyxkPSIiO2Zvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKXt2YXIgZz1jW2ZdO2cudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MD9kKz1nLnZhbHVlOmQrPWUuc3RyaW5nUmVwZWF0KCIgIixnLnZhbHVlLmxlbmd0aCl9cmV0dXJuIHRoaXMuX3BhcnNlVGFnKGQpfSx0aGlzLnRhZ1JlPS9eKFxzKikoPD8oXC8/KShbLV9hLXpBLVowLTk6IV0qKVxzKihcLz8pPj8pLyx0aGlzLl9wYXJzZVRhZz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnRhZ1JlLmV4ZWMoYSksYz10aGlzLnRhZ1JlLmxhc3RJbmRleHx8MDtyZXR1cm4gdGhpcy50YWdSZS5sYXN0SW5kZXg9MCx7dmFsdWU6YSxtYXRjaDpiP2JbMl06IiIsY2xvc2luZzpiPyEhYlszXTohMSxzZWxmQ2xvc2luZzpiPyEhYls1XXx8YlsyXT09Ii8+IjohMSx0YWdOYW1lOmI/Yls0XToiIixjb2x1bW46YlsxXT9jK2JbMV0ubGVuZ3RoOmN9fSx0aGlzLl9yZWFkVGFnRm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYj1hLmdldEN1cnJlbnRUb2tlbigpO2lmKCFiKXJldHVybiBudWxsO3ZhciBjPSIiLGQ7ZG8gaWYoYi50eXBlLmluZGV4T2YoIm1ldGEudGFnIik9PT0wKXtpZighZCl2YXIgZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9O2MrPWIudmFsdWU7aWYoYy5pbmRleE9mKCI+IikhPT0tMSl7dmFyIGU9dGhpcy5fcGFyc2VUYWcoYyk7cmV0dXJuIGUuc3RhcnQ9ZCxlLmVuZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrYi52YWx1ZS5sZW5ndGh9LGEuc3RlcEZvcndhcmQoKSxlfX13aGlsZShiPWEuc3RlcEZvcndhcmQoKSk7cmV0dXJuIG51bGx9LHRoaXMuX3JlYWRUYWdCYWNrd2FyZD1mdW5jdGlvbihhKXt2YXIgYj1hLmdldEN1cnJlbnRUb2tlbigpO2lmKCFiKXJldHVybiBudWxsO3ZhciBjPSIiLGQ7ZG8gaWYoYi50eXBlLmluZGV4T2YoIm1ldGEudGFnIik9PT0wKXtkfHwoZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrYi52YWx1ZS5sZW5ndGh9KSxjPWIudmFsdWUrYztpZihjLmluZGV4T2YoIjwiKSE9PS0xKXt2YXIgZT10aGlzLl9wYXJzZVRhZyhjKTtyZXR1cm4gZS5lbmQ9ZCxlLnN0YXJ0PXtyb3c6YS5nZXRDdXJyZW50VG9rZW5Sb3coKSxjb2x1bW46YS5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKX0sYS5zdGVwQmFja3dhcmQoKSxlfX13aGlsZShiPWEuc3RlcEJhY2t3YXJkKCkpO3JldHVybiBudWxsfSx0aGlzLl9wb3A9ZnVuY3Rpb24oYSxiKXt3aGlsZShhLmxlbmd0aCl7dmFyIGM9YVthLmxlbmd0aC0xXTtpZighYnx8Yy50YWdOYW1lPT1iLnRhZ05hbWUpcmV0dXJuIGEucG9wKCk7aWYodGhpcy52b2lkRWxlbWVudHNbYi50YWdOYW1lXSlyZXR1cm47aWYodGhpcy52b2lkRWxlbWVudHNbYy50YWdOYW1lXSl7YS5wb3AoKTtjb250aW51ZX1yZXR1cm4gbnVsbH19LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9nZXRGaXJzdFRhZ0luTGluZShhLGMpO2lmKCFkLm1hdGNoKXJldHVybiBudWxsO3ZhciBlPWQuY2xvc2luZ3x8ZC5zZWxmQ2xvc2luZyxnPVtdLGk7aWYoIWUpe3ZhciBqPW5ldyBoKGEsYyxkLmNvbHVtbiksaz17cm93OmMsY29sdW1uOmQuY29sdW1uK2QudGFnTmFtZS5sZW5ndGgrMn07d2hpbGUoaT10aGlzLl9yZWFkVGFnRm9yd2FyZChqKSl7aWYoaS5zZWxmQ2xvc2luZyl7aWYoIWcubGVuZ3RoKXJldHVybiBpLnN0YXJ0LmNvbHVtbis9aS50YWdOYW1lLmxlbmd0aCsyLGkuZW5kLmNvbHVtbi09MixmLmZyb21Qb2ludHMoaS5zdGFydCxpLmVuZCk7Y29udGludWV9aWYoaS5jbG9zaW5nKXt0aGlzLl9wb3AoZyxpKTtpZihnLmxlbmd0aD09MClyZXR1cm4gZi5mcm9tUG9pbnRzKGssaS5zdGFydCl9ZWxzZSBnLnB1c2goaSl9fWVsc2V7dmFyIGo9bmV3IGgoYSxjLGQuY29sdW1uK2QubWF0Y2gubGVuZ3RoKSxsPXtyb3c6Yyxjb2x1bW46ZC5jb2x1bW59O3doaWxlKGk9dGhpcy5fcmVhZFRhZ0JhY2t3YXJkKGopKXtpZihpLnNlbGZDbG9zaW5nKXtpZighZy5sZW5ndGgpcmV0dXJuIGkuc3RhcnQuY29sdW1uKz1pLnRhZ05hbWUubGVuZ3RoKzIsaS5lbmQuY29sdW1uLT0yLGYuZnJvbVBvaW50cyhpLnN0YXJ0LGkuZW5kKTtjb250aW51ZX1pZighaS5jbG9zaW5nKXt0aGlzLl9wb3AoZyxpKTtpZihnLmxlbmd0aD09MClyZXR1cm4gaS5zdGFydC5jb2x1bW4rPWkudGFnTmFtZS5sZW5ndGgrMixmLmZyb21Qb2ludHMoaS5zdGFydCxsKX1lbHNlIGcucHVzaChpKX19fX0uY2FsbChpLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2h0bWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvbW9kZS9qYXZhc2NyaXB0IiwiYWNlL21vZGUvY3NzIiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2h0bWxfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvYmVoYXZpb3VyL3htbCIsImFjZS9tb2RlL2ZvbGRpbmcvaHRtbCJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4vamF2YXNjcmlwdCIpLk1vZGUsZz1hKCIuL2NzcyIpLk1vZGUsaD1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsaT1hKCIuL2h0bWxfaGlnaGxpZ2h0X3J1bGVzIikuSHRtbEhpZ2hsaWdodFJ1bGVzLGo9YSgiLi9iZWhhdmlvdXIveG1sIikuWG1sQmVoYXZpb3VyLGs9YSgiLi9mb2xkaW5nL2h0bWwiKS5Gb2xkTW9kZSxsPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IGk7dGhpcy4kdG9rZW5pemVyPW5ldyBoKGEuZ2V0UnVsZXMoKSksdGhpcy4kYmVoYXZpb3VyPW5ldyBqLHRoaXMuJGVtYmVkcz1hLmdldEVtYmVkcygpLHRoaXMuY3JlYXRlTW9kZURlbGVnYXRlcyh7ImpzLSI6ZiwiY3NzLSI6Z30pLHRoaXMuZm9sZGluZ1J1bGVzPW5ldyBrfTtkLmluaGVyaXRzKGwsZSksZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gMH0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJGdldEluZGVudChiKX0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiExfX0uY2FsbChsLnByb3RvdHlwZSksYi5Nb2RlPWx9KSxkZWZpbmUoImFjZS9tb2RlL2NzcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9jc3NfaGlnaGxpZ2h0X3J1bGVzIikuQ3NzSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50LGo9YSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlLGs9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpLCJpIiksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgan07ZC5pbmhlcml0cyhrLGUpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nUnVsZXM9ImNTdHlsZSIsdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKS50b2tlbnM7aWYoZS5sZW5ndGgmJmVbZS5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiBkO3ZhciBmPWIubWF0Y2goL14uKlx7XHMqJC8pO3JldHVybiBmJiYoZCs9YyksZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBpKFsiYWNlIl0sIndvcmtlci1jc3MuanMiLCJhY2UvbW9kZS9jc3Nfd29ya2VyIiwiV29ya2VyIik7cmV0dXJuIGIuYXR0YWNoVG9Eb2N1bWVudChhLmdldERvY3VtZW50KCkpLGIub24oImNzc2xpbnQiLGZ1bmN0aW9uKGIpe3ZhciBjPVtdO2IuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2MucHVzaCh7cm93OmEubGluZS0xLGNvbHVtbjphLmNvbC0xLHRleHQ6YS5tZXNzYWdlLHR5cGU6YS50eXBlLGxpbnQ6YX0pfSksYS5zZXRBbm5vdGF0aW9ucyhjKX0pLGJ9fS5jYWxsKGsucHJvdG90eXBlKSxiLk1vZGU9a30pLGRlZmluZSgiYWNlL21vZGUvY3NzX2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4uL2xpYi9sYW5nIiksZj1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGc9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoIi1tb3otYXBwZWFyYW5jZXwtbW96LWJveC1zaXppbmd8LXdlYmtpdC1ib3gtc2l6aW5nfC1tb3otb3V0bGluZS1yYWRpdXN8LW1vei10cmFuc2Zvcm18LXdlYmtpdC10cmFuc2Zvcm18YXBwZWFyYW5jZXxhemltdXRofGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtaW1hZ2V8YmFja2dyb3VuZC1vcmlnaW58YmFja2dyb3VuZC1wb3NpdGlvbnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kfGJvcmRlci1ib3R0b20tY29sb3J8Ym9yZGVyLWJvdHRvbS1zdHlsZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b218Ym9yZGVyLWNvbGxhcHNlfGJvcmRlci1jb2xvcnxib3JkZXItbGVmdC1jb2xvcnxib3JkZXItbGVmdC1zdHlsZXxib3JkZXItbGVmdC13aWR0aHxib3JkZXItbGVmdHxib3JkZXItcmlnaHQtY29sb3J8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC13aWR0aHxib3JkZXItcmlnaHR8Ym9yZGVyLXNwYWNpbmd8Ym9yZGVyLXN0eWxlfGJvcmRlci10b3AtY29sb3J8Ym9yZGVyLXRvcC1zdHlsZXxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3B8Ym9yZGVyLXdpZHRofGJvcmRlcnxib3R0b218Ym94LXNpemluZ3xjYXB0aW9uLXNpZGV8Y2xlYXJ8Y2xpcHxjb2xvcnxjb250ZW50fGNvdW50ZXItaW5jcmVtZW50fGNvdW50ZXItcmVzZXR8Y3VlLWFmdGVyfGN1ZS1iZWZvcmV8Y3VlfGN1cnNvcnxkaXJlY3Rpb258ZGlzcGxheXxlbGV2YXRpb258ZW1wdHktY2VsbHN8ZmxvYXR8Zm9udC1mYW1pbHl8Zm9udC1zaXplLWFkanVzdHxmb250LXNpemV8Zm9udC1zdHJldGNofGZvbnQtc3R5bGV8Zm9udC12YXJpYW50fGZvbnQtd2VpZ2h0fGZvbnR8aGVpZ2h0fGxlZnR8bGV0dGVyLXNwYWNpbmd8bGluZS1oZWlnaHR8bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlLXBvc2l0aW9ufGxpc3Qtc3R5bGUtdHlwZXxsaXN0LXN0eWxlfG1hcmdpbi1ib3R0b218bWFyZ2luLWxlZnR8bWFyZ2luLXJpZ2h0fG1hcmdpbi10b3B8bWFya2VyLW9mZnNldHxtYXJnaW58bWFya3N8bWF4LWhlaWdodHxtYXgtd2lkdGh8bWluLWhlaWdodHxtaW4td2lkdGh8LW1vei1ib3JkZXItcmFkaXVzfG9wYWNpdHl8b3JwaGFuc3xvdXRsaW5lLWNvbG9yfG91dGxpbmUtb2Zmc2V0fG91dGxpbmUtcmFkaXVzfG91dGxpbmUtc3R5bGV8b3V0bGluZS13aWR0aHxvdXRsaW5lfG92ZXJmbG93fG92ZXJmbG93LXh8b3ZlcmZsb3cteXxwYWRkaW5nLWJvdHRvbXxwYWRkaW5nLWxlZnR8cGFkZGluZy1yaWdodHxwYWRkaW5nLXRvcHxwYWRkaW5nfHBhZ2UtYnJlYWstYWZ0ZXJ8cGFnZS1icmVhay1iZWZvcmV8cGFnZS1icmVhay1pbnNpZGV8cGFnZXxwYXVzZS1hZnRlcnxwYXVzZS1iZWZvcmV8cGF1c2V8cGl0Y2gtcmFuZ2V8cGl0Y2h8cGxheS1kdXJpbmd8cG9pbnRlci1ldmVudHN8cG9zaXRpb258cXVvdGVzfHJlc2l6ZXxyaWNobmVzc3xyaWdodHxzaXplfHNwZWFrLWhlYWRlcnxzcGVhay1udW1lcmFsfHNwZWFrLXB1bmN0dWF0aW9ufHNwZWVjaC1yYXRlfHNwZWFrfHN0cmVzc3x0YWJsZS1sYXlvdXR8dGV4dC1hbGlnbnx0ZXh0LWRlY29yYXRpb258dGV4dC1pbmRlbnR8dGV4dC1zaGFkb3d8dGV4dC10cmFuc2Zvcm18dG9wfHRyYW5zZm9ybXx1bmljb2RlLWJpZGl8dmVydGljYWwtYWxpZ258dmlzaWJpbGl0eXx2b2ljZS1mYW1pbHl8dm9sdW1lfHdoaXRlLXNwYWNlfHdpZG93c3x3aWR0aHx3b3JkLXNwYWNpbmd8ei1pbmRleCIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoInJnYnxyZ2JhfHVybHxhdHRyfGNvdW50ZXJ8Y291bnRlcnMiLnNwbGl0KCJ8IikpLGM9ZS5hcnJheVRvTWFwKCJhYnNvbHV0ZXxhbGwtc2Nyb2xsfGFsd2F5c3xhcm1lbmlhbnxhdXRvfGJhc2VsaW5lfGJlbG93fGJpZGktb3ZlcnJpZGV8YmxvY2t8Ym9sZHxib2xkZXJ8Ym9yZGVyLWJveHxib3RofGJvdHRvbXxicmVhay1hbGx8YnJlYWstd29yZHxjYXBpdGFsaXplfGNlbnRlcnxjaGFyfGNpcmNsZXxjamstaWRlb2dyYXBoaWN8Y29sLXJlc2l6ZXxjb2xsYXBzZXxjb250ZW50LWJveHxjcm9zc2hhaXJ8ZGFzaGVkfGRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGVmYXVsdHxkaXNhYmxlZHxkaXNjfGRpc3RyaWJ1dGUtYWxsLWxpbmVzfGRpc3RyaWJ1dGUtbGV0dGVyfGRpc3RyaWJ1dGUtc3BhY2V8ZGlzdHJpYnV0ZXxkb3R0ZWR8ZG91YmxlfGUtcmVzaXplfGVsbGlwc2lzfGZpeGVkfGdlb3JnaWFufGdyb292ZXxoYW5kfGhlYnJld3xoZWxwfGhpZGRlbnxoaXJhZ2FuYS1pcm9oYXxoaXJhZ2FuYXxob3Jpem9udGFsfGlkZW9ncmFwaC1hbHBoYXxpZGVvZ3JhcGgtbnVtZXJpY3xpZGVvZ3JhcGgtcGFyZW50aGVzaXN8aWRlb2dyYXBoLXNwYWNlfGluYWN0aXZlfGluaGVyaXR8aW5saW5lLWJsb2NrfGlubGluZXxpbnNldHxpbnNpZGV8aW50ZXItaWRlb2dyYXBofGludGVyLXdvcmR8aXRhbGljfGp1c3RpZnl8a2F0YWthbmEtaXJvaGF8a2F0YWthbmF8a2VlcC1hbGx8bGVmdHxsaWdodGVyfGxpbmUtZWRnZXxsaW5lLXRocm91Z2h8bGluZXxsaXN0LWl0ZW18bG9vc2V8bG93ZXItYWxwaGF8bG93ZXItZ3JlZWt8bG93ZXItbGF0aW58bG93ZXItcm9tYW58bG93ZXJjYXNlfGxyLXRifGx0cnxtZWRpdW18bWlkZGxlfG1vdmV8bi1yZXNpemV8bmUtcmVzaXplfG5ld3NwYXBlcnxuby1kcm9wfG5vLXJlcGVhdHxudy1yZXNpemV8bm9uZXxub3JtYWx8bm90LWFsbG93ZWR8bm93cmFwfG9ibGlxdWV8b3V0c2V0fG91dHNpZGV8b3ZlcmxpbmV8cG9pbnRlcnxwcm9ncmVzc3xyZWxhdGl2ZXxyZXBlYXQteHxyZXBlYXQteXxyZXBlYXR8cmlnaHR8cmlkZ2V8cm93LXJlc2l6ZXxydGx8cy1yZXNpemV8c2Nyb2xsfHNlLXJlc2l6ZXxzZXBhcmF0ZXxzbWFsbC1jYXBzfHNvbGlkfHNxdWFyZXxzdGF0aWN8c3RyaWN0fHN1cGVyfHN3LXJlc2l6ZXx0YWJsZS1mb290ZXItZ3JvdXB8dGFibGUtaGVhZGVyLWdyb3VwfHRiLXJsfHRleHQtYm90dG9tfHRleHQtdG9wfHRleHR8dGhpY2t8dGhpbnx0b3B8dHJhbnNwYXJlbnR8dW5kZXJsaW5lfHVwcGVyLWFscGhhfHVwcGVyLWxhdGlufHVwcGVyLXJvbWFufHVwcGVyY2FzZXx2ZXJ0aWNhbC1pZGVvZ3JhcGhpY3x2ZXJ0aWNhbC10ZXh0fHZpc2libGV8dy1yZXNpemV8d2FpdHx3aGl0ZXNwYWNlfHplcm8iLnNwbGl0KCJ8IikpLGQ9ZS5hcnJheVRvTWFwKCJhcXVhfGJsYWNrfGJsdWV8ZnVjaHNpYXxncmF5fGdyZWVufGxpbWV8bWFyb29ufG5hdnl8b2xpdmV8b3JhbmdlfHB1cnBsZXxyZWR8c2lsdmVyfHRlYWx8d2hpdGV8eWVsbG93Ii5zcGxpdCgifCIpKSxmPSJcXC0/KD86KD86WzAtOV0rKXwoPzpbMC05XSpcXC5bMC05XSspKSIsZz1be3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJydWxlc2V0X2NvbW1lbnQifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIscmVnZXg6IlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10ifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OmYrIig/OmVtfGV4fHB4fGNtfG1tfGlufHB0fHBjfGRlZ3xyYWR8Z3JhZHxtc3xzfGh6fGtoenwlKSJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IiNbYS1mMC05XXs2fSJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IiNbYS1mMC05XXszfSJ9LHt0b2tlbjpmdW5jdGlvbihlKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpPyJzdXBwb3J0LnR5cGUiOmIuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8ic3VwcG9ydC5mdW5jdGlvbiI6Yy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpPyJzdXBwb3J0LmNvbnN0YW50IjpkLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/InN1cHBvcnQuY29uc3RhbnQuY29sb3IiOiJ0ZXh0In0scmVnZXg6IlxcLT9bYS16QS1aX11bYS16QS1aMC05X1xcLV0qIn1dLGg9ZS5jb3B5QXJyYXkoZyk7aC51bnNoaWZ0KHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiXFx9IixuZXh0OiJzdGFydCJ9KTt2YXIgaT1lLmNvcHlBcnJheShnKTtpLnVuc2hpZnQoe3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJcXH0iLG5leHQ6Im1lZGlhIn0pO3ZhciBqPVt7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxrPWUuY29weUFycmF5KGopO2sudW5zaGlmdCh7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG5leHQ6InN0YXJ0In0pO3ZhciBsPWUuY29weUFycmF5KGopO2wudW5zaGlmdCh7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG5leHQ6Im1lZGlhIn0pO3ZhciBtPWUuY29weUFycmF5KGopO20udW5zaGlmdCh7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG5leHQ6InJ1bGVzZXQifSksdGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IlxceyIsbmV4dDoicnVsZXNldCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiQC4qP3siLG5leHQ6Im1lZGlhIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiI1thLXowLTktX10rIn0se3Rva2VuOiJ2YXJpYWJsZSIscmVnZXg6IlxcLlthLXowLTktX10rIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiI6W2EtejAtOS1fXSsifSx7dG9rZW46ImNvbnN0YW50IixyZWdleDoiW2EtejAtOS1fXSsifV0sbWVkaWE6W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoibWVkaWFfY29tbWVudCJ9LHt0b2tlbjoicGFyZW4ubHBhcmVuIixyZWdleDoiXFx7IixuZXh0OiJtZWRpYV9ydWxlc2V0In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXH0iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiI1thLXowLTktX10rIn0se3Rva2VuOiJ2YXJpYWJsZSIscmVnZXg6IlxcLlthLXowLTktX10rIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiI6W2EtejAtOS1fXSsifSx7dG9rZW46ImNvbnN0YW50IixyZWdleDoiW2EtejAtOS1fXSsifV0sY29tbWVudDprLHJ1bGVzZXQ6aCxydWxlc2V0X2NvbW1lbnQ6bSxtZWRpYV9ydWxlc2V0OmksbWVkaWFfY29tbWVudDpsfX07ZC5pbmhlcml0cyhnLGYpLGIuQ3NzSGlnaGxpZ2h0UnVsZXM9Z30pLGRlZmluZSgiYWNlL21vZGUvaHRtbF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3htbF91dGlsIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzLGY9YSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyxnPWEoIi4veG1sX3V0aWwiKSxoPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsaT1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJ0ZXh0IixtZXJnZTohMCxyZWdleDoiPFxcIVxcW0NEQVRBXFxbIixuZXh0OiJjZGF0YSJ9LHt0b2tlbjoieG1sX3BlIixyZWdleDoiPFxcPy4qP1xcPz4ifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiI8XFwhLS0iLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPCg/PXMqc2NyaXB0XFxiKSIsbmV4dDoic2NyaXB0In0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjwoPz1zKnN0eWxlXFxiKSIsbmV4dDoic3R5bGUifSx7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPFxcLz8iLG5leHQ6InRhZyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46InRleHQiLHJlZ2V4OiJbXjxdKyJ9XSxjZGF0YTpbe3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxdXFxdPiIsbmV4dDoic3RhcnQifSx7dG9rZW46InRleHQiLG1lcmdlOiEwLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJ0ZXh0IixtZXJnZTohMCxyZWdleDoiLisifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/LS0+IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSxnLnRhZyh0aGlzLiRydWxlcywidGFnIiwic3RhcnQiKSxnLnRhZyh0aGlzLiRydWxlcywic3R5bGUiLCJjc3Mtc3RhcnQiKSxnLnRhZyh0aGlzLiRydWxlcywic2NyaXB0IiwianMtc3RhcnQiKSx0aGlzLmVtYmVkUnVsZXMoZiwianMtIixbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiooPz08XFwvc2NyaXB0PikiLG5leHQ6InRhZyJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8XFwvKD89c2NyaXB0KSIsbmV4dDoidGFnIn1dKSx0aGlzLmVtYmVkUnVsZXMoZSwiY3NzLSIsW3t0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8XFwvKD89c3R5bGUpIixuZXh0OiJ0YWcifV0pfTtkLmluaGVyaXRzKGksaCksYi5IdG1sSGlnaGxpZ2h0UnVsZXM9aX0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9odG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9mb2xkaW5nL21peGVkIiwiYWNlL21vZGUvZm9sZGluZy94bWwiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi9taXhlZCIpLkZvbGRNb2RlLGY9YSgiLi94bWwiKS5Gb2xkTW9kZSxnPWEoIi4vY3N0eWxlIikuRm9sZE1vZGUsaD1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7ZS5jYWxsKHRoaXMsbmV3IGYoe2FyZWE6MSxiYXNlOjEsYnI6MSxjb2w6MSxjb21tYW5kOjEsZW1iZWQ6MSxocjoxLGltZzoxLGlucHV0OjEsa2V5Z2VuOjEsbGluazoxLG1ldGE6MSxwYXJhbToxLHNvdXJjZToxLHRyYWNrOjEsd2JyOjEsbGk6MSxkdDoxLGRkOjEscDoxLHJ0OjEscnA6MSxvcHRncm91cDoxLG9wdGlvbjoxLGNvbGdyb3VwOjEsdGQ6MSx0aDoxfSkseyJqcy0iOm5ldyBnLCJjc3MtIjpuZXcgZ30pfTtkLmluaGVyaXRzKGgsZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvbWl4ZWQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGY9Yi5Gb2xkTW9kZT1mdW5jdGlvbihhLGIpe3RoaXMuZGVmYXVsdE1vZGU9YSx0aGlzLnN1Yk1vZGVzPWJ9O2QuaW5oZXJpdHMoZixlKSxmdW5jdGlvbigpe3RoaXMuJGdldE1vZGU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIHRoaXMuc3ViTW9kZXMpaWYoYS5pbmRleE9mKGIpPT09MClyZXR1cm4gdGhpcy5zdWJNb2Rlc1tiXTtyZXR1cm4gbnVsbH0sdGhpcy4kdHJ5TW9kZT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLiRnZXRNb2RlKGEpO3JldHVybiBlP2UuZ2V0Rm9sZFdpZGdldChiLGMsZCk6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJHRyeU1vZGUoYS5nZXRTdGF0ZShjLTEpLGEsYixjKXx8dGhpcy4kdHJ5TW9kZShhLmdldFN0YXRlKGMpLGEsYixjKXx8dGhpcy5kZWZhdWx0TW9kZS5nZXRGb2xkV2lkZ2V0KGEsYixjKX0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldE1vZGUoYS5nZXRTdGF0ZShjLTEpKTtpZighZHx8IWQuZ2V0Rm9sZFdpZGdldChhLGIsYykpZD10aGlzLiRnZXRNb2RlKGEuZ2V0U3RhdGUoYykpO2lmKCFkfHwhZC5nZXRGb2xkV2lkZ2V0KGEsYixjKSlkPXRoaXMuZGVmYXVsdE1vZGU7cmV0dXJuIGQuZ2V0Rm9sZFdpZGdldFJhbmdlKGEsYixjKX19LmNhbGwoZi5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9tYXJrZG93bl9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvaHRtbF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGooYSxiKXtyZXR1cm57dG9rZW46InN1cHBvcnQuZnVuY3Rpb24iLHJlZ2V4OiJeYGBgIithKyJcXHMqJCIsbmV4dDpiKyJzdGFydCJ9fSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGY9YSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyxnPWEoIi4veG1sX2hpZ2hsaWdodF9ydWxlcyIpLlhtbEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9odG1sX2hpZ2hsaWdodF9ydWxlcyIpLkh0bWxIaWdobGlnaHRSdWxlcyxpPWEoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzLGs9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiZW1wdHlfbGluZSIscmVnZXg6Il4kIn0se3Rva2VuOiJzdXBwb3J0LmZ1bmN0aW9uIixyZWdleDoiKGArKShbXlxccl0qP1teYF0pKFxcMSkifSx7dG9rZW46InN1cHBvcnQuZnVuY3Rpb24iLHJlZ2V4OiJeWyBdezR9LisifSx7dG9rZW46Im1hcmt1cC5oZWFkaW5nLjEiLHJlZ2V4OiJePSsoPz1cXHMqJCkifSx7dG9rZW46Im1hcmt1cC5oZWFkaW5nLjEiLHJlZ2V4OiJeXFwtKyg/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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBTZXJnaSBNYW5zaWxsYSA8c2VyZ2kgQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvb2NhbWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9vY2FtbF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBPY2FtbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9vY2FtbF9oaWdobGlnaHRfcnVsZXMiKS5PY2FtbEhpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IE9jYW1sSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ICAgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsNCn07DQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQp2YXIgaW5kZW50ZXIgPSAvKD86Wyh7Wz06XXxbLT1dPnxcYig/OmVsc2V8dHJ5fHdpdGgpKVxzKiQvOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIGksIGxpbmU7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIHJlID0gL15ccypcKFwqKC4qKVwqXCkvOw0KDQogICAgICAgIGZvciAoaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOw0KICAgICAgICBmb3IgKGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgcmFuZ2Uuc3RhcnQucm93ICA9IGk7DQogICAgICAgICAgICByYW5nZS5lbmQucm93ICAgID0gaTsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gPSBsaW5lLmxlbmd0aDsNCg0KICAgICAgICAgICAgZG9jLnJlcGxhY2UocmFuZ2UsIG91dGRlbnQgPyBsaW5lLm1hdGNoKHJlKVsxXSA6ICIoKiIgKyBsaW5lICsgIiopIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKS50b2tlbnM7DQoNCiAgICAgICAgaWYgKCEodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLnR5cGUgPT09ICdjb21tZW50JykgJiYNCiAgICAgICAgICAgIHN0YXRlID09PSAnc3RhcnQnICYmIGluZGVudGVyLnRlc3QobGluZSkpDQogICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgIH07DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7DQogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQoNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgU2VyZ2kgTWFuc2lsbGEgPHNlcmdpIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKg0KICoNCiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL29jYW1sX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBPY2FtbEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoKA0KICAgICAgICAiYW5kfGFzfGFzc2VydHxiZWdpbnxjbGFzc3xjb25zdHJhaW50fGRvfGRvbmV8ZG93bnRvfGVsc2V8ZW5kfCIgICsNCiAgICAgICAgImV4Y2VwdGlvbnxleHRlcm5hbHxmb3J8ZnVufGZ1bmN0aW9ufGZ1bmN0b3J8aWZ8aW58aW5jbHVkZXwiICAgICArDQogICAgICAgICJpbmhlcml0fGluaXRpYWxpemVyfGxhenl8bGV0fG1hdGNofG1ldGhvZHxtb2R1bGV8bXV0YWJsZXxuZXd8IiAgKw0KICAgICAgICAib2JqZWN0fG9mfG9wZW58b3J8cHJpdmF0ZXxyZWN8c2lnfHN0cnVjdHx0aGVufHRvfHRyeXx0eXBlfHZhbHwiICsNCiAgICAgICAgInZpcnR1YWx8d2hlbnx3aGlsZXx3aXRoIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbHRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJ0cnVlfGZhbHNlIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbHRpbkZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgoDQogICAgICAgICJhYnN8YWJzX2JpZ19pbnR8YWJzX2Zsb2F0fGFic19udW18YWJzdHJhY3RfdGFnfGFjY2VwdHxhY2Nlc3N8YWNvc3xhZGR8IiArDQogICAgICAgICJhZGRfYXZhaWxhYmxlX3VuaXRzfGFkZF9iaWdfaW50fGFkZF9idWZmZXJ8YWRkX2NoYW5uZWx8YWRkX2NoYXJ8IiArDQogICAgICAgICJhZGRfaW5pdGlhbGl6ZXJ8YWRkX2ludF9iaWdfaW50fGFkZF9pbnRlcmZhY2VzfGFkZF9udW18YWRkX3N0cmluZ3wiICsNCiAgICAgICAgImFkZF9zdWJzdGl0dXRlfGFkZF9zdWJzdHJpbmd8YWxhcm18YWxsb2NhdGVkX2J5dGVzfGFsbG93X29ubHl8IiArDQogICAgICAgICJhbGxvd191bnNhZmVfbW9kdWxlc3xhbHdheXN8YXBwZW5kfGFwcG5hbWVfZ2V0fGFwcG5hbWVfc2V0fCIgKw0KICAgICAgICAiYXBwcm94X251bV9leHB8YXBwcm94X251bV9maXh8YXJnfGFyZ3Z8YXJpdGhfc3RhdHVzfGFycmF5fCIgKw0KICAgICAgICAiYXJyYXkxX29mX2dlbmFycmF5fGFycmF5Ml9vZl9nZW5hcnJheXxhcnJheTNfb2ZfZ2VuYXJyYXl8YXNpbnxhc3J8IiArDQogICAgICAgICJhc3NvY3xhc3NxfGF0X2V4aXR8YXRhbnxhdGFuMnxhdXRvX3N5bmNocm9uaXplfGJhY2tncm91bmR8YmFzZW5hbWV8IiArDQogICAgICAgICJiZWdpbm5pbmdfb2ZfaW5wdXR8YmlnX2ludF9vZl9pbnR8YmlnX2ludF9vZl9udW18YmlnX2ludF9vZl9zdHJpbmd8YmluZHwiICsNCiAgICAgICAgImJpbmRfY2xhc3N8YmluZF90YWd8Yml0c3xiaXRzX29mX2Zsb2F0fGJsYWNrfGJsaXR8YmxpdF9pbWFnZXxibHVlfGJvb2x8IiArDQogICAgICAgICJib29sX29mX3N0cmluZ3xib3VuZGVkX2Z1bGxfc3BsaXR8Ym91bmRlZF9zcGxpdHxib3VuZGVkX3NwbGl0X2RlbGltfCIgKw0KICAgICAgICAiYnByaW50ZnxicmVha3xicm9hZGNhc3R8YnNjYW5mfGJ1dHRvbl9kb3dufGNfbGF5b3V0fGNhcGl0YWxpemV8Y2FyZGluYWx8IiArDQogICAgICAgICJjYXJkaW5hbHxjYXRjaHxjYXRjaF9icmVha3xjZWlsfGNlaWxpbmdfbnVtfGNoYW5uZWx8Y2hhcnxjaGFyX29mX2ludHwiICsNCiAgICAgICAgImNoZGlyfGNoZWNrfGNoZWNrX3N1ZmZpeHxjaG1vZHxjaG9vc2V8Y2hvcF9leHRlbnNpb258Y2hvcF9zdWZmaXh8Y2hvd258IiArDQogICAgICAgICJjaG93bnxjaHJ8Y2hyb290fGNsYXNzaWZ5X2Zsb2F0fGNsZWFyfGNsZWFyX2F2YWlsYWJsZV91bml0c3wiICsNCiAgICAgICAgImNsZWFyX2Nsb3NlX29uX2V4ZWN8Y2xlYXJfZ3JhcGh8Y2xlYXJfbm9uYmxvY2t8Y2xlYXJfcGFyc2VyfCIgKw0KICAgICAgICAiY2xvc2V8Y2xvc2V8Y2xvc2VUa3xjbG9zZV9ib3h8Y2xvc2VfZ3JhcGh8Y2xvc2VfaW58Y2xvc2VfaW5fbm9lcnJ8IiArDQogICAgICAgICJjbG9zZV9vdXR8Y2xvc2Vfb3V0X25vZXJyfGNsb3NlX3Byb2Nlc3N8Y2xvc2VfcHJvY2Vzc3wiICsNCiAgICAgICAgImNsb3NlX3Byb2Nlc3NfZnVsbHxjbG9zZV9wcm9jZXNzX2lufGNsb3NlX3Byb2Nlc3Nfb3V0fGNsb3NlX3N1YndpbmRvd3wiICsNCiAgICAgICAgImNsb3NlX3RhZ3xjbG9zZV90Ym94fGNsb3NlZGlyfGNsb3NlZGlyfGNsb3N1cmVfdGFnfGNvZGV8Y29tYmluZXwiICsNCiAgICAgICAgImNvbWJpbmV8Y29tYmluZXxjb21tYW5kfGNvbXBhY3R8Y29tcGFyZXxjb21wYXJlX2JpZ19pbnR8Y29tcGFyZV9udW18IiArDQogICAgICAgICJjb21wbGV4MzJ8Y29tcGxleDY0fGNvbmNhdHxjb25qfGNvbm5lY3R8Y29udGFpbnN8Y29udGFpbnNfZnJvbXxjb250ZW50c3wiICsNCiAgICAgICAgImNvcHl8Y29zfGNvc2h8Y291bnR8Y291bnR8Y291bnRlcnN8Y3JlYXRlfGNyZWF0ZV9hbGFybXxjcmVhdGVfaW1hZ2V8IiArDQogICAgICAgICJjcmVhdGVfbWF0cml4fGNyZWF0ZV9tYXRyaXh8Y3JlYXRlX21hdHJpeHxjcmVhdGVfb2JqZWN0fCIgKw0KICAgICAgICAiY3JlYXRlX29iamVjdF9hbmRfcnVuX2luaXRpYWxpemVyc3xjcmVhdGVfb2JqZWN0X29wdHxjcmVhdGVfcHJvY2Vzc3wiICsNCiAgICAgICAgImNyZWF0ZV9wcm9jZXNzfGNyZWF0ZV9wcm9jZXNzX2VudnxjcmVhdGVfcHJvY2Vzc19lbnZ8Y3JlYXRlX3RhYmxlfCIgKw0KICAgICAgICAiY3VycmVudHxjdXJyZW50X2Rpcl9uYW1lfGN1cnJlbnRfcG9pbnR8Y3VycmVudF94fGN1cnJlbnRfeXxjdXJ2ZXRvfCIgKw0KICAgICAgICAiY3VzdG9tX3RhZ3xjeWFufGRhdGFfc2l6ZXxkZWNyfGRlY3JfbnVtfGRlZmF1bHRfYXZhaWxhYmxlX3VuaXRzfGRlbGF5fCIgKw0KICAgICAgICAiZGVsZXRlX2FsYXJtfGRlc2NyX29mX2luX2NoYW5uZWx8ZGVzY3Jfb2Zfb3V0X2NoYW5uZWx8ZGVzdHJveXxkaWZmfGRpbXwiICsNCiAgICAgICAgImRpbTF8ZGltMnxkaW0zfGRpbXN8ZGlybmFtZXxkaXNwbGF5X21vZGV8ZGl2fGRpdl9iaWdfaW50fGRpdl9udW18IiArDQogICAgICAgICJkb3VibGVfYXJyYXlfdGFnfGRvdWJsZV90YWd8ZHJhd19hcmN8ZHJhd19jaGFyfGRyYXdfY2lyY2xlfGRyYXdfZWxsaXBzZXwiICsNCiAgICAgICAgImRyYXdfaW1hZ2V8ZHJhd19wb2x5fGRyYXdfcG9seV9saW5lfGRyYXdfcmVjdHxkcmF3X3NlZ21lbnRzfGRyYXdfc3RyaW5nfCIgKw0KICAgICAgICAiZHVtbXlfcG9zfGR1bW15X3RhYmxlfGR1bXBfaW1hZ2V8ZHVwfGR1cDJ8ZWxlbWVudHN8ZW1wdHl8ZW5kX29mX2lucHV0fCIgKw0KICAgICAgICAiZW52aXJvbm1lbnR8ZXByaW50ZnxlcHNpbG9uX2Zsb2F0fGVxX2JpZ19pbnR8ZXFfbnVtfGVxdWFsfGVycl9mb3JtYXR0ZXJ8IiArDQogICAgICAgICJlcnJvcl9tZXNzYWdlfGVzY2FwZWR8ZXN0YWJsaXNoX3NlcnZlcnxleGVjdXRhYmxlX25hbWV8ZXhlY3Z8ZXhlY3ZlfGV4ZWN2cHwiICsNCiAgICAgICAgImV4ZWN2cGV8ZXhpc3RzfGV4aXN0czJ8ZXhpdHxleHB8ZmFpbHdpdGh8ZmFzdF9zb3J0fGZjaG1vZHxmY2hvd258ZmllbGR8IiArDQogICAgICAgICJmaWxlfGZpbGVfZXhpc3RzfGZpbGx8ZmlsbF9hcmN8ZmlsbF9jaXJjbGV8ZmlsbF9lbGxpcHNlfGZpbGxfcG9seXxmaWxsX3JlY3R8IiArDQogICAgICAgICJmaWx0ZXJ8ZmluYWxfdGFnfGZpbmFsaXNlfGZpbmR8ZmluZF9hbGx8Zmlyc3RfY2hhcnN8Zmlyc3RrZXl8ZmxhdHRlbnwiICsNCiAgICAgICAgImZsb2F0fGZsb2F0MzJ8ZmxvYXQ2NHxmbG9hdF9vZl9iaWdfaW50fGZsb2F0X29mX2JpdHN8ZmxvYXRfb2ZfaW50fCIgKw0KICAgICAgICAiZmxvYXRfb2ZfbnVtfGZsb2F0X29mX3N0cmluZ3xmbG9vcnxmbG9vcl9udW18Zmx1c2h8Zmx1c2hfYWxsfGZsdXNoX2lucHV0fCIgKw0KICAgICAgICAiZmx1c2hfc3RyX2Zvcm1hdHRlcnxmb2xkfGZvbGRfbGVmdHxmb2xkX2xlZnQyfGZvbGRfcmlnaHR8Zm9sZF9yaWdodDJ8IiArDQogICAgICAgICJmb3JfYWxsfGZvcl9hbGwyfGZvcmNlfGZvcmNlX25ld2xpbmV8Zm9yY2VfdmFsfGZvcmVncm91bmR8Zm9ya3wiICsNCiAgICAgICAgImZvcm1hdF9vZl9zdHJpbmd8Zm9ybWF0dGVyX29mX2J1ZmZlcnxmb3JtYXR0ZXJfb2Zfb3V0X2NoYW5uZWx8IiArDQogICAgICAgICJmb3J0cmFuX2xheW91dHxmb3J3YXJkX3RhZ3xmcHJpbnRmfGZyZXhwfGZyb218ZnJvbV9jaGFubmVsfGZyb21fZmlsZXwiICsNCiAgICAgICAgImZyb21fZmlsZV9iaW58ZnJvbV9mdW5jdGlvbnxmcm9tX3N0cmluZ3xmc2NhbmZ8ZnN0fGZzdGF0fGZ0cnVuY2F0ZXwiICsNCiAgICAgICAgImZ1bGxfaW5pdHxmdWxsX21ham9yfGZ1bGxfc3BsaXR8Z2NkX2JpZ19pbnR8Z2VfYmlnX2ludHxnZV9udW18IiArDQogICAgICAgICJnZW5hcnJheV9vZl9hcnJheTF8Z2VuYXJyYXlfb2ZfYXJyYXkyfGdlbmFycmF5X29mX2FycmF5M3xnZXR8IiArDQogICAgICAgICJnZXRfYWxsX2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfGdldF9hcHByb3hfcHJpbnRpbmd8Z2V0X2NvcHl8IiArDQogICAgICAgICJnZXRfZWxsaXBzaXNfdGV4dHxnZXRfZXJyb3Jfd2hlbl9udWxsX2Rlbm9taW5hdG9yfGdldF9mbG9hdGluZ19wcmVjaXNpb258IiArDQogICAgICAgICJnZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnN8Z2V0X2Zvcm1hdHRlcl90YWdfZnVuY3Rpb25zfGdldF9pbWFnZXwiICsNCiAgICAgICAgImdldF9tYXJnaW58Z2V0X21hcmtfdGFnc3xnZXRfbWF4X2JveGVzfGdldF9tYXhfaW5kZW50fGdldF9tZXRob2R8IiArDQogICAgICAgICJnZXRfbWV0aG9kX2xhYmVsfGdldF9ub3JtYWxpemVfcmF0aW98Z2V0X25vcm1hbGl6ZV9yYXRpb193aGVuX3ByaW50aW5nfCIgKw0KICAgICAgICAiZ2V0X3ByaW50X3RhZ3N8Z2V0X3N0YXRlfGdldF92YXJpYWJsZXxnZXRjd2R8Z2V0ZWdpZHxnZXRlZ2lkfGdldGVudnwiICsNCiAgICAgICAgImdldGVudnxnZXRlbnZ8Z2V0ZXVpZHxnZXRldWlkfGdldGdpZHxnZXRnaWR8Z2V0Z3JnaWR8Z2V0Z3JnaWR8Z2V0Z3JuYW18IiArDQogICAgICAgICJnZXRncm5hbXxnZXRncm91cHN8Z2V0aG9zdGJ5YWRkcnxnZXRob3N0YnluYW1lfGdldGhvc3RuYW1lfGdldGl0aW1lcnwiICsNCiAgICAgICAgImdldGxvZ2lufGdldHBlZXJuYW1lfGdldHBpZHxnZXRwcGlkfGdldHByb3RvYnluYW1lfGdldHByb3RvYnludW1iZXJ8IiArDQogICAgICAgICJnZXRwd25hbXxnZXRwd3VpZHxnZXRzZXJ2YnluYW1lfGdldHNlcnZieXBvcnR8Z2V0c29ja25hbWV8Z2V0c29ja29wdHwiICsNCiAgICAgICAgImdldHNvY2tvcHRfZmxvYXR8Z2V0c29ja29wdF9pbnR8Z2V0c29ja29wdF9vcHRpbnR8Z2V0dGltZW9mZGF5fGdldHVpZHwiICsNCiAgICAgICAgImdsb2JhbF9yZXBsYWNlfGdsb2JhbF9zdWJzdGl0dXRlfGdtdGltZXxncmVlbnxncmlkfGdyb3VwX2JlZ2lubmluZ3wiICsNCiAgICAgICAgImdyb3VwX2VuZHxndF9iaWdfaW50fGd0X251bXxndWFyZHxoYW5kbGVfdW5peF9lcnJvcnxoYXNofGhhc2hfcGFyYW18IiArDQogICAgICAgICJoZHxoZWFkZXJfc2l6ZXxpfGlkfGlnbm9yZXxpbl9jaGFubmVsX2xlbmd0aHxpbl9jaGFubmVsX29mX2Rlc2NyfGluY3J8IiArDQogICAgICAgICJpbmNyX251bXxpbmRleHxpbmRleF9mcm9tfGluZXRfYWRkcl9hbnl8aW5ldF9hZGRyX29mX3N0cmluZ3xpbmZpbml0eXwiICsNCiAgICAgICAgImluZml4X3RhZ3xpbml0fGluaXRfY2xhc3N8aW5wdXR8aW5wdXRfYmluYXJ5X2ludHxpbnB1dF9ieXRlfGlucHV0X2NoYXJ8IiArDQogICAgICAgICJpbnB1dF9saW5lfGlucHV0X3ZhbHVlfGludHxpbnQxNl9zaWduZWR8aW50MTZfdW5zaWduZWR8aW50MzJ8aW50NjR8IiArDQogICAgICAgICJpbnQ4X3NpZ25lZHxpbnQ4X3Vuc2lnbmVkfGludF9vZl9iaWdfaW50fGludF9vZl9jaGFyfGludF9vZl9mbG9hdHwiICsNCiAgICAgICAgImludF9vZl9udW18aW50X29mX3N0cmluZ3xpbnRlZ2VyX251bXxpbnRlcnxpbnRlcmFjdGl2ZXxpbnZ8aW52YWxpZF9hcmd8IiArDQogICAgICAgICJpc19ibG9ja3xpc19lbXB0eXxpc19pbXBsaWNpdHxpc19pbnR8aXNfaW50X2JpZ19pbnR8aXNfaW50ZWdlcl9udW18IiArDQogICAgICAgICJpc19yZWxhdGl2ZXxpdGVyfGl0ZXIyfGl0ZXJpfGpvaW58anVua3xrZXlfcHJlc3NlZHxraWxsfGtpbmR8a3ByaW50ZnwiICsNCiAgICAgICAgImtzY2FuZnxsYW5kfGxhc3RfY2hhcnN8bGF5b3V0fGxhenlfZnJvbV9mdW58bGF6eV9mcm9tX3ZhbHxsYXp5X2lzX3ZhbHwiICsNCiAgICAgICAgImxhenlfdGFnfGxkZXhwfGxlX2JpZ19pbnR8bGVfbnVtfGxlbmd0aHxsZXhlbWV8bGV4ZW1lX2NoYXJ8bGV4ZW1lX2VuZHwiICsNCiAgICAgICAgImxleGVtZV9lbmRfcHxsZXhlbWVfc3RhcnR8bGV4ZW1lX3N0YXJ0X3B8bGluZXRvfGxpbmt8bGlzdHxsaXN0ZW58bG5vdHwiICsNCiAgICAgICAgImxvYWRmaWxlfGxvYWRmaWxlX3ByaXZhdGV8bG9jYWx0aW1lfGxvY2t8bG9ja2Z8bG9nfGxvZzEwfGxvZ2FuZHxsb2dub3R8IiArDQogICAgICAgICJsb2dvcnxsb2d4b3J8bG9yfGxvd2VyX3dpbmRvd3xsb3dlcmNhc2V8bHNlZWt8bHNsfGxzcnxsc3RhdHxsdF9iaWdfaW50fCIgKw0KICAgICAgICAibHRfbnVtfGx4b3J8bWFnZW50YXxtYWdpY3xtYWluTG9vcHxtYWpvcnxtYWpvcl9zbGljZXxtYWtlfG1ha2VfZm9ybWF0dGVyfCIgKw0KICAgICAgICAibWFrZV9pbWFnZXxtYWtlX2xleGVyfG1ha2VfbWF0cml4fG1ha2Vfc2VsZl9pbml0fG1hcHxtYXAyfG1hcF9maWxlfG1hcGl8IiArDQogICAgICAgICJtYXJzaGFsfG1hdGNoX2JlZ2lubmluZ3xtYXRjaF9lbmR8bWF0Y2hlZF9ncm91cHxtYXRjaGVkX3N0cmluZ3xtYXh8IiArDQogICAgICAgICJtYXhfYXJyYXlfbGVuZ3RofG1heF9iaWdfaW50fG1heF9lbHR8bWF4X2Zsb2F0fG1heF9pbnR8bWF4X251bXwiICsNCiAgICAgICAgIm1heF9zdHJpbmdfbGVuZ3RofG1lbXxtZW1fYXNzb2N8bWVtX2Fzc3F8bWVtcXxtZXJnZXxtaW58bWluX2JpZ19pbnR8IiArDQogICAgICAgICJtaW5fZWx0fG1pbl9mbG9hdHxtaW5faW50fG1pbl9udW18bWlub3J8bWludXNfYmlnX2ludHxtaW51c19udW18IiArDQogICAgICAgICJtaW51c19vbmV8bWtkaXJ8bWtmaWZvfG1rdGltZXxtb2R8bW9kX2JpZ19pbnR8bW9kX2Zsb2F0fG1vZF9udW18bW9kZnwiICsNCiAgICAgICAgIm1vdXNlX3Bvc3xtb3ZldG98bXVsfG11bHRfYmlnX2ludHxtdWx0X2ludF9iaWdfaW50fG11bHRfbnVtfG5hbnxuYXJyb3d8IiArDQogICAgICAgICJuYXRfb2ZfbnVtfG5hdGl2ZWludHxuZWd8bmVnX2luZmluaXR5fG5ld19ibG9ja3xuZXdfY2hhbm5lbHxuZXdfbWV0aG9kfCIgKw0KICAgICAgICAibmV3X3ZhcmlhYmxlfG5leHR8bmV4dGtleXxuaWNlfG5pY2V8bm9fc2Nhbl90YWd8bm9ybXxub3JtMnxub3R8bnBlZWt8IiArDQogICAgICAgICJudGh8bnRoX2RpbXxudW1fZGlnaXRzX2JpZ19pbnR8bnVtX2RpbXN8bnVtX29mX2JpZ19pbnR8bnVtX29mX2ludHwiICsNCiAgICAgICAgIm51bV9vZl9uYXR8bnVtX29mX3JhdGlvfG51bV9vZl9zdHJpbmd8T3xvYmp8b2JqZWN0X3RhZ3xvY2FtbF92ZXJzaW9ufCIgKw0KICAgICAgICAib2ZfYXJyYXl8b2ZfY2hhbm5lbHxvZl9mbG9hdHxvZl9pbnR8b2ZfaW50MzJ8b2ZfbGlzdHxvZl9uYXRpdmVpbnR8IiArDQogICAgICAgICJvZl9zdHJpbmd8b25lfG9wZW5Ua3xvcGVuX2JveHxvcGVuX2Nvbm5lY3Rpb258b3Blbl9ncmFwaHxvcGVuX2hib3h8IiArDQogICAgICAgICJvcGVuX2hvdmJveHxvcGVuX2h2Ym94fG9wZW5faW58b3Blbl9pbl9iaW58b3Blbl9pbl9nZW58b3Blbl9vdXR8IiArDQogICAgICAgICJvcGVuX291dF9iaW58b3Blbl9vdXRfZ2VufG9wZW5fcHJvY2Vzc3xvcGVuX3Byb2Nlc3NfZnVsbHxvcGVuX3Byb2Nlc3NfaW58IiArDQogICAgICAgICJvcGVuX3Byb2Nlc3Nfb3V0fG9wZW5fc3Vid2luZG93fG9wZW5fdGFnfG9wZW5fdGJveHxvcGVuX3RlbXBfZmlsZXwiICsNCiAgICAgICAgIm9wZW5fdmJveHxvcGVuZGJtfG9wZW5kaXJ8b3BlbmZpbGV8b3J8b3NfdHlwZXxvdXRfY2hhbm5lbF9sZW5ndGh8IiArDQogICAgICAgICJvdXRfY2hhbm5lbF9vZl9kZXNjcnxvdXRwdXR8b3V0cHV0X2JpbmFyeV9pbnR8b3V0cHV0X2J1ZmZlcnxvdXRwdXRfYnl0ZXwiICsNCiAgICAgICAgIm91dHB1dF9jaGFyfG91dHB1dF9zdHJpbmd8b3V0cHV0X3ZhbHVlfG92ZXJfbWF4X2JveGVzfHBhY2t8cGFyYW1zfCIgKw0KICAgICAgICAicGFyZW50X2Rpcl9uYW1lfHBhcnNlfHBhcnNlX2FyZ3Z8cGFydGl0aW9ufHBhdXNlfHBlZWt8cGlwZXxwaXhlbHN8IiArDQogICAgICAgICJwbGFjZXxwbG90fHBsb3RzfHBvaW50X2NvbG9yfHBvbGFyfHBvbGx8cG9wfHBvc19pbnxwb3Nfb3V0fHBvd3wiICsNCiAgICAgICAgInBvd2VyX2JpZ19pbnRfcG9zaXRpdmVfYmlnX2ludHxwb3dlcl9iaWdfaW50X3Bvc2l0aXZlX2ludHwiICsNCiAgICAgICAgInBvd2VyX2ludF9wb3NpdGl2ZV9iaWdfaW50fHBvd2VyX2ludF9wb3NpdGl2ZV9pbnR8cG93ZXJfbnVtfCIgKw0KICAgICAgICAicHBfY2xvc2VfYm94fHBwX2Nsb3NlX3RhZ3xwcF9jbG9zZV90Ym94fHBwX2ZvcmNlX25ld2xpbmV8IiArDQogICAgICAgICJwcF9nZXRfYWxsX2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfHBwX2dldF9lbGxpcHNpc190ZXh0fCIgKw0KICAgICAgICAicHBfZ2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfHBwX2dldF9mb3JtYXR0ZXJfdGFnX2Z1bmN0aW9uc3wiICsNCiAgICAgICAgInBwX2dldF9tYXJnaW58cHBfZ2V0X21hcmtfdGFnc3xwcF9nZXRfbWF4X2JveGVzfHBwX2dldF9tYXhfaW5kZW50fCIgKw0KICAgICAgICAicHBfZ2V0X3ByaW50X3RhZ3N8cHBfb3Blbl9ib3h8cHBfb3Blbl9oYm94fHBwX29wZW5faG92Ym94fHBwX29wZW5faHZib3h8IiArDQogICAgICAgICJwcF9vcGVuX3RhZ3xwcF9vcGVuX3Rib3h8cHBfb3Blbl92Ym94fHBwX292ZXJfbWF4X2JveGVzfHBwX3ByaW50X2FzfCIgKw0KICAgICAgICAicHBfcHJpbnRfYm9vbHxwcF9wcmludF9icmVha3xwcF9wcmludF9jaGFyfHBwX3ByaW50X2N1dHxwcF9wcmludF9mbG9hdHwiICsNCiAgICAgICAgInBwX3ByaW50X2ZsdXNofHBwX3ByaW50X2lmX25ld2xpbmV8cHBfcHJpbnRfaW50fHBwX3ByaW50X25ld2xpbmV8IiArDQogICAgICAgICJwcF9wcmludF9zcGFjZXxwcF9wcmludF9zdHJpbmd8cHBfcHJpbnRfdGFifHBwX3ByaW50X3RicmVha3wiICsNCiAgICAgICAgInBwX3NldF9hbGxfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnN8cHBfc2V0X2VsbGlwc2lzX3RleHR8IiArDQogICAgICAgICJwcF9zZXRfZm9ybWF0dGVyX291dF9jaGFubmVsfHBwX3NldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9uc3wiICsNCiAgICAgICAgInBwX3NldF9mb3JtYXR0ZXJfdGFnX2Z1bmN0aW9uc3xwcF9zZXRfbWFyZ2lufHBwX3NldF9tYXJrX3RhZ3N8IiArDQogICAgICAgICJwcF9zZXRfbWF4X2JveGVzfHBwX3NldF9tYXhfaW5kZW50fHBwX3NldF9wcmludF90YWdzfHBwX3NldF90YWJ8IiArDQogICAgICAgICJwcF9zZXRfdGFnc3xwcmVkfHByZWRfYmlnX2ludHxwcmVkX251bXxwcmVycl9jaGFyfHByZXJyX2VuZGxpbmV8IiArDQogICAgICAgICJwcmVycl9mbG9hdHxwcmVycl9pbnR8cHJlcnJfbmV3bGluZXxwcmVycl9zdHJpbmd8cHJpbnR8cHJpbnRfYXN8IiArDQogICAgICAgICJwcmludF9ib29sfHByaW50X2JyZWFrfHByaW50X2NoYXJ8cHJpbnRfY3V0fHByaW50X2VuZGxpbmV8cHJpbnRfZmxvYXR8IiArDQogICAgICAgICJwcmludF9mbHVzaHxwcmludF9pZl9uZXdsaW5lfHByaW50X2ludHxwcmludF9uZXdsaW5lfHByaW50X3NwYWNlfCIgKw0KICAgICAgICAicHJpbnRfc3RhdHxwcmludF9zdHJpbmd8cHJpbnRfdGFifHByaW50X3RicmVha3xwcmludGZ8cHJvaGliaXR8IiArDQogICAgICAgICJwdWJsaWNfbWV0aG9kX2xhYmVsfHB1c2h8cHV0ZW52fHF1b19udW18cXVvbW9kX2JpZ19pbnR8cXVvdGV8cmFpc2V8IiArDQogICAgICAgICJyYWlzZV93aW5kb3d8cmF0aW9fb2ZfbnVtfHJjb250YWluc19mcm9tfHJlYWR8cmVhZF9mbG9hdHxyZWFkX2ludHwiICsNCiAgICAgICAgInJlYWRfa2V5fHJlYWRfbGluZXxyZWFkZGlyfHJlYWRkaXJ8cmVhZGxpbmt8cmVhbGx5X2lucHV0fHJlY2VpdmV8cmVjdnwiICsNCiAgICAgICAgInJlY3Zmcm9tfHJlZHxyZWZ8cmVnZXhwfHJlZ2V4cF9jYXNlX2ZvbGR8cmVnZXhwX3N0cmluZ3wiICsNCiAgICAgICAgInJlZ2V4cF9zdHJpbmdfY2FzZV9mb2xkfHJlZ2lzdGVyfHJlZ2lzdGVyX2V4Y2VwdGlvbnxyZW18cmVtZW1iZXJfbW9kZXwiICsNCiAgICAgICAgInJlbW92ZXxyZW1vdmVfYXNzb2N8cmVtb3ZlX2Fzc3F8cmVuYW1lfHJlcGxhY2V8cmVwbGFjZV9maXJzdHwiICsNCiAgICAgICAgInJlcGxhY2VfbWF0Y2hlZHxyZXByfHJlc2V0fHJlc2hhcGV8cmVzaGFwZV8xfHJlc2hhcGVfMnxyZXNoYXBlXzN8cmV2fCIgKw0KICAgICAgICAicmV2X2FwcGVuZHxyZXZfbWFwfHJldl9tYXAyfHJld2luZGRpcnxyZ2J8cmhzX2VuZHxyaHNfZW5kX3Bvc3xyaHNfc3RhcnR8IiArDQogICAgICAgICJyaHNfc3RhcnRfcG9zfHJpbmRleHxyaW5kZXhfZnJvbXxybGluZXRvfHJtZGlyfHJtb3ZldG98cm91bmRfbnVtfCIgKw0KICAgICAgICAicnVuX2luaXRpYWxpemVyc3xydW5faW5pdGlhbGl6ZXJzX29wdHxzY2FuZnxzZWFyY2hfYmFja3dhcmR8IiArDQogICAgICAgICJzZWFyY2hfZm9yd2FyZHxzZWVrX2lufHNlZWtfb3V0fHNlbGVjdHxzZWxmfHNlbGZfaW5pdHxzZW5kfHNlbmR0b3xzZXR8IiArDQogICAgICAgICJzZXRfYWxsX2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfHNldF9hcHByb3hfcHJpbnRpbmd8IiArDQogICAgICAgICJzZXRfYmluYXJ5X21vZGVfaW58c2V0X2JpbmFyeV9tb2RlX291dHxzZXRfY2xvc2Vfb25fZXhlY3wiICsNCiAgICAgICAgInNldF9jbG9zZV9vbl9leGVjfHNldF9jb2xvcnxzZXRfZWxsaXBzaXNfdGV4dHwiICsNCiAgICAgICAgInNldF9lcnJvcl93aGVuX251bGxfZGVub21pbmF0b3J8c2V0X2ZpZWxkfHNldF9mbG9hdGluZ19wcmVjaXNpb258IiArDQogICAgICAgICJzZXRfZm9udHxzZXRfZm9ybWF0dGVyX291dF9jaGFubmVsfHNldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9uc3wiICsNCiAgICAgICAgInNldF9mb3JtYXR0ZXJfdGFnX2Z1bmN0aW9uc3xzZXRfbGluZV93aWR0aHxzZXRfbWFyZ2lufHNldF9tYXJrX3RhZ3N8IiArDQogICAgICAgICJzZXRfbWF4X2JveGVzfHNldF9tYXhfaW5kZW50fHNldF9tZXRob2R8c2V0X25vbmJsb2NrfHNldF9ub25ibG9ja3wiICsNCiAgICAgICAgInNldF9ub3JtYWxpemVfcmF0aW98c2V0X25vcm1hbGl6ZV9yYXRpb193aGVuX3ByaW50aW5nfHNldF9wcmludF90YWdzfCIgKw0KICAgICAgICAic2V0X3NpZ25hbHxzZXRfc3RhdGV8c2V0X3RhYnxzZXRfdGFnfHNldF90YWdzfHNldF90ZXh0X3NpemV8IiArDQogICAgICAgICJzZXRfd2luZG93X3RpdGxlfHNldGdpZHxzZXRnaWR8c2V0aXRpbWVyfHNldGl0aW1lcnxzZXRzaWR8c2V0c2lkfCIgKw0KICAgICAgICAic2V0c29ja29wdHxzZXRzb2Nrb3B0fHNldHNvY2tvcHRfZmxvYXR8c2V0c29ja29wdF9mbG9hdHxzZXRzb2Nrb3B0X2ludHwiICsNCiAgICAgICAgInNldHNvY2tvcHRfaW50fHNldHNvY2tvcHRfb3B0aW50fHNldHNvY2tvcHRfb3B0aW50fHNldHVpZHxzZXR1aWR8IiArDQogICAgICAgICJzaGlmdF9sZWZ0fHNoaWZ0X2xlZnR8c2hpZnRfbGVmdHxzaGlmdF9yaWdodHxzaGlmdF9yaWdodHxzaGlmdF9yaWdodHwiICsNCiAgICAgICAgInNoaWZ0X3JpZ2h0X2xvZ2ljYWx8c2hpZnRfcmlnaHRfbG9naWNhbHxzaGlmdF9yaWdodF9sb2dpY2FsfHNob3dfYnVja2V0c3wiICsNCiAgICAgICAgInNodXRkb3dufHNodXRkb3dufHNodXRkb3duX2Nvbm5lY3Rpb258c2h1dGRvd25fY29ubmVjdGlvbnxzaWdhYnJ0fCIgKw0KICAgICAgICAic2lnYWxybXxzaWdjaGxkfHNpZ2NvbnR8c2lnZnBlfHNpZ2h1cHxzaWdpbGx8c2lnaW50fHNpZ2tpbGx8c2lnbl9iaWdfaW50fCIgKw0KICAgICAgICAic2lnbl9udW18c2lnbmFsfHNpZ25hbHxzaWdwZW5kaW5nfHNpZ3BlbmRpbmd8c2lncGlwZXxzaWdwcm9jbWFza3wiICsNCiAgICAgICAgInNpZ3Byb2NtYXNrfHNpZ3Byb2Z8c2lncXVpdHxzaWdzZWd2fHNpZ3N0b3B8c2lnc3VzcGVuZHxzaWdzdXNwZW5kfCIgKw0KICAgICAgICAic2lndGVybXxzaWd0c3RwfHNpZ3R0aW58c2lndHRvdXxzaWd1c3IxfHNpZ3VzcjJ8c2lndnRhbHJtfHNpbnxzaW5nbGV0b258IiArDQogICAgICAgICJzaW5ofHNpemV8c2l6ZXxzaXplX3h8c2l6ZV95fHNsZWVwfHNsZWVwfHNsZWVwfHNsaWNlX2xlZnR8c2xpY2VfbGVmdHwiICsNCiAgICAgICAgInNsaWNlX2xlZnRfMXxzbGljZV9sZWZ0XzJ8c2xpY2VfcmlnaHR8c2xpY2VfcmlnaHR8c2xpY2VfcmlnaHRfMXwiICsNCiAgICAgICAgInNsaWNlX3JpZ2h0XzJ8c25kfHNvY2tldHxzb2NrZXR8c29ja2V0fHNvY2tldHBhaXJ8c29ja2V0cGFpcnxzb3J0fHNvdW5kfCIgKw0KICAgICAgICAic3BsaXR8c3BsaXRfZGVsaW18c3ByaW50ZnxzcHJpbnRmfHNxcnR8c3FydHxzcXJ0X2JpZ19pbnR8c3F1YXJlX2JpZ19pbnR8IiArDQogICAgICAgICJzcXVhcmVfbnVtfHNzY2FuZnxzdGFibGVfc29ydHxzdGFibGVfc29ydHxzdGFibGVfc29ydHxzdGFibGVfc29ydHxzdGFibGVfc29ydHwiICsNCiAgICAgICAgInN0YWJsZV9zb3J0fHN0YXR8c3RhdHxzdGF0fHN0YXR8c3RhdHxzdGF0c3xzdGF0c3xzdGRfZm9ybWF0dGVyfHN0ZGJ1ZnwiICsNCiAgICAgICAgInN0ZGVycnxzdGRlcnJ8c3RkZXJyfHN0ZGlifHN0ZGlufHN0ZGlufHN0ZGlufHN0ZG91dHxzdGRvdXR8c3Rkb3V0fCIgKw0KICAgICAgICAic3RyX2Zvcm1hdHRlcnxzdHJpbmd8c3RyaW5nX2FmdGVyfHN0cmluZ19iZWZvcmV8c3RyaW5nX21hdGNofCIgKw0KICAgICAgICAic3RyaW5nX29mX2JpZ19pbnR8c3RyaW5nX29mX2Jvb2x8c3RyaW5nX29mX2Zsb2F0fHN0cmluZ19vZl9mb3JtYXR8IiArDQogICAgICAgICJzdHJpbmdfb2ZfaW5ldF9hZGRyfHN0cmluZ19vZl9pbmV0X2FkZHJ8c3RyaW5nX29mX2ludHxzdHJpbmdfb2ZfbnVtfCIgKw0KICAgICAgICAic3RyaW5nX3BhcnRpYWxfbWF0Y2h8c3RyaW5nX3RhZ3xzdWJ8c3VifHN1Yl9iaWdfaW50fHN1Yl9sZWZ0fHN1Yl9udW18IiArDQogICAgICAgICJzdWJfcmlnaHR8c3Vic2V0fHN1YnNldHxzdWJzdGl0dXRlX2ZpcnN0fHN1YnN0cmluZ3xzdWNjfHN1Y2N8IiArDQogICAgICAgICJzdWNjfHN1Y2N8c3VjY19iaWdfaW50fHN1Y2NfbnVtfHN5bWJvbF9lbmR8c3ltYm9sX2VuZF9wb3N8c3ltYm9sX3N0YXJ0fCIgKw0KICAgICAgICAic3ltYm9sX3N0YXJ0X3Bvc3xzeW1saW5rfHN5bWxpbmt8c3luY3xzeW5jaHJvbml6ZXxzeXN0ZW18c3lzdGVtfHN5c3RlbXwiICsNCiAgICAgICAgInRhZ3x0YWtlfHRhbnx0YW5ofHRjZHJhaW58dGNkcmFpbnx0Y2Zsb3d8dGNmbG93fHRjZmx1c2h8dGNmbHVzaHwiICsNCiAgICAgICAgInRjZ2V0YXR0cnx0Y2dldGF0dHJ8dGNzZW5kYnJlYWt8dGNzZW5kYnJlYWt8dGNzZXRhdHRyfHRjc2V0YXR0cnwiICsNCiAgICAgICAgInRlbXBfZmlsZXx0ZXh0X3NpemV8dGltZXx0aW1lfHRpbWV8dGltZWRfcmVhZHx0aW1lZF93cml0ZXx0aW1lc3x0aW1lc3wiICsNCiAgICAgICAgInRsfHRsfHRsfHRvX2J1ZmZlcnx0b19jaGFubmVsfHRvX2Zsb2F0fHRvX2hleHx0b19pbnR8dG9faW50MzJ8dG9fbGlzdHwiICsNCiAgICAgICAgInRvX2xpc3R8dG9fbGlzdHx0b19uYXRpdmVpbnR8dG9fc3RyaW5nfHRvX3N0cmluZ3x0b19zdHJpbmd8dG9fc3RyaW5nfCIgKw0KICAgICAgICAidG9fc3RyaW5nfHRvcHx0b3B8dG90YWxfc2l6ZXx0cmFuc2Zlcnx0cmFuc3B8dHJ1bmNhdGV8dHJ1bmNhdGV8dHJ1bmNhdGV8IiArDQogICAgICAgICJ0cnVuY2F0ZXx0cnVuY2F0ZXx0cnVuY2F0ZXx0cnlfbG9ja3x1bWFza3x1bWFza3x1bmNhcGl0YWxpemV8dW5jYXBpdGFsaXplfCIgKw0KICAgICAgICAidW5jYXBpdGFsaXplfHVuaW9ufHVuaW9ufHVuaXRfYmlnX2ludHx1bmxpbmt8dW5saW5rfHVubG9ja3x1bm1hcnNoYWx8IiArDQogICAgICAgICJ1bnNhZmVfYmxpdHx1bnNhZmVfZmlsbHx1bnNhZmVfZ2V0fHVuc2FmZV9nZXR8dW5zYWZlX3NldHx1bnNhZmVfc2V0fCIgKw0KICAgICAgICAidXBkYXRlfHVwcGVyY2FzZXx1cHBlcmNhc2V8dXBwZXJjYXNlfHVwcGVyY2FzZXx1c2FnZXx1dGltZXN8dXRpbWVzfHdhaXR8IiArDQogICAgICAgICJ3YWl0fHdhaXR8d2FpdHx3YWl0X25leHRfZXZlbnR8d2FpdF9waWR8d2FpdF9yZWFkfHdhaXRfc2lnbmFsfCIgKw0KICAgICAgICAid2FpdF90aW1lZF9yZWFkfHdhaXRfdGltZWRfd3JpdGV8d2FpdF93cml0ZXx3YWl0cGlkfHdoaXRlfCIgKw0KICAgICAgICAid2lkZW58d2luZG93X2lkfHdvcmRfc2l6ZXx3cmFwfHdyYXBfYWJvcnR8d3JpdGV8eWVsbG93fHlpZWxkfHplcm98emVyb19iaWdfaW50fCIgKw0KDQogICAgICAgICJBcmd8QXJpdGhfc3RhdHVzfEFycmF5fEFycmF5MXxBcnJheTJ8QXJyYXkzfEFycmF5TGFiZWxzfEJpZ19pbnR8QmlnYXJyYXl8IiArDQogICAgICAgICJCdWZmZXJ8Q2FsbGJhY2t8Q2FtbGludGVybmFsT098Q2hhcnxDb21wbGV4fENvbmRpdGlvbnxEYm18RGlnZXN0fER5bmxpbmt8IiArDQogICAgICAgICJFdmVudHxGaWxlbmFtZXxGb3JtYXR8R2N8R2VuYXJyYXl8R2VubGV4fEdyYXBoaWNzfEdyYXBoaWNzWDExfEhhc2h0Ymx8IiArDQogICAgICAgICJJbnQzMnxJbnQ2NHxMYXJnZUZpbGV8TGF6eXxMZXhpbmd8TGlzdHxMaXN0TGFiZWxzfE1ha2V8TWFwfE1hcnNoYWx8IiArDQogICAgICAgICJNb3JlTGFiZWxzfE11dGV4fE5hdGl2ZWludHxOdW18T2JqfE9vfFBhcnNpbmd8UGVydmFzaXZlc3xQcmludGV4Y3wiICsNCiAgICAgICAgIlByaW50ZnxRdWV1ZXxSYW5kb218U2NhbmZ8U2Nhbm5pbmd8U2V0fFNvcnR8U3RhY2t8U3RhdGV8U3RkTGFiZWxzfFN0cnwiICsNCiAgICAgICAgIlN0cmVhbXxTdHJpbmd8U3RyaW5nTGFiZWxzfFN5c3xUaHJlYWR8VGhyZWFkVW5peHxUa3xVbml4fFVuaXhMYWJlbHN8V2VhayINCiAgICApLnNwbGl0KCJ8IikpOw0KDQogICAgdmFyIGRlY2ltYWxJbnRlZ2VyID0gIig/Oig/OlsxLTldXFxkKil8KD86MCkpIjsNCiAgICB2YXIgb2N0SW50ZWdlciA9ICIoPzowW29PXT9bMC03XSspIjsNCiAgICB2YXIgaGV4SW50ZWdlciA9ICIoPzowW3hYXVtcXGRBLUZhLWZdKykiOw0KICAgIHZhciBiaW5JbnRlZ2VyID0gIig/OjBbYkJdWzAxXSspIjsNCiAgICB2YXIgaW50ZWdlciA9ICIoPzoiICsgZGVjaW1hbEludGVnZXIgKyAifCIgKyBvY3RJbnRlZ2VyICsgInwiICsgaGV4SW50ZWdlciArICJ8IiArIGJpbkludGVnZXIgKyAiKSI7DQoNCiAgICB2YXIgZXhwb25lbnQgPSAiKD86W2VFXVsrLV0/XFxkKykiOw0KICAgIHZhciBmcmFjdGlvbiA9ICIoPzpcXC5cXGQrKSI7DQogICAgdmFyIGludFBhcnQgPSAiKD86XFxkKykiOw0KICAgIHZhciBwb2ludEZsb2F0ID0gIig/Oig/OiIgKyBpbnRQYXJ0ICsgIj8iICsgZnJhY3Rpb24gKyAiKXwoPzoiICsgaW50UGFydCArICJcXC4pKSI7DQogICAgdmFyIGV4cG9uZW50RmxvYXQgPSAiKD86KD86IiArIHBvaW50RmxvYXQgKyAifCIgKyAgaW50UGFydCArICIpIiArIGV4cG9uZW50ICsgIikiOw0KICAgIHZhciBmbG9hdE51bWJlciA9ICIoPzoiICsgZXhwb25lbnRGbG9hdCArICJ8IiArIHBvaW50RmxvYXQgKyAiKSI7DQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICdcXChcXCouKj9cXCpcXClcXHMqPyQnDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICdcXChcXCouKicsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBjaGFyDQogICAgICAgICAgICAgICAgcmVnZXggOiAiJy4nIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyAiIHN0cmluZw0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICciJywNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJxc3RyaW5nIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaW1hZ2luYXJ5DQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86IiArIGZsb2F0TnVtYmVyICsgInxcXGQrKVtqSl1cXGIiDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogZmxvYXROdW1iZXINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGludGVnZXINCiAgICAgICAgICAgICAgICByZWdleCA6IGludGVnZXIgKyAiXFxiIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluRnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcK1xcLnxcXC1cXC58XFwqXFwufFxcL1xcLnwjfDs7fFxcK3xcXC18XFwqfFxcKlxcKlxcL3xcXC9cXC98JXw8PHw+PnwmfFxcfHxcXF58fnw8fD58PD18PT58PT18IT18PD58PC18PSINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbWyh7XSINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcKSIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCg0KICAgICAgICAicXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICciJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhPY2FtbEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLk9jYW1sSGlnaGxpZ2h0UnVsZXMgPSBPY2FtbEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBQYW5hZ2lvdGlzIEFzdGl0aGFzIDxwYXN0aXRoIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9wZXJsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvcGVybF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBQZXJsSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3BlcmxfaGlnaGxpZ2h0X3J1bGVzIikuUGVybEhpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IFBlcmxIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOw0KICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMudG9nZ2xlQ29tbWVudExpbmVzID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgc3RhcnRSb3csIGVuZFJvdykgew0KICAgICAgICB2YXIgb3V0ZGVudCA9IHRydWU7DQogICAgICAgIHZhciByZSA9IC9eKFxzKikjLzsNCg0KICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspIHsNCiAgICAgICAgICAgIGlmICghcmUudGVzdChkb2MuZ2V0TGluZShpKSkpIHsNCiAgICAgICAgICAgICAgICBvdXRkZW50ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAob3V0ZGVudCkgew0KICAgICAgICAgICAgdmFyIGRlbGV0ZVJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOw0KICAgICAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUoaSk7DQogICAgICAgICAgICAgICAgdmFyIG0gPSBsaW5lLm1hdGNoKHJlKTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5zdGFydC5yb3cgPSBpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5yb3cgPSBpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5jb2x1bW4gPSBtWzBdLmxlbmd0aDsNCiAgICAgICAgICAgICAgICBkb2MucmVwbGFjZShkZWxldGVSYW5nZSwgbVsxXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBkb2MuaW5kZW50Um93cyhzdGFydFJvdywgZW5kUm93LCAiIyIpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQoNCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7DQogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsNCg0KICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50Iikgew0KICAgICAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChzdGF0ZSA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLipbXHtcKFxbXDpdXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgUGFuYWdpb3RpcyBBc3RpdGhhcyA8cGFzdGl0aCBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvcGVybF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgUGVybEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYmFzZXxjb25zdGFudHxjb250aW51ZXxlbHNlfGVsc2lmfGZvcnxmb3JlYWNofGZvcm1hdHxnb3RvfGlmfGxhc3R8bG9jYWx8bXl8bmV4dHwiICsNCiAgICAgICAgICJub3xwYWNrYWdlfHBhcmVudHxyZWRvfHJlcXVpcmV8c2NhbGFyfHN1Ynx1bmxlc3N8dW50aWx8d2hpbGV8dXNlfHZhcnMiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsZGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIkFSR1Z8RU5WfElOQ3xTSUciKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsdGluRnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImdldHByb3RvYnludW1iZXJ8Z2V0cHJvdG9ieW5hbWV8Z2V0c2VydmJ5bmFtZXxnZXRob3N0YnlhZGRyfCIgKw0KICAgICAgICAgImdldGhvc3RieW5hbWV8Z2V0c2VydmJ5cG9ydHxnZXRuZXRieWFkZHJ8Z2V0bmV0YnluYW1lfGdldHNvY2tuYW1lfCIgKw0KICAgICAgICAgImdldHBlZXJuYW1lfHNldHByaW9yaXR5fGdldHByb3RvZW50fHNldHByb3RvZW50fGdldHByaW9yaXR5fCIgKw0KICAgICAgICAgImVuZHByb3RvZW50fGdldHNlcnZlbnR8c2V0c2VydmVudHxlbmRzZXJ2ZW50fHNldGhvc3RlbnR8c29ja2V0cGFpcnwiICsNCiAgICAgICAgICJnZXRzb2Nrb3B0fGdldGhvc3RlbnR8ZW5kaG9zdGVudHxzZXRzb2Nrb3B0fHNldG5ldGVudHxxdW90ZW1ldGF8IiArDQogICAgICAgICAibG9jYWx0aW1lfHByb3RvdHlwZXxnZXRuZXRlbnR8ZW5kbmV0ZW50fHJld2luZGRpcnx3YW50YXJyYXl8Z2V0cHd1aWR8IiArDQogICAgICAgICAiY2xvc2VkaXJ8Z2V0bG9naW58cmVhZGxpbmt8ZW5kZ3JlbnR8Z2V0Z3JnaWR8Z2V0Z3JuYW18c2htd3JpdGV8IiArDQogICAgICAgICAic2h1dGRvd258cmVhZGxpbmV8ZW5kcHdlbnR8c2V0Z3JlbnR8cmVhZHBpcGV8Zm9ybWxpbmV8dHJ1bmNhdGV8IiArDQogICAgICAgICAiZGJtY2xvc2V8c3lzd3JpdGV8c2V0cHdlbnR8Z2V0cHduYW18Z2V0Z3JlbnR8Z2V0cHdlbnR8dWNmaXJzdHxzeXNyZWFkfCIgKw0KICAgICAgICAgInNldHBncnB8c2htcmVhZHxzeXNzZWVrfHN5c29wZW58dGVsbGRpcnxkZWZpbmVkfG9wZW5kaXJ8Y29ubmVjdHwiICsNCiAgICAgICAgICJsY2ZpcnN0fGdldHBwaWR8YmlubW9kZXxzeXNjYWxsfHNwcmludGZ8Z2V0cGdycHxyZWFkZGlyfHNlZWtkaXJ8IiArDQogICAgICAgICAid2FpdHBpZHxyZXZlcnNlfHVuc2hpZnR8c3ltbGlua3xkYm1vcGVufHNlbWdldHxtc2dyY3Z8cmVuYW1lfGxpc3RlbnwiICsNCiAgICAgICAgICJjaHJvb3R8bXNnc25kfHNobWN0bHxhY2NlcHR8dW5wYWNrfGV4aXN0c3xmaWxlbm98c2htZ2V0fHN5c3RlbXwiICsNCiAgICAgICAgICJ1bmxpbmt8cHJpbnRmfGdtdGltZXxtc2djdGx8c2VtY3RsfHZhbHVlc3xyaW5kZXh8c3Vic3RyfHNwbGljZXwiICsNCiAgICAgICAgICJsZW5ndGh8bXNnZ2V0fHNlbGVjdHxzb2NrZXR8cmV0dXJufGNhbGxlcnxkZWxldGV8YWxhcm18aW9jdGx8aW5kZXh8IiArDQogICAgICAgICAidW5kZWZ8bHN0YXR8dGltZXN8c3JhbmR8Y2hvd258ZmNudGx8Y2xvc2V8d3JpdGV8dW1hc2t8cm1kaXJ8c3R1ZHl8IiArDQogICAgICAgICAic2xlZXB8Y2hvbXB8dW50aWV8cHJpbnR8dXRpbWV8bWtkaXJ8YXRhbjJ8c3BsaXR8Y3J5cHR8ZmxvY2t8Y2htb2R8IiArDQogICAgICAgICAiQkVHSU58Ymxlc3N8Y2hkaXJ8c2Vtb3B8c2hpZnR8cmVzZXR8bGlua3xzdGF0fGNob3B8Z3JlcHxmb3JrfGR1bXB8IiArDQogICAgICAgICAiam9pbnxvcGVufHRlbGx8cGlwZXxleGl0fGdsb2J8d2FybnxlYWNofGJpbmR8c29ydHxwYWNrfGV2YWx8cHVzaHwiICsNCiAgICAgICAgICJrZXlzfGdldGN8a2lsbHxzZWVrfHNxcnR8c2VuZHx3YWl0fHJhbmR8dGllZHxyZWFkfHRpbWV8ZXhlY3xyZWN2fCIgKw0KICAgICAgICAgImVvZnxjaHJ8aW50fG9yZHxleHB8cG9zfHBvcHxzaW58bG9nfGFic3xvY3R8aGV4fHRpZXxjb3N8dmVjfEVORHxyZWZ8IiArDQogICAgICAgICAibWFwfGRpZXx1Y3xsY3xkbyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiMuKiQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWy9dKD86KD86XFxbKD86XFxcXF18W15cXF1dKStcXF0pfCg/OlxcXFwvfFteXFxdL10pKSpbL11cXHcqXFxzKig/PVspLiw7XXwkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdLipcXFxcJCcsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJxcXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddLipcXFxcJCIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJxc3RyaW5nIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgNCiAgICAgICAgICAgICAgICByZWdleCA6ICIweFswLTlhLWZBLUZdK1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluRnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwuXFwuXFwufFxcfFxcfD18Pj49fDw8PXw8PT58JiY9fD0+fCF+fFxcXj18Jj18XFx8PXxcXC49fHg9fCU9fFxcLz18XFwqPXxcXC09fFxcKz18PX58XFwqXFwqfFxcLVxcLXxcXC5cXC58XFx8XFx8fCYmfFxcK1xcK3xcXC0+fCE9fD09fD49fDw9fD4+fDw8fCx8PXxcXD9cXDp8XFxefFxcfHx4fCV8XFwvfFxcKnw8fCZ8XFxcXHx+fCF8PnxcXC58XFwtfFxcK3xcXC1DfFxcLWJ8XFwtU3xcXC11fFxcLXR8XFwtcHxcXC1sfFxcLWR8XFwtZnxcXC1nfFxcLXN8XFwtenxcXC1rfFxcLWV8XFwtT3xcXC1UfFxcLUJ8XFwtTXxcXC1BfFxcLVh8XFwtV3xcXC1jfFxcLVJ8XFwtb3xcXC14fFxcLXd8XFwtcnxcXGIoPzphbmR8Y21wfGVxfGdlfGd0fGxlfGx0fG5lfG5vdHxvcnx4b3IpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxcXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcoPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/IicsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFzdHJpbmciIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKFBlcmxIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5QZXJsSGlnaGxpZ2h0UnVsZXMgPSBQZXJsSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOw0KDQogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7DQogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7DQoNCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSAvXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS87DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4Ow0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMV0pDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBpKTsNCg0KICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7DQogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgew0KICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkpOw0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07DQogICAgICAgICAgICB2YXIgc3RhcnQgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQobWF0Y2hbMV0sIGVuZCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICghc3RhcnQpDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4tLTsNCg0KICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgICAgICB9DQogICAgfTsNCiAgICANCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gbnVsbDsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsNCg0KICAgIC8vIG11c3QgcmV0dXJuICIiIGlmIHRoZXJlJ3Mgbm8gZm9sZCwgdG8gZW5hYmxlIGNhY2hpbmcNCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICBpZiAodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOw0KICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlcg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHJlID0gL15ccyovOw0KICAgICAgICB2YXIgc3RhcnRSb3cgPSByb3c7DQogICAgICAgIHZhciBlbmRSb3cgPSByb3c7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBzdGFydENvbHVtbiA9IGNvbHVtbiB8fCBsaW5lLmxlbmd0aDsNCiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpDQogICAgICAgIA0KICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsNCiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgICAgIHZhciBsZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgZW5kUm93ID0gcm93Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7DQogICAgICAgICAgICB2YXIgZW5kQ29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZFJvdykubGVuZ3RoOw0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1uICsgMX07DQogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOw0KICAgICAgICBpZiAoIWVuZCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOw0KICAgICAgICBpZiAoZncgPT0gbnVsbCkNCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOw0KDQogICAgICAgIGlmIChmdyA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICBlbmQucm93IC0tOw0KICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgfTsNCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCioNCiogQ29udHJpYnV0b3Iocyk6DQoqICAgICAgSm9uYXRoYW4gQ2FtaWxlIDxqb25hdGhhbi5jYW1pbGUgQVQgZ21haWwgRE9UIGNvbT4NCioNCiogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQoqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQoqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQoqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQoqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQoqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCioNCiogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9wZ3NxbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3Bnc3FsX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCiAgICB2YXIgb29wID0gcmVxdWlyZSgiYWNlL2xpYi9vb3AiKTsNCiAgICB2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCJhY2UvbW9kZS90ZXh0IikuTW9kZTsNCiAgICB2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiYWNlL3Rva2VuaXplciIpLlRva2VuaXplcjsNCiAgICB2YXIgUGdzcWxIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoImFjZS9tb2RlL3Bnc3FsX2hpZ2hsaWdodF9ydWxlcyIpLlBnc3FsSGlnaGxpZ2h0UnVsZXM7DQogICAgdmFyIFJhbmdlID0gcmVxdWlyZSgiYWNlL3JhbmdlIikuUmFuZ2U7DQogICAgLy8gdmFyIEVkaXRTZXNzaW9uID0gcmVxdWlyZSgiYWNlL2VkaXRfc2Vzc2lvbiIpLkVkaXRTZXNzaW9uOw0KDQogICAgdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgUGdzcWxIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOw0KICAgIH07DQogICAgb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KICAgIChmdW5jdGlvbigpIHsNCg0KICAgICAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgICAgIC8vIHZhciBvdXRlbnRlZFJvd3MgPSBbXTsNCiAgICAgICAgICAgIHZhciByZSA9IC9eKFxzKiktLS87DQoNCiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgICAgIGlmICghcmUudGVzdChkb2MuZ2V0TGluZShpKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICAgICAgdmFyIGRlbGV0ZVJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUoaSk7DQogICAgICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7DQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5yb3cgPSBpOw0KICAgICAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBkb2MuaW5kZW50Um93cyhzdGFydFJvdywgZW5kUm93LCAiLS0iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCg0KDQogICAgICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7IA0KICAgICAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gImtleXdvcmQuc3RhdGVtZW50RW5kIikgew0KICAgICAgICAgICAgICAgIHJldHVybiAiIjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGdldEluZGVudChsaW5lKTsgLy8gS2VlcCB3aGF0ZXZlciBpbmRlbnQgdGhlIHByZXZpb3VzIGxpbmUgaGFzDQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgIH0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQogICAgZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEpvaG4gRGVTb2ksIFBoLkQuIDxkZXNvaSBBVCBwZ2VkaXQgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKg0KICoNCiAqLw0KDQoNCmRlZmluZSgnYWNlL21vZGUvcGdzcWxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3BlcmxfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3B5dGhvbl9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCnZhciBvb3AgPSByZXF1aXJlKCJhY2UvbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCJhY2UvbGliL2xhbmciKTsNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KLy8gU3VwcG9ydGluZyBwZXJsIGFuZCBweXRob24gZm9yIG5vdyAtLSBib3RoIGluIHBnIGNvcmUgYW5kIGFjZQ0KdmFyIFBlcmxIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vcGVybF9oaWdobGlnaHRfcnVsZXMiKS5QZXJsSGlnaGxpZ2h0UnVsZXM7DQp2YXIgUHl0aG9uSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3B5dGhvbl9oaWdobGlnaHRfcnVsZXMiKS5QeXRob25IaWdobGlnaHRSdWxlczsNCg0KdmFyIFBnc3FsSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCiAgICANCiAgICAvLyBLZXl3b3JkcywgZnVuY3Rpb25zLCBvcGVyYXRvcnMgbGFzdCB1cGRhdGVkIGZvciBwZyA5LjEuDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImFib3J0fGFic29sdXRlfGFic3RpbWV8YWNjZXNzfGFjbGl0ZW18YWN0aW9ufGFkZHxhZG1pbnxhZnRlcnxhZ2dyZWdhdGV8YWxsfGFsc298YWx0ZXJ8YWx3YXlzfCIgKw0KICAgICAgICAiYW5hbHlzZXxhbmFseXplfGFuZHxhbnl8YW55YXJyYXl8YW55ZWxlbWVudHxhbnllbnVtfGFueW5vbmFycmF5fGFycmF5fGFzfGFzY3xhc3NlcnRpb258IiArDQogICAgICAgICJhc3NpZ25tZW50fGFzeW1tZXRyaWN8YXR8YXR0cmlidXRlfGF1dGhvcml6YXRpb258YmFja3dhcmR8YmVmb3JlfGJlZ2lufGJldHdlZW58YmlnaW50fCIgKw0KICAgICAgICAiYmluYXJ5fGJpdHxib29sfGJvb2xlYW58Ym90aHxib3h8YnBjaGFyfGJ5fGJ5dGVhfGNhY2hlfGNhbGxlZHxjYXNjYWRlfGNhc2NhZGVkfGNhc2V8Y2FzdHwiICsNCiAgICAgICAgImNhdGFsb2d8Y2hhaW58Y2hhcnxjaGFyYWN0ZXJ8Y2hhcmFjdGVyaXN0aWNzfGNoZWNrfGNoZWNrcG9pbnR8Y2lkfGNpZHJ8Y2lyY2xlfGNsYXNzfGNsb3NlfCIgKw0KICAgICAgICAiY2x1c3Rlcnxjb2FsZXNjZXxjb2xsYXRlfGNvbGxhdGlvbnxjb2x1bW58Y29tbWVudHxjb21tZW50c3xjb21taXR8Y29tbWl0dGVkfGNvbmN1cnJlbnRseXwiICsNCiAgICAgICAgImNvbmZpZ3VyYXRpb258Y29ubmVjdGlvbnxjb25zdHJhaW50fGNvbnN0cmFpbnRzfGNvbnRlbnR8Y29udGludWV8Y29udmVyc2lvbnxjb3B5fGNvc3R8IiArDQogICAgICAgICJjcmVhdGV8Y3Jvc3N8Y3N0cmluZ3xjc3Z8Y3VycmVudHxjdXJyZW50X2NhdGFsb2d8Y3VycmVudF9kYXRlfGN1cnJlbnRfcm9sZXwiICsNCiAgICAgICAgImN1cnJlbnRfc2NoZW1hfGN1cnJlbnRfdGltZXxjdXJyZW50X3RpbWVzdGFtcHxjdXJyZW50X3VzZXJ8Y3Vyc29yfGN5Y2xlfGRhdGF8ZGF0YWJhc2V8IiArDQogICAgICAgICJkYXRlfGRheXxkZWFsbG9jYXRlfGRlY3xkZWNpbWFsfGRlY2xhcmV8ZGVmYXVsdHxkZWZhdWx0c3xkZWZlcnJhYmxlfGRlZmVycmVkfGRlZmluZXJ8ZGVsZXRlfCIgKw0KICAgICAgICAiZGVsaW1pdGVyfGRlbGltaXRlcnN8ZGVzY3xkaWN0aW9uYXJ5fGRpc2FibGV8ZGlzY2FyZHxkaXN0aW5jdHxkb3xkb2N1bWVudHxkb21haW58ZG91YmxlfCIgKw0KICAgICAgICAiZHJvcHxlYWNofGVsc2V8ZW5hYmxlfGVuY29kaW5nfGVuY3J5cHRlZHxlbmR8ZW51bXxlc2NhcGV8ZXhjZXB0fGV4Y2x1ZGV8ZXhjbHVkaW5nfGV4Y2x1c2l2ZXwiICsNCiAgICAgICAgImV4ZWN1dGV8ZXhpc3RzfGV4cGxhaW58ZXh0ZW5zaW9ufGV4dGVybmFsfGV4dHJhY3R8ZmFsc2V8ZmFtaWx5fGZkd19oYW5kbGVyfGZldGNofGZpcnN0fCIgKw0KICAgICAgICAiZmxvYXR8ZmxvYXQ0fGZsb2F0OHxmb2xsb3dpbmd8Zm9yfGZvcmNlfGZvcmVpZ258Zm9yd2FyZHxmcmVlemV8ZnJvbXxmdWxsfGZ1bmN0aW9ufGZ1bmN0aW9uc3wiICsNCiAgICAgICAgImdsb2JhbHxncmFudHxncmFudGVkfGdyZWF0ZXN0fGdyb3VwfGd0c3ZlY3RvcnxoYW5kbGVyfGhhdmluZ3xoZWFkZXJ8aG9sZHxob3VyfGlkZW50aXR5fGlmfCIgKw0KICAgICAgICAiaWxpa2V8aW1tZWRpYXRlfGltbXV0YWJsZXxpbXBsaWNpdHxpbnxpbmNsdWRpbmd8aW5jcmVtZW50fGluZGV4fGluZGV4ZXN8aW5ldHxpbmhlcml0fCIgKw0KICAgICAgICAiaW5oZXJpdHN8aW5pdGlhbGx5fGlubGluZXxpbm5lcnxpbm91dHxpbnB1dHxpbnNlbnNpdGl2ZXxpbnNlcnR8aW5zdGVhZHxpbnR8aW50MnxpbnQydmVjdG9yfCIgKw0KICAgICAgICAiaW50NHxpbnQ4fGludGVnZXJ8aW50ZXJuYWx8aW50ZXJzZWN0fGludGVydmFsfGludG98aW52b2tlcnxpc3xpc251bGx8aXNvbGF0aW9ufGpvaW58a2V5fGxhYmVsfCIgKw0KICAgICAgICAibGFuZ3VhZ2V8bGFuZ3VhZ2VfaGFuZGxlcnxsYXJnZXxsYXN0fGxjX2NvbGxhdGV8bGNfY3R5cGV8bGVhZGluZ3xsZWFzdHxsZWZ0fGxldmVsfGxpa2V8IiArDQogICAgICAgICJsaW1pdHxsaW5lfGxpc3Rlbnxsb2FkfGxvY2FsfGxvY2FsdGltZXxsb2NhbHRpbWVzdGFtcHxsb2NhdGlvbnxsb2NrfGxzZWd8bWFjYWRkcnxtYXBwaW5nfCIgKw0KICAgICAgICAibWF0Y2h8bWF4dmFsdWV8bWludXRlfG1pbnZhbHVlfG1vZGV8bW9uZXl8bW9udGh8bW92ZXxuYW1lfG5hbWVzfG5hdGlvbmFsfG5hdHVyYWx8bmNoYXJ8bmV4dHxub3wiICsNCiAgICAgICAgIm5vbmV8bm90fG5vdGhpbmd8bm90aWZ5fG5vdG51bGx8bm93YWl0fG51bGx8bnVsbGlmfG51bGxzfG51bWVyaWN8b2JqZWN0fG9mfG9mZnxvZmZzZXR8b2lkfG9pZHN8IiArDQogICAgICAgICJvaWR2ZWN0b3J8b258b25seXxvcGFxdWV8b3BlcmF0b3J8b3B0aW9ufG9wdGlvbnN8b3J8b3JkZXJ8b3V0fG91dGVyfG92ZXJ8b3ZlcmxhcHN8b3ZlcmxheXwiICsNCiAgICAgICAgIm93bmVkfG93bmVyfHBhcnNlcnxwYXJ0aWFsfHBhcnRpdGlvbnxwYXNzaW5nfHBhc3N3b3JkfHBhdGh8cGdfYXR0cmlidXRlfHBnX2F1dGhfbWVtYmVyc3wiICsNCiAgICAgICAgInBnX2F1dGhpZHxwZ19jbGFzc3xwZ19kYXRhYmFzZXxwZ19ub2RlX3RyZWV8cGdfcHJvY3xwZ190eXBlfHBsYWNpbmd8cGxhbnN8cG9pbnR8cG9seWdvbnwiICsNCiAgICAgICAgInBvc2l0aW9ufHByZWNlZGluZ3xwcmVjaXNpb258cHJlcGFyZXxwcmVwYXJlZHxwcmVzZXJ2ZXxwcmltYXJ5fHByaW9yfHByaXZpbGVnZXN8IiArDQogICAgICAgICJwcm9jZWR1cmFsfHByb2NlZHVyZXxxdW90ZXxyYW5nZXxyZWFkfHJlYWx8cmVhc3NpZ258cmVjaGVja3xyZWNvcmR8cmVjdXJzaXZlfHJlZnxyZWZjdXJzb3J8IiArDQogICAgICAgICJyZWZlcmVuY2VzfHJlZ2NsYXNzfHJlZ2NvbmZpZ3xyZWdkaWN0aW9uYXJ5fHJlZ29wZXJ8cmVnb3BlcmF0b3J8cmVncHJvY3xyZWdwcm9jZWR1cmV8IiArDQogICAgICAgICJyZWd0eXBlfHJlaW5kZXh8cmVsYXRpdmV8cmVsZWFzZXxyZWx0aW1lfHJlbmFtZXxyZXBlYXRhYmxlfHJlcGxhY2V8cmVwbGljYXxyZXNldHxyZXN0YXJ0fCIgKw0KICAgICAgICAicmVzdHJpY3R8cmV0dXJuaW5nfHJldHVybnN8cmV2b2tlfHJpZ2h0fHJvbGV8cm9sbGJhY2t8cm93fHJvd3N8cnVsZXxzYXZlcG9pbnR8c2NoZW1hfHNjcm9sbHwiICsNCiAgICAgICAgInNlYXJjaHxzZWNvbmR8c2VjdXJpdHl8c2VsZWN0fHNlcXVlbmNlfHNlcXVlbmNlc3xzZXJpYWxpemFibGV8c2VydmVyfHNlc3Npb258c2Vzc2lvbl91c2VyfCIgKw0KICAgICAgICAic2V0fHNldG9mfHNoYXJlfHNob3d8c2ltaWxhcnxzaW1wbGV8c21hbGxpbnR8c21ncnxzb21lfHN0YWJsZXxzdGFuZGFsb25lfHN0YXJ0fHN0YXRlbWVudHwiICsNCiAgICAgICAgInN0YXRpc3RpY3N8c3RkaW58c3Rkb3V0fHN0b3JhZ2V8c3RyaWN0fHN0cmlwfHN1YnN0cmluZ3xzeW1tZXRyaWN8c3lzaWR8c3lzdGVtfHRhYmxlfHRhYmxlc3wiICsNCiAgICAgICAgInRhYmxlc3BhY2V8dGVtcHx0ZW1wbGF0ZXx0ZW1wb3Jhcnl8dGV4dHx0aGVufHRpZHx0aW1lfHRpbWVzdGFtcHx0aW1lc3RhbXB0enx0aW1ldHp8IiArDQogICAgICAgICJ0aW50ZXJ2YWx8dG98dHJhaWxpbmd8dHJhbnNhY3Rpb258dHJlYXR8dHJpZ2dlcnx0cmltfHRydWV8dHJ1bmNhdGV8dHJ1c3RlZHx0c3F1ZXJ5fHRzdmVjdG9yfCIgKw0KICAgICAgICAidHhpZF9zbmFwc2hvdHx0eXBlfHVuYm91bmRlZHx1bmNvbW1pdHRlZHx1bmVuY3J5cHRlZHx1bmlvbnx1bmlxdWV8dW5rbm93bnx1bmxpc3RlbnwiICsNCiAgICAgICAgInVubG9nZ2VkfHVudGlsfHVwZGF0ZXx1c2VyfHVzaW5nfHV1aWR8dmFjdXVtfHZhbGlkfHZhbGlkYXRlfHZhbGlkYXRvcnx2YWx1ZXx2YWx1ZXN8dmFyYml0fCIgKw0KICAgICAgICAidmFyY2hhcnx2YXJpYWRpY3x2YXJ5aW5nfHZlcmJvc2V8dmVyc2lvbnx2aWV3fHZvaWR8dm9sYXRpbGV8d2hlbnx3aGVyZXx3aGl0ZXNwYWNlfHdpbmRvd3wiICsNCiAgICAgICAgIndpdGh8d2l0aG91dHx3b3JrfHdyYXBwZXJ8d3JpdGV8eGlkfHhtbHx4bWxhdHRyaWJ1dGVzfHhtbGNvbmNhdHx4bWxlbGVtZW50fHhtbGV4aXN0c3wiICsNCiAgICAgICAgInhtbGZvcmVzdHx4bWxwYXJzZXx4bWxwaXx4bWxyb290fHhtbHNlcmlhbGl6ZXx5ZWFyfHllc3x6b25lIikuc3BsaXQoInwiKQ0KICAgICk7DQogICAgDQogICAgDQogICAgdmFyIGJ1aWx0aW5GdW5jdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiUklfRktleV9jYXNjYWRlX2RlbHxSSV9GS2V5X2Nhc2NhZGVfdXBkfFJJX0ZLZXlfY2hlY2tfaW5zfFJJX0ZLZXlfY2hlY2tfdXBkfCIgKw0KICAgICAgICAiUklfRktleV9ub2FjdGlvbl9kZWx8UklfRktleV9ub2FjdGlvbl91cGR8UklfRktleV9yZXN0cmljdF9kZWx8UklfRktleV9yZXN0cmljdF91cGR8IiArDQogICAgICAgICJSSV9GS2V5X3NldGRlZmF1bHRfZGVsfFJJX0ZLZXlfc2V0ZGVmYXVsdF91cGR8UklfRktleV9zZXRudWxsX2RlbHwiICsNCiAgICAgICAgIlJJX0ZLZXlfc2V0bnVsbF91cGR8YWJicmV2fGFic3xhYnN0aW1lfGFic3RpbWVlcXxhYnN0aW1lZ2V8YWJzdGltZWd0fGFic3RpbWVpbnxhYnN0aW1lbGV8IiArDQogICAgICAgICJhYnN0aW1lbHR8YWJzdGltZW5lfGFic3RpbWVvdXR8YWJzdGltZXJlY3Z8YWJzdGltZXNlbmR8YWNsY29udGFpbnN8YWNsZXhwbG9kZXxhY2xpbnNlcnR8IiArDQogICAgICAgICJhY2xpdGVtZXF8YWNsaXRlbWlufGFjbGl0ZW1vdXR8YWNscmVtb3ZlfGFjb3N8YWdlfGFueV9pbnxhbnlfb3V0fGFueWFycmF5X2lufGFueWFycmF5X291dHwiICsNCiAgICAgICAgImFueWFycmF5X3JlY3Z8YW55YXJyYXlfc2VuZHxhbnllbGVtZW50X2lufGFueWVsZW1lbnRfb3V0fGFueWVudW1faW58YW55ZW51bV9vdXR8IiArDQogICAgICAgICJhbnlub25hcnJheV9pbnxhbnlub25hcnJheV9vdXR8YW55dGV4dGNhdHxhcmVhfGFyZWFqb2luc2VsfGFyZWFzZWx8YXJyYXlfYWdnfCIgKw0KICAgICAgICAiYXJyYXlfYWdnX2ZpbmFsZm58YXJyYXlfYWdnX3RyYW5zZm58YXJyYXlfYXBwZW5kfGFycmF5X2NhdHxhcnJheV9kaW1zfGFycmF5X2VxfCIgKw0KICAgICAgICAiYXJyYXlfZmlsbHxhcnJheV9nZXxhcnJheV9ndHxhcnJheV9pbnxhcnJheV9sYXJnZXJ8YXJyYXlfbGV8YXJyYXlfbGVuZ3RofGFycmF5X2xvd2VyfCIgKw0KICAgICAgICAiYXJyYXlfbHR8YXJyYXlfbmRpbXN8YXJyYXlfbmV8YXJyYXlfb3V0fGFycmF5X3ByZXBlbmR8YXJyYXlfcmVjdnxhcnJheV9zZW5kfCIgKw0KICAgICAgICAiYXJyYXlfc21hbGxlcnxhcnJheV90b19zdHJpbmd8YXJyYXlfdXBwZXJ8YXJyYXljb250YWluZWR8YXJyYXljb250YWluc3xhcnJheW92ZXJsYXB8IiArDQogICAgICAgICJhc2NpaXxhc2NpaV90b19taWN8YXNjaWlfdG9fdXRmOHxhc2lufGF0YW58YXRhbjJ8YXZnfGJpZzVfdG9fZXVjX3R3fGJpZzVfdG9fbWljfCIgKw0KICAgICAgICAiYmlnNV90b191dGY4fGJpdF9hbmR8Yml0X2lufGJpdF9sZW5ndGh8Yml0X29yfGJpdF9vdXR8Yml0X3JlY3Z8Yml0X3NlbmR8Yml0YW5kfGJpdGNhdHwiICsNCiAgICAgICAgImJpdGNtcHxiaXRlcXxiaXRnZXxiaXRndHxiaXRsZXxiaXRsdHxiaXRuZXxiaXRub3R8Yml0b3J8Yml0c2hpZnRsZWZ0fGJpdHNoaWZ0cmlnaHR8IiArDQogICAgICAgICJiaXR0eXBtb2RpbnxiaXR0eXBtb2RvdXR8Yml0eG9yfGJvb2x8Ym9vbF9hbmR8Ym9vbF9vcnxib29sYW5kX3N0YXRlZnVuY3xib29sZXF8Ym9vbGdlfCIgKw0KICAgICAgICAiYm9vbGd0fGJvb2xpbnxib29sbGV8Ym9vbGx0fGJvb2xuZXxib29sb3Jfc3RhdGVmdW5jfGJvb2xvdXR8Ym9vbHJlY3Z8Ym9vbHNlbmR8Ym94fCIgKw0KICAgICAgICAiYm94X2Fib3ZlfGJveF9hYm92ZV9lcXxib3hfYWRkfGJveF9iZWxvd3xib3hfYmVsb3dfZXF8Ym94X2NlbnRlcnxib3hfY29udGFpbnwiICsNCiAgICAgICAgImJveF9jb250YWluX3B0fGJveF9jb250YWluZWR8Ym94X2Rpc3RhbmNlfGJveF9kaXZ8Ym94X2VxfGJveF9nZXxib3hfZ3R8Ym94X2lufCIgKw0KICAgICAgICAiYm94X2ludGVyc2VjdHxib3hfbGV8Ym94X2xlZnR8Ym94X2x0fGJveF9tdWx8Ym94X291dHxib3hfb3ZlcmFib3ZlfGJveF9vdmVyYmVsb3d8IiArDQogICAgICAgICJib3hfb3ZlcmxhcHxib3hfb3ZlcmxlZnR8Ym94X292ZXJyaWdodHxib3hfcmVjdnxib3hfcmlnaHR8Ym94X3NhbWV8Ym94X3NlbmR8Ym94X3N1YnwiICsNCiAgICAgICAgImJwY2hhcl9sYXJnZXJ8YnBjaGFyX3BhdHRlcm5fZ2V8YnBjaGFyX3BhdHRlcm5fZ3R8YnBjaGFyX3BhdHRlcm5fbGV8IiArDQogICAgICAgICJicGNoYXJfcGF0dGVybl9sdHxicGNoYXJfc21hbGxlcnxicGNoYXJjbXB8YnBjaGFyZXF8YnBjaGFyZ2V8YnBjaGFyZ3R8YnBjaGFyaWNsaWtlfCIgKw0KICAgICAgICAiYnBjaGFyaWNubGlrZXxicGNoYXJpY3JlZ2V4ZXF8YnBjaGFyaWNyZWdleG5lfGJwY2hhcmlufGJwY2hhcmxlfGJwY2hhcmxpa2V8YnBjaGFybHR8IiArDQogICAgICAgICJicGNoYXJuZXxicGNoYXJubGlrZXxicGNoYXJvdXR8YnBjaGFycmVjdnxicGNoYXJyZWdleGVxfGJwY2hhcnJlZ2V4bmV8YnBjaGFyc2VuZHwiICsNCiAgICAgICAgImJwY2hhcnR5cG1vZGlufGJwY2hhcnR5cG1vZG91dHxicm9hZGNhc3R8YnRhYnN0aW1lY21wfGJ0YXJyYXljbXB8YnRiZWdpbnNjYW58YnRib29sY21wfCIgKw0KICAgICAgICAiYnRicGNoYXJfcGF0dGVybl9jbXB8YnRidWlsZHxidGJ1aWxkZW1wdHl8YnRidWxrZGVsZXRlfGJ0Y2hhcmNtcHxidGNvc3Rlc3RpbWF0ZXwiICsNCiAgICAgICAgImJ0ZW5kc2NhbnxidGZsb2F0NDhjbXB8YnRmbG9hdDRjbXB8YnRmbG9hdDg0Y21wfGJ0ZmxvYXQ4Y21wfGJ0Z2V0Yml0bWFwfGJ0Z2V0dHVwbGV8IiArDQogICAgICAgICJidGluc2VydHxidGludDI0Y21wfGJ0aW50MjhjbXB8YnRpbnQyY21wfGJ0aW50NDJjbXB8YnRpbnQ0OGNtcHxidGludDRjbXB8YnRpbnQ4MmNtcHwiICsNCiAgICAgICAgImJ0aW50ODRjbXB8YnRpbnQ4Y21wfGJ0bWFya3Bvc3xidG5hbWVjbXB8YnRvaWRjbXB8YnRvaWR2ZWN0b3JjbXB8YnRvcHRpb25zfGJ0cmVjb3JkY21wfCIgKw0KICAgICAgICAiYnRyZWx0aW1lY21wfGJ0cmVzY2FufGJ0cmVzdHJwb3N8YnRyaW18YnR0ZXh0X3BhdHRlcm5fY21wfGJ0dGV4dGNtcHxidHRpZGNtcHwiICsNCiAgICAgICAgImJ0dGludGVydmFsY21wfGJ0dmFjdXVtY2xlYW51cHxieXRlYWNhdHxieXRlYWNtcHxieXRlYWVxfGJ5dGVhZ2V8Ynl0ZWFndHxieXRlYWlufGJ5dGVhbGV8IiArDQogICAgICAgICJieXRlYWxpa2V8Ynl0ZWFsdHxieXRlYW5lfGJ5dGVhbmxpa2V8Ynl0ZWFvdXR8Ynl0ZWFyZWN2fGJ5dGVhc2VuZHxjYXNoX2NtcHxjYXNoX2Rpdl9jYXNofCIgKw0KICAgICAgICAiY2FzaF9kaXZfZmx0NHxjYXNoX2Rpdl9mbHQ4fGNhc2hfZGl2X2ludDJ8Y2FzaF9kaXZfaW50NHxjYXNoX2VxfGNhc2hfZ2V8Y2FzaF9ndHxjYXNoX2lufCIgKw0KICAgICAgICAiY2FzaF9sZXxjYXNoX2x0fGNhc2hfbWl8Y2FzaF9tdWxfZmx0NHxjYXNoX211bF9mbHQ4fGNhc2hfbXVsX2ludDJ8Y2FzaF9tdWxfaW50NHxjYXNoX25lfCIgKw0KICAgICAgICAiY2FzaF9vdXR8Y2FzaF9wbHxjYXNoX3JlY3Z8Y2FzaF9zZW5kfGNhc2hfd29yZHN8Y2FzaGxhcmdlcnxjYXNoc21hbGxlcnxjYnJ0fGNlaWx8Y2VpbGluZ3wiICsNCiAgICAgICAgImNlbnRlcnxjaGFyfGNoYXJfbGVuZ3RofGNoYXJhY3Rlcl9sZW5ndGh8Y2hhcmVxfGNoYXJnZXxjaGFyZ3R8Y2hhcmlufGNoYXJsZXxjaGFybHR8Y2hhcm5lfCIgKw0KICAgICAgICAiY2hhcm91dHxjaGFycmVjdnxjaGFyc2VuZHxjaHJ8Y2lkZXF8Y2lkaW58Y2lkb3V0fGNpZHJ8Y2lkcl9pbnxjaWRyX291dHxjaWRyX3JlY3Z8Y2lkcl9zZW5kfCIgKw0KICAgICAgICAiY2lkcmVjdnxjaWRzZW5kfGNpcmNsZXxjaXJjbGVfYWJvdmV8Y2lyY2xlX2FkZF9wdHxjaXJjbGVfYmVsb3d8Y2lyY2xlX2NlbnRlcnwiICsNCiAgICAgICAgImNpcmNsZV9jb250YWlufGNpcmNsZV9jb250YWluX3B0fGNpcmNsZV9jb250YWluZWR8Y2lyY2xlX2Rpc3RhbmNlfGNpcmNsZV9kaXZfcHR8IiArDQogICAgICAgICJjaXJjbGVfZXF8Y2lyY2xlX2dlfGNpcmNsZV9ndHxjaXJjbGVfaW58Y2lyY2xlX2xlfGNpcmNsZV9sZWZ0fGNpcmNsZV9sdHxjaXJjbGVfbXVsX3B0fCIgKw0KICAgICAgICAiY2lyY2xlX25lfGNpcmNsZV9vdXR8Y2lyY2xlX292ZXJhYm92ZXxjaXJjbGVfb3ZlcmJlbG93fGNpcmNsZV9vdmVybGFwfGNpcmNsZV9vdmVybGVmdHwiICsNCiAgICAgICAgImNpcmNsZV9vdmVycmlnaHR8Y2lyY2xlX3JlY3Z8Y2lyY2xlX3JpZ2h0fGNpcmNsZV9zYW1lfGNpcmNsZV9zZW5kfGNpcmNsZV9zdWJfcHR8IiArDQogICAgICAgICJjbG9ja190aW1lc3RhbXB8Y2xvc2VfbGJ8Y2xvc2VfbHN8Y2xvc2VfbHNlZ3xjbG9zZV9wYnxjbG9zZV9wbHxjbG9zZV9wc3xjbG9zZV9zYnwiICsNCiAgICAgICAgImNsb3NlX3NsfGNvbF9kZXNjcmlwdGlvbnxjb25jYXR8Y29uY2F0X3dzfGNvbnRqb2luc2VsfGNvbnRzZWx8Y29udmVydHxjb252ZXJ0X2Zyb218IiArDQogICAgICAgICJjb252ZXJ0X3RvfGNvcnJ8Y29zfGNvdHxjb3VudHxjb3Zhcl9wb3B8Y292YXJfc2FtcHxjc3RyaW5nX2lufGNzdHJpbmdfb3V0fGNzdHJpbmdfcmVjdnwiICsNCiAgICAgICAgImNzdHJpbmdfc2VuZHxjdW1lX2Rpc3R8Y3VycmVudF9kYXRhYmFzZXxjdXJyZW50X3F1ZXJ5fGN1cnJlbnRfc2NoZW1hfGN1cnJlbnRfc2NoZW1hc3wiICsNCiAgICAgICAgImN1cnJlbnRfc2V0dGluZ3xjdXJyZW50X3VzZXJ8Y3VycnRpZHxjdXJydGlkMnxjdXJydmFsfGN1cnNvcl90b194bWx8IiArDQogICAgICAgICJjdXJzb3JfdG9feG1sc2NoZW1hfGRhdGFiYXNlX3RvX3htbHxkYXRhYmFzZV90b194bWxfYW5kX3htbHNjaGVtYXwiICsNCiAgICAgICAgImRhdGFiYXNlX3RvX3htbHNjaGVtYXxkYXRlfGRhdGVfY21wfGRhdGVfY21wX3RpbWVzdGFtcHxkYXRlX2NtcF90aW1lc3RhbXB0enxkYXRlX2VxfCIgKw0KICAgICAgICAiZGF0ZV9lcV90aW1lc3RhbXB8ZGF0ZV9lcV90aW1lc3RhbXB0enxkYXRlX2dlfGRhdGVfZ2VfdGltZXN0YW1wfGRhdGVfZ2VfdGltZXN0YW1wdHp8IiArDQogICAgICAgICJkYXRlX2d0fGRhdGVfZ3RfdGltZXN0YW1wfGRhdGVfZ3RfdGltZXN0YW1wdHp8ZGF0ZV9pbnxkYXRlX2xhcmdlcnxkYXRlX2xlfCIgKw0KICAgICAgICAiZGF0ZV9sZV90aW1lc3RhbXB8ZGF0ZV9sZV90aW1lc3RhbXB0enxkYXRlX2x0fGRhdGVfbHRfdGltZXN0YW1wfGRhdGVfbHRfdGltZXN0YW1wdHp8IiArDQogICAgICAgICJkYXRlX21pfGRhdGVfbWlfaW50ZXJ2YWx8ZGF0ZV9taWl8ZGF0ZV9uZXxkYXRlX25lX3RpbWVzdGFtcHxkYXRlX25lX3RpbWVzdGFtcHR6fCIgKw0KICAgICAgICAiZGF0ZV9vdXR8ZGF0ZV9wYXJ0fGRhdGVfcGxfaW50ZXJ2YWx8ZGF0ZV9wbGl8ZGF0ZV9yZWN2fGRhdGVfc2VuZHxkYXRlX3NtYWxsZXJ8IiArDQogICAgICAgICJkYXRlX3RydW5jfGRhdGV0aW1lX3BsfGRhdGV0aW1ldHpfcGx8ZGNicnR8ZGVjb2RlfGRlZ3JlZXN8ZGVuc2VfcmFua3xkZXhwfGRpYWdvbmFsfCIgKw0KICAgICAgICAiZGlhbWV0ZXJ8ZGlzcGVsbF9pbml0fGRpc3BlbGxfbGV4aXplfGRpc3RfY3BvbHl8ZGlzdF9sYnxkaXN0X3BifGRpc3RfcGN8ZGlzdF9wbHwiICsNCiAgICAgICAgImRpc3RfcHBhdGh8ZGlzdF9wc3xkaXN0X3NifGRpc3Rfc2x8ZGl2fGRsb2cxfGRsb2cxMHxkb21haW5faW58ZG9tYWluX3JlY3Z8ZHBvd3xkcm91bmR8IiArDQogICAgICAgICJkc2ltcGxlX2luaXR8ZHNpbXBsZV9sZXhpemV8ZHNub3diYWxsX2luaXR8ZHNub3diYWxsX2xleGl6ZXxkc3FydHxkc3lub255bV9pbml0fCIgKw0KICAgICAgICAiZHN5bm9ueW1fbGV4aXplfGR0cnVuY3xlbmNvZGV8ZW51bV9jbXB8ZW51bV9lcXxlbnVtX2ZpcnN0fGVudW1fZ2V8ZW51bV9ndHxlbnVtX2lufCIgKw0KICAgICAgICAiZW51bV9sYXJnZXJ8ZW51bV9sYXN0fGVudW1fbGV8ZW51bV9sdHxlbnVtX25lfGVudW1fb3V0fGVudW1fcmFuZ2V8ZW51bV9yZWN2fGVudW1fc2VuZHwiICsNCiAgICAgICAgImVudW1fc21hbGxlcnxlcWpvaW5zZWx8ZXFzZWx8ZXVjX2NuX3RvX21pY3xldWNfY25fdG9fdXRmOHwiICsNCiAgICAgICAgImV1Y19qaXNfMjAwNF90b19zaGlmdF9qaXNfMjAwNHxldWNfamlzXzIwMDRfdG9fdXRmOHxldWNfanBfdG9fbWljfGV1Y19qcF90b19zamlzfCIgKw0KICAgICAgICAiZXVjX2pwX3RvX3V0Zjh8ZXVjX2tyX3RvX21pY3xldWNfa3JfdG9fdXRmOHxldWNfdHdfdG9fYmlnNXxldWNfdHdfdG9fbWljfCIgKw0KICAgICAgICAiZXVjX3R3X3RvX3V0Zjh8ZXZlcnl8ZXhwfGZhY3RvcmlhbHxmYW1pbHl8ZmR3X2hhbmRsZXJfaW58ZmR3X2hhbmRsZXJfb3V0fGZpcnN0X3ZhbHVlfCIgKw0KICAgICAgICAiZmxvYXQ0fGZsb2F0NDhkaXZ8ZmxvYXQ0OGVxfGZsb2F0NDhnZXxmbG9hdDQ4Z3R8ZmxvYXQ0OGxlfGZsb2F0NDhsdHxmbG9hdDQ4bWl8ZmxvYXQ0OG11bHwiICsNCiAgICAgICAgImZsb2F0NDhuZXxmbG9hdDQ4cGx8ZmxvYXQ0X2FjY3VtfGZsb2F0NGFic3xmbG9hdDRkaXZ8ZmxvYXQ0ZXF8ZmxvYXQ0Z2V8ZmxvYXQ0Z3R8ZmxvYXQ0aW58IiArDQogICAgICAgICJmbG9hdDRsYXJnZXJ8ZmxvYXQ0bGV8ZmxvYXQ0bHR8ZmxvYXQ0bWl8ZmxvYXQ0bXVsfGZsb2F0NG5lfGZsb2F0NG91dHxmbG9hdDRwbHxmbG9hdDRyZWN2fCIgKw0KICAgICAgICAiZmxvYXQ0c2VuZHxmbG9hdDRzbWFsbGVyfGZsb2F0NHVtfGZsb2F0NHVwfGZsb2F0OHxmbG9hdDg0ZGl2fGZsb2F0ODRlcXxmbG9hdDg0Z2V8IiArDQogICAgICAgICJmbG9hdDg0Z3R8ZmxvYXQ4NGxlfGZsb2F0ODRsdHxmbG9hdDg0bWl8ZmxvYXQ4NG11bHxmbG9hdDg0bmV8ZmxvYXQ4NHBsfGZsb2F0OF9hY2N1bXwiICsNCiAgICAgICAgImZsb2F0OF9hdmd8ZmxvYXQ4X2NvcnJ8ZmxvYXQ4X2NvdmFyX3BvcHxmbG9hdDhfY292YXJfc2FtcHxmbG9hdDhfcmVncl9hY2N1bXwiICsNCiAgICAgICAgImZsb2F0OF9yZWdyX2F2Z3h8ZmxvYXQ4X3JlZ3JfYXZneXxmbG9hdDhfcmVncl9pbnRlcmNlcHR8ZmxvYXQ4X3JlZ3JfcjJ8IiArDQogICAgICAgICJmbG9hdDhfcmVncl9zbG9wZXxmbG9hdDhfcmVncl9zeHh8ZmxvYXQ4X3JlZ3Jfc3h5fGZsb2F0OF9yZWdyX3N5eXxmbG9hdDhfc3RkZGV2X3BvcHwiICsNCiAgICAgICAgImZsb2F0OF9zdGRkZXZfc2FtcHxmbG9hdDhfdmFyX3BvcHxmbG9hdDhfdmFyX3NhbXB8ZmxvYXQ4YWJzfGZsb2F0OGRpdnxmbG9hdDhlcXwiICsNCiAgICAgICAgImZsb2F0OGdlfGZsb2F0OGd0fGZsb2F0OGlufGZsb2F0OGxhcmdlcnxmbG9hdDhsZXxmbG9hdDhsdHxmbG9hdDhtaXxmbG9hdDhtdWx8ZmxvYXQ4bmV8IiArDQogICAgICAgICJmbG9hdDhvdXR8ZmxvYXQ4cGx8ZmxvYXQ4cmVjdnxmbG9hdDhzZW5kfGZsb2F0OHNtYWxsZXJ8ZmxvYXQ4dW18ZmxvYXQ4dXB8Zmxvb3J8IiArDQogICAgICAgICJmbHQ0X211bF9jYXNofGZsdDhfbXVsX2Nhc2h8Zm1ncl9jX3ZhbGlkYXRvcnxmbWdyX2ludGVybmFsX3ZhbGlkYXRvcnwiICsNCiAgICAgICAgImZtZ3Jfc3FsX3ZhbGlkYXRvcnxmb3JtYXR8Zm9ybWF0X3R5cGV8Z2IxODAzMF90b191dGY4fGdia190b191dGY4fGdlbmVyYXRlX3Nlcmllc3wiICsNCiAgICAgICAgImdlbmVyYXRlX3N1YnNjcmlwdHN8Z2V0X2JpdHxnZXRfYnl0ZXxnZXRfY3VycmVudF90c19jb25maWd8Z2V0ZGF0YWJhc2VlbmNvZGluZ3wiICsNCiAgICAgICAgImdldHBndXNlcm5hbWV8Z2luX2NtcF9wcmVmaXh8Z2luX2NtcF90c2xleGVtZXxnaW5fZXh0cmFjdF90c3F1ZXJ5fCIgKw0KICAgICAgICAiZ2luX2V4dHJhY3RfdHN2ZWN0b3J8Z2luX3RzcXVlcnlfY29uc2lzdGVudHxnaW5hcnJheWNvbnNpc3RlbnR8Z2luYXJyYXlleHRyYWN0fCIgKw0KICAgICAgICAiZ2luYmVnaW5zY2FufGdpbmJ1aWxkfGdpbmJ1aWxkZW1wdHl8Z2luYnVsa2RlbGV0ZXxnaW5jb3N0ZXN0aW1hdGV8Z2luZW5kc2NhbnwiICsNCiAgICAgICAgImdpbmdldGJpdG1hcHxnaW5pbnNlcnR8Z2lubWFya3Bvc3xnaW5vcHRpb25zfGdpbnF1ZXJ5YXJyYXlleHRyYWN0fGdpbnJlc2NhbnwiICsNCiAgICAgICAgImdpbnJlc3RycG9zfGdpbnZhY3V1bWNsZWFudXB8Z2lzdF9ib3hfY29tcHJlc3N8Z2lzdF9ib3hfY29uc2lzdGVudHwiICsNCiAgICAgICAgImdpc3RfYm94X2RlY29tcHJlc3N8Z2lzdF9ib3hfcGVuYWx0eXxnaXN0X2JveF9waWNrc3BsaXR8Z2lzdF9ib3hfc2FtZXxnaXN0X2JveF91bmlvbnwiICsNCiAgICAgICAgImdpc3RfY2lyY2xlX2NvbXByZXNzfGdpc3RfY2lyY2xlX2NvbnNpc3RlbnR8Z2lzdF9wb2ludF9jb21wcmVzc3wiICsNCiAgICAgICAgImdpc3RfcG9pbnRfY29uc2lzdGVudHxnaXN0X3BvaW50X2Rpc3RhbmNlfGdpc3RfcG9seV9jb21wcmVzc3xnaXN0X3BvbHlfY29uc2lzdGVudHwiICsNCiAgICAgICAgImdpc3RiZWdpbnNjYW58Z2lzdGJ1aWxkfGdpc3RidWlsZGVtcHR5fGdpc3RidWxrZGVsZXRlfGdpc3Rjb3N0ZXN0aW1hdGV8Z2lzdGVuZHNjYW58IiArDQogICAgICAgICJnaXN0Z2V0Yml0bWFwfGdpc3RnZXR0dXBsZXxnaXN0aW5zZXJ0fGdpc3RtYXJrcG9zfGdpc3RvcHRpb25zfGdpc3RyZXNjYW58Z2lzdHJlc3RycG9zfCIgKw0KICAgICAgICAiZ2lzdHZhY3V1bWNsZWFudXB8Z3RzcXVlcnlfY29tcHJlc3N8Z3RzcXVlcnlfY29uc2lzdGVudHxndHNxdWVyeV9kZWNvbXByZXNzfCIgKw0KICAgICAgICAiZ3RzcXVlcnlfcGVuYWx0eXxndHNxdWVyeV9waWNrc3BsaXR8Z3RzcXVlcnlfc2FtZXxndHNxdWVyeV91bmlvbnxndHN2ZWN0b3JfY29tcHJlc3N8IiArDQogICAgICAgICJndHN2ZWN0b3JfY29uc2lzdGVudHxndHN2ZWN0b3JfZGVjb21wcmVzc3xndHN2ZWN0b3JfcGVuYWx0eXxndHN2ZWN0b3JfcGlja3NwbGl0fCIgKw0KICAgICAgICAiZ3RzdmVjdG9yX3NhbWV8Z3RzdmVjdG9yX3VuaW9ufGd0c3ZlY3RvcmlufGd0c3ZlY3Rvcm91dHxoYXNfYW55X2NvbHVtbl9wcml2aWxlZ2V8IiArDQogICAgICAgICJoYXNfY29sdW1uX3ByaXZpbGVnZXxoYXNfZGF0YWJhc2VfcHJpdmlsZWdlfGhhc19mb3JlaWduX2RhdGFfd3JhcHBlcl9wcml2aWxlZ2V8IiArDQogICAgICAgICJoYXNfZnVuY3Rpb25fcHJpdmlsZWdlfGhhc19sYW5ndWFnZV9wcml2aWxlZ2V8aGFzX3NjaGVtYV9wcml2aWxlZ2V8IiArDQogICAgICAgICJoYXNfc2VxdWVuY2VfcHJpdmlsZWdlfGhhc19zZXJ2ZXJfcHJpdmlsZWdlfGhhc190YWJsZV9wcml2aWxlZ2V8IiArDQogICAgICAgICJoYXNfdGFibGVzcGFjZV9wcml2aWxlZ2V8aGFzaF9hY2xpdGVtfGhhc2hfYXJyYXl8aGFzaF9udW1lcmljfGhhc2hiZWdpbnNjYW58IiArDQogICAgICAgICJoYXNoYnBjaGFyfGhhc2hidWlsZHxoYXNoYnVpbGRlbXB0eXxoYXNoYnVsa2RlbGV0ZXxoYXNoY2hhcnxoYXNoY29zdGVzdGltYXRlfCIgKw0KICAgICAgICAiaGFzaGVuZHNjYW58aGFzaGVudW18aGFzaGZsb2F0NHxoYXNoZmxvYXQ4fGhhc2hnZXRiaXRtYXB8aGFzaGdldHR1cGxlfGhhc2hpbmV0fCIgKw0KICAgICAgICAiaGFzaGluc2VydHxoYXNoaW50MnxoYXNoaW50MnZlY3RvcnxoYXNoaW50NHxoYXNoaW50OHxoYXNobWFjYWRkcnxoYXNobWFya3Bvc3xoYXNobmFtZXwiICsNCiAgICAgICAgImhhc2hvaWR8aGFzaG9pZHZlY3RvcnxoYXNob3B0aW9uc3xoYXNocmVzY2FufGhhc2hyZXN0cnBvc3xoYXNodGV4dHxoYXNodmFjdXVtY2xlYW51cHwiICsNCiAgICAgICAgImhhc2h2YXJsZW5hfGhlaWdodHxob3N0fGhvc3RtYXNrfGljbGlrZWpvaW5zZWx8aWNsaWtlc2VsfGljbmxpa2Vqb2luc2VsfGljbmxpa2VzZWx8IiArDQogICAgICAgICJpY3JlZ2V4ZXFqb2luc2VsfGljcmVnZXhlcXNlbHxpY3JlZ2V4bmVqb2luc2VsfGljcmVnZXhuZXNlbHxpbmV0X2NsaWVudF9hZGRyfCIgKw0KICAgICAgICAiaW5ldF9jbGllbnRfcG9ydHxpbmV0X2lufGluZXRfb3V0fGluZXRfcmVjdnxpbmV0X3NlbmR8aW5ldF9zZXJ2ZXJfYWRkcnwiICsNCiAgICAgICAgImluZXRfc2VydmVyX3BvcnR8aW5ldGFuZHxpbmV0bWl8aW5ldG1pX2ludDh8aW5ldG5vdHxpbmV0b3J8aW5ldHBsfGluaXRjYXB8aW50MnxpbnQyNGRpdnwiICsNCiAgICAgICAgImludDI0ZXF8aW50MjRnZXxpbnQyNGd0fGludDI0bGV8aW50MjRsdHxpbnQyNG1pfGludDI0bXVsfGludDI0bmV8aW50MjRwbHxpbnQyOGRpdnxpbnQyOGVxfCIgKw0KICAgICAgICAiaW50MjhnZXxpbnQyOGd0fGludDI4bGV8aW50MjhsdHxpbnQyOG1pfGludDI4bXVsfGludDI4bmV8aW50MjhwbHxpbnQyX2FjY3VtfCIgKw0KICAgICAgICAiaW50Ml9hdmdfYWNjdW18aW50Ml9tdWxfY2FzaHxpbnQyX3N1bXxpbnQyYWJzfGludDJhbmR8aW50MmRpdnxpbnQyZXF8aW50MmdlfGludDJndHxpbnQyaW58IiArDQogICAgICAgICJpbnQybGFyZ2VyfGludDJsZXxpbnQybHR8aW50Mm1pfGludDJtb2R8aW50Mm11bHxpbnQybmV8aW50Mm5vdHxpbnQyb3J8aW50Mm91dHxpbnQycGx8IiArDQogICAgICAgICJpbnQycmVjdnxpbnQyc2VuZHxpbnQyc2hsfGludDJzaHJ8aW50MnNtYWxsZXJ8aW50MnVtfGludDJ1cHxpbnQydmVjdG9yZXF8aW50MnZlY3RvcmlufCIgKw0KICAgICAgICAiaW50MnZlY3Rvcm91dHxpbnQydmVjdG9ycmVjdnxpbnQydmVjdG9yc2VuZHxpbnQyeG9yfGludDR8aW50NDJkaXZ8aW50NDJlcXxpbnQ0MmdlfCIgKw0KICAgICAgICAiaW50NDJndHxpbnQ0MmxlfGludDQybHR8aW50NDJtaXxpbnQ0Mm11bHxpbnQ0Mm5lfGludDQycGx8aW50NDhkaXZ8aW50NDhlcXxpbnQ0OGdlfGludDQ4Z3R8IiArDQogICAgICAgICJpbnQ0OGxlfGludDQ4bHR8aW50NDhtaXxpbnQ0OG11bHxpbnQ0OG5lfGludDQ4cGx8aW50NF9hY2N1bXxpbnQ0X2F2Z19hY2N1bXxpbnQ0X211bF9jYXNofCIgKw0KICAgICAgICAiaW50NF9zdW18aW50NGFic3xpbnQ0YW5kfGludDRkaXZ8aW50NGVxfGludDRnZXxpbnQ0Z3R8aW50NGlufGludDRpbmN8aW50NGxhcmdlcnxpbnQ0bGV8IiArDQogICAgICAgICJpbnQ0bHR8aW50NG1pfGludDRtb2R8aW50NG11bHxpbnQ0bmV8aW50NG5vdHxpbnQ0b3J8aW50NG91dHxpbnQ0cGx8aW50NHJlY3Z8aW50NHNlbmR8IiArDQogICAgICAgICJpbnQ0c2hsfGludDRzaHJ8aW50NHNtYWxsZXJ8aW50NHVtfGludDR1cHxpbnQ0eG9yfGludDh8aW50ODJkaXZ8aW50ODJlcXxpbnQ4MmdlfGludDgyZ3R8IiArDQogICAgICAgICJpbnQ4MmxlfGludDgybHR8aW50ODJtaXxpbnQ4Mm11bHxpbnQ4Mm5lfGludDgycGx8aW50ODRkaXZ8aW50ODRlcXxpbnQ4NGdlfGludDg0Z3R8aW50ODRsZXwiICsNCiAgICAgICAgImludDg0bHR8aW50ODRtaXxpbnQ4NG11bHxpbnQ4NG5lfGludDg0cGx8aW50OF9hY2N1bXxpbnQ4X2F2Z3xpbnQ4X2F2Z19hY2N1bXxpbnQ4X3N1bXwiICsNCiAgICAgICAgImludDhhYnN8aW50OGFuZHxpbnQ4ZGl2fGludDhlcXxpbnQ4Z2V8aW50OGd0fGludDhpbnxpbnQ4aW5jfGludDhpbmNfYW55fCIgKw0KICAgICAgICAiaW50OGluY19mbG9hdDhfZmxvYXQ4fGludDhsYXJnZXJ8aW50OGxlfGludDhsdHxpbnQ4bWl8aW50OG1vZHxpbnQ4bXVsfGludDhuZXxpbnQ4bm90fCIgKw0KICAgICAgICAiaW50OG9yfGludDhvdXR8aW50OHBsfGludDhwbF9pbmV0fGludDhyZWN2fGludDhzZW5kfGludDhzaGx8aW50OHNocnxpbnQ4c21hbGxlcnxpbnQ4dW18IiArDQogICAgICAgICJpbnQ4dXB8aW50OHhvcnxpbnRlZ2VyX3BsX2RhdGV8aW50ZXJfbGJ8aW50ZXJfc2J8aW50ZXJfc2x8aW50ZXJuYWxfaW58aW50ZXJuYWxfb3V0fCIgKw0KICAgICAgICAiaW50ZXJ2YWxfYWNjdW18aW50ZXJ2YWxfYXZnfGludGVydmFsX2NtcHxpbnRlcnZhbF9kaXZ8aW50ZXJ2YWxfZXF8aW50ZXJ2YWxfZ2V8IiArDQogICAgICAgICJpbnRlcnZhbF9ndHxpbnRlcnZhbF9oYXNofGludGVydmFsX2lufGludGVydmFsX2xhcmdlcnxpbnRlcnZhbF9sZXxpbnRlcnZhbF9sdHwiICsNCiAgICAgICAgImludGVydmFsX21pfGludGVydmFsX211bHxpbnRlcnZhbF9uZXxpbnRlcnZhbF9vdXR8aW50ZXJ2YWxfcGx8aW50ZXJ2YWxfcGxfZGF0ZXwiICsNCiAgICAgICAgImludGVydmFsX3BsX3RpbWV8aW50ZXJ2YWxfcGxfdGltZXN0YW1wfGludGVydmFsX3BsX3RpbWVzdGFtcHR6fGludGVydmFsX3BsX3RpbWV0enwiICsNCiAgICAgICAgImludGVydmFsX3JlY3Z8aW50ZXJ2YWxfc2VuZHxpbnRlcnZhbF9zbWFsbGVyfGludGVydmFsX3VtfGludGVydmFsdHlwbW9kaW58IiArDQogICAgICAgICJpbnRlcnZhbHR5cG1vZG91dHxpbnRpbnRlcnZhbHxpc2Nsb3NlZHxpc2Zpbml0ZXxpc2hvcml6b250YWx8aXNvODg1OV8xX3RvX3V0Zjh8IiArDQogICAgICAgICJpc284ODU5X3RvX3V0Zjh8aXNvX3RvX2tvaThyfGlzb190b19taWN8aXNvX3RvX3dpbjEyNTF8aXNvX3RvX3dpbjg2Nnxpc29wZW58aXNwYXJhbGxlbHwiICsNCiAgICAgICAgImlzcGVycHxpc3ZlcnRpY2FsfGpvaGFiX3RvX3V0Zjh8anVzdGlmeV9kYXlzfGp1c3RpZnlfaG91cnN8anVzdGlmeV9pbnRlcnZhbHwiICsNCiAgICAgICAgImtvaThyX3RvX2lzb3xrb2k4cl90b19taWN8a29pOHJfdG9fdXRmOHxrb2k4cl90b193aW4xMjUxfGtvaThyX3RvX3dpbjg2NnwiICsNCiAgICAgICAgImtvaTh1X3RvX3V0Zjh8bGFnfGxhbmd1YWdlX2hhbmRsZXJfaW58bGFuZ3VhZ2VfaGFuZGxlcl9vdXR8bGFzdF92YWx1ZXxsYXN0dmFsfCIgKw0KICAgICAgICAibGF0aW4xX3RvX21pY3xsYXRpbjJfdG9fbWljfGxhdGluMl90b193aW4xMjUwfGxhdGluM190b19taWN8bGF0aW40X3RvX21pY3xsZWFkfGxlZnR8IiArDQogICAgICAgICJsZW5ndGh8bGlrZXxsaWtlX2VzY2FwZXxsaWtlam9pbnNlbHxsaWtlc2VsfGxpbmV8bGluZV9kaXN0YW5jZXxsaW5lX2VxfGxpbmVfaG9yaXpvbnRhbHwiICsNCiAgICAgICAgImxpbmVfaW58bGluZV9pbnRlcnB0fGxpbmVfaW50ZXJzZWN0fGxpbmVfb3V0fGxpbmVfcGFyYWxsZWx8bGluZV9wZXJwfGxpbmVfcmVjdnwiICsNCiAgICAgICAgImxpbmVfc2VuZHxsaW5lX3ZlcnRpY2FsfGxufGxvX2Nsb3NlfGxvX2NyZWF0fGxvX2NyZWF0ZXxsb19leHBvcnR8bG9faW1wb3J0fGxvX2xzZWVrfCIgKw0KICAgICAgICAibG9fb3Blbnxsb190ZWxsfGxvX3RydW5jYXRlfGxvX3VubGlua3xsb2d8bG9yZWFkfGxvd2VyfGxvd3JpdGV8bHBhZHxsc2VnfGxzZWdfY2VudGVyfCIgKw0KICAgICAgICAibHNlZ19kaXN0YW5jZXxsc2VnX2VxfGxzZWdfZ2V8bHNlZ19ndHxsc2VnX2hvcml6b250YWx8bHNlZ19pbnxsc2VnX2ludGVycHR8IiArDQogICAgICAgICJsc2VnX2ludGVyc2VjdHxsc2VnX2xlfGxzZWdfbGVuZ3RofGxzZWdfbHR8bHNlZ19uZXxsc2VnX291dHxsc2VnX3BhcmFsbGVsfGxzZWdfcGVycHwiICsNCiAgICAgICAgImxzZWdfcmVjdnxsc2VnX3NlbmR8bHNlZ192ZXJ0aWNhbHxsdHJpbXxtYWNhZGRyX2NtcHxtYWNhZGRyX2VxfG1hY2FkZHJfZ2V8bWFjYWRkcl9ndHwiICsNCiAgICAgICAgIm1hY2FkZHJfaW58bWFjYWRkcl9sZXxtYWNhZGRyX2x0fG1hY2FkZHJfbmV8bWFjYWRkcl9vdXR8bWFjYWRkcl9yZWN2fG1hY2FkZHJfc2VuZHwiICsNCiAgICAgICAgIm1ha2VhY2xpdGVtfG1hc2tsZW58bWF4fG1kNXxtaWNfdG9fYXNjaWl8bWljX3RvX2JpZzV8bWljX3RvX2V1Y19jbnxtaWNfdG9fZXVjX2pwfCIgKw0KICAgICAgICAibWljX3RvX2V1Y19rcnxtaWNfdG9fZXVjX3R3fG1pY190b19pc298bWljX3RvX2tvaThyfG1pY190b19sYXRpbjF8bWljX3RvX2xhdGluMnwiICsNCiAgICAgICAgIm1pY190b19sYXRpbjN8bWljX3RvX2xhdGluNHxtaWNfdG9fc2ppc3xtaWNfdG9fd2luMTI1MHxtaWNfdG9fd2luMTI1MXxtaWNfdG9fd2luODY2fCIgKw0KICAgICAgICAibWlufG1rdGludGVydmFsfG1vZHxtb25leXxtdWxfZF9pbnRlcnZhbHxuYW1lfG5hbWVlcXxuYW1lZ2V8bmFtZWd0fG5hbWVpY2xpa2V8bmFtZWljbmxpa2V8IiArDQogICAgICAgICJuYW1laWNyZWdleGVxfG5hbWVpY3JlZ2V4bmV8bmFtZWlufG5hbWVsZXxuYW1lbGlrZXxuYW1lbHR8bmFtZW5lfG5hbWVubGlrZXxuYW1lb3V0fCIgKw0KICAgICAgICAibmFtZXJlY3Z8bmFtZXJlZ2V4ZXF8bmFtZXJlZ2V4bmV8bmFtZXNlbmR8bmVxam9pbnNlbHxuZXFzZWx8bmV0bWFza3xuZXR3b3JrfG5ldHdvcmtfY21wfCIgKw0KICAgICAgICAibmV0d29ya19lcXxuZXR3b3JrX2dlfG5ldHdvcmtfZ3R8bmV0d29ya19sZXxuZXR3b3JrX2x0fG5ldHdvcmtfbmV8bmV0d29ya19zdWJ8IiArDQogICAgICAgICJuZXR3b3JrX3N1YmVxfG5ldHdvcmtfc3VwfG5ldHdvcmtfc3VwZXF8bmV4dHZhbHxubGlrZWpvaW5zZWx8bmxpa2VzZWx8bm90bGlrZXxub3d8IiArDQogICAgICAgICJucG9pbnRzfG50aF92YWx1ZXxudGlsZXxudW1lcmljX2Fic3xudW1lcmljX2FjY3VtfG51bWVyaWNfYWRkfG51bWVyaWNfYXZnfCIgKw0KICAgICAgICAibnVtZXJpY19hdmdfYWNjdW18bnVtZXJpY19jbXB8bnVtZXJpY19kaXZ8bnVtZXJpY19kaXZfdHJ1bmN8bnVtZXJpY19lcXxudW1lcmljX2V4cHwiICsNCiAgICAgICAgIm51bWVyaWNfZmFjfG51bWVyaWNfZ2V8bnVtZXJpY19ndHxudW1lcmljX2lufG51bWVyaWNfaW5jfG51bWVyaWNfbGFyZ2VyfG51bWVyaWNfbGV8IiArDQogICAgICAgICJudW1lcmljX2xufG51bWVyaWNfbG9nfG51bWVyaWNfbHR8bnVtZXJpY19tb2R8bnVtZXJpY19tdWx8bnVtZXJpY19uZXxudW1lcmljX291dHwiICsNCiAgICAgICAgIm51bWVyaWNfcG93ZXJ8bnVtZXJpY19yZWN2fG51bWVyaWNfc2VuZHxudW1lcmljX3NtYWxsZXJ8bnVtZXJpY19zcXJ0fCIgKw0KICAgICAgICAibnVtZXJpY19zdGRkZXZfcG9wfG51bWVyaWNfc3RkZGV2X3NhbXB8bnVtZXJpY19zdWJ8bnVtZXJpY191bWludXN8bnVtZXJpY191cGx1c3wiICsNCiAgICAgICAgIm51bWVyaWNfdmFyX3BvcHxudW1lcmljX3Zhcl9zYW1wfG51bWVyaWN0eXBtb2RpbnxudW1lcmljdHlwbW9kb3V0fG51bW5vZGV8IiArDQogICAgICAgICJvYmpfZGVzY3JpcHRpb258b2N0ZXRfbGVuZ3RofG9pZHxvaWRlcXxvaWRnZXxvaWRndHxvaWRpbnxvaWRsYXJnZXJ8b2lkbGV8b2lkbHR8b2lkbmV8b2lkb3V0fCIgKw0KICAgICAgICAib2lkcmVjdnxvaWRzZW5kfG9pZHNtYWxsZXJ8b2lkdmVjdG9yZXF8b2lkdmVjdG9yZ2V8b2lkdmVjdG9yZ3R8b2lkdmVjdG9yaW58b2lkdmVjdG9ybGV8IiArDQogICAgICAgICJvaWR2ZWN0b3JsdHxvaWR2ZWN0b3JuZXxvaWR2ZWN0b3JvdXR8b2lkdmVjdG9ycmVjdnxvaWR2ZWN0b3JzZW5kfG9pZHZlY3RvcnR5cGVzfG9uX3BifCIgKw0KICAgICAgICAib25fcGx8b25fcHBhdGh8b25fcHN8b25fc2J8b25fc2x8b3BhcXVlX2lufG9wYXF1ZV9vdXR8b3ZlcmxhcHN8b3ZlcmxheXxwYXRofHBhdGhfYWRkfCIgKw0KICAgICAgICAicGF0aF9hZGRfcHR8cGF0aF9jZW50ZXJ8cGF0aF9jb250YWluX3B0fHBhdGhfZGlzdGFuY2V8cGF0aF9kaXZfcHR8cGF0aF9pbnxwYXRoX2ludGVyfCIgKw0KICAgICAgICAicGF0aF9sZW5ndGh8cGF0aF9tdWxfcHR8cGF0aF9uX2VxfHBhdGhfbl9nZXxwYXRoX25fZ3R8cGF0aF9uX2xlfHBhdGhfbl9sdHxwYXRoX25wb2ludHN8IiArDQogICAgICAgICJwYXRoX291dHxwYXRoX3JlY3Z8cGF0aF9zZW5kfHBhdGhfc3ViX3B0fHBjbG9zZXxwZXJjZW50X3Jhbmt8cGdfYWR2aXNvcnlfbG9ja3wiICsNCiAgICAgICAgInBnX2Fkdmlzb3J5X2xvY2tfc2hhcmVkfHBnX2Fkdmlzb3J5X3VubG9ja3xwZ19hZHZpc29yeV91bmxvY2tfYWxsfCIgKw0KICAgICAgICAicGdfYWR2aXNvcnlfdW5sb2NrX3NoYXJlZHxwZ19hZHZpc29yeV94YWN0X2xvY2t8cGdfYWR2aXNvcnlfeGFjdF9sb2NrX3NoYXJlZHwiICsNCiAgICAgICAgInBnX2F2YWlsYWJsZV9leHRlbnNpb25fdmVyc2lvbnN8cGdfYXZhaWxhYmxlX2V4dGVuc2lvbnN8cGdfYmFja2VuZF9waWR8IiArDQogICAgICAgICJwZ19jYW5jZWxfYmFja2VuZHxwZ19jaGFyX3RvX2VuY29kaW5nfHBnX2NsaWVudF9lbmNvZGluZ3xwZ19jb2xsYXRpb25faXNfdmlzaWJsZXwiICsNCiAgICAgICAgInBnX2NvbHVtbl9zaXplfHBnX2NvbmZfbG9hZF90aW1lfHBnX2NvbnZlcnNpb25faXNfdmlzaWJsZXxwZ19jcmVhdGVfcmVzdG9yZV9wb2ludHwiICsNCiAgICAgICAgInBnX2N1cnJlbnRfeGxvZ19pbnNlcnRfbG9jYXRpb258cGdfY3VycmVudF94bG9nX2xvY2F0aW9ufHBnX2N1cnNvcnxwZ19kYXRhYmFzZV9zaXplfCIgKw0KICAgICAgICAicGdfZGVzY3JpYmVfb2JqZWN0fHBnX2VuY29kaW5nX21heF9sZW5ndGh8cGdfZW5jb2RpbmdfdG9fY2hhcnwiICsNCiAgICAgICAgInBnX2V4dGVuc2lvbl9jb25maWdfZHVtcHxwZ19leHRlbnNpb25fdXBkYXRlX3BhdGhzfHBnX2Z1bmN0aW9uX2lzX3Zpc2libGV8IiArDQogICAgICAgICJwZ19nZXRfY29uc3RyYWludGRlZnxwZ19nZXRfZXhwcnxwZ19nZXRfZnVuY3Rpb25fYXJndW1lbnRzfCIgKw0KICAgICAgICAicGdfZ2V0X2Z1bmN0aW9uX2lkZW50aXR5X2FyZ3VtZW50c3xwZ19nZXRfZnVuY3Rpb25fcmVzdWx0fHBnX2dldF9mdW5jdGlvbmRlZnwiICsNCiAgICAgICAgInBnX2dldF9pbmRleGRlZnxwZ19nZXRfa2V5d29yZHN8cGdfZ2V0X3J1bGVkZWZ8cGdfZ2V0X3NlcmlhbF9zZXF1ZW5jZXwiICsNCiAgICAgICAgInBnX2dldF90cmlnZ2VyZGVmfHBnX2dldF91c2VyYnlpZHxwZ19nZXRfdmlld2RlZnxwZ19oYXNfcm9sZXxwZ19pbmRleGVzX3NpemV8IiArDQogICAgICAgICJwZ19pc19pbl9yZWNvdmVyeXxwZ19pc19vdGhlcl90ZW1wX3NjaGVtYXxwZ19pc194bG9nX3JlcGxheV9wYXVzZWR8IiArDQogICAgICAgICJwZ19sYXN0X3hhY3RfcmVwbGF5X3RpbWVzdGFtcHxwZ19sYXN0X3hsb2dfcmVjZWl2ZV9sb2NhdGlvbnwiICsNCiAgICAgICAgInBnX2xhc3RfeGxvZ19yZXBsYXlfbG9jYXRpb258cGdfbGlzdGVuaW5nX2NoYW5uZWxzfHBnX2xvY2tfc3RhdHVzfHBnX2xzX2RpcnwiICsNCiAgICAgICAgInBnX215X3RlbXBfc2NoZW1hfHBnX25vZGVfdHJlZV9pbnxwZ19ub2RlX3RyZWVfb3V0fHBnX25vZGVfdHJlZV9yZWN2fCIgKw0KICAgICAgICAicGdfbm9kZV90cmVlX3NlbmR8cGdfbm90aWZ5fHBnX29wY2xhc3NfaXNfdmlzaWJsZXxwZ19vcGVyYXRvcl9pc192aXNpYmxlfCIgKw0KICAgICAgICAicGdfb3B0aW9uc190b190YWJsZXxwZ19wb3N0bWFzdGVyX3N0YXJ0X3RpbWV8cGdfcHJlcGFyZWRfc3RhdGVtZW50fHBnX3ByZXBhcmVkX3hhY3R8IiArDQogICAgICAgICJwZ19yZWFkX2JpbmFyeV9maWxlfHBnX3JlYWRfZmlsZXxwZ19yZWxhdGlvbl9maWxlbm9kZXxwZ19yZWxhdGlvbl9maWxlcGF0aHwiICsNCiAgICAgICAgInBnX3JlbGF0aW9uX3NpemV8cGdfcmVsb2FkX2NvbmZ8cGdfcm90YXRlX2xvZ2ZpbGV8cGdfc2VxdWVuY2VfcGFyYW1ldGVyc3wiICsNCiAgICAgICAgInBnX3Nob3dfYWxsX3NldHRpbmdzfHBnX3NpemVfcHJldHR5fHBnX3NsZWVwfHBnX3N0YXJ0X2JhY2t1cHxwZ19zdGF0X2NsZWFyX3NuYXBzaG90fCIgKw0KICAgICAgICAicGdfc3RhdF9maWxlfHBnX3N0YXRfZ2V0X2FjdGl2aXR5fHBnX3N0YXRfZ2V0X2FuYWx5emVfY291bnR8IiArDQogICAgICAgICJwZ19zdGF0X2dldF9hdXRvYW5hbHl6ZV9jb3VudHxwZ19zdGF0X2dldF9hdXRvdmFjdXVtX2NvdW50fCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfYmFja2VuZF9hY3Rpdml0eXxwZ19zdGF0X2dldF9iYWNrZW5kX2FjdGl2aXR5X3N0YXJ0fCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfYmFja2VuZF9jbGllbnRfYWRkcnxwZ19zdGF0X2dldF9iYWNrZW5kX2NsaWVudF9wb3J0fCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfYmFja2VuZF9kYmlkfHBnX3N0YXRfZ2V0X2JhY2tlbmRfaWRzZXR8cGdfc3RhdF9nZXRfYmFja2VuZF9waWR8IiArDQogICAgICAgICJwZ19zdGF0X2dldF9iYWNrZW5kX3N0YXJ0fHBnX3N0YXRfZ2V0X2JhY2tlbmRfdXNlcmlkfHBnX3N0YXRfZ2V0X2JhY2tlbmRfd2FpdGluZ3wiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X2JhY2tlbmRfeGFjdF9zdGFydHxwZ19zdGF0X2dldF9iZ3dyaXRlcl9idWZfd3JpdHRlbl9jaGVja3BvaW50c3wiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X2Jnd3JpdGVyX2J1Zl93cml0dGVuX2NsZWFufHBnX3N0YXRfZ2V0X2Jnd3JpdGVyX21heHdyaXR0ZW5fY2xlYW58IiArDQogICAgICAgICJwZ19zdGF0X2dldF9iZ3dyaXRlcl9yZXF1ZXN0ZWRfY2hlY2twb2ludHN8cGdfc3RhdF9nZXRfYmd3cml0ZXJfc3RhdF9yZXNldF90aW1lfCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfYmd3cml0ZXJfdGltZWRfY2hlY2twb2ludHN8cGdfc3RhdF9nZXRfYmxvY2tzX2ZldGNoZWR8IiArDQogICAgICAgICJwZ19zdGF0X2dldF9ibG9ja3NfaGl0fHBnX3N0YXRfZ2V0X2J1Zl9hbGxvY3xwZ19zdGF0X2dldF9idWZfZnN5bmNfYmFja2VuZHwiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X2J1Zl93cml0dGVuX2JhY2tlbmR8cGdfc3RhdF9nZXRfZGJfYmxvY2tzX2ZldGNoZWR8IiArDQogICAgICAgICJwZ19zdGF0X2dldF9kYl9ibG9ja3NfaGl0fHBnX3N0YXRfZ2V0X2RiX2NvbmZsaWN0X2FsbHwiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X2RiX2NvbmZsaWN0X2J1ZmZlcnBpbnxwZ19zdGF0X2dldF9kYl9jb25mbGljdF9sb2NrfCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfZGJfY29uZmxpY3Rfc25hcHNob3R8cGdfc3RhdF9nZXRfZGJfY29uZmxpY3Rfc3RhcnR1cF9kZWFkbG9ja3wiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X2RiX2NvbmZsaWN0X3RhYmxlc3BhY2V8cGdfc3RhdF9nZXRfZGJfbnVtYmFja2VuZHN8IiArDQogICAgICAgICJwZ19zdGF0X2dldF9kYl9zdGF0X3Jlc2V0X3RpbWV8cGdfc3RhdF9nZXRfZGJfdHVwbGVzX2RlbGV0ZWR8IiArDQogICAgICAgICJwZ19zdGF0X2dldF9kYl90dXBsZXNfZmV0Y2hlZHxwZ19zdGF0X2dldF9kYl90dXBsZXNfaW5zZXJ0ZWR8IiArDQogICAgICAgICJwZ19zdGF0X2dldF9kYl90dXBsZXNfcmV0dXJuZWR8cGdfc3RhdF9nZXRfZGJfdHVwbGVzX3VwZGF0ZWR8IiArDQogICAgICAgICJwZ19zdGF0X2dldF9kYl94YWN0X2NvbW1pdHxwZ19zdGF0X2dldF9kYl94YWN0X3JvbGxiYWNrfHBnX3N0YXRfZ2V0X2RlYWRfdHVwbGVzfCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfZnVuY3Rpb25fY2FsbHN8cGdfc3RhdF9nZXRfZnVuY3Rpb25fc2VsZl90aW1lfCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfZnVuY3Rpb25fdGltZXxwZ19zdGF0X2dldF9sYXN0X2FuYWx5emVfdGltZXwiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X2xhc3RfYXV0b2FuYWx5emVfdGltZXxwZ19zdGF0X2dldF9sYXN0X2F1dG92YWN1dW1fdGltZXwiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X2xhc3RfdmFjdXVtX3RpbWV8cGdfc3RhdF9nZXRfbGl2ZV90dXBsZXN8cGdfc3RhdF9nZXRfbnVtc2NhbnN8IiArDQogICAgICAgICJwZ19zdGF0X2dldF90dXBsZXNfZGVsZXRlZHxwZ19zdGF0X2dldF90dXBsZXNfZmV0Y2hlZHwiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X3R1cGxlc19ob3RfdXBkYXRlZHxwZ19zdGF0X2dldF90dXBsZXNfaW5zZXJ0ZWR8IiArDQogICAgICAgICJwZ19zdGF0X2dldF90dXBsZXNfcmV0dXJuZWR8cGdfc3RhdF9nZXRfdHVwbGVzX3VwZGF0ZWR8cGdfc3RhdF9nZXRfdmFjdXVtX2NvdW50fCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfd2FsX3NlbmRlcnN8cGdfc3RhdF9nZXRfeGFjdF9ibG9ja3NfZmV0Y2hlZHwiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X3hhY3RfYmxvY2tzX2hpdHxwZ19zdGF0X2dldF94YWN0X2Z1bmN0aW9uX2NhbGxzfCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfeGFjdF9mdW5jdGlvbl9zZWxmX3RpbWV8cGdfc3RhdF9nZXRfeGFjdF9mdW5jdGlvbl90aW1lfCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfeGFjdF9udW1zY2Fuc3xwZ19zdGF0X2dldF94YWN0X3R1cGxlc19kZWxldGVkfCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfeGFjdF90dXBsZXNfZmV0Y2hlZHxwZ19zdGF0X2dldF94YWN0X3R1cGxlc19ob3RfdXBkYXRlZHwiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X3hhY3RfdHVwbGVzX2luc2VydGVkfHBnX3N0YXRfZ2V0X3hhY3RfdHVwbGVzX3JldHVybmVkfCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfeGFjdF90dXBsZXNfdXBkYXRlZHxwZ19zdGF0X3Jlc2V0fHBnX3N0YXRfcmVzZXRfc2hhcmVkfCIgKw0KICAgICAgICAicGdfc3RhdF9yZXNldF9zaW5nbGVfZnVuY3Rpb25fY291bnRlcnN8cGdfc3RhdF9yZXNldF9zaW5nbGVfdGFibGVfY291bnRlcnN8IiArDQogICAgICAgICJwZ19zdG9wX2JhY2t1cHxwZ19zd2l0Y2hfeGxvZ3xwZ190YWJsZV9pc192aXNpYmxlfHBnX3RhYmxlX3NpemV8IiArDQogICAgICAgICJwZ190YWJsZXNwYWNlX2RhdGFiYXNlc3xwZ190YWJsZXNwYWNlX3NpemV8cGdfdGVybWluYXRlX2JhY2tlbmR8cGdfdGltZXpvbmVfYWJicmV2c3wiICsNCiAgICAgICAgInBnX3RpbWV6b25lX25hbWVzfHBnX3RvdGFsX3JlbGF0aW9uX3NpemV8cGdfdHJ5X2Fkdmlzb3J5X2xvY2t8IiArDQogICAgICAgICJwZ190cnlfYWR2aXNvcnlfbG9ja19zaGFyZWR8cGdfdHJ5X2Fkdmlzb3J5X3hhY3RfbG9ja3wiICsNCiAgICAgICAgInBnX3RyeV9hZHZpc29yeV94YWN0X2xvY2tfc2hhcmVkfHBnX3RzX2NvbmZpZ19pc192aXNpYmxlfHBnX3RzX2RpY3RfaXNfdmlzaWJsZXwiICsNCiAgICAgICAgInBnX3RzX3BhcnNlcl9pc192aXNpYmxlfHBnX3RzX3RlbXBsYXRlX2lzX3Zpc2libGV8cGdfdHlwZV9pc192aXNpYmxlfHBnX3R5cGVvZnwiICsNCiAgICAgICAgInBnX3hsb2dfcmVwbGF5X3BhdXNlfHBnX3hsb2dfcmVwbGF5X3Jlc3VtZXxwZ194bG9nZmlsZV9uYW1lfHBnX3hsb2dmaWxlX25hbWVfb2Zmc2V0fCIgKw0KICAgICAgICAicGl8cGxhaW50b190c3F1ZXJ5fHBscGdzcWxfY2FsbF9oYW5kbGVyfHBscGdzcWxfaW5saW5lX2hhbmRsZXJ8cGxwZ3NxbF92YWxpZGF0b3J8IiArDQogICAgICAgICJwb2ludHxwb2ludF9hYm92ZXxwb2ludF9hZGR8cG9pbnRfYmVsb3d8cG9pbnRfZGlzdGFuY2V8cG9pbnRfZGl2fHBvaW50X2VxfHBvaW50X2hvcml6fCIgKw0KICAgICAgICAicG9pbnRfaW58cG9pbnRfbGVmdHxwb2ludF9tdWx8cG9pbnRfbmV8cG9pbnRfb3V0fHBvaW50X3JlY3Z8cG9pbnRfcmlnaHR8cG9pbnRfc2VuZHwiICsNCiAgICAgICAgInBvaW50X3N1Ynxwb2ludF92ZXJ0fHBvbHlfYWJvdmV8cG9seV9iZWxvd3xwb2x5X2NlbnRlcnxwb2x5X2NvbnRhaW58cG9seV9jb250YWluX3B0fCIgKw0KICAgICAgICAicG9seV9jb250YWluZWR8cG9seV9kaXN0YW5jZXxwb2x5X2lufHBvbHlfbGVmdHxwb2x5X25wb2ludHN8cG9seV9vdXR8cG9seV9vdmVyYWJvdmV8IiArDQogICAgICAgICJwb2x5X292ZXJiZWxvd3xwb2x5X292ZXJsYXB8cG9seV9vdmVybGVmdHxwb2x5X292ZXJyaWdodHxwb2x5X3JlY3Z8cG9seV9yaWdodHwiICsNCiAgICAgICAgInBvbHlfc2FtZXxwb2x5X3NlbmR8cG9seWdvbnxwb3Blbnxwb3NpdGlvbnxwb3NpdGlvbmpvaW5zZWx8cG9zaXRpb25zZWx8IiArDQogICAgICAgICJwb3N0Z3Jlc3FsX2Zkd192YWxpZGF0b3J8cG93fHBvd2VyfHByc2RfZW5kfHByc2RfaGVhZGxpbmV8cHJzZF9sZXh0eXBlfHByc2RfbmV4dHRva2VufCIgKw0KICAgICAgICAicHJzZF9zdGFydHxwdF9jb250YWluZWRfY2lyY2xlfHB0X2NvbnRhaW5lZF9wb2x5fHF1ZXJ5X3RvX3htbHwiICsNCiAgICAgICAgInF1ZXJ5X3RvX3htbF9hbmRfeG1sc2NoZW1hfHF1ZXJ5X3RvX3htbHNjaGVtYXxxdWVyeXRyZWV8cXVvdGVfaWRlbnR8cXVvdGVfbGl0ZXJhbHwiICsNCiAgICAgICAgInF1b3RlX251bGxhYmxlfHJhZGlhbnN8cmFkaXVzfHJhbmRvbXxyYW5rfHJlY29yZF9lcXxyZWNvcmRfZ2V8cmVjb3JkX2d0fHJlY29yZF9pbnwiICsNCiAgICAgICAgInJlY29yZF9sZXxyZWNvcmRfbHR8cmVjb3JkX25lfHJlY29yZF9vdXR8cmVjb3JkX3JlY3Z8cmVjb3JkX3NlbmR8cmVnY2xhc3N8cmVnY2xhc3NpbnwiICsNCiAgICAgICAgInJlZ2NsYXNzb3V0fHJlZ2NsYXNzcmVjdnxyZWdjbGFzc3NlbmR8cmVnY29uZmlnaW58cmVnY29uZmlnb3V0fHJlZ2NvbmZpZ3JlY3Z8IiArDQogICAgICAgICJyZWdjb25maWdzZW5kfHJlZ2RpY3Rpb25hcnlpbnxyZWdkaWN0aW9uYXJ5b3V0fHJlZ2RpY3Rpb25hcnlyZWN2fHJlZ2RpY3Rpb25hcnlzZW5kfCIgKw0KICAgICAgICAicmVnZXhlcWpvaW5zZWx8cmVnZXhlcXNlbHxyZWdleG5lam9pbnNlbHxyZWdleG5lc2VsfHJlZ2V4cF9tYXRjaGVzfHJlZ2V4cF9yZXBsYWNlfCIgKw0KICAgICAgICAicmVnZXhwX3NwbGl0X3RvX2FycmF5fHJlZ2V4cF9zcGxpdF90b190YWJsZXxyZWdvcGVyYXRvcmlufHJlZ29wZXJhdG9yb3V0fCIgKw0KICAgICAgICAicmVnb3BlcmF0b3JyZWN2fHJlZ29wZXJhdG9yc2VuZHxyZWdvcGVyaW58cmVnb3Blcm91dHxyZWdvcGVycmVjdnxyZWdvcGVyc2VuZHwiICsNCiAgICAgICAgInJlZ3Byb2NlZHVyZWlufHJlZ3Byb2NlZHVyZW91dHxyZWdwcm9jZWR1cmVyZWN2fHJlZ3Byb2NlZHVyZXNlbmR8cmVncHJvY2lufHJlZ3Byb2NvdXR8IiArDQogICAgICAgICJyZWdwcm9jcmVjdnxyZWdwcm9jc2VuZHxyZWdyX2F2Z3h8cmVncl9hdmd5fHJlZ3JfY291bnR8cmVncl9pbnRlcmNlcHR8cmVncl9yMnwiICsNCiAgICAgICAgInJlZ3Jfc2xvcGV8cmVncl9zeHh8cmVncl9zeHl8cmVncl9zeXl8cmVndHlwZWlufHJlZ3R5cGVvdXR8cmVndHlwZXJlY3Z8cmVndHlwZXNlbmR8IiArDQogICAgICAgICJyZWx0aW1lfHJlbHRpbWVlcXxyZWx0aW1lZ2V8cmVsdGltZWd0fHJlbHRpbWVpbnxyZWx0aW1lbGV8cmVsdGltZWx0fHJlbHRpbWVuZXxyZWx0aW1lb3V0fCIgKw0KICAgICAgICAicmVsdGltZXJlY3Z8cmVsdGltZXNlbmR8cmVwZWF0fHJlcGxhY2V8cmV2ZXJzZXxyaWdodHxyb3VuZHxyb3dfbnVtYmVyfHJwYWR8cnRyaW18IiArDQogICAgICAgICJzY2FsYXJndGpvaW5zZWx8c2NhbGFyZ3RzZWx8c2NhbGFybHRqb2luc2VsfHNjYWxhcmx0c2VsfHNjaGVtYV90b194bWx8IiArDQogICAgICAgICJzY2hlbWFfdG9feG1sX2FuZF94bWxzY2hlbWF8c2NoZW1hX3RvX3htbHNjaGVtYXxzZXNzaW9uX3VzZXJ8c2V0X2JpdHxzZXRfYnl0ZXwiICsNCiAgICAgICAgInNldF9jb25maWd8c2V0X21hc2tsZW58c2V0c2VlZHxzZXR2YWx8c2V0d2VpZ2h0fHNoZWxsX2lufHNoZWxsX291dHwiICsNCiAgICAgICAgInNoaWZ0X2ppc18yMDA0X3RvX2V1Y19qaXNfMjAwNHxzaGlmdF9qaXNfMjAwNF90b191dGY4fHNob2JqX2Rlc2NyaXB0aW9ufHNpZ258IiArDQogICAgICAgICJzaW1pbGFyX2VzY2FwZXxzaW58c2ppc190b19ldWNfanB8c2ppc190b19taWN8c2ppc190b191dGY4fHNsb3BlfHNtZ3JlcXxzbWdyaW58c21ncm5lfCIgKw0KICAgICAgICAic21ncm91dHxzcGxpdF9wYXJ0fHNxcnR8c3RhdGVtZW50X3RpbWVzdGFtcHxzdGRkZXZ8c3RkZGV2X3BvcHxzdGRkZXZfc2FtcHxzdHJpbmdfYWdnfCIgKw0KICAgICAgICAic3RyaW5nX2FnZ19maW5hbGZufHN0cmluZ19hZ2dfdHJhbnNmbnxzdHJpbmdfdG9fYXJyYXl8c3RyaXB8c3RycG9zfHN1YnN0cnxzdWJzdHJpbmd8c3VtfCIgKw0KICAgICAgICAic3VwcHJlc3NfcmVkdW5kYW50X3VwZGF0ZXNfdHJpZ2dlcnx0YWJsZV90b194bWx8dGFibGVfdG9feG1sX2FuZF94bWxzY2hlbWF8IiArDQogICAgICAgICJ0YWJsZV90b194bWxzY2hlbWF8dGFufHRleHR8dGV4dF9nZXx0ZXh0X2d0fHRleHRfbGFyZ2VyfHRleHRfbGV8dGV4dF9sdHx0ZXh0X3BhdHRlcm5fZ2V8IiArDQogICAgICAgICJ0ZXh0X3BhdHRlcm5fZ3R8dGV4dF9wYXR0ZXJuX2xlfHRleHRfcGF0dGVybl9sdHx0ZXh0X3NtYWxsZXJ8dGV4dGFueWNhdHx0ZXh0Y2F0fHRleHRlcXwiICsNCiAgICAgICAgInRleHRpY2xpa2V8dGV4dGljbmxpa2V8dGV4dGljcmVnZXhlcXx0ZXh0aWNyZWdleG5lfHRleHRpbnx0ZXh0bGVufHRleHRsaWtlfHRleHRuZXwiICsNCiAgICAgICAgInRleHRubGlrZXx0ZXh0b3V0fHRleHRyZWN2fHRleHRyZWdleGVxfHRleHRyZWdleG5lfHRleHRzZW5kfHRoZXNhdXJ1c19pbml0fCIgKw0KICAgICAgICAidGhlc2F1cnVzX2xleGl6ZXx0aWRlcXx0aWRnZXx0aWRndHx0aWRpbnx0aWRsYXJnZXJ8dGlkbGV8dGlkbHR8dGlkbmV8dGlkb3V0fHRpZHJlY3Z8dGlkc2VuZHwiICsNCiAgICAgICAgInRpZHNtYWxsZXJ8dGltZV9jbXB8dGltZV9lcXx0aW1lX2dlfHRpbWVfZ3R8dGltZV9oYXNofHRpbWVfaW58dGltZV9sYXJnZXJ8dGltZV9sZXx0aW1lX2x0fCIgKw0KICAgICAgICAidGltZV9taV9pbnRlcnZhbHx0aW1lX21pX3RpbWV8dGltZV9uZXx0aW1lX291dHx0aW1lX3BsX2ludGVydmFsfHRpbWVfcmVjdnx0aW1lX3NlbmR8IiArDQogICAgICAgICJ0aW1lX3NtYWxsZXJ8dGltZWRhdGVfcGx8dGltZW1pfHRpbWVub3d8dGltZW9mZGF5fHRpbWVwbHx0aW1lc3RhbXBfY21wfCIgKw0KICAgICAgICAidGltZXN0YW1wX2NtcF9kYXRlfHRpbWVzdGFtcF9jbXBfdGltZXN0YW1wdHp8dGltZXN0YW1wX2VxfHRpbWVzdGFtcF9lcV9kYXRlfCIgKw0KICAgICAgICAidGltZXN0YW1wX2VxX3RpbWVzdGFtcHR6fHRpbWVzdGFtcF9nZXx0aW1lc3RhbXBfZ2VfZGF0ZXx0aW1lc3RhbXBfZ2VfdGltZXN0YW1wdHp8IiArDQogICAgICAgICJ0aW1lc3RhbXBfZ3R8dGltZXN0YW1wX2d0X2RhdGV8dGltZXN0YW1wX2d0X3RpbWVzdGFtcHR6fHRpbWVzdGFtcF9oYXNofHRpbWVzdGFtcF9pbnwiICsNCiAgICAgICAgInRpbWVzdGFtcF9sYXJnZXJ8dGltZXN0YW1wX2xlfHRpbWVzdGFtcF9sZV9kYXRlfHRpbWVzdGFtcF9sZV90aW1lc3RhbXB0enwiICsNCiAgICAgICAgInRpbWVzdGFtcF9sdHx0aW1lc3RhbXBfbHRfZGF0ZXx0aW1lc3RhbXBfbHRfdGltZXN0YW1wdHp8dGltZXN0YW1wX21pfCIgKw0KICAgICAgICAidGltZXN0YW1wX21pX2ludGVydmFsfHRpbWVzdGFtcF9uZXx0aW1lc3RhbXBfbmVfZGF0ZXx0aW1lc3RhbXBfbmVfdGltZXN0YW1wdHp8IiArDQogICAgICAgICJ0aW1lc3RhbXBfb3V0fHRpbWVzdGFtcF9wbF9pbnRlcnZhbHx0aW1lc3RhbXBfcmVjdnx0aW1lc3RhbXBfc2VuZHx0aW1lc3RhbXBfc21hbGxlcnwiICsNCiAgICAgICAgInRpbWVzdGFtcHR5cG1vZGlufHRpbWVzdGFtcHR5cG1vZG91dHx0aW1lc3RhbXB0el9jbXB8dGltZXN0YW1wdHpfY21wX2RhdGV8IiArDQogICAgICAgICJ0aW1lc3RhbXB0el9jbXBfdGltZXN0YW1wfHRpbWVzdGFtcHR6X2VxfHRpbWVzdGFtcHR6X2VxX2RhdGV8IiArDQogICAgICAgICJ0aW1lc3RhbXB0el9lcV90aW1lc3RhbXB8dGltZXN0YW1wdHpfZ2V8dGltZXN0YW1wdHpfZ2VfZGF0ZXwiICsNCiAgICAgICAgInRpbWVzdGFtcHR6X2dlX3RpbWVzdGFtcHx0aW1lc3RhbXB0el9ndHx0aW1lc3RhbXB0el9ndF9kYXRlfCIgKw0KICAgICAgICAidGltZXN0YW1wdHpfZ3RfdGltZXN0YW1wfHRpbWVzdGFtcHR6X2lufHRpbWVzdGFtcHR6X2xhcmdlcnx0aW1lc3RhbXB0el9sZXwiICsNCiAgICAgICAgInRpbWVzdGFtcHR6X2xlX2RhdGV8dGltZXN0YW1wdHpfbGVfdGltZXN0YW1wfHRpbWVzdGFtcHR6X2x0fHRpbWVzdGFtcHR6X2x0X2RhdGV8IiArDQogICAgICAgICJ0aW1lc3RhbXB0el9sdF90aW1lc3RhbXB8dGltZXN0YW1wdHpfbWl8dGltZXN0YW1wdHpfbWlfaW50ZXJ2YWx8dGltZXN0YW1wdHpfbmV8IiArDQogICAgICAgICJ0aW1lc3RhbXB0el9uZV9kYXRlfHRpbWVzdGFtcHR6X25lX3RpbWVzdGFtcHx0aW1lc3RhbXB0el9vdXR8IiArDQogICAgICAgICJ0aW1lc3RhbXB0el9wbF9pbnRlcnZhbHx0aW1lc3RhbXB0el9yZWN2fHRpbWVzdGFtcHR6X3NlbmR8dGltZXN0YW1wdHpfc21hbGxlcnwiICsNCiAgICAgICAgInRpbWVzdGFtcHR6dHlwbW9kaW58dGltZXN0YW1wdHp0eXBtb2RvdXR8dGltZXR5cG1vZGlufHRpbWV0eXBtb2RvdXR8dGltZXR6X2NtcHwiICsNCiAgICAgICAgInRpbWV0el9lcXx0aW1ldHpfZ2V8dGltZXR6X2d0fHRpbWV0el9oYXNofHRpbWV0el9pbnx0aW1ldHpfbGFyZ2VyfHRpbWV0el9sZXx0aW1ldHpfbHR8IiArDQogICAgICAgICJ0aW1ldHpfbWlfaW50ZXJ2YWx8dGltZXR6X25lfHRpbWV0el9vdXR8dGltZXR6X3BsX2ludGVydmFsfHRpbWV0el9yZWN2fHRpbWV0el9zZW5kfCIgKw0KICAgICAgICAidGltZXR6X3NtYWxsZXJ8dGltZXR6ZGF0ZV9wbHx0aW1ldHp0eXBtb2Rpbnx0aW1ldHp0eXBtb2RvdXR8dGltZXpvbmV8dGludGVydmFsfCIgKw0KICAgICAgICAidGludGVydmFsY3R8dGludGVydmFsZW5kfHRpbnRlcnZhbGVxfHRpbnRlcnZhbGdlfHRpbnRlcnZhbGd0fHRpbnRlcnZhbGlufHRpbnRlcnZhbGxlfCIgKw0KICAgICAgICAidGludGVydmFsbGVuZXF8dGludGVydmFsbGVuZ2V8dGludGVydmFsbGVuZ3R8dGludGVydmFsbGVubGV8dGludGVydmFsbGVubHR8IiArDQogICAgICAgICJ0aW50ZXJ2YWxsZW5uZXx0aW50ZXJ2YWxsdHx0aW50ZXJ2YWxuZXx0aW50ZXJ2YWxvdXR8dGludGVydmFsb3Z8dGludGVydmFscmVjdnwiICsNCiAgICAgICAgInRpbnRlcnZhbHJlbHx0aW50ZXJ2YWxzYW1lfHRpbnRlcnZhbHNlbmR8dGludGVydmFsc3RhcnR8dG9fYXNjaWl8dG9fY2hhcnx0b19kYXRlfHRvX2hleHwiICsNCiAgICAgICAgInRvX251bWJlcnx0b190aW1lc3RhbXB8dG9fdHNxdWVyeXx0b190c3ZlY3Rvcnx0cmFuc2FjdGlvbl90aW1lc3RhbXB8dHJhbnNsYXRlfCIgKw0KICAgICAgICAidHJpZ2dlcl9pbnx0cmlnZ2VyX291dHx0cnVuY3x0c19kZWJ1Z3x0c19oZWFkbGluZXx0c19sZXhpemV8dHNfbWF0Y2hfcXZ8dHNfbWF0Y2hfdHF8IiArDQogICAgICAgICJ0c19tYXRjaF90dHx0c19tYXRjaF92cXx0c19wYXJzZXx0c19yYW5rfHRzX3JhbmtfY2R8dHNfcmV3cml0ZXx0c19zdGF0fHRzX3Rva2VuX3R5cGV8IiArDQogICAgICAgICJ0c190eXBhbmFseXplfHRzbWF0Y2hqb2luc2VsfHRzbWF0Y2hzZWx8dHNxX21jb250YWluZWR8dHNxX21jb250YWluc3x0c3F1ZXJ5X2FuZHwiICsNCiAgICAgICAgInRzcXVlcnlfY21wfHRzcXVlcnlfZXF8dHNxdWVyeV9nZXx0c3F1ZXJ5X2d0fHRzcXVlcnlfbGV8dHNxdWVyeV9sdHx0c3F1ZXJ5X25lfCIgKw0KICAgICAgICAidHNxdWVyeV9ub3R8dHNxdWVyeV9vcnx0c3F1ZXJ5aW58dHNxdWVyeW91dHx0c3F1ZXJ5cmVjdnx0c3F1ZXJ5c2VuZHx0c3ZlY3Rvcl9jbXB8IiArDQogICAgICAgICJ0c3ZlY3Rvcl9jb25jYXR8dHN2ZWN0b3JfZXF8dHN2ZWN0b3JfZ2V8dHN2ZWN0b3JfZ3R8dHN2ZWN0b3JfbGV8dHN2ZWN0b3JfbHR8IiArDQogICAgICAgICJ0c3ZlY3Rvcl9uZXx0c3ZlY3Rvcl91cGRhdGVfdHJpZ2dlcnx0c3ZlY3Rvcl91cGRhdGVfdHJpZ2dlcl9jb2x1bW58dHN2ZWN0b3JpbnwiICsNCiAgICAgICAgInRzdmVjdG9yb3V0fHRzdmVjdG9ycmVjdnx0c3ZlY3RvcnNlbmR8dHhpZF9jdXJyZW50fHR4aWRfY3VycmVudF9zbmFwc2hvdHwiICsNCiAgICAgICAgInR4aWRfc25hcHNob3RfaW58dHhpZF9zbmFwc2hvdF9vdXR8dHhpZF9zbmFwc2hvdF9yZWN2fHR4aWRfc25hcHNob3Rfc2VuZHwiICsNCiAgICAgICAgInR4aWRfc25hcHNob3RfeGlwfHR4aWRfc25hcHNob3RfeG1heHx0eGlkX3NuYXBzaG90X3htaW58dHhpZF92aXNpYmxlX2luX3NuYXBzaG90fCIgKw0KICAgICAgICAidWhjX3RvX3V0Zjh8dW5pcXVlX2tleV9yZWNoZWNrfHVua25vd25pbnx1bmtub3dub3V0fHVua25vd25yZWN2fHVua25vd25zZW5kfHVubmVzdHwiICsNCiAgICAgICAgInVwcGVyfHV0ZjhfdG9fYXNjaWl8dXRmOF90b19iaWc1fHV0ZjhfdG9fZXVjX2NufHV0ZjhfdG9fZXVjX2ppc18yMDA0fHV0ZjhfdG9fZXVjX2pwfCIgKw0KICAgICAgICAidXRmOF90b19ldWNfa3J8dXRmOF90b19ldWNfdHd8dXRmOF90b19nYjE4MDMwfHV0ZjhfdG9fZ2JrfHV0ZjhfdG9faXNvODg1OXwiICsNCiAgICAgICAgInV0ZjhfdG9faXNvODg1OV8xfHV0ZjhfdG9fam9oYWJ8dXRmOF90b19rb2k4cnx1dGY4X3RvX2tvaTh1fHV0ZjhfdG9fc2hpZnRfamlzXzIwMDR8IiArDQogICAgICAgICJ1dGY4X3RvX3NqaXN8dXRmOF90b191aGN8dXRmOF90b193aW58dXVpZF9jbXB8dXVpZF9lcXx1dWlkX2dlfHV1aWRfZ3R8dXVpZF9oYXNofHV1aWRfaW58IiArDQogICAgICAgICJ1dWlkX2xlfHV1aWRfbHR8dXVpZF9uZXx1dWlkX291dHx1dWlkX3JlY3Z8dXVpZF9zZW5kfHZhcl9wb3B8dmFyX3NhbXB8dmFyYml0X2lufCIgKw0KICAgICAgICAidmFyYml0X291dHx2YXJiaXRfcmVjdnx2YXJiaXRfc2VuZHx2YXJiaXRjbXB8dmFyYml0ZXF8dmFyYml0Z2V8dmFyYml0Z3R8dmFyYml0bGV8IiArDQogICAgICAgICJ2YXJiaXRsdHx2YXJiaXRuZXx2YXJiaXR0eXBtb2Rpbnx2YXJiaXR0eXBtb2RvdXR8dmFyY2hhcmlufHZhcmNoYXJvdXR8dmFyY2hhcnJlY3Z8IiArDQogICAgICAgICJ2YXJjaGFyc2VuZHx2YXJjaGFydHlwbW9kaW58dmFyY2hhcnR5cG1vZG91dHx2YXJpYW5jZXx2ZXJzaW9ufHZvaWRfaW58dm9pZF9vdXR8IiArDQogICAgICAgICJ2b2lkX3JlY3Z8dm9pZF9zZW5kfHdpZHRofHdpZHRoX2J1Y2tldHx3aW4xMjUwX3RvX2xhdGluMnx3aW4xMjUwX3RvX21pY3x3aW4xMjUxX3RvX2lzb3wiICsNCiAgICAgICAgIndpbjEyNTFfdG9fa29pOHJ8d2luMTI1MV90b19taWN8d2luMTI1MV90b193aW44NjZ8d2luODY2X3RvX2lzb3x3aW44NjZfdG9fa29pOHJ8IiArDQogICAgICAgICJ3aW44NjZfdG9fbWljfHdpbjg2Nl90b193aW4xMjUxfHdpbl90b191dGY4fHhpZGVxfHhpZGVxaW50NHx4aWRpbnx4aWRvdXR8eGlkcmVjdnx4aWRzZW5kfCIgKw0KICAgICAgICAieG1sfHhtbF9pbnx4bWxfaXNfd2VsbF9mb3JtZWR8eG1sX2lzX3dlbGxfZm9ybWVkX2NvbnRlbnR8eG1sX2lzX3dlbGxfZm9ybWVkX2RvY3VtZW50fCIgKw0KICAgICAgICAieG1sX291dHx4bWxfcmVjdnx4bWxfc2VuZHx4bWxhZ2d8eG1sY29tbWVudHx4bWxjb25jYXQyfHhtbGV4aXN0c3x4bWx2YWxpZGF0ZXx4cGF0aHwiICsNCiAgICAgICAgInhwYXRoX2V4aXN0cyIpLnNwbGl0KCJ8IikNCiAgICApOw0KICAgIA0KICAgIHZhciBzcWxSdWxlcyA9IFsNCiAgICAgICAgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUgc3RyaW5nIC0tIGFzc3VtZSBkb2xsYXIgc3RyaW5ncyBpZiBtdWx0aS1saW5lIGZvciBub3cNCiAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInZhcmlhYmxlLmxhbmd1YWdlIiwgLy8gcGcgaWRlbnRpZmllcg0KICAgICAgICAgICAgcmVnZXggOiAnIi4qPyInDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgICAgICAgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVpbHRpbkZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl9dW2EtekEtWjAtOV8kXSpcXGIiIC8vIFRPRE8gLSBVbmljb2RlIGluIGlkZW50aWZpZXJzDQogICAgICAgICAgfSwgew0KICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgcmVnZXggOiAiIXwhIXwhfnwhflxcKnwhfn58IX5+XFwqfCN8IyN8Izx8Izw9fCM8PnwjPXwjPnwjPj18JXxcXCZ8XFwmXFwmfFxcJjx8XFwmPFxcfHxcXCY+fFxcKnxcXCt8IiArDQogICAgICAgICAgICAgICAgICAgICAgIlxcLXwvfDx8PCM+fDxcXC0+fDw8fDw8PXw8PFxcfHw8PXw8Pnw8XFw/Pnw8QHw8XFxefD18Pnw+PXw+Pnw+Pj18PlxcXnxcXD8jfFxcP1xcLXxcXD9cXC1cXHx8IiArDQogICAgICAgICAgICAgICAgICAgICAgIlxcP1xcfHxcXD9cXHxcXHx8QHxAXFwtQHxAPnxAQHxAQEB8XFxefFxcfHxcXHxcXCY+fFxcfC98XFx8Pj58XFx8XFx8fFxcfFxcfC98fnx+XFwqfH48PX58fjx+fCIgKw0KICAgICAgICAgICAgICAgICAgICAgICJ+PXx+Pj1+fH4+fnx+fnx+flxcKiINCiAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgIHRva2VuIDogImxwYXJlbi5wYXJlbiIsDQogICAgICAgICAgICAgIHJlZ2V4IDogIltcXChdIg0KICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgcmVnZXggOiAiW1xcKV0iDQogICAgICAgICAgfSwgew0KICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICB9DQogICAgXTsNCiAgICAgICAgICAgDQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICItLS4qJCINCiAgICAgICAgICAgIH0sIA0KICAgICAgICAgICAgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpLWxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgICAgIH0sew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQuc3RhdGVtZW50QmVnaW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIl5bYS16QS1aXSsiLCAvLyBDb3VsZCBlbnVtZXJhdGUgc3RhcnRpbmcga2V5d29yZHMgYnV0IHRoaXMgYWxsb3dzIHRoaW5ncyB0byB3b3JrIHdoZW4gbmV3IHN0YXRlbWVudHMgYXJlIGFkZGVkLg0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhdGVtZW50Ig0KICAgICAgICAgICAgfSx7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3VwcG9ydC5idWlsZGluIiwgLy8gcHNxbCBkaXJlY3RpdmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJeXFxcXFtcXFNdKy4qJCINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgDQogICAgICAgICJzdGF0ZW1lbnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi0tLiokIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aS1saW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnRTdGF0ZW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RhdGVtZW50RW5kIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICI7IiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHBlcmwsIHB5dGhvbiwgdGNsIGFyZSBpbiB0aGUgcGcgZGVmYXVsdCBkaXN0IChubyB0Y2wgaGlnaGxpZ2h0ZXIpDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwkcGVybFxcJCIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJwZXJsLXN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwkcHl0aG9uXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInB5dGhvbi1zdGFydCINCiAgICAgICAgICAgIH0sew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwkW1xcd18wLTldKlxcJCQiLCAvLyBkb2xsYXIgcXVvdGUgYXQgdGhlIGVuZCBvZiBhIGxpbmUNCiAgICAgICAgICAgICAgICBuZXh0IDogImRvbGxhclNxbCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcJFtcXHdfMC05XSpcXCQiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiZG9sbGFyU3RhdGVtZW50U3RyaW5nIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLmNvbmNhdChzcWxSdWxlcyksDQogICAgICAgIA0KICAgICAgICAiZG9sbGFyU3FsIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICItLS4qJCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGktbGluZSBjb21tZW50DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50RG9sbGFyU3FsIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIGVuZCBxdW90aW5nIHdpdGggZG9sbGFyIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJeXFwkW1xcd18wLTldKlxcJCIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGF0ZW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXCRbXFx3XzAtOV0qXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImRvbGxhclNxbFN0cmluZyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXS5jb25jYXQoc3FsUnVsZXMpLA0KICAgICAgICANCiAgICAgICAgImNvbW1lbnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgDQogICAgICAgICJjb21tZW50U3RhdGVtZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXRlbWVudCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICANCiAgICAgICAgImNvbW1lbnREb2xsYXJTcWwiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiZG9sbGFyU3FsIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgIA0KICAgICAgICAiZG9sbGFyU3RhdGVtZW50U3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBjbG9zaW5nIGRvbGxhcnN0cmluZw0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcJFtcXHdfMC05XSpcXCQiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhdGVtZW50Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIGRvbGxhcnN0cmluZyBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICANCiAgICAgICAgImRvbGxhclNxbFN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gY2xvc2luZyBkb2xsYXJzdHJpbmcNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCRbXFx3XzAtOV0qXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImRvbGxhclNxbCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBkb2xsYXJzdHJpbmcgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLCBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOw0KICAgIHRoaXMuZW1iZWRSdWxlcyhQZXJsSGlnaGxpZ2h0UnVsZXMsICJwZXJsLSIsIFt7dG9rZW4gOiAic3RyaW5nIiwgcmVnZXggOiAiXFwkcGVybFxcJCIsIG5leHQgOiAic3RhdGVtZW50In1dKTsNCiAgICB0aGlzLmVtYmVkUnVsZXMoUHl0aG9uSGlnaGxpZ2h0UnVsZXMsICJweXRob24tIiwgW3t0b2tlbiA6ICJzdHJpbmciLCByZWdleCA6ICJcXCRweXRob25cXCQiLCBuZXh0IDogInN0YXRlbWVudCJ9XSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoUGdzcWxIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5QZ3NxbEhpZ2hsaWdodFJ1bGVzID0gUGdzcWxIaWdobGlnaHRSdWxlczsNCn0pOw0KDQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYy50YWciLA0KICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiVE9ETyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4iDQogICAgICAgIH1dDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0U3RhcnRSdWxlID0gZnVuY3Rpb24oc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKig/PVxcKikiLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRFbmRSdWxlID0gZnVuY3Rpb24gKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwqXFwvIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KDQp9KS5jYWxsKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcy5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIFBhbmFnaW90aXMgQXN0aXRoYXMgPHBhc3RpdGggQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3BlcmxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIFBlcmxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImJhc2V8Y29uc3RhbnR8Y29udGludWV8ZWxzZXxlbHNpZnxmb3J8Zm9yZWFjaHxmb3JtYXR8Z290b3xpZnxsYXN0fGxvY2FsfG15fG5leHR8IiArDQogICAgICAgICAibm98cGFja2FnZXxwYXJlbnR8cmVkb3xyZXF1aXJlfHNjYWxhcnxzdWJ8dW5sZXNzfHVudGlsfHdoaWxlfHVzZXx2YXJzIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJBUkdWfEVOVnxJTkN8U0lHIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbHRpbkZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJnZXRwcm90b2J5bnVtYmVyfGdldHByb3RvYnluYW1lfGdldHNlcnZieW5hbWV8Z2V0aG9zdGJ5YWRkcnwiICsNCiAgICAgICAgICJnZXRob3N0YnluYW1lfGdldHNlcnZieXBvcnR8Z2V0bmV0YnlhZGRyfGdldG5ldGJ5bmFtZXxnZXRzb2NrbmFtZXwiICsNCiAgICAgICAgICJnZXRwZWVybmFtZXxzZXRwcmlvcml0eXxnZXRwcm90b2VudHxzZXRwcm90b2VudHxnZXRwcmlvcml0eXwiICsNCiAgICAgICAgICJlbmRwcm90b2VudHxnZXRzZXJ2ZW50fHNldHNlcnZlbnR8ZW5kc2VydmVudHxzZXRob3N0ZW50fHNvY2tldHBhaXJ8IiArDQogICAgICAgICAiZ2V0c29ja29wdHxnZXRob3N0ZW50fGVuZGhvc3RlbnR8c2V0c29ja29wdHxzZXRuZXRlbnR8cXVvdGVtZXRhfCIgKw0KICAgICAgICAgImxvY2FsdGltZXxwcm90b3R5cGV8Z2V0bmV0ZW50fGVuZG5ldGVudHxyZXdpbmRkaXJ8d2FudGFycmF5fGdldHB3dWlkfCIgKw0KICAgICAgICAgImNsb3NlZGlyfGdldGxvZ2lufHJlYWRsaW5rfGVuZGdyZW50fGdldGdyZ2lkfGdldGdybmFtfHNobXdyaXRlfCIgKw0KICAgICAgICAgInNodXRkb3dufHJlYWRsaW5lfGVuZHB3ZW50fHNldGdyZW50fHJlYWRwaXBlfGZvcm1saW5lfHRydW5jYXRlfCIgKw0KICAgICAgICAgImRibWNsb3NlfHN5c3dyaXRlfHNldHB3ZW50fGdldHB3bmFtfGdldGdyZW50fGdldHB3ZW50fHVjZmlyc3R8c3lzcmVhZHwiICsNCiAgICAgICAgICJzZXRwZ3JwfHNobXJlYWR8c3lzc2Vla3xzeXNvcGVufHRlbGxkaXJ8ZGVmaW5lZHxvcGVuZGlyfGNvbm5lY3R8IiArDQogICAgICAgICAibGNmaXJzdHxnZXRwcGlkfGJpbm1vZGV8c3lzY2FsbHxzcHJpbnRmfGdldHBncnB8cmVhZGRpcnxzZWVrZGlyfCIgKw0KICAgICAgICAgIndhaXRwaWR8cmV2ZXJzZXx1bnNoaWZ0fHN5bWxpbmt8ZGJtb3BlbnxzZW1nZXR8bXNncmN2fHJlbmFtZXxsaXN0ZW58IiArDQogICAgICAgICAiY2hyb290fG1zZ3NuZHxzaG1jdGx8YWNjZXB0fHVucGFja3xleGlzdHN8ZmlsZW5vfHNobWdldHxzeXN0ZW18IiArDQogICAgICAgICAidW5saW5rfHByaW50ZnxnbXRpbWV8bXNnY3RsfHNlbWN0bHx2YWx1ZXN8cmluZGV4fHN1YnN0cnxzcGxpY2V8IiArDQogICAgICAgICAibGVuZ3RofG1zZ2dldHxzZWxlY3R8c29ja2V0fHJldHVybnxjYWxsZXJ8ZGVsZXRlfGFsYXJtfGlvY3RsfGluZGV4fCIgKw0KICAgICAgICAgInVuZGVmfGxzdGF0fHRpbWVzfHNyYW5kfGNob3dufGZjbnRsfGNsb3NlfHdyaXRlfHVtYXNrfHJtZGlyfHN0dWR5fCIgKw0KICAgICAgICAgInNsZWVwfGNob21wfHVudGllfHByaW50fHV0aW1lfG1rZGlyfGF0YW4yfHNwbGl0fGNyeXB0fGZsb2NrfGNobW9kfCIgKw0KICAgICAgICAgIkJFR0lOfGJsZXNzfGNoZGlyfHNlbW9wfHNoaWZ0fHJlc2V0fGxpbmt8c3RhdHxjaG9wfGdyZXB8Zm9ya3xkdW1wfCIgKw0KICAgICAgICAgImpvaW58b3Blbnx0ZWxsfHBpcGV8ZXhpdHxnbG9ifHdhcm58ZWFjaHxiaW5kfHNvcnR8cGFja3xldmFsfHB1c2h8IiArDQogICAgICAgICAia2V5c3xnZXRjfGtpbGx8c2Vla3xzcXJ0fHNlbmR8d2FpdHxyYW5kfHRpZWR8cmVhZHx0aW1lfGV4ZWN8cmVjdnwiICsNCiAgICAgICAgICJlb2Z8Y2hyfGludHxvcmR8ZXhwfHBvc3xwb3B8c2lufGxvZ3xhYnN8b2N0fGhleHx0aWV8Y29zfHZlY3xFTkR8cmVmfCIgKw0KICAgICAgICAgIm1hcHxkaWV8dWN8bGN8ZG8iKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4NCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkDQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIjLiokIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZy5yZWdleHAiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dXFx3KlxccyooPz1bKS4sO118JCkiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXS4qXFxcXCQnLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXS4qXFxcXCQiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMHhbMC05YS1mQS1GXStcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbGRpbkNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbHRpbkZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLlxcLlxcLnxcXHxcXHw9fD4+PXw8PD18PD0+fCYmPXw9PnwhfnxcXF49fCY9fFxcfD18XFwuPXx4PXwlPXxcXC89fFxcKj18XFwtPXxcXCs9fD1+fFxcKlxcKnxcXC1cXC18XFwuXFwufFxcfFxcfHwmJnxcXCtcXCt8XFwtPnwhPXw9PXw+PXw8PXw+Pnw8PHwsfD18XFw/XFw6fFxcXnxcXHx8eHwlfFxcL3xcXCp8PHwmfFxcXFx8fnwhfD58XFwufFxcLXxcXCt8XFwtQ3xcXC1ifFxcLVN8XFwtdXxcXC10fFxcLXB8XFwtbHxcXC1kfFxcLWZ8XFwtZ3xcXC1zfFxcLXp8XFwta3xcXC1lfFxcLU98XFwtVHxcXC1CfFxcLU18XFwtQXxcXC1YfFxcLVd8XFwtY3xcXC1SfFxcLW98XFwteHxcXC13fFxcLXJ8XFxiKD86YW5kfGNtcHxlcXxnZXxndHxsZXxsdHxuZXxub3R8b3J8eG9yKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJscGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXFzdHJpbmciIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhQZXJsSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuUGVybEhpZ2hsaWdodFJ1bGVzID0gUGVybEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIENvbGluIEdvdXJsYXkgPGNvbGluIERPVCBqIERPVCBnb3VybGF5IEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqDQogKiBUT0RPOiBweXRob24gZGVsaW1pdGVycw0KICovDQoNCmRlZmluZSgnYWNlL21vZGUvcHl0aG9uX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBQeXRob25IaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImFuZHxhc3xhc3NlcnR8YnJlYWt8Y2xhc3N8Y29udGludWV8ZGVmfGRlbHxlbGlmfGVsc2V8ZXhjZXB0fGV4ZWN8IiArDQogICAgICAgICJmaW5hbGx5fGZvcnxmcm9tfGdsb2JhbHxpZnxpbXBvcnR8aW58aXN8bGFtYmRhfG5vdHxvcnxwYXNzfHByaW50fCIgKw0KICAgICAgICAicmFpc2V8cmV0dXJufHRyeXx3aGlsZXx3aXRofHlpZWxkIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbHRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJUcnVlfEZhbHNlfE5vbmV8Tm90SW1wbGVtZW50ZWR8RWxsaXBzaXN8X19kZWJ1Z19fIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbHRpbkZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJhYnN8ZGl2bW9kfGlucHV0fG9wZW58c3RhdGljbWV0aG9kfGFsbHxlbnVtZXJhdGV8aW50fG9yZHxzdHJ8YW55fCIgKw0KICAgICAgICAiZXZhbHxpc2luc3RhbmNlfHBvd3xzdW18YmFzZXN0cmluZ3xleGVjZmlsZXxpc3N1YmNsYXNzfHByaW50fHN1cGVyfCIgKw0KICAgICAgICAiYmluZmlsZXxpdGVyfHByb3BlcnR5fHR1cGxlfGJvb2x8ZmlsdGVyfGxlbnxyYW5nZXx0eXBlfGJ5dGVhcnJheXwiICsNCiAgICAgICAgImZsb2F0fGxpc3R8cmF3X2lucHV0fHVuaWNocnxjYWxsYWJsZXxmb3JtYXR8bG9jYWxzfHJlZHVjZXx1bmljb2RlfCIgKw0KICAgICAgICAiY2hyfGZyb3plbnNldHxsb25nfHJlbG9hZHx2YXJzfGNsYXNzbWV0aG9kfGdldGF0dHJ8bWFwfHJlcHJ8eHJhbmdlfCIgKw0KICAgICAgICAiY21wfGdsb2JhbHN8bWF4fHJldmVyc2VkfHppcHxjb21waWxlfGhhc2F0dHJ8bWVtb3J5dmlld3xyb3VuZHwiICsNCiAgICAgICAgIl9faW1wb3J0X198Y29tcGxleHxoYXNofG1pbnxzZXR8YXBwbHl8ZGVsYXR0cnxoZWxwfG5leHR8c2V0YXR0cnwiICsNCiAgICAgICAgImJ1ZmZlcnxkaWN0fGhleHxvYmplY3R8c2xpY2V8Y29lcmNlfGRpcnxpZHxvY3R8c29ydGVkfGludGVybiIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGZ1dHVyZVJlc2VydmVkID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIiIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIHN0clByZSA9ICIoPzpyfHV8dXJ8UnxVfFVSfFVyfHVSKT8iOw0KDQogICAgdmFyIGRlY2ltYWxJbnRlZ2VyID0gIig/Oig/OlsxLTldXFxkKil8KD86MCkpIjsNCiAgICB2YXIgb2N0SW50ZWdlciA9ICIoPzowW29PXT9bMC03XSspIjsNCiAgICB2YXIgaGV4SW50ZWdlciA9ICIoPzowW3hYXVtcXGRBLUZhLWZdKykiOw0KICAgIHZhciBiaW5JbnRlZ2VyID0gIig/OjBbYkJdWzAxXSspIjsNCiAgICB2YXIgaW50ZWdlciA9ICIoPzoiICsgZGVjaW1hbEludGVnZXIgKyAifCIgKyBvY3RJbnRlZ2VyICsgInwiICsgaGV4SW50ZWdlciArICJ8IiArIGJpbkludGVnZXIgKyAiKSI7DQoNCiAgICB2YXIgZXhwb25lbnQgPSAiKD86W2VFXVsrLV0/XFxkKykiOw0KICAgIHZhciBmcmFjdGlvbiA9ICIoPzpcXC5cXGQrKSI7DQogICAgdmFyIGludFBhcnQgPSAiKD86XFxkKykiOw0KICAgIHZhciBwb2ludEZsb2F0ID0gIig/Oig/OiIgKyBpbnRQYXJ0ICsgIj8iICsgZnJhY3Rpb24gKyAiKXwoPzoiICsgaW50UGFydCArICJcXC4pKSI7DQogICAgdmFyIGV4cG9uZW50RmxvYXQgPSAiKD86KD86IiArIHBvaW50RmxvYXQgKyAifCIgKyAgaW50UGFydCArICIpIiArIGV4cG9uZW50ICsgIikiOw0KICAgIHZhciBmbG9hdE51bWJlciA9ICIoPzoiICsgZXhwb25lbnRGbG9hdCArICJ8IiArIHBvaW50RmxvYXQgKyAiKSI7DQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICByZWdleCA6ICIjLiokIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gIiIiIHN0cmluZw0KICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnInszfSg/OlteXFxcXF18XFxcXC4pKj8iezN9Jw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gbXVsdGkgbGluZSAiIiIgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICciezN9LiokJywNCiAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyAiIHN0cmluZw0KICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnIig/OlteXFxcXF18XFxcXC4pKj8iJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gJycnIHN0cmluZw0KICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAiJ3szfSg/OlteXFxcXF18XFxcXC4pKj8nezN9Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gbXVsdGkgbGluZSAnJycgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICInezN9LiokIiwNCiAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vICcgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICInKD86W15cXFxcXXxcXFxcLikqPyciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBpbWFnaW5hcnkNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OiIgKyBmbG9hdE51bWJlciArICJ8XFxkKylbakpdXFxiIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgIHJlZ2V4IDogZmxvYXROdW1iZXINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGxvbmcgaW50ZWdlcg0KICAgICAgICAgICAgcmVnZXggOiBpbnRlZ2VyICsgIltsTF1cXGIiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBpbnRlZ2VyDQogICAgICAgICAgICByZWdleCA6IGludGVnZXIgKyAiXFxiIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZnV0dXJlUmVzZXJ2ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbHRpbkZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gImRlYnVnZ2VyIikNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmRlcHJlY2F0ZWQiOw0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwrfFxcLXxcXCp8XFwqXFwqfFxcL3xcXC9cXC98JXw8PHw+PnwmfFxcfHxcXF58fnw8fD58PD18PT58PT18IT18PD58PSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibHBhcmVuLnBhcmVuIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIltcXFtcXChcXHtdIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICAgICAgcmVnZXggOiAiW1xcXVxcKVxcfV0iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSBdLA0KICAgICAgICAicXFzdHJpbmciIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lICIiIiBzdHJpbmcgZW5kDQogICAgICAgICAgICByZWdleCA6ICcoPzpbXlxcXFxdfFxcXFwuKSo/InszfScsDQogICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgIH0gXSwNCiAgICAgICAgInFzdHJpbmciIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgLy8gbXVsdGkgbGluZSAnJycgc3RyaW5nIGVuZA0KICAgICAgICAgICAgcmVnZXggOiAiKD86W15cXFxcXXxcXFxcLikqPyd7M30iLA0KICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICB9IF0NCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKFB5dGhvbkhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLlB5dGhvbkhpZ2hsaWdodFJ1bGVzID0gUHl0aG9uSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCioNCiogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQoqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KKg0KKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiogTGljZW5zZS4NCioNCiogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQoqDQoqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KKiBBamF4Lm9yZyBCLlYuDQoqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKg0KKiBDb250cmlidXRvcihzKToNCiogICAgICBBbmRyw6kgRmllZGxlciA8ZmllZGxlciBkb3QgYW5kcmUgYSB0IGdtYWlsIGRvdCBjb20+DQoqDQoqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQoqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQoqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQoqDQoqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvcGhwJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvcGhwX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgUGhwSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3BocF9oaWdobGlnaHRfcnVsZXMiKS5QaHBIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgUGhwSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIHJlID0gL14oXHMqKSMvOw0KDQogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgew0KICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICIjIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKltce1woXFtcOl1ccyokLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBBbmRyw6kgRmllZGxlciA8ZmllZGxlciBkb3QgYW5kcmUgYSB0IGdtYWlsIGRvdCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3BocF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIFBocEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQogICAgdmFyIGRvY0NvbW1lbnQgPSBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCk7DQogICAgLy8gaHR0cDovL3BocC5uZXQvcXVpY2tyZWYucGhwDQogICAgdmFyIGJ1aWx0aW5GdW5jdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgnYWJzfGFjb3N8YWNvc2h8YWRkY3NsYXNoZXN8YWRkc2xhc2hlc3xhZ2dyZWdhdGV8YWdncmVnYXRlX2luZm98YWdncmVnYXRlX21ldGhvZHN8YWdncmVnYXRlX21ldGhvZHNfYnlfbGlzdHxhZ2dyZWdhdGVfbWV0aG9kc19ieV9yZWdleHB8JyArDQogICAgICAgICdhZ2dyZWdhdGVfcHJvcGVydGllc3xhZ2dyZWdhdGVfcHJvcGVydGllc19ieV9saXN0fGFnZ3JlZ2F0ZV9wcm9wZXJ0aWVzX2J5X3JlZ2V4cHxhZ2dyZWdhdGlvbl9pbmZvfGFtcXBjb25uZWN0aW9ufGFtcXBleGNoYW5nZXxhbXFwcXVldWV8JyArDQogICAgICAgICdhcGFjaGVfY2hpbGRfdGVybWluYXRlfGFwYWNoZV9nZXRfbW9kdWxlc3xhcGFjaGVfZ2V0X3ZlcnNpb258YXBhY2hlX2dldGVudnxhcGFjaGVfbG9va3VwX3VyaXxhcGFjaGVfbm90ZXxhcGFjaGVfcmVxdWVzdF9oZWFkZXJzfCcgKw0KICAgICAgICAnYXBhY2hlX3Jlc2V0X3RpbWVvdXR8YXBhY2hlX3Jlc3BvbnNlX2hlYWRlcnN8YXBhY2hlX3NldGVudnxhcGNfYWRkfGFwY19iaW5fZHVtcHxhcGNfYmluX2R1bXBmaWxlfGFwY19iaW5fbG9hZHxhcGNfYmluX2xvYWRmaWxlfCcgKw0KICAgICAgICAnYXBjX2NhY2hlX2luZm98YXBjX2Nhc3xhcGNfY2xlYXJfY2FjaGV8YXBjX2NvbXBpbGVfZmlsZXxhcGNfZGVjfGFwY19kZWZpbmVfY29uc3RhbnRzfGFwY19kZWxldGV8YXBjX2RlbGV0ZV9maWxlfGFwY19leGlzdHN8YXBjX2ZldGNofCcgKw0KICAgICAgICAnYXBjX2luY3xhcGNfbG9hZF9jb25zdGFudHN8YXBjX3NtYV9pbmZvfGFwY19zdG9yZXxhcGNpdGVyYXRvcnxhcGRfYnJlYWtwb2ludHxhcGRfY2FsbHN0YWNrfGFwZF9jbHVua3xhcGRfY29udGludWV8YXBkX2Nyb2FrfCcgKw0KICAgICAgICAnYXBkX2R1bXBfZnVuY3Rpb25fdGFibGV8YXBkX2R1bXBfcGVyc2lzdGVudF9yZXNvdXJjZXN8YXBkX2R1bXBfcmVndWxhcl9yZXNvdXJjZXN8YXBkX2VjaG98YXBkX2dldF9hY3RpdmVfc3ltYm9sc3xhcGRfc2V0X3Bwcm9mX3RyYWNlfCcgKw0KICAgICAgICAnYXBkX3NldF9zZXNzaW9ufGFwZF9zZXRfc2Vzc2lvbl90cmFjZXxhcGRfc2V0X3Nlc3Npb25fdHJhY2Vfc29ja2V0fGFwcGVuZGl0ZXJhdG9yfGFycmF5fGFycmF5X2NoYW5nZV9rZXlfY2FzZXxhcnJheV9jaHVua3xhcnJheV9jb21iaW5lfCcgKw0KICAgICAgICAnYXJyYXlfY291bnRfdmFsdWVzfGFycmF5X2RpZmZ8YXJyYXlfZGlmZl9hc3NvY3xhcnJheV9kaWZmX2tleXxhcnJheV9kaWZmX3Vhc3NvY3xhcnJheV9kaWZmX3VrZXl8YXJyYXlfZmlsbHxhcnJheV9maWxsX2tleXN8YXJyYXlfZmlsdGVyfCcgKw0KICAgICAgICAnYXJyYXlfZmxpcHxhcnJheV9pbnRlcnNlY3R8YXJyYXlfaW50ZXJzZWN0X2Fzc29jfGFycmF5X2ludGVyc2VjdF9rZXl8YXJyYXlfaW50ZXJzZWN0X3Vhc3NvY3xhcnJheV9pbnRlcnNlY3RfdWtleXxhcnJheV9rZXlfZXhpc3RzfCcgKw0KICAgICAgICAnYXJyYXlfa2V5c3xhcnJheV9tYXB8YXJyYXlfbWVyZ2V8YXJyYXlfbWVyZ2VfcmVjdXJzaXZlfGFycmF5X211bHRpc29ydHxhcnJheV9wYWR8YXJyYXlfcG9wfGFycmF5X3Byb2R1Y3R8YXJyYXlfcHVzaHxhcnJheV9yYW5kfCcgKw0KICAgICAgICAnYXJyYXlfcmVkdWNlfGFycmF5X3JlcGxhY2V8YXJyYXlfcmVwbGFjZV9yZWN1cnNpdmV8YXJyYXlfcmV2ZXJzZXxhcnJheV9zZWFyY2h8YXJyYXlfc2hpZnR8YXJyYXlfc2xpY2V8YXJyYXlfc3BsaWNlfGFycmF5X3N1bXxhcnJheV91ZGlmZnwnICsNCiAgICAgICAgJ2FycmF5X3VkaWZmX2Fzc29jfGFycmF5X3VkaWZmX3Vhc3NvY3xhcnJheV91aW50ZXJzZWN0fGFycmF5X3VpbnRlcnNlY3RfYXNzb2N8YXJyYXlfdWludGVyc2VjdF91YXNzb2N8YXJyYXlfdW5pcXVlfGFycmF5X3Vuc2hpZnR8JyArDQogICAgICAgICdhcnJheV92YWx1ZXN8YXJyYXlfd2Fsa3xhcnJheV93YWxrX3JlY3Vyc2l2ZXxhcnJheWFjY2Vzc3xhcnJheWl0ZXJhdG9yfGFycmF5b2JqZWN0fGFyc29ydHxhc2lufGFzaW5ofGFzb3J0fGFzc2VydHxhc3NlcnRfb3B0aW9uc3xhdGFufCcgKw0KICAgICAgICAnYXRhbjJ8YXRhbmh8YXVkaW9wcm9wZXJ0aWVzfGJhZGZ1bmN0aW9uY2FsbGV4Y2VwdGlvbnxiYWRtZXRob2RjYWxsZXhjZXB0aW9ufGJhc2U2NF9kZWNvZGV8YmFzZTY0X2VuY29kZXxiYXNlX2NvbnZlcnR8YmFzZW5hbWV8JyArDQogICAgICAgICdiYmNvZGVfYWRkX2VsZW1lbnR8YmJjb2RlX2FkZF9zbWlsZXl8YmJjb2RlX2NyZWF0ZXxiYmNvZGVfZGVzdHJveXxiYmNvZGVfcGFyc2V8YmJjb2RlX3NldF9hcmdfcGFyc2VyfGJiY29kZV9zZXRfZmxhZ3N8YmNhZGR8YmNjb21wfGJjZGl2fCcgKw0KICAgICAgICAnYmNtb2R8YmNtdWx8YmNvbXBpbGVyX2xvYWR8YmNvbXBpbGVyX2xvYWRfZXhlfGJjb21waWxlcl9wYXJzZV9jbGFzc3xiY29tcGlsZXJfcmVhZHxiY29tcGlsZXJfd3JpdGVfY2xhc3N8YmNvbXBpbGVyX3dyaXRlX2NvbnN0YW50fCcgKw0KICAgICAgICAnYmNvbXBpbGVyX3dyaXRlX2V4ZV9mb290ZXJ8YmNvbXBpbGVyX3dyaXRlX2ZpbGV8YmNvbXBpbGVyX3dyaXRlX2Zvb3RlcnxiY29tcGlsZXJfd3JpdGVfZnVuY3Rpb258YmNvbXBpbGVyX3dyaXRlX2Z1bmN0aW9uc19mcm9tX2ZpbGV8JyArDQogICAgICAgICdiY29tcGlsZXJfd3JpdGVfaGVhZGVyfGJjb21waWxlcl93cml0ZV9pbmNsdWRlZF9maWxlbmFtZXxiY3Bvd3xiY3Bvd21vZHxiY3NjYWxlfGJjc3FydHxiY3N1YnxiaW4yaGV4fGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0fGJpbmRlY3wnICsNCiAgICAgICAgJ2JpbmR0ZXh0ZG9tYWlufGJzb25fZGVjb2RlfGJzb25fZW5jb2RlfGJ1bXBWYWx1ZXxiemNsb3NlfGJ6Y29tcHJlc3N8YnpkZWNvbXByZXNzfGJ6ZXJybm98YnplcnJvcnxiemVycnN0cnxiemZsdXNofGJ6b3BlbnxienJlYWR8Ynp3cml0ZXwnICsNCiAgICAgICAgJ2NhY2hpbmdpdGVyYXRvcnxjYWlyb3xjYWlyb19jcmVhdGV8Y2Fpcm9fZm9udF9mYWNlX2dldF90eXBlfGNhaXJvX2ZvbnRfZmFjZV9zdGF0dXN8Y2Fpcm9fZm9udF9vcHRpb25zX2NyZWF0ZXxjYWlyb19mb250X29wdGlvbnNfZXF1YWx8JyArDQogICAgICAgICdjYWlyb19mb250X29wdGlvbnNfZ2V0X2FudGlhbGlhc3xjYWlyb19mb250X29wdGlvbnNfZ2V0X2hpbnRfbWV0cmljc3xjYWlyb19mb250X29wdGlvbnNfZ2V0X2hpbnRfc3R5bGV8JyArDQogICAgICAgICdjYWlyb19mb250X29wdGlvbnNfZ2V0X3N1YnBpeGVsX29yZGVyfGNhaXJvX2ZvbnRfb3B0aW9uc19oYXNofGNhaXJvX2ZvbnRfb3B0aW9uc19tZXJnZXxjYWlyb19mb250X29wdGlvbnNfc2V0X2FudGlhbGlhc3wnICsNCiAgICAgICAgJ2NhaXJvX2ZvbnRfb3B0aW9uc19zZXRfaGludF9tZXRyaWNzfGNhaXJvX2ZvbnRfb3B0aW9uc19zZXRfaGludF9zdHlsZXxjYWlyb19mb250X29wdGlvbnNfc2V0X3N1YnBpeGVsX29yZGVyfGNhaXJvX2ZvbnRfb3B0aW9uc19zdGF0dXN8JyArDQogICAgICAgICdjYWlyb19mb3JtYXRfc3RyaWRlX2Zvcl93aWR0aHxjYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZXxjYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV9mb3JfZGF0YXxjYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV9mcm9tX3BuZ3wnICsNCiAgICAgICAgJ2NhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X2RhdGF8Y2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfZm9ybWF0fGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X2hlaWdodHxjYWlyb19pbWFnZV9zdXJmYWNlX2dldF9zdHJpZGV8JyArDQogICAgICAgICdjYWlyb19pbWFnZV9zdXJmYWNlX2dldF93aWR0aHxjYWlyb19tYXRyaXhfY3JlYXRlX3NjYWxlfGNhaXJvX21hdHJpeF9jcmVhdGVfdHJhbnNsYXRlfGNhaXJvX21hdHJpeF9pbnZlcnR8Y2Fpcm9fbWF0cml4X211bHRpcGx5fCcgKw0KICAgICAgICAnY2Fpcm9fbWF0cml4X3JvdGF0ZXxjYWlyb19tYXRyaXhfdHJhbnNmb3JtX2Rpc3RhbmNlfGNhaXJvX21hdHJpeF90cmFuc2Zvcm1fcG9pbnR8Y2Fpcm9fbWF0cml4X3RyYW5zbGF0ZXxjYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYnwnICsNCiAgICAgICAgJ2NhaXJvX3BhdHRlcm5fYWRkX2NvbG9yX3N0b3BfcmdiYXxjYWlyb19wYXR0ZXJuX2NyZWF0ZV9mb3Jfc3VyZmFjZXxjYWlyb19wYXR0ZXJuX2NyZWF0ZV9saW5lYXJ8Y2Fpcm9fcGF0dGVybl9jcmVhdGVfcmFkaWFsfCcgKw0KICAgICAgICAnY2Fpcm9fcGF0dGVybl9jcmVhdGVfcmdifGNhaXJvX3BhdHRlcm5fY3JlYXRlX3JnYmF8Y2Fpcm9fcGF0dGVybl9nZXRfY29sb3Jfc3RvcF9jb3VudHxjYWlyb19wYXR0ZXJuX2dldF9jb2xvcl9zdG9wX3JnYmF8JyArDQogICAgICAgICdjYWlyb19wYXR0ZXJuX2dldF9leHRlbmR8Y2Fpcm9fcGF0dGVybl9nZXRfZmlsdGVyfGNhaXJvX3BhdHRlcm5fZ2V0X2xpbmVhcl9wb2ludHN8Y2Fpcm9fcGF0dGVybl9nZXRfbWF0cml4fCcgKw0KICAgICAgICAnY2Fpcm9fcGF0dGVybl9nZXRfcmFkaWFsX2NpcmNsZXN8Y2Fpcm9fcGF0dGVybl9nZXRfcmdiYXxjYWlyb19wYXR0ZXJuX2dldF9zdXJmYWNlfGNhaXJvX3BhdHRlcm5fZ2V0X3R5cGV8Y2Fpcm9fcGF0dGVybl9zZXRfZXh0ZW5kfCcgKw0KICAgICAgICAnY2Fpcm9fcGF0dGVybl9zZXRfZmlsdGVyfGNhaXJvX3BhdHRlcm5fc2V0X21hdHJpeHxjYWlyb19wYXR0ZXJuX3N0YXR1c3xjYWlyb19wZGZfc3VyZmFjZV9jcmVhdGV8Y2Fpcm9fcGRmX3N1cmZhY2Vfc2V0X3NpemV8JyArDQogICAgICAgICdjYWlyb19wc19nZXRfbGV2ZWxzfGNhaXJvX3BzX2xldmVsX3RvX3N0cmluZ3xjYWlyb19wc19zdXJmYWNlX2NyZWF0ZXxjYWlyb19wc19zdXJmYWNlX2RzY19iZWdpbl9wYWdlX3NldHVwfCcgKw0KICAgICAgICAnY2Fpcm9fcHNfc3VyZmFjZV9kc2NfYmVnaW5fc2V0dXB8Y2Fpcm9fcHNfc3VyZmFjZV9kc2NfY29tbWVudHxjYWlyb19wc19zdXJmYWNlX2dldF9lcHN8Y2Fpcm9fcHNfc3VyZmFjZV9yZXN0cmljdF90b19sZXZlbHwnICsNCiAgICAgICAgJ2NhaXJvX3BzX3N1cmZhY2Vfc2V0X2Vwc3xjYWlyb19wc19zdXJmYWNlX3NldF9zaXplfGNhaXJvX3NjYWxlZF9mb250X2NyZWF0ZXxjYWlyb19zY2FsZWRfZm9udF9leHRlbnRzfGNhaXJvX3NjYWxlZF9mb250X2dldF9jdG18JyArDQogICAgICAgICdjYWlyb19zY2FsZWRfZm9udF9nZXRfZm9udF9mYWNlfGNhaXJvX3NjYWxlZF9mb250X2dldF9mb250X21hdHJpeHxjYWlyb19zY2FsZWRfZm9udF9nZXRfZm9udF9vcHRpb25zfGNhaXJvX3NjYWxlZF9mb250X2dldF9zY2FsZV9tYXRyaXh8JyArDQogICAgICAgICdjYWlyb19zY2FsZWRfZm9udF9nZXRfdHlwZXxjYWlyb19zY2FsZWRfZm9udF9nbHlwaF9leHRlbnRzfGNhaXJvX3NjYWxlZF9mb250X3N0YXR1c3xjYWlyb19zY2FsZWRfZm9udF90ZXh0X2V4dGVudHN8JyArDQogICAgICAgICdjYWlyb19zdXJmYWNlX2NvcHlfcGFnZXxjYWlyb19zdXJmYWNlX2NyZWF0ZV9zaW1pbGFyfGNhaXJvX3N1cmZhY2VfZmluaXNofGNhaXJvX3N1cmZhY2VfZmx1c2h8Y2Fpcm9fc3VyZmFjZV9nZXRfY29udGVudHwnICsNCiAgICAgICAgJ2NhaXJvX3N1cmZhY2VfZ2V0X2RldmljZV9vZmZzZXR8Y2Fpcm9fc3VyZmFjZV9nZXRfZm9udF9vcHRpb25zfGNhaXJvX3N1cmZhY2VfZ2V0X3R5cGV8Y2Fpcm9fc3VyZmFjZV9tYXJrX2RpcnR5fCcgKw0KICAgICAgICAnY2Fpcm9fc3VyZmFjZV9tYXJrX2RpcnR5X3JlY3RhbmdsZXxjYWlyb19zdXJmYWNlX3NldF9kZXZpY2Vfb2Zmc2V0fGNhaXJvX3N1cmZhY2Vfc2V0X2ZhbGxiYWNrX3Jlc29sdXRpb258Y2Fpcm9fc3VyZmFjZV9zaG93X3BhZ2V8JyArDQogICAgICAgICdjYWlyb19zdXJmYWNlX3N0YXR1c3xjYWlyb19zdXJmYWNlX3dyaXRlX3RvX3BuZ3xjYWlyb19zdmdfc3VyZmFjZV9jcmVhdGV8Y2Fpcm9fc3ZnX3N1cmZhY2VfcmVzdHJpY3RfdG9fdmVyc2lvbnwnICsNCiAgICAgICAgJ2NhaXJvX3N2Z192ZXJzaW9uX3RvX3N0cmluZ3xjYWlyb2FudGlhbGlhc3xjYWlyb2NvbnRlbnR8Y2Fpcm9jb250ZXh0fGNhaXJvZXhjZXB0aW9ufGNhaXJvZXh0ZW5kfGNhaXJvZmlsbHJ1bGV8Y2Fpcm9maWx0ZXJ8Y2Fpcm9mb250ZmFjZXwnICsNCiAgICAgICAgJ2NhaXJvZm9udG9wdGlvbnN8Y2Fpcm9mb250c2xhbnR8Y2Fpcm9mb250dHlwZXxjYWlyb2ZvbnR3ZWlnaHR8Y2Fpcm9mb3JtYXR8Y2Fpcm9ncmFkaWVudHBhdHRlcm58Y2Fpcm9oaW50bWV0cmljc3xjYWlyb2hpbnRzdHlsZXwnICsNCiAgICAgICAgJ2NhaXJvaW1hZ2VzdXJmYWNlfGNhaXJvbGluZWFyZ3JhZGllbnR8Y2Fpcm9saW5lY2FwfGNhaXJvbGluZWpvaW58Y2Fpcm9tYXRyaXh8Y2Fpcm9vcGVyYXRvcnxjYWlyb3BhdGh8Y2Fpcm9wYXR0ZXJufGNhaXJvcGF0dGVybnR5cGV8JyArDQogICAgICAgICdjYWlyb3BkZnN1cmZhY2V8Y2Fpcm9wc2xldmVsfGNhaXJvcHNzdXJmYWNlfGNhaXJvcmFkaWFsZ3JhZGllbnR8Y2Fpcm9zY2FsZWRmb250fGNhaXJvc29saWRwYXR0ZXJufGNhaXJvc3RhdHVzfGNhaXJvc3VicGl4ZWxvcmRlcnwnICsNCiAgICAgICAgJ2NhaXJvc3VyZmFjZXxjYWlyb3N1cmZhY2VwYXR0ZXJufGNhaXJvc3VyZmFjZXR5cGV8Y2Fpcm9zdmdzdXJmYWNlfGNhaXJvc3ZndmVyc2lvbnxjYWlyb3RveWZvbnRmYWNlfGNhbF9kYXlzX2luX21vbnRofGNhbF9mcm9tX2pkfGNhbF9pbmZvfCcgKw0KICAgICAgICAnY2FsX3RvX2pkfGNhbGN1bF9obWFjfGNhbGN1bGhtYWN8Y2FsbF91c2VyX2Z1bmN8Y2FsbF91c2VyX2Z1bmNfYXJyYXl8Y2FsbF91c2VyX21ldGhvZHxjYWxsX3VzZXJfbWV0aG9kX2FycmF5fGNhbGxiYWNrZmlsdGVyaXRlcmF0b3J8Y2VpbHwnICsNCiAgICAgICAgJ2NoZGJ8Y2hkYl9jcmVhdGV8Y2hkaXJ8Y2hlY2tkYXRlfGNoZWNrZG5zcnJ8Y2hncnB8Y2htb2R8Y2hvcHxjaG93bnxjaHJ8Y2hyb290fGNodW5rX3NwbGl0fGNsYXNzX2FsaWFzfGNsYXNzX2V4aXN0c3xjbGFzc19pbXBsZW1lbnRzfCcgKw0KICAgICAgICAnY2xhc3NfcGFyZW50c3xjbGFzc2tpdF9pbXBvcnR8Y2xhc3NraXRfbWV0aG9kX2FkZHxjbGFzc2tpdF9tZXRob2RfY29weXxjbGFzc2tpdF9tZXRob2RfcmVkZWZpbmV8Y2xhc3NraXRfbWV0aG9kX3JlbW92ZXwnICsNCiAgICAgICAgJ2NsYXNza2l0X21ldGhvZF9yZW5hbWV8Y2xlYXJzdGF0Y2FjaGV8Y2xvbmV8Y2xvc2VkaXJ8Y2xvc2Vsb2d8Y29sbGF0b3J8Y29tfGNvbV9hZGRyZWZ8Y29tX2NyZWF0ZV9ndWlkfGNvbV9ldmVudF9zaW5rfGNvbV9nZXR8JyArDQogICAgICAgICdjb21fZ2V0X2FjdGl2ZV9vYmplY3R8Y29tX2ludm9rZXxjb21faXNlbnVtfGNvbV9sb2FkfGNvbV9sb2FkX3R5cGVsaWJ8Y29tX21lc3NhZ2VfcHVtcHxjb21fcHJpbnRfdHlwZWluZm98Y29tX3Byb3BnZXR8Y29tX3Byb3BwdXR8JyArDQogICAgICAgICdjb21fcHJvcHNldHxjb21fcmVsZWFzZXxjb21fc2V0fGNvbXBhY3R8Y29ubmVjdGlvbl9hYm9ydGVkfGNvbm5lY3Rpb25fc3RhdHVzfGNvbm5lY3Rpb25fdGltZW91dHxjb25zdGFudHxjb25zdHJ1Y3R8Y29uc3RydWN0fGNvbnN0cnVjdHwnICsNCiAgICAgICAgJ2NvbnZlcnRfY3lyX3N0cmluZ3xjb252ZXJ0X3V1ZGVjb2RlfGNvbnZlcnRfdXVlbmNvZGV8Y29weXxjb3N8Y29zaHxjb3VudHxjb3VudF9jaGFyc3xjb3VudGFibGV8Y291bnRlcl9idW1wfGNvdW50ZXJfYnVtcF92YWx1ZXwnICsNCiAgICAgICAgJ2NvdW50ZXJfY3JlYXRlfGNvdW50ZXJfZ2V0fGNvdW50ZXJfZ2V0X21ldGF8Y291bnRlcl9nZXRfbmFtZWR8Y291bnRlcl9nZXRfdmFsdWV8Y291bnRlcl9yZXNldHxjb3VudGVyX3Jlc2V0X3ZhbHVlfGNyYWNrX2NoZWNrfCcgKw0KICAgICAgICAnY3JhY2tfY2xvc2VkaWN0fGNyYWNrX2dldGxhc3RtZXNzYWdlfGNyYWNrX29wZW5kaWN0fGNyYzMyfGNyZWF0ZV9mdW5jdGlvbnxjcnlwdHxjdHlwZV9hbG51bXxjdHlwZV9hbHBoYXxjdHlwZV9jbnRybHxjdHlwZV9kaWdpdHwnICsNCiAgICAgICAgJ2N0eXBlX2dyYXBofGN0eXBlX2xvd2VyfGN0eXBlX3ByaW50fGN0eXBlX3B1bmN0fGN0eXBlX3NwYWNlfGN0eXBlX3VwcGVyfGN0eXBlX3hkaWdpdHxjdWJyaWRfYWZmZWN0ZWRfcm93c3xjdWJyaWRfYmluZHwnICsNCiAgICAgICAgJ2N1YnJpZF9jbGllbnRfZW5jb2Rpbmd8Y3VicmlkX2Nsb3NlfGN1YnJpZF9jbG9zZV9wcmVwYXJlfGN1YnJpZF9jbG9zZV9yZXF1ZXN0fGN1YnJpZF9jb2xfZ2V0fGN1YnJpZF9jb2xfc2l6ZXxjdWJyaWRfY29sdW1uX25hbWVzfCcgKw0KICAgICAgICAnY3VicmlkX2NvbHVtbl90eXBlc3xjdWJyaWRfY29tbWl0fGN1YnJpZF9jb25uZWN0fGN1YnJpZF9jb25uZWN0X3dpdGhfdXJsfGN1YnJpZF9jdXJyZW50X29pZHxjdWJyaWRfZGF0YV9zZWVrfGN1YnJpZF9kYl9uYW1lfCcgKw0KICAgICAgICAnY3VicmlkX2Rpc2Nvbm5lY3R8Y3VicmlkX2Ryb3B8Y3VicmlkX2Vycm5vfGN1YnJpZF9lcnJvcnxjdWJyaWRfZXJyb3JfY29kZXxjdWJyaWRfZXJyb3JfY29kZV9mYWNpbGl0eXxjdWJyaWRfZXJyb3JfbXNnfGN1YnJpZF9leGVjdXRlfCcgKw0KICAgICAgICAnY3VicmlkX2ZldGNofGN1YnJpZF9mZXRjaF9hcnJheXxjdWJyaWRfZmV0Y2hfYXNzb2N8Y3VicmlkX2ZldGNoX2ZpZWxkfGN1YnJpZF9mZXRjaF9sZW5ndGhzfGN1YnJpZF9mZXRjaF9vYmplY3R8Y3VicmlkX2ZldGNoX3Jvd3wnICsNCiAgICAgICAgJ2N1YnJpZF9maWVsZF9mbGFnc3xjdWJyaWRfZmllbGRfbGVufGN1YnJpZF9maWVsZF9uYW1lfGN1YnJpZF9maWVsZF9zZWVrfGN1YnJpZF9maWVsZF90YWJsZXxjdWJyaWRfZmllbGRfdHlwZXxjdWJyaWRfZnJlZV9yZXN1bHR8JyArDQogICAgICAgICdjdWJyaWRfZ2V0fGN1YnJpZF9nZXRfYXV0b2NvbW1pdHxjdWJyaWRfZ2V0X2NoYXJzZXR8Y3VicmlkX2dldF9jbGFzc19uYW1lfGN1YnJpZF9nZXRfY2xpZW50X2luZm98Y3VicmlkX2dldF9kYl9wYXJhbWV0ZXJ8JyArDQogICAgICAgICdjdWJyaWRfZ2V0X3NlcnZlcl9pbmZvfGN1YnJpZF9pbnNlcnRfaWR8Y3VicmlkX2lzX2luc3RhbmNlfGN1YnJpZF9saXN0X2Ric3xjdWJyaWRfbG9hZF9mcm9tX2dsb3xjdWJyaWRfbG9iX2Nsb3NlfGN1YnJpZF9sb2JfZXhwb3J0fCcgKw0KICAgICAgICAnY3VicmlkX2xvYl9nZXR8Y3VicmlkX2xvYl9zZW5kfGN1YnJpZF9sb2Jfc2l6ZXxjdWJyaWRfbG9ja19yZWFkfGN1YnJpZF9sb2NrX3dyaXRlfGN1YnJpZF9tb3ZlX2N1cnNvcnxjdWJyaWRfbmV3X2dsb3xjdWJyaWRfbmV4dF9yZXN1bHR8JyArDQogICAgICAgICdjdWJyaWRfbnVtX2NvbHN8Y3VicmlkX251bV9maWVsZHN8Y3VicmlkX251bV9yb3dzfGN1YnJpZF9waW5nfGN1YnJpZF9wcmVwYXJlfGN1YnJpZF9wdXR8Y3VicmlkX3F1ZXJ5fGN1YnJpZF9yZWFsX2VzY2FwZV9zdHJpbmd8JyArDQogICAgICAgICdjdWJyaWRfcmVzdWx0fGN1YnJpZF9yb2xsYmFja3xjdWJyaWRfc2F2ZV90b19nbG98Y3VicmlkX3NjaGVtYXxjdWJyaWRfc2VuZF9nbG98Y3VicmlkX3NlcV9kcm9wfGN1YnJpZF9zZXFfaW5zZXJ0fGN1YnJpZF9zZXFfcHV0fCcgKw0KICAgICAgICAnY3VicmlkX3NldF9hZGR8Y3VicmlkX3NldF9hdXRvY29tbWl0fGN1YnJpZF9zZXRfZGJfcGFyYW1ldGVyfGN1YnJpZF9zZXRfZHJvcHxjdWJyaWRfdW5idWZmZXJlZF9xdWVyeXxjdWJyaWRfdmVyc2lvbnxjdXJsX2Nsb3NlfCcgKw0KICAgICAgICAnY3VybF9jb3B5X2hhbmRsZXxjdXJsX2Vycm5vfGN1cmxfZXJyb3J8Y3VybF9leGVjfGN1cmxfZ2V0aW5mb3xjdXJsX2luaXR8Y3VybF9tdWx0aV9hZGRfaGFuZGxlfGN1cmxfbXVsdGlfY2xvc2V8Y3VybF9tdWx0aV9leGVjfCcgKw0KICAgICAgICAnY3VybF9tdWx0aV9nZXRjb250ZW50fGN1cmxfbXVsdGlfaW5mb19yZWFkfGN1cmxfbXVsdGlfaW5pdHxjdXJsX211bHRpX3JlbW92ZV9oYW5kbGV8Y3VybF9tdWx0aV9zZWxlY3R8Y3VybF9zZXRvcHR8Y3VybF9zZXRvcHRfYXJyYXl8JyArDQogICAgICAgICdjdXJsX3ZlcnNpb258Y3VycmVudHxjeXJ1c19hdXRoZW50aWNhdGV8Y3lydXNfYmluZHxjeXJ1c19jbG9zZXxjeXJ1c19jb25uZWN0fGN5cnVzX3F1ZXJ5fGN5cnVzX3VuYmluZHxkYXRlfGRhdGVfYWRkfGRhdGVfY3JlYXRlfCcgKw0KICAgICAgICAnZGF0ZV9jcmVhdGVfZnJvbV9mb3JtYXR8ZGF0ZV9kYXRlX3NldHxkYXRlX2RlZmF1bHRfdGltZXpvbmVfZ2V0fGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXR8ZGF0ZV9kaWZmfGRhdGVfZm9ybWF0fGRhdGVfZ2V0X2xhc3RfZXJyb3JzfCcgKw0KICAgICAgICAnZGF0ZV9pbnRlcnZhbF9jcmVhdGVfZnJvbV9kYXRlX3N0cmluZ3xkYXRlX2ludGVydmFsX2Zvcm1hdHxkYXRlX2lzb2RhdGVfc2V0fGRhdGVfbW9kaWZ5fGRhdGVfb2Zmc2V0X2dldHxkYXRlX3BhcnNlfGRhdGVfcGFyc2VfZnJvbV9mb3JtYXR8JyArDQogICAgICAgICdkYXRlX3N1YnxkYXRlX3N1bl9pbmZvfGRhdGVfc3VucmlzZXxkYXRlX3N1bnNldHxkYXRlX3RpbWVfc2V0fGRhdGVfdGltZXN0YW1wX2dldHxkYXRlX3RpbWVzdGFtcF9zZXR8ZGF0ZV90aW1lem9uZV9nZXR8ZGF0ZV90aW1lem9uZV9zZXR8JyArDQogICAgICAgICdkYXRlaW50ZXJ2YWx8ZGF0ZXBlcmlvZHxkYXRldGltZXxkYXRldGltZXpvbmV8ZGIyX2F1dG9jb21taXR8ZGIyX2JpbmRfcGFyYW18ZGIyX2NsaWVudF9pbmZvfGRiMl9jbG9zZXxkYjJfY29sdW1uX3ByaXZpbGVnZXN8ZGIyX2NvbHVtbnN8JyArDQogICAgICAgICdkYjJfY29tbWl0fGRiMl9jb25uX2Vycm9yfGRiMl9jb25uX2Vycm9ybXNnfGRiMl9jb25uZWN0fGRiMl9jdXJzb3JfdHlwZXxkYjJfZXNjYXBlX3N0cmluZ3xkYjJfZXhlY3xkYjJfZXhlY3V0ZXxkYjJfZmV0Y2hfYXJyYXl8JyArDQogICAgICAgICdkYjJfZmV0Y2hfYXNzb2N8ZGIyX2ZldGNoX2JvdGh8ZGIyX2ZldGNoX29iamVjdHxkYjJfZmV0Y2hfcm93fGRiMl9maWVsZF9kaXNwbGF5X3NpemV8ZGIyX2ZpZWxkX25hbWV8ZGIyX2ZpZWxkX251bXxkYjJfZmllbGRfcHJlY2lzaW9ufCcgKw0KICAgICAgICAnZGIyX2ZpZWxkX3NjYWxlfGRiMl9maWVsZF90eXBlfGRiMl9maWVsZF93aWR0aHxkYjJfZm9yZWlnbl9rZXlzfGRiMl9mcmVlX3Jlc3VsdHxkYjJfZnJlZV9zdG10fGRiMl9nZXRfb3B0aW9ufGRiMl9sYXN0X2luc2VydF9pZHwnICsNCiAgICAgICAgJ2RiMl9sb2JfcmVhZHxkYjJfbmV4dF9yZXN1bHR8ZGIyX251bV9maWVsZHN8ZGIyX251bV9yb3dzfGRiMl9wY2xvc2V8ZGIyX3Bjb25uZWN0fGRiMl9wcmVwYXJlfGRiMl9wcmltYXJ5X2tleXN8ZGIyX3Byb2NlZHVyZV9jb2x1bW5zfCcgKw0KICAgICAgICAnZGIyX3Byb2NlZHVyZXN8ZGIyX3Jlc3VsdHxkYjJfcm9sbGJhY2t8ZGIyX3NlcnZlcl9pbmZvfGRiMl9zZXRfb3B0aW9ufGRiMl9zcGVjaWFsX2NvbHVtbnN8ZGIyX3N0YXRpc3RpY3N8ZGIyX3N0bXRfZXJyb3J8ZGIyX3N0bXRfZXJyb3Jtc2d8JyArDQogICAgICAgICdkYjJfdGFibGVfcHJpdmlsZWdlc3xkYjJfdGFibGVzfGRiYV9jbG9zZXxkYmFfZGVsZXRlfGRiYV9leGlzdHN8ZGJhX2ZldGNofGRiYV9maXJzdGtleXxkYmFfaGFuZGxlcnN8ZGJhX2luc2VydHxkYmFfa2V5X3NwbGl0fGRiYV9saXN0fCcgKw0KICAgICAgICAnZGJhX25leHRrZXl8ZGJhX29wZW58ZGJhX29wdGltaXplfGRiYV9wb3BlbnxkYmFfcmVwbGFjZXxkYmFfc3luY3xkYmFzZV9hZGRfcmVjb3JkfGRiYXNlX2Nsb3NlfGRiYXNlX2NyZWF0ZXxkYmFzZV9kZWxldGVfcmVjb3JkfCcgKw0KICAgICAgICAnZGJhc2VfZ2V0X2hlYWRlcl9pbmZvfGRiYXNlX2dldF9yZWNvcmR8ZGJhc2VfZ2V0X3JlY29yZF93aXRoX25hbWVzfGRiYXNlX251bWZpZWxkc3xkYmFzZV9udW1yZWNvcmRzfGRiYXNlX29wZW58ZGJhc2VfcGFja3wnICsNCiAgICAgICAgJ2RiYXNlX3JlcGxhY2VfcmVjb3JkfGRicGx1c19hZGR8ZGJwbHVzX2FxbHxkYnBsdXNfY2hkaXJ8ZGJwbHVzX2Nsb3NlfGRicGx1c19jdXJyfGRicGx1c19lcnJjb2RlfGRicGx1c19lcnJub3xkYnBsdXNfZmluZHxkYnBsdXNfZmlyc3R8JyArDQogICAgICAgICdkYnBsdXNfZmx1c2h8ZGJwbHVzX2ZyZWVhbGxsb2Nrc3xkYnBsdXNfZnJlZWxvY2t8ZGJwbHVzX2ZyZWVybG9ja3N8ZGJwbHVzX2dldGxvY2t8ZGJwbHVzX2dldHVuaXF1ZXxkYnBsdXNfaW5mb3xkYnBsdXNfbGFzdHxkYnBsdXNfbG9ja3JlbHwnICsNCiAgICAgICAgJ2RicGx1c19uZXh0fGRicGx1c19vcGVufGRicGx1c19wcmV2fGRicGx1c19yY2hwZXJtfGRicGx1c19yY3JlYXRlfGRicGx1c19yY3J0ZXhhY3R8ZGJwbHVzX3JjcnRsaWtlfGRicGx1c19yZXNvbHZlfGRicGx1c19yZXN0b3JlcG9zfCcgKw0KICAgICAgICAnZGJwbHVzX3JrZXlzfGRicGx1c19yb3BlbnxkYnBsdXNfcnF1ZXJ5fGRicGx1c19ycmVuYW1lfGRicGx1c19yc2VjaW5kZXh8ZGJwbHVzX3J1bmxpbmt8ZGJwbHVzX3J6YXB8ZGJwbHVzX3NhdmVwb3N8ZGJwbHVzX3NldGluZGV4fCcgKw0KICAgICAgICAnZGJwbHVzX3NldGluZGV4YnludW1iZXJ8ZGJwbHVzX3NxbHxkYnBsdXNfdGNsfGRicGx1c190cmVtb3ZlfGRicGx1c191bmRvfGRicGx1c191bmRvcHJlcGFyZXxkYnBsdXNfdW5sb2NrcmVsfGRicGx1c191bnNlbGVjdHwnICsNCiAgICAgICAgJ2RicGx1c191cGRhdGV8ZGJwbHVzX3hsb2NrcmVsfGRicGx1c194dW5sb2NrcmVsfGRieF9jbG9zZXxkYnhfY29tcGFyZXxkYnhfY29ubmVjdHxkYnhfZXJyb3J8ZGJ4X2VzY2FwZV9zdHJpbmd8ZGJ4X2ZldGNoX3Jvd3xkYnhfcXVlcnl8JyArDQogICAgICAgICdkYnhfc29ydHxkY2dldHRleHR8ZGNuZ2V0dGV4dHxkZWFnZ3JlZ2F0ZXxkZWJ1Z19iYWNrdHJhY2V8ZGVidWdfcHJpbnRfYmFja3RyYWNlfGRlYnVnX3p2YWxfZHVtcHxkZWNiaW58ZGVjaGV4fGRlY29jdHxkZWZpbmV8JyArDQogICAgICAgICdkZWZpbmVfc3lzbG9nX3ZhcmlhYmxlc3xkZWZpbmVkfGRlZzJyYWR8ZGVsZXRlfGRnZXR0ZXh0fGRpZXxkaW9fY2xvc2V8ZGlvX2ZjbnRsfGRpb19vcGVufGRpb19yZWFkfGRpb19zZWVrfGRpb19zdGF0fGRpb190Y3NldGF0dHJ8JyArDQogICAgICAgICdkaW9fdHJ1bmNhdGV8ZGlvX3dyaXRlfGRpcnxkaXJlY3RvcnlpdGVyYXRvcnxkaXJuYW1lfGRpc2tfZnJlZV9zcGFjZXxkaXNrX3RvdGFsX3NwYWNlfGRpc2tmcmVlc3BhY2V8ZGx8ZG5nZXR0ZXh0fGRuc19jaGVja19yZWNvcmR8JyArDQogICAgICAgICdkbnNfZ2V0X214fGRuc19nZXRfcmVjb3JkfGRvbV9pbXBvcnRfc2ltcGxleG1sfGRvbWFpbmV4Y2VwdGlvbnxkb21hdHRyfGRvbWF0dHJpYnV0ZV9uYW1lfGRvbWF0dHJpYnV0ZV9zZXRfdmFsdWV8ZG9tYXR0cmlidXRlX3NwZWNpZmllZHwnICsNCiAgICAgICAgJ2RvbWF0dHJpYnV0ZV92YWx1ZXxkb21jaGFyYWN0ZXJkYXRhfGRvbWNvbW1lbnR8ZG9tZG9jdW1lbnR8ZG9tZG9jdW1lbnRfYWRkX3Jvb3R8ZG9tZG9jdW1lbnRfY3JlYXRlX2F0dHJpYnV0ZXwnICsNCiAgICAgICAgJ2RvbWRvY3VtZW50X2NyZWF0ZV9jZGF0YV9zZWN0aW9ufGRvbWRvY3VtZW50X2NyZWF0ZV9jb21tZW50fGRvbWRvY3VtZW50X2NyZWF0ZV9lbGVtZW50fGRvbWRvY3VtZW50X2NyZWF0ZV9lbGVtZW50X25zfCcgKw0KICAgICAgICAnZG9tZG9jdW1lbnRfY3JlYXRlX2VudGl0eV9yZWZlcmVuY2V8ZG9tZG9jdW1lbnRfY3JlYXRlX3Byb2Nlc3NpbmdfaW5zdHJ1Y3Rpb258ZG9tZG9jdW1lbnRfY3JlYXRlX3RleHRfbm9kZXxkb21kb2N1bWVudF9kb2N0eXBlfCcgKw0KICAgICAgICAnZG9tZG9jdW1lbnRfZG9jdW1lbnRfZWxlbWVudHxkb21kb2N1bWVudF9kdW1wX2ZpbGV8ZG9tZG9jdW1lbnRfZHVtcF9tZW18ZG9tZG9jdW1lbnRfZ2V0X2VsZW1lbnRfYnlfaWR8ZG9tZG9jdW1lbnRfZ2V0X2VsZW1lbnRzX2J5X3RhZ25hbWV8JyArDQogICAgICAgICdkb21kb2N1bWVudF9odG1sX2R1bXBfbWVtfGRvbWRvY3VtZW50X3hpbmNsdWRlfGRvbWRvY3VtZW50ZnJhZ21lbnR8ZG9tZG9jdW1lbnR0eXBlfGRvbWRvY3VtZW50dHlwZV9lbnRpdGllc3wnICsNCiAgICAgICAgJ2RvbWRvY3VtZW50dHlwZV9pbnRlcm5hbF9zdWJzZXR8ZG9tZG9jdW1lbnR0eXBlX25hbWV8ZG9tZG9jdW1lbnR0eXBlX25vdGF0aW9uc3xkb21kb2N1bWVudHR5cGVfcHVibGljX2lkfGRvbWRvY3VtZW50dHlwZV9zeXN0ZW1faWR8JyArDQogICAgICAgICdkb21lbGVtZW50fGRvbWVsZW1lbnRfZ2V0X2F0dHJpYnV0ZXxkb21lbGVtZW50X2dldF9hdHRyaWJ1dGVfbm9kZXxkb21lbGVtZW50X2dldF9lbGVtZW50c19ieV90YWduYW1lfGRvbWVsZW1lbnRfaGFzX2F0dHJpYnV0ZXwnICsNCiAgICAgICAgJ2RvbWVsZW1lbnRfcmVtb3ZlX2F0dHJpYnV0ZXxkb21lbGVtZW50X3NldF9hdHRyaWJ1dGV8ZG9tZWxlbWVudF9zZXRfYXR0cmlidXRlX25vZGV8ZG9tZWxlbWVudF90YWduYW1lfGRvbWVudGl0eXxkb21lbnRpdHlyZWZlcmVuY2V8JyArDQogICAgICAgICdkb21leGNlcHRpb258ZG9taW1wbGVtZW50YXRpb258ZG9tbmFtZWRub2RlbWFwfGRvbW5vZGV8ZG9tbm9kZV9hZGRfbmFtZXNwYWNlfGRvbW5vZGVfYXBwZW5kX2NoaWxkfGRvbW5vZGVfYXBwZW5kX3NpYmxpbmd8JyArDQogICAgICAgICdkb21ub2RlX2F0dHJpYnV0ZXN8ZG9tbm9kZV9jaGlsZF9ub2Rlc3xkb21ub2RlX2Nsb25lX25vZGV8ZG9tbm9kZV9kdW1wX25vZGV8ZG9tbm9kZV9maXJzdF9jaGlsZHxkb21ub2RlX2dldF9jb250ZW50fCcgKw0KICAgICAgICAnZG9tbm9kZV9oYXNfYXR0cmlidXRlc3xkb21ub2RlX2hhc19jaGlsZF9ub2Rlc3xkb21ub2RlX2luc2VydF9iZWZvcmV8ZG9tbm9kZV9pc19ibGFua19ub2RlfGRvbW5vZGVfbGFzdF9jaGlsZHxkb21ub2RlX25leHRfc2libGluZ3wnICsNCiAgICAgICAgJ2RvbW5vZGVfbm9kZV9uYW1lfGRvbW5vZGVfbm9kZV90eXBlfGRvbW5vZGVfbm9kZV92YWx1ZXxkb21ub2RlX293bmVyX2RvY3VtZW50fGRvbW5vZGVfcGFyZW50X25vZGV8ZG9tbm9kZV9wcmVmaXh8ZG9tbm9kZV9wcmV2aW91c19zaWJsaW5nfCcgKw0KICAgICAgICAnZG9tbm9kZV9yZW1vdmVfY2hpbGR8ZG9tbm9kZV9yZXBsYWNlX2NoaWxkfGRvbW5vZGVfcmVwbGFjZV9ub2RlfGRvbW5vZGVfc2V0X2NvbnRlbnR8ZG9tbm9kZV9zZXRfbmFtZXxkb21ub2RlX3NldF9uYW1lc3BhY2V8JyArDQogICAgICAgICdkb21ub2RlX3VubGlua19ub2RlfGRvbW5vZGVsaXN0fGRvbW5vdGF0aW9ufGRvbXByb2Nlc3NpbmdpbnN0cnVjdGlvbnxkb21wcm9jZXNzaW5naW5zdHJ1Y3Rpb25fZGF0YXxkb21wcm9jZXNzaW5naW5zdHJ1Y3Rpb25fdGFyZ2V0fCcgKw0KICAgICAgICAnZG9tdGV4dHxkb214bWxfbmV3X2RvY3xkb214bWxfb3Blbl9maWxlfGRvbXhtbF9vcGVuX21lbXxkb214bWxfdmVyc2lvbnxkb214bWxfeG1sdHJlZXxkb214bWxfeHNsdF9zdHlsZXNoZWV0fGRvbXhtbF94c2x0X3N0eWxlc2hlZXRfZG9jfCcgKw0KICAgICAgICAnZG9teG1sX3hzbHRfc3R5bGVzaGVldF9maWxlfGRvbXhtbF94c2x0X3ZlcnNpb258ZG9teHBhdGh8ZG9teHNsdHN0eWxlc2hlZXRfcHJvY2Vzc3xkb214c2x0c3R5bGVzaGVldF9yZXN1bHRfZHVtcF9maWxlfCcgKw0KICAgICAgICAnZG9teHNsdHN0eWxlc2hlZXRfcmVzdWx0X2R1bXBfbWVtfGRvdG5ldHxkb3RuZXRfbG9hZHxkb3VibGV2YWx8ZWFjaHxlYXN0ZXJfZGF0ZXxlYXN0ZXJfZGF5c3xlY2hvfGVtcHR5fGVtcHR5aXRlcmF0b3J8JyArDQogICAgICAgICdlbmNoYW50X2Jyb2tlcl9kZXNjcmliZXxlbmNoYW50X2Jyb2tlcl9kaWN0X2V4aXN0c3xlbmNoYW50X2Jyb2tlcl9mcmVlfGVuY2hhbnRfYnJva2VyX2ZyZWVfZGljdHxlbmNoYW50X2Jyb2tlcl9nZXRfZXJyb3J8JyArDQogICAgICAgICdlbmNoYW50X2Jyb2tlcl9pbml0fGVuY2hhbnRfYnJva2VyX2xpc3RfZGljdHN8ZW5jaGFudF9icm9rZXJfcmVxdWVzdF9kaWN0fGVuY2hhbnRfYnJva2VyX3JlcXVlc3RfcHdsX2RpY3R8ZW5jaGFudF9icm9rZXJfc2V0X29yZGVyaW5nfCcgKw0KICAgICAgICAnZW5jaGFudF9kaWN0X2FkZF90b19wZXJzb25hbHxlbmNoYW50X2RpY3RfYWRkX3RvX3Nlc3Npb258ZW5jaGFudF9kaWN0X2NoZWNrfGVuY2hhbnRfZGljdF9kZXNjcmliZXxlbmNoYW50X2RpY3RfZ2V0X2Vycm9yfCcgKw0KICAgICAgICAnZW5jaGFudF9kaWN0X2lzX2luX3Nlc3Npb258ZW5jaGFudF9kaWN0X3F1aWNrX2NoZWNrfGVuY2hhbnRfZGljdF9zdG9yZV9yZXBsYWNlbWVudHxlbmNoYW50X2RpY3Rfc3VnZ2VzdHxlbmR8ZXJlZ3xlcmVnX3JlcGxhY2V8ZXJlZ2l8JyArDQogICAgICAgICdlcmVnaV9yZXBsYWNlfGVycm9yX2dldF9sYXN0fGVycm9yX2xvZ3xlcnJvcl9yZXBvcnRpbmd8ZXJyb3JleGNlcHRpb258ZXNjYXBlc2hlbGxhcmd8ZXNjYXBlc2hlbGxjbWR8ZXZhbHxldmVudF9hZGR8ZXZlbnRfYmFzZV9mcmVlfCcgKw0KICAgICAgICAnZXZlbnRfYmFzZV9sb29wfGV2ZW50X2Jhc2VfbG9vcGJyZWFrfGV2ZW50X2Jhc2VfbG9vcGV4aXR8ZXZlbnRfYmFzZV9uZXd8ZXZlbnRfYmFzZV9wcmlvcml0eV9pbml0fGV2ZW50X2Jhc2Vfc2V0fGV2ZW50X2J1ZmZlcl9iYXNlX3NldHwnICsNCiAgICAgICAgJ2V2ZW50X2J1ZmZlcl9kaXNhYmxlfGV2ZW50X2J1ZmZlcl9lbmFibGV8ZXZlbnRfYnVmZmVyX2ZkX3NldHxldmVudF9idWZmZXJfZnJlZXxldmVudF9idWZmZXJfbmV3fGV2ZW50X2J1ZmZlcl9wcmlvcml0eV9zZXR8JyArDQogICAgICAgICdldmVudF9idWZmZXJfcmVhZHxldmVudF9idWZmZXJfc2V0X2NhbGxiYWNrfGV2ZW50X2J1ZmZlcl90aW1lb3V0X3NldHxldmVudF9idWZmZXJfd2F0ZXJtYXJrX3NldHxldmVudF9idWZmZXJfd3JpdGV8ZXZlbnRfZGVsfGV2ZW50X2ZyZWV8JyArDQogICAgICAgICdldmVudF9uZXd8ZXZlbnRfc2V0fGV4Y2VwdGlvbnxleGVjfGV4aWZfaW1hZ2V0eXBlfGV4aWZfcmVhZF9kYXRhfGV4aWZfdGFnbmFtZXxleGlmX3RodW1ibmFpbHxleGl0fGV4cHxleHBlY3RfZXhwZWN0bHxleHBlY3RfcG9wZW58ZXhwbG9kZXwnICsNCiAgICAgICAgJ2V4cG0xfGV4cG9ydHxleHBvcnR8ZXh0ZW5zaW9uX2xvYWRlZHxleHRyYWN0fGV6bWxtX2hhc2h8ZmFtX2NhbmNlbF9tb25pdG9yfGZhbV9jbG9zZXxmYW1fbW9uaXRvcl9jb2xsZWN0aW9ufGZhbV9tb25pdG9yX2RpcmVjdG9yeXwnICsNCiAgICAgICAgJ2ZhbV9tb25pdG9yX2ZpbGV8ZmFtX25leHRfZXZlbnR8ZmFtX29wZW58ZmFtX3BlbmRpbmd8ZmFtX3Jlc3VtZV9tb25pdG9yfGZhbV9zdXNwZW5kX21vbml0b3J8ZmJzcWxfYWZmZWN0ZWRfcm93c3xmYnNxbF9hdXRvY29tbWl0fCcgKw0KICAgICAgICAnZmJzcWxfYmxvYl9zaXplfGZic3FsX2NoYW5nZV91c2VyfGZic3FsX2Nsb2Jfc2l6ZXxmYnNxbF9jbG9zZXxmYnNxbF9jb21taXR8ZmJzcWxfY29ubmVjdHxmYnNxbF9jcmVhdGVfYmxvYnxmYnNxbF9jcmVhdGVfY2xvYnwnICsNCiAgICAgICAgJ2Zic3FsX2NyZWF0ZV9kYnxmYnNxbF9kYXRhX3NlZWt8ZmJzcWxfZGF0YWJhc2V8ZmJzcWxfZGF0YWJhc2VfcGFzc3dvcmR8ZmJzcWxfZGJfcXVlcnl8ZmJzcWxfZGJfc3RhdHVzfGZic3FsX2Ryb3BfZGJ8ZmJzcWxfZXJybm98JyArDQogICAgICAgICdmYnNxbF9lcnJvcnxmYnNxbF9mZXRjaF9hcnJheXxmYnNxbF9mZXRjaF9hc3NvY3xmYnNxbF9mZXRjaF9maWVsZHxmYnNxbF9mZXRjaF9sZW5ndGhzfGZic3FsX2ZldGNoX29iamVjdHxmYnNxbF9mZXRjaF9yb3d8JyArDQogICAgICAgICdmYnNxbF9maWVsZF9mbGFnc3xmYnNxbF9maWVsZF9sZW58ZmJzcWxfZmllbGRfbmFtZXxmYnNxbF9maWVsZF9zZWVrfGZic3FsX2ZpZWxkX3RhYmxlfGZic3FsX2ZpZWxkX3R5cGV8ZmJzcWxfZnJlZV9yZXN1bHR8JyArDQogICAgICAgICdmYnNxbF9nZXRfYXV0b3N0YXJ0X2luZm98ZmJzcWxfaG9zdG5hbWV8ZmJzcWxfaW5zZXJ0X2lkfGZic3FsX2xpc3RfZGJzfGZic3FsX2xpc3RfZmllbGRzfGZic3FsX2xpc3RfdGFibGVzfGZic3FsX25leHRfcmVzdWx0fCcgKw0KICAgICAgICAnZmJzcWxfbnVtX2ZpZWxkc3xmYnNxbF9udW1fcm93c3xmYnNxbF9wYXNzd29yZHxmYnNxbF9wY29ubmVjdHxmYnNxbF9xdWVyeXxmYnNxbF9yZWFkX2Jsb2J8ZmJzcWxfcmVhZF9jbG9ifGZic3FsX3Jlc3VsdHxmYnNxbF9yb2xsYmFja3wnICsNCiAgICAgICAgJ2Zic3FsX3Jvd3NfZmV0Y2hlZHxmYnNxbF9zZWxlY3RfZGJ8ZmJzcWxfc2V0X2NoYXJhY3RlcnNldHxmYnNxbF9zZXRfbG9iX21vZGV8ZmJzcWxfc2V0X3Bhc3N3b3JkfGZic3FsX3NldF90cmFuc2FjdGlvbnxmYnNxbF9zdGFydF9kYnwnICsNCiAgICAgICAgJ2Zic3FsX3N0b3BfZGJ8ZmJzcWxfdGFibGVfbmFtZXxmYnNxbF90YWJsZW5hbWV8ZmJzcWxfdXNlcm5hbWV8ZmJzcWxfd2FybmluZ3N8ZmNsb3NlfGZkZl9hZGRfZG9jX2phdmFzY3JpcHR8ZmRmX2FkZF90ZW1wbGF0ZXxmZGZfY2xvc2V8JyArDQogICAgICAgICdmZGZfY3JlYXRlfGZkZl9lbnVtX3ZhbHVlc3xmZGZfZXJybm98ZmRmX2Vycm9yfGZkZl9nZXRfYXB8ZmRmX2dldF9hdHRhY2htZW50fGZkZl9nZXRfZW5jb2Rpbmd8ZmRmX2dldF9maWxlfGZkZl9nZXRfZmxhZ3N8ZmRmX2dldF9vcHR8JyArDQogICAgICAgICdmZGZfZ2V0X3N0YXR1c3xmZGZfZ2V0X3ZhbHVlfGZkZl9nZXRfdmVyc2lvbnxmZGZfaGVhZGVyfGZkZl9uZXh0X2ZpZWxkX25hbWV8ZmRmX29wZW58ZmRmX29wZW5fc3RyaW5nfGZkZl9yZW1vdmVfaXRlbXxmZGZfc2F2ZXwnICsNCiAgICAgICAgJ2ZkZl9zYXZlX3N0cmluZ3xmZGZfc2V0X2FwfGZkZl9zZXRfZW5jb2Rpbmd8ZmRmX3NldF9maWxlfGZkZl9zZXRfZmxhZ3N8ZmRmX3NldF9qYXZhc2NyaXB0X2FjdGlvbnxmZGZfc2V0X29uX2ltcG9ydF9qYXZhc2NyaXB0fGZkZl9zZXRfb3B0fCcgKw0KICAgICAgICAnZmRmX3NldF9zdGF0dXN8ZmRmX3NldF9zdWJtaXRfZm9ybV9hY3Rpb258ZmRmX3NldF90YXJnZXRfZnJhbWV8ZmRmX3NldF92YWx1ZXxmZGZfc2V0X3ZlcnNpb258ZmVvZnxmZmx1c2h8ZmdldGN8ZmdldGNzdnxmZ2V0c3xmZ2V0c3N8ZmlsZXwnICsNCiAgICAgICAgJ2ZpbGVfZXhpc3RzfGZpbGVfZ2V0X2NvbnRlbnRzfGZpbGVfcHV0X2NvbnRlbnRzfGZpbGVhdGltZXxmaWxlY3RpbWV8ZmlsZWdyb3VwfGZpbGVpbm9kZXxmaWxlbXRpbWV8ZmlsZW93bmVyfGZpbGVwZXJtc3xmaWxlcHJvfCcgKw0KICAgICAgICAnZmlsZXByb19maWVsZGNvdW50fGZpbGVwcm9fZmllbGRuYW1lfGZpbGVwcm9fZmllbGR0eXBlfGZpbGVwcm9fZmllbGR3aWR0aHxmaWxlcHJvX3JldHJpZXZlfGZpbGVwcm9fcm93Y291bnR8ZmlsZXNpemV8ZmlsZXN5c3RlbWl0ZXJhdG9yfCcgKw0KICAgICAgICAnZmlsZXR5cGV8ZmlsdGVyX2hhc192YXJ8ZmlsdGVyX2lkfGZpbHRlcl9pbnB1dHxmaWx0ZXJfaW5wdXRfYXJyYXl8ZmlsdGVyX2xpc3R8ZmlsdGVyX3ZhcnxmaWx0ZXJfdmFyX2FycmF5fGZpbHRlcml0ZXJhdG9yfGZpbmZvX2J1ZmZlcnwnICsNCiAgICAgICAgJ2ZpbmZvX2Nsb3NlfGZpbmZvX2ZpbGV8ZmluZm9fb3BlbnxmaW5mb19zZXRfZmxhZ3N8ZmxvYXR2YWx8ZmxvY2t8Zmxvb3J8Zmx1c2h8Zm1vZHxmbm1hdGNofGZvcGVufGZvcndhcmRfc3RhdGljX2NhbGx8JyArDQogICAgICAgICdmb3J3YXJkX3N0YXRpY19jYWxsX2FycmF5fGZwYXNzdGhydXxmcHJpbnRmfGZwdXRjc3Z8ZnB1dHN8ZnJlYWR8ZnJlbmNodG9qZHxmcmliaWRpX2xvZzJ2aXN8ZnNjYW5mfGZzZWVrfGZzb2Nrb3Blbnxmc3RhdHxmdGVsbHxmdG9rfCcgKw0KICAgICAgICAnZnRwX2FsbG9jfGZ0cF9jZHVwfGZ0cF9jaGRpcnxmdHBfY2htb2R8ZnRwX2Nsb3NlfGZ0cF9jb25uZWN0fGZ0cF9kZWxldGV8ZnRwX2V4ZWN8ZnRwX2ZnZXR8ZnRwX2ZwdXR8ZnRwX2dldHxmdHBfZ2V0X29wdGlvbnxmdHBfbG9naW58JyArDQogICAgICAgICdmdHBfbWR0bXxmdHBfbWtkaXJ8ZnRwX25iX2NvbnRpbnVlfGZ0cF9uYl9mZ2V0fGZ0cF9uYl9mcHV0fGZ0cF9uYl9nZXR8ZnRwX25iX3B1dHxmdHBfbmxpc3R8ZnRwX3Bhc3Z8ZnRwX3B1dHxmdHBfcHdkfGZ0cF9xdWl0fGZ0cF9yYXd8JyArDQogICAgICAgICdmdHBfcmF3bGlzdHxmdHBfcmVuYW1lfGZ0cF9ybWRpcnxmdHBfc2V0X29wdGlvbnxmdHBfc2l0ZXxmdHBfc2l6ZXxmdHBfc3NsX2Nvbm5lY3R8ZnRwX3N5c3R5cGV8ZnRydW5jYXRlfGZ1bmNfZ2V0X2FyZ3xmdW5jX2dldF9hcmdzfCcgKw0KICAgICAgICAnZnVuY19udW1fYXJnc3xmdW5jdGlvbl9leGlzdHN8ZndyaXRlfGdjX2NvbGxlY3RfY3ljbGVzfGdjX2Rpc2FibGV8Z2NfZW5hYmxlfGdjX2VuYWJsZWR8Z2RfaW5mb3xnZWFybWFuY2xpZW50fGdlYXJtYW5qb2J8Z2Vhcm1hbnRhc2t8JyArDQogICAgICAgICdnZWFybWFud29ya2VyfGdlb2lwX2NvbnRpbmVudF9jb2RlX2J5X25hbWV8Z2VvaXBfY291bnRyeV9jb2RlM19ieV9uYW1lfGdlb2lwX2NvdW50cnlfY29kZV9ieV9uYW1lfGdlb2lwX2NvdW50cnlfbmFtZV9ieV9uYW1lfCcgKw0KICAgICAgICAnZ2VvaXBfZGF0YWJhc2VfaW5mb3xnZW9pcF9kYl9hdmFpbHxnZW9pcF9kYl9maWxlbmFtZXxnZW9pcF9kYl9nZXRfYWxsX2luZm98Z2VvaXBfaWRfYnlfbmFtZXxnZW9pcF9pc3BfYnlfbmFtZXxnZW9pcF9vcmdfYnlfbmFtZXwnICsNCiAgICAgICAgJ2dlb2lwX3JlY29yZF9ieV9uYW1lfGdlb2lwX3JlZ2lvbl9ieV9uYW1lfGdlb2lwX3JlZ2lvbl9uYW1lX2J5X2NvZGV8Z2VvaXBfdGltZV96b25lX2J5X2NvdW50cnlfYW5kX3JlZ2lvbnxnZXRNZXRhfGdldE5hbWVkfGdldFZhbHVlfCcgKw0KICAgICAgICAnZ2V0X2Jyb3dzZXJ8Z2V0X2NhbGxlZF9jbGFzc3xnZXRfY2ZnX3ZhcnxnZXRfY2xhc3N8Z2V0X2NsYXNzX21ldGhvZHN8Z2V0X2NsYXNzX3ZhcnN8Z2V0X2N1cnJlbnRfdXNlcnxnZXRfZGVjbGFyZWRfY2xhc3Nlc3wnICsNCiAgICAgICAgJ2dldF9kZWNsYXJlZF9pbnRlcmZhY2VzfGdldF9kZWZpbmVkX2NvbnN0YW50c3xnZXRfZGVmaW5lZF9mdW5jdGlvbnN8Z2V0X2RlZmluZWRfdmFyc3xnZXRfZXh0ZW5zaW9uX2Z1bmNzfGdldF9oZWFkZXJzfCcgKw0KICAgICAgICAnZ2V0X2h0bWxfdHJhbnNsYXRpb25fdGFibGV8Z2V0X2luY2x1ZGVfcGF0aHxnZXRfaW5jbHVkZWRfZmlsZXN8Z2V0X2xvYWRlZF9leHRlbnNpb25zfGdldF9tYWdpY19xdW90ZXNfZ3BjfGdldF9tYWdpY19xdW90ZXNfcnVudGltZXwnICsNCiAgICAgICAgJ2dldF9tZXRhX3RhZ3N8Z2V0X29iamVjdF92YXJzfGdldF9wYXJlbnRfY2xhc3N8Z2V0X3JlcXVpcmVkX2ZpbGVzfGdldF9yZXNvdXJjZV90eXBlfGdldGFsbGhlYWRlcnN8Z2V0Y29uc3RhbnR8Z2V0Y29uc3RhbnRzfGdldGNvbnN0cnVjdG9yfCcgKw0KICAgICAgICAnZ2V0Y3dkfGdldGRhdGV8Z2V0ZGVmYXVsdHByb3BlcnRpZXN8Z2V0ZG9jY29tbWVudHxnZXRlbmRsaW5lfGdldGVudnxnZXRleHRlbnNpb258Z2V0ZXh0ZW5zaW9ubmFtZXxnZXRmaWxlbmFtZXxnZXRob3N0YnlhZGRyfGdldGhvc3RieW5hbWV8JyArDQogICAgICAgICdnZXRob3N0YnluYW1lbHxnZXRob3N0bmFtZXxnZXRpbWFnZXNpemV8Z2V0aW50ZXJmYWNlbmFtZXN8Z2V0aW50ZXJmYWNlc3xnZXRsYXN0bW9kfGdldG1ldGhvZHxnZXRtZXRob2RzfGdldG1vZGlmaWVyc3xnZXRteHJyfGdldG15Z2lkfCcgKw0KICAgICAgICAnZ2V0bXlpbm9kZXxnZXRteXBpZHxnZXRteXVpZHxnZXRuYW1lfGdldG5hbWVzcGFjZW5hbWV8Z2V0b3B0fGdldHBhcmVudGNsYXNzfGdldHByb3BlcnRpZXN8Z2V0cHJvcGVydHl8Z2V0cHJvdG9ieW5hbWV8Z2V0cHJvdG9ieW51bWJlcnwnICsNCiAgICAgICAgJ2dldHJhbmRtYXh8Z2V0cnVzYWdlfGdldHNlcnZieW5hbWV8Z2V0c2VydmJ5cG9ydHxnZXRzaG9ydG5hbWV8Z2V0c3RhcnRsaW5lfGdldHN0YXRpY3Byb3BlcnRpZXN8Z2V0c3RhdGljcHJvcGVydHl2YWx1ZXxnZXR0ZXh0fCcgKw0KICAgICAgICAnZ2V0dGltZW9mZGF5fGdldHR5cGV8Z2xvYnxnbG9iaXRlcmF0b3J8Z21hZ2lja3xnbWFnaWNrZHJhd3xnbWFnaWNrcGl4ZWx8Z21kYXRlfGdtbWt0aW1lfGdtcF9hYnN8Z21wX2FkZHxnbXBfYW5kfGdtcF9jbHJiaXR8Z21wX2NtcHwnICsNCiAgICAgICAgJ2dtcF9jb218Z21wX2RpdnxnbXBfZGl2X3F8Z21wX2Rpdl9xcnxnbXBfZGl2X3J8Z21wX2RpdmV4YWN0fGdtcF9mYWN0fGdtcF9nY2R8Z21wX2djZGV4dHxnbXBfaGFtZGlzdHxnbXBfaW5pdHxnbXBfaW50dmFsfGdtcF9pbnZlcnR8JyArDQogICAgICAgICdnbXBfamFjb2JpfGdtcF9sZWdlbmRyZXxnbXBfbW9kfGdtcF9tdWx8Z21wX25lZ3xnbXBfbmV4dHByaW1lfGdtcF9vcnxnbXBfcGVyZmVjdF9zcXVhcmV8Z21wX3BvcGNvdW50fGdtcF9wb3d8Z21wX3Bvd218Z21wX3Byb2JfcHJpbWV8JyArDQogICAgICAgICdnbXBfcmFuZG9tfGdtcF9zY2FuMHxnbXBfc2NhbjF8Z21wX3NldGJpdHxnbXBfc2lnbnxnbXBfc3FydHxnbXBfc3FydHJlbXxnbXBfc3RydmFsfGdtcF9zdWJ8Z21wX3Rlc3RiaXR8Z21wX3hvcnxnbXN0cmZ0aW1lfCcgKw0KICAgICAgICAnZ251cGdfYWRkZGVjcnlwdGtleXxnbnVwZ19hZGRlbmNyeXB0a2V5fGdudXBnX2FkZHNpZ25rZXl8Z251cGdfY2xlYXJkZWNyeXB0a2V5c3xnbnVwZ19jbGVhcmVuY3J5cHRrZXlzfGdudXBnX2NsZWFyc2lnbmtleXN8Z251cGdfZGVjcnlwdHwnICsNCiAgICAgICAgJ2dudXBnX2RlY3J5cHR2ZXJpZnl8Z251cGdfZW5jcnlwdHxnbnVwZ19lbmNyeXB0c2lnbnxnbnVwZ19leHBvcnR8Z251cGdfZ2V0ZXJyb3J8Z251cGdfZ2V0cHJvdG9jb2x8Z251cGdfaW1wb3J0fGdudXBnX2luaXR8Z251cGdfa2V5aW5mb3wnICsNCiAgICAgICAgJ2dudXBnX3NldGFybW9yfGdudXBnX3NldGVycm9ybW9kZXxnbnVwZ19zZXRzaWdubW9kZXxnbnVwZ19zaWdufGdudXBnX3ZlcmlmeXxnb3BoZXJfcGFyc2VkaXJ8Z3JhcGhlbWVfZXh0cmFjdHxncmFwaGVtZV9zdHJpcG9zfCcgKw0KICAgICAgICAnZ3JhcGhlbWVfc3RyaXN0cnxncmFwaGVtZV9zdHJsZW58Z3JhcGhlbWVfc3RycG9zfGdyYXBoZW1lX3N0cnJpcG9zfGdyYXBoZW1lX3N0cnJwb3N8Z3JhcGhlbWVfc3Ryc3RyfGdyYXBoZW1lX3N1YnN0cnxncmVnb3JpYW50b2pkfCcgKw0KICAgICAgICAnZ3VwbnBfY29udGV4dF9nZXRfaG9zdF9pcHxndXBucF9jb250ZXh0X2dldF9wb3J0fGd1cG5wX2NvbnRleHRfZ2V0X3N1YnNjcmlwdGlvbl90aW1lb3V0fGd1cG5wX2NvbnRleHRfaG9zdF9wYXRofGd1cG5wX2NvbnRleHRfbmV3fCcgKw0KICAgICAgICAnZ3VwbnBfY29udGV4dF9zZXRfc3Vic2NyaXB0aW9uX3RpbWVvdXR8Z3VwbnBfY29udGV4dF90aW1lb3V0X2FkZHxndXBucF9jb250ZXh0X3VuaG9zdF9wYXRofGd1cG5wX2NvbnRyb2xfcG9pbnRfYnJvd3NlX3N0YXJ0fCcgKw0KICAgICAgICAnZ3VwbnBfY29udHJvbF9wb2ludF9icm93c2Vfc3RvcHxndXBucF9jb250cm9sX3BvaW50X2NhbGxiYWNrX3NldHxndXBucF9jb250cm9sX3BvaW50X25ld3xndXBucF9kZXZpY2VfYWN0aW9uX2NhbGxiYWNrX3NldHwnICsNCiAgICAgICAgJ2d1cG5wX2RldmljZV9pbmZvX2dldHxndXBucF9kZXZpY2VfaW5mb19nZXRfc2VydmljZXxndXBucF9yb290X2RldmljZV9nZXRfYXZhaWxhYmxlfGd1cG5wX3Jvb3RfZGV2aWNlX2dldF9yZWxhdGl2ZV9sb2NhdGlvbnwnICsNCiAgICAgICAgJ2d1cG5wX3Jvb3RfZGV2aWNlX25ld3xndXBucF9yb290X2RldmljZV9zZXRfYXZhaWxhYmxlfGd1cG5wX3Jvb3RfZGV2aWNlX3N0YXJ0fGd1cG5wX3Jvb3RfZGV2aWNlX3N0b3B8Z3VwbnBfc2VydmljZV9hY3Rpb25fZ2V0fCcgKw0KICAgICAgICAnZ3VwbnBfc2VydmljZV9hY3Rpb25fcmV0dXJufGd1cG5wX3NlcnZpY2VfYWN0aW9uX3JldHVybl9lcnJvcnxndXBucF9zZXJ2aWNlX2FjdGlvbl9zZXR8Z3VwbnBfc2VydmljZV9mcmVlemVfbm90aWZ5fGd1cG5wX3NlcnZpY2VfaW5mb19nZXR8JyArDQogICAgICAgICdndXBucF9zZXJ2aWNlX2luZm9fZ2V0X2ludHJvc3BlY3Rpb258Z3VwbnBfc2VydmljZV9pbnRyb3NwZWN0aW9uX2dldF9zdGF0ZV92YXJpYWJsZXxndXBucF9zZXJ2aWNlX25vdGlmeXxndXBucF9zZXJ2aWNlX3Byb3h5X2FjdGlvbl9nZXR8JyArDQogICAgICAgICdndXBucF9zZXJ2aWNlX3Byb3h5X2FjdGlvbl9zZXR8Z3VwbnBfc2VydmljZV9wcm94eV9hZGRfbm90aWZ5fGd1cG5wX3NlcnZpY2VfcHJveHlfY2FsbGJhY2tfc2V0fGd1cG5wX3NlcnZpY2VfcHJveHlfZ2V0X3N1YnNjcmliZWR8JyArDQogICAgICAgICdndXBucF9zZXJ2aWNlX3Byb3h5X3JlbW92ZV9ub3RpZnl8Z3VwbnBfc2VydmljZV9wcm94eV9zZXRfc3Vic2NyaWJlZHxndXBucF9zZXJ2aWNlX3RoYXdfbm90aWZ5fGd6Y2xvc2V8Z3pjb21wcmVzc3xnemRlY29kZXxnemRlZmxhdGV8JyArDQogICAgICAgICdnemVuY29kZXxnemVvZnxnemZpbGV8Z3pnZXRjfGd6Z2V0c3xnemdldHNzfGd6aW5mbGF0ZXxnem9wZW58Z3pwYXNzdGhydXxnenB1dHN8Z3pyZWFkfGd6cmV3aW5kfGd6c2Vla3xnenRlbGx8Z3p1bmNvbXByZXNzfGd6d3JpdGV8JyArDQogICAgICAgICdoYWx0X2NvbXBpbGVyfGhhcnVhbm5vdGF0aW9ufGhhcnVhbm5vdGF0aW9uX3NldGJvcmRlcnN0eWxlfGhhcnVhbm5vdGF0aW9uX3NldGhpZ2hsaWdodG1vZGV8aGFydWFubm90YXRpb25fc2V0aWNvbnwnICsNCiAgICAgICAgJ2hhcnVhbm5vdGF0aW9uX3NldG9wZW5lZHxoYXJ1ZGVzdGluYXRpb258aGFydWRlc3RpbmF0aW9uX3NldGZpdHxoYXJ1ZGVzdGluYXRpb25fc2V0Zml0YnxoYXJ1ZGVzdGluYXRpb25fc2V0Zml0Ymh8aGFydWRlc3RpbmF0aW9uX3NldGZpdGJ2fCcgKw0KICAgICAgICAnaGFydWRlc3RpbmF0aW9uX3NldGZpdGh8aGFydWRlc3RpbmF0aW9uX3NldGZpdHJ8aGFydWRlc3RpbmF0aW9uX3NldGZpdHZ8aGFydWRlc3RpbmF0aW9uX3NldHh5enxoYXJ1ZG9jfGhhcnVkb2NfYWRkcGFnZXwnICsNCiAgICAgICAgJ2hhcnVkb2NfYWRkcGFnZWxhYmVsfGhhcnVkb2NfY29uc3RydWN0fGhhcnVkb2NfY3JlYXRlb3V0bGluZXxoYXJ1ZG9jX2dldGN1cnJlbnRlbmNvZGVyfGhhcnVkb2NfZ2V0Y3VycmVudHBhZ2V8aGFydWRvY19nZXRlbmNvZGVyfCcgKw0KICAgICAgICAnaGFydWRvY19nZXRmb250fGhhcnVkb2NfZ2V0aW5mb2F0dHJ8aGFydWRvY19nZXRwYWdlbGF5b3V0fGhhcnVkb2NfZ2V0cGFnZW1vZGV8aGFydWRvY19nZXRzdHJlYW1zaXplfGhhcnVkb2NfaW5zZXJ0cGFnZXxoYXJ1ZG9jX2xvYWRqcGVnfCcgKw0KICAgICAgICAnaGFydWRvY19sb2FkcG5nfGhhcnVkb2NfbG9hZHJhd3xoYXJ1ZG9jX2xvYWR0dGN8aGFydWRvY19sb2FkdHRmfGhhcnVkb2NfbG9hZHR5cGUxfGhhcnVkb2Nfb3V0cHV0fGhhcnVkb2NfcmVhZGZyb21zdHJlYW18JyArDQogICAgICAgICdoYXJ1ZG9jX3Jlc2V0ZXJyb3J8aGFydWRvY19yZXNldHN0cmVhbXxoYXJ1ZG9jX3NhdmV8aGFydWRvY19zYXZldG9zdHJlYW18aGFydWRvY19zZXRjb21wcmVzc2lvbm1vZGV8aGFydWRvY19zZXRjdXJyZW50ZW5jb2RlcnwnICsNCiAgICAgICAgJ2hhcnVkb2Nfc2V0ZW5jcnlwdGlvbm1vZGV8aGFydWRvY19zZXRpbmZvYXR0cnxoYXJ1ZG9jX3NldGluZm9kYXRlYXR0cnxoYXJ1ZG9jX3NldG9wZW5hY3Rpb258aGFydWRvY19zZXRwYWdlbGF5b3V0fGhhcnVkb2Nfc2V0cGFnZW1vZGV8JyArDQogICAgICAgICdoYXJ1ZG9jX3NldHBhZ2VzY29uZmlndXJhdGlvbnxoYXJ1ZG9jX3NldHBhc3N3b3JkfGhhcnVkb2Nfc2V0cGVybWlzc2lvbnxoYXJ1ZG9jX3VzZWNuc2VuY29kaW5nc3xoYXJ1ZG9jX3VzZWNuc2ZvbnRzfCcgKw0KICAgICAgICAnaGFydWRvY191c2VjbnRlbmNvZGluZ3N8aGFydWRvY191c2VjbnRmb250c3xoYXJ1ZG9jX3VzZWpwZW5jb2RpbmdzfGhhcnVkb2NfdXNlanBmb250c3xoYXJ1ZG9jX3VzZWtyZW5jb2RpbmdzfGhhcnVkb2NfdXNla3Jmb250c3wnICsNCiAgICAgICAgJ2hhcnVlbmNvZGVyfGhhcnVlbmNvZGVyX2dldGJ5dGV0eXBlfGhhcnVlbmNvZGVyX2dldHR5cGV8aGFydWVuY29kZXJfZ2V0dW5pY29kZXxoYXJ1ZW5jb2Rlcl9nZXR3cml0aW5nbW9kZXxoYXJ1ZXhjZXB0aW9ufGhhcnVmb250fCcgKw0KICAgICAgICAnaGFydWZvbnRfZ2V0YXNjZW50fGhhcnVmb250X2dldGNhcGhlaWdodHxoYXJ1Zm9udF9nZXRkZXNjZW50fGhhcnVmb250X2dldGVuY29kaW5nbmFtZXxoYXJ1Zm9udF9nZXRmb250bmFtZXxoYXJ1Zm9udF9nZXR0ZXh0d2lkdGh8JyArDQogICAgICAgICdoYXJ1Zm9udF9nZXR1bmljb2Rld2lkdGh8aGFydWZvbnRfZ2V0eGhlaWdodHxoYXJ1Zm9udF9tZWFzdXJldGV4dHxoYXJ1aW1hZ2V8aGFydWltYWdlX2dldGJpdHNwZXJjb21wb25lbnR8aGFydWltYWdlX2dldGNvbG9yc3BhY2V8JyArDQogICAgICAgICdoYXJ1aW1hZ2VfZ2V0aGVpZ2h0fGhhcnVpbWFnZV9nZXRzaXplfGhhcnVpbWFnZV9nZXR3aWR0aHxoYXJ1aW1hZ2Vfc2V0Y29sb3JtYXNrfGhhcnVpbWFnZV9zZXRtYXNraW1hZ2V8aGFydW91dGxpbmV8JyArDQogICAgICAgICdoYXJ1b3V0bGluZV9zZXRkZXN0aW5hdGlvbnxoYXJ1b3V0bGluZV9zZXRvcGVuZWR8aGFydXBhZ2V8aGFydXBhZ2VfYXJjfGhhcnVwYWdlX2JlZ2ludGV4dHxoYXJ1cGFnZV9jaXJjbGV8aGFydXBhZ2VfY2xvc2VwYXRofCcgKw0KICAgICAgICAnaGFydXBhZ2VfY29uY2F0fGhhcnVwYWdlX2NyZWF0ZWRlc3RpbmF0aW9ufGhhcnVwYWdlX2NyZWF0ZWxpbmthbm5vdGF0aW9ufGhhcnVwYWdlX2NyZWF0ZXRleHRhbm5vdGF0aW9ufGhhcnVwYWdlX2NyZWF0ZXVybGFubm90YXRpb258JyArDQogICAgICAgICdoYXJ1cGFnZV9jdXJ2ZXRvfGhhcnVwYWdlX2N1cnZldG8yfGhhcnVwYWdlX2N1cnZldG8zfGhhcnVwYWdlX2RyYXdpbWFnZXxoYXJ1cGFnZV9lbGxpcHNlfGhhcnVwYWdlX2VuZHBhdGh8aGFydXBhZ2VfZW5kdGV4dHwnICsNCiAgICAgICAgJ2hhcnVwYWdlX2VvZmlsbHxoYXJ1cGFnZV9lb2ZpbGxzdHJva2V8aGFydXBhZ2VfZmlsbHxoYXJ1cGFnZV9maWxsc3Ryb2tlfGhhcnVwYWdlX2dldGNoYXJzcGFjZXxoYXJ1cGFnZV9nZXRjbXlrZmlsbHxoYXJ1cGFnZV9nZXRjbXlrc3Ryb2tlfCcgKw0KICAgICAgICAnaGFydXBhZ2VfZ2V0Y3VycmVudGZvbnR8aGFydXBhZ2VfZ2V0Y3VycmVudGZvbnRzaXplfGhhcnVwYWdlX2dldGN1cnJlbnRwb3N8aGFydXBhZ2VfZ2V0Y3VycmVudHRleHRwb3N8aGFydXBhZ2VfZ2V0ZGFzaHwnICsNCiAgICAgICAgJ2hhcnVwYWdlX2dldGZpbGxpbmdjb2xvcnNwYWNlfGhhcnVwYWdlX2dldGZsYXRuZXNzfGhhcnVwYWdlX2dldGdtb2RlfGhhcnVwYWdlX2dldGdyYXlmaWxsfGhhcnVwYWdlX2dldGdyYXlzdHJva2V8aGFydXBhZ2VfZ2V0aGVpZ2h0fCcgKw0KICAgICAgICAnaGFydXBhZ2VfZ2V0aG9yaXpvbnRhbHNjYWxpbmd8aGFydXBhZ2VfZ2V0bGluZWNhcHxoYXJ1cGFnZV9nZXRsaW5lam9pbnxoYXJ1cGFnZV9nZXRsaW5ld2lkdGh8aGFydXBhZ2VfZ2V0bWl0ZXJsaW1pdHxoYXJ1cGFnZV9nZXRyZ2JmaWxsfCcgKw0KICAgICAgICAnaGFydXBhZ2VfZ2V0cmdic3Ryb2tlfGhhcnVwYWdlX2dldHN0cm9raW5nY29sb3JzcGFjZXxoYXJ1cGFnZV9nZXR0ZXh0bGVhZGluZ3xoYXJ1cGFnZV9nZXR0ZXh0bWF0cml4fGhhcnVwYWdlX2dldHRleHRyZW5kZXJpbmdtb2RlfCcgKw0KICAgICAgICAnaGFydXBhZ2VfZ2V0dGV4dHJpc2V8aGFydXBhZ2VfZ2V0dGV4dHdpZHRofGhhcnVwYWdlX2dldHRyYW5zbWF0cml4fGhhcnVwYWdlX2dldHdpZHRofGhhcnVwYWdlX2dldHdvcmRzcGFjZXxoYXJ1cGFnZV9saW5ldG98JyArDQogICAgICAgICdoYXJ1cGFnZV9tZWFzdXJldGV4dHxoYXJ1cGFnZV9tb3ZldGV4dHBvc3xoYXJ1cGFnZV9tb3ZldG98aGFydXBhZ2VfbW92ZXRvbmV4dGxpbmV8aGFydXBhZ2VfcmVjdGFuZ2xlfGhhcnVwYWdlX3NldGNoYXJzcGFjZXwnICsNCiAgICAgICAgJ2hhcnVwYWdlX3NldGNteWtmaWxsfGhhcnVwYWdlX3NldGNteWtzdHJva2V8aGFydXBhZ2Vfc2V0ZGFzaHxoYXJ1cGFnZV9zZXRmbGF0bmVzc3xoYXJ1cGFnZV9zZXRmb250YW5kc2l6ZXxoYXJ1cGFnZV9zZXRncmF5ZmlsbHwnICsNCiAgICAgICAgJ2hhcnVwYWdlX3NldGdyYXlzdHJva2V8aGFydXBhZ2Vfc2V0aGVpZ2h0fGhhcnVwYWdlX3NldGhvcml6b250YWxzY2FsaW5nfGhhcnVwYWdlX3NldGxpbmVjYXB8aGFydXBhZ2Vfc2V0bGluZWpvaW58aGFydXBhZ2Vfc2V0bGluZXdpZHRofCcgKw0KICAgICAgICAnaGFydXBhZ2Vfc2V0bWl0ZXJsaW1pdHxoYXJ1cGFnZV9zZXRyZ2JmaWxsfGhhcnVwYWdlX3NldHJnYnN0cm9rZXxoYXJ1cGFnZV9zZXRyb3RhdGV8aGFydXBhZ2Vfc2V0c2l6ZXxoYXJ1cGFnZV9zZXRzbGlkZXNob3d8JyArDQogICAgICAgICdoYXJ1cGFnZV9zZXR0ZXh0bGVhZGluZ3xoYXJ1cGFnZV9zZXR0ZXh0bWF0cml4fGhhcnVwYWdlX3NldHRleHRyZW5kZXJpbmdtb2RlfGhhcnVwYWdlX3NldHRleHRyaXNlfGhhcnVwYWdlX3NldHdpZHRofGhhcnVwYWdlX3NldHdvcmRzcGFjZXwnICsNCiAgICAgICAgJ2hhcnVwYWdlX3Nob3d0ZXh0fGhhcnVwYWdlX3Nob3d0ZXh0bmV4dGxpbmV8aGFydXBhZ2Vfc3Ryb2tlfGhhcnVwYWdlX3RleHRvdXR8aGFydXBhZ2VfdGV4dHJlY3R8aGFzY29uc3RhbnR8aGFzaHxoYXNoX2FsZ29zfGhhc2hfY29weXwnICsNCiAgICAgICAgJ2hhc2hfZmlsZXxoYXNoX2ZpbmFsfGhhc2hfaG1hY3xoYXNoX2htYWNfZmlsZXxoYXNoX2luaXR8aGFzaF91cGRhdGV8aGFzaF91cGRhdGVfZmlsZXxoYXNoX3VwZGF0ZV9zdHJlYW18aGFzbWV0aG9kfGhhc3Byb3BlcnR5fGhlYWRlcnwnICsNCiAgICAgICAgJ2hlYWRlcl9yZWdpc3Rlcl9jYWxsYmFja3xoZWFkZXJfcmVtb3ZlfGhlYWRlcnNfbGlzdHxoZWFkZXJzX3NlbnR8aGVicmV2fGhlYnJldmN8aGV4MmJpbnxoZXhkZWN8aGlnaGxpZ2h0X2ZpbGV8aGlnaGxpZ2h0X3N0cmluZ3wnICsNCiAgICAgICAgJ2h0bWxfZW50aXR5X2RlY29kZXxodG1sZW50aXRpZXN8aHRtbHNwZWNpYWxjaGFyc3xodG1sc3BlY2lhbGNoYXJzX2RlY29kZXxodHRwX2J1aWxkX2Nvb2tpZXxodHRwX2J1aWxkX3F1ZXJ5fGh0dHBfYnVpbGRfc3RyfGh0dHBfYnVpbGRfdXJsfCcgKw0KICAgICAgICAnaHR0cF9jYWNoZV9ldGFnfGh0dHBfY2FjaGVfbGFzdF9tb2RpZmllZHxodHRwX2NodW5rZWRfZGVjb2RlfGh0dHBfZGF0ZXxodHRwX2RlZmxhdGV8aHR0cF9nZXR8aHR0cF9nZXRfcmVxdWVzdF9ib2R5fCcgKw0KICAgICAgICAnaHR0cF9nZXRfcmVxdWVzdF9ib2R5X3N0cmVhbXxodHRwX2dldF9yZXF1ZXN0X2hlYWRlcnN8aHR0cF9oZWFkfGh0dHBfaW5mbGF0ZXxodHRwX21hdGNoX2V0YWd8aHR0cF9tYXRjaF9tb2RpZmllZHwnICsNCiAgICAgICAgJ2h0dHBfbWF0Y2hfcmVxdWVzdF9oZWFkZXJ8aHR0cF9uZWdvdGlhdGVfY2hhcnNldHxodHRwX25lZ290aWF0ZV9jb250ZW50X3R5cGV8aHR0cF9uZWdvdGlhdGVfbGFuZ3VhZ2V8aHR0cF9wYXJzZV9jb29raWV8aHR0cF9wYXJzZV9oZWFkZXJzfCcgKw0KICAgICAgICAnaHR0cF9wYXJzZV9tZXNzYWdlfGh0dHBfcGFyc2VfcGFyYW1zfGh0dHBfcGVyc2lzdGVudF9oYW5kbGVzX2NsZWFufGh0dHBfcGVyc2lzdGVudF9oYW5kbGVzX2NvdW50fGh0dHBfcGVyc2lzdGVudF9oYW5kbGVzX2lkZW50fCcgKw0KICAgICAgICAnaHR0cF9wb3N0X2RhdGF8aHR0cF9wb3N0X2ZpZWxkc3xodHRwX3B1dF9kYXRhfGh0dHBfcHV0X2ZpbGV8aHR0cF9wdXRfc3RyZWFtfGh0dHBfcmVkaXJlY3R8aHR0cF9yZXF1ZXN0fGh0dHBfcmVxdWVzdF9ib2R5X2VuY29kZXwnICsNCiAgICAgICAgJ2h0dHBfcmVxdWVzdF9tZXRob2RfZXhpc3RzfGh0dHBfcmVxdWVzdF9tZXRob2RfbmFtZXxodHRwX3JlcXVlc3RfbWV0aG9kX3JlZ2lzdGVyfGh0dHBfcmVxdWVzdF9tZXRob2RfdW5yZWdpc3RlcnxodHRwX3Jlc3BvbnNlX2NvZGV8JyArDQogICAgICAgICdodHRwX3NlbmRfY29udGVudF9kaXNwb3NpdGlvbnxodHRwX3NlbmRfY29udGVudF90eXBlfGh0dHBfc2VuZF9kYXRhfGh0dHBfc2VuZF9maWxlfGh0dHBfc2VuZF9sYXN0X21vZGlmaWVkfGh0dHBfc2VuZF9zdGF0dXN8JyArDQogICAgICAgICdodHRwX3NlbmRfc3RyZWFtfGh0dHBfc3VwcG9ydHxodHRwX3Rocm90dGxlfGh0dHBkZWZsYXRlc3RyZWFtfGh0dHBkZWZsYXRlc3RyZWFtX2NvbnN0cnVjdHxodHRwZGVmbGF0ZXN0cmVhbV9mYWN0b3J5fCcgKw0KICAgICAgICAnaHR0cGRlZmxhdGVzdHJlYW1fZmluaXNofGh0dHBkZWZsYXRlc3RyZWFtX2ZsdXNofGh0dHBkZWZsYXRlc3RyZWFtX3VwZGF0ZXxodHRwaW5mbGF0ZXN0cmVhbXxodHRwaW5mbGF0ZXN0cmVhbV9jb25zdHJ1Y3R8JyArDQogICAgICAgICdodHRwaW5mbGF0ZXN0cmVhbV9mYWN0b3J5fGh0dHBpbmZsYXRlc3RyZWFtX2ZpbmlzaHxodHRwaW5mbGF0ZXN0cmVhbV9mbHVzaHxodHRwaW5mbGF0ZXN0cmVhbV91cGRhdGV8aHR0cG1lc3NhZ2V8aHR0cG1lc3NhZ2VfYWRkaGVhZGVyc3wnICsNCiAgICAgICAgJ2h0dHBtZXNzYWdlX2NvbnN0cnVjdHxodHRwbWVzc2FnZV9kZXRhY2h8aHR0cG1lc3NhZ2VfZmFjdG9yeXxodHRwbWVzc2FnZV9mcm9tZW52fGh0dHBtZXNzYWdlX2Zyb21zdHJpbmd8aHR0cG1lc3NhZ2VfZ2V0Ym9keXwnICsNCiAgICAgICAgJ2h0dHBtZXNzYWdlX2dldGhlYWRlcnxodHRwbWVzc2FnZV9nZXRoZWFkZXJzfGh0dHBtZXNzYWdlX2dldGh0dHB2ZXJzaW9ufGh0dHBtZXNzYWdlX2dldHBhcmVudG1lc3NhZ2V8aHR0cG1lc3NhZ2VfZ2V0cmVxdWVzdG1ldGhvZHwnICsNCiAgICAgICAgJ2h0dHBtZXNzYWdlX2dldHJlcXVlc3R1cmx8aHR0cG1lc3NhZ2VfZ2V0cmVzcG9uc2Vjb2RlfGh0dHBtZXNzYWdlX2dldHJlc3BvbnNlc3RhdHVzfGh0dHBtZXNzYWdlX2dldHR5cGV8aHR0cG1lc3NhZ2VfZ3Vlc3Njb250ZW50dHlwZXwnICsNCiAgICAgICAgJ2h0dHBtZXNzYWdlX3ByZXBlbmR8aHR0cG1lc3NhZ2VfcmV2ZXJzZXxodHRwbWVzc2FnZV9zZW5kfGh0dHBtZXNzYWdlX3NldGJvZHl8aHR0cG1lc3NhZ2Vfc2V0aGVhZGVyc3xodHRwbWVzc2FnZV9zZXRodHRwdmVyc2lvbnwnICsNCiAgICAgICAgJ2h0dHBtZXNzYWdlX3NldHJlcXVlc3RtZXRob2R8aHR0cG1lc3NhZ2Vfc2V0cmVxdWVzdHVybHxodHRwbWVzc2FnZV9zZXRyZXNwb25zZWNvZGV8aHR0cG1lc3NhZ2Vfc2V0cmVzcG9uc2VzdGF0dXN8aHR0cG1lc3NhZ2Vfc2V0dHlwZXwnICsNCiAgICAgICAgJ2h0dHBtZXNzYWdlX3RvbWVzc2FnZXR5cGVvYmplY3R8aHR0cG1lc3NhZ2VfdG9zdHJpbmd8aHR0cHF1ZXJ5c3RyaW5nfGh0dHBxdWVyeXN0cmluZ19jb25zdHJ1Y3R8aHR0cHF1ZXJ5c3RyaW5nX2dldHxodHRwcXVlcnlzdHJpbmdfbW9kfCcgKw0KICAgICAgICAnaHR0cHF1ZXJ5c3RyaW5nX3NldHxodHRwcXVlcnlzdHJpbmdfc2luZ2xldG9ufGh0dHBxdWVyeXN0cmluZ190b2FycmF5fGh0dHBxdWVyeXN0cmluZ190b3N0cmluZ3xodHRwcXVlcnlzdHJpbmdfeGxhdGV8aHR0cHJlcXVlc3R8JyArDQogICAgICAgICdodHRwcmVxdWVzdF9hZGRjb29raWVzfGh0dHByZXF1ZXN0X2FkZGhlYWRlcnN8aHR0cHJlcXVlc3RfYWRkcG9zdGZpZWxkc3xodHRwcmVxdWVzdF9hZGRwb3N0ZmlsZXxodHRwcmVxdWVzdF9hZGRwdXRkYXRhfCcgKw0KICAgICAgICAnaHR0cHJlcXVlc3RfYWRkcXVlcnlkYXRhfGh0dHByZXF1ZXN0X2FkZHJhd3Bvc3RkYXRhfGh0dHByZXF1ZXN0X2FkZHNzbG9wdGlvbnN8aHR0cHJlcXVlc3RfY2xlYXJoaXN0b3J5fGh0dHByZXF1ZXN0X2NvbnN0cnVjdHwnICsNCiAgICAgICAgJ2h0dHByZXF1ZXN0X2VuYWJsZWNvb2tpZXN8aHR0cHJlcXVlc3RfZ2V0Y29udGVudHR5cGV8aHR0cHJlcXVlc3RfZ2V0Y29va2llc3xodHRwcmVxdWVzdF9nZXRoZWFkZXJzfGh0dHByZXF1ZXN0X2dldGhpc3Rvcnl8JyArDQogICAgICAgICdodHRwcmVxdWVzdF9nZXRtZXRob2R8aHR0cHJlcXVlc3RfZ2V0b3B0aW9uc3xodHRwcmVxdWVzdF9nZXRwb3N0ZmllbGRzfGh0dHByZXF1ZXN0X2dldHBvc3RmaWxlc3xodHRwcmVxdWVzdF9nZXRwdXRkYXRhfCcgKw0KICAgICAgICAnaHR0cHJlcXVlc3RfZ2V0cHV0ZmlsZXxodHRwcmVxdWVzdF9nZXRxdWVyeWRhdGF8aHR0cHJlcXVlc3RfZ2V0cmF3cG9zdGRhdGF8aHR0cHJlcXVlc3RfZ2V0cmF3cmVxdWVzdG1lc3NhZ2V8JyArDQogICAgICAgICdodHRwcmVxdWVzdF9nZXRyYXdyZXNwb25zZW1lc3NhZ2V8aHR0cHJlcXVlc3RfZ2V0cmVxdWVzdG1lc3NhZ2V8aHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2Vib2R5fGh0dHByZXF1ZXN0X2dldHJlc3BvbnNlY29kZXwnICsNCiAgICAgICAgJ2h0dHByZXF1ZXN0X2dldHJlc3BvbnNlY29va2llc3xodHRwcmVxdWVzdF9nZXRyZXNwb25zZWRhdGF8aHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2VoZWFkZXJ8aHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2VpbmZvfCcgKw0KICAgICAgICAnaHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2VtZXNzYWdlfGh0dHByZXF1ZXN0X2dldHJlc3BvbnNlc3RhdHVzfGh0dHByZXF1ZXN0X2dldHNzbG9wdGlvbnN8aHR0cHJlcXVlc3RfZ2V0dXJsfGh0dHByZXF1ZXN0X3Jlc2V0Y29va2llc3wnICsNCiAgICAgICAgJ2h0dHByZXF1ZXN0X3NlbmR8aHR0cHJlcXVlc3Rfc2V0Y29udGVudHR5cGV8aHR0cHJlcXVlc3Rfc2V0Y29va2llc3xodHRwcmVxdWVzdF9zZXRoZWFkZXJzfGh0dHByZXF1ZXN0X3NldG1ldGhvZHxodHRwcmVxdWVzdF9zZXRvcHRpb25zfCcgKw0KICAgICAgICAnaHR0cHJlcXVlc3Rfc2V0cG9zdGZpZWxkc3xodHRwcmVxdWVzdF9zZXRwb3N0ZmlsZXN8aHR0cHJlcXVlc3Rfc2V0cHV0ZGF0YXxodHRwcmVxdWVzdF9zZXRwdXRmaWxlfGh0dHByZXF1ZXN0X3NldHF1ZXJ5ZGF0YXwnICsNCiAgICAgICAgJ2h0dHByZXF1ZXN0X3NldHJhd3Bvc3RkYXRhfGh0dHByZXF1ZXN0X3NldHNzbG9wdGlvbnN8aHR0cHJlcXVlc3Rfc2V0dXJsfGh0dHByZXF1ZXN0cG9vbHxodHRwcmVxdWVzdHBvb2xfYXR0YWNofGh0dHByZXF1ZXN0cG9vbF9jb25zdHJ1Y3R8JyArDQogICAgICAgICdodHRwcmVxdWVzdHBvb2xfZGVzdHJ1Y3R8aHR0cHJlcXVlc3Rwb29sX2RldGFjaHxodHRwcmVxdWVzdHBvb2xfZ2V0YXR0YWNoZWRyZXF1ZXN0c3xodHRwcmVxdWVzdHBvb2xfZ2V0ZmluaXNoZWRyZXF1ZXN0c3wnICsNCiAgICAgICAgJ2h0dHByZXF1ZXN0cG9vbF9yZXNldHxodHRwcmVxdWVzdHBvb2xfc2VuZHxodHRwcmVxdWVzdHBvb2xfc29ja2V0cGVyZm9ybXxodHRwcmVxdWVzdHBvb2xfc29ja2V0c2VsZWN0fGh0dHByZXNwb25zZXxodHRwcmVzcG9uc2VfY2FwdHVyZXwnICsNCiAgICAgICAgJ2h0dHByZXNwb25zZV9nZXRidWZmZXJzaXplfGh0dHByZXNwb25zZV9nZXRjYWNoZXxodHRwcmVzcG9uc2VfZ2V0Y2FjaGVjb250cm9sfGh0dHByZXNwb25zZV9nZXRjb250ZW50ZGlzcG9zaXRpb258JyArDQogICAgICAgICdodHRwcmVzcG9uc2VfZ2V0Y29udGVudHR5cGV8aHR0cHJlc3BvbnNlX2dldGRhdGF8aHR0cHJlc3BvbnNlX2dldGV0YWd8aHR0cHJlc3BvbnNlX2dldGZpbGV8aHR0cHJlc3BvbnNlX2dldGd6aXB8aHR0cHJlc3BvbnNlX2dldGhlYWRlcnwnICsNCiAgICAgICAgJ2h0dHByZXNwb25zZV9nZXRsYXN0bW9kaWZpZWR8aHR0cHJlc3BvbnNlX2dldHJlcXVlc3Rib2R5fGh0dHByZXNwb25zZV9nZXRyZXF1ZXN0Ym9keXN0cmVhbXxodHRwcmVzcG9uc2VfZ2V0cmVxdWVzdGhlYWRlcnN8JyArDQogICAgICAgICdodHRwcmVzcG9uc2VfZ2V0c3RyZWFtfGh0dHByZXNwb25zZV9nZXR0aHJvdHRsZWRlbGF5fGh0dHByZXNwb25zZV9ndWVzc2NvbnRlbnR0eXBlfGh0dHByZXNwb25zZV9yZWRpcmVjdHxodHRwcmVzcG9uc2Vfc2VuZHwnICsNCiAgICAgICAgJ2h0dHByZXNwb25zZV9zZXRidWZmZXJzaXplfGh0dHByZXNwb25zZV9zZXRjYWNoZXxodHRwcmVzcG9uc2Vfc2V0Y2FjaGVjb250cm9sfGh0dHByZXNwb25zZV9zZXRjb250ZW50ZGlzcG9zaXRpb258JyArDQogICAgICAgICdodHRwcmVzcG9uc2Vfc2V0Y29udGVudHR5cGV8aHR0cHJlc3BvbnNlX3NldGRhdGF8aHR0cHJlc3BvbnNlX3NldGV0YWd8aHR0cHJlc3BvbnNlX3NldGZpbGV8aHR0cHJlc3BvbnNlX3NldGd6aXB8aHR0cHJlc3BvbnNlX3NldGhlYWRlcnwnICsNCiAgICAgICAgJ2h0dHByZXNwb25zZV9zZXRsYXN0bW9kaWZpZWR8aHR0cHJlc3BvbnNlX3NldHN0cmVhbXxodHRwcmVzcG9uc2Vfc2V0dGhyb3R0bGVkZWxheXxodHRwcmVzcG9uc2Vfc3RhdHVzfGh3X2FycmF5Mm9ianJlY3xod19jaGFuZ2VvYmplY3R8JyArDQogICAgICAgICdod19jaGlsZHJlbnxod19jaGlsZHJlbm9ianxod19jbG9zZXxod19jb25uZWN0fGh3X2Nvbm5lY3Rpb25faW5mb3xod19jcHxod19kZWxldGVvYmplY3R8aHdfZG9jYnlhbmNob3J8aHdfZG9jYnlhbmNob3JvYmp8JyArDQogICAgICAgICdod19kb2N1bWVudF9hdHRyaWJ1dGVzfGh3X2RvY3VtZW50X2JvZHl0YWd8aHdfZG9jdW1lbnRfY29udGVudHxod19kb2N1bWVudF9zZXRjb250ZW50fGh3X2RvY3VtZW50X3NpemV8aHdfZHVtbXl8aHdfZWRpdHRleHR8aHdfZXJyb3J8JyArDQogICAgICAgICdod19lcnJvcm1zZ3xod19mcmVlX2RvY3VtZW50fGh3X2dldGFuY2hvcnN8aHdfZ2V0YW5jaG9yc29ianxod19nZXRhbmRsb2NrfGh3X2dldGNoaWxkY29sbHxod19nZXRjaGlsZGNvbGxvYmp8aHdfZ2V0Y2hpbGRkb2Njb2xsfCcgKw0KICAgICAgICAnaHdfZ2V0Y2hpbGRkb2Njb2xsb2JqfGh3X2dldG9iamVjdHxod19nZXRvYmplY3RieXF1ZXJ5fGh3X2dldG9iamVjdGJ5cXVlcnljb2xsfGh3X2dldG9iamVjdGJ5cXVlcnljb2xsb2JqfGh3X2dldG9iamVjdGJ5cXVlcnlvYmp8JyArDQogICAgICAgICdod19nZXRwYXJlbnRzfGh3X2dldHBhcmVudHNvYmp8aHdfZ2V0cmVsbGlua3xod19nZXRyZW1vdGV8aHdfZ2V0cmVtb3RlY2hpbGRyZW58aHdfZ2V0c3JjYnlkZXN0b2JqfGh3X2dldHRleHR8aHdfZ2V0dXNlcm5hbWV8aHdfaWRlbnRpZnl8JyArDQogICAgICAgICdod19pbmNvbGxlY3Rpb25zfGh3X2luZm98aHdfaW5zY29sbHxod19pbnNkb2N8aHdfaW5zZXJ0YW5jaG9yc3xod19pbnNlcnRkb2N1bWVudHxod19pbnNlcnRvYmplY3R8aHdfbWFwaWR8aHdfbW9kaWZ5b2JqZWN0fGh3X212fCcgKw0KICAgICAgICAnaHdfbmV3X2RvY3VtZW50fGh3X29ianJlYzJhcnJheXxod19vdXRwdXRfZG9jdW1lbnR8aHdfcGNvbm5lY3R8aHdfcGlwZWRvY3VtZW50fGh3X3Jvb3R8aHdfc2V0bGlua3Jvb3R8aHdfc3RhdHxod191bmxvY2t8aHdfd2hvfCcgKw0KICAgICAgICAnaHdhcGlfYXR0cmlidXRlfGh3YXBpX2F0dHJpYnV0ZV9rZXl8aHdhcGlfYXR0cmlidXRlX2xhbmdkZXB2YWx1ZXxod2FwaV9hdHRyaWJ1dGVfdmFsdWV8aHdhcGlfYXR0cmlidXRlX3ZhbHVlc3xod2FwaV9jaGVja2lufCcgKw0KICAgICAgICAnaHdhcGlfY2hlY2tvdXR8aHdhcGlfY2hpbGRyZW58aHdhcGlfY29udGVudHxod2FwaV9jb250ZW50X21pbWV0eXBlfGh3YXBpX2NvbnRlbnRfcmVhZHxod2FwaV9jb3B5fGh3YXBpX2Ric3RhdHxod2FwaV9kY3N0YXR8JyArDQogICAgICAgICdod2FwaV9kc3RhbmNob3JzfGh3YXBpX2RzdG9mc3JjYW5jaG9yfGh3YXBpX2Vycm9yX2NvdW50fGh3YXBpX2Vycm9yX3JlYXNvbnxod2FwaV9maW5kfGh3YXBpX2Z0c3RhdHxod2FwaV9oZ2NzcHxod2FwaV9od3N0YXR8JyArDQogICAgICAgICdod2FwaV9pZGVudGlmeXxod2FwaV9pbmZvfGh3YXBpX2luc2VydHxod2FwaV9pbnNlcnRhbmNob3J8aHdhcGlfaW5zZXJ0Y29sbGVjdGlvbnxod2FwaV9pbnNlcnRkb2N1bWVudHxod2FwaV9saW5rfGh3YXBpX2xvY2t8aHdhcGlfbW92ZXwnICsNCiAgICAgICAgJ2h3YXBpX25ld19jb250ZW50fGh3YXBpX29iamVjdHxod2FwaV9vYmplY3RfYXNzaWdufGh3YXBpX29iamVjdF9hdHRyZWRpdGFibGV8aHdhcGlfb2JqZWN0X2NvdW50fGh3YXBpX29iamVjdF9pbnNlcnR8aHdhcGlfb2JqZWN0X25ld3wnICsNCiAgICAgICAgJ2h3YXBpX29iamVjdF9yZW1vdmV8aHdhcGlfb2JqZWN0X3RpdGxlfGh3YXBpX29iamVjdF92YWx1ZXxod2FwaV9vYmplY3RieWFuY2hvcnxod2FwaV9wYXJlbnRzfGh3YXBpX3JlYXNvbl9kZXNjcmlwdGlvbnxod2FwaV9yZWFzb25fdHlwZXwnICsNCiAgICAgICAgJ2h3YXBpX3JlbW92ZXxod2FwaV9yZXBsYWNlfGh3YXBpX3NldGNvbW1pdHRlZHZlcnNpb258aHdhcGlfc3JjYW5jaG9yc3xod2FwaV9zcmNzb2Zkc3R8aHdhcGlfdW5sb2NrfGh3YXBpX3VzZXJ8aHdhcGlfdXNlcmxpc3R8aHlwb3R8JyArDQogICAgICAgICdpYmFzZV9hZGRfdXNlcnxpYmFzZV9hZmZlY3RlZF9yb3dzfGliYXNlX2JhY2t1cHxpYmFzZV9ibG9iX2FkZHxpYmFzZV9ibG9iX2NhbmNlbHxpYmFzZV9ibG9iX2Nsb3NlfGliYXNlX2Jsb2JfY3JlYXRlfGliYXNlX2Jsb2JfZWNob3wnICsNCiAgICAgICAgJ2liYXNlX2Jsb2JfZ2V0fGliYXNlX2Jsb2JfaW1wb3J0fGliYXNlX2Jsb2JfaW5mb3xpYmFzZV9ibG9iX29wZW58aWJhc2VfY2xvc2V8aWJhc2VfY29tbWl0fGliYXNlX2NvbW1pdF9yZXR8aWJhc2VfY29ubmVjdHxpYmFzZV9kYl9pbmZvfCcgKw0KICAgICAgICAnaWJhc2VfZGVsZXRlX3VzZXJ8aWJhc2VfZHJvcF9kYnxpYmFzZV9lcnJjb2RlfGliYXNlX2Vycm1zZ3xpYmFzZV9leGVjdXRlfGliYXNlX2ZldGNoX2Fzc29jfGliYXNlX2ZldGNoX29iamVjdHxpYmFzZV9mZXRjaF9yb3d8JyArDQogICAgICAgICdpYmFzZV9maWVsZF9pbmZvfGliYXNlX2ZyZWVfZXZlbnRfaGFuZGxlcnxpYmFzZV9mcmVlX3F1ZXJ5fGliYXNlX2ZyZWVfcmVzdWx0fGliYXNlX2dlbl9pZHxpYmFzZV9tYWludGFpbl9kYnxpYmFzZV9tb2RpZnlfdXNlcnwnICsNCiAgICAgICAgJ2liYXNlX25hbWVfcmVzdWx0fGliYXNlX251bV9maWVsZHN8aWJhc2VfbnVtX3BhcmFtc3xpYmFzZV9wYXJhbV9pbmZvfGliYXNlX3Bjb25uZWN0fGliYXNlX3ByZXBhcmV8aWJhc2VfcXVlcnl8aWJhc2VfcmVzdG9yZXwnICsNCiAgICAgICAgJ2liYXNlX3JvbGxiYWNrfGliYXNlX3JvbGxiYWNrX3JldHxpYmFzZV9zZXJ2ZXJfaW5mb3xpYmFzZV9zZXJ2aWNlX2F0dGFjaHxpYmFzZV9zZXJ2aWNlX2RldGFjaHxpYmFzZV9zZXRfZXZlbnRfaGFuZGxlcnxpYmFzZV90aW1lZm10fCcgKw0KICAgICAgICAnaWJhc2VfdHJhbnN8aWJhc2Vfd2FpdF9ldmVudHxpY29udnxpY29udl9nZXRfZW5jb2Rpbmd8aWNvbnZfbWltZV9kZWNvZGV8aWNvbnZfbWltZV9kZWNvZGVfaGVhZGVyc3xpY29udl9taW1lX2VuY29kZXxpY29udl9zZXRfZW5jb2Rpbmd8JyArDQogICAgICAgICdpY29udl9zdHJsZW58aWNvbnZfc3RycG9zfGljb252X3N0cnJwb3N8aWNvbnZfc3Vic3RyfGlkM19nZXRfZnJhbWVfbG9uZ19uYW1lfGlkM19nZXRfZnJhbWVfc2hvcnRfbmFtZXxpZDNfZ2V0X2dlbnJlX2lkfGlkM19nZXRfZ2VucmVfbGlzdHwnICsNCiAgICAgICAgJ2lkM19nZXRfZ2VucmVfbmFtZXxpZDNfZ2V0X3RhZ3xpZDNfZ2V0X3ZlcnNpb258aWQzX3JlbW92ZV90YWd8aWQzX3NldF90YWd8aWQzdjJhdHRhY2hlZHBpY3R1cmVmcmFtZXxpZDN2MmZyYW1lfGlkM3YydGFnfGlkYXRlfCcgKw0KICAgICAgICAnaWRuX3RvX2FzY2lpfGlkbl90b191bmljb2RlfGlkbl90b191dGY4fGlmeF9hZmZlY3RlZF9yb3dzfGlmeF9ibG9iaW5maWxlX21vZGV8aWZ4X2J5dGVhc3ZhcmNoYXJ8aWZ4X2Nsb3NlfGlmeF9jb25uZWN0fGlmeF9jb3B5X2Jsb2J8JyArDQogICAgICAgICdpZnhfY3JlYXRlX2Jsb2J8aWZ4X2NyZWF0ZV9jaGFyfGlmeF9kb3xpZnhfZXJyb3J8aWZ4X2Vycm9ybXNnfGlmeF9mZXRjaF9yb3d8aWZ4X2ZpZWxkcHJvcGVydGllc3xpZnhfZmllbGR0eXBlc3xpZnhfZnJlZV9ibG9ifCcgKw0KICAgICAgICAnaWZ4X2ZyZWVfY2hhcnxpZnhfZnJlZV9yZXN1bHR8aWZ4X2dldF9ibG9ifGlmeF9nZXRfY2hhcnxpZnhfZ2V0c3FsY2F8aWZ4X2h0bWx0YmxfcmVzdWx0fGlmeF9udWxsZm9ybWF0fGlmeF9udW1fZmllbGRzfGlmeF9udW1fcm93c3wnICsNCiAgICAgICAgJ2lmeF9wY29ubmVjdHxpZnhfcHJlcGFyZXxpZnhfcXVlcnl8aWZ4X3RleHRhc3ZhcmNoYXJ8aWZ4X3VwZGF0ZV9ibG9ifGlmeF91cGRhdGVfY2hhcnxpZnh1c19jbG9zZV9zbG9ifGlmeHVzX2NyZWF0ZV9zbG9ifGlmeHVzX2ZyZWVfc2xvYnwnICsNCiAgICAgICAgJ2lmeHVzX29wZW5fc2xvYnxpZnh1c19yZWFkX3Nsb2J8aWZ4dXNfc2Vla19zbG9ifGlmeHVzX3RlbGxfc2xvYnxpZnh1c193cml0ZV9zbG9ifGlnbm9yZV91c2VyX2Fib3J0fGlpc19hZGRfc2VydmVyfGlpc19nZXRfZGlyX3NlY3VyaXR5fCcgKw0KICAgICAgICAnaWlzX2dldF9zY3JpcHRfbWFwfGlpc19nZXRfc2VydmVyX2J5X2NvbW1lbnR8aWlzX2dldF9zZXJ2ZXJfYnlfcGF0aHxpaXNfZ2V0X3NlcnZlcl9yaWdodHN8aWlzX2dldF9zZXJ2aWNlX3N0YXRlfGlpc19yZW1vdmVfc2VydmVyfCcgKw0KICAgICAgICAnaWlzX3NldF9hcHBfc2V0dGluZ3N8aWlzX3NldF9kaXJfc2VjdXJpdHl8aWlzX3NldF9zY3JpcHRfbWFwfGlpc19zZXRfc2VydmVyX3JpZ2h0c3xpaXNfc3RhcnRfc2VydmVyfGlpc19zdGFydF9zZXJ2aWNlfGlpc19zdG9wX3NlcnZlcnwnICsNCiAgICAgICAgJ2lpc19zdG9wX3NlcnZpY2V8aW1hZ2Uyd2JtcHxpbWFnZV90eXBlX3RvX2V4dGVuc2lvbnxpbWFnZV90eXBlX3RvX21pbWVfdHlwZXxpbWFnZWFscGhhYmxlbmRpbmd8aW1hZ2VhbnRpYWxpYXN8aW1hZ2VhcmN8aW1hZ2VjaGFyfCcgKw0KICAgICAgICAnaW1hZ2VjaGFydXB8aW1hZ2Vjb2xvcmFsbG9jYXRlfGltYWdlY29sb3JhbGxvY2F0ZWFscGhhfGltYWdlY29sb3JhdHxpbWFnZWNvbG9yY2xvc2VzdHxpbWFnZWNvbG9yY2xvc2VzdGFscGhhfGltYWdlY29sb3JjbG9zZXN0aHdifCcgKw0KICAgICAgICAnaW1hZ2Vjb2xvcmRlYWxsb2NhdGV8aW1hZ2Vjb2xvcmV4YWN0fGltYWdlY29sb3JleGFjdGFscGhhfGltYWdlY29sb3JtYXRjaHxpbWFnZWNvbG9ycmVzb2x2ZXxpbWFnZWNvbG9ycmVzb2x2ZWFscGhhfGltYWdlY29sb3JzZXR8JyArDQogICAgICAgICdpbWFnZWNvbG9yc2ZvcmluZGV4fGltYWdlY29sb3JzdG90YWx8aW1hZ2Vjb2xvcnRyYW5zcGFyZW50fGltYWdlY29udm9sdXRpb258aW1hZ2Vjb3B5fGltYWdlY29weW1lcmdlfGltYWdlY29weW1lcmdlZ3JheXwnICsNCiAgICAgICAgJ2ltYWdlY29weXJlc2FtcGxlZHxpbWFnZWNvcHlyZXNpemVkfGltYWdlY3JlYXRlfGltYWdlY3JlYXRlZnJvbWdkfGltYWdlY3JlYXRlZnJvbWdkMnxpbWFnZWNyZWF0ZWZyb21nZDJwYXJ0fGltYWdlY3JlYXRlZnJvbWdpZnwnICsNCiAgICAgICAgJ2ltYWdlY3JlYXRlZnJvbWpwZWd8aW1hZ2VjcmVhdGVmcm9tcG5nfGltYWdlY3JlYXRlZnJvbXN0cmluZ3xpbWFnZWNyZWF0ZWZyb213Ym1wfGltYWdlY3JlYXRlZnJvbXhibXxpbWFnZWNyZWF0ZWZyb214cG18JyArDQogICAgICAgICdpbWFnZWNyZWF0ZXRydWVjb2xvcnxpbWFnZWRhc2hlZGxpbmV8aW1hZ2VkZXN0cm95fGltYWdlZWxsaXBzZXxpbWFnZWZpbGx8aW1hZ2VmaWxsZWRhcmN8aW1hZ2VmaWxsZWRlbGxpcHNlfGltYWdlZmlsbGVkcG9seWdvbnwnICsNCiAgICAgICAgJ2ltYWdlZmlsbGVkcmVjdGFuZ2xlfGltYWdlZmlsbHRvYm9yZGVyfGltYWdlZmlsdGVyfGltYWdlZm9udGhlaWdodHxpbWFnZWZvbnR3aWR0aHxpbWFnZWZ0YmJveHxpbWFnZWZ0dGV4dHxpbWFnZWdhbW1hY29ycmVjdHxpbWFnZWdkfCcgKw0KICAgICAgICAnaW1hZ2VnZDJ8aW1hZ2VnaWZ8aW1hZ2VncmFic2NyZWVufGltYWdlZ3JhYndpbmRvd3xpbWFnZWludGVybGFjZXxpbWFnZWlzdHJ1ZWNvbG9yfGltYWdlanBlZ3xpbWFnZWxheWVyZWZmZWN0fGltYWdlbGluZXxpbWFnZWxvYWRmb250fCcgKw0KICAgICAgICAnaW1hZ2VwYWxldHRlY29weXxpbWFnZXBuZ3xpbWFnZXBvbHlnb258aW1hZ2Vwc2Jib3h8aW1hZ2Vwc2VuY29kZWZvbnR8aW1hZ2Vwc2V4dGVuZGZvbnR8aW1hZ2Vwc2ZyZWVmb250fGltYWdlcHNsb2FkZm9udHxpbWFnZXBzc2xhbnRmb250fCcgKw0KICAgICAgICAnaW1hZ2Vwc3RleHR8aW1hZ2VyZWN0YW5nbGV8aW1hZ2Vyb3RhdGV8aW1hZ2VzYXZlYWxwaGF8aW1hZ2VzZXRicnVzaHxpbWFnZXNldHBpeGVsfGltYWdlc2V0c3R5bGV8aW1hZ2VzZXR0aGlja25lc3N8aW1hZ2VzZXR0aWxlfCcgKw0KICAgICAgICAnaW1hZ2VzdHJpbmd8aW1hZ2VzdHJpbmd1cHxpbWFnZXN4fGltYWdlc3l8aW1hZ2V0cnVlY29sb3J0b3BhbGV0dGV8aW1hZ2V0dGZiYm94fGltYWdldHRmdGV4dHxpbWFnZXR5cGVzfGltYWdld2JtcHxpbWFnZXhibXxpbWFnaWNrfCcgKw0KICAgICAgICAnaW1hZ2lja19hZGFwdGl2ZWJsdXJpbWFnZXxpbWFnaWNrX2FkYXB0aXZlcmVzaXplaW1hZ2V8aW1hZ2lja19hZGFwdGl2ZXNoYXJwZW5pbWFnZXxpbWFnaWNrX2FkYXB0aXZldGhyZXNob2xkaW1hZ2V8aW1hZ2lja19hZGRpbWFnZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfYWRkbm9pc2VpbWFnZXxpbWFnaWNrX2FmZmluZXRyYW5zZm9ybWltYWdlfGltYWdpY2tfYW5pbWF0ZWltYWdlc3xpbWFnaWNrX2Fubm90YXRlaW1hZ2V8aW1hZ2lja19hcHBlbmRpbWFnZXN8aW1hZ2lja19hdmVyYWdlaW1hZ2VzfCcgKw0KICAgICAgICAnaW1hZ2lja19ibGFja3RocmVzaG9sZGltYWdlfGltYWdpY2tfYmx1cmltYWdlfGltYWdpY2tfYm9yZGVyaW1hZ2V8aW1hZ2lja19jaGFyY29hbGltYWdlfGltYWdpY2tfY2hvcGltYWdlfGltYWdpY2tfY2xlYXJ8aW1hZ2lja19jbGlwaW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX2NsaXBwYXRoaW1hZ2V8aW1hZ2lja19jbG9uZXxpbWFnaWNrX2NsdXRpbWFnZXxpbWFnaWNrX2NvYWxlc2NlaW1hZ2VzfGltYWdpY2tfY29sb3JmbG9vZGZpbGxpbWFnZXxpbWFnaWNrX2NvbG9yaXplaW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX2NvbWJpbmVpbWFnZXN8aW1hZ2lja19jb21tZW50aW1hZ2V8aW1hZ2lja19jb21wYXJlaW1hZ2VjaGFubmVsc3xpbWFnaWNrX2NvbXBhcmVpbWFnZWxheWVyc3xpbWFnaWNrX2NvbXBhcmVpbWFnZXN8JyArDQogICAgICAgICdpbWFnaWNrX2NvbXBvc2l0ZWltYWdlfGltYWdpY2tfY29uc3RydWN0fGltYWdpY2tfY29udHJhc3RpbWFnZXxpbWFnaWNrX2NvbnRyYXN0c3RyZXRjaGltYWdlfGltYWdpY2tfY29udm9sdmVpbWFnZXxpbWFnaWNrX2Nyb3BpbWFnZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfY3JvcHRodW1ibmFpbGltYWdlfGltYWdpY2tfY3VycmVudHxpbWFnaWNrX2N5Y2xlY29sb3JtYXBpbWFnZXxpbWFnaWNrX2RlY2lwaGVyaW1hZ2V8aW1hZ2lja19kZWNvbnN0cnVjdGltYWdlc3wnICsNCiAgICAgICAgJ2ltYWdpY2tfZGVsZXRlaW1hZ2VhcnRpZmFjdHxpbWFnaWNrX2Rlc3BlY2tsZWltYWdlfGltYWdpY2tfZGVzdHJveXxpbWFnaWNrX2Rpc3BsYXlpbWFnZXxpbWFnaWNrX2Rpc3BsYXlpbWFnZXN8aW1hZ2lja19kaXN0b3J0aW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX2RyYXdpbWFnZXxpbWFnaWNrX2VkZ2VpbWFnZXxpbWFnaWNrX2VtYm9zc2ltYWdlfGltYWdpY2tfZW5jaXBoZXJpbWFnZXxpbWFnaWNrX2VuaGFuY2VpbWFnZXxpbWFnaWNrX2VxdWFsaXplaW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX2V2YWx1YXRlaW1hZ2V8aW1hZ2lja19leHRlbnRpbWFnZXxpbWFnaWNrX2ZsYXR0ZW5pbWFnZXN8aW1hZ2lja19mbGlwaW1hZ2V8aW1hZ2lja19mbG9vZGZpbGxwYWludGltYWdlfGltYWdpY2tfZmxvcGltYWdlfCcgKw0KICAgICAgICAnaW1hZ2lja19mcmFtZWltYWdlfGltYWdpY2tfZnhpbWFnZXxpbWFnaWNrX2dhbW1haW1hZ2V8aW1hZ2lja19nYXVzc2lhbmJsdXJpbWFnZXxpbWFnaWNrX2dldGNvbG9yc3BhY2V8aW1hZ2lja19nZXRjb21wcmVzc2lvbnwnICsNCiAgICAgICAgJ2ltYWdpY2tfZ2V0Y29tcHJlc3Npb25xdWFsaXR5fGltYWdpY2tfZ2V0Y29weXJpZ2h0fGltYWdpY2tfZ2V0ZmlsZW5hbWV8aW1hZ2lja19nZXRmb250fGltYWdpY2tfZ2V0Zm9ybWF0fGltYWdpY2tfZ2V0Z3Jhdml0eXwnICsNCiAgICAgICAgJ2ltYWdpY2tfZ2V0aG9tZXVybHxpbWFnaWNrX2dldGltYWdlfGltYWdpY2tfZ2V0aW1hZ2VhbHBoYWNoYW5uZWx8aW1hZ2lja19nZXRpbWFnZWFydGlmYWN0fGltYWdpY2tfZ2V0aW1hZ2ViYWNrZ3JvdW5kY29sb3J8JyArDQogICAgICAgICdpbWFnaWNrX2dldGltYWdlYmxvYnxpbWFnaWNrX2dldGltYWdlYmx1ZXByaW1hcnl8aW1hZ2lja19nZXRpbWFnZWJvcmRlcmNvbG9yfGltYWdpY2tfZ2V0aW1hZ2VjaGFubmVsZGVwdGh8JyArDQogICAgICAgICdpbWFnaWNrX2dldGltYWdlY2hhbm5lbGRpc3RvcnRpb258aW1hZ2lja19nZXRpbWFnZWNoYW5uZWxkaXN0b3J0aW9uc3xpbWFnaWNrX2dldGltYWdlY2hhbm5lbGV4dHJlbWF8aW1hZ2lja19nZXRpbWFnZWNoYW5uZWxtZWFufCcgKw0KICAgICAgICAnaW1hZ2lja19nZXRpbWFnZWNoYW5uZWxyYW5nZXxpbWFnaWNrX2dldGltYWdlY2hhbm5lbHN0YXRpc3RpY3N8aW1hZ2lja19nZXRpbWFnZWNsaXBtYXNrfGltYWdpY2tfZ2V0aW1hZ2Vjb2xvcm1hcGNvbG9yfCcgKw0KICAgICAgICAnaW1hZ2lja19nZXRpbWFnZWNvbG9yc3xpbWFnaWNrX2dldGltYWdlY29sb3JzcGFjZXxpbWFnaWNrX2dldGltYWdlY29tcG9zZXxpbWFnaWNrX2dldGltYWdlY29tcHJlc3Npb258aW1hZ2lja19nZXRpbWFnZWNvbXByZXNzaW9ucXVhbGl0eXwnICsNCiAgICAgICAgJ2ltYWdpY2tfZ2V0aW1hZ2VkZWxheXxpbWFnaWNrX2dldGltYWdlZGVwdGh8aW1hZ2lja19nZXRpbWFnZWRpc3Bvc2V8aW1hZ2lja19nZXRpbWFnZWRpc3RvcnRpb258aW1hZ2lja19nZXRpbWFnZWV4dHJlbWF8JyArDQogICAgICAgICdpbWFnaWNrX2dldGltYWdlZmlsZW5hbWV8aW1hZ2lja19nZXRpbWFnZWZvcm1hdHxpbWFnaWNrX2dldGltYWdlZ2FtbWF8aW1hZ2lja19nZXRpbWFnZWdlb21ldHJ5fGltYWdpY2tfZ2V0aW1hZ2VncmF2aXR5fCcgKw0KICAgICAgICAnaW1hZ2lja19nZXRpbWFnZWdyZWVucHJpbWFyeXxpbWFnaWNrX2dldGltYWdlaGVpZ2h0fGltYWdpY2tfZ2V0aW1hZ2VoaXN0b2dyYW18aW1hZ2lja19nZXRpbWFnZWluZGV4fGltYWdpY2tfZ2V0aW1hZ2VpbnRlcmxhY2VzY2hlbWV8JyArDQogICAgICAgICdpbWFnaWNrX2dldGltYWdlaW50ZXJwb2xhdGVtZXRob2R8aW1hZ2lja19nZXRpbWFnZWl0ZXJhdGlvbnN8aW1hZ2lja19nZXRpbWFnZWxlbmd0aHxpbWFnaWNrX2dldGltYWdlbWFnaWNrbGljZW5zZXxpbWFnaWNrX2dldGltYWdlbWF0dGV8JyArDQogICAgICAgICdpbWFnaWNrX2dldGltYWdlbWF0dGVjb2xvcnxpbWFnaWNrX2dldGltYWdlb3JpZW50YXRpb258aW1hZ2lja19nZXRpbWFnZXBhZ2V8aW1hZ2lja19nZXRpbWFnZXBpeGVsY29sb3J8aW1hZ2lja19nZXRpbWFnZXByb2ZpbGV8JyArDQogICAgICAgICdpbWFnaWNrX2dldGltYWdlcHJvZmlsZXN8aW1hZ2lja19nZXRpbWFnZXByb3BlcnRpZXN8aW1hZ2lja19nZXRpbWFnZXByb3BlcnR5fGltYWdpY2tfZ2V0aW1hZ2VyZWRwcmltYXJ5fGltYWdpY2tfZ2V0aW1hZ2VyZWdpb258JyArDQogICAgICAgICdpbWFnaWNrX2dldGltYWdlcmVuZGVyaW5naW50ZW50fGltYWdpY2tfZ2V0aW1hZ2VyZXNvbHV0aW9ufGltYWdpY2tfZ2V0aW1hZ2VzYmxvYnxpbWFnaWNrX2dldGltYWdlc2NlbmV8aW1hZ2lja19nZXRpbWFnZXNpZ25hdHVyZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfZ2V0aW1hZ2VzaXplfGltYWdpY2tfZ2V0aW1hZ2V0aWNrc3BlcnNlY29uZHxpbWFnaWNrX2dldGltYWdldG90YWxpbmtkZW5zaXR5fGltYWdpY2tfZ2V0aW1hZ2V0eXBlfGltYWdpY2tfZ2V0aW1hZ2V1bml0c3wnICsNCiAgICAgICAgJ2ltYWdpY2tfZ2V0aW1hZ2V2aXJ0dWFscGl4ZWxtZXRob2R8aW1hZ2lja19nZXRpbWFnZXdoaXRlcG9pbnR8aW1hZ2lja19nZXRpbWFnZXdpZHRofGltYWdpY2tfZ2V0aW50ZXJsYWNlc2NoZW1lfGltYWdpY2tfZ2V0aXRlcmF0b3JpbmRleHwnICsNCiAgICAgICAgJ2ltYWdpY2tfZ2V0bnVtYmVyaW1hZ2VzfGltYWdpY2tfZ2V0b3B0aW9ufGltYWdpY2tfZ2V0cGFja2FnZW5hbWV8aW1hZ2lja19nZXRwYWdlfGltYWdpY2tfZ2V0cGl4ZWxpdGVyYXRvcnxpbWFnaWNrX2dldHBpeGVscmVnaW9uaXRlcmF0b3J8JyArDQogICAgICAgICdpbWFnaWNrX2dldHBvaW50c2l6ZXxpbWFnaWNrX2dldHF1YW50dW1kZXB0aHxpbWFnaWNrX2dldHF1YW50dW1yYW5nZXxpbWFnaWNrX2dldHJlbGVhc2VkYXRlfGltYWdpY2tfZ2V0cmVzb3VyY2V8aW1hZ2lja19nZXRyZXNvdXJjZWxpbWl0fCcgKw0KICAgICAgICAnaW1hZ2lja19nZXRzYW1wbGluZ2ZhY3RvcnN8aW1hZ2lja19nZXRzaXplfGltYWdpY2tfZ2V0c2l6ZW9mZnNldHxpbWFnaWNrX2dldHZlcnNpb258aW1hZ2lja19oYXNuZXh0aW1hZ2V8aW1hZ2lja19oYXNwcmV2aW91c2ltYWdlfCcgKw0KICAgICAgICAnaW1hZ2lja19pZGVudGlmeWltYWdlfGltYWdpY2tfaW1wbG9kZWltYWdlfGltYWdpY2tfbGFiZWxpbWFnZXxpbWFnaWNrX2xldmVsaW1hZ2V8aW1hZ2lja19saW5lYXJzdHJldGNoaW1hZ2V8aW1hZ2lja19saXF1aWRyZXNjYWxlaW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX21hZ25pZnlpbWFnZXxpbWFnaWNrX21hcGltYWdlfGltYWdpY2tfbWF0dGVmbG9vZGZpbGxpbWFnZXxpbWFnaWNrX21lZGlhbmZpbHRlcmltYWdlfGltYWdpY2tfbWVyZ2VpbWFnZWxheWVyc3xpbWFnaWNrX21pbmlmeWltYWdlfCcgKw0KICAgICAgICAnaW1hZ2lja19tb2R1bGF0ZWltYWdlfGltYWdpY2tfbW9udGFnZWltYWdlfGltYWdpY2tfbW9ycGhpbWFnZXN8aW1hZ2lja19tb3NhaWNpbWFnZXN8aW1hZ2lja19tb3Rpb25ibHVyaW1hZ2V8aW1hZ2lja19uZWdhdGVpbWFnZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfbmV3aW1hZ2V8aW1hZ2lja19uZXdwc2V1ZG9pbWFnZXxpbWFnaWNrX25leHRpbWFnZXxpbWFnaWNrX25vcm1hbGl6ZWltYWdlfGltYWdpY2tfb2lscGFpbnRpbWFnZXxpbWFnaWNrX29wYXF1ZXBhaW50aW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX29wdGltaXplaW1hZ2VsYXllcnN8aW1hZ2lja19vcmRlcmVkcG9zdGVyaXplaW1hZ2V8aW1hZ2lja19wYWludGZsb29kZmlsbGltYWdlfGltYWdpY2tfcGFpbnRvcGFxdWVpbWFnZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfcGFpbnR0cmFuc3BhcmVudGltYWdlfGltYWdpY2tfcGluZ2ltYWdlfGltYWdpY2tfcGluZ2ltYWdlYmxvYnxpbWFnaWNrX3BpbmdpbWFnZWZpbGV8aW1hZ2lja19wb2xhcm9pZGltYWdlfGltYWdpY2tfcG9zdGVyaXplaW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX3ByZXZpZXdpbWFnZXN8aW1hZ2lja19wcmV2aW91c2ltYWdlfGltYWdpY2tfcHJvZmlsZWltYWdlfGltYWdpY2tfcXVhbnRpemVpbWFnZXxpbWFnaWNrX3F1YW50aXplaW1hZ2VzfGltYWdpY2tfcXVlcnlmb250bWV0cmljc3wnICsNCiAgICAgICAgJ2ltYWdpY2tfcXVlcnlmb250c3xpbWFnaWNrX3F1ZXJ5Zm9ybWF0c3xpbWFnaWNrX3JhZGlhbGJsdXJpbWFnZXxpbWFnaWNrX3JhaXNlaW1hZ2V8aW1hZ2lja19yYW5kb210aHJlc2hvbGRpbWFnZXxpbWFnaWNrX3JlYWRpbWFnZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfcmVhZGltYWdlYmxvYnxpbWFnaWNrX3JlYWRpbWFnZWZpbGV8aW1hZ2lja19yZWNvbG9yaW1hZ2V8aW1hZ2lja19yZWR1Y2Vub2lzZWltYWdlfGltYWdpY2tfcmVtb3ZlaW1hZ2V8aW1hZ2lja19yZW1vdmVpbWFnZXByb2ZpbGV8JyArDQogICAgICAgICdpbWFnaWNrX3JlbmRlcnxpbWFnaWNrX3Jlc2FtcGxlaW1hZ2V8aW1hZ2lja19yZXNldGltYWdlcGFnZXxpbWFnaWNrX3Jlc2l6ZWltYWdlfGltYWdpY2tfcm9sbGltYWdlfGltYWdpY2tfcm90YXRlaW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX3JvdW5kY29ybmVyc3xpbWFnaWNrX3NhbXBsZWltYWdlfGltYWdpY2tfc2NhbGVpbWFnZXxpbWFnaWNrX3NlcGFyYXRlaW1hZ2VjaGFubmVsfGltYWdpY2tfc2VwaWF0b25laW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX3NldGJhY2tncm91bmRjb2xvcnxpbWFnaWNrX3NldGNvbG9yc3BhY2V8aW1hZ2lja19zZXRjb21wcmVzc2lvbnxpbWFnaWNrX3NldGNvbXByZXNzaW9ucXVhbGl0eXxpbWFnaWNrX3NldGZpbGVuYW1lfCcgKw0KICAgICAgICAnaW1hZ2lja19zZXRmaXJzdGl0ZXJhdG9yfGltYWdpY2tfc2V0Zm9udHxpbWFnaWNrX3NldGZvcm1hdHxpbWFnaWNrX3NldGdyYXZpdHl8aW1hZ2lja19zZXRpbWFnZXxpbWFnaWNrX3NldGltYWdlYWxwaGFjaGFubmVsfCcgKw0KICAgICAgICAnaW1hZ2lja19zZXRpbWFnZWFydGlmYWN0fGltYWdpY2tfc2V0aW1hZ2ViYWNrZ3JvdW5kY29sb3J8aW1hZ2lja19zZXRpbWFnZWJpYXN8aW1hZ2lja19zZXRpbWFnZWJsdWVwcmltYXJ5fGltYWdpY2tfc2V0aW1hZ2Vib3JkZXJjb2xvcnwnICsNCiAgICAgICAgJ2ltYWdpY2tfc2V0aW1hZ2VjaGFubmVsZGVwdGh8aW1hZ2lja19zZXRpbWFnZWNsaXBtYXNrfGltYWdpY2tfc2V0aW1hZ2Vjb2xvcm1hcGNvbG9yfGltYWdpY2tfc2V0aW1hZ2Vjb2xvcnNwYWNlfGltYWdpY2tfc2V0aW1hZ2Vjb21wb3NlfCcgKw0KICAgICAgICAnaW1hZ2lja19zZXRpbWFnZWNvbXByZXNzaW9ufGltYWdpY2tfc2V0aW1hZ2Vjb21wcmVzc2lvbnF1YWxpdHl8aW1hZ2lja19zZXRpbWFnZWRlbGF5fGltYWdpY2tfc2V0aW1hZ2VkZXB0aHxpbWFnaWNrX3NldGltYWdlZGlzcG9zZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfc2V0aW1hZ2VleHRlbnR8aW1hZ2lja19zZXRpbWFnZWZpbGVuYW1lfGltYWdpY2tfc2V0aW1hZ2Vmb3JtYXR8aW1hZ2lja19zZXRpbWFnZWdhbW1hfGltYWdpY2tfc2V0aW1hZ2VncmF2aXR5fCcgKw0KICAgICAgICAnaW1hZ2lja19zZXRpbWFnZWdyZWVucHJpbWFyeXxpbWFnaWNrX3NldGltYWdlaW5kZXh8aW1hZ2lja19zZXRpbWFnZWludGVybGFjZXNjaGVtZXxpbWFnaWNrX3NldGltYWdlaW50ZXJwb2xhdGVtZXRob2R8JyArDQogICAgICAgICdpbWFnaWNrX3NldGltYWdlaXRlcmF0aW9uc3xpbWFnaWNrX3NldGltYWdlbWF0dGV8aW1hZ2lja19zZXRpbWFnZW1hdHRlY29sb3J8aW1hZ2lja19zZXRpbWFnZW9wYWNpdHl8aW1hZ2lja19zZXRpbWFnZW9yaWVudGF0aW9ufCcgKw0KICAgICAgICAnaW1hZ2lja19zZXRpbWFnZXBhZ2V8aW1hZ2lja19zZXRpbWFnZXByb2ZpbGV8aW1hZ2lja19zZXRpbWFnZXByb3BlcnR5fGltYWdpY2tfc2V0aW1hZ2VyZWRwcmltYXJ5fGltYWdpY2tfc2V0aW1hZ2VyZW5kZXJpbmdpbnRlbnR8JyArDQogICAgICAgICdpbWFnaWNrX3NldGltYWdlcmVzb2x1dGlvbnxpbWFnaWNrX3NldGltYWdlc2NlbmV8aW1hZ2lja19zZXRpbWFnZXRpY2tzcGVyc2Vjb25kfGltYWdpY2tfc2V0aW1hZ2V0eXBlfGltYWdpY2tfc2V0aW1hZ2V1bml0c3wnICsNCiAgICAgICAgJ2ltYWdpY2tfc2V0aW1hZ2V2aXJ0dWFscGl4ZWxtZXRob2R8aW1hZ2lja19zZXRpbWFnZXdoaXRlcG9pbnR8aW1hZ2lja19zZXRpbnRlcmxhY2VzY2hlbWV8aW1hZ2lja19zZXRpdGVyYXRvcmluZGV4fGltYWdpY2tfc2V0bGFzdGl0ZXJhdG9yfCcgKw0KICAgICAgICAnaW1hZ2lja19zZXRvcHRpb258aW1hZ2lja19zZXRwYWdlfGltYWdpY2tfc2V0cG9pbnRzaXplfGltYWdpY2tfc2V0cmVzb2x1dGlvbnxpbWFnaWNrX3NldHJlc291cmNlbGltaXR8aW1hZ2lja19zZXRzYW1wbGluZ2ZhY3RvcnN8JyArDQogICAgICAgICdpbWFnaWNrX3NldHNpemV8aW1hZ2lja19zZXRzaXplb2Zmc2V0fGltYWdpY2tfc2V0dHlwZXxpbWFnaWNrX3NoYWRlaW1hZ2V8aW1hZ2lja19zaGFkb3dpbWFnZXxpbWFnaWNrX3NoYXJwZW5pbWFnZXxpbWFnaWNrX3NoYXZlaW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX3NoZWFyaW1hZ2V8aW1hZ2lja19zaWdtb2lkYWxjb250cmFzdGltYWdlfGltYWdpY2tfc2tldGNoaW1hZ2V8aW1hZ2lja19zb2xhcml6ZWltYWdlfGltYWdpY2tfc3BsaWNlaW1hZ2V8aW1hZ2lja19zcHJlYWRpbWFnZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfc3RlZ2Fub2ltYWdlfGltYWdpY2tfc3RlcmVvaW1hZ2V8aW1hZ2lja19zdHJpcGltYWdlfGltYWdpY2tfc3dpcmxpbWFnZXxpbWFnaWNrX3RleHR1cmVpbWFnZXxpbWFnaWNrX3RocmVzaG9sZGltYWdlfCcgKw0KICAgICAgICAnaW1hZ2lja190aHVtYm5haWxpbWFnZXxpbWFnaWNrX3RpbnRpbWFnZXxpbWFnaWNrX3RyYW5zZm9ybWltYWdlfGltYWdpY2tfdHJhbnNwYXJlbnRwYWludGltYWdlfGltYWdpY2tfdHJhbnNwb3NlaW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX3RyYW5zdmVyc2VpbWFnZXxpbWFnaWNrX3RyaW1pbWFnZXxpbWFnaWNrX3VuaXF1ZWltYWdlY29sb3JzfGltYWdpY2tfdW5zaGFycG1hc2tpbWFnZXxpbWFnaWNrX3ZhbGlkfGltYWdpY2tfdmlnbmV0dGVpbWFnZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfd2F2ZWltYWdlfGltYWdpY2tfd2hpdGV0aHJlc2hvbGRpbWFnZXxpbWFnaWNrX3dyaXRlaW1hZ2V8aW1hZ2lja193cml0ZWltYWdlZmlsZXxpbWFnaWNrX3dyaXRlaW1hZ2VzfGltYWdpY2tfd3JpdGVpbWFnZXNmaWxlfCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXd8aW1hZ2lja2RyYXdfYWZmaW5lfGltYWdpY2tkcmF3X2Fubm90YXRpb258aW1hZ2lja2RyYXdfYXJjfGltYWdpY2tkcmF3X2JlemllcnxpbWFnaWNrZHJhd19jaXJjbGV8aW1hZ2lja2RyYXdfY2xlYXJ8JyArDQogICAgICAgICdpbWFnaWNrZHJhd19jbG9uZXxpbWFnaWNrZHJhd19jb2xvcnxpbWFnaWNrZHJhd19jb21tZW50fGltYWdpY2tkcmF3X2NvbXBvc2l0ZXxpbWFnaWNrZHJhd19jb25zdHJ1Y3R8aW1hZ2lja2RyYXdfZGVzdHJveXwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X2VsbGlwc2V8aW1hZ2lja2RyYXdfZ2V0Y2xpcHBhdGh8aW1hZ2lja2RyYXdfZ2V0Y2xpcHJ1bGV8aW1hZ2lja2RyYXdfZ2V0Y2xpcHVuaXRzfGltYWdpY2tkcmF3X2dldGZpbGxjb2xvcnwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X2dldGZpbGxvcGFjaXR5fGltYWdpY2tkcmF3X2dldGZpbGxydWxlfGltYWdpY2tkcmF3X2dldGZvbnR8aW1hZ2lja2RyYXdfZ2V0Zm9udGZhbWlseXxpbWFnaWNrZHJhd19nZXRmb250c2l6ZXwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X2dldGZvbnRzdHlsZXxpbWFnaWNrZHJhd19nZXRmb250d2VpZ2h0fGltYWdpY2tkcmF3X2dldGdyYXZpdHl8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tlYW50aWFsaWFzfGltYWdpY2tkcmF3X2dldHN0cm9rZWNvbG9yfCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXdfZ2V0c3Ryb2tlZGFzaGFycmF5fGltYWdpY2tkcmF3X2dldHN0cm9rZWRhc2hvZmZzZXR8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tlbGluZWNhcHxpbWFnaWNrZHJhd19nZXRzdHJva2VsaW5lam9pbnwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X2dldHN0cm9rZW1pdGVybGltaXR8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tlb3BhY2l0eXxpbWFnaWNrZHJhd19nZXRzdHJva2V3aWR0aHxpbWFnaWNrZHJhd19nZXR0ZXh0YWxpZ25tZW50fCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXdfZ2V0dGV4dGFudGlhbGlhc3xpbWFnaWNrZHJhd19nZXR0ZXh0ZGVjb3JhdGlvbnxpbWFnaWNrZHJhd19nZXR0ZXh0ZW5jb2Rpbmd8aW1hZ2lja2RyYXdfZ2V0dGV4dHVuZGVyY29sb3J8JyArDQogICAgICAgICdpbWFnaWNrZHJhd19nZXR2ZWN0b3JncmFwaGljc3xpbWFnaWNrZHJhd19saW5lfGltYWdpY2tkcmF3X21hdHRlfGltYWdpY2tkcmF3X3BhdGhjbG9zZXxpbWFnaWNrZHJhd19wYXRoY3VydmV0b2Fic29sdXRlfCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXdfcGF0aGN1cnZldG9xdWFkcmF0aWNiZXppZXJhYnNvbHV0ZXxpbWFnaWNrZHJhd19wYXRoY3VydmV0b3F1YWRyYXRpY2JlemllcnJlbGF0aXZlfCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXdfcGF0aGN1cnZldG9xdWFkcmF0aWNiZXppZXJzbW9vdGhhYnNvbHV0ZXxpbWFnaWNrZHJhd19wYXRoY3VydmV0b3F1YWRyYXRpY2JlemllcnNtb290aHJlbGF0aXZlfGltYWdpY2tkcmF3X3BhdGhjdXJ2ZXRvcmVsYXRpdmV8JyArDQogICAgICAgICdpbWFnaWNrZHJhd19wYXRoY3VydmV0b3Ntb290aGFic29sdXRlfGltYWdpY2tkcmF3X3BhdGhjdXJ2ZXRvc21vb3RocmVsYXRpdmV8aW1hZ2lja2RyYXdfcGF0aGVsbGlwdGljYXJjYWJzb2x1dGV8JyArDQogICAgICAgICdpbWFnaWNrZHJhd19wYXRoZWxsaXB0aWNhcmNyZWxhdGl2ZXxpbWFnaWNrZHJhd19wYXRoZmluaXNofGltYWdpY2tkcmF3X3BhdGhsaW5ldG9hYnNvbHV0ZXxpbWFnaWNrZHJhd19wYXRobGluZXRvaG9yaXpvbnRhbGFic29sdXRlfCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXdfcGF0aGxpbmV0b2hvcml6b250YWxyZWxhdGl2ZXxpbWFnaWNrZHJhd19wYXRobGluZXRvcmVsYXRpdmV8aW1hZ2lja2RyYXdfcGF0aGxpbmV0b3ZlcnRpY2FsYWJzb2x1dGV8JyArDQogICAgICAgICdpbWFnaWNrZHJhd19wYXRobGluZXRvdmVydGljYWxyZWxhdGl2ZXxpbWFnaWNrZHJhd19wYXRobW92ZXRvYWJzb2x1dGV8aW1hZ2lja2RyYXdfcGF0aG1vdmV0b3JlbGF0aXZlfGltYWdpY2tkcmF3X3BhdGhzdGFydHwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X3BvaW50fGltYWdpY2tkcmF3X3BvbHlnb258aW1hZ2lja2RyYXdfcG9seWxpbmV8aW1hZ2lja2RyYXdfcG9wfGltYWdpY2tkcmF3X3BvcGNsaXBwYXRofGltYWdpY2tkcmF3X3BvcGRlZnN8JyArDQogICAgICAgICdpbWFnaWNrZHJhd19wb3BwYXR0ZXJufGltYWdpY2tkcmF3X3B1c2h8aW1hZ2lja2RyYXdfcHVzaGNsaXBwYXRofGltYWdpY2tkcmF3X3B1c2hkZWZzfGltYWdpY2tkcmF3X3B1c2hwYXR0ZXJufGltYWdpY2tkcmF3X3JlY3RhbmdsZXwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X3JlbmRlcnxpbWFnaWNrZHJhd19yb3RhdGV8aW1hZ2lja2RyYXdfcm91bmRyZWN0YW5nbGV8aW1hZ2lja2RyYXdfc2NhbGV8aW1hZ2lja2RyYXdfc2V0Y2xpcHBhdGh8aW1hZ2lja2RyYXdfc2V0Y2xpcHJ1bGV8JyArDQogICAgICAgICdpbWFnaWNrZHJhd19zZXRjbGlwdW5pdHN8aW1hZ2lja2RyYXdfc2V0ZmlsbGFscGhhfGltYWdpY2tkcmF3X3NldGZpbGxjb2xvcnxpbWFnaWNrZHJhd19zZXRmaWxsb3BhY2l0eXxpbWFnaWNrZHJhd19zZXRmaWxscGF0dGVybnVybHwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X3NldGZpbGxydWxlfGltYWdpY2tkcmF3X3NldGZvbnR8aW1hZ2lja2RyYXdfc2V0Zm9udGZhbWlseXxpbWFnaWNrZHJhd19zZXRmb250c2l6ZXxpbWFnaWNrZHJhd19zZXRmb250c3RyZXRjaHwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X3NldGZvbnRzdHlsZXxpbWFnaWNrZHJhd19zZXRmb250d2VpZ2h0fGltYWdpY2tkcmF3X3NldGdyYXZpdHl8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlYWxwaGF8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlYW50aWFsaWFzfCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXdfc2V0c3Ryb2tlY29sb3J8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlZGFzaGFycmF5fGltYWdpY2tkcmF3X3NldHN0cm9rZWRhc2hvZmZzZXR8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlbGluZWNhcHwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X3NldHN0cm9rZWxpbmVqb2lufGltYWdpY2tkcmF3X3NldHN0cm9rZW1pdGVybGltaXR8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlb3BhY2l0eXxpbWFnaWNrZHJhd19zZXRzdHJva2VwYXR0ZXJudXJsfCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXdfc2V0c3Ryb2tld2lkdGh8aW1hZ2lja2RyYXdfc2V0dGV4dGFsaWdubWVudHxpbWFnaWNrZHJhd19zZXR0ZXh0YW50aWFsaWFzfGltYWdpY2tkcmF3X3NldHRleHRkZWNvcmF0aW9ufCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXdfc2V0dGV4dGVuY29kaW5nfGltYWdpY2tkcmF3X3NldHRleHR1bmRlcmNvbG9yfGltYWdpY2tkcmF3X3NldHZlY3RvcmdyYXBoaWNzfGltYWdpY2tkcmF3X3NldHZpZXdib3h8aW1hZ2lja2RyYXdfc2tld3h8JyArDQogICAgICAgICdpbWFnaWNrZHJhd19za2V3eXxpbWFnaWNrZHJhd190cmFuc2xhdGV8aW1hZ2lja3BpeGVsfGltYWdpY2twaXhlbF9jbGVhcnxpbWFnaWNrcGl4ZWxfY29uc3RydWN0fGltYWdpY2twaXhlbF9kZXN0cm95fGltYWdpY2twaXhlbF9nZXRjb2xvcnwnICsNCiAgICAgICAgJ2ltYWdpY2twaXhlbF9nZXRjb2xvcmFzc3RyaW5nfGltYWdpY2twaXhlbF9nZXRjb2xvcmNvdW50fGltYWdpY2twaXhlbF9nZXRjb2xvcnZhbHVlfGltYWdpY2twaXhlbF9nZXRoc2x8aW1hZ2lja3BpeGVsX2lzc2ltaWxhcnwnICsNCiAgICAgICAgJ2ltYWdpY2twaXhlbF9zZXRjb2xvcnxpbWFnaWNrcGl4ZWxfc2V0Y29sb3J2YWx1ZXxpbWFnaWNrcGl4ZWxfc2V0aHNsfGltYWdpY2twaXhlbGl0ZXJhdG9yfGltYWdpY2twaXhlbGl0ZXJhdG9yX2NsZWFyfCcgKw0KICAgICAgICAnaW1hZ2lja3BpeGVsaXRlcmF0b3JfY29uc3RydWN0fGltYWdpY2twaXhlbGl0ZXJhdG9yX2Rlc3Ryb3l8aW1hZ2lja3BpeGVsaXRlcmF0b3JfZ2V0Y3VycmVudGl0ZXJhdG9ycm93fCcgKw0KICAgICAgICAnaW1hZ2lja3BpeGVsaXRlcmF0b3JfZ2V0aXRlcmF0b3Jyb3d8aW1hZ2lja3BpeGVsaXRlcmF0b3JfZ2V0bmV4dGl0ZXJhdG9ycm93fGltYWdpY2twaXhlbGl0ZXJhdG9yX2dldHByZXZpb3VzaXRlcmF0b3Jyb3d8JyArDQogICAgICAgICdpbWFnaWNrcGl4ZWxpdGVyYXRvcl9uZXdwaXhlbGl0ZXJhdG9yfGltYWdpY2twaXhlbGl0ZXJhdG9yX25ld3BpeGVscmVnaW9uaXRlcmF0b3J8aW1hZ2lja3BpeGVsaXRlcmF0b3JfcmVzZXRpdGVyYXRvcnwnICsNCiAgICAgICAgJ2ltYWdpY2twaXhlbGl0ZXJhdG9yX3NldGl0ZXJhdG9yZmlyc3Ryb3d8aW1hZ2lja3BpeGVsaXRlcmF0b3Jfc2V0aXRlcmF0b3JsYXN0cm93fGltYWdpY2twaXhlbGl0ZXJhdG9yX3NldGl0ZXJhdG9ycm93fCcgKw0KICAgICAgICAnaW1hZ2lja3BpeGVsaXRlcmF0b3Jfc3luY2l0ZXJhdG9yfGltYXBfOGJpdHxpbWFwX2FsZXJ0c3xpbWFwX2FwcGVuZHxpbWFwX2Jhc2U2NHxpbWFwX2JpbmFyeXxpbWFwX2JvZHl8aW1hcF9ib2R5c3RydWN0fGltYXBfY2hlY2t8JyArDQogICAgICAgICdpbWFwX2NsZWFyZmxhZ19mdWxsfGltYXBfY2xvc2V8aW1hcF9jcmVhdGV8aW1hcF9jcmVhdGVtYWlsYm94fGltYXBfZGVsZXRlfGltYXBfZGVsZXRlbWFpbGJveHxpbWFwX2Vycm9yc3xpbWFwX2V4cHVuZ2V8aW1hcF9mZXRjaF9vdmVydmlld3wnICsNCiAgICAgICAgJ2ltYXBfZmV0Y2hib2R5fGltYXBfZmV0Y2hoZWFkZXJ8aW1hcF9mZXRjaG1pbWV8aW1hcF9mZXRjaHN0cnVjdHVyZXxpbWFwX2ZldGNodGV4dHxpbWFwX2djfGltYXBfZ2V0X3F1b3RhfGltYXBfZ2V0X3F1b3Rhcm9vdHxpbWFwX2dldGFjbHwnICsNCiAgICAgICAgJ2ltYXBfZ2V0bWFpbGJveGVzfGltYXBfZ2V0c3Vic2NyaWJlZHxpbWFwX2hlYWRlcnxpbWFwX2hlYWRlcmluZm98aW1hcF9oZWFkZXJzfGltYXBfbGFzdF9lcnJvcnxpbWFwX2xpc3R8aW1hcF9saXN0bWFpbGJveHxpbWFwX2xpc3RzY2FufCcgKw0KICAgICAgICAnaW1hcF9saXN0c3Vic2NyaWJlZHxpbWFwX2xzdWJ8aW1hcF9tYWlsfGltYXBfbWFpbF9jb21wb3NlfGltYXBfbWFpbF9jb3B5fGltYXBfbWFpbF9tb3ZlfGltYXBfbWFpbGJveG1zZ2luZm98aW1hcF9taW1lX2hlYWRlcl9kZWNvZGV8JyArDQogICAgICAgICdpbWFwX21zZ25vfGltYXBfbnVtX21zZ3xpbWFwX251bV9yZWNlbnR8aW1hcF9vcGVufGltYXBfcGluZ3xpbWFwX3FwcmludHxpbWFwX3JlbmFtZXxpbWFwX3JlbmFtZW1haWxib3h8aW1hcF9yZW9wZW58JyArDQogICAgICAgICdpbWFwX3JmYzgyMl9wYXJzZV9hZHJsaXN0fGltYXBfcmZjODIyX3BhcnNlX2hlYWRlcnN8aW1hcF9yZmM4MjJfd3JpdGVfYWRkcmVzc3xpbWFwX3NhdmVib2R5fGltYXBfc2NhbnxpbWFwX3NjYW5tYWlsYm94fGltYXBfc2VhcmNofCcgKw0KICAgICAgICAnaW1hcF9zZXRfcXVvdGF8aW1hcF9zZXRhY2x8aW1hcF9zZXRmbGFnX2Z1bGx8aW1hcF9zb3J0fGltYXBfc3RhdHVzfGltYXBfc3Vic2NyaWJlfGltYXBfdGhyZWFkfGltYXBfdGltZW91dHxpbWFwX3VpZHxpbWFwX3VuZGVsZXRlfCcgKw0KICAgICAgICAnaW1hcF91bnN1YnNjcmliZXxpbWFwX3V0ZjdfZGVjb2RlfGltYXBfdXRmN19lbmNvZGV8aW1hcF91dGY4fGltcGxlbWVudHNpbnRlcmZhY2V8aW1wbG9kZXxpbXBvcnRfcmVxdWVzdF92YXJpYWJsZXN8aW5fYXJyYXl8aW5jbHVkZXwnICsNCiAgICAgICAgJ2luY2x1ZGVfb25jZXxpbmNsdWVkX2dldF9kYXRhfGluZXRfbnRvcHxpbmV0X3B0b258aW5maW5pdGVpdGVyYXRvcnxpbmdyZXNfYXV0b2NvbW1pdHxpbmdyZXNfYXV0b2NvbW1pdF9zdGF0ZXxpbmdyZXNfY2hhcnNldHxpbmdyZXNfY2xvc2V8JyArDQogICAgICAgICdpbmdyZXNfY29tbWl0fGluZ3Jlc19jb25uZWN0fGluZ3Jlc19jdXJzb3J8aW5ncmVzX2Vycm5vfGluZ3Jlc19lcnJvcnxpbmdyZXNfZXJyc3Fsc3RhdGV8aW5ncmVzX2VzY2FwZV9zdHJpbmd8aW5ncmVzX2V4ZWN1dGV8JyArDQogICAgICAgICdpbmdyZXNfZmV0Y2hfYXJyYXl8aW5ncmVzX2ZldGNoX2Fzc29jfGluZ3Jlc19mZXRjaF9vYmplY3R8aW5ncmVzX2ZldGNoX3Byb2NfcmV0dXJufGluZ3Jlc19mZXRjaF9yb3d8aW5ncmVzX2ZpZWxkX2xlbmd0aHxpbmdyZXNfZmllbGRfbmFtZXwnICsNCiAgICAgICAgJ2luZ3Jlc19maWVsZF9udWxsYWJsZXxpbmdyZXNfZmllbGRfcHJlY2lzaW9ufGluZ3Jlc19maWVsZF9zY2FsZXxpbmdyZXNfZmllbGRfdHlwZXxpbmdyZXNfZnJlZV9yZXN1bHR8aW5ncmVzX25leHRfZXJyb3J8aW5ncmVzX251bV9maWVsZHN8JyArDQogICAgICAgICdpbmdyZXNfbnVtX3Jvd3N8aW5ncmVzX3Bjb25uZWN0fGluZ3Jlc19wcmVwYXJlfGluZ3Jlc19xdWVyeXxpbmdyZXNfcmVzdWx0X3NlZWt8aW5ncmVzX3JvbGxiYWNrfGluZ3Jlc19zZXRfZW52aXJvbm1lbnR8JyArDQogICAgICAgICdpbmdyZXNfdW5idWZmZXJlZF9xdWVyeXxpbmlfYWx0ZXJ8aW5pX2dldHxpbmlfZ2V0X2FsbHxpbmlfcmVzdG9yZXxpbmlfc2V0fGlubmFtZXNwYWNlfGlub3RpZnlfYWRkX3dhdGNofGlub3RpZnlfaW5pdHxpbm90aWZ5X3F1ZXVlX2xlbnwnICsNCiAgICAgICAgJ2lub3RpZnlfcmVhZHxpbm90aWZ5X3JtX3dhdGNofGludGVyZmFjZV9leGlzdHN8aW50bF9lcnJvcl9uYW1lfGludGxfZ2V0X2Vycm9yX2NvZGV8aW50bF9nZXRfZXJyb3JfbWVzc2FnZXxpbnRsX2lzX2ZhaWx1cmV8JyArDQogICAgICAgICdpbnRsZGF0ZWZvcm1hdHRlcnxpbnR2YWx8aW52YWxpZGFyZ3VtZW50ZXhjZXB0aW9ufGludm9rZXxpbnZva2VhcmdzfGlwMmxvbmd8aXB0Y2VtYmVkfGlwdGNwYXJzZXxpc19hfGlzX2FycmF5fGlzX2Jvb2x8aXNfY2FsbGFibGV8aXNfZGlyfCcgKw0KICAgICAgICAnaXNfZG91YmxlfGlzX2V4ZWN1dGFibGV8aXNfZmlsZXxpc19maW5pdGV8aXNfZmxvYXR8aXNfaW5maW5pdGV8aXNfaW50fGlzX2ludGVnZXJ8aXNfbGlua3xpc19sb25nfGlzX25hbnxpc19udWxsfGlzX251bWVyaWN8aXNfb2JqZWN0fCcgKw0KICAgICAgICAnaXNfcmVhZGFibGV8aXNfcmVhbHxpc19yZXNvdXJjZXxpc19zY2FsYXJ8aXNfc29hcF9mYXVsdHxpc19zdHJpbmd8aXNfc3ViY2xhc3Nfb2Z8aXNfdXBsb2FkZWRfZmlsZXxpc193cml0YWJsZXxpc193cml0ZWFibGV8aXNhYnN0cmFjdHwnICsNCiAgICAgICAgJ2lzY2xvbmVhYmxlfGlzZGlzYWJsZWR8aXNmaW5hbHxpc2luc3RhbmNlfGlzaW5zdGFudGlhYmxlfGlzaW50ZXJmYWNlfGlzaW50ZXJuYWx8aXNpdGVyYXRlYWJsZXxpc3NldHxpc3N1YmNsYXNzb2Z8aXN1c2VyZGVmaW5lZHxpdGVyYXRvcnwnICsNCiAgICAgICAgJ2l0ZXJhdG9yX2FwcGx5fGl0ZXJhdG9yX2NvdW50fGl0ZXJhdG9yX3RvX2FycmF5fGl0ZXJhdG9yYWdncmVnYXRlfGl0ZXJhdG9yaXRlcmF0b3J8amF2YV9sYXN0X2V4Y2VwdGlvbl9jbGVhcnxqYXZhX2xhc3RfZXhjZXB0aW9uX2dldHwnICsNCiAgICAgICAgJ2pkZGF5b2Z3ZWVrfGpkbW9udGhuYW1lfGpkdG9mcmVuY2h8amR0b2dyZWdvcmlhbnxqZHRvamV3aXNofGpkdG9qdWxpYW58amR0b3VuaXh8amV3aXNodG9qZHxqb2lufGpwZWcyd2JtcHxqc29uX2RlY29kZXxqc29uX2VuY29kZXwnICsNCiAgICAgICAgJ2pzb25fbGFzdF9lcnJvcnxqc29uc2VyaWFsaXphYmxlfGp1ZHl8anVkeV90eXBlfGp1ZHlfdmVyc2lvbnxqdWxpYW50b2pkfGthZG01X2NocGFzc19wcmluY2lwYWx8a2FkbTVfY3JlYXRlX3ByaW5jaXBhbHwnICsNCiAgICAgICAgJ2thZG01X2RlbGV0ZV9wcmluY2lwYWx8a2FkbTVfZGVzdHJveXxrYWRtNV9mbHVzaHxrYWRtNV9nZXRfcG9saWNpZXN8a2FkbTVfZ2V0X3ByaW5jaXBhbHxrYWRtNV9nZXRfcHJpbmNpcGFsc3xrYWRtNV9pbml0X3dpdGhfcGFzc3dvcmR8JyArDQogICAgICAgICdrYWRtNV9tb2RpZnlfcHJpbmNpcGFsfGtleXxrcnNvcnR8a3NvcnR8bGNmaXJzdHxsY2dfdmFsdWV8bGNoZ3JwfGxjaG93bnxsZGFwXzg4NTlfdG9fdDYxfGxkYXBfYWRkfGxkYXBfYmluZHxsZGFwX2Nsb3NlfGxkYXBfY29tcGFyZXwnICsNCiAgICAgICAgJ2xkYXBfY29ubmVjdHxsZGFwX2NvdW50X2VudHJpZXN8bGRhcF9kZWxldGV8bGRhcF9kbjJ1Zm58bGRhcF9lcnIyc3RyfGxkYXBfZXJybm98bGRhcF9lcnJvcnxsZGFwX2V4cGxvZGVfZG58bGRhcF9maXJzdF9hdHRyaWJ1dGV8JyArDQogICAgICAgICdsZGFwX2ZpcnN0X2VudHJ5fGxkYXBfZmlyc3RfcmVmZXJlbmNlfGxkYXBfZnJlZV9yZXN1bHR8bGRhcF9nZXRfYXR0cmlidXRlc3xsZGFwX2dldF9kbnxsZGFwX2dldF9lbnRyaWVzfGxkYXBfZ2V0X29wdGlvbnxsZGFwX2dldF92YWx1ZXN8JyArDQogICAgICAgICdsZGFwX2dldF92YWx1ZXNfbGVufGxkYXBfbGlzdHxsZGFwX21vZF9hZGR8bGRhcF9tb2RfZGVsfGxkYXBfbW9kX3JlcGxhY2V8bGRhcF9tb2RpZnl8bGRhcF9uZXh0X2F0dHJpYnV0ZXxsZGFwX25leHRfZW50cnl8JyArDQogICAgICAgICdsZGFwX25leHRfcmVmZXJlbmNlfGxkYXBfcGFyc2VfcmVmZXJlbmNlfGxkYXBfcGFyc2VfcmVzdWx0fGxkYXBfcmVhZHxsZGFwX3JlbmFtZXxsZGFwX3Nhc2xfYmluZHxsZGFwX3NlYXJjaHxsZGFwX3NldF9vcHRpb258JyArDQogICAgICAgICdsZGFwX3NldF9yZWJpbmRfcHJvY3xsZGFwX3NvcnR8bGRhcF9zdGFydF90bHN8bGRhcF90NjFfdG9fODg1OXxsZGFwX3VuYmluZHxsZW5ndGhleGNlcHRpb258bGV2ZW5zaHRlaW58bGlieG1sX2NsZWFyX2Vycm9yc3wnICsNCiAgICAgICAgJ2xpYnhtbF9kaXNhYmxlX2VudGl0eV9sb2FkZXJ8bGlieG1sX2dldF9lcnJvcnN8bGlieG1sX2dldF9sYXN0X2Vycm9yfGxpYnhtbF9zZXRfc3RyZWFtc19jb250ZXh0fGxpYnhtbF91c2VfaW50ZXJuYWxfZXJyb3JzfGxpYnhtbGVycm9yfCcgKw0KICAgICAgICAnbGltaXRpdGVyYXRvcnxsaW5rfGxpbmtpbmZvfGxpc3R8bG9jYWxlfGxvY2FsZWNvbnZ8bG9jYWx0aW1lfGxvZ3xsb2cxMHxsb2cxcHxsb2dpY2V4Y2VwdGlvbnxsb25nMmlwfGxzdGF0fGx0cmltfGx6Zl9jb21wcmVzc3wnICsNCiAgICAgICAgJ2x6Zl9kZWNvbXByZXNzfGx6Zl9vcHRpbWl6ZWRfZm9yfG1fY2hlY2tzdGF0dXN8bV9jb21wbGV0ZWF1dGhvcml6YXRpb25zfG1fY29ubmVjdHxtX2Nvbm5lY3Rpb25lcnJvcnxtX2RlbGV0ZXRyYW5zfG1fZGVzdHJveWNvbm58JyArDQogICAgICAgICdtX2Rlc3Ryb3llbmdpbmV8bV9nZXRjZWxsfG1fZ2V0Y2VsbGJ5bnVtfG1fZ2V0Y29tbWFkZWxpbWl0ZWR8bV9nZXRoZWFkZXJ8bV9pbml0Y29ubnxtX2luaXRlbmdpbmV8bV9pc2NvbW1hZGVsaW1pdGVkfG1fbWF4Y29ubnRpbWVvdXR8JyArDQogICAgICAgICdtX21vbml0b3J8bV9udW1jb2x1bW5zfG1fbnVtcm93c3xtX3BhcnNlY29tbWFkZWxpbWl0ZWR8bV9yZXNwb25zZWtleXN8bV9yZXNwb25zZXBhcmFtfG1fcmV0dXJuc3RhdHVzfG1fc2V0YmxvY2tpbmd8bV9zZXRkcm9wZmlsZXxtX3NldGlwfCcgKw0KICAgICAgICAnbV9zZXRzc2x8bV9zZXRzc2xfY2FmaWxlfG1fc2V0c3NsX2ZpbGVzfG1fc2V0dGltZW91dHxtX3NzbGNlcnRfZ2VuX2hhc2h8bV90cmFuc2FjdGlvbnNzZW50fG1fdHJhbnNpbnF1ZXVlfG1fdHJhbnNrZXl2YWx8bV90cmFuc25ld3wnICsNCiAgICAgICAgJ21fdHJhbnNzZW5kfG1fdXdhaXR8bV92YWxpZGF0ZWlkZW50aWZpZXJ8bV92ZXJpZnljb25uZWN0aW9ufG1fdmVyaWZ5c3NsY2VydHxtYWdpY19xdW90ZXNfcnVudGltZXxtYWlsfCcgKw0KICAgICAgICAnbWFpbHBhcnNlX2RldGVybWluZV9iZXN0X3hmZXJfZW5jb2Rpbmd8bWFpbHBhcnNlX21zZ19jcmVhdGV8bWFpbHBhcnNlX21zZ19leHRyYWN0X3BhcnR8bWFpbHBhcnNlX21zZ19leHRyYWN0X3BhcnRfZmlsZXwnICsNCiAgICAgICAgJ21haWxwYXJzZV9tc2dfZXh0cmFjdF93aG9sZV9wYXJ0X2ZpbGV8bWFpbHBhcnNlX21zZ19mcmVlfG1haWxwYXJzZV9tc2dfZ2V0X3BhcnR8bWFpbHBhcnNlX21zZ19nZXRfcGFydF9kYXRhfG1haWxwYXJzZV9tc2dfZ2V0X3N0cnVjdHVyZXwnICsNCiAgICAgICAgJ21haWxwYXJzZV9tc2dfcGFyc2V8bWFpbHBhcnNlX21zZ19wYXJzZV9maWxlfG1haWxwYXJzZV9yZmM4MjJfcGFyc2VfYWRkcmVzc2VzfG1haWxwYXJzZV9zdHJlYW1fZW5jb2RlfG1haWxwYXJzZV91dWRlY29kZV9hbGx8bWFpbnxtYXh8JyArDQogICAgICAgICdtYXhkYl9hZmZlY3RlZF9yb3dzfG1heGRiX2F1dG9jb21taXR8bWF4ZGJfYmluZF9wYXJhbXxtYXhkYl9iaW5kX3Jlc3VsdHxtYXhkYl9jaGFuZ2VfdXNlcnxtYXhkYl9jaGFyYWN0ZXJfc2V0X25hbWV8bWF4ZGJfY2xpZW50X2VuY29kaW5nfCcgKw0KICAgICAgICAnbWF4ZGJfY2xvc2V8bWF4ZGJfY2xvc2VfbG9uZ19kYXRhfG1heGRiX2NvbW1pdHxtYXhkYl9jb25uZWN0fG1heGRiX2Nvbm5lY3RfZXJybm98bWF4ZGJfY29ubmVjdF9lcnJvcnxtYXhkYl9kYXRhX3NlZWt8bWF4ZGJfZGVidWd8JyArDQogICAgICAgICdtYXhkYl9kaXNhYmxlX3JlYWRzX2Zyb21fbWFzdGVyfG1heGRiX2Rpc2FibGVfcnBsX3BhcnNlfG1heGRiX2R1bXBfZGVidWdfaW5mb3xtYXhkYl9lbWJlZGRlZF9jb25uZWN0fG1heGRiX2VuYWJsZV9yZWFkc19mcm9tX21hc3RlcnwnICsNCiAgICAgICAgJ21heGRiX2VuYWJsZV9ycGxfcGFyc2V8bWF4ZGJfZXJybm98bWF4ZGJfZXJyb3J8bWF4ZGJfZXNjYXBlX3N0cmluZ3xtYXhkYl9leGVjdXRlfG1heGRiX2ZldGNofG1heGRiX2ZldGNoX2FycmF5fG1heGRiX2ZldGNoX2Fzc29jfCcgKw0KICAgICAgICAnbWF4ZGJfZmV0Y2hfZmllbGR8bWF4ZGJfZmV0Y2hfZmllbGRfZGlyZWN0fG1heGRiX2ZldGNoX2ZpZWxkc3xtYXhkYl9mZXRjaF9sZW5ndGhzfG1heGRiX2ZldGNoX29iamVjdHxtYXhkYl9mZXRjaF9yb3d8bWF4ZGJfZmllbGRfY291bnR8JyArDQogICAgICAgICdtYXhkYl9maWVsZF9zZWVrfG1heGRiX2ZpZWxkX3RlbGx8bWF4ZGJfZnJlZV9yZXN1bHR8bWF4ZGJfZ2V0X2NsaWVudF9pbmZvfG1heGRiX2dldF9jbGllbnRfdmVyc2lvbnxtYXhkYl9nZXRfaG9zdF9pbmZvfG1heGRiX2dldF9tZXRhZGF0YXwnICsNCiAgICAgICAgJ21heGRiX2dldF9wcm90b19pbmZvfG1heGRiX2dldF9zZXJ2ZXJfaW5mb3xtYXhkYl9nZXRfc2VydmVyX3ZlcnNpb258bWF4ZGJfaW5mb3xtYXhkYl9pbml0fG1heGRiX2luc2VydF9pZHxtYXhkYl9raWxsfG1heGRiX21hc3Rlcl9xdWVyeXwnICsNCiAgICAgICAgJ21heGRiX21vcmVfcmVzdWx0c3xtYXhkYl9tdWx0aV9xdWVyeXxtYXhkYl9uZXh0X3Jlc3VsdHxtYXhkYl9udW1fZmllbGRzfG1heGRiX251bV9yb3dzfG1heGRiX29wdGlvbnN8bWF4ZGJfcGFyYW1fY291bnR8bWF4ZGJfcGluZ3wnICsNCiAgICAgICAgJ21heGRiX3ByZXBhcmV8bWF4ZGJfcXVlcnl8bWF4ZGJfcmVhbF9jb25uZWN0fG1heGRiX3JlYWxfZXNjYXBlX3N0cmluZ3xtYXhkYl9yZWFsX3F1ZXJ5fG1heGRiX3JlcG9ydHxtYXhkYl9yb2xsYmFja3wnICsNCiAgICAgICAgJ21heGRiX3JwbF9wYXJzZV9lbmFibGVkfG1heGRiX3JwbF9wcm9iZXxtYXhkYl9ycGxfcXVlcnlfdHlwZXxtYXhkYl9zZWxlY3RfZGJ8bWF4ZGJfc2VuZF9sb25nX2RhdGF8bWF4ZGJfc2VuZF9xdWVyeXxtYXhkYl9zZXJ2ZXJfZW5kfCcgKw0KICAgICAgICAnbWF4ZGJfc2VydmVyX2luaXR8bWF4ZGJfc2V0X29wdHxtYXhkYl9zcWxzdGF0ZXxtYXhkYl9zc2xfc2V0fG1heGRiX3N0YXR8bWF4ZGJfc3RtdF9hZmZlY3RlZF9yb3dzfG1heGRiX3N0bXRfYmluZF9wYXJhbXwnICsNCiAgICAgICAgJ21heGRiX3N0bXRfYmluZF9yZXN1bHR8bWF4ZGJfc3RtdF9jbG9zZXxtYXhkYl9zdG10X2Nsb3NlX2xvbmdfZGF0YXxtYXhkYl9zdG10X2RhdGFfc2Vla3xtYXhkYl9zdG10X2Vycm5vfG1heGRiX3N0bXRfZXJyb3J8JyArDQogICAgICAgICdtYXhkYl9zdG10X2V4ZWN1dGV8bWF4ZGJfc3RtdF9mZXRjaHxtYXhkYl9zdG10X2ZyZWVfcmVzdWx0fG1heGRiX3N0bXRfaW5pdHxtYXhkYl9zdG10X251bV9yb3dzfG1heGRiX3N0bXRfcGFyYW1fY291bnR8bWF4ZGJfc3RtdF9wcmVwYXJlfCcgKw0KICAgICAgICAnbWF4ZGJfc3RtdF9yZXNldHxtYXhkYl9zdG10X3Jlc3VsdF9tZXRhZGF0YXxtYXhkYl9zdG10X3NlbmRfbG9uZ19kYXRhfG1heGRiX3N0bXRfc3Fsc3RhdGV8bWF4ZGJfc3RtdF9zdG9yZV9yZXN1bHR8bWF4ZGJfc3RvcmVfcmVzdWx0fCcgKw0KICAgICAgICAnbWF4ZGJfdGhyZWFkX2lkfG1heGRiX3RocmVhZF9zYWZlfG1heGRiX3VzZV9yZXN1bHR8bWF4ZGJfd2FybmluZ19jb3VudHxtYl9jaGVja19lbmNvZGluZ3xtYl9jb252ZXJ0X2Nhc2V8bWJfY29udmVydF9lbmNvZGluZ3wnICsNCiAgICAgICAgJ21iX2NvbnZlcnRfa2FuYXxtYl9jb252ZXJ0X3ZhcmlhYmxlc3xtYl9kZWNvZGVfbWltZWhlYWRlcnxtYl9kZWNvZGVfbnVtZXJpY2VudGl0eXxtYl9kZXRlY3RfZW5jb2Rpbmd8bWJfZGV0ZWN0X29yZGVyfG1iX2VuY29kZV9taW1laGVhZGVyfCcgKw0KICAgICAgICAnbWJfZW5jb2RlX251bWVyaWNlbnRpdHl8bWJfZW5jb2RpbmdfYWxpYXNlc3xtYl9lcmVnfG1iX2VyZWdfbWF0Y2h8bWJfZXJlZ19yZXBsYWNlfG1iX2VyZWdfc2VhcmNofG1iX2VyZWdfc2VhcmNoX2dldHBvc3wnICsNCiAgICAgICAgJ21iX2VyZWdfc2VhcmNoX2dldHJlZ3N8bWJfZXJlZ19zZWFyY2hfaW5pdHxtYl9lcmVnX3NlYXJjaF9wb3N8bWJfZXJlZ19zZWFyY2hfcmVnc3xtYl9lcmVnX3NlYXJjaF9zZXRwb3N8bWJfZXJlZ2l8bWJfZXJlZ2lfcmVwbGFjZXwnICsNCiAgICAgICAgJ21iX2dldF9pbmZvfG1iX2h0dHBfaW5wdXR8bWJfaHR0cF9vdXRwdXR8bWJfaW50ZXJuYWxfZW5jb2Rpbmd8bWJfbGFuZ3VhZ2V8bWJfbGlzdF9lbmNvZGluZ3N8bWJfb3V0cHV0X2hhbmRsZXJ8bWJfcGFyc2Vfc3RyfCcgKw0KICAgICAgICAnbWJfcHJlZmVycmVkX21pbWVfbmFtZXxtYl9yZWdleF9lbmNvZGluZ3xtYl9yZWdleF9zZXRfb3B0aW9uc3xtYl9zZW5kX21haWx8bWJfc3BsaXR8bWJfc3RyY3V0fG1iX3N0cmltd2lkdGh8bWJfc3RyaXBvc3xtYl9zdHJpc3RyfCcgKw0KICAgICAgICAnbWJfc3RybGVufG1iX3N0cnBvc3xtYl9zdHJyY2hyfG1iX3N0cnJpY2hyfG1iX3N0cnJpcG9zfG1iX3N0cnJwb3N8bWJfc3Ryc3RyfG1iX3N0cnRvbG93ZXJ8bWJfc3RydG91cHBlcnxtYl9zdHJ3aWR0aHwnICsNCiAgICAgICAgJ21iX3N1YnN0aXR1dGVfY2hhcmFjdGVyfG1iX3N1YnN0cnxtYl9zdWJzdHJfY291bnR8bWNyeXB0X2NiY3xtY3J5cHRfY2ZifG1jcnlwdF9jcmVhdGVfaXZ8bWNyeXB0X2RlY3J5cHR8bWNyeXB0X2VjYnwnICsNCiAgICAgICAgJ21jcnlwdF9lbmNfZ2V0X2FsZ29yaXRobXNfbmFtZXxtY3J5cHRfZW5jX2dldF9ibG9ja19zaXplfG1jcnlwdF9lbmNfZ2V0X2l2X3NpemV8bWNyeXB0X2VuY19nZXRfa2V5X3NpemV8bWNyeXB0X2VuY19nZXRfbW9kZXNfbmFtZXwnICsNCiAgICAgICAgJ21jcnlwdF9lbmNfZ2V0X3N1cHBvcnRlZF9rZXlfc2l6ZXN8bWNyeXB0X2VuY19pc19ibG9ja19hbGdvcml0aG18bWNyeXB0X2VuY19pc19ibG9ja19hbGdvcml0aG1fbW9kZXxtY3J5cHRfZW5jX2lzX2Jsb2NrX21vZGV8JyArDQogICAgICAgICdtY3J5cHRfZW5jX3NlbGZfdGVzdHxtY3J5cHRfZW5jcnlwdHxtY3J5cHRfZ2VuZXJpY3xtY3J5cHRfZ2VuZXJpY19kZWluaXR8bWNyeXB0X2dlbmVyaWNfZW5kfG1jcnlwdF9nZW5lcmljX2luaXR8bWNyeXB0X2dldF9ibG9ja19zaXplfCcgKw0KICAgICAgICAnbWNyeXB0X2dldF9jaXBoZXJfbmFtZXxtY3J5cHRfZ2V0X2l2X3NpemV8bWNyeXB0X2dldF9rZXlfc2l6ZXxtY3J5cHRfbGlzdF9hbGdvcml0aG1zfG1jcnlwdF9saXN0X21vZGVzfG1jcnlwdF9tb2R1bGVfY2xvc2V8JyArDQogICAgICAgICdtY3J5cHRfbW9kdWxlX2dldF9hbGdvX2Jsb2NrX3NpemV8bWNyeXB0X21vZHVsZV9nZXRfYWxnb19rZXlfc2l6ZXxtY3J5cHRfbW9kdWxlX2dldF9zdXBwb3J0ZWRfa2V5X3NpemVzfG1jcnlwdF9tb2R1bGVfaXNfYmxvY2tfYWxnb3JpdGhtfCcgKw0KICAgICAgICAnbWNyeXB0X21vZHVsZV9pc19ibG9ja19hbGdvcml0aG1fbW9kZXxtY3J5cHRfbW9kdWxlX2lzX2Jsb2NrX21vZGV8bWNyeXB0X21vZHVsZV9vcGVufG1jcnlwdF9tb2R1bGVfc2VsZl90ZXN0fG1jcnlwdF9vZmJ8bWQ1fG1kNV9maWxlfCcgKw0KICAgICAgICAnbWRlY3J5cHRfZ2VuZXJpY3xtZW1jYWNoZXxtZW1jYWNoZV9kZWJ1Z3xtZW1jYWNoZWR8bWVtb3J5X2dldF9wZWFrX3VzYWdlfG1lbW9yeV9nZXRfdXNhZ2V8bWVzc2FnZWZvcm1hdHRlcnxtZXRhcGhvbmV8bWV0aG9kX2V4aXN0c3xtaGFzaHwnICsNCiAgICAgICAgJ21oYXNoX2NvdW50fG1oYXNoX2dldF9ibG9ja19zaXplfG1oYXNoX2dldF9oYXNoX25hbWV8bWhhc2hfa2V5Z2VuX3Mya3xtaWNyb3RpbWV8bWltZV9jb250ZW50X3R5cGV8bWlufG1pbmdfa2V5cHJlc3N8JyArDQogICAgICAgICdtaW5nX3NldGN1YmljdGhyZXNob2xkfG1pbmdfc2V0c2NhbGV8bWluZ19zZXRzd2Zjb21wcmVzc2lvbnxtaW5nX3VzZWNvbnN0YW50c3xtaW5nX3VzZXN3ZnZlcnNpb258bWtkaXJ8bWt0aW1lfG1vbmV5X2Zvcm1hdHxtb25nb3wnICsNCiAgICAgICAgJ21vbmdvYmluZGF0YXxtb25nb2NvZGV8bW9uZ29jb2xsZWN0aW9ufG1vbmdvY29ubmVjdGlvbmV4Y2VwdGlvbnxtb25nb2N1cnNvcnxtb25nb2N1cnNvcmV4Y2VwdGlvbnxtb25nb2N1cnNvcnRpbWVvdXRleGNlcHRpb258bW9uZ29kYXRlfCcgKw0KICAgICAgICAnbW9uZ29kYnxtb25nb2RicmVmfG1vbmdvZXhjZXB0aW9ufG1vbmdvZ3JpZGZzfG1vbmdvZ3JpZGZzY3Vyc29yfG1vbmdvZ3JpZGZzZXhjZXB0aW9ufG1vbmdvZ3JpZGZzZmlsZXxtb25nb2lkfG1vbmdvaW50MzJ8bW9uZ29pbnQ2NHwnICsNCiAgICAgICAgJ21vbmdvbWF4a2V5fG1vbmdvbWlua2V5fG1vbmdvcmVnZXh8bW9uZ290aW1lc3RhbXB8bW92ZV91cGxvYWRlZF9maWxlfG1wZWdmaWxlfG1xc2VyaWVzX2JhY2t8bXFzZXJpZXNfYmVnaW58bXFzZXJpZXNfY2xvc2V8bXFzZXJpZXNfY21pdHwnICsNCiAgICAgICAgJ21xc2VyaWVzX2Nvbm58bXFzZXJpZXNfY29ubnh8bXFzZXJpZXNfZGlzY3xtcXNlcmllc19nZXR8bXFzZXJpZXNfaW5xfG1xc2VyaWVzX29wZW58bXFzZXJpZXNfcHV0fG1xc2VyaWVzX3B1dDF8bXFzZXJpZXNfc2V0fCcgKw0KICAgICAgICAnbXFzZXJpZXNfc3RyZXJyb3J8bXNlc3Npb25fY29ubmVjdHxtc2Vzc2lvbl9jb3VudHxtc2Vzc2lvbl9jcmVhdGV8bXNlc3Npb25fZGVzdHJveXxtc2Vzc2lvbl9kaXNjb25uZWN0fG1zZXNzaW9uX2ZpbmR8bXNlc3Npb25fZ2V0fCcgKw0KICAgICAgICAnbXNlc3Npb25fZ2V0X2FycmF5fG1zZXNzaW9uX2dldF9kYXRhfG1zZXNzaW9uX2luY3xtc2Vzc2lvbl9saXN0fG1zZXNzaW9uX2xpc3R2YXJ8bXNlc3Npb25fbG9ja3xtc2Vzc2lvbl9wbHVnaW58bXNlc3Npb25fcmFuZHN0cnwnICsNCiAgICAgICAgJ21zZXNzaW9uX3NldHxtc2Vzc2lvbl9zZXRfYXJyYXl8bXNlc3Npb25fc2V0X2RhdGF8bXNlc3Npb25fdGltZW91dHxtc2Vzc2lvbl91bmlxfG1zZXNzaW9uX3VubG9ja3xtc2dfZ2V0X3F1ZXVlfG1zZ19xdWV1ZV9leGlzdHN8JyArDQogICAgICAgICdtc2dfcmVjZWl2ZXxtc2dfcmVtb3ZlX3F1ZXVlfG1zZ19zZW5kfG1zZ19zZXRfcXVldWV8bXNnX3N0YXRfcXVldWV8bXNxbHxtc3FsX2FmZmVjdGVkX3Jvd3N8bXNxbF9jbG9zZXxtc3FsX2Nvbm5lY3R8bXNxbF9jcmVhdGVfZGJ8JyArDQogICAgICAgICdtc3FsX2NyZWF0ZWRifG1zcWxfZGF0YV9zZWVrfG1zcWxfZGJfcXVlcnl8bXNxbF9kYm5hbWV8bXNxbF9kcm9wX2RifG1zcWxfZXJyb3J8bXNxbF9mZXRjaF9hcnJheXxtc3FsX2ZldGNoX2ZpZWxkfG1zcWxfZmV0Y2hfb2JqZWN0fCcgKw0KICAgICAgICAnbXNxbF9mZXRjaF9yb3d8bXNxbF9maWVsZF9mbGFnc3xtc3FsX2ZpZWxkX2xlbnxtc3FsX2ZpZWxkX25hbWV8bXNxbF9maWVsZF9zZWVrfG1zcWxfZmllbGRfdGFibGV8bXNxbF9maWVsZF90eXBlfG1zcWxfZmllbGRmbGFnc3wnICsNCiAgICAgICAgJ21zcWxfZmllbGRsZW58bXNxbF9maWVsZG5hbWV8bXNxbF9maWVsZHRhYmxlfG1zcWxfZmllbGR0eXBlfG1zcWxfZnJlZV9yZXN1bHR8bXNxbF9saXN0X2Ric3xtc3FsX2xpc3RfZmllbGRzfG1zcWxfbGlzdF90YWJsZXN8JyArDQogICAgICAgICdtc3FsX251bV9maWVsZHN8bXNxbF9udW1fcm93c3xtc3FsX251bWZpZWxkc3xtc3FsX251bXJvd3N8bXNxbF9wY29ubmVjdHxtc3FsX3F1ZXJ5fG1zcWxfcmVnY2FzZXxtc3FsX3Jlc3VsdHxtc3FsX3NlbGVjdF9kYnxtc3FsX3RhYmxlbmFtZXwnICsNCiAgICAgICAgJ21zc3FsX2JpbmR8bXNzcWxfY2xvc2V8bXNzcWxfY29ubmVjdHxtc3NxbF9kYXRhX3NlZWt8bXNzcWxfZXhlY3V0ZXxtc3NxbF9mZXRjaF9hcnJheXxtc3NxbF9mZXRjaF9hc3NvY3xtc3NxbF9mZXRjaF9iYXRjaHwnICsNCiAgICAgICAgJ21zc3FsX2ZldGNoX2ZpZWxkfG1zc3FsX2ZldGNoX29iamVjdHxtc3NxbF9mZXRjaF9yb3d8bXNzcWxfZmllbGRfbGVuZ3RofG1zc3FsX2ZpZWxkX25hbWV8bXNzcWxfZmllbGRfc2Vla3xtc3NxbF9maWVsZF90eXBlfCcgKw0KICAgICAgICAnbXNzcWxfZnJlZV9yZXN1bHR8bXNzcWxfZnJlZV9zdGF0ZW1lbnR8bXNzcWxfZ2V0X2xhc3RfbWVzc2FnZXxtc3NxbF9ndWlkX3N0cmluZ3xtc3NxbF9pbml0fG1zc3FsX21pbl9lcnJvcl9zZXZlcml0eXwnICsNCiAgICAgICAgJ21zc3FsX21pbl9tZXNzYWdlX3NldmVyaXR5fG1zc3FsX25leHRfcmVzdWx0fG1zc3FsX251bV9maWVsZHN8bXNzcWxfbnVtX3Jvd3N8bXNzcWxfcGNvbm5lY3R8bXNzcWxfcXVlcnl8bXNzcWxfcmVzdWx0fG1zc3FsX3Jvd3NfYWZmZWN0ZWR8JyArDQogICAgICAgICdtc3NxbF9zZWxlY3RfZGJ8bXRfZ2V0cmFuZG1heHxtdF9yYW5kfG10X3NyYW5kfG11bHRpcGxlaXRlcmF0b3J8bXlzcWxfYWZmZWN0ZWRfcm93c3xteXNxbF9jbGllbnRfZW5jb2Rpbmd8bXlzcWxfY2xvc2V8bXlzcWxfY29ubmVjdHwnICsNCiAgICAgICAgJ215c3FsX2NyZWF0ZV9kYnxteXNxbF9kYXRhX3NlZWt8bXlzcWxfZGJfbmFtZXxteXNxbF9kYl9xdWVyeXxteXNxbF9kcm9wX2RifG15c3FsX2Vycm5vfG15c3FsX2Vycm9yfG15c3FsX2VzY2FwZV9zdHJpbmd8bXlzcWxfZmV0Y2hfYXJyYXl8JyArDQogICAgICAgICdteXNxbF9mZXRjaF9hc3NvY3xteXNxbF9mZXRjaF9maWVsZHxteXNxbF9mZXRjaF9sZW5ndGhzfG15c3FsX2ZldGNoX29iamVjdHxteXNxbF9mZXRjaF9yb3d8bXlzcWxfZmllbGRfZmxhZ3N8bXlzcWxfZmllbGRfbGVufCcgKw0KICAgICAgICAnbXlzcWxfZmllbGRfbmFtZXxteXNxbF9maWVsZF9zZWVrfG15c3FsX2ZpZWxkX3RhYmxlfG15c3FsX2ZpZWxkX3R5cGV8bXlzcWxfZnJlZV9yZXN1bHR8bXlzcWxfZ2V0X2NsaWVudF9pbmZvfG15c3FsX2dldF9ob3N0X2luZm98JyArDQogICAgICAgICdteXNxbF9nZXRfcHJvdG9faW5mb3xteXNxbF9nZXRfc2VydmVyX2luZm98bXlzcWxfaW5mb3xteXNxbF9pbnNlcnRfaWR8bXlzcWxfbGlzdF9kYnN8bXlzcWxfbGlzdF9maWVsZHN8bXlzcWxfbGlzdF9wcm9jZXNzZXN8JyArDQogICAgICAgICdteXNxbF9saXN0X3RhYmxlc3xteXNxbF9udW1fZmllbGRzfG15c3FsX251bV9yb3dzfG15c3FsX3Bjb25uZWN0fG15c3FsX3Bpbmd8bXlzcWxfcXVlcnl8bXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nfG15c3FsX3Jlc3VsdHwnICsNCiAgICAgICAgJ215c3FsX3NlbGVjdF9kYnxteXNxbF9zZXRfY2hhcnNldHxteXNxbF9zdGF0fG15c3FsX3RhYmxlbmFtZXxteXNxbF90aHJlYWRfaWR8bXlzcWxfdW5idWZmZXJlZF9xdWVyeXxteXNxbGl8bXlzcWxpX2JpbmRfcGFyYW18JyArDQogICAgICAgICdteXNxbGlfYmluZF9yZXN1bHR8bXlzcWxpX2NsaWVudF9lbmNvZGluZ3xteXNxbGlfY29ubmVjdHxteXNxbGlfZGlzYWJsZV9yZWFkc19mcm9tX21hc3RlcnxteXNxbGlfZGlzYWJsZV9ycGxfcGFyc2V8bXlzcWxpX2RyaXZlcnwnICsNCiAgICAgICAgJ215c3FsaV9lbmFibGVfcmVhZHNfZnJvbV9tYXN0ZXJ8bXlzcWxpX2VuYWJsZV9ycGxfcGFyc2V8bXlzcWxpX2VzY2FwZV9zdHJpbmd8bXlzcWxpX2V4ZWN1dGV8bXlzcWxpX2ZldGNofG15c3FsaV9nZXRfbWV0YWRhdGF8JyArDQogICAgICAgICdteXNxbGlfbWFzdGVyX3F1ZXJ5fG15c3FsaV9wYXJhbV9jb3VudHxteXNxbGlfcmVwb3J0fG15c3FsaV9yZXN1bHR8bXlzcWxpX3JwbF9wYXJzZV9lbmFibGVkfG15c3FsaV9ycGxfcHJvYmV8bXlzcWxpX3JwbF9xdWVyeV90eXBlfCcgKw0KICAgICAgICAnbXlzcWxpX3NlbmRfbG9uZ19kYXRhfG15c3FsaV9zZW5kX3F1ZXJ5fG15c3FsaV9zZXRfb3B0fG15c3FsaV9zbGF2ZV9xdWVyeXxteXNxbGlfc3RtdHxteXNxbGlfd2FybmluZ3xteXNxbG5kX21zX2dldF9zdGF0c3wnICsNCiAgICAgICAgJ215c3FsbmRfbXNfcXVlcnlfaXNfc2VsZWN0fG15c3FsbmRfbXNfc2V0X3VzZXJfcGlja19zZXJ2ZXJ8bXlzcWxuZF9xY19jaGFuZ2VfaGFuZGxlcnxteXNxbG5kX3FjX2NsZWFyX2NhY2hlfG15c3FsbmRfcWNfZ2V0X2NhY2hlX2luZm98JyArDQogICAgICAgICdteXNxbG5kX3FjX2dldF9jb3JlX3N0YXRzfG15c3FsbmRfcWNfZ2V0X2hhbmRsZXJ8bXlzcWxuZF9xY19nZXRfcXVlcnlfdHJhY2VfbG9nfG15c3FsbmRfcWNfc2V0X3VzZXJfaGFuZGxlcnN8bmF0Y2FzZXNvcnR8bmF0c29ydHwnICsNCiAgICAgICAgJ25jdXJzZXNfYWRkY2h8bmN1cnNlc19hZGRjaG5zdHJ8bmN1cnNlc19hZGRjaHN0cnxuY3Vyc2VzX2FkZG5zdHJ8bmN1cnNlc19hZGRzdHJ8bmN1cnNlc19hc3N1bWVfZGVmYXVsdF9jb2xvcnN8bmN1cnNlc19hdHRyb2ZmfCcgKw0KICAgICAgICAnbmN1cnNlc19hdHRyb258bmN1cnNlc19hdHRyc2V0fG5jdXJzZXNfYmF1ZHJhdGV8bmN1cnNlc19iZWVwfG5jdXJzZXNfYmtnZHxuY3Vyc2VzX2JrZ2RzZXR8bmN1cnNlc19ib3JkZXJ8bmN1cnNlc19ib3R0b21fcGFuZWx8JyArDQogICAgICAgICduY3Vyc2VzX2Nhbl9jaGFuZ2VfY29sb3J8bmN1cnNlc19jYnJlYWt8bmN1cnNlc19jbGVhcnxuY3Vyc2VzX2NscnRvYm90fG5jdXJzZXNfY2xydG9lb2x8bmN1cnNlc19jb2xvcl9jb250ZW50fG5jdXJzZXNfY29sb3Jfc2V0fCcgKw0KICAgICAgICAnbmN1cnNlc19jdXJzX3NldHxuY3Vyc2VzX2RlZl9wcm9nX21vZGV8bmN1cnNlc19kZWZfc2hlbGxfbW9kZXxuY3Vyc2VzX2RlZmluZV9rZXl8bmN1cnNlc19kZWxfcGFuZWx8bmN1cnNlc19kZWxheV9vdXRwdXR8bmN1cnNlc19kZWxjaHwnICsNCiAgICAgICAgJ25jdXJzZXNfZGVsZXRlbG58bmN1cnNlc19kZWx3aW58bmN1cnNlc19kb3VwZGF0ZXxuY3Vyc2VzX2VjaG98bmN1cnNlc19lY2hvY2hhcnxuY3Vyc2VzX2VuZHxuY3Vyc2VzX2VyYXNlfG5jdXJzZXNfZXJhc2VjaGFyfG5jdXJzZXNfZmlsdGVyfCcgKw0KICAgICAgICAnbmN1cnNlc19mbGFzaHxuY3Vyc2VzX2ZsdXNoaW5wfG5jdXJzZXNfZ2V0Y2h8bmN1cnNlc19nZXRtYXh5eHxuY3Vyc2VzX2dldG1vdXNlfG5jdXJzZXNfZ2V0eXh8bmN1cnNlc19oYWxmZGVsYXl8bmN1cnNlc19oYXNfY29sb3JzfCcgKw0KICAgICAgICAnbmN1cnNlc19oYXNfaWN8bmN1cnNlc19oYXNfaWx8bmN1cnNlc19oYXNfa2V5fG5jdXJzZXNfaGlkZV9wYW5lbHxuY3Vyc2VzX2hsaW5lfG5jdXJzZXNfaW5jaHxuY3Vyc2VzX2luaXR8bmN1cnNlc19pbml0X2NvbG9yfCcgKw0KICAgICAgICAnbmN1cnNlc19pbml0X3BhaXJ8bmN1cnNlc19pbnNjaHxuY3Vyc2VzX2luc2RlbGxufG5jdXJzZXNfaW5zZXJ0bG58bmN1cnNlc19pbnNzdHJ8bmN1cnNlc19pbnN0cnxuY3Vyc2VzX2lzZW5kd2lufG5jdXJzZXNfa2V5b2t8JyArDQogICAgICAgICduY3Vyc2VzX2tleXBhZHxuY3Vyc2VzX2tpbGxjaGFyfG5jdXJzZXNfbG9uZ25hbWV8bmN1cnNlc19tZXRhfG5jdXJzZXNfbW91c2VfdHJhZm98bmN1cnNlc19tb3VzZWludGVydmFsfG5jdXJzZXNfbW91c2VtYXNrfG5jdXJzZXNfbW92ZXwnICsNCiAgICAgICAgJ25jdXJzZXNfbW92ZV9wYW5lbHxuY3Vyc2VzX212YWRkY2h8bmN1cnNlc19tdmFkZGNobnN0cnxuY3Vyc2VzX212YWRkY2hzdHJ8bmN1cnNlc19tdmFkZG5zdHJ8bmN1cnNlc19tdmFkZHN0cnxuY3Vyc2VzX212Y3VyfCcgKw0KICAgICAgICAnbmN1cnNlc19tdmRlbGNofG5jdXJzZXNfbXZnZXRjaHxuY3Vyc2VzX212aGxpbmV8bmN1cnNlc19tdmluY2h8bmN1cnNlc19tdnZsaW5lfG5jdXJzZXNfbXZ3YWRkc3RyfG5jdXJzZXNfbmFwbXN8bmN1cnNlc19uZXdfcGFuZWx8JyArDQogICAgICAgICduY3Vyc2VzX25ld3BhZHxuY3Vyc2VzX25ld3dpbnxuY3Vyc2VzX25sfG5jdXJzZXNfbm9jYnJlYWt8bmN1cnNlc19ub2VjaG98bmN1cnNlc19ub25sfG5jdXJzZXNfbm9xaWZsdXNofG5jdXJzZXNfbm9yYXd8JyArDQogICAgICAgICduY3Vyc2VzX3BhaXJfY29udGVudHxuY3Vyc2VzX3BhbmVsX2Fib3ZlfG5jdXJzZXNfcGFuZWxfYmVsb3d8bmN1cnNlc19wYW5lbF93aW5kb3d8bmN1cnNlc19wbm91dHJlZnJlc2h8bmN1cnNlc19wcmVmcmVzaHxuY3Vyc2VzX3B1dHB8JyArDQogICAgICAgICduY3Vyc2VzX3FpZmx1c2h8bmN1cnNlc19yYXd8bmN1cnNlc19yZWZyZXNofG5jdXJzZXNfcmVwbGFjZV9wYW5lbHxuY3Vyc2VzX3Jlc2V0X3Byb2dfbW9kZXxuY3Vyc2VzX3Jlc2V0X3NoZWxsX21vZGV8bmN1cnNlc19yZXNldHR5fCcgKw0KICAgICAgICAnbmN1cnNlc19zYXZldHR5fG5jdXJzZXNfc2NyX2R1bXB8bmN1cnNlc19zY3JfaW5pdHxuY3Vyc2VzX3Njcl9yZXN0b3JlfG5jdXJzZXNfc2NyX3NldHxuY3Vyc2VzX3Njcmx8bmN1cnNlc19zaG93X3BhbmVsfG5jdXJzZXNfc2xrX2F0dHJ8JyArDQogICAgICAgICduY3Vyc2VzX3Nsa19hdHRyb2ZmfG5jdXJzZXNfc2xrX2F0dHJvbnxuY3Vyc2VzX3Nsa19hdHRyc2V0fG5jdXJzZXNfc2xrX2NsZWFyfG5jdXJzZXNfc2xrX2NvbG9yfG5jdXJzZXNfc2xrX2luaXR8bmN1cnNlc19zbGtfbm91dHJlZnJlc2h8JyArDQogICAgICAgICduY3Vyc2VzX3Nsa19yZWZyZXNofG5jdXJzZXNfc2xrX3Jlc3RvcmV8bmN1cnNlc19zbGtfc2V0fG5jdXJzZXNfc2xrX3RvdWNofG5jdXJzZXNfc3RhbmRlbmR8bmN1cnNlc19zdGFuZG91dHxuY3Vyc2VzX3N0YXJ0X2NvbG9yfCcgKw0KICAgICAgICAnbmN1cnNlc190ZXJtYXR0cnN8bmN1cnNlc190ZXJtbmFtZXxuY3Vyc2VzX3RpbWVvdXR8bmN1cnNlc190b3BfcGFuZWx8bmN1cnNlc190eXBlYWhlYWR8bmN1cnNlc191bmdldGNofG5jdXJzZXNfdW5nZXRtb3VzZXwnICsNCiAgICAgICAgJ25jdXJzZXNfdXBkYXRlX3BhbmVsc3xuY3Vyc2VzX3VzZV9kZWZhdWx0X2NvbG9yc3xuY3Vyc2VzX3VzZV9lbnZ8bmN1cnNlc191c2VfZXh0ZW5kZWRfbmFtZXN8bmN1cnNlc192aWRhdHRyfG5jdXJzZXNfdmxpbmV8bmN1cnNlc193YWRkY2h8JyArDQogICAgICAgICduY3Vyc2VzX3dhZGRzdHJ8bmN1cnNlc193YXR0cm9mZnxuY3Vyc2VzX3dhdHRyb258bmN1cnNlc193YXR0cnNldHxuY3Vyc2VzX3dib3JkZXJ8bmN1cnNlc193Y2xlYXJ8bmN1cnNlc193Y29sb3Jfc2V0fG5jdXJzZXNfd2VyYXNlfCcgKw0KICAgICAgICAnbmN1cnNlc193Z2V0Y2h8bmN1cnNlc193aGxpbmV8bmN1cnNlc193bW91c2VfdHJhZm98bmN1cnNlc193bW92ZXxuY3Vyc2VzX3dub3V0cmVmcmVzaHxuY3Vyc2VzX3dyZWZyZXNofG5jdXJzZXNfd3N0YW5kZW5kfCcgKw0KICAgICAgICAnbmN1cnNlc193c3RhbmRvdXR8bmN1cnNlc193dmxpbmV8bmV3aW5zdGFuY2V8bmV3aW5zdGFuY2VhcmdzfG5ld3RfYmVsbHxuZXd0X2J1dHRvbnxuZXd0X2J1dHRvbl9iYXJ8bmV3dF9jZW50ZXJlZF93aW5kb3d8bmV3dF9jaGVja2JveHwnICsNCiAgICAgICAgJ25ld3RfY2hlY2tib3hfZ2V0X3ZhbHVlfG5ld3RfY2hlY2tib3hfc2V0X2ZsYWdzfG5ld3RfY2hlY2tib3hfc2V0X3ZhbHVlfG5ld3RfY2hlY2tib3hfdHJlZXxuZXd0X2NoZWNrYm94X3RyZWVfYWRkX2l0ZW18JyArDQogICAgICAgICduZXd0X2NoZWNrYm94X3RyZWVfZmluZF9pdGVtfG5ld3RfY2hlY2tib3hfdHJlZV9nZXRfY3VycmVudHxuZXd0X2NoZWNrYm94X3RyZWVfZ2V0X2VudHJ5X3ZhbHVlfG5ld3RfY2hlY2tib3hfdHJlZV9nZXRfbXVsdGlfc2VsZWN0aW9ufCcgKw0KICAgICAgICAnbmV3dF9jaGVja2JveF90cmVlX2dldF9zZWxlY3Rpb258bmV3dF9jaGVja2JveF90cmVlX211bHRpfG5ld3RfY2hlY2tib3hfdHJlZV9zZXRfY3VycmVudHxuZXd0X2NoZWNrYm94X3RyZWVfc2V0X2VudHJ5fCcgKw0KICAgICAgICAnbmV3dF9jaGVja2JveF90cmVlX3NldF9lbnRyeV92YWx1ZXxuZXd0X2NoZWNrYm94X3RyZWVfc2V0X3dpZHRofG5ld3RfY2xlYXJfa2V5X2J1ZmZlcnxuZXd0X2Nsc3xuZXd0X2NvbXBhY3RfYnV0dG9ufCcgKw0KICAgICAgICAnbmV3dF9jb21wb25lbnRfYWRkX2NhbGxiYWNrfG5ld3RfY29tcG9uZW50X3Rha2VzX2ZvY3VzfG5ld3RfY3JlYXRlX2dyaWR8bmV3dF9jdXJzb3Jfb2ZmfG5ld3RfY3Vyc29yX29ufG5ld3RfZGVsYXl8bmV3dF9kcmF3X2Zvcm18JyArDQogICAgICAgICduZXd0X2RyYXdfcm9vdF90ZXh0fG5ld3RfZW50cnl8bmV3dF9lbnRyeV9nZXRfdmFsdWV8bmV3dF9lbnRyeV9zZXR8bmV3dF9lbnRyeV9zZXRfZmlsdGVyfG5ld3RfZW50cnlfc2V0X2ZsYWdzfG5ld3RfZmluaXNoZWR8bmV3dF9mb3JtfCcgKw0KICAgICAgICAnbmV3dF9mb3JtX2FkZF9jb21wb25lbnR8bmV3dF9mb3JtX2FkZF9jb21wb25lbnRzfG5ld3RfZm9ybV9hZGRfaG90X2tleXxuZXd0X2Zvcm1fZGVzdHJveXxuZXd0X2Zvcm1fZ2V0X2N1cnJlbnR8bmV3dF9mb3JtX3J1bnwnICsNCiAgICAgICAgJ25ld3RfZm9ybV9zZXRfYmFja2dyb3VuZHxuZXd0X2Zvcm1fc2V0X2hlaWdodHxuZXd0X2Zvcm1fc2V0X3NpemV8bmV3dF9mb3JtX3NldF90aW1lcnxuZXd0X2Zvcm1fc2V0X3dpZHRofG5ld3RfZm9ybV93YXRjaF9mZHwnICsNCiAgICAgICAgJ25ld3RfZ2V0X3NjcmVlbl9zaXplfG5ld3RfZ3JpZF9hZGRfY29tcG9uZW50c190b19mb3JtfG5ld3RfZ3JpZF9iYXNpY193aW5kb3d8bmV3dF9ncmlkX2ZyZWV8bmV3dF9ncmlkX2dldF9zaXplfG5ld3RfZ3JpZF9oX2Nsb3NlX3N0YWNrZWR8JyArDQogICAgICAgICduZXd0X2dyaWRfaF9zdGFja2VkfG5ld3RfZ3JpZF9wbGFjZXxuZXd0X2dyaWRfc2V0X2ZpZWxkfG5ld3RfZ3JpZF9zaW1wbGVfd2luZG93fG5ld3RfZ3JpZF92X2Nsb3NlX3N0YWNrZWR8bmV3dF9ncmlkX3Zfc3RhY2tlZHwnICsNCiAgICAgICAgJ25ld3RfZ3JpZF93cmFwcGVkX3dpbmRvd3xuZXd0X2dyaWRfd3JhcHBlZF93aW5kb3dfYXR8bmV3dF9pbml0fG5ld3RfbGFiZWx8bmV3dF9sYWJlbF9zZXRfdGV4dHxuZXd0X2xpc3Rib3h8bmV3dF9saXN0Ym94X2FwcGVuZF9lbnRyeXwnICsNCiAgICAgICAgJ25ld3RfbGlzdGJveF9jbGVhcnxuZXd0X2xpc3Rib3hfY2xlYXJfc2VsZWN0aW9ufG5ld3RfbGlzdGJveF9kZWxldGVfZW50cnl8bmV3dF9saXN0Ym94X2dldF9jdXJyZW50fG5ld3RfbGlzdGJveF9nZXRfc2VsZWN0aW9ufCcgKw0KICAgICAgICAnbmV3dF9saXN0Ym94X2luc2VydF9lbnRyeXxuZXd0X2xpc3Rib3hfaXRlbV9jb3VudHxuZXd0X2xpc3Rib3hfc2VsZWN0X2l0ZW18bmV3dF9saXN0Ym94X3NldF9jdXJyZW50fG5ld3RfbGlzdGJveF9zZXRfY3VycmVudF9ieV9rZXl8JyArDQogICAgICAgICduZXd0X2xpc3Rib3hfc2V0X2RhdGF8bmV3dF9saXN0Ym94X3NldF9lbnRyeXxuZXd0X2xpc3Rib3hfc2V0X3dpZHRofG5ld3RfbGlzdGl0ZW18bmV3dF9saXN0aXRlbV9nZXRfZGF0YXxuZXd0X2xpc3RpdGVtX3NldHwnICsNCiAgICAgICAgJ25ld3Rfb3Blbl93aW5kb3d8bmV3dF9wb3BfaGVscF9saW5lfG5ld3RfcG9wX3dpbmRvd3xuZXd0X3B1c2hfaGVscF9saW5lfG5ld3RfcmFkaW9fZ2V0X2N1cnJlbnR8bmV3dF9yYWRpb2J1dHRvbnxuZXd0X3JlZHJhd19oZWxwX2xpbmV8JyArDQogICAgICAgICduZXd0X3JlZmxvd190ZXh0fG5ld3RfcmVmcmVzaHxuZXd0X3Jlc2l6ZV9zY3JlZW58bmV3dF9yZXN1bWV8bmV3dF9ydW5fZm9ybXxuZXd0X3NjYWxlfG5ld3Rfc2NhbGVfc2V0fG5ld3Rfc2Nyb2xsYmFyX3NldHwnICsNCiAgICAgICAgJ25ld3Rfc2V0X2hlbHBfY2FsbGJhY2t8bmV3dF9zZXRfc3VzcGVuZF9jYWxsYmFja3xuZXd0X3N1c3BlbmR8bmV3dF90ZXh0Ym94fG5ld3RfdGV4dGJveF9nZXRfbnVtX2xpbmVzfG5ld3RfdGV4dGJveF9yZWZsb3dlZHwnICsNCiAgICAgICAgJ25ld3RfdGV4dGJveF9zZXRfaGVpZ2h0fG5ld3RfdGV4dGJveF9zZXRfdGV4dHxuZXd0X3ZlcnRpY2FsX3Njcm9sbGJhcnxuZXd0X3dhaXRfZm9yX2tleXxuZXd0X3dpbl9jaG9pY2V8bmV3dF93aW5fZW50cmllc3xuZXd0X3dpbl9tZW51fCcgKw0KICAgICAgICAnbmV3dF93aW5fbWVzc2FnZXxuZXd0X3dpbl9tZXNzYWdldnxuZXd0X3dpbl90ZXJuYXJ5fG5leHR8bmdldHRleHR8bmwyYnJ8bmxfbGFuZ2luZm98bm9yZXdpbmRpdGVyYXRvcnxub3JtYWxpemVyfG5vdGVzX2JvZHl8bm90ZXNfY29weV9kYnwnICsNCiAgICAgICAgJ25vdGVzX2NyZWF0ZV9kYnxub3Rlc19jcmVhdGVfbm90ZXxub3Rlc19kcm9wX2RifG5vdGVzX2ZpbmRfbm90ZXxub3Rlc19oZWFkZXJfaW5mb3xub3Rlc19saXN0X21zZ3N8bm90ZXNfbWFya19yZWFkfG5vdGVzX21hcmtfdW5yZWFkfCcgKw0KICAgICAgICAnbm90ZXNfbmF2X2NyZWF0ZXxub3Rlc19zZWFyY2h8bm90ZXNfdW5yZWFkfG5vdGVzX3ZlcnNpb258bnNhcGlfcmVxdWVzdF9oZWFkZXJzfG5zYXBpX3Jlc3BvbnNlX2hlYWRlcnN8bnNhcGlfdmlydHVhbHxudGhtYWN8bnVtYmVyX2Zvcm1hdHwnICsNCiAgICAgICAgJ251bWJlcmZvcm1hdHRlcnxvYXV0aHxvYXV0aF9nZXRfc2JzfG9hdXRoX3VybGVuY29kZXxvYXV0aGV4Y2VwdGlvbnxvYXV0aHByb3ZpZGVyfG9iX2NsZWFufG9iX2RlZmxhdGVoYW5kbGVyfG9iX2VuZF9jbGVhbnxvYl9lbmRfZmx1c2h8JyArDQogICAgICAgICdvYl9ldGFnaGFuZGxlcnxvYl9mbHVzaHxvYl9nZXRfY2xlYW58b2JfZ2V0X2NvbnRlbnRzfG9iX2dldF9mbHVzaHxvYl9nZXRfbGVuZ3RofG9iX2dldF9sZXZlbHxvYl9nZXRfc3RhdHVzfG9iX2d6aGFuZGxlcnxvYl9pY29udl9oYW5kbGVyfCcgKw0KICAgICAgICAnb2JfaW1wbGljaXRfZmx1c2h8b2JfaW5mbGF0ZWhhbmRsZXJ8b2JfbGlzdF9oYW5kbGVyc3xvYl9zdGFydHxvYl90aWR5aGFuZGxlcnxvY2lfYmluZF9hcnJheV9ieV9uYW1lfG9jaV9iaW5kX2J5X25hbWV8b2NpX2NhbmNlbHwnICsNCiAgICAgICAgJ29jaV9jbGllbnRfdmVyc2lvbnxvY2lfY2xvc2V8b2NpX2NvbGxlY3Rpb25fYXBwZW5kfG9jaV9jb2xsZWN0aW9uX2Fzc2lnbnxvY2lfY29sbGVjdGlvbl9lbGVtZW50X2Fzc2lnbnxvY2lfY29sbGVjdGlvbl9lbGVtZW50X2dldHwnICsNCiAgICAgICAgJ29jaV9jb2xsZWN0aW9uX2ZyZWV8b2NpX2NvbGxlY3Rpb25fbWF4fG9jaV9jb2xsZWN0aW9uX3NpemV8b2NpX2NvbGxlY3Rpb25fdHJpbXxvY2lfY29tbWl0fG9jaV9jb25uZWN0fG9jaV9kZWZpbmVfYnlfbmFtZXxvY2lfZXJyb3J8JyArDQogICAgICAgICdvY2lfZXhlY3V0ZXxvY2lfZmV0Y2h8b2NpX2ZldGNoX2FsbHxvY2lfZmV0Y2hfYXJyYXl8b2NpX2ZldGNoX2Fzc29jfG9jaV9mZXRjaF9vYmplY3R8b2NpX2ZldGNoX3Jvd3xvY2lfZmllbGRfaXNfbnVsbHxvY2lfZmllbGRfbmFtZXwnICsNCiAgICAgICAgJ29jaV9maWVsZF9wcmVjaXNpb258b2NpX2ZpZWxkX3NjYWxlfG9jaV9maWVsZF9zaXplfG9jaV9maWVsZF90eXBlfG9jaV9maWVsZF90eXBlX3Jhd3xvY2lfZnJlZV9zdGF0ZW1lbnR8b2NpX2ludGVybmFsX2RlYnVnfG9jaV9sb2JfYXBwZW5kfCcgKw0KICAgICAgICAnb2NpX2xvYl9jbG9zZXxvY2lfbG9iX2NvcHl8b2NpX2xvYl9lb2Z8b2NpX2xvYl9lcmFzZXxvY2lfbG9iX2V4cG9ydHxvY2lfbG9iX2ZsdXNofG9jaV9sb2JfZnJlZXxvY2lfbG9iX2dldGJ1ZmZlcmluZ3xvY2lfbG9iX2ltcG9ydHwnICsNCiAgICAgICAgJ29jaV9sb2JfaXNfZXF1YWx8b2NpX2xvYl9sb2FkfG9jaV9sb2JfcmVhZHxvY2lfbG9iX3Jld2luZHxvY2lfbG9iX3NhdmV8b2NpX2xvYl9zYXZlZmlsZXxvY2lfbG9iX3NlZWt8b2NpX2xvYl9zZXRidWZmZXJpbmd8b2NpX2xvYl9zaXplfCcgKw0KICAgICAgICAnb2NpX2xvYl90ZWxsfG9jaV9sb2JfdHJ1bmNhdGV8b2NpX2xvYl93cml0ZXxvY2lfbG9iX3dyaXRldGVtcG9yYXJ5fG9jaV9sb2Jfd3JpdGV0b2ZpbGV8b2NpX25ld19jb2xsZWN0aW9ufG9jaV9uZXdfY29ubmVjdHxvY2lfbmV3X2N1cnNvcnwnICsNCiAgICAgICAgJ29jaV9uZXdfZGVzY3JpcHRvcnxvY2lfbnVtX2ZpZWxkc3xvY2lfbnVtX3Jvd3N8b2NpX3BhcnNlfG9jaV9wYXNzd29yZF9jaGFuZ2V8b2NpX3Bjb25uZWN0fG9jaV9yZXN1bHR8b2NpX3JvbGxiYWNrfG9jaV9zZXJ2ZXJfdmVyc2lvbnwnICsNCiAgICAgICAgJ29jaV9zZXRfYWN0aW9ufG9jaV9zZXRfY2xpZW50X2lkZW50aWZpZXJ8b2NpX3NldF9jbGllbnRfaW5mb3xvY2lfc2V0X2VkaXRpb258b2NpX3NldF9tb2R1bGVfbmFtZXxvY2lfc2V0X3ByZWZldGNofG9jaV9zdGF0ZW1lbnRfdHlwZXwnICsNCiAgICAgICAgJ29jaWJpbmRieW5hbWV8b2NpY2FuY2VsfG9jaWNsb3NlbG9ifG9jaWNvbGxhcHBlbmR8b2NpY29sbGFzc2lnbnxvY2ljb2xsYXNzaWduZWxlbXxvY2ljb2xsZ2V0ZWxlbXxvY2ljb2xsbWF4fG9jaWNvbGxzaXplfG9jaWNvbGx0cmltfCcgKw0KICAgICAgICAnb2NpY29sdW1uaXNudWxsfG9jaWNvbHVtbm5hbWV8b2NpY29sdW1ucHJlY2lzaW9ufG9jaWNvbHVtbnNjYWxlfG9jaWNvbHVtbnNpemV8b2NpY29sdW1udHlwZXxvY2ljb2x1bW50eXBlcmF3fG9jaWNvbW1pdHxvY2lkZWZpbmVieW5hbWV8JyArDQogICAgICAgICdvY2llcnJvcnxvY2lleGVjdXRlfG9jaWZldGNofG9jaWZldGNoaW50b3xvY2lmZXRjaHN0YXRlbWVudHxvY2lmcmVlY29sbGVjdGlvbnxvY2lmcmVlY3Vyc29yfG9jaWZyZWVkZXNjfG9jaWZyZWVzdGF0ZW1lbnR8b2NpaW50ZXJuYWxkZWJ1Z3wnICsNCiAgICAgICAgJ29jaWxvYWRsb2J8b2NpbG9nb2ZmfG9jaWxvZ29ufG9jaW5ld2NvbGxlY3Rpb258b2NpbmV3Y3Vyc29yfG9jaW5ld2Rlc2NyaXB0b3J8b2NpbmxvZ29ufG9jaW51bWNvbHN8b2NpcGFyc2V8b2NpcGxvZ29ufG9jaXJlc3VsdHwnICsNCiAgICAgICAgJ29jaXJvbGxiYWNrfG9jaXJvd2NvdW50fG9jaXNhdmVsb2J8b2Npc2F2ZWxvYmZpbGV8b2Npc2VydmVydmVyc2lvbnxvY2lzZXRwcmVmZXRjaHxvY2lzdGF0ZW1lbnR0eXBlfG9jaXdyaXRlbG9idG9maWxlfG9jaXdyaXRldGVtcG9yYXJ5bG9ifCcgKw0KICAgICAgICAnb2N0ZGVjfG9kYmNfYXV0b2NvbW1pdHxvZGJjX2Jpbm1vZGV8b2RiY19jbG9zZXxvZGJjX2Nsb3NlX2FsbHxvZGJjX2NvbHVtbnByaXZpbGVnZXN8b2RiY19jb2x1bW5zfG9kYmNfY29tbWl0fG9kYmNfY29ubmVjdHxvZGJjX2N1cnNvcnwnICsNCiAgICAgICAgJ29kYmNfZGF0YV9zb3VyY2V8b2RiY19kb3xvZGJjX2Vycm9yfG9kYmNfZXJyb3Jtc2d8b2RiY19leGVjfG9kYmNfZXhlY3V0ZXxvZGJjX2ZldGNoX2FycmF5fG9kYmNfZmV0Y2hfaW50b3xvZGJjX2ZldGNoX29iamVjdHwnICsNCiAgICAgICAgJ29kYmNfZmV0Y2hfcm93fG9kYmNfZmllbGRfbGVufG9kYmNfZmllbGRfbmFtZXxvZGJjX2ZpZWxkX251bXxvZGJjX2ZpZWxkX3ByZWNpc2lvbnxvZGJjX2ZpZWxkX3NjYWxlfG9kYmNfZmllbGRfdHlwZXxvZGJjX2ZvcmVpZ25rZXlzfCcgKw0KICAgICAgICAnb2RiY19mcmVlX3Jlc3VsdHxvZGJjX2dldHR5cGVpbmZvfG9kYmNfbG9uZ3JlYWRsZW58b2RiY19uZXh0X3Jlc3VsdHxvZGJjX251bV9maWVsZHN8b2RiY19udW1fcm93c3xvZGJjX3Bjb25uZWN0fG9kYmNfcHJlcGFyZXwnICsNCiAgICAgICAgJ29kYmNfcHJpbWFyeWtleXN8b2RiY19wcm9jZWR1cmVjb2x1bW5zfG9kYmNfcHJvY2VkdXJlc3xvZGJjX3Jlc3VsdHxvZGJjX3Jlc3VsdF9hbGx8b2RiY19yb2xsYmFja3xvZGJjX3NldG9wdGlvbnxvZGJjX3NwZWNpYWxjb2x1bW5zfCcgKw0KICAgICAgICAnb2RiY19zdGF0aXN0aWNzfG9kYmNfdGFibGVwcml2aWxlZ2VzfG9kYmNfdGFibGVzfG9wZW5hbF9idWZmZXJfY3JlYXRlfG9wZW5hbF9idWZmZXJfZGF0YXxvcGVuYWxfYnVmZmVyX2Rlc3Ryb3l8b3BlbmFsX2J1ZmZlcl9nZXR8JyArDQogICAgICAgICdvcGVuYWxfYnVmZmVyX2xvYWR3YXZ8b3BlbmFsX2NvbnRleHRfY3JlYXRlfG9wZW5hbF9jb250ZXh0X2N1cnJlbnR8b3BlbmFsX2NvbnRleHRfZGVzdHJveXxvcGVuYWxfY29udGV4dF9wcm9jZXNzfG9wZW5hbF9jb250ZXh0X3N1c3BlbmR8JyArDQogICAgICAgICdvcGVuYWxfZGV2aWNlX2Nsb3NlfG9wZW5hbF9kZXZpY2Vfb3BlbnxvcGVuYWxfbGlzdGVuZXJfZ2V0fG9wZW5hbF9saXN0ZW5lcl9zZXR8b3BlbmFsX3NvdXJjZV9jcmVhdGV8b3BlbmFsX3NvdXJjZV9kZXN0cm95fCcgKw0KICAgICAgICAnb3BlbmFsX3NvdXJjZV9nZXR8b3BlbmFsX3NvdXJjZV9wYXVzZXxvcGVuYWxfc291cmNlX3BsYXl8b3BlbmFsX3NvdXJjZV9yZXdpbmR8b3BlbmFsX3NvdXJjZV9zZXR8b3BlbmFsX3NvdXJjZV9zdG9wfG9wZW5hbF9zdHJlYW18b3BlbmRpcnwnICsNCiAgICAgICAgJ29wZW5sb2d8b3BlbnNzbF9jaXBoZXJfaXZfbGVuZ3RofG9wZW5zc2xfY3NyX2V4cG9ydHxvcGVuc3NsX2Nzcl9leHBvcnRfdG9fZmlsZXxvcGVuc3NsX2Nzcl9nZXRfcHVibGljX2tleXxvcGVuc3NsX2Nzcl9nZXRfc3ViamVjdHwnICsNCiAgICAgICAgJ29wZW5zc2xfY3NyX25ld3xvcGVuc3NsX2Nzcl9zaWdufG9wZW5zc2xfZGVjcnlwdHxvcGVuc3NsX2RoX2NvbXB1dGVfa2V5fG9wZW5zc2xfZGlnZXN0fG9wZW5zc2xfZW5jcnlwdHxvcGVuc3NsX2Vycm9yX3N0cmluZ3wnICsNCiAgICAgICAgJ29wZW5zc2xfZnJlZV9rZXl8b3BlbnNzbF9nZXRfY2lwaGVyX21ldGhvZHN8b3BlbnNzbF9nZXRfbWRfbWV0aG9kc3xvcGVuc3NsX2dldF9wcml2YXRla2V5fG9wZW5zc2xfZ2V0X3B1YmxpY2tleXxvcGVuc3NsX29wZW58JyArDQogICAgICAgICdvcGVuc3NsX3BrY3MxMl9leHBvcnR8b3BlbnNzbF9wa2NzMTJfZXhwb3J0X3RvX2ZpbGV8b3BlbnNzbF9wa2NzMTJfcmVhZHxvcGVuc3NsX3BrY3M3X2RlY3J5cHR8b3BlbnNzbF9wa2NzN19lbmNyeXB0fG9wZW5zc2xfcGtjczdfc2lnbnwnICsNCiAgICAgICAgJ29wZW5zc2xfcGtjczdfdmVyaWZ5fG9wZW5zc2xfcGtleV9leHBvcnR8b3BlbnNzbF9wa2V5X2V4cG9ydF90b19maWxlfG9wZW5zc2xfcGtleV9mcmVlfG9wZW5zc2xfcGtleV9nZXRfZGV0YWlsc3xvcGVuc3NsX3BrZXlfZ2V0X3ByaXZhdGV8JyArDQogICAgICAgICdvcGVuc3NsX3BrZXlfZ2V0X3B1YmxpY3xvcGVuc3NsX3BrZXlfbmV3fG9wZW5zc2xfcHJpdmF0ZV9kZWNyeXB0fG9wZW5zc2xfcHJpdmF0ZV9lbmNyeXB0fG9wZW5zc2xfcHVibGljX2RlY3J5cHR8b3BlbnNzbF9wdWJsaWNfZW5jcnlwdHwnICsNCiAgICAgICAgJ29wZW5zc2xfcmFuZG9tX3BzZXVkb19ieXRlc3xvcGVuc3NsX3NlYWx8b3BlbnNzbF9zaWdufG9wZW5zc2xfdmVyaWZ5fG9wZW5zc2xfeDUwOV9jaGVja19wcml2YXRlX2tleXxvcGVuc3NsX3g1MDlfY2hlY2twdXJwb3NlfCcgKw0KICAgICAgICAnb3BlbnNzbF94NTA5X2V4cG9ydHxvcGVuc3NsX3g1MDlfZXhwb3J0X3RvX2ZpbGV8b3BlbnNzbF94NTA5X2ZyZWV8b3BlbnNzbF94NTA5X3BhcnNlfG9wZW5zc2xfeDUwOV9yZWFkfG9yZHxvdXRlcml0ZXJhdG9yfCcgKw0KICAgICAgICAnb3V0b2Zib3VuZHNleGNlcHRpb258b3V0b2ZyYW5nZWV4Y2VwdGlvbnxvdXRwdXRfYWRkX3Jld3JpdGVfdmFyfG91dHB1dF9yZXNldF9yZXdyaXRlX3ZhcnN8b3ZlcmZsb3dleGNlcHRpb258b3ZlcmxvYWR8b3ZlcnJpZGVfZnVuY3Rpb258JyArDQogICAgICAgICdvdnJpbW9zX2Nsb3NlfG92cmltb3NfY29tbWl0fG92cmltb3NfY29ubmVjdHxvdnJpbW9zX2N1cnNvcnxvdnJpbW9zX2V4ZWN8b3ZyaW1vc19leGVjdXRlfG92cmltb3NfZmV0Y2hfaW50b3xvdnJpbW9zX2ZldGNoX3Jvd3wnICsNCiAgICAgICAgJ292cmltb3NfZmllbGRfbGVufG92cmltb3NfZmllbGRfbmFtZXxvdnJpbW9zX2ZpZWxkX251bXxvdnJpbW9zX2ZpZWxkX3R5cGV8b3ZyaW1vc19mcmVlX3Jlc3VsdHxvdnJpbW9zX2xvbmdyZWFkbGVufG92cmltb3NfbnVtX2ZpZWxkc3wnICsNCiAgICAgICAgJ292cmltb3NfbnVtX3Jvd3N8b3ZyaW1vc19wcmVwYXJlfG92cmltb3NfcmVzdWx0fG92cmltb3NfcmVzdWx0X2FsbHxvdnJpbW9zX3JvbGxiYWNrfHBhY2t8cGFyZW50aXRlcmF0b3J8cGFyc2VfaW5pX2ZpbGV8cGFyc2VfaW5pX3N0cmluZ3wnICsNCiAgICAgICAgJ3BhcnNlX3N0cnxwYXJzZV91cmx8cGFyc2VraXRfY29tcGlsZV9maWxlfHBhcnNla2l0X2NvbXBpbGVfc3RyaW5nfHBhcnNla2l0X2Z1bmNfYXJnaW5mb3xwYXNzdGhydXxwYXRoaW5mb3xwY2xvc2V8cGNudGxfYWxhcm18cGNudGxfZXhlY3wnICsNCiAgICAgICAgJ3BjbnRsX2Zvcmt8cGNudGxfZ2V0cHJpb3JpdHl8cGNudGxfc2V0cHJpb3JpdHl8cGNudGxfc2lnbmFsfHBjbnRsX3NpZ25hbF9kaXNwYXRjaHxwY250bF9zaWdwcm9jbWFza3xwY250bF9zaWd0aW1lZHdhaXR8cGNudGxfc2lnd2FpdGluZm98JyArDQogICAgICAgICdwY250bF93YWl0fHBjbnRsX3dhaXRwaWR8cGNudGxfd2V4aXRzdGF0dXN8cGNudGxfd2lmZXhpdGVkfHBjbnRsX3dpZnNpZ25hbGVkfHBjbnRsX3dpZnN0b3BwZWR8cGNudGxfd3N0b3BzaWd8cGNudGxfd3Rlcm1zaWd8JyArDQogICAgICAgICdwZGZfYWN0aXZhdGVfaXRlbXxwZGZfYWRkX2Fubm90YXRpb258cGRmX2FkZF9ib29rbWFya3xwZGZfYWRkX2xhdW5jaGxpbmt8cGRmX2FkZF9sb2NhbGxpbmt8cGRmX2FkZF9uYW1lZGRlc3R8cGRmX2FkZF9ub3RlfHBkZl9hZGRfb3V0bGluZXwnICsNCiAgICAgICAgJ3BkZl9hZGRfcGRmbGlua3xwZGZfYWRkX3RhYmxlX2NlbGx8cGRmX2FkZF90ZXh0Zmxvd3xwZGZfYWRkX3RodW1ibmFpbHxwZGZfYWRkX3dlYmxpbmt8cGRmX2FyY3xwZGZfYXJjbnxwZGZfYXR0YWNoX2ZpbGV8cGRmX2JlZ2luX2RvY3VtZW50fCcgKw0KICAgICAgICAncGRmX2JlZ2luX2ZvbnR8cGRmX2JlZ2luX2dseXBofHBkZl9iZWdpbl9pdGVtfHBkZl9iZWdpbl9sYXllcnxwZGZfYmVnaW5fcGFnZXxwZGZfYmVnaW5fcGFnZV9leHR8cGRmX2JlZ2luX3BhdHRlcm58cGRmX2JlZ2luX3RlbXBsYXRlfCcgKw0KICAgICAgICAncGRmX2JlZ2luX3RlbXBsYXRlX2V4dHxwZGZfY2lyY2xlfHBkZl9jbGlwfHBkZl9jbG9zZXxwZGZfY2xvc2VfaW1hZ2V8cGRmX2Nsb3NlX3BkaXxwZGZfY2xvc2VfcGRpX3BhZ2V8cGRmX2Nsb3NlcGF0aHwnICsNCiAgICAgICAgJ3BkZl9jbG9zZXBhdGhfZmlsbF9zdHJva2V8cGRmX2Nsb3NlcGF0aF9zdHJva2V8cGRmX2NvbmNhdHxwZGZfY29udGludWVfdGV4dHxwZGZfY3JlYXRlXzNkdmlld3xwZGZfY3JlYXRlX2FjdGlvbnxwZGZfY3JlYXRlX2Fubm90YXRpb258JyArDQogICAgICAgICdwZGZfY3JlYXRlX2Jvb2ttYXJrfHBkZl9jcmVhdGVfZmllbGR8cGRmX2NyZWF0ZV9maWVsZGdyb3VwfHBkZl9jcmVhdGVfZ3N0YXRlfHBkZl9jcmVhdGVfcHZmfHBkZl9jcmVhdGVfdGV4dGZsb3d8cGRmX2N1cnZldG98JyArDQogICAgICAgICdwZGZfZGVmaW5lX2xheWVyfHBkZl9kZWxldGV8cGRmX2RlbGV0ZV9wdmZ8cGRmX2RlbGV0ZV90YWJsZXxwZGZfZGVsZXRlX3RleHRmbG93fHBkZl9lbmNvZGluZ19zZXRfY2hhcnxwZGZfZW5kX2RvY3VtZW50fHBkZl9lbmRfZm9udHwnICsNCiAgICAgICAgJ3BkZl9lbmRfZ2x5cGh8cGRmX2VuZF9pdGVtfHBkZl9lbmRfbGF5ZXJ8cGRmX2VuZF9wYWdlfHBkZl9lbmRfcGFnZV9leHR8cGRmX2VuZF9wYXR0ZXJufHBkZl9lbmRfdGVtcGxhdGV8cGRmX2VuZHBhdGh8cGRmX2ZpbGx8JyArDQogICAgICAgICdwZGZfZmlsbF9pbWFnZWJsb2NrfHBkZl9maWxsX3BkZmJsb2NrfHBkZl9maWxsX3N0cm9rZXxwZGZfZmlsbF90ZXh0YmxvY2t8cGRmX2ZpbmRmb250fHBkZl9maXRfaW1hZ2V8cGRmX2ZpdF9wZGlfcGFnZXxwZGZfZml0X3RhYmxlfCcgKw0KICAgICAgICAncGRmX2ZpdF90ZXh0Zmxvd3xwZGZfZml0X3RleHRsaW5lfHBkZl9nZXRfYXBpbmFtZXxwZGZfZ2V0X2J1ZmZlcnxwZGZfZ2V0X2Vycm1zZ3xwZGZfZ2V0X2Vycm51bXxwZGZfZ2V0X2ZvbnR8cGRmX2dldF9mb250bmFtZXwnICsNCiAgICAgICAgJ3BkZl9nZXRfZm9udHNpemV8cGRmX2dldF9pbWFnZV9oZWlnaHR8cGRmX2dldF9pbWFnZV93aWR0aHxwZGZfZ2V0X21ham9ydmVyc2lvbnxwZGZfZ2V0X21pbm9ydmVyc2lvbnxwZGZfZ2V0X3BhcmFtZXRlcnwnICsNCiAgICAgICAgJ3BkZl9nZXRfcGRpX3BhcmFtZXRlcnxwZGZfZ2V0X3BkaV92YWx1ZXxwZGZfZ2V0X3ZhbHVlfHBkZl9pbmZvX2ZvbnR8cGRmX2luZm9fbWF0Y2hib3h8cGRmX2luZm9fdGFibGV8cGRmX2luZm9fdGV4dGZsb3d8cGRmX2luZm9fdGV4dGxpbmV8JyArDQogICAgICAgICdwZGZfaW5pdGdyYXBoaWNzfHBkZl9saW5ldG98cGRmX2xvYWRfM2RkYXRhfHBkZl9sb2FkX2ZvbnR8cGRmX2xvYWRfaWNjcHJvZmlsZXxwZGZfbG9hZF9pbWFnZXxwZGZfbWFrZXNwb3Rjb2xvcnxwZGZfbW92ZXRvfHBkZl9uZXd8JyArDQogICAgICAgICdwZGZfb3Blbl9jY2l0dHxwZGZfb3Blbl9maWxlfHBkZl9vcGVuX2dpZnxwZGZfb3Blbl9pbWFnZXxwZGZfb3Blbl9pbWFnZV9maWxlfHBkZl9vcGVuX2pwZWd8cGRmX29wZW5fbWVtb3J5X2ltYWdlfHBkZl9vcGVuX3BkaXwnICsNCiAgICAgICAgJ3BkZl9vcGVuX3BkaV9kb2N1bWVudHxwZGZfb3Blbl9wZGlfcGFnZXxwZGZfb3Blbl90aWZmfHBkZl9wY29zX2dldF9udW1iZXJ8cGRmX3Bjb3NfZ2V0X3N0cmVhbXxwZGZfcGNvc19nZXRfc3RyaW5nfHBkZl9wbGFjZV9pbWFnZXwnICsNCiAgICAgICAgJ3BkZl9wbGFjZV9wZGlfcGFnZXxwZGZfcHJvY2Vzc19wZGl8cGRmX3JlY3R8cGRmX3Jlc3RvcmV8cGRmX3Jlc3VtZV9wYWdlfHBkZl9yb3RhdGV8cGRmX3NhdmV8cGRmX3NjYWxlfHBkZl9zZXRfYm9yZGVyX2NvbG9yfCcgKw0KICAgICAgICAncGRmX3NldF9ib3JkZXJfZGFzaHxwZGZfc2V0X2JvcmRlcl9zdHlsZXxwZGZfc2V0X2NoYXJfc3BhY2luZ3xwZGZfc2V0X2R1cmF0aW9ufHBkZl9zZXRfZ3N0YXRlfHBkZl9zZXRfaG9yaXpfc2NhbGluZ3xwZGZfc2V0X2luZm98JyArDQogICAgICAgICdwZGZfc2V0X2luZm9fYXV0aG9yfHBkZl9zZXRfaW5mb19jcmVhdG9yfHBkZl9zZXRfaW5mb19rZXl3b3Jkc3xwZGZfc2V0X2luZm9fc3ViamVjdHxwZGZfc2V0X2luZm9fdGl0bGV8cGRmX3NldF9sYXllcl9kZXBlbmRlbmN5fCcgKw0KICAgICAgICAncGRmX3NldF9sZWFkaW5nfHBkZl9zZXRfcGFyYW1ldGVyfHBkZl9zZXRfdGV4dF9tYXRyaXh8cGRmX3NldF90ZXh0X3Bvc3xwZGZfc2V0X3RleHRfcmVuZGVyaW5nfHBkZl9zZXRfdGV4dF9yaXNlfHBkZl9zZXRfdmFsdWV8JyArDQogICAgICAgICdwZGZfc2V0X3dvcmRfc3BhY2luZ3xwZGZfc2V0Y29sb3J8cGRmX3NldGRhc2h8cGRmX3NldGRhc2hwYXR0ZXJufHBkZl9zZXRmbGF0fHBkZl9zZXRmb250fHBkZl9zZXRncmF5fHBkZl9zZXRncmF5X2ZpbGx8cGRmX3NldGdyYXlfc3Ryb2tlfCcgKw0KICAgICAgICAncGRmX3NldGxpbmVjYXB8cGRmX3NldGxpbmVqb2lufHBkZl9zZXRsaW5ld2lkdGh8cGRmX3NldG1hdHJpeHxwZGZfc2V0bWl0ZXJsaW1pdHxwZGZfc2V0cG9seWRhc2h8cGRmX3NldHJnYmNvbG9yfHBkZl9zZXRyZ2Jjb2xvcl9maWxsfCcgKw0KICAgICAgICAncGRmX3NldHJnYmNvbG9yX3N0cm9rZXxwZGZfc2hhZGluZ3xwZGZfc2hhZGluZ19wYXR0ZXJufHBkZl9zaGZpbGx8cGRmX3Nob3d8cGRmX3Nob3dfYm94ZWR8cGRmX3Nob3dfeHl8cGRmX3NrZXd8cGRmX3N0cmluZ3dpZHRofHBkZl9zdHJva2V8JyArDQogICAgICAgICdwZGZfc3VzcGVuZF9wYWdlfHBkZl90cmFuc2xhdGV8cGRmX3V0ZjE2X3RvX3V0Zjh8cGRmX3V0ZjMyX3RvX3V0ZjE2fHBkZl91dGY4X3RvX3V0ZjE2fHBkb3xwZG9fY3VicmlkX3NjaGVtYXxwZG9fcGdzcWxsb2JjcmVhdGV8JyArDQogICAgICAgICdwZG9fcGdzcWxsb2JvcGVufHBkb19wZ3NxbGxvYnVubGlua3xwZG9fc3FsaXRlY3JlYXRlYWdncmVnYXRlfHBkb19zcWxpdGVjcmVhdGVmdW5jdGlvbnxwZG9leGNlcHRpb258cGRvc3RhdGVtZW50fHBmc29ja29wZW58JyArDQogICAgICAgICdwZ19hZmZlY3RlZF9yb3dzfHBnX2NhbmNlbF9xdWVyeXxwZ19jbGllbnRfZW5jb2Rpbmd8cGdfY2xvc2V8cGdfY29ubmVjdHxwZ19jb25uZWN0aW9uX2J1c3l8cGdfY29ubmVjdGlvbl9yZXNldHxwZ19jb25uZWN0aW9uX3N0YXR1c3wnICsNCiAgICAgICAgJ3BnX2NvbnZlcnR8cGdfY29weV9mcm9tfHBnX2NvcHlfdG98cGdfZGJuYW1lfHBnX2RlbGV0ZXxwZ19lbmRfY29weXxwZ19lc2NhcGVfYnl0ZWF8cGdfZXNjYXBlX3N0cmluZ3xwZ19leGVjdXRlfHBnX2ZldGNoX2FsbHwnICsNCiAgICAgICAgJ3BnX2ZldGNoX2FsbF9jb2x1bW5zfHBnX2ZldGNoX2FycmF5fHBnX2ZldGNoX2Fzc29jfHBnX2ZldGNoX29iamVjdHxwZ19mZXRjaF9yZXN1bHR8cGdfZmV0Y2hfcm93fHBnX2ZpZWxkX2lzX251bGx8cGdfZmllbGRfbmFtZXwnICsNCiAgICAgICAgJ3BnX2ZpZWxkX251bXxwZ19maWVsZF9wcnRsZW58cGdfZmllbGRfc2l6ZXxwZ19maWVsZF90YWJsZXxwZ19maWVsZF90eXBlfHBnX2ZpZWxkX3R5cGVfb2lkfHBnX2ZyZWVfcmVzdWx0fHBnX2dldF9ub3RpZnl8cGdfZ2V0X3BpZHwnICsNCiAgICAgICAgJ3BnX2dldF9yZXN1bHR8cGdfaG9zdHxwZ19pbnNlcnR8cGdfbGFzdF9lcnJvcnxwZ19sYXN0X25vdGljZXxwZ19sYXN0X29pZHxwZ19sb19jbG9zZXxwZ19sb19jcmVhdGV8cGdfbG9fZXhwb3J0fHBnX2xvX2ltcG9ydHxwZ19sb19vcGVufCcgKw0KICAgICAgICAncGdfbG9fcmVhZHxwZ19sb19yZWFkX2FsbHxwZ19sb19zZWVrfHBnX2xvX3RlbGx8cGdfbG9fdW5saW5rfHBnX2xvX3dyaXRlfHBnX21ldGFfZGF0YXxwZ19udW1fZmllbGRzfHBnX251bV9yb3dzfHBnX29wdGlvbnN8JyArDQogICAgICAgICdwZ19wYXJhbWV0ZXJfc3RhdHVzfHBnX3Bjb25uZWN0fHBnX3Bpbmd8cGdfcG9ydHxwZ19wcmVwYXJlfHBnX3B1dF9saW5lfHBnX3F1ZXJ5fHBnX3F1ZXJ5X3BhcmFtc3xwZ19yZXN1bHRfZXJyb3J8cGdfcmVzdWx0X2Vycm9yX2ZpZWxkfCcgKw0KICAgICAgICAncGdfcmVzdWx0X3NlZWt8cGdfcmVzdWx0X3N0YXR1c3xwZ19zZWxlY3R8cGdfc2VuZF9leGVjdXRlfHBnX3NlbmRfcHJlcGFyZXxwZ19zZW5kX3F1ZXJ5fHBnX3NlbmRfcXVlcnlfcGFyYW1zfHBnX3NldF9jbGllbnRfZW5jb2Rpbmd8JyArDQogICAgICAgICdwZ19zZXRfZXJyb3JfdmVyYm9zaXR5fHBnX3RyYWNlfHBnX3RyYW5zYWN0aW9uX3N0YXR1c3xwZ190dHl8cGdfdW5lc2NhcGVfYnl0ZWF8cGdfdW50cmFjZXxwZ191cGRhdGV8cGdfdmVyc2lvbnxwaHBfY2hlY2tfc3ludGF4fCcgKw0KICAgICAgICAncGhwX2luaV9sb2FkZWRfZmlsZXxwaHBfaW5pX3NjYW5uZWRfZmlsZXN8cGhwX2xvZ29fZ3VpZHxwaHBfc2FwaV9uYW1lfHBocF9zdHJpcF93aGl0ZXNwYWNlfHBocF91bmFtZXxwaHBjcmVkaXRzfHBocGluZm98cGhwdmVyc2lvbnxwaXwnICsNCiAgICAgICAgJ3BuZzJ3Ym1wfHBvcGVufHBvc3xwb3NpeF9hY2Nlc3N8cG9zaXhfY3Rlcm1pZHxwb3NpeF9lcnJub3xwb3NpeF9nZXRfbGFzdF9lcnJvcnxwb3NpeF9nZXRjd2R8cG9zaXhfZ2V0ZWdpZHxwb3NpeF9nZXRldWlkfHBvc2l4X2dldGdpZHwnICsNCiAgICAgICAgJ3Bvc2l4X2dldGdyZ2lkfHBvc2l4X2dldGdybmFtfHBvc2l4X2dldGdyb3Vwc3xwb3NpeF9nZXRsb2dpbnxwb3NpeF9nZXRwZ2lkfHBvc2l4X2dldHBncnB8cG9zaXhfZ2V0cGlkfHBvc2l4X2dldHBwaWR8cG9zaXhfZ2V0cHduYW18JyArDQogICAgICAgICdwb3NpeF9nZXRwd3VpZHxwb3NpeF9nZXRybGltaXR8cG9zaXhfZ2V0c2lkfHBvc2l4X2dldHVpZHxwb3NpeF9pbml0Z3JvdXBzfHBvc2l4X2lzYXR0eXxwb3NpeF9raWxsfHBvc2l4X21rZmlmb3xwb3NpeF9ta25vZHxwb3NpeF9zZXRlZ2lkfCcgKw0KICAgICAgICAncG9zaXhfc2V0ZXVpZHxwb3NpeF9zZXRnaWR8cG9zaXhfc2V0cGdpZHxwb3NpeF9zZXRzaWR8cG9zaXhfc2V0dWlkfHBvc2l4X3N0cmVycm9yfHBvc2l4X3RpbWVzfHBvc2l4X3R0eW5hbWV8cG9zaXhfdW5hbWV8cG93fHByZWdfZmlsdGVyfCcgKw0KICAgICAgICAncHJlZ19ncmVwfHByZWdfbGFzdF9lcnJvcnxwcmVnX21hdGNofHByZWdfbWF0Y2hfYWxsfHByZWdfcXVvdGV8cHJlZ19yZXBsYWNlfHByZWdfcmVwbGFjZV9jYWxsYmFja3xwcmVnX3NwbGl0fHByZXZ8cHJpbnR8cHJpbnRfcnwnICsNCiAgICAgICAgJ3ByaW50ZXJfYWJvcnR8cHJpbnRlcl9jbG9zZXxwcmludGVyX2NyZWF0ZV9icnVzaHxwcmludGVyX2NyZWF0ZV9kY3xwcmludGVyX2NyZWF0ZV9mb250fHByaW50ZXJfY3JlYXRlX3BlbnxwcmludGVyX2RlbGV0ZV9icnVzaHwnICsNCiAgICAgICAgJ3ByaW50ZXJfZGVsZXRlX2RjfHByaW50ZXJfZGVsZXRlX2ZvbnR8cHJpbnRlcl9kZWxldGVfcGVufHByaW50ZXJfZHJhd19ibXB8cHJpbnRlcl9kcmF3X2Nob3JkfHByaW50ZXJfZHJhd19lbGlwc2V8cHJpbnRlcl9kcmF3X2xpbmV8JyArDQogICAgICAgICdwcmludGVyX2RyYXdfcGllfHByaW50ZXJfZHJhd19yZWN0YW5nbGV8cHJpbnRlcl9kcmF3X3JvdW5kcmVjdHxwcmludGVyX2RyYXdfdGV4dHxwcmludGVyX2VuZF9kb2N8cHJpbnRlcl9lbmRfcGFnZXxwcmludGVyX2dldF9vcHRpb258JyArDQogICAgICAgICdwcmludGVyX2xpc3R8cHJpbnRlcl9sb2dpY2FsX2ZvbnRoZWlnaHR8cHJpbnRlcl9vcGVufHByaW50ZXJfc2VsZWN0X2JydXNofHByaW50ZXJfc2VsZWN0X2ZvbnR8cHJpbnRlcl9zZWxlY3RfcGVufHByaW50ZXJfc2V0X29wdGlvbnwnICsNCiAgICAgICAgJ3ByaW50ZXJfc3RhcnRfZG9jfHByaW50ZXJfc3RhcnRfcGFnZXxwcmludGVyX3dyaXRlfHByaW50Znxwcm9jX2Nsb3NlfHByb2NfZ2V0X3N0YXR1c3xwcm9jX25pY2V8cHJvY19vcGVufHByb2NfdGVybWluYXRlfHByb3BlcnR5X2V4aXN0c3wnICsNCiAgICAgICAgJ3BzX2FkZF9ib29rbWFya3xwc19hZGRfbGF1bmNobGlua3xwc19hZGRfbG9jYWxsaW5rfHBzX2FkZF9ub3RlfHBzX2FkZF9wZGZsaW5rfHBzX2FkZF93ZWJsaW5rfHBzX2FyY3xwc19hcmNufHBzX2JlZ2luX3BhZ2V8JyArDQogICAgICAgICdwc19iZWdpbl9wYXR0ZXJufHBzX2JlZ2luX3RlbXBsYXRlfHBzX2NpcmNsZXxwc19jbGlwfHBzX2Nsb3NlfHBzX2Nsb3NlX2ltYWdlfHBzX2Nsb3NlcGF0aHxwc19jbG9zZXBhdGhfc3Ryb2tlfHBzX2NvbnRpbnVlX3RleHR8cHNfY3VydmV0b3wnICsNCiAgICAgICAgJ3BzX2RlbGV0ZXxwc19lbmRfcGFnZXxwc19lbmRfcGF0dGVybnxwc19lbmRfdGVtcGxhdGV8cHNfZmlsbHxwc19maWxsX3N0cm9rZXxwc19maW5kZm9udHxwc19nZXRfYnVmZmVyfHBzX2dldF9wYXJhbWV0ZXJ8cHNfZ2V0X3ZhbHVlfCcgKw0KICAgICAgICAncHNfaHlwaGVuYXRlfHBzX2luY2x1ZGVfZmlsZXxwc19saW5ldG98cHNfbWFrZXNwb3Rjb2xvcnxwc19tb3ZldG98cHNfbmV3fHBzX29wZW5fZmlsZXxwc19vcGVuX2ltYWdlfHBzX29wZW5faW1hZ2VfZmlsZXwnICsNCiAgICAgICAgJ3BzX29wZW5fbWVtb3J5X2ltYWdlfHBzX3BsYWNlX2ltYWdlfHBzX3JlY3R8cHNfcmVzdG9yZXxwc19yb3RhdGV8cHNfc2F2ZXxwc19zY2FsZXxwc19zZXRfYm9yZGVyX2NvbG9yfHBzX3NldF9ib3JkZXJfZGFzaHwnICsNCiAgICAgICAgJ3BzX3NldF9ib3JkZXJfc3R5bGV8cHNfc2V0X2luZm98cHNfc2V0X3BhcmFtZXRlcnxwc19zZXRfdGV4dF9wb3N8cHNfc2V0X3ZhbHVlfHBzX3NldGNvbG9yfHBzX3NldGRhc2h8cHNfc2V0ZmxhdHxwc19zZXRmb250fHBzX3NldGdyYXl8JyArDQogICAgICAgICdwc19zZXRsaW5lY2FwfHBzX3NldGxpbmVqb2lufHBzX3NldGxpbmV3aWR0aHxwc19zZXRtaXRlcmxpbWl0fHBzX3NldG92ZXJwcmludG1vZGV8cHNfc2V0cG9seWRhc2h8cHNfc2hhZGluZ3xwc19zaGFkaW5nX3BhdHRlcm58cHNfc2hmaWxsfCcgKw0KICAgICAgICAncHNfc2hvd3xwc19zaG93Mnxwc19zaG93X2JveGVkfHBzX3Nob3dfeHl8cHNfc2hvd194eTJ8cHNfc3RyaW5nX2dlb21ldHJ5fHBzX3N0cmluZ3dpZHRofHBzX3N0cm9rZXxwc19zeW1ib2x8cHNfc3ltYm9sX25hbWV8JyArDQogICAgICAgICdwc19zeW1ib2xfd2lkdGh8cHNfdHJhbnNsYXRlfHBzcGVsbF9hZGRfdG9fcGVyc29uYWx8cHNwZWxsX2FkZF90b19zZXNzaW9ufHBzcGVsbF9jaGVja3xwc3BlbGxfY2xlYXJfc2Vzc2lvbnxwc3BlbGxfY29uZmlnX2NyZWF0ZXwnICsNCiAgICAgICAgJ3BzcGVsbF9jb25maWdfZGF0YV9kaXJ8cHNwZWxsX2NvbmZpZ19kaWN0X2Rpcnxwc3BlbGxfY29uZmlnX2lnbm9yZXxwc3BlbGxfY29uZmlnX21vZGV8cHNwZWxsX2NvbmZpZ19wZXJzb25hbHxwc3BlbGxfY29uZmlnX3JlcGx8JyArDQogICAgICAgICdwc3BlbGxfY29uZmlnX3J1bnRvZ2V0aGVyfHBzcGVsbF9jb25maWdfc2F2ZV9yZXBsfHBzcGVsbF9uZXd8cHNwZWxsX25ld19jb25maWd8cHNwZWxsX25ld19wZXJzb25hbHxwc3BlbGxfc2F2ZV93b3JkbGlzdHwnICsNCiAgICAgICAgJ3BzcGVsbF9zdG9yZV9yZXBsYWNlbWVudHxwc3BlbGxfc3VnZ2VzdHxwdXRlbnZ8cHhfY2xvc2V8cHhfY3JlYXRlX2ZwfHB4X2RhdGUyc3RyaW5nfHB4X2RlbGV0ZXxweF9kZWxldGVfcmVjb3JkfHB4X2dldF9maWVsZHxweF9nZXRfaW5mb3wnICsNCiAgICAgICAgJ3B4X2dldF9wYXJhbWV0ZXJ8cHhfZ2V0X3JlY29yZHxweF9nZXRfc2NoZW1hfHB4X2dldF92YWx1ZXxweF9pbnNlcnRfcmVjb3JkfHB4X25ld3xweF9udW1maWVsZHN8cHhfbnVtcmVjb3Jkc3xweF9vcGVuX2ZwfHB4X3B1dF9yZWNvcmR8JyArDQogICAgICAgICdweF9yZXRyaWV2ZV9yZWNvcmR8cHhfc2V0X2Jsb2JfZmlsZXxweF9zZXRfcGFyYW1ldGVyfHB4X3NldF90YWJsZW5hbWV8cHhfc2V0X3RhcmdldGVuY29kaW5nfHB4X3NldF92YWx1ZXxweF90aW1lc3RhbXAyc3RyaW5nfCcgKw0KICAgICAgICAncHhfdXBkYXRlX3JlY29yZHxxZG9tX2Vycm9yfHFkb21fdHJlZXxxdW90ZWRfcHJpbnRhYmxlX2RlY29kZXxxdW90ZWRfcHJpbnRhYmxlX2VuY29kZXxxdW90ZW1ldGF8cmFkMmRlZ3xyYWRpdXNfYWNjdF9vcGVufCcgKw0KICAgICAgICAncmFkaXVzX2FkZF9zZXJ2ZXJ8cmFkaXVzX2F1dGhfb3BlbnxyYWRpdXNfY2xvc2V8cmFkaXVzX2NvbmZpZ3xyYWRpdXNfY3JlYXRlX3JlcXVlc3R8cmFkaXVzX2N2dF9hZGRyfHJhZGl1c19jdnRfaW50fHJhZGl1c19jdnRfc3RyaW5nfCcgKw0KICAgICAgICAncmFkaXVzX2RlbWFuZ2xlfHJhZGl1c19kZW1hbmdsZV9tcHBlX2tleXxyYWRpdXNfZ2V0X2F0dHJ8cmFkaXVzX2dldF92ZW5kb3JfYXR0cnxyYWRpdXNfcHV0X2FkZHJ8cmFkaXVzX3B1dF9hdHRyfHJhZGl1c19wdXRfaW50fCcgKw0KICAgICAgICAncmFkaXVzX3B1dF9zdHJpbmd8cmFkaXVzX3B1dF92ZW5kb3JfYWRkcnxyYWRpdXNfcHV0X3ZlbmRvcl9hdHRyfHJhZGl1c19wdXRfdmVuZG9yX2ludHxyYWRpdXNfcHV0X3ZlbmRvcl9zdHJpbmd8JyArDQogICAgICAgICdyYWRpdXNfcmVxdWVzdF9hdXRoZW50aWNhdG9yfHJhZGl1c19zZW5kX3JlcXVlc3R8cmFkaXVzX3NlcnZlcl9zZWNyZXR8cmFkaXVzX3N0cmVycm9yfHJhbmR8cmFuZ2V8cmFuZ2VleGNlcHRpb258cmFyX3dyYXBwZXJfY2FjaGVfc3RhdHN8JyArDQogICAgICAgICdyYXJhcmNoaXZlfHJhcmVudHJ5fHJhcmV4Y2VwdGlvbnxyYXd1cmxkZWNvZGV8cmF3dXJsZW5jb2RlfHJlYWRfZXhpZl9kYXRhfHJlYWRkaXJ8cmVhZGZpbGV8cmVhZGd6ZmlsZXxyZWFkbGluZXxyZWFkbGluZV9hZGRfaGlzdG9yeXwnICsNCiAgICAgICAgJ3JlYWRsaW5lX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbHxyZWFkbGluZV9jYWxsYmFja19oYW5kbGVyX3JlbW92ZXxyZWFkbGluZV9jYWxsYmFja19yZWFkX2NoYXJ8cmVhZGxpbmVfY2xlYXJfaGlzdG9yeXwnICsNCiAgICAgICAgJ3JlYWRsaW5lX2NvbXBsZXRpb25fZnVuY3Rpb258cmVhZGxpbmVfaW5mb3xyZWFkbGluZV9saXN0X2hpc3Rvcnl8cmVhZGxpbmVfb25fbmV3X2xpbmV8cmVhZGxpbmVfcmVhZF9oaXN0b3J5fHJlYWRsaW5lX3JlZGlzcGxheXwnICsNCiAgICAgICAgJ3JlYWRsaW5lX3dyaXRlX2hpc3Rvcnl8cmVhZGxpbmt8cmVhbHBhdGh8cmVhbHBhdGhfY2FjaGVfZ2V0fHJlYWxwYXRoX2NhY2hlX3NpemV8cmVjb2RlfHJlY29kZV9maWxlfHJlY29kZV9zdHJpbmd8cmVjdXJzaXZlYXJyYXlpdGVyYXRvcnwnICsNCiAgICAgICAgJ3JlY3Vyc2l2ZWNhY2hpbmdpdGVyYXRvcnxyZWN1cnNpdmVjYWxsYmFja2ZpbHRlcml0ZXJhdG9yfHJlY3Vyc2l2ZWRpcmVjdG9yeWl0ZXJhdG9yfHJlY3Vyc2l2ZWZpbHRlcml0ZXJhdG9yfHJlY3Vyc2l2ZWl0ZXJhdG9yfCcgKw0KICAgICAgICAncmVjdXJzaXZlaXRlcmF0b3JpdGVyYXRvcnxyZWN1cnNpdmVyZWdleGl0ZXJhdG9yfHJlY3Vyc2l2ZXRyZWVpdGVyYXRvcnxyZWZsZWN0aW9ufHJlZmxlY3Rpb25jbGFzc3xyZWZsZWN0aW9uZXhjZXB0aW9ufHJlZmxlY3Rpb25leHRlbnNpb258JyArDQogICAgICAgICdyZWZsZWN0aW9uZnVuY3Rpb258cmVmbGVjdGlvbmZ1bmN0aW9uYWJzdHJhY3R8cmVmbGVjdGlvbm1ldGhvZHxyZWZsZWN0aW9ub2JqZWN0fHJlZmxlY3Rpb25wYXJhbWV0ZXJ8cmVmbGVjdGlvbnByb3BlcnR5fHJlZmxlY3RvcnwnICsNCiAgICAgICAgJ3JlZ2V4aXRlcmF0b3J8cmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb258cmVnaXN0ZXJfdGlja19mdW5jdGlvbnxyZW5hbWV8cmVuYW1lX2Z1bmN0aW9ufHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJlc2V0fHJlc2V0VmFsdWV8JyArDQogICAgICAgICdyZXNvdXJjZWJ1bmRsZXxyZXN0b3JlX2Vycm9yX2hhbmRsZXJ8cmVzdG9yZV9leGNlcHRpb25faGFuZGxlcnxyZXN0b3JlX2luY2x1ZGVfcGF0aHxyZXR1cm58cmV3aW5kfHJld2luZGRpcnxybWRpcnxyb3VuZHxycG1fY2xvc2V8JyArDQogICAgICAgICdycG1fZ2V0X3RhZ3xycG1faXNfdmFsaWR8cnBtX29wZW58cnBtX3ZlcnNpb258cnJkX2NyZWF0ZXxycmRfZXJyb3J8cnJkX2ZldGNofHJyZF9maXJzdHxycmRfZ3JhcGh8cnJkX2luZm98cnJkX2xhc3R8cnJkX2xhc3R1cGRhdGV8JyArDQogICAgICAgICdycmRfcmVzdG9yZXxycmRfdHVuZXxycmRfdXBkYXRlfHJyZF94cG9ydHxycmRjcmVhdG9yfHJyZGdyYXBofHJyZHVwZGF0ZXJ8cnNvcnR8cnRyaW18cnVua2l0X2NsYXNzX2Fkb3B0fHJ1bmtpdF9jbGFzc19lbWFuY2lwYXRlfCcgKw0KICAgICAgICAncnVua2l0X2NvbnN0YW50X2FkZHxydW5raXRfY29uc3RhbnRfcmVkZWZpbmV8cnVua2l0X2NvbnN0YW50X3JlbW92ZXxydW5raXRfZnVuY3Rpb25fYWRkfHJ1bmtpdF9mdW5jdGlvbl9jb3B5fHJ1bmtpdF9mdW5jdGlvbl9yZWRlZmluZXwnICsNCiAgICAgICAgJ3J1bmtpdF9mdW5jdGlvbl9yZW1vdmV8cnVua2l0X2Z1bmN0aW9uX3JlbmFtZXxydW5raXRfaW1wb3J0fHJ1bmtpdF9saW50fHJ1bmtpdF9saW50X2ZpbGV8cnVua2l0X21ldGhvZF9hZGR8cnVua2l0X21ldGhvZF9jb3B5fCcgKw0KICAgICAgICAncnVua2l0X21ldGhvZF9yZWRlZmluZXxydW5raXRfbWV0aG9kX3JlbW92ZXxydW5raXRfbWV0aG9kX3JlbmFtZXxydW5raXRfcmV0dXJuX3ZhbHVlX3VzZWR8cnVua2l0X3NhbmRib3hfb3V0cHV0X2hhbmRsZXJ8JyArDQogICAgICAgICdydW5raXRfc3VwZXJnbG9iYWxzfHJ1bnRpbWVleGNlcHRpb258c2FtY29ubmVjdGlvbl9jb21taXR8c2FtY29ubmVjdGlvbl9jb25uZWN0fHNhbWNvbm5lY3Rpb25fY29uc3RydWN0b3J8c2FtY29ubmVjdGlvbl9kaXNjb25uZWN0fCcgKw0KICAgICAgICAnc2FtY29ubmVjdGlvbl9lcnJub3xzYW1jb25uZWN0aW9uX2Vycm9yfHNhbWNvbm5lY3Rpb25faXNjb25uZWN0ZWR8c2FtY29ubmVjdGlvbl9wZWVrfHNhbWNvbm5lY3Rpb25fcGVla2FsbHxzYW1jb25uZWN0aW9uX3JlY2VpdmV8JyArDQogICAgICAgICdzYW1jb25uZWN0aW9uX3JlbW92ZXxzYW1jb25uZWN0aW9uX3JvbGxiYWNrfHNhbWNvbm5lY3Rpb25fc2VuZHxzYW1jb25uZWN0aW9uX3NldERlYnVnfHNhbWNvbm5lY3Rpb25fc3Vic2NyaWJlfHNhbWNvbm5lY3Rpb25fdW5zdWJzY3JpYmV8JyArDQogICAgICAgICdzYW1tZXNzYWdlX2JvZHl8c2FtbWVzc2FnZV9jb25zdHJ1Y3RvcnxzYW1tZXNzYWdlX2hlYWRlcnxzY2FfY3JlYXRlZGF0YW9iamVjdHxzY2FfZ2V0c2VydmljZXxzY2FfbG9jYWxwcm94eV9jcmVhdGVkYXRhb2JqZWN0fCcgKw0KICAgICAgICAnc2NhX3NvYXBwcm94eV9jcmVhdGVkYXRhb2JqZWN0fHNjYW5kaXJ8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2JlZ2lubG9nZ2luZ3xzZG9fZGFzX2NoYW5nZXN1bW1hcnlfZW5kbG9nZ2luZ3wnICsNCiAgICAgICAgJ3Nkb19kYXNfY2hhbmdlc3VtbWFyeV9nZXRjaGFuZ2VkZGF0YW9iamVjdHN8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2dldGNoYW5nZXR5cGV8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2dldG9sZGNvbnRhaW5lcnwnICsNCiAgICAgICAgJ3Nkb19kYXNfY2hhbmdlc3VtbWFyeV9nZXRvbGR2YWx1ZXN8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2lzbG9nZ2luZ3xzZG9fZGFzX2RhdGFmYWN0b3J5X2FkZHByb3BlcnR5dG90eXBlfHNkb19kYXNfZGF0YWZhY3RvcnlfYWRkdHlwZXwnICsNCiAgICAgICAgJ3Nkb19kYXNfZGF0YWZhY3RvcnlfZ2V0ZGF0YWZhY3Rvcnl8c2RvX2Rhc19kYXRhb2JqZWN0X2dldGNoYW5nZXN1bW1hcnl8c2RvX2Rhc19yZWxhdGlvbmFsX2FwcGx5Y2hhbmdlc3xzZG9fZGFzX3JlbGF0aW9uYWxfY29uc3RydWN0fCcgKw0KICAgICAgICAnc2RvX2Rhc19yZWxhdGlvbmFsX2NyZWF0ZXJvb3RkYXRhb2JqZWN0fHNkb19kYXNfcmVsYXRpb25hbF9leGVjdXRlcHJlcGFyZWRxdWVyeXxzZG9fZGFzX3JlbGF0aW9uYWxfZXhlY3V0ZXF1ZXJ5fCcgKw0KICAgICAgICAnc2RvX2Rhc19zZXR0aW5nX2dldGxpc3RpbmRleHxzZG9fZGFzX3NldHRpbmdfZ2V0cHJvcGVydHlpbmRleHxzZG9fZGFzX3NldHRpbmdfZ2V0cHJvcGVydHluYW1lfHNkb19kYXNfc2V0dGluZ19nZXR2YWx1ZXwnICsNCiAgICAgICAgJ3Nkb19kYXNfc2V0dGluZ19pc3NldHxzZG9fZGFzX3htbF9hZGR0eXBlc3xzZG9fZGFzX3htbF9jcmVhdGV8c2RvX2Rhc194bWxfY3JlYXRlZGF0YW9iamVjdHxzZG9fZGFzX3htbF9jcmVhdGVkb2N1bWVudHwnICsNCiAgICAgICAgJ3Nkb19kYXNfeG1sX2RvY3VtZW50X2dldHJvb3RkYXRhb2JqZWN0fHNkb19kYXNfeG1sX2RvY3VtZW50X2dldHJvb3RlbGVtZW50bmFtZXxzZG9fZGFzX3htbF9kb2N1bWVudF9nZXRyb290ZWxlbWVudHVyaXwnICsNCiAgICAgICAgJ3Nkb19kYXNfeG1sX2RvY3VtZW50X3NldGVuY29kaW5nfHNkb19kYXNfeG1sX2RvY3VtZW50X3NldHhtbGRlY2xhcmF0aW9ufHNkb19kYXNfeG1sX2RvY3VtZW50X3NldHhtbHZlcnNpb258c2RvX2Rhc194bWxfbG9hZGZpbGV8JyArDQogICAgICAgICdzZG9fZGFzX3htbF9sb2Fkc3RyaW5nfHNkb19kYXNfeG1sX3NhdmVmaWxlfHNkb19kYXNfeG1sX3NhdmVzdHJpbmd8c2RvX2RhdGFmYWN0b3J5X2NyZWF0ZXxzZG9fZGF0YW9iamVjdF9jbGVhcnwnICsNCiAgICAgICAgJ3Nkb19kYXRhb2JqZWN0X2NyZWF0ZWRhdGFvYmplY3R8c2RvX2RhdGFvYmplY3RfZ2V0Y29udGFpbmVyfHNkb19kYXRhb2JqZWN0X2dldHNlcXVlbmNlfHNkb19kYXRhb2JqZWN0X2dldHR5cGVuYW1lfCcgKw0KICAgICAgICAnc2RvX2RhdGFvYmplY3RfZ2V0dHlwZW5hbWVzcGFjZXVyaXxzZG9fZXhjZXB0aW9uX2dldGNhdXNlfHNkb19saXN0X2luc2VydHxzZG9fbW9kZWxfcHJvcGVydHlfZ2V0Y29udGFpbmluZ3R5cGV8JyArDQogICAgICAgICdzZG9fbW9kZWxfcHJvcGVydHlfZ2V0ZGVmYXVsdHxzZG9fbW9kZWxfcHJvcGVydHlfZ2V0bmFtZXxzZG9fbW9kZWxfcHJvcGVydHlfZ2V0dHlwZXxzZG9fbW9kZWxfcHJvcGVydHlfaXNjb250YWlubWVudHwnICsNCiAgICAgICAgJ3Nkb19tb2RlbF9wcm9wZXJ0eV9pc21hbnl8c2RvX21vZGVsX3JlZmxlY3Rpb25kYXRhb2JqZWN0X2NvbnN0cnVjdHxzZG9fbW9kZWxfcmVmbGVjdGlvbmRhdGFvYmplY3RfZXhwb3J0fCcgKw0KICAgICAgICAnc2RvX21vZGVsX3JlZmxlY3Rpb25kYXRhb2JqZWN0X2dldGNvbnRhaW5tZW50cHJvcGVydHl8c2RvX21vZGVsX3JlZmxlY3Rpb25kYXRhb2JqZWN0X2dldGluc3RhbmNlcHJvcGVydGllc3wnICsNCiAgICAgICAgJ3Nkb19tb2RlbF9yZWZsZWN0aW9uZGF0YW9iamVjdF9nZXR0eXBlfHNkb19tb2RlbF90eXBlX2dldGJhc2V0eXBlfHNkb19tb2RlbF90eXBlX2dldG5hbWV8c2RvX21vZGVsX3R5cGVfZ2V0bmFtZXNwYWNldXJpfCcgKw0KICAgICAgICAnc2RvX21vZGVsX3R5cGVfZ2V0cHJvcGVydGllc3xzZG9fbW9kZWxfdHlwZV9nZXRwcm9wZXJ0eXxzZG9fbW9kZWxfdHlwZV9pc2Fic3RyYWN0dHlwZXxzZG9fbW9kZWxfdHlwZV9pc2RhdGF0eXBlfHNkb19tb2RlbF90eXBlX2lzaW5zdGFuY2V8JyArDQogICAgICAgICdzZG9fbW9kZWxfdHlwZV9pc29wZW50eXBlfHNkb19tb2RlbF90eXBlX2lzc2VxdWVuY2VkdHlwZXxzZG9fc2VxdWVuY2VfZ2V0cHJvcGVydHl8c2RvX3NlcXVlbmNlX2luc2VydHxzZG9fc2VxdWVuY2VfbW92ZXxzZWVrYWJsZWl0ZXJhdG9yfCcgKw0KICAgICAgICAnc2VtX2FjcXVpcmV8c2VtX2dldHxzZW1fcmVsZWFzZXxzZW1fcmVtb3ZlfHNlcmlhbGl6YWJsZXxzZXJpYWxpemV8c2Vzc2lvbl9jYWNoZV9leHBpcmV8c2Vzc2lvbl9jYWNoZV9saW1pdGVyfHNlc3Npb25fY29tbWl0fCcgKw0KICAgICAgICAnc2Vzc2lvbl9kZWNvZGV8c2Vzc2lvbl9kZXN0cm95fHNlc3Npb25fZW5jb2RlfHNlc3Npb25fZ2V0X2Nvb2tpZV9wYXJhbXN8c2Vzc2lvbl9pZHxzZXNzaW9uX2lzX3JlZ2lzdGVyZWR8c2Vzc2lvbl9tb2R1bGVfbmFtZXxzZXNzaW9uX25hbWV8JyArDQogICAgICAgICdzZXNzaW9uX3Bnc3FsX2FkZF9lcnJvcnxzZXNzaW9uX3Bnc3FsX2dldF9lcnJvcnxzZXNzaW9uX3Bnc3FsX2dldF9maWVsZHxzZXNzaW9uX3Bnc3FsX3Jlc2V0fHNlc3Npb25fcGdzcWxfc2V0X2ZpZWxkfHNlc3Npb25fcGdzcWxfc3RhdHVzfCcgKw0KICAgICAgICAnc2Vzc2lvbl9yZWdlbmVyYXRlX2lkfHNlc3Npb25fcmVnaXN0ZXJ8c2Vzc2lvbl9zYXZlX3BhdGh8c2Vzc2lvbl9zZXRfY29va2llX3BhcmFtc3xzZXNzaW9uX3NldF9zYXZlX2hhbmRsZXJ8c2Vzc2lvbl9zdGFydHwnICsNCiAgICAgICAgJ3Nlc3Npb25fdW5yZWdpc3RlcnxzZXNzaW9uX3Vuc2V0fHNlc3Npb25fd3JpdGVfY2xvc2V8c2V0Q291bnRlckNsYXNzfHNldF9lcnJvcl9oYW5kbGVyfHNldF9leGNlcHRpb25faGFuZGxlcnxzZXRfZmlsZV9idWZmZXJ8JyArDQogICAgICAgICdzZXRfaW5jbHVkZV9wYXRofHNldF9tYWdpY19xdW90ZXNfcnVudGltZXxzZXRfc29ja2V0X2Jsb2NraW5nfHNldF90aW1lX2xpbWl0fHNldGNvb2tpZXxzZXRsb2NhbGV8c2V0cHJvY3RpdGxlfHNldHJhd2Nvb2tpZXwnICsNCiAgICAgICAgJ3NldHN0YXRpY3Byb3BlcnR5dmFsdWV8c2V0dGhyZWFkdGl0bGV8c2V0dHlwZXxzaGExfHNoYTFfZmlsZXxzaGVsbF9leGVjfHNobV9hdHRhY2h8c2htX2RldGFjaHxzaG1fZ2V0X3ZhcnxzaG1faGFzX3ZhcnxzaG1fcHV0X3ZhcnwnICsNCiAgICAgICAgJ3NobV9yZW1vdmV8c2htX3JlbW92ZV92YXJ8c2htb3BfY2xvc2V8c2htb3BfZGVsZXRlfHNobW9wX29wZW58c2htb3BfcmVhZHxzaG1vcF9zaXplfHNobW9wX3dyaXRlfHNob3dfc291cmNlfHNodWZmbGV8c2lnbmV1cmxwYWllbWVudHwnICsNCiAgICAgICAgJ3NpbWlsYXJfdGV4dHxzaW1wbGV4bWxfaW1wb3J0X2RvbXxzaW1wbGV4bWxfbG9hZF9maWxlfHNpbXBsZXhtbF9sb2FkX3N0cmluZ3xzaW1wbGV4bWxlbGVtZW50fHNpbXBsZXhtbGl0ZXJhdG9yfHNpbnxzaW5ofHNpemVvZnxzbGVlcHxzbm1wfCcgKw0KICAgICAgICAnc25tcDJfZ2V0fHNubXAyX2dldG5leHR8c25tcDJfcmVhbF93YWxrfHNubXAyX3NldHxzbm1wMl93YWxrfHNubXAzX2dldHxzbm1wM19nZXRuZXh0fHNubXAzX3JlYWxfd2Fsa3xzbm1wM19zZXR8c25tcDNfd2Fsa3wnICsNCiAgICAgICAgJ3NubXBfZ2V0X3F1aWNrX3ByaW50fHNubXBfZ2V0X3ZhbHVlcmV0cmlldmFsfHNubXBfcmVhZF9taWJ8c25tcF9zZXRfZW51bV9wcmludHxzbm1wX3NldF9vaWRfbnVtZXJpY19wcmludHxzbm1wX3NldF9vaWRfb3V0cHV0X2Zvcm1hdHwnICsNCiAgICAgICAgJ3NubXBfc2V0X3F1aWNrX3ByaW50fHNubXBfc2V0X3ZhbHVlcmV0cmlldmFsfHNubXBnZXR8c25tcGdldG5leHR8c25tcHJlYWx3YWxrfHNubXBzZXR8c25tcHdhbGt8c25tcHdhbGtvaWR8c29hcGNsaWVudHxzb2FwZmF1bHR8JyArDQogICAgICAgICdzb2FwaGVhZGVyfHNvYXBwYXJhbXxzb2Fwc2VydmVyfHNvYXB2YXJ8c29ja2V0X2FjY2VwdHxzb2NrZXRfYmluZHxzb2NrZXRfY2xlYXJfZXJyb3J8c29ja2V0X2Nsb3NlfHNvY2tldF9jb25uZWN0fHNvY2tldF9jcmVhdGV8JyArDQogICAgICAgICdzb2NrZXRfY3JlYXRlX2xpc3Rlbnxzb2NrZXRfY3JlYXRlX3BhaXJ8c29ja2V0X2dldF9vcHRpb258c29ja2V0X2dldF9zdGF0dXN8c29ja2V0X2dldHBlZXJuYW1lfHNvY2tldF9nZXRzb2NrbmFtZXxzb2NrZXRfbGFzdF9lcnJvcnwnICsNCiAgICAgICAgJ3NvY2tldF9saXN0ZW58c29ja2V0X3JlYWR8c29ja2V0X3JlY3Z8c29ja2V0X3JlY3Zmcm9tfHNvY2tldF9zZWxlY3R8c29ja2V0X3NlbmR8c29ja2V0X3NlbmR0b3xzb2NrZXRfc2V0X2Jsb2NrfHNvY2tldF9zZXRfYmxvY2tpbmd8JyArDQogICAgICAgICdzb2NrZXRfc2V0X25vbmJsb2NrfHNvY2tldF9zZXRfb3B0aW9ufHNvY2tldF9zZXRfdGltZW91dHxzb2NrZXRfc2h1dGRvd258c29ja2V0X3N0cmVycm9yfHNvY2tldF93cml0ZXxzb2xyX2dldF92ZXJzaW9ufHNvbHJjbGllbnR8JyArDQogICAgICAgICdzb2xyY2xpZW50ZXhjZXB0aW9ufHNvbHJkb2N1bWVudHxzb2xyZG9jdW1lbnRmaWVsZHxzb2xyZXhjZXB0aW9ufHNvbHJnZW5lcmljcmVzcG9uc2V8c29scmlsbGVnYWxhcmd1bWVudGV4Y2VwdGlvbnwnICsNCiAgICAgICAgJ3NvbHJpbGxlZ2Fsb3BlcmF0aW9uZXhjZXB0aW9ufHNvbHJpbnB1dGRvY3VtZW50fHNvbHJtb2RpZmlhYmxlcGFyYW1zfHNvbHJvYmplY3R8c29scnBhcmFtc3xzb2xycGluZ3Jlc3BvbnNlfHNvbHJxdWVyeXxzb2xycXVlcnlyZXNwb25zZXwnICsNCiAgICAgICAgJ3NvbHJyZXNwb25zZXxzb2xydXBkYXRlcmVzcG9uc2V8c29scnV0aWxzfHNvcnR8c291bmRleHxzcGhpbnhjbGllbnR8c3BsX2F1dG9sb2FkfHNwbF9hdXRvbG9hZF9jYWxsfHNwbF9hdXRvbG9hZF9leHRlbnNpb25zfCcgKw0KICAgICAgICAnc3BsX2F1dG9sb2FkX2Z1bmN0aW9uc3xzcGxfYXV0b2xvYWRfcmVnaXN0ZXJ8c3BsX2F1dG9sb2FkX3VucmVnaXN0ZXJ8c3BsX2NsYXNzZXN8c3BsX29iamVjdF9oYXNofHNwbGJvb2x8c3BsZG91Ymx5bGlua2VkbGlzdHxzcGxlbnVtfCcgKw0KICAgICAgICAnc3BsZmlsZWluZm98c3BsZmlsZW9iamVjdHxzcGxmaXhlZGFycmF5fHNwbGZsb2F0fHNwbGhlYXB8c3BsaW50fHNwbGl0fHNwbGl0aXxzcGxtYXhoZWFwfHNwbG1pbmhlYXB8c3Bsb2JqZWN0c3RvcmFnZXxzcGxvYnNlcnZlcnwnICsNCiAgICAgICAgJ3NwbHByaW9yaXR5cXVldWV8c3BscXVldWV8c3Bsc3RhY2t8c3Bsc3RyaW5nfHNwbHN1YmplY3R8c3BsdGVtcGZpbGVvYmplY3R8c3Bvb2ZjaGVja2VyfHNwcmludGZ8c3FsX3JlZ2Nhc2V8c3FsaXRlM3xzcWxpdGUzcmVzdWx0fCcgKw0KICAgICAgICAnc3FsaXRlM3N0bXR8c3FsaXRlX2FycmF5X3F1ZXJ5fHNxbGl0ZV9idXN5X3RpbWVvdXR8c3FsaXRlX2NoYW5nZXN8c3FsaXRlX2Nsb3NlfHNxbGl0ZV9jb2x1bW58c3FsaXRlX2NyZWF0ZV9hZ2dyZWdhdGV8JyArDQogICAgICAgICdzcWxpdGVfY3JlYXRlX2Z1bmN0aW9ufHNxbGl0ZV9jdXJyZW50fHNxbGl0ZV9lcnJvcl9zdHJpbmd8c3FsaXRlX2VzY2FwZV9zdHJpbmd8c3FsaXRlX2V4ZWN8c3FsaXRlX2ZhY3Rvcnl8c3FsaXRlX2ZldGNoX2FsbHwnICsNCiAgICAgICAgJ3NxbGl0ZV9mZXRjaF9hcnJheXxzcWxpdGVfZmV0Y2hfY29sdW1uX3R5cGVzfHNxbGl0ZV9mZXRjaF9vYmplY3R8c3FsaXRlX2ZldGNoX3NpbmdsZXxzcWxpdGVfZmV0Y2hfc3RyaW5nfHNxbGl0ZV9maWVsZF9uYW1lfCcgKw0KICAgICAgICAnc3FsaXRlX2hhc19tb3JlfHNxbGl0ZV9oYXNfcHJldnxzcWxpdGVfa2V5fHNxbGl0ZV9sYXN0X2Vycm9yfHNxbGl0ZV9sYXN0X2luc2VydF9yb3dpZHxzcWxpdGVfbGliZW5jb2Rpbmd8c3FsaXRlX2xpYnZlcnNpb258c3FsaXRlX25leHR8JyArDQogICAgICAgICdzcWxpdGVfbnVtX2ZpZWxkc3xzcWxpdGVfbnVtX3Jvd3N8c3FsaXRlX29wZW58c3FsaXRlX3BvcGVufHNxbGl0ZV9wcmV2fHNxbGl0ZV9xdWVyeXxzcWxpdGVfcmV3aW5kfHNxbGl0ZV9zZWVrfHNxbGl0ZV9zaW5nbGVfcXVlcnl8JyArDQogICAgICAgICdzcWxpdGVfdWRmX2RlY29kZV9iaW5hcnl8c3FsaXRlX3VkZl9lbmNvZGVfYmluYXJ5fHNxbGl0ZV91bmJ1ZmZlcmVkX3F1ZXJ5fHNxbGl0ZV92YWxpZHxzcXJ0fHNyYW5kfHNzY2FuZnxzc2RlZXBfZnV6enlfY29tcGFyZXwnICsNCiAgICAgICAgJ3NzZGVlcF9mdXp6eV9oYXNofHNzZGVlcF9mdXp6eV9oYXNoX2ZpbGVuYW1lfHNzaDJfYXV0aF9ob3N0YmFzZWRfZmlsZXxzc2gyX2F1dGhfbm9uZXxzc2gyX2F1dGhfcGFzc3dvcmR8c3NoMl9hdXRoX3B1YmtleV9maWxlfCcgKw0KICAgICAgICAnc3NoMl9jb25uZWN0fHNzaDJfZXhlY3xzc2gyX2ZldGNoX3N0cmVhbXxzc2gyX2ZpbmdlcnByaW50fHNzaDJfbWV0aG9kc19uZWdvdGlhdGVkfHNzaDJfcHVibGlja2V5X2FkZHxzc2gyX3B1YmxpY2tleV9pbml0fCcgKw0KICAgICAgICAnc3NoMl9wdWJsaWNrZXlfbGlzdHxzc2gyX3B1YmxpY2tleV9yZW1vdmV8c3NoMl9zY3BfcmVjdnxzc2gyX3NjcF9zZW5kfHNzaDJfc2Z0cHxzc2gyX3NmdHBfbHN0YXR8c3NoMl9zZnRwX21rZGlyfHNzaDJfc2Z0cF9yZWFkbGlua3wnICsNCiAgICAgICAgJ3NzaDJfc2Z0cF9yZWFscGF0aHxzc2gyX3NmdHBfcmVuYW1lfHNzaDJfc2Z0cF9ybWRpcnxzc2gyX3NmdHBfc3RhdHxzc2gyX3NmdHBfc3ltbGlua3xzc2gyX3NmdHBfdW5saW5rfHNzaDJfc2hlbGx8c3NoMl90dW5uZWx8c3RhdHwnICsNCiAgICAgICAgJ3N0YXRzX2Fic29sdXRlX2RldmlhdGlvbnxzdGF0c19jZGZfYmV0YXxzdGF0c19jZGZfYmlub21pYWx8c3RhdHNfY2RmX2NhdWNoeXxzdGF0c19jZGZfY2hpc3F1YXJlfHN0YXRzX2NkZl9leHBvbmVudGlhbHxzdGF0c19jZGZfZnwnICsNCiAgICAgICAgJ3N0YXRzX2NkZl9nYW1tYXxzdGF0c19jZGZfbGFwbGFjZXxzdGF0c19jZGZfbG9naXN0aWN8c3RhdHNfY2RmX25lZ2F0aXZlX2Jpbm9taWFsfHN0YXRzX2NkZl9ub25jZW50cmFsX2NoaXNxdWFyZXxzdGF0c19jZGZfbm9uY2VudHJhbF9mfCcgKw0KICAgICAgICAnc3RhdHNfY2RmX3BvaXNzb258c3RhdHNfY2RmX3R8c3RhdHNfY2RmX3VuaWZvcm18c3RhdHNfY2RmX3dlaWJ1bGx8c3RhdHNfY292YXJpYW5jZXxzdGF0c19kZW5fdW5pZm9ybXxzdGF0c19kZW5zX2JldGF8c3RhdHNfZGVuc19jYXVjaHl8JyArDQogICAgICAgICdzdGF0c19kZW5zX2NoaXNxdWFyZXxzdGF0c19kZW5zX2V4cG9uZW50aWFsfHN0YXRzX2RlbnNfZnxzdGF0c19kZW5zX2dhbW1hfHN0YXRzX2RlbnNfbGFwbGFjZXxzdGF0c19kZW5zX2xvZ2lzdGljfCcgKw0KICAgICAgICAnc3RhdHNfZGVuc19uZWdhdGl2ZV9iaW5vbWlhbHxzdGF0c19kZW5zX25vcm1hbHxzdGF0c19kZW5zX3BtZl9iaW5vbWlhbHxzdGF0c19kZW5zX3BtZl9oeXBlcmdlb21ldHJpY3xzdGF0c19kZW5zX3BtZl9wb2lzc29ufHN0YXRzX2RlbnNfdHwnICsNCiAgICAgICAgJ3N0YXRzX2RlbnNfd2VpYnVsbHxzdGF0c19oYXJtb25pY19tZWFufHN0YXRzX2t1cnRvc2lzfHN0YXRzX3JhbmRfZ2VuX2JldGF8c3RhdHNfcmFuZF9nZW5fY2hpc3F1YXJlfHN0YXRzX3JhbmRfZ2VuX2V4cG9uZW50aWFsfCcgKw0KICAgICAgICAnc3RhdHNfcmFuZF9nZW5fZnxzdGF0c19yYW5kX2dlbl9mdW5pZm9ybXxzdGF0c19yYW5kX2dlbl9nYW1tYXxzdGF0c19yYW5kX2dlbl9pYmlub21pYWx8c3RhdHNfcmFuZF9nZW5faWJpbm9taWFsX25lZ2F0aXZlfCcgKw0KICAgICAgICAnc3RhdHNfcmFuZF9nZW5faW50fHN0YXRzX3JhbmRfZ2VuX2lwb2lzc29ufHN0YXRzX3JhbmRfZ2VuX2l1bmlmb3JtfHN0YXRzX3JhbmRfZ2VuX25vbmNlbnJhbF9jaGlzcXVhcmV8c3RhdHNfcmFuZF9nZW5fbm9uY2VudHJhbF9mfCcgKw0KICAgICAgICAnc3RhdHNfcmFuZF9nZW5fbm9uY2VudHJhbF90fHN0YXRzX3JhbmRfZ2VuX25vcm1hbHxzdGF0c19yYW5kX2dlbl90fHN0YXRzX3JhbmRfZ2V0X3NlZWRzfHN0YXRzX3JhbmRfcGhyYXNlX3RvX3NlZWRzfHN0YXRzX3JhbmRfcmFuZnwnICsNCiAgICAgICAgJ3N0YXRzX3JhbmRfc2V0YWxsfHN0YXRzX3NrZXd8c3RhdHNfc3RhbmRhcmRfZGV2aWF0aW9ufHN0YXRzX3N0YXRfYmlub21pYWxfY29lZnxzdGF0c19zdGF0X2NvcnJlbGF0aW9ufHN0YXRzX3N0YXRfZ2VubmNofCcgKw0KICAgICAgICAnc3RhdHNfc3RhdF9pbmRlcGVuZGVudF90fHN0YXRzX3N0YXRfaW5uZXJwcm9kdWN0fHN0YXRzX3N0YXRfbm9uY2VudHJhbF90fHN0YXRzX3N0YXRfcGFpcmVkX3R8c3RhdHNfc3RhdF9wZXJjZW50aWxlfHN0YXRzX3N0YXRfcG93ZXJzdW18JyArDQogICAgICAgICdzdGF0c192YXJpYW5jZXxzdG9tcHxzdG9tcF9jb25uZWN0X2Vycm9yfHN0b21wX3ZlcnNpb258c3RvbXBleGNlcHRpb258c3RvbXBmcmFtZXxzdHJfZ2V0Y3N2fHN0cl9pcmVwbGFjZXxzdHJfcGFkfHN0cl9yZXBlYXR8c3RyX3JlcGxhY2V8JyArDQogICAgICAgICdzdHJfcm90MTN8c3RyX3NodWZmbGV8c3RyX3NwbGl0fHN0cl93b3JkX2NvdW50fHN0cmNhc2VjbXB8c3RyY2hyfHN0cmNtcHxzdHJjb2xsfHN0cmNzcG58c3RyZWFtX2J1Y2tldF9hcHBlbmR8c3RyZWFtX2J1Y2tldF9tYWtlX3dyaXRlYWJsZXwnICsNCiAgICAgICAgJ3N0cmVhbV9idWNrZXRfbmV3fHN0cmVhbV9idWNrZXRfcHJlcGVuZHxzdHJlYW1fY29udGV4dF9jcmVhdGV8c3RyZWFtX2NvbnRleHRfZ2V0X2RlZmF1bHR8c3RyZWFtX2NvbnRleHRfZ2V0X29wdGlvbnN8JyArDQogICAgICAgICdzdHJlYW1fY29udGV4dF9nZXRfcGFyYW1zfHN0cmVhbV9jb250ZXh0X3NldF9kZWZhdWx0fHN0cmVhbV9jb250ZXh0X3NldF9vcHRpb258c3RyZWFtX2NvbnRleHRfc2V0X3BhcmFtc3xzdHJlYW1fY29weV90b19zdHJlYW18JyArDQogICAgICAgICdzdHJlYW1fZW5jb2Rpbmd8c3RyZWFtX2ZpbHRlcl9hcHBlbmR8c3RyZWFtX2ZpbHRlcl9wcmVwZW5kfHN0cmVhbV9maWx0ZXJfcmVnaXN0ZXJ8c3RyZWFtX2ZpbHRlcl9yZW1vdmV8c3RyZWFtX2dldF9jb250ZW50c3wnICsNCiAgICAgICAgJ3N0cmVhbV9nZXRfZmlsdGVyc3xzdHJlYW1fZ2V0X2xpbmV8c3RyZWFtX2dldF9tZXRhX2RhdGF8c3RyZWFtX2dldF90cmFuc3BvcnRzfHN0cmVhbV9nZXRfd3JhcHBlcnN8c3RyZWFtX2lzX2xvY2FsfCcgKw0KICAgICAgICAnc3RyZWFtX25vdGlmaWNhdGlvbl9jYWxsYmFja3xzdHJlYW1fcmVnaXN0ZXJfd3JhcHBlcnxzdHJlYW1fcmVzb2x2ZV9pbmNsdWRlX3BhdGh8c3RyZWFtX3NlbGVjdHxzdHJlYW1fc2V0X2Jsb2NraW5nfHN0cmVhbV9zZXRfcmVhZF9idWZmZXJ8JyArDQogICAgICAgICdzdHJlYW1fc2V0X3RpbWVvdXR8c3RyZWFtX3NldF93cml0ZV9idWZmZXJ8c3RyZWFtX3NvY2tldF9hY2NlcHR8c3RyZWFtX3NvY2tldF9jbGllbnR8c3RyZWFtX3NvY2tldF9lbmFibGVfY3J5cHRvfHN0cmVhbV9zb2NrZXRfZ2V0X25hbWV8JyArDQogICAgICAgICdzdHJlYW1fc29ja2V0X3BhaXJ8c3RyZWFtX3NvY2tldF9yZWN2ZnJvbXxzdHJlYW1fc29ja2V0X3NlbmR0b3xzdHJlYW1fc29ja2V0X3NlcnZlcnxzdHJlYW1fc29ja2V0X3NodXRkb3dufHN0cmVhbV9zdXBwb3J0c19sb2NrfCcgKw0KICAgICAgICAnc3RyZWFtX3dyYXBwZXJfcmVnaXN0ZXJ8c3RyZWFtX3dyYXBwZXJfcmVzdG9yZXxzdHJlYW1fd3JhcHBlcl91bnJlZ2lzdGVyfHN0cmVhbXdyYXBwZXJ8c3RyZnRpbWV8c3RyaXBfdGFnc3xzdHJpcGNzbGFzaGVzfHN0cmlwb3N8JyArDQogICAgICAgICdzdHJpcHNsYXNoZXN8c3RyaXN0cnxzdHJsZW58c3RybmF0Y2FzZWNtcHxzdHJuYXRjbXB8c3RybmNhc2VjbXB8c3RybmNtcHxzdHJwYnJrfHN0cnBvc3xzdHJwdGltZXxzdHJyY2hyfHN0cnJldnxzdHJyaXBvc3xzdHJycG9zfHN0cnNwbnwnICsNCiAgICAgICAgJ3N0cnN0cnxzdHJ0b2t8c3RydG9sb3dlcnxzdHJ0b3RpbWV8c3RydG91cHBlcnxzdHJ0cnxzdHJ2YWx8c3Vic3RyfHN1YnN0cl9jb21wYXJlfHN1YnN0cl9jb3VudHxzdWJzdHJfcmVwbGFjZXxzdm18c3ZtbW9kZWx8c3ZuX2FkZHwnICsNCiAgICAgICAgJ3N2bl9hdXRoX2dldF9wYXJhbWV0ZXJ8c3ZuX2F1dGhfc2V0X3BhcmFtZXRlcnxzdm5fYmxhbWV8c3ZuX2NhdHxzdm5fY2hlY2tvdXR8c3ZuX2NsZWFudXB8c3ZuX2NsaWVudF92ZXJzaW9ufHN2bl9jb21taXR8c3ZuX2RlbGV0ZXwnICsNCiAgICAgICAgJ3N2bl9kaWZmfHN2bl9leHBvcnR8c3ZuX2ZzX2Fib3J0X3R4bnxzdm5fZnNfYXBwbHlfdGV4dHxzdm5fZnNfYmVnaW5fdHhuMnxzdm5fZnNfY2hhbmdlX25vZGVfcHJvcHxzdm5fZnNfY2hlY2tfcGF0aHwnICsNCiAgICAgICAgJ3N2bl9mc19jb250ZW50c19jaGFuZ2VkfHN2bl9mc19jb3B5fHN2bl9mc19kZWxldGV8c3ZuX2ZzX2Rpcl9lbnRyaWVzfHN2bl9mc19maWxlX2NvbnRlbnRzfHN2bl9mc19maWxlX2xlbmd0aHxzdm5fZnNfaXNfZGlyfHN2bl9mc19pc19maWxlfCcgKw0KICAgICAgICAnc3ZuX2ZzX21ha2VfZGlyfHN2bl9mc19tYWtlX2ZpbGV8c3ZuX2ZzX25vZGVfY3JlYXRlZF9yZXZ8c3ZuX2ZzX25vZGVfcHJvcHxzdm5fZnNfcHJvcHNfY2hhbmdlZHxzdm5fZnNfcmV2aXNpb25fcHJvcHxzdm5fZnNfcmV2aXNpb25fcm9vdHwnICsNCiAgICAgICAgJ3N2bl9mc190eG5fcm9vdHxzdm5fZnNfeW91bmdlc3RfcmV2fHN2bl9pbXBvcnR8c3ZuX2xvZ3xzdm5fbHN8c3ZuX21rZGlyfHN2bl9yZXBvc19jcmVhdGV8c3ZuX3JlcG9zX2ZzfHN2bl9yZXBvc19mc19iZWdpbl90eG5fZm9yX2NvbW1pdHwnICsNCiAgICAgICAgJ3N2bl9yZXBvc19mc19jb21taXRfdHhufHN2bl9yZXBvc19ob3Rjb3B5fHN2bl9yZXBvc19vcGVufHN2bl9yZXBvc19yZWNvdmVyfHN2bl9yZXZlcnR8c3ZuX3N0YXR1c3xzdm5fdXBkYXRlfHN3Zl9hY3Rpb25nZXR1cmx8JyArDQogICAgICAgICdzd2ZfYWN0aW9uZ290b2ZyYW1lfHN3Zl9hY3Rpb25nb3RvbGFiZWx8c3dmX2FjdGlvbm5leHRmcmFtZXxzd2ZfYWN0aW9ucGxheXxzd2ZfYWN0aW9ucHJldmZyYW1lfHN3Zl9hY3Rpb25zZXR0YXJnZXR8c3dmX2FjdGlvbnN0b3B8JyArDQogICAgICAgICdzd2ZfYWN0aW9udG9nZ2xlcXVhbGl0eXxzd2ZfYWN0aW9ud2FpdGZvcmZyYW1lfHN3Zl9hZGRidXR0b25yZWNvcmR8c3dmX2FkZGNvbG9yfHN3Zl9jbG9zZWZpbGV8c3dmX2RlZmluZWJpdG1hcHxzd2ZfZGVmaW5lZm9udHwnICsNCiAgICAgICAgJ3N3Zl9kZWZpbmVsaW5lfHN3Zl9kZWZpbmVwb2x5fHN3Zl9kZWZpbmVyZWN0fHN3Zl9kZWZpbmV0ZXh0fHN3Zl9lbmRidXR0b258c3dmX2VuZGRvYWN0aW9ufHN3Zl9lbmRzaGFwZXxzd2ZfZW5kc3ltYm9sfHN3Zl9mb250c2l6ZXwnICsNCiAgICAgICAgJ3N3Zl9mb250c2xhbnR8c3dmX2ZvbnR0cmFja2luZ3xzd2ZfZ2V0Yml0bWFwaW5mb3xzd2ZfZ2V0Zm9udGluZm98c3dmX2dldGZyYW1lfHN3Zl9sYWJlbGZyYW1lfHN3Zl9sb29rYXR8c3dmX21vZGlmeW9iamVjdHxzd2ZfbXVsY29sb3J8JyArDQogICAgICAgICdzd2ZfbmV4dGlkfHN3Zl9vbmNvbmRpdGlvbnxzd2Zfb3BlbmZpbGV8c3dmX29ydGhvfHN3Zl9vcnRobzJ8c3dmX3BlcnNwZWN0aXZlfHN3Zl9wbGFjZW9iamVjdHxzd2ZfcG9sYXJ2aWV3fHN3Zl9wb3BtYXRyaXh8c3dmX3Bvc3JvdW5kfCcgKw0KICAgICAgICAnc3dmX3B1c2htYXRyaXh8c3dmX3JlbW92ZW9iamVjdHxzd2Zfcm90YXRlfHN3Zl9zY2FsZXxzd2Zfc2V0Zm9udHxzd2Zfc2V0ZnJhbWV8c3dmX3NoYXBlYXJjfHN3Zl9zaGFwZWN1cnZldG98c3dmX3NoYXBlY3VydmV0bzN8JyArDQogICAgICAgICdzd2Zfc2hhcGVmaWxsYml0bWFwY2xpcHxzd2Zfc2hhcGVmaWxsYml0bWFwdGlsZXxzd2Zfc2hhcGVmaWxsb2ZmfHN3Zl9zaGFwZWZpbGxzb2xpZHxzd2Zfc2hhcGVsaW5lc29saWR8c3dmX3NoYXBlbGluZXRvfHN3Zl9zaGFwZW1vdmV0b3wnICsNCiAgICAgICAgJ3N3Zl9zaG93ZnJhbWV8c3dmX3N0YXJ0YnV0dG9ufHN3Zl9zdGFydGRvYWN0aW9ufHN3Zl9zdGFydHNoYXBlfHN3Zl9zdGFydHN5bWJvbHxzd2ZfdGV4dHdpZHRofHN3Zl90cmFuc2xhdGV8c3dmX3ZpZXdwb3J0fHN3ZmFjdGlvbnwnICsNCiAgICAgICAgJ3N3ZmJpdG1hcHxzd2ZidXR0b258c3dmZGlzcGxheWl0ZW18c3dmZmlsbHxzd2Zmb250fHN3ZmZvbnRjaGFyfHN3ZmdyYWRpZW50fHN3Zm1vcnBofHN3Zm1vdmllfHN3ZnByZWJ1aWx0Y2xpcHxzd2ZzaGFwZXxzd2Zzb3VuZHwnICsNCiAgICAgICAgJ3N3ZnNvdW5kaW5zdGFuY2V8c3dmc3ByaXRlfHN3ZnRleHR8c3dmdGV4dGZpZWxkfHN3ZnZpZGVvc3RyZWFtfHN3aXNoX2NvbnN0cnVjdHxzd2lzaF9nZXRtZXRhbGlzdHxzd2lzaF9nZXRwcm9wZXJ0eWxpc3R8c3dpc2hfcHJlcGFyZXwnICsNCiAgICAgICAgJ3N3aXNoX3F1ZXJ5fHN3aXNocmVzdWx0X2dldG1ldGFsaXN0fHN3aXNocmVzdWx0X3N0ZW18c3dpc2hyZXN1bHRzX2dldHBhcnNlZHdvcmRzfHN3aXNocmVzdWx0c19nZXRyZW1vdmVkc3RvcHdvcmRzfHN3aXNocmVzdWx0c19uZXh0cmVzdWx0fCcgKw0KICAgICAgICAnc3dpc2hyZXN1bHRzX3NlZWtyZXN1bHR8c3dpc2hzZWFyY2hfZXhlY3V0ZXxzd2lzaHNlYXJjaF9yZXNldGxpbWl0fHN3aXNoc2VhcmNoX3NldGxpbWl0fHN3aXNoc2VhcmNoX3NldHBocmFzZWRlbGltaXRlcnwnICsNCiAgICAgICAgJ3N3aXNoc2VhcmNoX3NldHNvcnR8c3dpc2hzZWFyY2hfc2V0c3RydWN0dXJlfHN5YmFzZV9hZmZlY3RlZF9yb3dzfHN5YmFzZV9jbG9zZXxzeWJhc2VfY29ubmVjdHxzeWJhc2VfZGF0YV9zZWVrfCcgKw0KICAgICAgICAnc3liYXNlX2RlYWRsb2NrX3JldHJ5X2NvdW50fHN5YmFzZV9mZXRjaF9hcnJheXxzeWJhc2VfZmV0Y2hfYXNzb2N8c3liYXNlX2ZldGNoX2ZpZWxkfHN5YmFzZV9mZXRjaF9vYmplY3R8c3liYXNlX2ZldGNoX3Jvd3wnICsNCiAgICAgICAgJ3N5YmFzZV9maWVsZF9zZWVrfHN5YmFzZV9mcmVlX3Jlc3VsdHxzeWJhc2VfZ2V0X2xhc3RfbWVzc2FnZXxzeWJhc2VfbWluX2NsaWVudF9zZXZlcml0eXxzeWJhc2VfbWluX2Vycm9yX3NldmVyaXR5fCcgKw0KICAgICAgICAnc3liYXNlX21pbl9tZXNzYWdlX3NldmVyaXR5fHN5YmFzZV9taW5fc2VydmVyX3NldmVyaXR5fHN5YmFzZV9udW1fZmllbGRzfHN5YmFzZV9udW1fcm93c3xzeWJhc2VfcGNvbm5lY3R8c3liYXNlX3F1ZXJ5fHN5YmFzZV9yZXN1bHR8JyArDQogICAgICAgICdzeWJhc2Vfc2VsZWN0X2RifHN5YmFzZV9zZXRfbWVzc2FnZV9oYW5kbGVyfHN5YmFzZV91bmJ1ZmZlcmVkX3F1ZXJ5fHN5bWxpbmt8c3lzX2dldF90ZW1wX2RpcnxzeXNfZ2V0bG9hZGF2Z3xzeXNsb2d8c3lzdGVtfHRhZ3x0YW58dGFuaHwnICsNCiAgICAgICAgJ3RjcHdyYXBfY2hlY2t8dGVtcG5hbXx0ZXh0ZG9tYWlufHRpZHl8dGlkeV9hY2Nlc3NfY291bnR8dGlkeV9jb25maWdfY291bnR8dGlkeV9kaWFnbm9zZXx0aWR5X2Vycm9yX2NvdW50fHRpZHlfZ2V0X2Vycm9yX2J1ZmZlcnwnICsNCiAgICAgICAgJ3RpZHlfZ2V0X291dHB1dHx0aWR5X2xvYWRfY29uZmlnfHRpZHlfcmVzZXRfY29uZmlnfHRpZHlfc2F2ZV9jb25maWd8dGlkeV9zZXRfZW5jb2Rpbmd8dGlkeV9zZXRvcHR8dGlkeV93YXJuaW5nX2NvdW50fHRpZHlub2RlfHRpbWV8JyArDQogICAgICAgICd0aW1lX25hbm9zbGVlcHx0aW1lX3NsZWVwX3VudGlsfHRpbWV6b25lX2FiYnJldmlhdGlvbnNfbGlzdHx0aW1lem9uZV9pZGVudGlmaWVyc19saXN0fHRpbWV6b25lX2xvY2F0aW9uX2dldHx0aW1lem9uZV9uYW1lX2Zyb21fYWJicnwnICsNCiAgICAgICAgJ3RpbWV6b25lX25hbWVfZ2V0fHRpbWV6b25lX29mZnNldF9nZXR8dGltZXpvbmVfb3Blbnx0aW1lem9uZV90cmFuc2l0aW9uc19nZXR8dGltZXpvbmVfdmVyc2lvbl9nZXR8dG1wZmlsZXx0b2tlbl9nZXRfYWxsfHRva2VuX25hbWV8JyArDQogICAgICAgICd0b2t5b3R5cmFudHx0b2t5b3R5cmFudHF1ZXJ5fHRva3lvdHlyYW50dGFibGV8dG9zdHJpbmd8dG9zdHJpbmd8dG91Y2h8dHJhbnNsaXRlcmF0b3J8dHJhdmVyc2FibGV8dHJpZ2dlcl9lcnJvcnx0cmltfHVhc29ydHx1Y2ZpcnN0fCcgKw0KICAgICAgICAndWN3b3Jkc3x1ZG1fYWRkX3NlYXJjaF9saW1pdHx1ZG1fYWxsb2NfYWdlbnR8dWRtX2FsbG9jX2FnZW50X2FycmF5fHVkbV9hcGlfdmVyc2lvbnx1ZG1fY2F0X2xpc3R8dWRtX2NhdF9wYXRofHVkbV9jaGVja19jaGFyc2V0fCcgKw0KICAgICAgICAndWRtX2NoZWNrX3N0b3JlZHx1ZG1fY2xlYXJfc2VhcmNoX2xpbWl0c3x1ZG1fY2xvc2Vfc3RvcmVkfHVkbV9jcmMzMnx1ZG1fZXJybm98dWRtX2Vycm9yfHVkbV9maW5kfHVkbV9mcmVlX2FnZW50fHVkbV9mcmVlX2lzcGVsbF9kYXRhfCcgKw0KICAgICAgICAndWRtX2ZyZWVfcmVzfHVkbV9nZXRfZG9jX2NvdW50fHVkbV9nZXRfcmVzX2ZpZWxkfHVkbV9nZXRfcmVzX3BhcmFtfHVkbV9oYXNoMzJ8dWRtX2xvYWRfaXNwZWxsX2RhdGF8dWRtX29wZW5fc3RvcmVkfHVkbV9zZXRfYWdlbnRfcGFyYW18JyArDQogICAgICAgICd1a3NvcnR8dW1hc2t8dW5kZXJmbG93ZXhjZXB0aW9ufHVuZXhwZWN0ZWR2YWx1ZWV4Y2VwdGlvbnx1bmlxaWR8dW5peHRvamR8dW5saW5rfHVucGFja3x1bnJlZ2lzdGVyX3RpY2tfZnVuY3Rpb258dW5zZXJpYWxpemV8dW5zZXR8JyArDQogICAgICAgICd1cmxkZWNvZGV8dXJsZW5jb2RlfHVzZV9zb2FwX2Vycm9yX2hhbmRsZXJ8dXNlcl9lcnJvcnx1c2xlZXB8dXNvcnR8dXRmOF9kZWNvZGV8dXRmOF9lbmNvZGV8djhqc3x2OGpzZXhjZXB0aW9ufHZhcl9kdW1wfHZhcl9leHBvcnR8dmFyaWFudHwnICsNCiAgICAgICAgJ3ZhcmlhbnRfYWJzfHZhcmlhbnRfYWRkfHZhcmlhbnRfYW5kfHZhcmlhbnRfY2FzdHx2YXJpYW50X2NhdHx2YXJpYW50X2NtcHx2YXJpYW50X2RhdGVfZnJvbV90aW1lc3RhbXB8dmFyaWFudF9kYXRlX3RvX3RpbWVzdGFtcHwnICsNCiAgICAgICAgJ3ZhcmlhbnRfZGl2fHZhcmlhbnRfZXF2fHZhcmlhbnRfZml4fHZhcmlhbnRfZ2V0X3R5cGV8dmFyaWFudF9pZGl2fHZhcmlhbnRfaW1wfHZhcmlhbnRfaW50fHZhcmlhbnRfbW9kfHZhcmlhbnRfbXVsfHZhcmlhbnRfbmVnfHZhcmlhbnRfbm90fCcgKw0KICAgICAgICAndmFyaWFudF9vcnx2YXJpYW50X3Bvd3x2YXJpYW50X3JvdW5kfHZhcmlhbnRfc2V0fHZhcmlhbnRfc2V0X3R5cGV8dmFyaWFudF9zdWJ8dmFyaWFudF94b3J8dmVyc2lvbl9jb21wYXJlfHZmcHJpbnRmfHZpcnR1YWx8JyArDQogICAgICAgICd2cG9wbWFpbF9hZGRfYWxpYXNfZG9tYWlufHZwb3BtYWlsX2FkZF9hbGlhc19kb21haW5fZXh8dnBvcG1haWxfYWRkX2RvbWFpbnx2cG9wbWFpbF9hZGRfZG9tYWluX2V4fHZwb3BtYWlsX2FkZF91c2VyfHZwb3BtYWlsX2FsaWFzX2FkZHwnICsNCiAgICAgICAgJ3Zwb3BtYWlsX2FsaWFzX2RlbHx2cG9wbWFpbF9hbGlhc19kZWxfZG9tYWlufHZwb3BtYWlsX2FsaWFzX2dldHx2cG9wbWFpbF9hbGlhc19nZXRfYWxsfHZwb3BtYWlsX2F1dGhfdXNlcnx2cG9wbWFpbF9kZWxfZG9tYWlufCcgKw0KICAgICAgICAndnBvcG1haWxfZGVsX2RvbWFpbl9leHx2cG9wbWFpbF9kZWxfdXNlcnx2cG9wbWFpbF9lcnJvcnx2cG9wbWFpbF9wYXNzd2R8dnBvcG1haWxfc2V0X3VzZXJfcXVvdGF8dnByaW50Znx2c3ByaW50Znx3MzJhcGlfZGVmdHlwZXwnICsNCiAgICAgICAgJ3czMmFwaV9pbml0X2R0eXBlfHczMmFwaV9pbnZva2VfZnVuY3Rpb258dzMyYXBpX3JlZ2lzdGVyX2Z1bmN0aW9ufHczMmFwaV9zZXRfY2FsbF9tZXRob2R8d2RkeF9hZGRfdmFyc3x3ZGR4X2Rlc2VyaWFsaXplfHdkZHhfcGFja2V0X2VuZHwnICsNCiAgICAgICAgJ3dkZHhfcGFja2V0X3N0YXJ0fHdkZHhfc2VyaWFsaXplX3ZhbHVlfHdkZHhfc2VyaWFsaXplX3ZhcnN8d2luMzJfY29udGludWVfc2VydmljZXx3aW4zMl9jcmVhdGVfc2VydmljZXx3aW4zMl9kZWxldGVfc2VydmljZXwnICsNCiAgICAgICAgJ3dpbjMyX2dldF9sYXN0X2NvbnRyb2xfbWVzc2FnZXx3aW4zMl9wYXVzZV9zZXJ2aWNlfHdpbjMyX3BzX2xpc3RfcHJvY3N8d2luMzJfcHNfc3RhdF9tZW18d2luMzJfcHNfc3RhdF9wcm9jfHdpbjMyX3F1ZXJ5X3NlcnZpY2Vfc3RhdHVzfCcgKw0KICAgICAgICAnd2luMzJfc2V0X3NlcnZpY2Vfc3RhdHVzfHdpbjMyX3N0YXJ0X3NlcnZpY2V8d2luMzJfc3RhcnRfc2VydmljZV9jdHJsX2Rpc3BhdGNoZXJ8d2luMzJfc3RvcF9zZXJ2aWNlfHdpbmNhY2hlX2ZjYWNoZV9maWxlaW5mb3wnICsNCiAgICAgICAgJ3dpbmNhY2hlX2ZjYWNoZV9tZW1pbmZvfHdpbmNhY2hlX2xvY2t8d2luY2FjaGVfb2NhY2hlX2ZpbGVpbmZvfHdpbmNhY2hlX29jYWNoZV9tZW1pbmZvfHdpbmNhY2hlX3JlZnJlc2hfaWZfY2hhbmdlZHwnICsNCiAgICAgICAgJ3dpbmNhY2hlX3JwbGlzdF9maWxlaW5mb3x3aW5jYWNoZV9ycGxpc3RfbWVtaW5mb3x3aW5jYWNoZV9zY2FjaGVfaW5mb3x3aW5jYWNoZV9zY2FjaGVfbWVtaW5mb3x3aW5jYWNoZV91Y2FjaGVfYWRkfHdpbmNhY2hlX3VjYWNoZV9jYXN8JyArDQogICAgICAgICd3aW5jYWNoZV91Y2FjaGVfY2xlYXJ8d2luY2FjaGVfdWNhY2hlX2RlY3x3aW5jYWNoZV91Y2FjaGVfZGVsZXRlfHdpbmNhY2hlX3VjYWNoZV9leGlzdHN8d2luY2FjaGVfdWNhY2hlX2dldHx3aW5jYWNoZV91Y2FjaGVfaW5jfCcgKw0KICAgICAgICAnd2luY2FjaGVfdWNhY2hlX2luZm98d2luY2FjaGVfdWNhY2hlX21lbWluZm98d2luY2FjaGVfdWNhY2hlX3NldHx3aW5jYWNoZV91bmxvY2t8d29yZHdyYXB8eGF0dHJfZ2V0fHhhdHRyX2xpc3R8eGF0dHJfcmVtb3ZlfHhhdHRyX3NldHwnICsNCiAgICAgICAgJ3hhdHRyX3N1cHBvcnRlZHx4ZGlmZl9maWxlX2JkaWZmfHhkaWZmX2ZpbGVfYmRpZmZfc2l6ZXx4ZGlmZl9maWxlX2JwYXRjaHx4ZGlmZl9maWxlX2RpZmZ8eGRpZmZfZmlsZV9kaWZmX2JpbmFyeXx4ZGlmZl9maWxlX21lcmdlM3wnICsNCiAgICAgICAgJ3hkaWZmX2ZpbGVfcGF0Y2h8eGRpZmZfZmlsZV9wYXRjaF9iaW5hcnl8eGRpZmZfZmlsZV9yYWJkaWZmfHhkaWZmX3N0cmluZ19iZGlmZnx4ZGlmZl9zdHJpbmdfYmRpZmZfc2l6ZXx4ZGlmZl9zdHJpbmdfYnBhdGNofCcgKw0KICAgICAgICAneGRpZmZfc3RyaW5nX2RpZmZ8eGRpZmZfc3RyaW5nX2RpZmZfYmluYXJ5fHhkaWZmX3N0cmluZ19tZXJnZTN8eGRpZmZfc3RyaW5nX3BhdGNofHhkaWZmX3N0cmluZ19wYXRjaF9iaW5hcnl8eGRpZmZfc3RyaW5nX3JhYmRpZmZ8JyArDQogICAgICAgICd4aHByb2ZfZGlzYWJsZXx4aHByb2ZfZW5hYmxlfHhocHJvZl9zYW1wbGVfZGlzYWJsZXx4aHByb2Zfc2FtcGxlX2VuYWJsZXx4bWxfZXJyb3Jfc3RyaW5nfHhtbF9nZXRfY3VycmVudF9ieXRlX2luZGV4fCcgKw0KICAgICAgICAneG1sX2dldF9jdXJyZW50X2NvbHVtbl9udW1iZXJ8eG1sX2dldF9jdXJyZW50X2xpbmVfbnVtYmVyfHhtbF9nZXRfZXJyb3JfY29kZXx4bWxfcGFyc2V8eG1sX3BhcnNlX2ludG9fc3RydWN0fHhtbF9wYXJzZXJfY3JlYXRlfCcgKw0KICAgICAgICAneG1sX3BhcnNlcl9jcmVhdGVfbnN8eG1sX3BhcnNlcl9mcmVlfHhtbF9wYXJzZXJfZ2V0X29wdGlvbnx4bWxfcGFyc2VyX3NldF9vcHRpb258eG1sX3NldF9jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyfHhtbF9zZXRfZGVmYXVsdF9oYW5kbGVyfCcgKw0KICAgICAgICAneG1sX3NldF9lbGVtZW50X2hhbmRsZXJ8eG1sX3NldF9lbmRfbmFtZXNwYWNlX2RlY2xfaGFuZGxlcnx4bWxfc2V0X2V4dGVybmFsX2VudGl0eV9yZWZfaGFuZGxlcnx4bWxfc2V0X25vdGF0aW9uX2RlY2xfaGFuZGxlcnwnICsNCiAgICAgICAgJ3htbF9zZXRfb2JqZWN0fHhtbF9zZXRfcHJvY2Vzc2luZ19pbnN0cnVjdGlvbl9oYW5kbGVyfHhtbF9zZXRfc3RhcnRfbmFtZXNwYWNlX2RlY2xfaGFuZGxlcnx4bWxfc2V0X3VucGFyc2VkX2VudGl0eV9kZWNsX2hhbmRsZXJ8eG1scmVhZGVyfCcgKw0KICAgICAgICAneG1scnBjX2RlY29kZXx4bWxycGNfZGVjb2RlX3JlcXVlc3R8eG1scnBjX2VuY29kZXx4bWxycGNfZW5jb2RlX3JlcXVlc3R8eG1scnBjX2dldF90eXBlfHhtbHJwY19pc19mYXVsdHx4bWxycGNfcGFyc2VfbWV0aG9kX2Rlc2NyaXB0aW9uc3wnICsNCiAgICAgICAgJ3htbHJwY19zZXJ2ZXJfYWRkX2ludHJvc3BlY3Rpb25fZGF0YXx4bWxycGNfc2VydmVyX2NhbGxfbWV0aG9kfHhtbHJwY19zZXJ2ZXJfY3JlYXRlfHhtbHJwY19zZXJ2ZXJfZGVzdHJveXwnICsNCiAgICAgICAgJ3htbHJwY19zZXJ2ZXJfcmVnaXN0ZXJfaW50cm9zcGVjdGlvbl9jYWxsYmFja3x4bWxycGNfc2VydmVyX3JlZ2lzdGVyX21ldGhvZHx4bWxycGNfc2V0X3R5cGV8eG1sd3JpdGVyX2VuZF9hdHRyaWJ1dGV8eG1sd3JpdGVyX2VuZF9jZGF0YXwnICsNCiAgICAgICAgJ3htbHdyaXRlcl9lbmRfY29tbWVudHx4bWx3cml0ZXJfZW5kX2RvY3VtZW50fHhtbHdyaXRlcl9lbmRfZHRkfHhtbHdyaXRlcl9lbmRfZHRkX2F0dGxpc3R8eG1sd3JpdGVyX2VuZF9kdGRfZWxlbWVudHwnICsNCiAgICAgICAgJ3htbHdyaXRlcl9lbmRfZHRkX2VudGl0eXx4bWx3cml0ZXJfZW5kX2VsZW1lbnR8eG1sd3JpdGVyX2VuZF9waXx4bWx3cml0ZXJfZmx1c2h8eG1sd3JpdGVyX2Z1bGxfZW5kX2VsZW1lbnR8eG1sd3JpdGVyX29wZW5fbWVtb3J5fCcgKw0KICAgICAgICAneG1sd3JpdGVyX29wZW5fdXJpfHhtbHdyaXRlcl9vdXRwdXRfbWVtb3J5fHhtbHdyaXRlcl9zZXRfaW5kZW50fHhtbHdyaXRlcl9zZXRfaW5kZW50X3N0cmluZ3x4bWx3cml0ZXJfc3RhcnRfYXR0cmlidXRlfCcgKw0KICAgICAgICAneG1sd3JpdGVyX3N0YXJ0X2F0dHJpYnV0ZV9uc3x4bWx3cml0ZXJfc3RhcnRfY2RhdGF8eG1sd3JpdGVyX3N0YXJ0X2NvbW1lbnR8eG1sd3JpdGVyX3N0YXJ0X2RvY3VtZW50fHhtbHdyaXRlcl9zdGFydF9kdGR8JyArDQogICAgICAgICd4bWx3cml0ZXJfc3RhcnRfZHRkX2F0dGxpc3R8eG1sd3JpdGVyX3N0YXJ0X2R0ZF9lbGVtZW50fHhtbHdyaXRlcl9zdGFydF9kdGRfZW50aXR5fHhtbHdyaXRlcl9zdGFydF9lbGVtZW50fHhtbHdyaXRlcl9zdGFydF9lbGVtZW50X25zfCcgKw0KICAgICAgICAneG1sd3JpdGVyX3N0YXJ0X3BpfHhtbHdyaXRlcl90ZXh0fHhtbHdyaXRlcl93cml0ZV9hdHRyaWJ1dGV8eG1sd3JpdGVyX3dyaXRlX2F0dHJpYnV0ZV9uc3x4bWx3cml0ZXJfd3JpdGVfY2RhdGF8eG1sd3JpdGVyX3dyaXRlX2NvbW1lbnR8JyArDQogICAgICAgICd4bWx3cml0ZXJfd3JpdGVfZHRkfHhtbHdyaXRlcl93cml0ZV9kdGRfYXR0bGlzdHx4bWx3cml0ZXJfd3JpdGVfZHRkX2VsZW1lbnR8eG1sd3JpdGVyX3dyaXRlX2R0ZF9lbnRpdHl8eG1sd3JpdGVyX3dyaXRlX2VsZW1lbnR8JyArDQogICAgICAgICd4bWx3cml0ZXJfd3JpdGVfZWxlbWVudF9uc3x4bWx3cml0ZXJfd3JpdGVfcGl8eG1sd3JpdGVyX3dyaXRlX3Jhd3x4cGF0aF9ldmFsfHhwYXRoX2V2YWxfZXhwcmVzc2lvbnx4cGF0aF9uZXdfY29udGV4dHx4cGF0aF9yZWdpc3Rlcl9uc3wnICsNCiAgICAgICAgJ3hwYXRoX3JlZ2lzdGVyX25zX2F1dG98eHB0cl9ldmFsfHhwdHJfbmV3X2NvbnRleHR8eHNsdF9iYWNrZW5kX2luZm98eHNsdF9iYWNrZW5kX25hbWV8eHNsdF9iYWNrZW5kX3ZlcnNpb258eHNsdF9jcmVhdGV8eHNsdF9lcnJub3wnICsNCiAgICAgICAgJ3hzbHRfZXJyb3J8eHNsdF9mcmVlfHhzbHRfZ2V0b3B0fHhzbHRfcHJvY2Vzc3x4c2x0X3NldF9iYXNlfHhzbHRfc2V0X2VuY29kaW5nfHhzbHRfc2V0X2Vycm9yX2hhbmRsZXJ8eHNsdF9zZXRfbG9nfHhzbHRfc2V0X29iamVjdHwnICsNCiAgICAgICAgJ3hzbHRfc2V0X3NheF9oYW5kbGVyfHhzbHRfc2V0X3NheF9oYW5kbGVyc3x4c2x0X3NldF9zY2hlbWVfaGFuZGxlcnx4c2x0X3NldF9zY2hlbWVfaGFuZGxlcnN8eHNsdF9zZXRvcHR8eHNsdHByb2Nlc3Nvcnx5YW1sX2VtaXR8JyArDQogICAgICAgICd5YW1sX2VtaXRfZmlsZXx5YW1sX3BhcnNlfHlhbWxfcGFyc2VfZmlsZXx5YW1sX3BhcnNlX3VybHx5YXpfYWRkaW5mb3x5YXpfY2NsX2NvbmZ8eWF6X2NjbF9wYXJzZXx5YXpfY2xvc2V8eWF6X2Nvbm5lY3R8eWF6X2RhdGFiYXNlfCcgKw0KICAgICAgICAneWF6X2VsZW1lbnR8eWF6X2Vycm5vfHlhel9lcnJvcnx5YXpfZXN8eWF6X2VzX3Jlc3VsdHx5YXpfZ2V0X29wdGlvbnx5YXpfaGl0c3x5YXpfaXRlbW9yZGVyfHlhel9wcmVzZW50fHlhel9yYW5nZXx5YXpfcmVjb3JkfHlhel9zY2FufCcgKw0KICAgICAgICAneWF6X3NjYW5fcmVzdWx0fHlhel9zY2hlbWF8eWF6X3NlYXJjaHx5YXpfc2V0X29wdGlvbnx5YXpfc29ydHx5YXpfc3ludGF4fHlhel93YWl0fHlwX2FsbHx5cF9jYXR8eXBfZXJyX3N0cmluZ3x5cF9lcnJub3x5cF9maXJzdHwnICsNCiAgICAgICAgJ3lwX2dldF9kZWZhdWx0X2RvbWFpbnx5cF9tYXN0ZXJ8eXBfbWF0Y2h8eXBfbmV4dHx5cF9vcmRlcnx6ZW5kX2xvZ29fZ3VpZHx6ZW5kX3RocmVhZF9pZHx6ZW5kX3ZlcnNpb258emlwX2Nsb3NlfHppcF9lbnRyeV9jbG9zZXwnICsNCiAgICAgICAgJ3ppcF9lbnRyeV9jb21wcmVzc2Vkc2l6ZXx6aXBfZW50cnlfY29tcHJlc3Npb25tZXRob2R8emlwX2VudHJ5X2ZpbGVzaXplfHppcF9lbnRyeV9uYW1lfHppcF9lbnRyeV9vcGVufHppcF9lbnRyeV9yZWFkfHppcF9vcGVufHppcF9yZWFkfCcgKw0KICAgICAgICAnemlwYXJjaGl2ZXx6aXBhcmNoaXZlX2FkZGVtcHR5ZGlyfHppcGFyY2hpdmVfYWRkZmlsZXx6aXBhcmNoaXZlX2FkZGZyb21zdHJpbmd8emlwYXJjaGl2ZV9jbG9zZXx6aXBhcmNoaXZlX2RlbGV0ZWluZGV4fCcgKw0KICAgICAgICAnemlwYXJjaGl2ZV9kZWxldGVuYW1lfHppcGFyY2hpdmVfZXh0cmFjdHRvfHppcGFyY2hpdmVfZ2V0YXJjaGl2ZWNvbW1lbnR8emlwYXJjaGl2ZV9nZXRjb21tZW50aW5kZXh8emlwYXJjaGl2ZV9nZXRjb21tZW50bmFtZXwnICsNCiAgICAgICAgJ3ppcGFyY2hpdmVfZ2V0ZnJvbWluZGV4fHppcGFyY2hpdmVfZ2V0ZnJvbW5hbWV8emlwYXJjaGl2ZV9nZXRuYW1laW5kZXh8emlwYXJjaGl2ZV9nZXRzdGF0dXNzdHJpbmd8emlwYXJjaGl2ZV9nZXRzdHJlYW18JyArDQogICAgICAgICd6aXBhcmNoaXZlX2xvY2F0ZW5hbWV8emlwYXJjaGl2ZV9vcGVufHppcGFyY2hpdmVfcmVuYW1laW5kZXh8emlwYXJjaGl2ZV9yZW5hbWVuYW1lfHppcGFyY2hpdmVfc2V0Q29tbWVudE5hbWV8emlwYXJjaGl2ZV9zZXRhcmNoaXZlY29tbWVudHwnICsNCiAgICAgICAgJ3ppcGFyY2hpdmVfc2V0Y29tbWVudGluZGV4fHppcGFyY2hpdmVfc3RhdGluZGV4fHppcGFyY2hpdmVfc3RhdG5hbWV8emlwYXJjaGl2ZV91bmNoYW5nZWFsbHx6aXBhcmNoaXZlX3VuY2hhbmdlYXJjaGl2ZXwnICsNCiAgICAgICAgJ3ppcGFyY2hpdmVfdW5jaGFuZ2VpbmRleHx6aXBhcmNoaXZlX3VuY2hhbmdlbmFtZXx6bGliX2dldF9jb2RpbmdfdHlwZScpLnNwbGl0KCd8JykNCiAgICApOw0KDQogICAgLy8gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLmtleXdvcmRzLnBocA0KICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCdhYnN0cmFjdHxhbmR8YXJyYXl8YXN8YnJlYWt8Y2FzZXxjYXRjaHxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZG98ZWxzZXxlbHNlaWZ8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnwnICsNCiAgICAgICAgJ2VuZHN3aXRjaHxlbmR3aGlsZXxleHRlbmRzfGZpbmFsfGZvcnxmb3JlYWNofGZ1bmN0aW9ufGdsb2JhbHxnb3RvfGlmfGltcGxlbWVudHN8aW50ZXJmYWNlfGluc3RhbmNlb2Z8bmFtZXNwYWNlfG5ld3xvcnxwcml2YXRlfHByb3RlY3RlZHwnICsNCiAgICAgICAgJ3B1YmxpY3xzdGF0aWN8c3dpdGNofHRocm93fHRyeXx1c2V8dmFyfHdoaWxlfHhvcicpLnNwbGl0KCd8JykNCiAgICApOw0KDQogICAgLy8gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLmtleXdvcmRzLnBocA0KICAgIHZhciBsYW5ndWFnZUNvbnN0cnVjdHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgnZGllfGVjaG98ZW1wdHl8ZXhpdHxldmFsfGluY2x1ZGV8aW5jbHVkZV9vbmNlfGlzc2V0fGxpc3R8cmVxdWlyZXxyZXF1aXJlX29uY2V8cmV0dXJufHByaW50fHVuc2V0Jykuc3BsaXQoJ3wnKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbHRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCd0cnVlfGZhbHNlfG51bGx8X19DTEFTU19ffF9fRElSX198X19GSUxFX198X19MSU5FX198X19NRVRIT0RfX3xfX0ZVTkNUSU9OX198X19OQU1FU1BBQ0VfXycpLnNwbGl0KCd8JykNCiAgICApOw0KDQogICAgdmFyIGJ1aWx0aW5WYXJpYWJsZXMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgnJEdMT0JBTFN8JF9TRVJWRVJ8JF9HRVR8JF9QT1NUfCRfRklMRVN8JF9SRVFVRVNUfCRfU0VTU0lPTnwkX0VOVnwkX0NPT0tJRXwkcGhwX2Vycm9ybXNnfCRIVFRQX1JBV19QT1NUX0RBVEF8JyArDQogICAgICAgICckaHR0cF9yZXNwb25zZV9oZWFkZXJ8JGFyZ2N8JGFyZ3YnKS5zcGxpdCgnfCcpDQogICAgKTsNCg0KICAgIC8vIERpc2NvdmVyeSBkb25lIGJ5IGRvd25sb2FkaW5nICdNYW55IEhUTUwgZmlsZXMnIGZyb206ICBodHRwOi8vcGhwLm5ldC9kb3dubG9hZC1kb2NzLnBocA0KICAgIC8vIFRoZW4gc2VhcmNoIGZvciBmaWxlcyBjb250YWluaW5nICdkZXByZWNhdGVkJyAoY2FzZS1pbnNlbnNpdGl2ZSkgYW5kIGxvb2sgYXQgZWFjaCBmaWxlIHRoYXQgdHVybnMgdXAuDQogICAgdmFyIGJ1aWx0aW5GdW5jdGlvbnNEZXByZWNhdGVkID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoJ2tleV9leGlzdHN8Y2Fpcm9fbWF0cml4X2NyZWF0ZV9zY2FsZXxjYWlyb19tYXRyaXhfY3JlYXRlX3RyYW5zbGF0ZXxjYWxsX3VzZXJfbWV0aG9kfGNhbGxfdXNlcl9tZXRob2RfYXJyYXl8Y29tX2FkZHJlZnxjb21fZ2V0fCcgKw0KICAgICAgICAnY29tX2ludm9rZXxjb21faXNlbnVtfGNvbV9sb2FkfGNvbV9yZWxlYXNlfGNvbV9zZXR8Y29ubmVjdGlvbl90aW1lb3V0fGN1YnJpZF9sb2FkX2Zyb21fZ2xvfGN1YnJpZF9uZXdfZ2xvfGN1YnJpZF9zYXZlX3RvX2dsb3wnICsNCiAgICAgICAgJ2N1YnJpZF9zZW5kX2dsb3xkZWZpbmVfc3lzbG9nX3ZhcmlhYmxlc3xkbHxlcmVnfGVyZWdfcmVwbGFjZXxlcmVnaXxlcmVnaV9yZXBsYWNlfGh3X2RvY3VtZW50YXR0cmlidXRlc3xod19kb2N1bWVudGJvZHl0YWd8JyArDQogICAgICAgICdod19kb2N1bWVudHNpemV8aHdfb3V0cHV0ZG9jdW1lbnR8aW1hZ2VkYXNoZWRsaW5lfG1heGRiX2JpbmRfcGFyYW18bWF4ZGJfYmluZF9yZXN1bHR8bWF4ZGJfY2xpZW50X2VuY29kaW5nfG1heGRiX2Nsb3NlX2xvbmdfZGF0YXwnICsNCiAgICAgICAgJ21heGRiX2V4ZWN1dGV8bWF4ZGJfZmV0Y2h8bWF4ZGJfZ2V0X21ldGFkYXRhfG1heGRiX3BhcmFtX2NvdW50fG1heGRiX3NlbmRfbG9uZ19kYXRhfG1jcnlwdF9lY2J8bWNyeXB0X2dlbmVyaWNfZW5kfG1pbWVfY29udGVudF90eXBlfCcgKw0KICAgICAgICAnbXlzcWxfY3JlYXRlZGJ8bXlzcWxfZGJuYW1lfG15c3FsX2RiX3F1ZXJ5fG15c3FsX2Ryb3BfZGJ8bXlzcWxfZHJvcGRifG15c3FsX2VzY2FwZV9zdHJpbmd8bXlzcWxfZmllbGRmbGFnc3xteXNxbF9maWVsZGZsYWdzfCcgKw0KICAgICAgICAnbXlzcWxfZmllbGRuYW1lfG15c3FsX2ZpZWxkdGFibGV8bXlzcWxfZmllbGR0eXBlfG15c3FsX2ZyZWVyZXN1bHR8bXlzcWxfbGlzdGRic3xteXNxbF9saXN0X2ZpZWxkc3xteXNxbF9saXN0ZmllbGRzfG15c3FsX2xpc3RfdGFibGVzfCcgKw0KICAgICAgICAnbXlzcWxfbGlzdHRhYmxlc3xteXNxbF9udW1maWVsZHN8bXlzcWxfbnVtcm93c3xteXNxbF9zZWxlY3RkYnxteXNxbF90YWJsZW5hbWV8bXlzcWxpX2JpbmRfcGFyYW18bXlzcWxpX2JpbmRfcmVzdWx0fCcgKw0KICAgICAgICAnbXlzcWxpX2Rpc2FibGVfcmVhZHNfZnJvbV9tYXN0ZXJ8bXlzcWxpX2Rpc2FibGVfcnBsX3BhcnNlfG15c3FsaV9lbmFibGVfcmVhZHNfZnJvbV9tYXN0ZXJ8bXlzcWxpX2VuYWJsZV9ycGxfcGFyc2V8bXlzcWxpX2V4ZWN1dGV8JyArDQogICAgICAgICdteXNxbGlfZmV0Y2h8bXlzcWxpX2dldF9tZXRhZGF0YXxteXNxbGlfbWFzdGVyX3F1ZXJ5fG15c3FsaV9wYXJhbV9jb3VudHxteXNxbGlfcnBsX3BhcnNlX2VuYWJsZWR8bXlzcWxpX3JwbF9wcm9iZXxteXNxbGlfcnBsX3F1ZXJ5X3R5cGV8JyArDQogICAgICAgICdteXNxbGlfc2VuZF9sb25nX2RhdGF8bXlzcWxpX3NlbmRfcXVlcnl8bXlzcWxpX3NsYXZlX3F1ZXJ5fG9jaWJpbmRieW5hbWV8b2NpY2FuY2VsfG9jaWNsb3NlbG9ifG9jaWNvbGxhcHBlbmR8b2NpY29sbGFzc2lnbnwnICsNCiAgICAgICAgJ29jaWNvbGxhc3NpZ25lbGVtfG9jaWNvbGxnZXRlbGVtfG9jaWNvbGxtYXh8b2NpY29sbHNpemV8b2NpY29sbHRyaW18b2NpY29sdW1uaXNudWxsfG9jaWNvbHVtbm5hbWV8b2NpY29sdW1ucHJlY2lzaW9ufG9jaWNvbHVtbnNjYWxlfCcgKw0KICAgICAgICAnb2NpY29sdW1uc2l6ZXxvY2ljb2x1bW50eXBlfG9jaWNvbHVtbnR5cGVyYXd8b2NpY29tbWl0fG9jaWRlZmluZWJ5bmFtZXxvY2llcnJvcnxvY2lleGVjdXRlfG9jaWZldGNofG9jaWZldGNoaW50b3xvY2lmZXRjaHN0YXRlbWVudHwnICsNCiAgICAgICAgJ29jaWZyZWVjb2xsZWN0aW9ufG9jaWZyZWVjdXJzb3J8b2NpZnJlZWRlc2N8b2NpZnJlZXN0YXRlbWVudHxvY2lpbnRlcm5hbGRlYnVnfG9jaWxvYWRsb2J8b2NpbG9nb2ZmfG9jaWxvZ29ufG9jaW5ld2NvbGxlY3Rpb258JyArDQogICAgICAgICdvY2luZXdjdXJzb3J8b2NpbmV3ZGVzY3JpcHRvcnxvY2lubG9nb258b2NpbnVtY29sc3xvY2lwYXJzZXxvY2lwbG9nb258b2NpcmVzdWx0fG9jaXJvbGxiYWNrfG9jaXJvd2NvdW50fG9jaXNhdmVsb2J8b2Npc2F2ZWxvYmZpbGV8JyArDQogICAgICAgICdvY2lzZXJ2ZXJ2ZXJzaW9ufG9jaXNldHByZWZldGNofG9jaXN0YXRlbWVudHR5cGV8b2Npd3JpdGVsb2J0b2ZpbGV8b2Npd3JpdGV0ZW1wb3Jhcnlsb2J8UERGX2FkZF9hbm5vdGF0aW9ufFBERl9hZGRfYm9va21hcmt8JyArDQogICAgICAgICdQREZfYWRkX2xhdW5jaGxpbmt8UERGX2FkZF9sb2NhbGxpbmt8UERGX2FkZF9ub3RlfFBERl9hZGRfb3V0bGluZXxQREZfYWRkX3BkZmxpbmt8UERGX2FkZF93ZWJsaW5rfFBERl9hdHRhY2hfZmlsZXxQREZfYmVnaW5fcGFnZXwnICsNCiAgICAgICAgJ1BERl9iZWdpbl90ZW1wbGF0ZXxQREZfY2xvc2VfcGRpfFBERl9jbG9zZXxQREZfZmluZGZvbnR8UERGX2dldF9mb250fFBERl9nZXRfZm9udG5hbWV8UERGX2dldF9mb250c2l6ZXxQREZfZ2V0X2ltYWdlX2hlaWdodHwnICsNCiAgICAgICAgJ1BERl9nZXRfaW1hZ2Vfd2lkdGh8UERGX2dldF9tYWpvcnZlcnNpb258UERGX2dldF9taW5vcnZlcnNpb258UERGX2dldF9wZGlfcGFyYW1ldGVyfFBERl9nZXRfcGRpX3ZhbHVlfFBERl9vcGVuX2NjaXR0fFBERl9vcGVuX2ZpbGV8JyArDQogICAgICAgICdQREZfb3Blbl9naWZ8UERGX29wZW5faW1hZ2VfZmlsZXxQREZfb3Blbl9pbWFnZXxQREZfb3Blbl9qcGVnfFBERl9vcGVuX3BkaXxQREZfb3Blbl90aWZmfFBERl9wbGFjZV9pbWFnZXxQREZfcGxhY2VfcGRpX3BhZ2V8JyArDQogICAgICAgICdQREZfc2V0X2JvcmRlcl9jb2xvcnxQREZfc2V0X2JvcmRlcl9kYXNofFBERl9zZXRfYm9yZGVyX3N0eWxlfFBERl9zZXRfY2hhcl9zcGFjaW5nfFBERl9zZXRfZHVyYXRpb258UERGX3NldF9ob3Jpel9zY2FsaW5nfCcgKw0KICAgICAgICAnUERGX3NldF9pbmZvX2F1dGhvcnxQREZfc2V0X2luZm9fY3JlYXRvcnxQREZfc2V0X2luZm9fa2V5d29yZHN8UERGX3NldF9pbmZvX3N1YmplY3R8UERGX3NldF9pbmZvX3RpdGxlfFBERl9zZXRfbGVhZGluZ3wnICsNCiAgICAgICAgJ1BERl9zZXRfdGV4dF9tYXRyaXh8UERGX3NldF90ZXh0X3JlbmRlcmluZ3xQREZfc2V0X3RleHRfcmlzZXxQREZfc2V0X3dvcmRfc3BhY2luZ3xQREZfc2V0Z3JheV9maWxsfFBERl9zZXRncmF5X3N0cm9rZXxQREZfc2V0Z3JheXwnICsNCiAgICAgICAgJ1BERl9zZXRwb2x5ZGFzaHxQREZfc2V0cmdiY29sb3JfZmlsbHxQREZfc2V0cmdiY29sb3Jfc3Ryb2tlfFBERl9zZXRyZ2Jjb2xvcnxQREZfc2hvd19ib3hlZHxwaHBfY2hlY2tfc3ludGF4fHB4X3NldF90YWJsZW5hbWV8JyArDQogICAgICAgICdweF9zZXRfdGFyZ2V0ZW5jb2Rpbmd8cnVua2l0X3NhbmRib3hfb3V0cHV0X2hhbmRsZXJ8c2Vzc2lvbl9pc19yZWdpc3RlcmVkfHNlc3Npb25fcmVnaXN0ZXJ8c2Vzc2lvbl91bnJlZ2lzdGVyJyArDQogICAgICAgICdzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWV8bWFnaWNfcXVvdGVzX3J1bnRpbWV8c2V0X3NvY2tldF9ibG9ja2luZ3xzb2NrZXRfc2V0X2Jsb2NraW5nfHNldF9zb2NrZXRfdGltZW91dHxzb2NrZXRfc2V0X3RpbWVvdXR8c3BsaXR8c3BsaXRpfCcgKw0KICAgICAgICAnc3FsX3JlZ2Nhc2UnKS5zcGxpdCgnfCcpDQogICAgKTsNCg0KICAgIHZhciBrZXl3b3Jkc0RlcHJlY2F0ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgnY2Z1bmN0aW9ufG9sZF9mdW5jdGlvbicpLnNwbGl0KCd8JykNCiAgICApOw0KDQogICAgdmFyIGZ1dHVyZVJlc2VydmVkID0gbGFuZy5hcnJheVRvTWFwKFtdKTsNCg0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4NCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkDQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdXBwb3J0LnBocF90YWciLCAvLyBwaHAgb3BlbiB0YWcNCiAgICAgICAgICAgICAgICByZWdleCA6ICI8XFw/KD86cGhwfFxcPSkiDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN1cHBvcnQucGhwX3RhZyIsIC8vIHBocCBjbG9zZSB0YWcNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXD8+Ig0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICI8XFwhLS0iLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiaHRtbGNvbW1lbnQiDQogICAgICAgICAgICB9LCANCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiPHN0eWxlIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNzcyINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLCAvLyBvcGVuaW5nIHRhZw0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjxcXC8/Wy1fYS16QS1aMC05Ol0rIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImh0bWx0YWciDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogJ21ldGEudGFnJywNCiAgICAgICAgICAgICAgICByZWdleCA6ICc8XCFET0NUWVBFLio/PicNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgcmVnZXggOiAiIy4qJCINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBkb2NDb21tZW50LmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZy5yZWdleHAiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dW2dpbXldKlxccyooPz1bKS4sO118JCkiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdLipcXFxcJCcsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJxcXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlIiwgLy8gY29uc3RhbnRzDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxiKD86REVGQVVMVF9JTkNMVURFX1BBVEh8RV8oPzpBTEx8Q08oPzpNUElMRV8oPzpFUlJPUnxXQVJOSU5HKXxSRV8oPzpFUlJPUnxXQVJOSU5HKSl8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiRVJST1J8Tk9USUNFfFBBUlNFfFNUUklDVHxVU0VSXyg/OkVSUk9SfE5PVElDRXxXQVJOSU5HKXxXQVJOSU5HKXxQKD86RUFSXyg/OkVYVEVOU0lPTl9ESVJ8SU5TVEFMTF9ESVIpfCIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIkhQXyg/OkJJTkRJUnxDT05GSUdfRklMRV8oPzpQQVRIfFNDQU5fRElSKXxEQVRBRElSfEUoPzpPTHxYVEVOU0lPTl9ESVIpfElOVF8oPzpNQVh8U0laRSl8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiTCg/OklCRElSfE9DQUxTVEFURURJUil8Tyg/OlN8VVRQVVRfSEFORExFUl8oPzpDT05UfEVORHxTVEFSVCkpfFBSRUZJWHxTKD86QVBJfEhMSUJfU1VGRklYfFlTQ09ORkRJUil8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiVkVSU0lPTikpfF9fQ09NUElMRVJfSEFMVF9PRkZTRVRfXylcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UiLCAvLyBjb25zdGFudHMNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXGIoPzpBKD86Qig/OkRBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxNT05fKD86MSg/OjB8MXwyfCl8MnwzfDR8NXw2fDd8OHw5KSl8TFRfRElHSVRTfE1fU1RSfCIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIlNTRVJUXyg/OkFDVElWRXxCQUlMfENBTExCQUNLfFFVSUVUX0VWQUx8V0FSTklORykpfEMoPzpBU0VfKD86TE9XRVJ8VVBQRVIpfEhBUl9NQVh8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiTyg/OkRFU0VUfE5ORUNUSU9OXyg/OkFCT1JURUR8Tk9STUFMfFRJTUVPVVQpfFVOVF8oPzpOT1JNQUx8UkVDVVJTSVZFKSl8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiUig/OkVESVRTXyg/OkFMTHxET0NTfEZVTExQQUdFfEcoPzpFTkVSQUx8Uk9VUCl8TU9EVUxFU3xRQXxTQVBJKXxOQ1lTVFJ8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiWVBUXyg/OkJMT1dGSVNIfEVYVF9ERVN8TUQ1fFMoPzpBTFRfTEVOR1RIfFREX0RFUykpKXxVUlJFTkNZX1NZTUJPTCl8RCg/OkFZXyg/OjF8MnwzfDR8NXw2fDcpfCIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIkVDSU1BTF9QT0lOVHxJUkVDVE9SWV9TRVBBUkFUT1J8Xyg/OkZNVHxUX0ZNVCkpfEUoPzpOVF8oPzpDT01QQVR8Tk9RVU9URVN8UVVPVEVTKXxSQSg/Ol8oPzpEXyg/OkZNVHxUX0ZNVCl8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiVF9GTVR8WUVBUil8KXxYVFJfKD86SUZfRVhJU1RTfE9WRVJXUklURXxQUkVGSVhfKD86QUxMfEkoPzpGX0VYSVNUU3xOVkFMSUQpfFNBTUUpfFNLSVApKXxGUkFDX0RJR0lUU3xHUk9VUElOR3wiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICJIVE1MXyg/OkVOVElUSUVTfFNQRUNJQUxDSEFSUyl8SU4oPzpGT18oPzpBTEx8Qyg/Ok9ORklHVVJBVElPTnxSRURJVFMpfEVOVklST05NRU5UfEdFTkVSQUx8TElDRU5TRXxNT0RVTEVTfFZBUklBQkxFUyl8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiSV8oPzpBTEx8UEVSRElSfFNZU1RFTXxVU0VSKXxUXyg/OkNVUlJfU1lNQk9MfEZSQUNfRElHSVRTKSl8TCg/OkNfKD86QUxMfEMoPzpPTExBVEV8VFlQRSl8TSg/OkVTU0FHRVN8T05FVEFSWSl8TlVNRVJJQ3xUSU1FKXwiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICJPKD86Q0tfKD86RVh8TkJ8U0h8VU4pfEdfKD86QSg/OkxFUlR8VVRIKD86UFJJVnwpKXxDKD86T05TfFIoPzpJVHxPTikpfEQoPzpBRU1PTnxFQlVHKXxFKD86TUVSR3xSUil8SU5GT3xLRVJOfCIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIkwoPzpPQ0FMKD86MHwxfDJ8M3w0fDV8Nnw3KXxQUil8TUFJTHxOKD86REVMQVl8RVdTfE8oPzpUSUNFfFdBSVQpKXxPREVMQVl8UCg/OkVSUk9SfElEKXxTWVNMT0d8VSg/OlNFUnxVQ1ApfFdBUk5JTkcpKSl8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiTSg/Ok9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OXxERUNJTUFMX1BPSU5UfEdST1VQSU5HfFRIT1VTQU5EU19TRVApfF8oPzoxX1BJfDJfKD86UEl8U1FSVFBJKXxFfEwoPzpOKD86MTB8Mil8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiT0coPzoxMEV8MkUpKXxQSSg/Ol8oPzoyfDQpfCl8U1FSVCg/OjFfMnwyKSkpfE4oPzpFR0FUSVZFX1NJR058Tyg/OkVYUFJ8U1RSKXxfKD86Q1NfUFJFQ0VERVN8Uyg/OkVQX0JZX1NQQUNFfElHTl9QT1NOKSkpfCIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIlAoPzpBVEgoPzpJTkZPXyg/OkJBU0VOQU1FfERJUk5BTUV8RVhURU5TSU9OKXxfU0VQQVJBVE9SKXxNX1NUUnxPU0lUSVZFX1NJR058Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXwiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICJSQURJWENIQVJ8Uyg/OkVFS18oPzpDVVJ8RU5EfFNFVCl8T1JUXyg/OkFTQ3xERVNDfE5VTUVSSUN8UkVHVUxBUnxTVFJJTkcpfFRSX1BBRF8oPzpCT1RIfExFRlR8UklHSFQpKXwiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICJUKD86SE9VUyg/OkFORFNfU0VQfEVQKXxfRk1UKD86X0FNUE18KSl8WUVTKD86RVhQUnxTVFIpfFNURCg/OklOfE9VVHxFUlIpKVxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluVmFyaWFibGVzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5GdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gImRlYnVnZ2VyIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUubWF0Y2goL14oXCRbYS16QS1aXVthLXpBLVowLTlfXSp8c2VsZnxwYXJlbnQpJC8pKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUiOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIC8vIFRPRE86IFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcw0KICAgICAgICAgICAgICAgIC8vIFRPRE86IFVuaWNvZGUgaWRlbnRpZmllcnMNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJodG1sY29tbWVudCIgOiBbDQogICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICAgcmVnZXggOiAiLio/LS0+IiwNCiAgICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgICB9IA0KICAgICAgICAgXSwNCiAgICAgICAgICJodG1sdGFnIiA6IFsgDQogICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgICAgICAgICAgIHJlZ2V4IDogIj4iLA0KICAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgIHJlZ2V4IDogIlstX2EtekEtWjAtOTpdKyINCiAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICAgcmVnZXggOiAnIi4qPyInDQogICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgICByZWdleCA6ICInLio/JyINCiAgICAgICAgICAgICB9IA0KICAgICAgICAgXSwNCiAgICAgICAgImNzcyIgOiBbIA0KICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLA0KICAgICAgICAgICAgICAgICByZWdleCA6ICI8XC9zdHlsZT4iLA0KICAgICAgICAgICAgICAgICBuZXh0IDogImh0bWx0YWciDQogICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgICAgICAgICAgIHJlZ2V4IDogIj4iLA0KICAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgdG9rZW4gOiAndGV4dCcsDQogICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Om1lZGlhfHR5cGV8aHJlZikiDQogICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICB0b2tlbiA6ICdzdHJpbmcnLA0KICAgICAgICAgICAgICAgICByZWdleCA6ICc9Ii4qPyInDQogICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgICByZWdleCA6ICJceyIsDQogICAgICAgICAgICAgICAgIG5leHQgOiAiY3NzZGVjbGFyYXRpb24iLA0KICAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsDQogICAgICAgICAgICAgICAgIHJlZ2V4IDogIiNbQS1aYS16MC05XC1cX1wuXSsiDQogICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICB0b2tlbiA6ICJ2YXJpYWJsZSIsDQogICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLltBLVphLXowLTlcLVxfXC5dKyINCiAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50IiwNCiAgICAgICAgICAgICAgICAgcmVnZXggOiAiW0EtWmEtejAtOV0rIg0KICAgICAgICAgICAgIH0NCiAgICAgICAgIF0sDQogICAgICAgICAiY3NzZGVjbGFyYXRpb24iIDogWw0KICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgdG9rZW4gOiAic3VwcG9ydC50eXBlIiwNCiAgICAgICAgICAgICAgICAgcmVnZXggOiAiW1wtYS16QS1aXSsiLA0KICAgICAgICAgICAgICAgICBuZXh0ICA6ICJjc3N2YWx1ZSINCiAgICAgICAgICAgICB9LCANCiAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1x9JywNCiAgICAgICAgICAgICAgICAgbmV4dCA6ICJjc3MiDQogICAgICAgICAgICAgfQ0KICAgICAgICAgXSwNCiAgICAgICAgICJjc3N2YWx1ZSIgOiBbDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgICAgcmVnZXggOiAiXDoiDQogICAgICAgICAgICAgICB9LCANCiAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudCIsDQogICAgICAgICAgICAgICAgICAgcmVnZXggOiAiI1swLTlhLXpBLVpdKyINCiAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgICAgcmVnZXggOiAiW1wtXF8wLTlhLXpBLVpcIicgLCVdKyINCiAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgICAgcmVnZXggOiAiOyIsDQogICAgICAgICAgICAgICAgICAgbmV4dCA6ICJjc3NkZWNsYXJhdGlvbiINCiAgICAgICAgICAgICAgIH0NCiAgICAgICAgIF0sDQogICAgfTsNCg0KICAgIHRoaXMuZW1iZWRSdWxlcyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsICJkb2MtIiwNCiAgICAgICAgWyBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0RW5kUnVsZSgic3RhcnQiKSBdKTsNCn07DQoNCm9vcC5pbmhlcml0cyhQaHBIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5QaHBIaWdobGlnaHRSdWxlcyA9IFBocEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYy50YWciLA0KICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiVE9ETyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4iDQogICAgICAgIH1dDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0U3RhcnRSdWxlID0gZnVuY3Rpb24oc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKig/PVxcKikiLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRFbmRSdWxlID0gZnVuY3Rpb24gKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwqXFwvIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KDQp9KS5jYWxsKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcy5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91ciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7DQoNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAneycgKyBzZWxlY3RlZCArICd9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnfScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBzZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1uICsgMX0pOw0KICAgICAgICAgICAgICAgIGlmICghb3BlbkJyYWNlUG9zKQ0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQoNCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5nZXROZXh0TGluZUluZGVudChzdGF0ZSwgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSwgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5lbmQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoJyArIHNlbGVjdGVkICsgJyknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICcpJykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICcoJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICciJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJyInICsgc2VsZWN0ZWQgKyAnIicsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICAgICAgdmFyIGxlZnRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbi0xLCBjdXJzb3IuY29sdW1uKTsNCg0KICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGVzY2FwZWQuDQogICAgICAgICAgICAgICAgaWYgKGxlZnRDaGFyID09ICdcXCcpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMoc2VsZWN0aW9uLnN0YXJ0LnJvdywgc2VsZWN0aW9uLnN0YXJ0LnJvdylbMF0udG9rZW5zOw0KICAgICAgICAgICAgICAgIHZhciBjb2wgPSAwLCB0b2tlbjsNCiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4NCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdG9rZW5zLmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOw0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gLTE7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSB0b2tlbi52YWx1ZS5pbmRleE9mKCciJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0Lg0KICAgICAgICAgICAgICAgIGlmICghdG9rZW4gfHwgKHF1b3RlcG9zIDwgMCAmJiB0b2tlbi50eXBlICE9PSAiY29tbWVudCIgJiYgKHRva2VuLnR5cGUgIT09ICJzdHJpbmciIHx8ICgoc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbiAhPT0gdG9rZW4udmFsdWUubGVuZ3RoK2NvbC0xKSAmJiB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZignIicpID09PSB0b2tlbi52YWx1ZS5sZW5ndGgtMSkpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGlucHV0IGFuZCBtb3ZlIHJpZ2h0IG9uZSBpZiB3ZSdyZSB0eXBpbmcgb3ZlciB0aGUgY2xvc2luZyBxdW90ZS4NCiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICciJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KfQ0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsNCg0KZXhwb3J0cy5Dc3R5bGVCZWhhdmlvdXIgPSBDc3R5bGVCZWhhdmlvdXI7DQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOw0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9Ow0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoIXN0YXJ0KQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7DQogICAgICAgICAgICBlbmQuY29sdW1uLS07DQoNCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[ZGVmaW5lKCdhY2UvbW9kZS9wb3dlcnNoZWxsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvcG93ZXJzaGVsbF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgUG93ZXJzaGVsbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9wb3dlcnNoZWxsX2hpZ2hsaWdodF9ydWxlcyIpLlBvd2Vyc2hlbGxIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBQb3dlcnNoZWxsSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQogICAgICANCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKltce1woXFtdXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCg0KDQogICAgdGhpcy5jcmVhdGVXb3JrZXIgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQpkZWZpbmUoJ2FjZS9tb2RlL3Bvd2Vyc2hlbGxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIFBvd2Vyc2hlbGxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICgiZnVuY3Rpb258aWZ8ZWxzZXxlbHNlaWZ8c3dpdGNofHdoaWxlfGRlZmF1bHR8Zm9yfGRvfHVudGlsfGJyZWFrfGNvbnRpbnVlfCIgKyANCiAgICAgICAiZm9yZWFjaHxyZXR1cm58ZmlsdGVyfGlufHRyYXB8dGhyb3d8cGFyYW18YmVnaW58cHJvY2Vzc3xlbmQiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsdGluRnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgKCJHZXQtQWxpYXN8SW1wb3J0LUFsaWFzfE5ldy1BbGlhc3xTZXQtQWxpYXN8R2V0LUF1dGhlbnRpY29kZVNpZ25hdHVyZXxTZXQtQXV0aGVudGljb2RlU2lnbmF0dXJlfCIgKw0KICAgICAgICJTZXQtTG9jYXRpb258R2V0LUNoaWxkSXRlbXxDbGVhci1JdGVtfEdldC1Db21tYW5kfE1lYXN1cmUtQ29tbWFuZHxUcmFjZS1Db21tYW5kfCIgKw0KICAgICAgICJBZGQtQ29tcHV0ZXJ8Q2hlY2twb2ludC1Db21wdXRlcnxSZW1vdmUtQ29tcHV0ZXJ8UmVzdGFydC1Db21wdXRlcnxSZXN0b3JlLUNvbXB1dGVyfFN0b3AtQ29tcHV0ZXJ8IiArDQogICAgICAgIlJlc2V0LUNvbXB1dGVyTWFjaGluZVBhc3N3b3JkfFRlc3QtQ29tcHV0ZXJTZWN1cmVDaGFubmVsfEFkZC1Db250ZW50fEdldC1Db250ZW50fFNldC1Db250ZW50fENsZWFyLUNvbnRlbnR8IiArDQogICAgICAgIkdldC1Db21tYW5kfEludm9rZS1Db21tYW5kfEVuYWJsZS1Db21wdXRlclJlc3RvcmV8RGlzYWJsZS1Db21wdXRlclJlc3RvcmV8R2V0LUNvbXB1dGVyUmVzdG9yZVBvaW50fFRlc3QtQ29ubmVjdGlvbnwiICsNCiAgICAgICAiQ29udmVydEZyb20tQ1NWfENvbnZlcnRUby1DU1Z8Q29udmVydFRvLUh0bWx8Q29udmVydFRvLVhtbHxDb252ZXJ0RnJvbS1TZWN1cmVTdHJpbmd8Q29udmVydFRvLVNlY3VyZVN0cmluZ3wiICsNCiAgICAgICAiQ29weS1JdGVtfEV4cG9ydC1Db3VudGVyfEdldC1Db3VudGVyfEltcG9ydC1Db3VudGVyfEdldC1DcmVkZW50aWFsfEdldC1DdWx0dXJlfCIgKw0KICAgICAgICJHZXQtQ2hpbGRJdGVtfEdldC1EYXRlfFNldC1EYXRlfFJlbW92ZS1JdGVtfENvbXBhcmUtT2JqZWN0fEdldC1FdmVudHwiICsNCiAgICAgICAiR2V0LVdpbkV2ZW50fE5ldy1FdmVudHxSZW1vdmUtRXZlbnR8VW5yZWdpc3Rlci1FdmVudHxXYWl0LUV2ZW50fENsZWFyLUV2ZW50TG9nfCIgKw0KICAgICAgICJHZXQtRXZlbnRsb2d8TGltaXQtRXZlbnRMb2d8TmV3LUV2ZW50bG9nfFJlbW92ZS1FdmVudExvZ3xTaG93LUV2ZW50TG9nfFdyaXRlLUV2ZW50TG9nfCIgKw0KICAgICAgICJHZXQtRXZlbnRTdWJzY3JpYmVyfFJlZ2lzdGVyLUVuZ2luZUV2ZW50fFJlZ2lzdGVyLU9iamVjdEV2ZW50fFJlZ2lzdGVyLVdtaUV2ZW50fEdldC1FeGVjdXRpb25Qb2xpY3l8U2V0LUV4ZWN1dGlvblBvbGljeXwiICsNCiAgICAgICAiRXhwb3J0LUFsaWFzfEV4cG9ydC1DbGl4bWx8RXhwb3J0LUNvbnNvbGV8RXhwb3J0LUNzdnxGb3JFYWNoLU9iamVjdHxGb3JtYXQtQ3VzdG9tfCIgKw0KICAgICAgICJGb3JtYXQtTGlzdHxGb3JtYXQtVGFibGV8Rm9ybWF0LVdpZGV8RXhwb3J0LUZvcm1hdERhdGF8R2V0LUZvcm1hdERhdGF8R2V0LUl0ZW18IiArDQogICAgICAgIkdldC1DaGlsZEl0ZW18R2V0LUhlbHB8QWRkLUhpc3Rvcnl8Q2xlYXItSGlzdG9yeXxHZXQtSGlzdG9yeXxJbnZva2UtSGlzdG9yeXwiICsNCiAgICAgICAiR2V0LUhvc3R8UmVhZC1Ib3N0fFdyaXRlLUhvc3R8R2V0LUhvdEZpeHxJbXBvcnQtQ2xpeG1sfEltcG9ydC1Dc3Z8IiArDQogICAgICAgIkludm9rZS1Db21tYW5kfEludm9rZS1FeHByZXNzaW9ufEdldC1JdGVtfEludm9rZS1JdGVtfE5ldy1JdGVtfFJlbW92ZS1JdGVtfCIgKw0KICAgICAgICJTZXQtSXRlbXxDbGVhci1JdGVtUHJvcGVydHl8Q29weS1JdGVtUHJvcGVydHl8R2V0LUl0ZW1Qcm9wZXJ0eXxNb3ZlLUl0ZW1Qcm9wZXJ0eXxOZXctSXRlbVByb3BlcnR5fCIgKw0KICAgICAgICJSZW1vdmUtSXRlbVByb3BlcnR5fFJlbmFtZS1JdGVtUHJvcGVydHl8U2V0LUl0ZW1Qcm9wZXJ0eXxHZXQtSm9ifFJlY2VpdmUtSm9ifFJlbW92ZS1Kb2J8IiArDQogICAgICAgIlN0YXJ0LUpvYnxTdG9wLUpvYnxXYWl0LUpvYnxTdG9wLVByb2Nlc3N8VXBkYXRlLUxpc3R8R2V0LUxvY2F0aW9ufCIgKw0KICAgICAgICJQb3AtTG9jYXRpb258UHVzaC1Mb2NhdGlvbnxTZXQtTG9jYXRpb258U2VuZC1NYWlsTWVzc2FnZXxBZGQtTWVtYmVyfEdldC1NZW1iZXJ8IiArDQogICAgICAgIk1vdmUtSXRlbXxDb21wYXJlLU9iamVjdHxHcm91cC1PYmplY3R8TWVhc3VyZS1PYmplY3R8TmV3LU9iamVjdHxTZWxlY3QtT2JqZWN0fCIgKw0KICAgICAgICJTb3J0LU9iamVjdHxXaGVyZS1PYmplY3R8T3V0LURlZmF1bHR8T3V0LUZpbGV8T3V0LUdyaWRWaWV3fE91dC1Ib3N0fCIgKw0KICAgICAgICJPdXQtTnVsbHxPdXQtUHJpbnRlcnxPdXQtU3RyaW5nfENvbnZlcnQtUGF0aHxKb2luLVBhdGh8UmVzb2x2ZS1QYXRofCIgKw0KICAgICAgICJTcGxpdC1QYXRofFRlc3QtUGF0aHxHZXQtUGZ4Y2VydGlmaWNhdGV8UG9wLUxvY2F0aW9ufFB1c2gtTG9jYXRpb258R2V0LVByb2Nlc3N8IiArDQogICAgICAgIlN0YXJ0LVByb2Nlc3N8U3RvcC1Qcm9jZXNzfFdhaXQtUHJvY2Vzc3xFbmFibGUtUFNCcmVha3BvaW50fERpc2FibGUtUFNCcmVha3BvaW50fEdldC1QU0JyZWFrcG9pbnR8IiArDQogICAgICAgIlNldC1QU0JyZWFrcG9pbnR8UmVtb3ZlLVBTQnJlYWtwb2ludHxHZXQtUFNEcml2ZXxOZXctUFNEcml2ZXxSZW1vdmUtUFNEcml2ZXxHZXQtUFNQcm92aWRlcnwiICsNCiAgICAgICAiU2V0LVBTZGVidWd8RW50ZXItUFNTZXNzaW9ufEV4aXQtUFNTZXNzaW9ufEV4cG9ydC1QU1Nlc3Npb258R2V0LVBTU2Vzc2lvbnxJbXBvcnQtUFNTZXNzaW9ufCIgKw0KICAgICAgICJOZXctUFNTZXNzaW9ufFJlbW92ZS1QU1Nlc3Npb258RGlzYWJsZS1QU1Nlc3Npb25Db25maWd1cmF0aW9ufEVuYWJsZS1QU1Nlc3Npb25Db25maWd1cmF0aW9ufEdldC1QU1Nlc3Npb25Db25maWd1cmF0aW9ufFJlZ2lzdGVyLVBTU2Vzc2lvbkNvbmZpZ3VyYXRpb258IiArDQogICAgICAgIlNldC1QU1Nlc3Npb25Db25maWd1cmF0aW9ufFVucmVnaXN0ZXItUFNTZXNzaW9uQ29uZmlndXJhdGlvbnxOZXctUFNTZXNzaW9uT3B0aW9ufEFkZC1Qc1NuYXBJbnxHZXQtUHNTbmFwaW58UmVtb3ZlLVBTU25hcGlufCIgKw0KICAgICAgICJHZXQtUmFuZG9tfFJlYWQtSG9zdHxSZW1vdmUtSXRlbXxSZW5hbWUtSXRlbXxSZW5hbWUtSXRlbVByb3BlcnR5fFNlbGVjdC1PYmplY3R8IiArDQogICAgICAgIlNlbGVjdC1YTUx8U2VuZC1NYWlsTWVzc2FnZXxHZXQtU2VydmljZXxOZXctU2VydmljZXxSZXN0YXJ0LVNlcnZpY2V8UmVzdW1lLVNlcnZpY2V8IiArDQogICAgICAgIlNldC1TZXJ2aWNlfFN0YXJ0LVNlcnZpY2V8U3RvcC1TZXJ2aWNlfFN1c3BlbmQtU2VydmljZXxTb3J0LU9iamVjdHxTdGFydC1TbGVlcHwiICsNCiAgICAgICAiQ29udmVydEZyb20tU3RyaW5nRGF0YXxTZWxlY3QtU3RyaW5nfFRlZS1PYmplY3R8TmV3LVRpbWVzcGFufFRyYWNlLUNvbW1hbmR8R2V0LVRyYWNlc291cmNlfCIgKw0KICAgICAgICJTZXQtVHJhY2Vzb3VyY2V8U3RhcnQtVHJhbnNhY3Rpb258Q29tcGxldGUtVHJhbnNhY3Rpb258R2V0LVRyYW5zYWN0aW9ufFVzZS1UcmFuc2FjdGlvbnxVbmRvLVRyYW5zYWN0aW9ufCIgKw0KICAgICAgICJTdGFydC1UcmFuc2NyaXB0fFN0b3AtVHJhbnNjcmlwdHxBZGQtVHlwZXxVcGRhdGUtVHlwZURhdGF8R2V0LVVpY3VsdHVyZXxHZXQtVW5pcXVlfCIgKw0KICAgICAgICJVcGRhdGUtRm9ybWF0ZGF0YXxVcGRhdGUtVHlwZWRhdGF8Q2xlYXItVmFyaWFibGV8R2V0LVZhcmlhYmxlfE5ldy1WYXJpYWJsZXxSZW1vdmUtVmFyaWFibGV8IiArDQogICAgICAgIlNldC1WYXJpYWJsZXxOZXctV2ViU2VydmljZVByb3h5fFdoZXJlLU9iamVjdHxXcml0ZS1EZWJ1Z3xXcml0ZS1FcnJvcnxXcml0ZS1Ib3N0fCIgKw0KICAgICAgICJXcml0ZS1PdXRwdXR8V3JpdGUtUHJvZ3Jlc3N8V3JpdGUtVmVyYm9zZXxXcml0ZS1XYXJuaW5nfFNldC1XbWlJbnN0YW5jZXxJbnZva2UtV21pTWV0aG9kfCIgKw0KICAgICAgICJHZXQtV21pT2JqZWN0fFJlbW92ZS1XbWlPYmplY3R8Q29ubmVjdC1XU01hbnxEaXNjb25uZWN0LVdTTWFufFRlc3QtV1NNYW58SW52b2tlLVdTTWFuQWN0aW9ufCIgKw0KICAgICAgICJEaXNhYmxlLVdTTWFuQ3JlZFNTUHxFbmFibGUtV1NNYW5DcmVkU1NQfEdldC1XU01hbkNyZWRTU1B8TmV3LVdTTWFuSW5zdGFuY2V8R2V0LVdTTWFuSW5zdGFuY2V8U2V0LVdTTWFuSW5zdGFuY2V8IiArDQogICAgICAgIlJlbW92ZS1XU01hbkluc3RhbmNlfFNldC1XU01hblF1aWNrQ29uZmlnfE5ldy1XU01hblNlc3Npb25PcHRpb24iKS5zcGxpdCgifCIpKTsNCg0KICAgIHZhciBiaW5hcnlPcGVyYXRvcnNSZSA9ICJlcXxuZXxnZXxndHxsdHxsZXxsaWtlfG5vdGxpa2V8bWF0Y2h8bm90bWF0Y2h8cmVwbGFjZXxjb250YWluc3xub3Rjb250YWluc3wiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWVxfGluZXxpZ2V8aWd0fGlsZXxpbHR8aWxpa2V8aW5vdGxpa2V8aW1hdGNofGlub3RtYXRjaHxpcmVwbGFjZXxpY29udGFpbnN8aW5vdGNvbnRhaW5zfCIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpc3xpc25vdHxhc3wiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kfG9yfGJhbmR8Ym9yfG5vdCI7IA0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiMuKiQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyRdKD86W1R0XXJ1ZXxbRmZdYWxzZSlcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlskXVtObl11bGxcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidmFyaWFibGUuaW5zdGFuY2UiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlskXVthLXpBLVpdW2EtekEtWjAtOV9dKlxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluRnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGlkZW50aWZpZXJzDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl8kXVthLXpBLVowLTlfJFxcLV0qXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLSg/OiIgKyBiaW5hcnlPcGVyYXRvcnNSZSArICIpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiZ8XFwqfFxcK3xcXC18XFw9fFxcKz18XFwtPSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJscGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhQb3dlcnNoZWxsSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuUG93ZXJzaGVsbEhpZ2hsaWdodFJ1bGVzID0gUG93ZXJzaGVsbEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91ciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7DQoNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAneycgKyBzZWxlY3RlZCArICd9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnfScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBzZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1uICsgMX0pOw0KICAgICAgICAgICAgICAgIGlmICghb3BlbkJyYWNlUG9zKQ0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQoNCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5nZXROZXh0TGluZUluZGVudChzdGF0ZSwgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSwgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5lbmQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoJyArIHNlbGVjdGVkICsgJyknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICcpJykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICcoJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICciJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJyInICsgc2VsZWN0ZWQgKyAnIicsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICAgICAgdmFyIGxlZnRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbi0xLCBjdXJzb3IuY29sdW1uKTsNCg0KICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGVzY2FwZWQuDQogICAgICAgICAgICAgICAgaWYgKGxlZnRDaGFyID09ICdcXCcpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMoc2VsZWN0aW9uLnN0YXJ0LnJvdywgc2VsZWN0aW9uLnN0YXJ0LnJvdylbMF0udG9rZW5zOw0KICAgICAgICAgICAgICAgIHZhciBjb2wgPSAwLCB0b2tlbjsNCiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4NCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdG9rZW5zLmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOw0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gLTE7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSB0b2tlbi52YWx1ZS5pbmRleE9mKCciJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0Lg0KICAgICAgICAgICAgICAgIGlmICghdG9rZW4gfHwgKHF1b3RlcG9zIDwgMCAmJiB0b2tlbi50eXBlICE9PSAiY29tbWVudCIgJiYgKHRva2VuLnR5cGUgIT09ICJzdHJpbmciIHx8ICgoc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbiAhPT0gdG9rZW4udmFsdWUubGVuZ3RoK2NvbC0xKSAmJiB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZignIicpID09PSB0b2tlbi52YWx1ZS5sZW5ndGgtMSkpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGlucHV0IGFuZCBtb3ZlIHJpZ2h0IG9uZSBpZiB3ZSdyZSB0eXBpbmcgb3ZlciB0aGUgY2xvc2luZyBxdW90ZS4NCiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICciJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KfQ0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsNCg0KZXhwb3J0cy5Dc3R5bGVCZWhhdmlvdXIgPSBDc3R5bGVCZWhhdmlvdXI7DQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOw0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9Ow0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoIXN0YXJ0KQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7DQogICAgICAgICAgICBlbmQuY29sdW1uLS07DQoNCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCioNCiogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQoqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KKg0KKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiogTGljZW5zZS4NCioNCiogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQoqDQoqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KKiBBamF4Lm9yZyBCLlYuDQoqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKg0KKiBDb250cmlidXRvcihzKToNCiogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KKiAgICAgIENvbGluIEdvdXJsYXkgPGNvbGluIERPVCBqIERPVCBnb3VybGF5IEFUIGdtYWlsIERPVCBjb20+DQoqDQoqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQoqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQoqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQoqDQoqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvcHl0aG9uJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvcHl0aG9uX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9mb2xkaW5nL3B5dGhvbmljJywgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIFB5dGhvbkhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9weXRob25faGlnaGxpZ2h0X3J1bGVzIikuUHl0aG9uSGlnaGxpZ2h0UnVsZXM7DQp2YXIgUHl0aG9uRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvcHl0aG9uaWMiKS5Gb2xkTW9kZTsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgUHl0aG9uSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBQeXRob25Gb2xkTW9kZSgiXFw6Iik7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIHJlID0gL14oXHMqKSMvOw0KDQogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgew0KICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICIjIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKltce1woXFtcOl1ccyokLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdmFyIG91dGRlbnRzID0gew0KICAgICAgICAicGFzcyI6IDEsDQogICAgICAgICJyZXR1cm4iOiAxLA0KICAgICAgICAicmFpc2UiOiAxLA0KICAgICAgICAiYnJlYWsiOiAxLA0KICAgICAgICAiY29udGludWUiOiAxDQogICAgfTsNCiAgICANCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoaW5wdXQgIT09ICJcclxuIiAmJiBpbnB1dCAhPT0gIlxyIiAmJiBpbnB1dCAhPT0gIlxuIikNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMobGluZS50cmltKCksIHN0YXRlKS50b2tlbnM7DQogICAgICAgIA0KICAgICAgICBpZiAoIXRva2VucykNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgDQogICAgICAgIC8vIGlnbm9yZSB0cmFpbGluZyBjb21tZW50cw0KICAgICAgICBkbyB7DQogICAgICAgICAgICB2YXIgbGFzdCA9IHRva2Vucy5wb3AoKTsNCiAgICAgICAgfSB3aGlsZSAobGFzdCAmJiAobGFzdC50eXBlID09ICJjb21tZW50IiB8fCAobGFzdC50eXBlID09ICJ0ZXh0IiAmJiBsYXN0LnZhbHVlLm1hdGNoKC9eXHMrJC8pKSkpOw0KICAgICAgICANCiAgICAgICAgaWYgKCFsYXN0KQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIChsYXN0LnR5cGUgPT0gImtleXdvcmQiICYmIG91dGRlbnRzW2xhc3QudmFsdWVdKTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICAvLyBvdXRkZW50aW5nIGluIHB5dGhvbiBpcyBzbGlnaHRseSBkaWZmZXJlbnQgYmVjYXVzZSBpdCBhbHdheXMgYXBwbGllcw0KICAgICAgICAvLyB0byB0aGUgbmV4dCBsaW5lIGFuZCBvbmx5IG9mIGEgbmV3IGxpbmUgaXMgaW5zZXJ0ZWQNCiAgICAgICAgDQogICAgICAgIHJvdyArPSAxOw0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKHJvdykpOw0KICAgICAgICB2YXIgdGFiID0gZG9jLmdldFRhYlN0cmluZygpOw0KICAgICAgICBpZiAoaW5kZW50LnNsaWNlKC10YWIubGVuZ3RoKSA9PSB0YWIpDQogICAgICAgICAgICBkb2MucmVtb3ZlKG5ldyBSYW5nZShyb3csIGluZGVudC5sZW5ndGgtdGFiLmxlbmd0aCwgcm93LCBpbmRlbnQubGVuZ3RoKSk7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgQ29saW4gR291cmxheSA8Y29saW4gRE9UIGogRE9UIGdvdXJsYXkgQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKg0KICoNCiAqIFRPRE86IHB5dGhvbiBkZWxpbWl0ZXJzDQogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9weXRob25faGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIFB5dGhvbkhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYW5kfGFzfGFzc2VydHxicmVha3xjbGFzc3xjb250aW51ZXxkZWZ8ZGVsfGVsaWZ8ZWxzZXxleGNlcHR8ZXhlY3wiICsNCiAgICAgICAgImZpbmFsbHl8Zm9yfGZyb218Z2xvYmFsfGlmfGltcG9ydHxpbnxpc3xsYW1iZGF8bm90fG9yfHBhc3N8cHJpbnR8IiArDQogICAgICAgICJyYWlzZXxyZXR1cm58dHJ5fHdoaWxlfHdpdGh8eWllbGQiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsdGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIlRydWV8RmFsc2V8Tm9uZXxOb3RJbXBsZW1lbnRlZHxFbGxpcHNpc3xfX2RlYnVnX18iKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsdGluRnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImFic3xkaXZtb2R8aW5wdXR8b3BlbnxzdGF0aWNtZXRob2R8YWxsfGVudW1lcmF0ZXxpbnR8b3JkfHN0cnxhbnl8IiArDQogICAgICAgICJldmFsfGlzaW5zdGFuY2V8cG93fHN1bXxiYXNlc3RyaW5nfGV4ZWNmaWxlfGlzc3ViY2xhc3N8cHJpbnR8c3VwZXJ8IiArDQogICAgICAgICJiaW5maWxlfGl0ZXJ8cHJvcGVydHl8dHVwbGV8Ym9vbHxmaWx0ZXJ8bGVufHJhbmdlfHR5cGV8Ynl0ZWFycmF5fCIgKw0KICAgICAgICAiZmxvYXR8bGlzdHxyYXdfaW5wdXR8dW5pY2hyfGNhbGxhYmxlfGZvcm1hdHxsb2NhbHN8cmVkdWNlfHVuaWNvZGV8IiArDQogICAgICAgICJjaHJ8ZnJvemVuc2V0fGxvbmd8cmVsb2FkfHZhcnN8Y2xhc3NtZXRob2R8Z2V0YXR0cnxtYXB8cmVwcnx4cmFuZ2V8IiArDQogICAgICAgICJjbXB8Z2xvYmFsc3xtYXh8cmV2ZXJzZWR8emlwfGNvbXBpbGV8aGFzYXR0cnxtZW1vcnl2aWV3fHJvdW5kfCIgKw0KICAgICAgICAiX19pbXBvcnRfX3xjb21wbGV4fGhhc2h8bWlufHNldHxhcHBseXxkZWxhdHRyfGhlbHB8bmV4dHxzZXRhdHRyfCIgKw0KICAgICAgICAiYnVmZmVyfGRpY3R8aGV4fG9iamVjdHxzbGljZXxjb2VyY2V8ZGlyfGlkfG9jdHxzb3J0ZWR8aW50ZXJuIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZnV0dXJlUmVzZXJ2ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgc3RyUHJlID0gIig/OnJ8dXx1cnxSfFV8VVJ8VXJ8dVIpPyI7DQoNCiAgICB2YXIgZGVjaW1hbEludGVnZXIgPSAiKD86KD86WzEtOV1cXGQqKXwoPzowKSkiOw0KICAgIHZhciBvY3RJbnRlZ2VyID0gIig/OjBbb09dP1swLTddKykiOw0KICAgIHZhciBoZXhJbnRlZ2VyID0gIig/OjBbeFhdW1xcZEEtRmEtZl0rKSI7DQogICAgdmFyIGJpbkludGVnZXIgPSAiKD86MFtiQl1bMDFdKykiOw0KICAgIHZhciBpbnRlZ2VyID0gIig/OiIgKyBkZWNpbWFsSW50ZWdlciArICJ8IiArIG9jdEludGVnZXIgKyAifCIgKyBoZXhJbnRlZ2VyICsgInwiICsgYmluSW50ZWdlciArICIpIjsNCg0KICAgIHZhciBleHBvbmVudCA9ICIoPzpbZUVdWystXT9cXGQrKSI7DQogICAgdmFyIGZyYWN0aW9uID0gIig/OlxcLlxcZCspIjsNCiAgICB2YXIgaW50UGFydCA9ICIoPzpcXGQrKSI7DQogICAgdmFyIHBvaW50RmxvYXQgPSAiKD86KD86IiArIGludFBhcnQgKyAiPyIgKyBmcmFjdGlvbiArICIpfCg/OiIgKyBpbnRQYXJ0ICsgIlxcLikpIjsNCiAgICB2YXIgZXhwb25lbnRGbG9hdCA9ICIoPzooPzoiICsgcG9pbnRGbG9hdCArICJ8IiArICBpbnRQYXJ0ICsgIikiICsgZXhwb25lbnQgKyAiKSI7DQogICAgdmFyIGZsb2F0TnVtYmVyID0gIig/OiIgKyBleHBvbmVudEZsb2F0ICsgInwiICsgcG9pbnRGbG9hdCArICIpIjsNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIiMuKiQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyAiIiIgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICciezN9KD86W15cXFxcXXxcXFxcLikqPyJ7M30nDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBtdWx0aSBsaW5lICIiIiBzdHJpbmcgc3RhcnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJyJ7M30uKiQnLA0KICAgICAgICAgICAgbmV4dCA6ICJxcXN0cmluZyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vICIgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICciKD86W15cXFxcXXxcXFxcLikqPyInDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyAnJycgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICInezN9KD86W15cXFxcXXxcXFxcLikqPyd7M30iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBtdWx0aSBsaW5lICcnJyBzdHJpbmcgc3RhcnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgIid7M30uKiQiLA0KICAgICAgICAgICAgbmV4dCA6ICJxc3RyaW5nIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gJyBzdHJpbmcNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgIicoPzpbXlxcXFxdfFxcXFwuKSo/JyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGltYWdpbmFyeQ0KICAgICAgICAgICAgcmVnZXggOiAiKD86IiArIGZsb2F0TnVtYmVyICsgInxcXGQrKVtqSl1cXGIiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgcmVnZXggOiBmbG9hdE51bWJlcg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gbG9uZyBpbnRlZ2VyDQogICAgICAgICAgICByZWdleCA6IGludGVnZXIgKyAiW2xMXVxcYiINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGludGVnZXINCiAgICAgICAgICAgIHJlZ2V4IDogaW50ZWdlciArICJcXGIiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluRnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PSAiZGVidWdnZXIiKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICByZWdleCA6ICJcXCt8XFwtfFxcKnxcXCpcXCp8XFwvfFxcL1xcL3wlfDw8fD4+fCZ8XFx8fFxcXnx+fDx8Pnw8PXw9Pnw9PXwhPXw8Pnw9Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJscGFyZW4ucGFyZW4iLA0KICAgICAgICAgICAgcmVnZXggOiAiW1xcW1xcKFxce10iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICByZWdleCA6ICJbXFxdXFwpXFx9XSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9IF0sDQogICAgICAgICJxcXN0cmluZyIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgIiIiIHN0cmluZyBlbmQNCiAgICAgICAgICAgIHJlZ2V4IDogJyg/OlteXFxcXF18XFxcXC4pKj8iezN9JywNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgfSBdLA0KICAgICAgICAicXN0cmluZyIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAvLyBtdWx0aSBsaW5lICcnJyBzdHJpbmcgZW5kDQogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXFxdfFxcXFwuKSo/J3szfSIsDQogICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgIH0gXQ0KICAgIH07DQp9Ow0KDQpvb3AuaW5oZXJpdHMoUHl0aG9uSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuUHl0aG9uSGlnaGxpZ2h0UnVsZXMgPSBQeXRob25IaWdobGlnaHRSdWxlczsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9weXRob25pYycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKG1hcmtlcnMpIHsNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG5ldyBSZWdFeHAoIig/OihbXFxbe10pfCgiICsgbWFya2VycyArICIpKSg/OlxccyopKD86Iy4qKT8kIik7DQp9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIG1hdGNoLmluZGV4KTsNCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbmRlbnRhdGlvbkJsb2NrKHNlc3Npb24sIHJvdywgbWF0Y2guaW5kZXggKyBtYXRjaFsyXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZW50YXRpb25CbG9jayhzZXNzaW9uLCByb3cpOw0KICAgICAgICB9DQogICAgfQ0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBTaGxvbW8gWmFsbWFuIEhlaWdoIDxzaGxvbW96YWxtYW5oZWlnaCBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvcnVieScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3J1YnlfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgUnVieUhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9ydWJ5X2hpZ2hsaWdodF9ydWxlcyIpLlJ1YnlIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBSdWJ5SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIHJlID0gL14oXHMqKSMvOw0KDQogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgew0KICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICIjIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXi4qW1x7XChcW11ccyokLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBTaGxvbW8gWmFsbWFuIEhlaWdoIDxzaGxvbW96YWxtYW5oZWlnaCBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvcnVieV9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgUnVieUhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB2YXIgYnVpbHRpbkZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJhYm9ydHxBcnJheXxhc3NlcnR8YXNzZXJ0X2VxdWFsfGFzc2VydF9ub3RfZXF1YWx8YXNzZXJ0X3NhbWV8YXNzZXJ0X25vdF9zYW1lfCIgKw0KICAgICAgICAiYXNzZXJ0X25pbHxhc3NlcnRfbm90X25pbHxhc3NlcnRfbWF0Y2h8YXNzZXJ0X25vX21hdGNofGFzc2VydF9pbl9kZWx0YXxhc3NlcnRfdGhyb3dzfCIgKyANCiAgICAgICAgImFzc2VydF9yYWlzZXxhc3NlcnRfbm90aGluZ19yYWlzZWR8YXNzZXJ0X2luc3RhbmNlX29mfGFzc2VydF9raW5kX29mfGFzc2VydF9yZXNwb25kX3RvfCIgKw0KICAgICAgICAiYXNzZXJ0X29wZXJhdG9yfGFzc2VydF9zZW5kfGFzc2VydF9kaWZmZXJlbmNlfGFzc2VydF9ub19kaWZmZXJlbmNlfGFzc2VydF9yZWNvZ25pemVzfCIgKw0KICAgICAgICAiYXNzZXJ0X2dlbmVyYXRlc3xhc3NlcnRfcmVzcG9uc2V8YXNzZXJ0X3JlZGlyZWN0ZWRfdG98YXNzZXJ0X3RlbXBsYXRlfGFzc2VydF9zZWxlY3R8IiArDQogICAgICAgICJhc3NlcnRfc2VsZWN0X2VtYWlsfGFzc2VydF9zZWxlY3RfcmpzfGFzc2VydF9zZWxlY3RfZW5jb2RlZHxjc3Nfc2VsZWN0fGF0X2V4aXR8IiArDQogICAgICAgICJhdHRyfGF0dHJfd3JpdGVyfGF0dHJfcmVhZGVyfGF0dHJfYWNjZXNzb3J8YXR0cl9hY2Nlc3NpYmxlfGF1dG9sb2FkfGJpbmRpbmd8YmxvY2tfZ2l2ZW4/fGNhbGxjY3wiICsNCiAgICAgICAgImNhbGxlcnxjYXRjaHxjaG9tcHxjaG9tcCF8Y2hvcHxjaG9wIXxkZWZpbmVkP3xkZWxldGVfdmlhX3JlZGlyZWN0fGV2YWx8ZXhlY3xleGl0fCIgKw0KICAgICAgICAiZXhpdCF8ZmFpbHxGbG9hdHxmbHVua3xmb2xsb3dfcmVkaXJlY3QhfGZvcmt8Zm9ybV9mb3J8Zm9ybV90YWd8Zm9ybWF0fGdldHN8Z2xvYmFsX3ZhcmlhYmxlc3xnc3VifCIgKw0KICAgICAgICAiZ3N1YiF8Z2V0X3ZpYV9yZWRpcmVjdHxofGhvc3QhfGh0dHBzP3xodHRwcyF8aW5jbHVkZXxJbnRlZ2VyfGxhbWJkYXxsaW5rX3RvfCIgKw0KICAgICAgICAibGlua190b191bmxlc3NfY3VycmVudHxsaW5rX3RvX2Z1bmN0aW9ufGxpbmtfdG9fcmVtb3RlfGxvYWR8bG9jYWxfdmFyaWFibGVzfGxvb3B8b3BlbnxvcGVuX3Nlc3Npb258IiArDQogICAgICAgICJwfHByaW50fHByaW50Znxwcm9jfHB1dGN8cHV0c3xwb3N0X3ZpYV9yZWRpcmVjdHxwdXRfdmlhX3JlZGlyZWN0fHJhaXNlfHJhbmR8IiArDQogICAgICAgICJyYXd8cmVhZGxpbmV8cmVhZGxpbmVzfHJlZGlyZWN0P3xyZXF1ZXN0X3ZpYV9yZWRpcmVjdHxyZXF1aXJlfHNjYW58c2VsZWN0fCIgKw0KICAgICAgICAic2V0X3RyYWNlX2Z1bmN8c2xlZXB8c3BsaXR8c3ByaW50ZnxzcmFuZHxTdHJpbmd8c3R5bGVzaGVldF9saW5rX3RhZ3xzeXNjYWxsfHN5c3RlbXxzdWJ8c3ViIXx0ZXN0fCIgKw0KICAgICAgICAidGhyb3d8dHJhY2VfdmFyfHRyYXB8dW50cmFjZV92YXJ8YXRhbjJ8Y29zfGV4cHxmcmV4cHxsZGV4cHxsb2d8bG9nMTB8c2lufHNxcnR8dGFufCIgKw0KICAgICAgICAicmVuZGVyfGphdmFzY3JpcHRfaW5jbHVkZV90YWd8Y3NyZl9tZXRhX3RhZ3xsYWJlbF90YWd8dGV4dF9maWVsZF90YWd8c3VibWl0X3RhZ3xjaGVja19ib3hfdGFnfCIgKw0KICAgICAgICAiY29udGVudF90YWd8cmFkaW9fYnV0dG9uX3RhZ3x0ZXh0X2FyZWFfdGFnfHBhc3N3b3JkX2ZpZWxkX3RhZ3xoaWRkZW5fZmllbGRfdGFnfCIgKw0KICAgICAgICAiZmllbGRzX2ZvcnxzZWxlY3RfdGFnfG9wdGlvbnNfZm9yX3NlbGVjdHxvcHRpb25zX2Zyb21fY29sbGVjdGlvbl9mb3Jfc2VsZWN0fGNvbGxlY3Rpb25fc2VsZWN0fCIgKw0KICAgICAgICAidGltZV96b25lX3NlbGVjdHxzZWxlY3RfZGF0ZXxzZWxlY3RfdGltZXxzZWxlY3RfZGF0ZXRpbWV8ZGF0ZV9zZWxlY3R8dGltZV9zZWxlY3R8ZGF0ZXRpbWVfc2VsZWN0fCIgKw0KICAgICAgICAic2VsZWN0X3llYXJ8c2VsZWN0X21vbnRofHNlbGVjdF9kYXl8c2VsZWN0X2hvdXJ8c2VsZWN0X21pbnV0ZXxzZWxlY3Rfc2Vjb25kfGZpbGVfZmllbGRfdGFnfCIgKw0KICAgICAgICAiZmlsZV9maWVsZHxyZXNwb25kX3RvfHNraXBfYmVmb3JlX2ZpbHRlcnxhcm91bmRfZmlsdGVyfGFmdGVyX2ZpbHRlcnx2ZXJpZnl8IiArDQogICAgICAgICJwcm90ZWN0X2Zyb21fZm9yZ2VyeXxyZXNjdWVfZnJvbXxoZWxwZXJfbWV0aG9kfHJlZGlyZWN0X3RvfGJlZm9yZV9maWx0ZXJ8IiArDQogICAgICAgICJzZW5kX2RhdGF8c2VuZF9maWxlfHZhbGlkYXRlc19wcmVzZW5jZV9vZnx2YWxpZGF0ZXNfdW5pcXVlbmVzc19vZnx2YWxpZGF0ZXNfbGVuZ3RoX29mfCIgKw0KICAgICAgICAidmFsaWRhdGVzX2Zvcm1hdF9vZnx2YWxpZGF0ZXNfYWNjZXB0YW5jZV9vZnx2YWxpZGF0ZXNfYXNzb2NpYXRlZHx2YWxpZGF0ZXNfZXhjbHVzaW9uX29mfCIgKw0KICAgICAgICAidmFsaWRhdGVzX2luY2x1c2lvbl9vZnx2YWxpZGF0ZXNfbnVtZXJpY2FsaXR5X29mfHZhbGlkYXRlc193aXRofHZhbGlkYXRlc19lYWNofCIgKw0KICAgICAgICAiYXV0aGVudGljYXRlX29yX3JlcXVlc3Rfd2l0aF9odHRwX2Jhc2ljfGF1dGhlbnRpY2F0ZV9vcl9yZXF1ZXN0X3dpdGhfaHR0cF9kaWdlc3R8IiArDQogICAgICAgICJmaWx0ZXJfcGFyYW1ldGVyX2xvZ2dpbmd8bWF0Y2h8Z2V0fHBvc3R8cmVzb3VyY2VzfHJlZGlyZWN0fHNjb3BlfGFzc2VydF9yb3V0aW5nfCIgKw0KICAgICAgICAidHJhbnNsYXRlfGxvY2FsaXplfGV4dHJhY3RfbG9jYWxlX2Zyb21fdGxkfHR8bHxjYWNoZXNfcGFnZXxleHBpcmVfcGFnZXxjYWNoZXNfYWN0aW9ufGV4cGlyZV9hY3Rpb258IiArDQogICAgICAgICJjYWNoZXxleHBpcmVfZnJhZ21lbnR8ZXhwaXJlX2NhY2hlX2ZvcnxvYnNlcnZlfGNhY2hlX3N3ZWVwZXJ8IiArDQogICAgICAgICJoYXNfbWFueXxoYXNfb25lfGJlbG9uZ3NfdG98aGFzX2FuZF9iZWxvbmdzX3RvX21hbnkiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJhbGlhc3xhbmR8QkVHSU58YmVnaW58YnJlYWt8Y2FzZXxjbGFzc3xkZWZ8ZGVmaW5lZHxkb3xlbHNlfGVsc2lmfEVORHxlbmR8ZW5zdXJlfCIgKw0KICAgICAgICAiX19GSUxFX198ZmluYWxseXxmb3J8Z2VtfGlmfGlufF9fTElORV9ffG1vZHVsZXxuZXh0fG5vdHxvcnxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8IiArIA0KICAgICAgICAicmVkb3xyZXNjdWV8cmV0cnl8cmV0dXJufHN1cGVyfHRoZW58dW5kZWZ8dW5sZXNzfHVudGlsfHdoZW58d2hpbGV8eWllbGQiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsZGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoInRydWV8VFJVRXxmYWxzZXxGQUxTRXxuaWx8TklMfEFSR0Z8QVJHVnxEQVRBfEVOVnxSVUJZX1BMQVRGT1JNfFJVQllfUkVMRUFTRV9EQVRFfCIgKw0KICAgICAgICAiUlVCWV9WRVJTSU9OfFNUREVSUnxTVERJTnxTVERPVVR8VE9QTEVWRUxfQklORElORyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGJ1aWx0aW5WYXJpYWJsZXMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiXCRERUJVR3xcJGRlZm91dHxcJEZJTEVOQU1FfFwkTE9BRF9QQVRIfFwkU0FGRXxcJHN0ZGlufFwkc3Rkb3V0fFwkc3RkZXJyfFwkVkVSQk9TRXwiICsNCiAgICAgICAgIiQhfHJvb3RfdXJsfGZsYXNofHNlc3Npb258Y29va2llc3xwYXJhbXN8cmVxdWVzdHxyZXNwb25zZXxsb2dnZXIiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4NCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkDQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIjLiokIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXlw9YmVnaW4kIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWy9dKD86KD86XFxbKD86XFxcXF18W15cXF1dKStcXF0pfCg/OlxcXFwvfFteXFxdL10pKSpbL11cXHcqXFxzKig/PVspLiw7XXwkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIGJhY2t0aWNrIHN0cmluZw0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltgXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bYF0iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsIC8vIG5hbWVzcGFjZXMgYXJlbid0IHN5bWJvbHMNCiAgICAgICAgICAgICAgICByZWdleCA6ICI6OiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ2YXJpYWJsZS5pbnN0YW5jY2UiLCAvLyBpbnN0YW5jZSB2YXJpYWJsZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIkB7MSwyfSg/OlthLXpBLVpfXXxcZCkrIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInZhcmlhYmxlLmNsYXNzIiwgLy8gY2xhc3MgbmFtZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltBLVpdKD86W2EtekEtWl9dfFxkKSsiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc3ltYm9sDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWzpdKD86W0EtWmEtel9dfFtAJF0oPz1bYS16QS1aMC05X10pKVthLXpBLVowLTlfXSpbIT0/XT8iDQogICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXSg/OlswLTlhLWZBLUZdfF8oPz1bMC05YS1mQS1GXSkpKlxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCg/OlxcZHxfKD89XFxkKSkqKD86KD86XFwuXFxkKD86XFxkfF8oPz1cXGQpKSopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJzZWxmIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluVmFyaWFibGVzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluRnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJkZWJ1Z2dlciIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGlkZW50aWZpZXJzDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIl5cPWVuZCQiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQp9Ow0KDQpvb3AuaW5oZXJpdHMoUnVieUhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLlJ1YnlIaWdobGlnaHRSdWxlcyA9IFJ1YnlIaWdobGlnaHRSdWxlczsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7DQogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7DQoNCiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsNCiAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IGRvYy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59KTsNCg0KICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsNCn0pOw0KOw0KICAgICAgICAgICAgKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpDQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgIA==]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBHYXN0w7NuIEtsZWltYW4gPGdhc3Rvbi5rbGVpbWFuIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9zY2FkJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvc2NhZF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIHNjYWRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vc2NhZF9oaWdobGlnaHRfcnVsZXMiKS5zY2FkSGlnaGxpZ2h0UnVsZXM7DQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSByZXF1aXJlKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudDsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyOw0KdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IHNjYWRIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOw0KICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsNCiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgQ3N0eWxlQmVoYXZpb3VyKCk7DQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgQ1N0eWxlRm9sZE1vZGUoKTsNCn07DQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOw0KICAgICAgICB2YXIgcmUgPSAvXihccyopXC9cLy87DQoNCiAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG91dGRlbnQpIHsNCiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi8vIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KICAgICAgICB2YXIgZW5kU3RhdGUgPSB0b2tlbml6ZWRMaW5lLnN0YXRlOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKltce1woXFtdXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSAiZG9jLXN0YXJ0Iikgew0KICAgICAgICAgICAgaWYgKGVuZFN0YXRlID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eXHMqKFwvPylcKi8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7DQogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAiICI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiKiAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBHYXN0w7NuIEtsZWltYW4gPGdhc3Rvbi5rbGVpbWFuIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQmFzZWQgb24gQmVzcGluJ3MgQy9DKysgU3ludGF4IFBsdWdpbiBieSBNYXJjIE1jSW50eXJlLg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvc2NhZF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIHNjYWRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIm1vZHVsZXxpZnxlbHNlfGZvciIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiTlVMTCIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0U3RhcnRSdWxlKCJzdGFydCIpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdLipcXFxcJCcsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJxcXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudCIsIC8vIDxDT05TVEFOVD4NCiAgICAgICAgICAgICAgcmVnZXggOiAiPFthLXpBLVowLTkuXSs+Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwgLy8gcHJlLWNvbXBpbGVyIGRpcmVjdGl2cw0KICAgICAgICAgICAgICByZWdleCA6ICIoPzp1c2V8aW5jbHVkZSkiDQogICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJ0aGlzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT18PXwhPXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxcXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcoPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/IicsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFzdHJpbmciIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZW1iZWRSdWxlcyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsICJkb2MtIiwNCiAgICAgICAgWyBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0RW5kUnVsZSgic3RhcnQiKSBdKTsNCn07DQoNCm9vcC5pbmhlcml0cyhzY2FkSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuc2NhZEhpZ2hsaWdodFJ1bGVzID0gc2NhZEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYy50YWciLA0KICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiVE9ETyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4iDQogICAgICAgIH1dDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0U3RhcnRSdWxlID0gZnVuY3Rpb24oc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKig/PVxcKikiLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRFbmRSdWxlID0gZnVuY3Rpb24gKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwqXFwvIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KDQp9KS5jYWxsKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcy5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91ciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7DQoNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAneycgKyBzZWxlY3RlZCArICd9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnfScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBzZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1uICsgMX0pOw0KICAgICAgICAgICAgICAgIGlmICghb3BlbkJyYWNlUG9zKQ0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQoNCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5nZXROZXh0TGluZUluZGVudChzdGF0ZSwgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSwgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5lbmQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoJyArIHNlbGVjdGVkICsgJyknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICcpJykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICcoJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICciJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJyInICsgc2VsZWN0ZWQgKyAnIicsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICAgICAgdmFyIGxlZnRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbi0xLCBjdXJzb3IuY29sdW1uKTsNCg0KICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGVzY2FwZWQuDQogICAgICAgICAgICAgICAgaWYgKGxlZnRDaGFyID09ICdcXCcpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMoc2VsZWN0aW9uLnN0YXJ0LnJvdywgc2VsZWN0aW9uLnN0YXJ0LnJvdylbMF0udG9rZW5zOw0KICAgICAgICAgICAgICAgIHZhciBjb2wgPSAwLCB0b2tlbjsNCiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4NCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdG9rZW5zLmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOw0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gLTE7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSB0b2tlbi52YWx1ZS5pbmRleE9mKCciJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0Lg0KICAgICAgICAgICAgICAgIGlmICghdG9rZW4gfHwgKHF1b3RlcG9zIDwgMCAmJiB0b2tlbi50eXBlICE9PSAiY29tbWVudCIgJiYgKHRva2VuLnR5cGUgIT09ICJzdHJpbmciIHx8ICgoc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbiAhPT0gdG9rZW4udmFsdWUubGVuZ3RoK2NvbC0xKSAmJiB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZignIicpID09PSB0b2tlbi52YWx1ZS5sZW5ndGgtMSkpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGlucHV0IGFuZCBtb3ZlIHJpZ2h0IG9uZSBpZiB3ZSdyZSB0eXBpbmcgb3ZlciB0aGUgY2xvc2luZyBxdW90ZS4NCiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICciJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KfQ0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsNCg0KZXhwb3J0cy5Dc3R5bGVCZWhhdmlvdXIgPSBDc3R5bGVCZWhhdmlvdXI7DQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOw0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9Ow0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoIXN0YXJ0KQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7DQogICAgICAgICAgICBlbmQuY29sdW1uLS07DQoNCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[ZGVmaW5lKCdhY2UvbW9kZS9zY2FsYScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvamF2YXNjcmlwdCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3NjYWxhX2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBKYXZhU2NyaXB0TW9kZSA9IHJlcXVpcmUoIi4vamF2YXNjcmlwdCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIFNjYWxhSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3NjYWxhX2hpZ2hsaWdodF9ydWxlcyIpLlNjYWxhSGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgSmF2YVNjcmlwdE1vZGUuY2FsbCh0aGlzKTsNCiAgICANCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBTY2FsYUhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIEphdmFTY3JpcHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jcmVhdGVXb3JrZXIgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9qYXZhc2NyaXB0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnLCAnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KdmFyIFdvcmtlckNsaWVudCA9IHJlcXVpcmUoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50Ow0KdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOw0KICAgICAgICB2YXIgcmUgPSAvXihccyopXC9cLy87DQoNCiAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG91dGRlbnQpIHsNCiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi8vIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KICAgICAgICB2YXIgZW5kU3RhdGUgPSB0b2tlbml6ZWRMaW5lLnN0YXRlOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09ICJkb2Mtc3RhcnQiKSB7DQogICAgICAgICAgICBpZiAoZW5kU3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eXHMqKFwvPylcKi8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7DQogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAiICI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiKiAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlckNsaWVudChbImFjZSJdLCAid29ya2VyLWphdmFzY3JpcHQuanMiLCAiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCAiSmF2YVNjcmlwdFdvcmtlciIpOw0KICAgICAgICB3b3JrZXIuYXR0YWNoVG9Eb2N1bWVudChzZXNzaW9uLmdldERvY3VtZW50KCkpOw0KICAgICAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigianNsaW50IiwgZnVuY3Rpb24ocmVzdWx0cykgew0KICAgICAgICAgICAgdmFyIGVycm9ycyA9IFtdOw0KICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHJlc3VsdHMuZGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IHJlc3VsdHMuZGF0YVtpXTsNCiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpDQogICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZXJyb3IubGluZS0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBlcnJvci5jaGFyYWN0ZXItMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yLnJlYXNvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbnQ6IGVycm9yDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhlcnJvcnMpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigibmFyY2lzc3VzIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhbZS5kYXRhXSk7DQogICAgICAgIH0pOw0KICAgICAgICANCiAgICAgICAgd29ya2VyLm9uKCJ0ZXJtaW5hdGUiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHNlc3Npb24uY2xlYXJBbm5vdGF0aW9ucygpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHJldHVybiB3b3JrZXI7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvdW5pY29kZScsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgdW5pY29kZSA9IHJlcXVpcmUoIi4uL3VuaWNvZGUiKTsNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICAvLyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzDQogICAgdmFyIGdsb2JhbHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAvLyBDb25zdHJ1Y3RvcnMNCiAgICAgICAgKCJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fCIgKw0KICAgICAgLy8gRTRYDQogICAgICAgICAiTmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fCIgKw0KICAgICAgICAgIkFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXwiICsNCiAgICAgICAgICJVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fCIgKw0KICAgICAgLy8gRXJyb3JzDQogICAgICAgICJFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258IiArDQogICAgICAgICJTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8IiArDQogICAgICAvLyAgTm9uLWNvbnN0cnVjdG9yIGZ1bmN0aW9ucw0KICAgICAgICAiZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8IiArDQogICAgICAgICJpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fCIgKw0KICAgICAgLy8gT3RoZXINCiAgICAgICAgIkpTT058TWF0aHwiICsNCiAgICAgIC8vIFBzZXVkbw0KICAgICAgICAidGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCINCiAgICAgICkuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufCIgKw0KICAgICAgICAiaWZ8aW58aW5zdGFuY2VvZnxuZXd8cmV0dXJufHN3aXRjaHx0aHJvd3x0cnl8dHlwZW9mfGxldHx2YXJ8d2hpbGV8d2l0aHwiICsNCiAgICAgICAgImNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Iikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyBrZXl3b3JkcyB3aGljaCBjYW4gYmUgZm9sbG93ZWQgYnkgcmVndWxhciBleHByZXNzaW9ucw0KICAgIHZhciBrd0JlZm9yZVJlID0gImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGQiOw0KDQogICAgdmFyIGRlcHJlY2F0ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZGVmaW5pdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoKCJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIikuc3BsaXQoInwiKSk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBmdXR1cmVSZXNlcnZlZCA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXwiICsNCiAgICAgICAgInB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMNCiAgICB2YXIgaWRlbnRpZmllclJlID0gIlsiICsgdW5pY29kZS5wYWNrYWdlcy5MICsgIlxcJF9dWyIgDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5MDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5NbiArIHVuaWNvZGUucGFja2FnZXMuTWMNCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLk5kDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5QYyArICJcXCRfXSpcXGIiOw0KICAgICAgICANCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXS4qXFxcXCQnLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXS4qXFxcXCQiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiBbImtleXdvcmQuZGVmaW5pdGlvbiIsICJ0ZXh0IiwgImVudGl0eS5uYW1lLmZ1bmN0aW9uIl0sDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKGZ1bmN0aW9uKShcXHMrKSgiICsgaWRlbnRpZmllclJlICsgIikiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86dHJ1ZXxmYWxzZSlcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86IiArIGt3QmVmb3JlUmUgKyAiKVxcYiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlcHJlY2F0ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmRlcHJlY2F0ZWQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWZpbml0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQuZGVmaW5pdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1dHVyZVJlc2VydmVkLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gImRlYnVnZ2VyIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogaWRlbnRpZmllclJlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXD98XFw6fFxcLHxcXDt8XFwuIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iLA0KICAgICAgICAgICAgICAgIG5leHQgIDogInJlZ2V4X2FsbG93ZWQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLz0/IiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJeIyEuKiQiIA0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIG9ubHkgYWxsb3dlZCBhZnRlciBjZXJ0YWluIHRva2Vucy4gVGhpcw0KICAgICAgICAvLyBtYWtlcyBzdXJlIHdlIGRvbid0IG1peCB1cCByZWdleHBzIHdpdGggdGhlIGRpdmlzb24gb3BlcmF0b3INCiAgICAgICAgInJlZ2V4X2FsbG93ZWQiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudF9yZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSByZXR1cm4gdG8gdGhlIHN0YXJ0IG1vZGUgd2l0aG91dCBtYXRjaGluZw0KICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nDQogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJyZWdleCI6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiDQogICAgICAgICAgICB9LCB7DQoJCQkJLy8gZmxhZw0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiL1xcdyoiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUgDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXC9cXFtdKyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFxbIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiANCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyI6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiW15cXFxcXFxdXSsiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiIA0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudF9yZWdleF9hbGxvd2VkIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXFzdHJpbmciIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCAiZG9jLSIsDQogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IEphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MudGFnIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIkBbXFx3XFxkX10rIiAvLyBUT0RPOiBmaXggZW1haWwgYWRkcmVzc2VzDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlRPRE8iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlteQFxcKl0rIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICIuIg0KICAgICAgICB9XQ0KICAgIH07DQp9Ow0KDQpvb3AuaW5oZXJpdHMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmdldFN0YXJ0UnVsZSA9IGZ1bmN0aW9uKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGRvYyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXC9cXCooPz1cXCopIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0RW5kUnVsZSA9IGZ1bmN0aW9uIChzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcKlxcLyIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCg0KfSkuY2FsbChEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7DQogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7DQoNCiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsNCiAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IGRvYy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59KTsNCg0KICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQoNCnZhciBXb3JrZXJDbGllbnQgPSBmdW5jdGlvbih0b3BMZXZlbE5hbWVzcGFjZXMsIHBhY2thZ2VkSnMsIG1vZCwgY2xhc3NuYW1lKSB7DQoNCiAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gdGhpcy5jaGFuZ2VMaXN0ZW5lci5iaW5kKHRoaXMpOw0KDQogICAgaWYgKG1vZHVsZS5wYWNrYWdlZCkgew0KICAgICAgICB2YXIgYmFzZSA9IHRoaXMuJGd1ZXNzQmFzZVBhdGgoKTsNCiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcihiYXNlICsgcGFja2FnZWRKcyk7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICB2YXIgd29ya2VyVXJsID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybCgiYWNlL3dvcmtlci93b3JrZXIiLCBudWxsLCAiXyIpKTsNCiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJVcmwpOw0KDQogICAgICAgIHZhciB0bG5zID0ge307DQogICAgICAgIGZvciAodmFyIGk9MDsgaTx0b3BMZXZlbE5hbWVzcGFjZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBucyA9IHRvcExldmVsTmFtZXNwYWNlc1tpXTsNCiAgICAgICAgICAgIHZhciBwYXRoID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybChucywgbnVsbCwgIl8iKS5yZXBsYWNlKC8uanMkLywgIiIpKTsNCg0KICAgICAgICAgICAgdGxuc1tuc10gPSBwYXRoOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHsNCiAgICAgICAgaW5pdCA6IHRydWUsDQogICAgICAgIHRsbnM6IHRsbnMsDQogICAgICAgIG1vZHVsZTogbW9kLA0KICAgICAgICBjbGFzc25hbWU6IGNsYXNzbmFtZQ0KICAgIH0pOw0KDQogICAgdGhpcy5jYWxsYmFja0lkID0gMTsNCiAgICB0aGlzLmNhbGxiYWNrcyA9IHt9Ow0KDQogICAgdmFyIF9zZWxmID0gdGhpczsNCiAgICB0aGlzLiR3b3JrZXIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2coZSk7DQogICAgICAgIHRocm93IGU7DQogICAgfTsNCiAgICB0aGlzLiR3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24oZSkgew0KICAgICAgICB2YXIgbXNnID0gZS5kYXRhOw0KICAgICAgICBzd2l0Y2gobXNnLnR5cGUpIHsNCiAgICAgICAgICAgIGNhc2UgImxvZyI6DQogICAgICAgICAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2cobXNnLmRhdGEpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlICJldmVudCI6DQogICAgICAgICAgICAgICAgX3NlbGYuX2VtaXQobXNnLm5hbWUsIHtkYXRhOiBtc2cuZGF0YX0pOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlICJjYWxsIjoNCiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfc2VsZi5jYWxsYmFja3NbbXNnLmlkXTsNCiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsNCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobXNnLmRhdGEpOw0KICAgICAgICAgICAgICAgICAgICBkZWxldGUgX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfTsNCn07DQoNCihmdW5jdGlvbigpew0KDQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KDQogICAgdGhpcy4kbm9ybWFsaXplUGF0aCA9IGZ1bmN0aW9uKHBhdGgpIHsNCiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlthLXpdKzpcL1wvW15cL10rXC8vLCAiIik7IC8vIFJlbW92ZSBkb21haW4gbmFtZSBhbmQgcmVidWlsZCBpdA0KICAgICAgICBwYXRoID0gbG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsgbG9jYXRpb24uaG9zdA0KICAgICAgICAgICAgLy8gcGF0aHMgc3RhcnRpbmcgd2l0aCBhIHNsYXNoIGFyZSByZWxhdGl2ZSB0byB0aGUgcm9vdCAoaG9zdCkNCiAgICAgICAgICAgICsgKHBhdGguY2hhckF0KDApID09ICIvIiA/ICIiIDogbG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywgIiIpKQ0KICAgICAgICAgICAgKyAiLyIgKyBwYXRoLnJlcGxhY2UoL15bXC9dKy8sICIiKTsNCiAgICAgICAgcmV0dXJuIHBhdGg7DQogICAgfTsNCg0KICAgIHRoaXMuJGd1ZXNzQmFzZVBhdGggPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHJlcXVpcmUuYWNlQmFzZVVybCkNCiAgICAgICAgICAgIHJldHVybiByZXF1aXJlLmFjZUJhc2VVcmw7DQoNCiAgICAgICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7DQogICAgICAgIGZvciAodmFyIGk9MDsgaTxzY3JpcHRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgc2NyaXB0ID0gc2NyaXB0c1tpXTsNCg0KICAgICAgICAgICAgdmFyIGJhc2UgPSBzY3JpcHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjZS1iYXNlIik7DQogICAgICAgICAgICBpZiAoYmFzZSkNCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5yZXBsYWNlKC9cLyokLywgIi8iKTsNCg0KICAgICAgICAgICAgdmFyIHNyYyA9IHNjcmlwdC5zcmMgfHwgc2NyaXB0LmdldEF0dHJpYnV0ZSgic3JjIik7DQogICAgICAgICAgICBpZiAoIXNyYykgew0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG0gPSBzcmMubWF0Y2goL14oPzooLipcLylhY2VcLmpzfCguKlwvKWFjZSgtdW5jb21wcmVzc2VkKT8oLW5vY29uZmxpY3QpP1wuanMpKD86XD98JCkvKTsNCiAgICAgICAgICAgIGlmIChtKQ0KICAgICAgICAgICAgICAgIHJldHVybiBtWzFdIHx8IG1bMl07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCiAgICB0aGlzLnRlcm1pbmF0ZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLl9lbWl0KCJ0ZXJtaW5hdGUiLCB7fSk7DQogICAgICAgIHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKTsNCiAgICAgICAgdGhpcy4kd29ya2VyID0gbnVsbDsNCiAgICAgICAgdGhpcy4kZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOw0KICAgICAgICB0aGlzLiRkb2MgPSBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbmQgPSBmdW5jdGlvbihjbWQsIGFyZ3MpIHsNCiAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOiBjbWQsIGFyZ3M6IGFyZ3N9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5jYWxsID0gZnVuY3Rpb24oY21kLCBhcmdzLCBjYWxsYmFjaykgew0KICAgICAgICBpZiAoY2FsbGJhY2spIHsNCiAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuY2FsbGJhY2tJZCsrOw0KICAgICAgICAgICAgdGhpcy5jYWxsYmFja3NbaWRdID0gY2FsbGJhY2s7DQogICAgICAgICAgICBhcmdzLnB1c2goaWQpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuc2VuZChjbWQsIGFyZ3MpOw0KICAgIH07DQoNCiAgICB0aGlzLmVtaXQgPSBmdW5jdGlvbihldmVudCwgZGF0YSkgew0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgLy8gZmlyZWZveCByZWZ1c2VzIHRvIGNsb25lIG9iamVjdHMgd2hpY2ggaGF2ZSBmdW5jdGlvbiBwcm9wZXJ0aWVzDQogICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIGV2ZW50DQogICAgICAgICAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2V2ZW50OiBldmVudCwgZGF0YToge2RhdGE6IGRhdGEuZGF0YX19KTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChleCkge30NCiAgICB9Ow0KDQogICAgdGhpcy5hdHRhY2hUb0RvY3VtZW50ID0gZnVuY3Rpb24oZG9jKSB7DQogICAgICAgIGlmKHRoaXMuJGRvYykNCiAgICAgICAgICAgIHRoaXMudGVybWluYXRlKCk7DQoNCiAgICAgICAgdGhpcy4kZG9jID0gZG9jOw0KICAgICAgICB0aGlzLmNhbGwoInNldFZhbHVlIiwgW2RvYy5nZXRWYWx1ZSgpXSk7DQogICAgICAgIGRvYy5vbigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7DQogICAgfTsNCg0KICAgIHRoaXMuY2hhbmdlTGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIGUucmFuZ2UgPSB7DQogICAgICAgICAgICBzdGFydDogZS5kYXRhLnJhbmdlLnN0YXJ0LA0KICAgICAgICAgICAgZW5kOiBlLmRhdGEucmFuZ2UuZW5kDQogICAgICAgIH07DQogICAgICAgIHRoaXMuZW1pdCgiY2hhbmdlIiwgZSk7DQogICAgfTsNCg0KfSkuY2FsbChXb3JrZXJDbGllbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Xb3JrZXJDbGllbnQgPSBXb3JrZXJDbGllbnQ7DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmVoYXZpb3VyID0gcmVxdWlyZSgnLi4vYmVoYXZpb3VyJykuQmVoYXZpb3VyOw0KDQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgew0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3snICsgc2VsZWN0ZWQgKyAnfScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7fScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJ30nKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJ30nLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiArIDF9KTsNCiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykNCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KDQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCcgKyBzZWxlY3RlZCArICcpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnKScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnKScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7DQoNCiAgICAgICAgICAgICAgICAvLyBXZSdyZSBlc2NhcGVkLg0KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIEZpbmQgd2hhdCB0b2tlbiB3ZSdyZSBpbnNpZGUuDQogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHNlbGVjdGlvbi5zdGFydC5yb3csIHNlbGVjdGlvbi5zdGFydC5yb3cpWzBdLnRva2VuczsNCiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47DQogICAgICAgICAgICAgICAgdmFyIHF1b3RlcG9zID0gLTE7IC8vIFRyYWNrIHdoZXRoZXIgd2UncmUgaW5zaWRlIGFuIG9wZW4gcXVvdGUuDQoNCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1t4XTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1b3RlcG9zIDwgMCkgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gdG9rZW4udmFsdWUuaW5kZXhPZignIicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgodG9rZW4udmFsdWUubGVuZ3RoICsgY29sKSA+IHNlbGVjdGlvbi5zdGFydC5jb2x1bW4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbCArPSB0b2tlbnNbeF0udmFsdWUubGVuZ3RoOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIFRyeSBhbmQgYmUgc21hcnQgYWJvdXQgd2hlbiB3ZSBhdXRvIGluc2VydC4NCiAgICAgICAgICAgICAgICBpZiAoIXRva2VuIHx8IChxdW90ZXBvcyA8IDAgJiYgdG9rZW4udHlwZSAhPT0gImNvbW1lbnQiICYmICh0b2tlbi50eXBlICE9PSAic3RyaW5nIiB8fCAoKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gIT09IHRva2VuLnZhbHVlLmxlbmd0aCtjb2wtMSkgJiYgdG9rZW4udmFsdWUubGFzdEluZGV4T2YoJyInKSA9PT0gdG9rZW4udmFsdWUubGVuZ3RoLTEpKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICciIicsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgPT09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnB1dCBhbmQgbW92ZSByaWdodCBvbmUgaWYgd2UncmUgdHlwaW5nIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuDQogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCn0NCm9vcC5pbmhlcml0cyhDc3R5bGVCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOw0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gLyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS87DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOw0KDQogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpICsgbWF0Y2hbMF0ubGVuZ3RoKTsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChmb2xkU3R5bGUgIT09ICJtYXJrYmVnaW5lbmQiKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7DQogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBpfTsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKCFzdGFydCkNCiAgICAgICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgICAgIHN0YXJ0LmNvbHVtbisrOw0KICAgICAgICAgICAgZW5kLmNvbHVtbi0tOw0KDQogICAgICAgICAgICByZXR1cm4gIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSBudWxsOw0KDQogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZw0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJzdGFydCI7DQogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJlbmQiOw0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLmluZGVudGF0aW9uQmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgcmUgPSAvXlxzKi87DQogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOw0KICAgICAgICB2YXIgc3RhcnRMZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkNCiAgICAgICAgDQogICAgICAgIHdoaWxlICgrK3JvdyA8IG1heFJvdykgew0KICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpDQogICAgICAgICAgICAgICAgY29udGludWU7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBlbmRSb3cgPSByb3c7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7DQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsNCiAgICAgICAgdmFyIGVuZCA9IHNlc3Npb24uJGZpbmRDbG9zaW5nQnJhY2tldChicmFja2V0LCBzdGFydCk7DQogICAgICAgIGlmICghZW5kKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107DQogICAgICAgIGlmIChmdyA9PSBudWxsKQ0KICAgICAgICAgICAgZncgPSB0aGlzLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZW5kLnJvdyk7DQoNCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIGVuZC5yb3cgLS07DQogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOw0KZGVmaW5lKCdhY2UvbW9kZS9zY2FsYV9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIFNjYWxhSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIC8vIHRha2VuIGZyb20gaHR0cDovL2Rvd25sb2FkLm9yYWNsZS5jb20vamF2YXNlL3R1dG9yaWFsL2phdmEvbnV0c2FuZGJvbHRzL19rZXl3b3Jkcy5odG1sDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoDQogICAgICAgICAgICAiY2FzZXxkZWZhdWx0fGRvfGVsc2V8Zm9yfGlmfG1hdGNofHdoaWxlfHRocm93fHJldHVybnx0cnl8Y2F0Y2h8ZmluYWxseXx5aWVsZHwiICsNCiAgICAgICAgICAgICJhYnN0cmFjdHxjbGFzc3xkZWZ8ZXh0ZW5kc3xmaW5hbHxmb3JTb21lfGltcGxpY2l0fGltcGxpY2l0c3xpbXBvcnR8bGF6eXxuZXd8b2JqZWN0fCIgKw0KICAgICAgICAgICAgIm92ZXJyaWRlfHBhY2thZ2V8cHJpdmF0ZXxwcm90ZWN0ZWR8c2VhbGVkfHN1cGVyfHRoaXN8dHJhaXR8dHlwZXx2YWx8dmFyfHdpdGgiDQogICAgICAgICkuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJ0cnVlfGZhbHNlIikuc3BsaXQoInwiKQ0KICAgICk7DQogICAgDQogICAgdmFyIGxhbmdDbGFzc2VzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIkFic3RyYWN0TWV0aG9kRXJyb3J8QXNzZXJ0aW9uRXJyb3J8Q2xhc3NDaXJjdWxhcml0eUVycm9yfCIrDQogICAgICAgICJDbGFzc0Zvcm1hdEVycm9yfERlcHJlY2F0ZWR8RW51bUNvbnN0YW50Tm90UHJlc2VudEV4Y2VwdGlvbnwiKw0KICAgICAgICAiRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yfElsbGVnYWxBY2Nlc3NFcnJvcnwiKw0KICAgICAgICAiSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9ufEluc3RhbnRpYXRpb25FcnJvcnxJbnRlcm5hbEVycm9yfCIrDQoNCiAgICAgICAgIk5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9ufE5vU3VjaEZpZWxkRXJyb3J8T3ZlcnJpZGV8UHJvY2Vzc3wiKw0KICAgICAgICAiUHJvY2Vzc0J1aWxkZXJ8U2VjdXJpdHlNYW5hZ2VyfFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258IisNCiAgICAgICAgIlN1cHByZXNzV2FybmluZ3N8VHlwZU5vdFByZXNlbnRFeGNlcHRpb258VW5rbm93bkVycm9yfCIrDQogICAgICAgICJVbnNhdGlzZmllZExpbmtFcnJvcnxVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yfFZlcmlmeUVycm9yfCIrDQogICAgICAgICJJbnN0YW50aWF0aW9uRXhjZXB0aW9ufEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258IisNCiAgICAgICAgIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnxDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbnwiKw0KICAgICAgICAiTm9TdWNoRmllbGRFeGNlcHRpb258SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufE51bWJlckZvcm1hdEV4Y2VwdGlvbnwiKw0KICAgICAgICAiU2VjdXJpdHlFeGNlcHRpb258Vm9pZHxJbmhlcml0YWJsZVRocmVhZExvY2FsfElsbGVnYWxTdGF0ZUV4Y2VwdGlvbnwiKw0KICAgICAgICAiSW50ZXJydXB0ZWRFeGNlcHRpb258Tm9TdWNoTWV0aG9kRXhjZXB0aW9ufElsbGVnYWxBY2Nlc3NFeGNlcHRpb258IisNCiAgICAgICAgIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufEVudW18U3RyaWN0TWF0aHxQYWNrYWdlfENvbXBpbGVyfCIrDQogICAgICAgICJSZWFkYWJsZXxSdW50aW1lfFN0cmluZ0J1aWxkZXJ8TWF0aHxJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yfCIrDQogICAgICAgICJOb1N1Y2hNZXRob2RFcnJvcnxUaHJlYWRMb2NhbHxSdW50aW1lUGVybWlzc2lvbnxBcml0aG1ldGljRXhjZXB0aW9ufCIrDQogICAgICAgICJOdWxsUG9pbnRlckV4Y2VwdGlvbnxMb25nfEludGVnZXJ8U2hvcnR8Qnl0ZXxEb3VibGV8TnVtYmVyfEZsb2F0fCIrDQogICAgICAgICJDaGFyYWN0ZXJ8Qm9vbGVhbnxTdGFja1RyYWNlRWxlbWVudHxBcHBlbmRhYmxlfFN0cmluZ0J1ZmZlcnwiKw0KICAgICAgICAiSXRlcmFibGV8VGhyZWFkR3JvdXB8UnVubmFibGV8VGhyZWFkfElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb258IisNCiAgICAgICAgIlN0YWNrT3ZlcmZsb3dFcnJvcnxPdXRPZk1lbW9yeUVycm9yfFZpcnR1YWxNYWNoaW5lRXJyb3J8IisNCiAgICAgICAgIkFycmF5U3RvcmVFeGNlcHRpb258Q2xhc3NDYXN0RXhjZXB0aW9ufExpbmthZ2VFcnJvcnwiKw0KICAgICAgICAiTm9DbGFzc0RlZkZvdW5kRXJyb3J8Q2xhc3NOb3RGb3VuZEV4Y2VwdGlvbnxSdW50aW1lRXhjZXB0aW9ufCIrDQogICAgICAgICJFeGNlcHRpb258VGhyZWFkRGVhdGh8RXJyb3J8VGhyb3dhYmxlfFN5c3RlbXxDbGFzc0xvYWRlcnwiKw0KICAgICAgICAiQ2xvbmVhYmxlfENsYXNzfENoYXJTZXF1ZW5jZXxDb21wYXJhYmxlfFN0cmluZ3xPYmplY3R8IiArDQogICAgICAgICJVbml0fEFueXxBbnlWYWx8QW55UmVmfE51bGx8U2NhbGFPYmplY3R8U2luZ2xldG9ufFNlcXxJdGVyYWJsZXxMaXN0fCIgKw0KICAgICAgICAiT3B0aW9ufEFycmF5fENoYXJ8Qnl0ZXxTaG9ydHxJbnR8TG9uZ3xOb3RoaW5nIg0KICAgICAgICANCiAgICAgICAgKS5zcGxpdCgifCIpDQogICAgKTsNCiAgICANCiAgICB2YXIgaW1wb3J0Q2xhc3NlcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCIiKS5zcGxpdCgifCIpDQogICAgKTsNCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWy9dKD86KD86XFxbKD86XFxcXF18W15cXF1dKStcXF0pfCg/OlxcXFwvfFteXFxdL10pKSpbL11cXHcqXFxzKig/PVspLiw7XXwkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgNCiAgICAgICAgICAgICAgICByZWdleCA6ICIwW3hYXVswLTlhLWZBLUZdK1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzp0cnVlfGZhbHNlKVxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAidGhpcyIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGFuZ0NsYXNzZXMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW1wb3J0Q2xhc3Nlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzDQogICAgICAgICAgICAgICAgLy8gVE9ETzogVW5pY29kZSBpZGVudGlmaWVycw0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbWyh7XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfV0iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgImNvbW1lbnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLA0KICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKFNjYWxhSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuU2NhbGFIaWdobGlnaHRSdWxlcyA9IFNjYWxhSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvc2NzcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3Njc3NfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBTY3NzSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3Njc3NfaGlnaGxpZ2h0X3J1bGVzIikuU2Nzc0hpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgU2Nzc0hpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSwgImkiKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgQ1N0eWxlRm9sZE1vZGUoKTsNCn07DQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQogICAgDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICAvLyBpZ25vcmUgYnJhY2VzIGluIGNvbW1lbnRzDQogICAgICAgIHZhciB0b2tlbnMgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSkudG9rZW5zOw0KICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50Iikgew0KICAgICAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKlx7XHMqJC8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIGluZGVudCArPSB0YWI7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgIH07DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7DQogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3Njc3NfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIFNjc3NIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHZhciBwcm9wZXJ0aWVzID0gbGFuZy5hcnJheVRvTWFwKCAoZnVuY3Rpb24gKCkgew0KDQogICAgICAgIHZhciBicm93c2VyUHJlZml4ID0gKCItd2Via2l0LXwtbW96LXwtby18LW1zLXwtc3ZnLXwtcGllLXwta2h0bWwtIikuc3BsaXQoInwiKTsNCiAgICAgICAgDQogICAgICAgIHZhciBwcmVmaXhQcm9wZXJ0aWVzID0gKCJhcHBlYXJhbmNlfGJhY2tncm91bmQtY2xpcHxiYWNrZ3JvdW5kLWlubGluZS1wb2xpY3l8YmFja2dyb3VuZC1vcmlnaW58IiArIA0KICAgICAgICAgICAgICJiYWNrZ3JvdW5kLXNpemV8YmluZGluZ3xib3JkZXItYm90dG9tLWNvbG9yc3xib3JkZXItbGVmdC1jb2xvcnN8IiArIA0KICAgICAgICAgICAgICJib3JkZXItcmlnaHQtY29sb3JzfGJvcmRlci10b3AtY29sb3JzfGJvcmRlci1lbmR8Ym9yZGVyLWVuZC1jb2xvcnwiICsgDQogICAgICAgICAgICAgImJvcmRlci1lbmQtc3R5bGV8Ym9yZGVyLWVuZC13aWR0aHxib3JkZXItaW1hZ2V8Ym9yZGVyLXN0YXJ0fCIgKyANCiAgICAgICAgICAgICAiYm9yZGVyLXN0YXJ0LWNvbG9yfGJvcmRlci1zdGFydC1zdHlsZXxib3JkZXItc3RhcnQtd2lkdGh8Ym94LWFsaWdufCIgKyANCiAgICAgICAgICAgICAiYm94LWRpcmVjdGlvbnxib3gtZmxleHxib3gtZmxleGdyb3VwfGJveC1vcmRpbmFsLWdyb3VwfGJveC1vcmllbnR8IiArIA0KICAgICAgICAgICAgICJib3gtcGFja3xib3gtc2l6aW5nfGNvbHVtbi1jb3VudHxjb2x1bW4tZ2FwfGNvbHVtbi13aWR0aHxjb2x1bW4tcnVsZXwiICsgDQogICAgICAgICAgICAgImNvbHVtbi1ydWxlLXdpZHRofGNvbHVtbi1ydWxlLXN0eWxlfGNvbHVtbi1ydWxlLWNvbG9yfGZsb2F0LWVkZ2V8IiArIA0KICAgICAgICAgICAgICJmb250LWZlYXR1cmUtc2V0dGluZ3N8Zm9udC1sYW5ndWFnZS1vdmVycmlkZXxmb3JjZS1icm9rZW4taW1hZ2UtaWNvbnwiICsgDQogICAgICAgICAgICAgImltYWdlLXJlZ2lvbnxtYXJnaW4tZW5kfG1hcmdpbi1zdGFydHxvcGFjaXR5fG91dGxpbmV8b3V0bGluZS1jb2xvcnwiICsgDQogICAgICAgICAgICAgIm91dGxpbmUtb2Zmc2V0fG91dGxpbmUtcmFkaXVzfG91dGxpbmUtcmFkaXVzLWJvdHRvbWxlZnR8IiArIA0KICAgICAgICAgICAgICJvdXRsaW5lLXJhZGl1cy1ib3R0b21yaWdodHxvdXRsaW5lLXJhZGl1cy10b3BsZWZ0fG91dGxpbmUtcmFkaXVzLXRvcHJpZ2h0fCIgKyANCiAgICAgICAgICAgICAib3V0bGluZS1zdHlsZXxvdXRsaW5lLXdpZHRofHBhZGRpbmctZW5kfHBhZGRpbmctc3RhcnR8c3RhY2stc2l6aW5nfCIgKyANCiAgICAgICAgICAgICAidGFiLXNpemV8dGV4dC1ibGlua3x0ZXh0LWRlY29yYXRpb24tY29sb3J8dGV4dC1kZWNvcmF0aW9uLWxpbmV8IiArIA0KICAgICAgICAgICAgICJ0ZXh0LWRlY29yYXRpb24tc3R5bGV8dHJhbnNmb3JtfHRyYW5zZm9ybS1vcmlnaW58dHJhbnNpdGlvbnwiICsgDQogICAgICAgICAgICAgInRyYW5zaXRpb24tZGVsYXl8dHJhbnNpdGlvbi1kdXJhdGlvbnx0cmFuc2l0aW9uLXByb3BlcnR5fCIgKyANCiAgICAgICAgICAgICAidHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb258dXNlci1mb2N1c3x1c2VyLWlucHV0fHVzZXItbW9kaWZ5fHVzZXItc2VsZWN0fCIgKw0KICAgICAgICAgICAgICJ3aW5kb3ctc2hhZG93fGJvcmRlci1yYWRpdXMiKS5zcGxpdCgifCIpOw0KICAgICAgICANCiAgICAgICAgdmFyIHByb3BlcnRpZXMgPSAoImF6aW11dGh8YmFja2dyb3VuZC1hdHRhY2htZW50fGJhY2tncm91bmQtY29sb3J8YmFja2dyb3VuZC1pbWFnZXwiICsNCiAgICAgICAgICAgICJiYWNrZ3JvdW5kLXBvc2l0aW9ufGJhY2tncm91bmQtcmVwZWF0fGJhY2tncm91bmR8Ym9yZGVyLWJvdHRvbS1jb2xvcnwiICsNCiAgICAgICAgICAgICJib3JkZXItYm90dG9tLXN0eWxlfGJvcmRlci1ib3R0b20td2lkdGh8Ym9yZGVyLWJvdHRvbXxib3JkZXItY29sbGFwc2V8IiArDQogICAgICAgICAgICAiYm9yZGVyLWNvbG9yfGJvcmRlci1sZWZ0LWNvbG9yfGJvcmRlci1sZWZ0LXN0eWxlfGJvcmRlci1sZWZ0LXdpZHRofCIgKw0KICAgICAgICAgICAgImJvcmRlci1sZWZ0fGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHQtc3R5bGV8Ym9yZGVyLXJpZ2h0LXdpZHRofCIgKw0KICAgICAgICAgICAgImJvcmRlci1yaWdodHxib3JkZXItc3BhY2luZ3xib3JkZXItc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnwiICsNCiAgICAgICAgICAgICJib3JkZXItdG9wLXN0eWxlfGJvcmRlci10b3Atd2lkdGh8Ym9yZGVyLXRvcHxib3JkZXItd2lkdGh8Ym9yZGVyfCIgKw0KICAgICAgICAgICAgImJvdHRvbXxib3gtc2l6aW5nfGNhcHRpb24tc2lkZXxjbGVhcnxjbGlwfGNvbG9yfGNvbnRlbnR8Y291bnRlci1pbmNyZW1lbnR8IiArDQogICAgICAgICAgICAiY291bnRlci1yZXNldHxjdWUtYWZ0ZXJ8Y3VlLWJlZm9yZXxjdWV8Y3Vyc29yfGRpcmVjdGlvbnxkaXNwbGF5fCIgKw0KICAgICAgICAgICAgImVsZXZhdGlvbnxlbXB0eS1jZWxsc3xmbG9hdHxmb250LWZhbWlseXxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXwiICsNCiAgICAgICAgICAgICJmb250LXN0cmV0Y2h8Zm9udC1zdHlsZXxmb250LXZhcmlhbnR8Zm9udC13ZWlnaHR8Zm9udHxoZWlnaHR8bGVmdHwiICsNCiAgICAgICAgICAgICJsZXR0ZXItc3BhY2luZ3xsaW5lLWhlaWdodHxsaXN0LXN0eWxlLWltYWdlfGxpc3Qtc3R5bGUtcG9zaXRpb258IiArDQogICAgICAgICAgICAibGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGV8bWFyZ2luLWJvdHRvbXxtYXJnaW4tbGVmdHxtYXJnaW4tcmlnaHR8IiArDQogICAgICAgICAgICAibWFyZ2luLXRvcHxtYXJrZXItb2Zmc2V0fG1hcmdpbnxtYXJrc3xtYXgtaGVpZ2h0fG1heC13aWR0aHxtaW4taGVpZ2h0fCIgKw0KICAgICAgICAgICAgIm1pbi13aWR0aHxvcGFjaXR5fG9ycGhhbnN8b3V0bGluZS1jb2xvcnwiICsNCiAgICAgICAgICAgICJvdXRsaW5lLXN0eWxlfG91dGxpbmUtd2lkdGh8b3V0bGluZXxvdmVyZmxvd3xvdmVyZmxvdy14fG92ZXJmbG93LXl8cGFkZGluZy1ib3R0b218IiArDQogICAgICAgICAgICAicGFkZGluZy1sZWZ0fHBhZGRpbmctcmlnaHR8cGFkZGluZy10b3B8cGFkZGluZ3xwYWdlLWJyZWFrLWFmdGVyfCIgKw0KICAgICAgICAgICAgInBhZ2UtYnJlYWstYmVmb3JlfHBhZ2UtYnJlYWstaW5zaWRlfHBhZ2V8cGF1c2UtYWZ0ZXJ8cGF1c2UtYmVmb3JlfCIgKw0KICAgICAgICAgICAgInBhdXNlfHBpdGNoLXJhbmdlfHBpdGNofHBsYXktZHVyaW5nfHBvc2l0aW9ufHF1b3Rlc3xyaWNobmVzc3xyaWdodHwiICsNCiAgICAgICAgICAgICJzaXplfHNwZWFrLWhlYWRlcnxzcGVhay1udW1lcmFsfHNwZWFrLXB1bmN0dWF0aW9ufHNwZWVjaC1yYXRlfHNwZWFrfCIgKw0KICAgICAgICAgICAgInN0cmVzc3x0YWJsZS1sYXlvdXR8dGV4dC1hbGlnbnx0ZXh0LWRlY29yYXRpb258dGV4dC1pbmRlbnR8IiArDQogICAgICAgICAgICAidGV4dC1zaGFkb3d8dGV4dC10cmFuc2Zvcm18dG9wfHVuaWNvZGUtYmlkaXx2ZXJ0aWNhbC1hbGlnbnwiICsNCiAgICAgICAgICAgICJ2aXNpYmlsaXR5fHZvaWNlLWZhbWlseXx2b2x1bWV8d2hpdGUtc3BhY2V8d2lkb3dzfHdpZHRofHdvcmQtc3BhY2luZ3wiICsNCiAgICAgICAgICAgICJ6LWluZGV4Iikuc3BsaXQoInwiKTsNCiAgICAgICAgICANCiAgICAgICAgLy9UaGUgcmV0dXJuIGFycmF5ICAgICANCiAgICAgICAgdmFyIHJldCA9IFtdOw0KICAgICAgICANCiAgICAgICAgLy9BbGwgcHJlZml4UHJvcGVydGllcyB3aWxsIGdldCB0aGUgYnJvd3NlclByZWZpeCBpbg0KICAgICAgICAvL3RoZSBiZWduaW5nIGJ5IGpvaW4gdGhlIHByZWZpeFByb3BlcnRpZXMgYXJyYXkgd2l0aCB0aGUgdmFsdWUgb2YgYnJvd3NlclByZWZpeA0KICAgICAgICBmb3IgKHZhciBpPTAsIGxuPWJyb3dzZXJQcmVmaXgubGVuZ3RoOyBpPGxuOyBpKyspIHsNCiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KA0KICAgICAgICAgICAgICAgIHJldCwNCiAgICAgICAgICAgICAgICAoKCBicm93c2VyUHJlZml4W2ldICsgcHJlZml4UHJvcGVydGllcy5qb2luKCJ8IiArIGJyb3dzZXJQcmVmaXhbaV0pICkuc3BsaXQoInwiKSkNCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vQWRkIGFsc28gcHJlZml4UHJvcGVydGllcyBhbmQgcHJvcGVydGllcyB3aXRob3V0IGFueSBicm93c2VyIHByZWZpeA0KICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShyZXQsIHByZWZpeFByb3BlcnRpZXMpOw0KICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShyZXQsIHByb3BlcnRpZXMpOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHJldDsNCiAgICAgICAgDQogICAgfSkoKSApOw0KICAgIA0KDQoNCiAgICB2YXIgZnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImhzbHxoc2xhfHJnYnxyZ2JhfHVybHxhdHRyfGNvdW50ZXJ8Y291bnRlcnN8YWJzfGFkanVzdF9jb2xvcnxhZGp1c3RfaHVlfCIgKw0KICAgICAgICAgImFscGhhfGpvaW58Ymx1ZXxjZWlsfGNoYW5nZV9jb2xvcnxjb21wYXJhYmxlfGNvbXBsZW1lbnR8ZGFya2VufGRlc2F0dXJhdGV8IiArIA0KICAgICAgICAgImZsb29yfGdyYXlzY2FsZXxncmVlbnxodWV8aWZ8aW52ZXJ0fGpvaW58bGVuZ3RofGxpZ2h0ZW58bGlnaHRuZXNzfG1peHwiICsgDQogICAgICAgICAibnRofG9wYWNpZnl8b3BhY2l0eXxwZXJjZW50YWdlfHF1b3RlfHJlZHxyb3VuZHxzYXR1cmF0ZXxzYXR1cmF0aW9ufCIgKw0KICAgICAgICAgInNjYWxlX2NvbG9yfHRyYW5zcGFyZW50aXplfHR5cGVfb2Z8dW5pdHx1bml0bGVzc3x1bnFvdXRlIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgY29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImFic29sdXRlfGFsbC1zY3JvbGx8YWx3YXlzfGFybWVuaWFufGF1dG98YmFzZWxpbmV8YmVsb3d8YmlkaS1vdmVycmlkZXwiICsNCiAgICAgICAgImJsb2NrfGJvbGR8Ym9sZGVyfGJvcmRlci1ib3h8Ym90aHxib3R0b218YnJlYWstYWxsfGJyZWFrLXdvcmR8Y2FwaXRhbGl6ZXxjZW50ZXJ8IiArDQogICAgICAgICJjaGFyfGNpcmNsZXxjamstaWRlb2dyYXBoaWN8Y29sLXJlc2l6ZXxjb2xsYXBzZXxjb250ZW50LWJveHxjcm9zc2hhaXJ8ZGFzaGVkfCIgKw0KICAgICAgICAiZGVjaW1hbC1sZWFkaW5nLXplcm98ZGVjaW1hbHxkZWZhdWx0fGRpc2FibGVkfGRpc2N8IiArDQogICAgICAgICJkaXN0cmlidXRlLWFsbC1saW5lc3xkaXN0cmlidXRlLWxldHRlcnxkaXN0cmlidXRlLXNwYWNlfCIgKw0KICAgICAgICAiZGlzdHJpYnV0ZXxkb3R0ZWR8ZG91YmxlfGUtcmVzaXplfGVsbGlwc2lzfGZpeGVkfGdlb3JnaWFufGdyb292ZXwiICsNCiAgICAgICAgImhhbmR8aGVicmV3fGhlbHB8aGlkZGVufGhpcmFnYW5hLWlyb2hhfGhpcmFnYW5hfGhvcml6b250YWx8IiArDQogICAgICAgICJpZGVvZ3JhcGgtYWxwaGF8aWRlb2dyYXBoLW51bWVyaWN8aWRlb2dyYXBoLXBhcmVudGhlc2lzfCIgKw0KICAgICAgICAiaWRlb2dyYXBoLXNwYWNlfGluYWN0aXZlfGluaGVyaXR8aW5saW5lLWJsb2NrfGlubGluZXxpbnNldHxpbnNpZGV8IiArDQogICAgICAgICJpbnRlci1pZGVvZ3JhcGh8aW50ZXItd29yZHxpdGFsaWN8anVzdGlmeXxrYXRha2FuYS1pcm9oYXxrYXRha2FuYXwiICsNCiAgICAgICAgImtlZXAtYWxsfGxlZnR8bGlnaHRlcnxsaW5lLWVkZ2V8bGluZS10aHJvdWdofGxpbmV8bGlzdC1pdGVtfGxvb3NlfCIgKw0KICAgICAgICAibG93ZXItYWxwaGF8bG93ZXItZ3JlZWt8bG93ZXItbGF0aW58bG93ZXItcm9tYW58bG93ZXJjYXNlfGxyLXRifGx0cnwiICsNCiAgICAgICAgIm1lZGl1bXxtaWRkbGV8bW92ZXxuLXJlc2l6ZXxuZS1yZXNpemV8bmV3c3BhcGVyfG5vLWRyb3B8bm8tcmVwZWF0fCIgKw0KICAgICAgICAibnctcmVzaXplfG5vbmV8bm9ybWFsfG5vdC1hbGxvd2VkfG5vd3JhcHxvYmxpcXVlfG91dHNldHxvdXRzaWRlfCIgKw0KICAgICAgICAib3ZlcmxpbmV8cG9pbnRlcnxwcm9ncmVzc3xyZWxhdGl2ZXxyZXBlYXQteHxyZXBlYXQteXxyZXBlYXR8cmlnaHR8IiArDQogICAgICAgICJyaWRnZXxyb3ctcmVzaXplfHJ0bHxzLXJlc2l6ZXxzY3JvbGx8c2UtcmVzaXplfHNlcGFyYXRlfHNtYWxsLWNhcHN8IiArDQogICAgICAgICJzb2xpZHxzcXVhcmV8c3RhdGljfHN0cmljdHxzdXBlcnxzdy1yZXNpemV8dGFibGUtZm9vdGVyLWdyb3VwfCIgKw0KICAgICAgICAidGFibGUtaGVhZGVyLWdyb3VwfHRiLXJsfHRleHQtYm90dG9tfHRleHQtdG9wfHRleHR8dGhpY2t8dGhpbnx0b3B8IiArDQogICAgICAgICJ0cmFuc3BhcmVudHx1bmRlcmxpbmV8dXBwZXItYWxwaGF8dXBwZXItbGF0aW58dXBwZXItcm9tYW58dXBwZXJjYXNlfCIgKw0KICAgICAgICAidmVydGljYWwtaWRlb2dyYXBoaWN8dmVydGljYWwtdGV4dHx2aXNpYmxlfHctcmVzaXplfHdhaXR8d2hpdGVzcGFjZXwiICsNCiAgICAgICAgInplcm8iKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBjb2xvcnMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXwiICsNCiAgICAgICAgInB1cnBsZXxyZWR8c2lsdmVyfHRlYWx8d2hpdGV8eWVsbG93Iikuc3BsaXQoInwiKQ0KICAgICk7DQogICAgDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIkBtaXhpbnxAZXh0ZW5kfEBpbmNsdWRlfEBpbXBvcnR8QG1lZGlhfEBkZWJ1Z3xAd2FybnxAaWZ8QGZvcnxAZWFjaHxAd2hpbGV8QGVsc2V8QGZvbnQtZmFjZXxALXdlYmtpdC1rZXlmcmFtZXN8aWZ8YW5kfCFkZWZhdWx0fG1vZHVsZXxkZWZ8ZW5kfGRlY2xhcmUiKS5zcGxpdCgifCIpDQogICAgKQ0KICAgIA0KICAgIHZhciB0YWdzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImF8YWJicnxhY3JvbnltfGFkZHJlc3N8YXBwbGV0fGFyZWF8YXJ0aWNsZXxhc2lkZXxhdWRpb3xifGJhc2V8YmFzZWZvbnR8YmRvfCIgKyANCiAgICAgICAgICJiaWd8YmxvY2txdW90ZXxib2R5fGJyfGJ1dHRvbnxjYW52YXN8Y2FwdGlvbnxjZW50ZXJ8Y2l0ZXxjb2RlfGNvbHxjb2xncm91cHwiICsgDQogICAgICAgICAiY29tbWFuZHxkYXRhbGlzdHxkZHxkZWx8ZGV0YWlsc3xkZm58ZGlyfGRpdnxkbHxkdHxlbXxlbWJlZHxmaWVsZHNldHwiICsgDQogICAgICAgICAiZmlnY2FwdGlvbnxmaWd1cmV8Zm9udHxmb290ZXJ8Zm9ybXxmcmFtZXxmcmFtZXNldHxoMXxoMnxoM3xoNHxoNXxoNnxoZWFkfCIgKyANCiAgICAgICAgICJoZWFkZXJ8aGdyb3VwfGhyfGh0bWx8aXxpZnJhbWV8aW1nfGlucHV0fGluc3xrZXlnZW58a2JkfGxhYmVsfGxlZ2VuZHxsaXwiICsgDQogICAgICAgICAibGlua3xtYXB8bWFya3xtZW51fG1ldGF8bWV0ZXJ8bmF2fG5vZnJhbWVzfG5vc2NyaXB0fG9iamVjdHxvbHxvcHRncm91cHwiICsgDQogICAgICAgICAib3B0aW9ufG91dHB1dHxwfHBhcmFtfHByZXxwcm9ncmVzc3xxfHJwfHJ0fHJ1Ynl8c3xzYW1wfHNjcmlwdHxzZWN0aW9ufHNlbGVjdHwiICsgDQogICAgICAgICAic21hbGx8c291cmNlfHNwYW58c3RyaWtlfHN0cm9uZ3xzdHlsZXxzdWJ8c3VtbWFyeXxzdXB8dGFibGV8dGJvZHl8dGR8IiArIA0KICAgICAgICAgInRleHRhcmVhfHRmb290fHRofHRoZWFkfHRpbWV8dGl0bGV8dHJ8dHR8dXx1bHx2YXJ8dmlkZW98d2JyfHhtcCIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHZhciBudW1SZSA9ICJcXC0/KD86KD86WzAtOV0rKXwoPzpbMC05XSpcXC5bMC05XSspKSI7DQoNCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0uKlxcXFwkJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInFxc3RyaW5nIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiBudW1SZSArICIoPzplbXxleHxweHxjbXxtbXxpbnxwdHxwY3xkZWd8cmFkfGdyYWR8bXN8c3xoenxraHp8JSkiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleDYgY29sb3INCiAgICAgICAgICAgICAgICByZWdleCA6ICIjW2EtZjAtOV17Nn0iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleDMgY29sb3INCiAgICAgICAgICAgICAgICByZWdleCA6ICIjW2EtZjAtOV17M30iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiBudW1SZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQudHlwZSI7DQogICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xvcnMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuY29uc3RhbnQuY29sb3IiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0YWdzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidGV4dCI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC0/W0BhLXpfXVtAYS16MC05X1xcLV0qIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInZhcmlhYmxlIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16X1xcLSRdW2EtejAtOV9cXC0kXSpcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJ2YXJpYWJsZS5sYW5ndWFnZSIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICIjW2EtejAtOS1fXSsiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJ2YXJpYWJsZS5sYW5ndWFnZSIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXC5bYS16MC05LV9dKyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInZhcmlhYmxlLmxhbmd1YWdlIiwNCiAgICAgICAgICAgICAgICByZWdleDogIjpbYS16MC05LV9dKyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImNvbnN0YW50IiwNCiAgICAgICAgICAgICAgICByZWdleDogIlthLXowLTktX10rIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjx8Pnw8PXw+PXw9PXwhPXwtfCV8I3xcXCt8XFwkfFxcK3xcXCoiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbWyh7XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfV0iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgImNvbW1lbnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQp9Ow0KDQpvb3AuaW5oZXJpdHMoU2Nzc0hpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLlNjc3NIaWdobGlnaHRSdWxlcyA9IFNjc3NIaWdobGlnaHRSdWxlczsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOw0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9Ow0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoIXN0YXJ0KQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7DQogICAgICAgICAgICBlbmQuY29sdW1uLS07DQoNCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCioNCiogQ29udHJpYnV0b3Iocyk6DQoqICAgICAgSm9uYXRoYW4gQ2FtaWxlIDxqb25hdGhhbi5jYW1pbGUgQVQgZ21haWwgRE9UIGNvbT4NCioNCiogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQoqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQoqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQoqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQoqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQoqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCioNCiogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9zcWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9zcWxfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIFNxbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9zcWxfaGlnaGxpZ2h0X3J1bGVzIikuU3FsSGlnaGxpZ2h0UnVsZXM7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IFNxbEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIG91dGVudGVkUm93cyA9IFtdOw0KICAgICAgICB2YXIgcmUgPSAvXihccyopLS0vOw0KDQogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgew0KICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICItLSIpOw0KICAgICAgICB9DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEpvbmF0aGFuIENhbWlsZSA8am9uYXRoYW4uY2FtaWxlIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9zcWxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIFNxbEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgic2VsZWN0fGZyb218d2hlcmV8YW5kfG9yfGdyb3VwfGJ5fG9yZGVyfGxpbWl0fG9mZnNldHxoYXZpbmd8YXN8Y2FzZXwiICsNCiAgICAgICAgIndoZW58ZWxzZXxlbmR8dHlwZXxsZWZ0fHJpZ2h0fGpvaW58b258b3V0ZXJ8ZGVzY3xhc2MiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsdGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoInRydWV8ZmFsc2V8bnVsbCIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGJ1aWx0aW5GdW5jdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiY291bnR8bWlufG1heHxhdmd8c3VtfHJhbmt8bm93fGNvYWxlc2NlIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICByZWdleCA6ICItLS4qJCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vICIgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6ICciLioiJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gJyBzdHJpbmcNCiAgICAgICAgICAgIHJlZ2V4IDogIicuKiciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgICAgICAgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbHRpbkZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICByZWdleCA6ICJcXCt8XFwtfFxcL3xcXC9cXC98JXw8QD58QD58PEB8JnxcXF58fnw8fD58PD18PT58PT18IT18PD58PSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibHBhcmVuLnBhcmVuIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIltcXChdIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICAgICAgcmVnZXggOiAiW1xcKV0iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSBdDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhTcWxIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5TcWxIaWdobGlnaHRSdWxlcyA9IFNxbEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQoNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvc3ZnJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS94bWwnLCAnYWNlL21vZGUvamF2YXNjcmlwdCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3N2Z19oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvZm9sZGluZy9taXhlZCcsICdhY2UvbW9kZS9mb2xkaW5nL3htbCcsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBYbWxNb2RlID0gcmVxdWlyZSgiLi94bWwiKS5Nb2RlOw0KdmFyIEphdmFTY3JpcHRNb2RlID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgU3ZnSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3N2Z19oaWdobGlnaHRfcnVsZXMiKS5TdmdIaWdobGlnaHRSdWxlczsNCnZhciBNaXhlZEZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL21peGVkIikuRm9sZE1vZGU7DQp2YXIgWG1sRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcveG1sIikuRm9sZE1vZGU7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgWG1sTW9kZS5jYWxsKHRoaXMpOw0KICAgIA0KICAgIHRoaXMuaGlnaGxpZ2h0ZXIgPSBuZXcgU3ZnSGlnaGxpZ2h0UnVsZXMoKTsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKHRoaXMuaGlnaGxpZ2h0ZXIuZ2V0UnVsZXMoKSk7DQogICAgDQogICAgdGhpcy4kZW1iZWRzID0gdGhpcy5oaWdobGlnaHRlci5nZXRFbWJlZHMoKTsNCiAgICB0aGlzLmNyZWF0ZU1vZGVEZWxlZ2F0ZXMoew0KICAgICAgICAianMtIjogSmF2YVNjcmlwdE1vZGUNCiAgICB9KTsNCiAgICANCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBNaXhlZEZvbGRNb2RlKG5ldyBYbWxGb2xkTW9kZSh7fSksIHsNCiAgICAgICAgImpzLSI6IG5ldyBDU3R5bGVGb2xkTW9kZSgpDQogICAgfSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoTW9kZSwgWG1sTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQogICAgfTsNCiAgICANCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3htbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3htbF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvYmVoYXZpb3VyL3htbCcsICdhY2UvbW9kZS9mb2xkaW5nL3htbCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIFhtbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi94bWxfaGlnaGxpZ2h0X3J1bGVzIikuWG1sSGlnaGxpZ2h0UnVsZXM7DQp2YXIgWG1sQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9iZWhhdmlvdXIveG1sIikuWG1sQmVoYXZpb3VyOw0KdmFyIFhtbEZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL3htbCIpLkZvbGRNb2RlOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IFhtbEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IFhtbEJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IFhtbEZvbGRNb2RlKCk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQogICAgDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGdldEluZGVudChsaW5lKTsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUveG1sX3V0aWwnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgeG1sVXRpbCA9IHJlcXVpcmUoIi4veG1sX3V0aWwiKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgWG1sSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcw0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgc3RhcnQgOiBbew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICI8XFwhXFxbQ0RBVEFcXFsiLA0KICAgICAgICAgICAgbmV4dCA6ICJjZGF0YSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAieG1sX3BlIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXD8uKj9cXD8+Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXCEtLSIsDQogICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwgLy8gb3BlbmluZyB0YWcNCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXC8/IiwNCiAgICAgICAgICAgIG5leHQgOiAidGFnIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiW148XSsiDQogICAgICAgIH1dLA0KICAgICAgICANCiAgICAgICAgY2RhdGEgOiBbew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJcXF1cXF0+IiwNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXV18XFxdKD8hXFxdPikpKyINCiAgICAgICAgfV0sDQoNCiAgICAgICAgY29tbWVudCA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4qPy0tPiIsDQogICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICB9XQ0KICAgIH07DQogICAgDQogICAgeG1sVXRpbC50YWcodGhpcy4kcnVsZXMsICJ0YWciLCAic3RhcnQiKTsNCn07DQoNCm9vcC5pbmhlcml0cyhYbWxIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5YbWxIaWdobGlnaHRSdWxlcyA9IFhtbEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS94bWxfdXRpbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9sYW5nJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQoNCnZhciBmb3JtVGFncyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAoImJ1dHRvbnxmb3JtfGlucHV0fGxhYmVsfHNlbGVjdHx0ZXh0YXJlYSIpLnNwbGl0KCJ8IikNCik7DQoNCnZhciB0YWJsZVRhZ3MgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgKCJ0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0ciIpLnNwbGl0KCJ8IikNCik7DQoNCmZ1bmN0aW9uIHN0cmluZyhzdGF0ZSkgew0KICAgIHJldHVybiBbew0KICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICByZWdleCA6ICciLio/IicNCiAgICB9LCB7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgcmVnZXggOiAnWyJdLionLA0KICAgICAgICBuZXh0IDogc3RhdGUgKyAiX3Fxc3RyaW5nIg0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgcmVnZXggOiAiJy4qPyciDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgIHJlZ2V4IDogIlsnXS4qIiwNCiAgICAgICAgbmV4dCA6IHN0YXRlICsgIl9xc3RyaW5nIg0KICAgIH1dOw0KfQ0KDQpmdW5jdGlvbiBtdWx0aUxpbmVTdHJpbmcocXVvdGUsIHN0YXRlKSB7DQogICAgcmV0dXJuIFt7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgcmVnZXggOiAiLio/IiArIHF1b3RlLA0KICAgICAgICBuZXh0IDogc3RhdGUNCiAgICB9LCB7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgcmVnZXggOiAnLisnDQogICAgfV07DQp9DQoNCmV4cG9ydHMudGFnID0gZnVuY3Rpb24oc3RhdGVzLCBuYW1lLCBuZXh0U3RhdGUpIHsNCiAgICBzdGF0ZXNbbmFtZV0gPSBbew0KICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICB9LCB7DQogICAgICAgIC8vdG9rZW4gOiAibWV0YS50YWciLA0KICAgICAgICANCiAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICBpZiAoIHZhbHVlPT09J2EnICkgew0KICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuYW5jaG9yIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKCB2YWx1ZT09PSdpbWcnICkgew0KICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuaW1hZ2UiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlPT09J3NjcmlwdCcgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5zY3JpcHQiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlPT09J3N0eWxlJyApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLnN0eWxlIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKGZvcm1UYWdzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5mb3JtIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKHRhYmxlVGFncy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcudGFibGUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZyI7DQogICAgICAgICAgICB9DQogICAgICAgIH0sICAgICAgICANCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICJbLV9hLXpBLVowLTk6IV0rIiwNCiAgICAgICAgbmV4dCA6IG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0IiANCiAgICB9LCB7DQogICAgICAgIHRva2VuOiAiZW1wdHkiLA0KICAgICAgICByZWdleDogIiIsDQogICAgICAgIG5leHQgOiBuYW1lICsgIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCINCiAgICB9XTsNCg0KICAgIHN0YXRlc1tuYW1lICsgIl9xc3RyaW5nIl0gPSBtdWx0aUxpbmVTdHJpbmcoIiciLCBuYW1lICsgIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCIpOw0KICAgIHN0YXRlc1tuYW1lICsgIl9xcXN0cmluZyJdID0gbXVsdGlMaW5lU3RyaW5nKCJcIiIsIG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Iik7DQogICAgDQogICAgc3RhdGVzW25hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Il0gPSBbew0KICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgcmVnZXggOiAiXC8/PiIsDQogICAgICAgIG5leHQgOiBuZXh0U3RhdGUNCiAgICB9LCB7DQogICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICByZWdleCA6ICI9Ig0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAiZW50aXR5Lm90aGVyLmF0dHJpYnV0ZS1uYW1lIiwNCiAgICAgICAgcmVnZXggOiAiWy1fYS16QS1aMC05Ol0rIg0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgfV0uY29uY2F0KHN0cmluZyhuYW1lKSk7DQp9Ow0KDQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyL3htbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvYmVoYXZpb3VyJywgJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmVoYXZpb3VyID0gcmVxdWlyZSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyOw0KdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyOw0KDQp2YXIgWG1sQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgew0KICAgIA0KICAgIHRoaXMuaW5oZXJpdChDc3R5bGVCZWhhdmlvdXIsIFsic3RyaW5nX2RxdW90ZXMiXSk7IC8vIEdldCBzdHJpbmcgYmVoYXZpb3VyDQogICAgDQogICAgdGhpcy5hZGQoImJyYWNrZXRzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJzwnKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICc8PicsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJz4nKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnPicpIHsgLy8gbmVlZCBzb21lIGtpbmQgb2YgbWF0Y2hpbmcgY2hlY2sgaGVyZQ0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXJzID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhcnMgPT0gJzwvJykgew0KICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KSkgKyBzZXNzaW9uLmdldFRhYlN0cmluZygpOw0KICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpKTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQogICAgDQp9DQpvb3AuaW5oZXJpdHMoWG1sQmVoYXZpb3VyLCBCZWhhdmlvdXIpOw0KDQpleHBvcnRzLlhtbEJlaGF2aW91ciA9IFhtbEJlaGF2aW91cjsNCn0pOy8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvYmVoYXZpb3VyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoJy4uL2JlaGF2aW91cicpLkJlaGF2aW91cjsNCg0KdmFyIENzdHlsZUJlaGF2aW91ciA9IGZ1bmN0aW9uICgpIHsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAne30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9Jykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCd9Jywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7DQogICAgICAgICAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MpDQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCg0KICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLmdldE5leHRMaW5lSW5kZW50KHN0YXRlLCBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCAtIDEpLCBzZXNzaW9uLmdldFRhYlN0cmluZygpKTsNCiAgICAgICAgICAgICAgICB2YXIgbmV4dF9pbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXG4nICsgaW5kZW50ICsgJ1xuJyArIG5leHRfaW5kZW50LA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLmVuZC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICcoJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJyknLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIicgKyBzZWxlY3RlZCArICciJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgICAgICB2YXIgbGVmdENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLTEsIGN1cnNvci5jb2x1bW4pOw0KDQogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4NCiAgICAgICAgICAgICAgICBpZiAobGVmdENoYXIgPT0gJ1xcJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBGaW5kIHdoYXQgdG9rZW4gd2UncmUgaW5zaWRlLg0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7DQogICAgICAgICAgICAgICAgdmFyIGNvbCA9IDAsIHRva2VuOw0KICAgICAgICAgICAgICAgIHZhciBxdW90ZXBvcyA9IC0xOyAvLyBUcmFjayB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhbiBvcGVuIHF1b3RlLg0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0b2tlbnMubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbeF07DQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdW90ZXBvcyA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRva2VuLnZhbHVlLmxlbmd0aCArIGNvbCkgPiBzZWxlY3Rpb24uc3RhcnQuY29sdW1uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb2wgKz0gdG9rZW5zW3hdLnZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBUcnkgYW5kIGJlIHNtYXJ0IGFib3V0IHdoZW4gd2UgYXV0byBpbnNlcnQuDQogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIiInLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLg0KICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQp9DQpvb3AuaW5oZXJpdHMoQ3N0eWxlQmVoYXZpb3VyLCBCZWhhdmlvdXIpOw0KDQpleHBvcnRzLkNzdHlsZUJlaGF2aW91ciA9IENzdHlsZUJlaGF2aW91cjsNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgJ2FjZS90b2tlbl9pdGVyYXRvciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vLi4vbGliL2xhbmciKTsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCnZhciBUb2tlbkl0ZXJhdG9yID0gcmVxdWlyZSgiLi4vLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24odm9pZEVsZW1lbnRzKSB7DQogICAgQmFzZUZvbGRNb2RlLmNhbGwodGhpcyk7DQogICAgdGhpcy52b2lkRWxlbWVudHMgPSB2b2lkRWxlbWVudHMgfHwge307DQp9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgdGFnID0gdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoc2Vzc2lvbiwgcm93KTsNCg0KICAgICAgICBpZiAodGFnLmNsb3NpbmcpDQogICAgICAgICAgICByZXR1cm4gZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiID8gImVuZCIgOiAiIjsNCg0KICAgICAgICBpZiAoIXRhZy50YWdOYW1lIHx8IHRoaXMudm9pZEVsZW1lbnRzW3RhZy50YWdOYW1lLnRvTG93ZXJDYXNlKCldKQ0KICAgICAgICAgICAgcmV0dXJuICIiOw0KDQogICAgICAgIGlmICh0YWcuc2VsZkNsb3NpbmcpDQogICAgICAgICAgICByZXR1cm4gIiI7DQoNCiAgICAgICAgaWYgKHRhZy52YWx1ZS5pbmRleE9mKCIvIiArIHRhZy50YWdOYW1lKSAhPT0gLTEpDQogICAgICAgICAgICByZXR1cm4gIiI7DQoNCiAgICAgICAgcmV0dXJuICJzdGFydCI7DQogICAgfTsNCiAgICANCiAgICB0aGlzLl9nZXRGaXJzdFRhZ0luTGluZSA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdykgew0KICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMocm93LCByb3cpWzBdLnRva2VuczsNCiAgICAgICAgdmFyIHZhbHVlID0gIiI7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07DQogICAgICAgICAgICBpZiAodG9rZW4udHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpID09PSAwKQ0KICAgICAgICAgICAgICAgIHZhbHVlICs9IHRva2VuLnZhbHVlOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHZhbHVlICs9IGxhbmcuc3RyaW5nUmVwZWF0KCIgIiwgdG9rZW4udmFsdWUubGVuZ3RoKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsNCiAgICB9Ow0KDQogICAgdGhpcy50YWdSZSA9IC9eKFxzKikoPD8oXC8/KShbLV9hLXpBLVowLTk6IV0qKVxzKihcLz8pPj8pLzsNCiAgICB0aGlzLl9wYXJzZVRhZyA9IGZ1bmN0aW9uKHRhZykgew0KICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gdGhpcy50YWdSZS5leGVjKHRhZyk7DQogICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLnRhZ1JlLmxhc3RJbmRleCB8fCAwOw0KICAgICAgICB0aGlzLnRhZ1JlLmxhc3RJbmRleCA9IDA7DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHZhbHVlOiB0YWcsDQogICAgICAgICAgICBtYXRjaDogbWF0Y2ggPyBtYXRjaFsyXSA6ICIiLA0KICAgICAgICAgICAgY2xvc2luZzogbWF0Y2ggPyAhIW1hdGNoWzNdIDogZmFsc2UsDQogICAgICAgICAgICBzZWxmQ2xvc2luZzogbWF0Y2ggPyAhIW1hdGNoWzVdIHx8IG1hdGNoWzJdID09ICIvPiIgOiBmYWxzZSwNCiAgICAgICAgICAgIHRhZ05hbWU6IG1hdGNoID8gbWF0Y2hbNF0gOiAiIiwNCiAgICAgICAgICAgIGNvbHVtbjogbWF0Y2hbMV0gPyBjb2x1bW4gKyBtYXRjaFsxXS5sZW5ndGggOiBjb2x1bW4NCiAgICAgICAgfTsNCiAgICB9Ow0KICAgIA0KICAgIC8qKg0KICAgICAqIHJlYWRzIGEgZnVsbCB0YWcgYW5kIHBsYWNlcyB0aGUgaXRlcmF0b3IgYWZ0ZXIgdGhlIHRhZw0KICAgICAqLw0KICAgIHRoaXMuX3JlYWRUYWdGb3J3YXJkID0gZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICAgICAgdmFyIHRva2VuID0gaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuKCk7DQogICAgICAgIGlmICghdG9rZW4pDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgdmFsdWUgPSAiIjsNCiAgICAgICAgdmFyIHN0YXJ0Ow0KICAgICAgICANCiAgICAgICAgZG8gew0KICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUuaW5kZXhPZigibWV0YS50YWciKSA9PT0gMCkgew0KICAgICAgICAgICAgICAgIGlmICghc3RhcnQpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkNCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW4udmFsdWU7DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoIj4iKSAhPT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHRhZyA9IHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0ID0gc3RhcnQ7DQogICAgICAgICAgICAgICAgICAgIHRhZy5lbmQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSArIHRva2VuLnZhbHVlLmxlbmd0aA0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zdGVwRm9yd2FyZCgpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSB3aGlsZSh0b2tlbiA9IGl0ZXJhdG9yLnN0ZXBGb3J3YXJkKCkpOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCiAgICANCiAgICB0aGlzLl9yZWFkVGFnQmFja3dhcmQgPSBmdW5jdGlvbihpdGVyYXRvcikgew0KICAgICAgICB2YXIgdG9rZW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW4oKTsNCiAgICAgICAgaWYgKCF0b2tlbikNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciB2YWx1ZSA9ICIiOw0KICAgICAgICB2YXIgZW5kOw0KDQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlLmluZGV4T2YoIm1ldGEudGFnIikgPT09IDApIHsNCiAgICAgICAgICAgICAgICBpZiAoIWVuZCkgew0KICAgICAgICAgICAgICAgICAgICBlbmQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSArIHRva2VuLnZhbHVlLmxlbmd0aA0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRva2VuLnZhbHVlICsgdmFsdWU7DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoIjwiKSAhPT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHRhZyA9IHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgdGFnLmVuZCA9IGVuZDsNCiAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0ID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkNCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3Iuc3RlcEJhY2t3YXJkKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IHdoaWxlKHRva2VuID0gaXRlcmF0b3Iuc3RlcEJhY2t3YXJkKCkpOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCiAgICANCiAgICB0aGlzLl9wb3AgPSBmdW5jdGlvbihzdGFjaywgdGFnKSB7DQogICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdmFyIHRvcCA9IHN0YWNrW3N0YWNrLmxlbmd0aC0xXTsNCiAgICAgICAgICAgIGlmICghdGFnIHx8IHRvcC50YWdOYW1lID09IHRhZy50YWdOYW1lKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnBvcCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52b2lkRWxlbWVudHNbdGFnLnRhZ05hbWVdKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52b2lkRWxlbWVudHNbdG9wLnRhZ05hbWVdKSB7DQogICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7DQogICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBmaXJzdFRhZyA9IHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lKHNlc3Npb24sIHJvdyk7DQogICAgICAgIA0KICAgICAgICBpZiAoIWZpcnN0VGFnLm1hdGNoKQ0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgIA0KICAgICAgICB2YXIgaXNCYWNrd2FyZCA9IGZpcnN0VGFnLmNsb3NpbmcgfHwgZmlyc3RUYWcuc2VsZkNsb3Npbmc7DQogICAgICAgIHZhciBzdGFjayA9IFtdOw0KICAgICAgICB2YXIgdGFnOw0KICAgICAgICANCiAgICAgICAgaWYgKCFpc0JhY2t3YXJkKSB7DQogICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcihzZXNzaW9uLCByb3csIGZpcnN0VGFnLmNvbHVtbik7DQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgcm93OiByb3csDQogICAgICAgICAgICAgICAgY29sdW1uOiBmaXJzdFRhZy5jb2x1bW4gKyBmaXJzdFRhZy50YWdOYW1lLmxlbmd0aCArIDINCiAgICAgICAgICAgIH07DQogICAgICAgICAgICB3aGlsZSAodGFnID0gdGhpcy5fcmVhZFRhZ0ZvcndhcmQoaXRlcmF0b3IpKSB7DQogICAgICAgICAgICAgICAgaWYgKHRhZy5zZWxmQ2xvc2luZykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0LmNvbHVtbiArPSB0YWcudGFnTmFtZS5sZW5ndGggKyAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRhZy5zdGFydCwgdGFnLmVuZCk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0YWcuY2xvc2luZykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3Aoc3RhY2ssIHRhZyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCB0YWcuc3RhcnQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0YWcpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbmV3IFRva2VuSXRlcmF0b3Ioc2Vzc2lvbiwgcm93LCBmaXJzdFRhZy5jb2x1bW4gKyBmaXJzdFRhZy5tYXRjaC5sZW5ndGgpOw0KICAgICAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IHJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IGZpcnN0VGFnLmNvbHVtbg0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgd2hpbGUgKHRhZyA9IHRoaXMuX3JlYWRUYWdCYWNrd2FyZChpdGVyYXRvcikpIHsNCiAgICAgICAgICAgICAgICBpZiAodGFnLnNlbGZDbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCB0YWcuZW5kKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCF0YWcuY2xvc2luZykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3Aoc3RhY2ssIHRhZyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0LmNvbHVtbiArPSB0YWcudGFnTmFtZS5sZW5ndGggKyAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCBlbmQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRhZykNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgfTsNCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSBudWxsOw0KDQogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZw0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJzdGFydCI7DQogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJlbmQiOw0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLmluZGVudGF0aW9uQmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgcmUgPSAvXlxzKi87DQogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOw0KICAgICAgICB2YXIgc3RhcnRMZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkNCiAgICAgICAgDQogICAgICAgIHdoaWxlICgrK3JvdyA8IG1heFJvdykgew0KICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpDQogICAgICAgICAgICAgICAgY29udGludWU7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBlbmRSb3cgPSByb3c7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7DQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsNCiAgICAgICAgdmFyIGVuZCA9IHNlc3Npb24uJGZpbmRDbG9zaW5nQnJhY2tldChicmFja2V0LCBzdGFydCk7DQogICAgICAgIGlmICghZW5kKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107DQogICAgICAgIGlmIChmdyA9PSBudWxsKQ0KICAgICAgICAgICAgZncgPSB0aGlzLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZW5kLnJvdyk7DQoNCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIGVuZC5yb3cgLS07DQogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3JhbmdlJywgJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBXb3JrZXJDbGllbnQgPSByZXF1aXJlKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudDsNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOw0KICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBDc3R5bGVCZWhhdmlvdXIoKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIHJlID0gL14oXHMqKVwvXC8vOw0KDQogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgew0KICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICIvLyIpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQoNCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7DQogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsNCiAgICAgICAgdmFyIGVuZFN0YXRlID0gdG9rZW5pemVkTGluZS5zdGF0ZTsNCg0KICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50Iikgew0KICAgICAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qXDp8W1x7XChcW10pXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSAiZG9jLXN0YXJ0Iikgew0KICAgICAgICAgICAgaWYgKGVuZFN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICIiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXlxzKihcLz8pXCovKTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIGlmIChtYXRjaFsxXSkgew0KICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiAiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiogIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXJDbGllbnQoWyJhY2UiXSwgIndvcmtlci1qYXZhc2NyaXB0LmpzIiwgImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwgIkphdmFTY3JpcHRXb3JrZXIiKTsNCiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsNCiAgICAgICAgICAgIA0KICAgICAgICB3b3JrZXIub24oImpzbGludCIsIGZ1bmN0aW9uKHJlc3VsdHMpIHsNCiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxyZXN1bHRzLmRhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSByZXN1bHRzLmRhdGFbaV07DQogICAgICAgICAgICAgICAgaWYgKGVycm9yKQ0KICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGVycm9yLmxpbmUtMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZXJyb3IuY2hhcmFjdGVyLTEsDQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvci5yZWFzb24sDQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICBsaW50OiBlcnJvcg0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICB3b3JrZXIub24oIm5hcmNpc3N1cyIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoW2UuZGF0YV0pOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigidGVybWluYXRlIiwgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBzZXNzaW9uLmNsZWFyQW5ub3RhdGlvbnMoKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gd29ya2VyOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL3VuaWNvZGUnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIHVuaWNvZGUgPSByZXF1aXJlKCIuLi91bmljb2RlIik7DQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cw0KICAgIHZhciBnbG9iYWxzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgLy8gQ29uc3RydWN0b3JzDQogICAgICAgICgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXwiICsNCiAgICAgIC8vIEU0WA0KICAgICAgICAgIk5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHwiICsNCiAgICAgICAgICJBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8IiArDQogICAgICAgICAiVWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXwiICsNCiAgICAgIC8vIEVycm9ycw0KICAgICAgICAiRXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufCIgKw0KICAgICAgICAiU3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfCIgKw0KICAgICAgLy8gIE5vbi1jb25zdHJ1Y3RvciBmdW5jdGlvbnMNCiAgICAgICAgImRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfCIgKw0KICAgICAgICAiaXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHwiICsNCiAgICAgIC8vIE90aGVyDQogICAgICAgICJKU09OfE1hdGh8IiArDQogICAgICAvLyBQc2V1ZG8NCiAgICAgICAgInRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiDQogICAgICApLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnwiICsNCiAgICAgICAgImlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8IiArDQogICAgICAgICJjb25zdHx5aWVsZHxpbXBvcnR8Z2V0fHNldCIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8ga2V5d29yZHMgd2hpY2ggY2FuIGJlIGZvbGxvd2VkIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbnMNCiAgICB2YXIga3dCZWZvcmVSZSA9ICJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIjsNCg0KICAgIHZhciBkZXByZWNhdGVkID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIl9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fXyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGRlZmluaXRpb25zID0gbGFuZy5hcnJheVRvTWFwKCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIpLnNwbGl0KCJ8IikpOw0KDQogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZnV0dXJlUmVzZXJ2ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8IiArDQogICAgICAgICJwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzDQogICAgdmFyIGlkZW50aWZpZXJSZSA9ICJbIiArIHVuaWNvZGUucGFja2FnZXMuTCArICJcXCRfXVsiIA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTW4gKyB1bmljb2RlLnBhY2thZ2VzLk1jDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5OZA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuUGMgKyAiXFwkX10qXFxiIjsNCiAgICAgICAgDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0uKlxcXFwkJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInFxc3RyaW5nIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogWyJrZXl3b3JkLmRlZmluaXRpb24iLCAidGV4dCIsICJlbnRpdHkubmFtZS5mdW5jdGlvbiJdLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIihmdW5jdGlvbikoXFxzKykoIiArIGlkZW50aWZpZXJSZSArICIpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OiIgKyBrd0JlZm9yZVJlICsgIilcXGIiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXByZWNhdGVkLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmaW5pdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkLmRlZmluaXRpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJkZWJ1Z2dlciIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZWdleCA6IGlkZW50aWZpZXJSZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwdW5jdHVhdGlvbi5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFw7fFxcLiIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC89PyIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXiMhLiokIiANCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBvbmx5IGFsbG93ZWQgYWZ0ZXIgY2VydGFpbiB0b2tlbnMuIFRoaXMNCiAgICAgICAgLy8gbWFrZXMgc3VyZSB3ZSBkb24ndCBtaXggdXAgcmVnZXhwcyB3aXRoIHRoZSBkaXZpc29uIG9wZXJhdG9yDQogICAgICAgICJyZWdleF9hbGxvd2VkIjogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnRfcmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcLyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmV0dXJuIHRvIHRoZSBzdGFydCBtb2RlIHdpdGhvdXQgbWF0Y2hpbmcNCiAgICAgICAgICAgICAgICAvLyBhbnl0aGluZw0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0Ig0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicmVnZXgiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4Ig0KICAgICAgICAgICAgfSwgew0KCQkJCS8vIGZsYWcNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLCANCiAgICAgICAgICAgICAgICByZWdleDogIi9cXHcqIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlIA0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJbXlxcXFwvXFxbXSsiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcWyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImVtcHR5IiwgDQogICAgICAgICAgICAgICAgcmVnZXg6ICIiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIgDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIl0iLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXFxcXV0rIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiANCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgImNvbW1lbnRfcmVnZXhfYWxsb3dlZCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLA0KICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jLnRhZyIsDQogICAgICAgICAgICByZWdleCA6ICJAW1xcd1xcZF9dKyIgLy8gVE9ETzogZml4IGVtYWlsIGFkZHJlc3Nlcw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJUT0RPIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJbXkBcXCpdKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLiINCiAgICAgICAgfV0NCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBkb2MgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqKD89XFwqKSIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXCpcXC8iLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQoNCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOw0KDQogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7DQogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7DQoNCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KDQp2YXIgV29ya2VyQ2xpZW50ID0gZnVuY3Rpb24odG9wTGV2ZWxOYW1lc3BhY2VzLCBwYWNrYWdlZEpzLCBtb2QsIGNsYXNzbmFtZSkgew0KDQogICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IHRoaXMuY2hhbmdlTGlzdGVuZXIuYmluZCh0aGlzKTsNCg0KICAgIGlmIChtb2R1bGUucGFja2FnZWQpIHsNCiAgICAgICAgdmFyIGJhc2UgPSB0aGlzLiRndWVzc0Jhc2VQYXRoKCk7DQogICAgICAgIHRoaXMuJHdvcmtlciA9IG5ldyBXb3JrZXIoYmFzZSArIHBhY2thZ2VkSnMpOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgdmFyIHdvcmtlclVybCA9IHRoaXMuJG5vcm1hbGl6ZVBhdGgocmVxdWlyZS5uYW1lVG9VcmwoImFjZS93b3JrZXIvd29ya2VyIiwgbnVsbCwgIl8iKSk7DQogICAgICAgIHRoaXMuJHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyVXJsKTsNCg0KICAgICAgICB2YXIgdGxucyA9IHt9Ow0KICAgICAgICBmb3IgKHZhciBpPTA7IGk8dG9wTGV2ZWxOYW1lc3BhY2VzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXNbaV07DQogICAgICAgICAgICB2YXIgcGF0aCA9IHRoaXMuJG5vcm1hbGl6ZVBhdGgocmVxdWlyZS5uYW1lVG9VcmwobnMsIG51bGwsICJfIikucmVwbGFjZSgvLmpzJC8sICIiKSk7DQoNCiAgICAgICAgICAgIHRsbnNbbnNdID0gcGF0aDsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7DQogICAgICAgIGluaXQgOiB0cnVlLA0KICAgICAgICB0bG5zOiB0bG5zLA0KICAgICAgICBtb2R1bGU6IG1vZCwNCiAgICAgICAgY2xhc3NuYW1lOiBjbGFzc25hbWUNCiAgICB9KTsNCg0KICAgIHRoaXMuY2FsbGJhY2tJZCA9IDE7DQogICAgdGhpcy5jYWxsYmFja3MgPSB7fTsNCg0KICAgIHZhciBfc2VsZiA9IHRoaXM7DQogICAgdGhpcy4kd29ya2VyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICYmIGNvbnNvbGUubG9nKGUpOw0KICAgICAgICB0aHJvdyBlOw0KICAgIH07DQogICAgdGhpcy4kd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIG1zZyA9IGUuZGF0YTsNCiAgICAgICAgc3dpdGNoKG1zZy50eXBlKSB7DQogICAgICAgICAgICBjYXNlICJsb2ciOg0KICAgICAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICYmIGNvbnNvbGUubG9nKG1zZy5kYXRhKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgY2FzZSAiZXZlbnQiOg0KICAgICAgICAgICAgICAgIF9zZWxmLl9lbWl0KG1zZy5uYW1lLCB7ZGF0YTogbXNnLmRhdGF9KTsNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgY2FzZSAiY2FsbCI6DQogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07DQogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7DQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1zZy5kYXRhKTsNCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIF9zZWxmLmNhbGxiYWNrc1ttc2cuaWRdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH07DQp9Ow0KDQooZnVuY3Rpb24oKXsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCg0KICAgIHRoaXMuJG5vcm1hbGl6ZVBhdGggPSBmdW5jdGlvbihwYXRoKSB7DQogICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15bYS16XSs6XC9cL1teXC9dK1wvLywgIiIpOyAvLyBSZW1vdmUgZG9tYWluIG5hbWUgYW5kIHJlYnVpbGQgaXQNCiAgICAgICAgcGF0aCA9IGxvY2F0aW9uLnByb3RvY29sICsgIi8vIiArIGxvY2F0aW9uLmhvc3QNCiAgICAgICAgICAgIC8vIHBhdGhzIHN0YXJ0aW5nIHdpdGggYSBzbGFzaCBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgKGhvc3QpDQogICAgICAgICAgICArIChwYXRoLmNoYXJBdCgwKSA9PSAiLyIgPyAiIiA6IGxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1wvW15cL10qJC8sICIiKSkNCiAgICAgICAgICAgICsgIi8iICsgcGF0aC5yZXBsYWNlKC9eW1wvXSsvLCAiIik7DQogICAgICAgIHJldHVybiBwYXRoOw0KICAgIH07DQoNCiAgICB0aGlzLiRndWVzc0Jhc2VQYXRoID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmIChyZXF1aXJlLmFjZUJhc2VVcmwpDQogICAgICAgICAgICByZXR1cm4gcmVxdWlyZS5hY2VCYXNlVXJsOw0KDQogICAgICAgIHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpOw0KICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2NyaXB0cy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIHNjcmlwdCA9IHNjcmlwdHNbaV07DQoNCiAgICAgICAgICAgIHZhciBiYXNlID0gc2NyaXB0LmdldEF0dHJpYnV0ZSgiZGF0YS1hY2UtYmFzZSIpOw0KICAgICAgICAgICAgaWYgKGJhc2UpDQogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UucmVwbGFjZSgvXC8qJC8sICIvIik7DQoNCiAgICAgICAgICAgIHZhciBzcmMgPSBzY3JpcHQuc3JjIHx8IHNjcmlwdC5nZXRBdHRyaWJ1dGUoInNyYyIpOw0KICAgICAgICAgICAgaWYgKCFzcmMpIHsNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBtID0gc3JjLm1hdGNoKC9eKD86KC4qXC8pYWNlXC5qc3woLipcLylhY2UoLXVuY29tcHJlc3NlZCk/KC1ub2NvbmZsaWN0KT9cLmpzKSg/Olw/fCQpLyk7DQogICAgICAgICAgICBpZiAobSkNCiAgICAgICAgICAgICAgICByZXR1cm4gbVsxXSB8fCBtWzJdOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQogICAgdGhpcy50ZXJtaW5hdGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5fZW1pdCgidGVybWluYXRlIiwge30pOw0KICAgICAgICB0aGlzLiR3b3JrZXIudGVybWluYXRlKCk7DQogICAgICAgIHRoaXMuJHdvcmtlciA9IG51bGw7DQogICAgICAgIHRoaXMuJGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsNCiAgICAgICAgdGhpcy4kZG9jID0gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5zZW5kID0gZnVuY3Rpb24oY21kLCBhcmdzKSB7DQogICAgICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7Y29tbWFuZDogY21kLCBhcmdzOiBhcmdzfSk7DQogICAgfTsNCg0KICAgIHRoaXMuY2FsbCA9IGZ1bmN0aW9uKGNtZCwgYXJncywgY2FsbGJhY2spIHsNCiAgICAgICAgaWYgKGNhbGxiYWNrKSB7DQogICAgICAgICAgICB2YXIgaWQgPSB0aGlzLmNhbGxiYWNrSWQrKzsNCiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzW2lkXSA9IGNhbGxiYWNrOw0KICAgICAgICAgICAgYXJncy5wdXNoKGlkKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnNlbmQoY21kLCBhcmdzKTsNCiAgICB9Ow0KDQogICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIC8vIGZpcmVmb3ggcmVmdXNlcyB0byBjbG9uZSBvYmplY3RzIHdoaWNoIGhhdmUgZnVuY3Rpb24gcHJvcGVydGllcw0KICAgICAgICAgICAgLy8gVE9ETzogY2xlYW51cCBldmVudA0KICAgICAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtldmVudDogZXZlbnQsIGRhdGE6IHtkYXRhOiBkYXRhLmRhdGF9fSk7DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2goZXgpIHt9DQogICAgfTsNCg0KICAgIHRoaXMuYXR0YWNoVG9Eb2N1bWVudCA9IGZ1bmN0aW9uKGRvYykgew0KICAgICAgICBpZih0aGlzLiRkb2MpDQogICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZSgpOw0KDQogICAgICAgIHRoaXMuJGRvYyA9IGRvYzsNCiAgICAgICAgdGhpcy5jYWxsKCJzZXRWYWx1ZSIsIFtkb2MuZ2V0VmFsdWUoKV0pOw0KICAgICAgICBkb2Mub24oImNoYW5nZSIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOw0KICAgIH07DQoNCiAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gZnVuY3Rpb24oZSkgew0KICAgICAgICBlLnJhbmdlID0gew0KICAgICAgICAgICAgc3RhcnQ6IGUuZGF0YS5yYW5nZS5zdGFydCwNCiAgICAgICAgICAgIGVuZDogZS5kYXRhLnJhbmdlLmVuZA0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmVtaXQoImNoYW5nZSIsIGUpOw0KICAgIH07DQoNCn0pLmNhbGwoV29ya2VyQ2xpZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuV29ya2VyQ2xpZW50ID0gV29ya2VyQ2xpZW50Ow0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSAvXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS87DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4Ow0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMV0pDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBpKTsNCg0KICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7DQogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgew0KICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkpOw0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07DQogICAgICAgICAgICB2YXIgc3RhcnQgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQobWF0Y2hbMV0sIGVuZCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICghc3RhcnQpDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4tLTsNCg0KICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgICAgICB9DQogICAgfTsNCiAgICANCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvc3ZnX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS94bWxfdXRpbCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOw0KdmFyIFhtbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi94bWxfaGlnaGxpZ2h0X3J1bGVzIikuWG1sSGlnaGxpZ2h0UnVsZXM7DQp2YXIgeG1sVXRpbCA9IHJlcXVpcmUoIi4veG1sX3V0aWwiKTsNCg0KdmFyIFN2Z0hpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQogICAgWG1sSGlnaGxpZ2h0UnVsZXMuY2FsbCh0aGlzKTsNCg0KICAgIHRoaXMuJHJ1bGVzLnN0YXJ0LnNwbGljZSgzLCAwLCB7DQogICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwNCiAgICAgICAgcmVnZXggOiAiPCg/PVxzKnNjcmlwdCkiLA0KICAgICAgICBuZXh0IDogInNjcmlwdCINCiAgICB9KTsNCiAgICANCiAgICB4bWxVdGlsLnRhZyh0aGlzLiRydWxlcywgInNjcmlwdCIsICJqcy1zdGFydCIpOw0KICAgIA0KICAgIHRoaXMuZW1iZWRSdWxlcyhKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsICJqcy0iLCBbew0KICAgICAgICB0b2tlbjogImNvbW1lbnQiLA0KICAgICAgICByZWdleDogIlxcL1xcLy4qKD89PFxcL3NjcmlwdD4pIiwNCiAgICAgICAgbmV4dDogInRhZyINCiAgICB9LCB7DQogICAgICAgIHRva2VuOiAibWV0YS50YWciLA0KICAgICAgICByZWdleDogIjxcXC8oPz1zY3JpcHQpIiwNCiAgICAgICAgbmV4dDogInRhZyINCiAgICB9XSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoU3ZnSGlnaGxpZ2h0UnVsZXMsIFhtbEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5TdmdIaWdobGlnaHRSdWxlcyA9IFN2Z0hpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL21peGVkJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oZGVmYXVsdE1vZGUsIHN1Yk1vZGVzKSB7DQogICAgdGhpcy5kZWZhdWx0TW9kZSA9IGRlZmF1bHRNb2RlOw0KICAgIHRoaXMuc3ViTW9kZXMgPSBzdWJNb2RlczsNCn07DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KDQogICAgdGhpcy4kZ2V0TW9kZSA9IGZ1bmN0aW9uKHN0YXRlKSB7DQogICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnN1Yk1vZGVzKSB7DQogICAgICAgICAgICBpZiAoc3RhdGUuaW5kZXhPZihrZXkpID09PSAwKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1Yk1vZGVzW2tleV07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCiAgICANCiAgICB0aGlzLiR0cnlNb2RlID0gZnVuY3Rpb24oc3RhdGUsIHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBtb2RlID0gdGhpcy4kZ2V0TW9kZShzdGF0ZSk7DQogICAgICAgIHJldHVybiAobW9kZSA/IG1vZGUuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgOiAiIik7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHJldHVybiAoDQogICAgICAgICAgICB0aGlzLiR0cnlNb2RlKHNlc3Npb24uZ2V0U3RhdGUocm93LTEpLCBzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgfHwNCiAgICAgICAgICAgIHRoaXMuJHRyeU1vZGUoc2Vzc2lvbi5nZXRTdGF0ZShyb3cpLCBzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgfHwNCiAgICAgICAgICAgIHRoaXMuZGVmYXVsdE1vZGUuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykNCiAgICAgICAgKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbW9kZSA9IHRoaXMuJGdldE1vZGUoc2Vzc2lvbi5nZXRTdGF0ZShyb3ctMSkpOw0KICAgICAgICANCiAgICAgICAgaWYgKCFtb2RlIHx8ICFtb2RlLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpKQ0KICAgICAgICAgICAgbW9kZSA9IHRoaXMuJGdldE1vZGUoc2Vzc2lvbi5nZXRTdGF0ZShyb3cpKTsNCiAgICAgICAgDQogICAgICAgIGlmICghbW9kZSB8fCAhbW9kZS5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSkNCiAgICAgICAgICAgIG1vZGUgPSB0aGlzLmRlZmF1bHRNb2RlOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIG1vZGUuZ2V0Rm9sZFdpZGdldFJhbmdlKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KTsNCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOzsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-svg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9zdmciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3htbCIsImFjZS9tb2RlL2phdmFzY3JpcHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvc3ZnX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2ZvbGRpbmcvbWl4ZWQiLCJhY2UvbW9kZS9mb2xkaW5nL3htbCIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3htbCIpLk1vZGUsZj1hKCIuL2phdmFzY3JpcHQiKS5Nb2RlLGc9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGg9YSgiLi9zdmdfaGlnaGxpZ2h0X3J1bGVzIikuU3ZnSGlnaGxpZ2h0UnVsZXMsaT1hKCIuL2ZvbGRpbmcvbWl4ZWQiKS5Gb2xkTW9kZSxqPWEoIi4vZm9sZGluZy94bWwiKS5Gb2xkTW9kZSxrPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxsPWZ1bmN0aW9uKCl7ZS5jYWxsKHRoaXMpLHRoaXMuaGlnaGxpZ2h0ZXI9bmV3IGgsdGhpcy4kdG9rZW5pemVyPW5ldyBnKHRoaXMuaGlnaGxpZ2h0ZXIuZ2V0UnVsZXMoKSksdGhpcy4kZW1iZWRzPXRoaXMuaGlnaGxpZ2h0ZXIuZ2V0RW1iZWRzKCksdGhpcy5jcmVhdGVNb2RlRGVsZWdhdGVzKHsianMtIjpmfSksdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGkobmV3IGooe30pLHsianMtIjpuZXcga30pfTtkLmluaGVyaXRzKGwsZSksZnVuY3Rpb24oKXt0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGIpfX0uY2FsbChsLnByb3RvdHlwZSksYi5Nb2RlPWx9KSxkZWZpbmUoImFjZS9tb2RlL3htbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvYmVoYXZpb3VyL3htbCIsImFjZS9tb2RlL2ZvbGRpbmcveG1sIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi94bWxfaGlnaGxpZ2h0X3J1bGVzIikuWG1sSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL2JlaGF2aW91ci94bWwiKS5YbWxCZWhhdmlvdXIsaT1hKCIuL2ZvbGRpbmcveG1sIikuRm9sZE1vZGUsaj1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpLHRoaXMuJGJlaGF2aW91cj1uZXcgaCx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgaX07ZC5pbmhlcml0cyhqLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJGdldEluZGVudChiKX19LmNhbGwoai5wcm90b3R5cGUpLGIuTW9kZT1qfSksZGVmaW5lKCJhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS94bWxfdXRpbCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3htbF91dGlsIiksZj1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGc9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoidGV4dCIscmVnZXg6IjxcXCFcXFtDREFUQVxcWyIsbmV4dDoiY2RhdGEifSx7dG9rZW46InhtbF9wZSIscmVnZXg6IjxcXD8uKj9cXD8+In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiPFxcIS0tIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjxcXC8/IixuZXh0OiJ0YWcifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiW148XSsifV0sY2RhdGE6W3t0b2tlbjoidGV4dCIscmVnZXg6IlxcXVxcXT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6Iig/OlteXFxdXXxcXF0oPyFcXF0+KSkrIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qPy0tPiIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sZS50YWcodGhpcy4kcnVsZXMsInRhZyIsInN0YXJ0Iil9O2QuaW5oZXJpdHMoZyxmKSxiLlhtbEhpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL3htbF91dGlsIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGcoYSl7cmV0dXJuW3t0b2tlbjoic3RyaW5nIixyZWdleDonIi4qPyInfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qJyxuZXh0OmErIl9xcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiJy4qPycifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6IlsnXS4qIixuZXh0OmErIl9xc3RyaW5nIn1dfWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm5be3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKj8iK2EsbmV4dDpifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvbGFuZyIpLGU9ZC5hcnJheVRvTWFwKCJidXR0b258Zm9ybXxpbnB1dHxsYWJlbHxzZWxlY3R8dGV4dGFyZWEiLnNwbGl0KCJ8IikpLGY9ZC5hcnJheVRvTWFwKCJ0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0ciIuc3BsaXQoInwiKSk7Yi50YWc9ZnVuY3Rpb24oYSxiLGMpe2FbYl09W3t0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT0iYSI/Im1ldGEudGFnLmFuY2hvciI6YT09PSJpbWciPyJtZXRhLnRhZy5pbWFnZSI6YT09PSJzY3JpcHQiPyJtZXRhLnRhZy5zY3JpcHQiOmE9PT0ic3R5bGUiPyJtZXRhLnRhZy5zdHlsZSI6ZS5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpPyJtZXRhLnRhZy5mb3JtIjpmLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/Im1ldGEudGFnLnRhYmxlIjoibWV0YS50YWcifSxtZXJnZTohMCxyZWdleDoiWy1fYS16QS1aMC05OiFdKyIsbmV4dDpiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OmIrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCJ9XSxhW2IrIl9xc3RyaW5nIl09aCgiJyIsYisiX2VtYmVkX2F0dHJpYnV0ZV9saXN0IiksYVtiKyJfcXFzdHJpbmciXT1oKCciJyxiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QiKSxhW2IrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCJdPVt7dG9rZW46Im1ldGEudGFnIixtZXJnZTohMCxyZWdleDoiLz8+IixuZXh0OmN9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6Ij0ifSx7dG9rZW46ImVudGl0eS5vdGhlci5hdHRyaWJ1dGUtbmFtZSIscmVnZXg6IlstX2EtekEtWjAtOTpdKyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XS5jb25jYXQoZyhiKSl9fSksZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIveG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9iZWhhdmlvdXIiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1hKCIuL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixnPWZ1bmN0aW9uKCl7dGhpcy5pbmhlcml0KGYsWyJzdHJpbmdfZHF1b3RlcyJdKSx0aGlzLmFkZCgiYnJhY2tldHMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09IjwiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj8hMTp7dGV4dDoiPD4iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09Ij4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSI+IilyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaz1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisyKTtpZihrPT0iPC8iKXt2YXIgbD10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShoLnJvdykpK2QuZ2V0VGFiU3RyaW5nKCksbT10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShoLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbCsiXG4iK20sc2VsZWN0aW9uOlsxLGwubGVuZ3RoLDEsbC5sZW5ndGhdfX19fSl9O2QuaW5oZXJpdHMoZyxlKSxiLlhtbEJlaGF2aW91cj1nfSksZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9iZWhhdmlvdXIiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uL2JlaGF2aW91ciIpLkJlaGF2aW91cixmPWZ1bmN0aW9uKCl7dGhpcy5hZGQoImJyYWNlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0ieyIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiJ7IitnKyJ9IixzZWxlY3Rpb246ITF9Ont0ZXh0OiJ7fSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0ifSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09In0iKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIn0iLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX1lbHNlIGlmKGU9PSJcbiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09In0iKXt2YXIgbD1kLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpoLnJvdyxjb2x1bW46aC5jb2x1bW4rMX0pO2lmKCFsKXJldHVybiBudWxsO3ZhciBtPXRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoYSxpLnN1YnN0cmluZygwLGkubGVuZ3RoLTEpLGQuZ2V0VGFiU3RyaW5nKCkpLG49dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUobC5yb3cpKTtyZXR1cm57dGV4dDoiXG4iK20rIlxuIituLHNlbGVjdGlvbjpbMSxtLmxlbmd0aCwxLG0ubGVuZ3RoXX19fX0pLHRoaXMuYWRkKCJicmFjZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09InsiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuZW5kLmNvbHVtbixlLmVuZC5jb2x1bW4rMSk7aWYoaD09In0iKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09IigiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoiKCIrZysiKSIsc2VsZWN0aW9uOiExfTp7dGV4dDoiKCkiLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09IikiKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSIpIil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCIpIix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInBhcmVucyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0iKCIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0iKSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSciJyl7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO2lmKGchPT0iIilyZXR1cm57dGV4dDonIicrZysnIicsc2VsZWN0aW9uOiExfTt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLTEsaC5jb2x1bW4pO2lmKGo9PSJcXCIpcmV0dXJuIG51bGw7dmFyIGs9ZC5nZXRUb2tlbnMoZi5zdGFydC5yb3csZi5zdGFydC5yb3cpWzBdLnRva2VucyxsPTAsbSxuPS0xO2Zvcih2YXIgbz0wO288ay5sZW5ndGg7bysrKXttPWtbb10sbS50eXBlPT0ic3RyaW5nIj9uPS0xOm48MCYmKG49bS52YWx1ZS5pbmRleE9mKCciJykpO2lmKG0udmFsdWUubGVuZ3RoK2w+Zi5zdGFydC5jb2x1bW4pYnJlYWs7bCs9a1tvXS52YWx1ZS5sZW5ndGh9aWYoIW18fG48MCYmbS50eXBlIT09ImNvbW1lbnQiJiYobS50eXBlIT09InN0cmluZyJ8fGYuc3RhcnQuY29sdW1uIT09bS52YWx1ZS5sZW5ndGgrbC0xJiZtLnZhbHVlLmxhc3RJbmRleE9mKCciJyk9PT1tLnZhbHVlLmxlbmd0aC0xKSlyZXR1cm57dGV4dDonIiInLHNlbGVjdGlvbjpbMSwxXX07aWYobSYmbS50eXBlPT09InN0cmluZyIpe3ZhciBwPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKHA9PSciJylyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09JyInKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09JyInKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pfTtkLmluaGVyaXRzKGYsZSksYi5Dc3R5bGVCZWhhdmlvdXI9Zn0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy94bWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi8uLi9saWIvbGFuZyIpLGY9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxnPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsaD1hKCIuLi8uLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3IsaT1iLkZvbGRNb2RlPWZ1bmN0aW9uKGEpe2cuY2FsbCh0aGlzKSx0aGlzLnZvaWRFbGVtZW50cz1hfHx7fX07ZC5pbmhlcml0cyhpLGcpLGZ1bmN0aW9uKCl7dGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9nZXRGaXJzdFRhZ0luTGluZShhLGMpO3JldHVybiBkLmNsb3Npbmc/Yj09Im1hcmtiZWdpbmVuZCI/ImVuZCI6IiI6IWQudGFnTmFtZXx8dGhpcy52b2lkRWxlbWVudHNbZC50YWdOYW1lLnRvTG93ZXJDYXNlKCldPyIiOmQuc2VsZkNsb3Npbmc/IiI6ZC52YWx1ZS5pbmRleE9mKCIvIitkLnRhZ05hbWUpIT09LTE/IiI6InN0YXJ0In0sdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldFRva2VucyhiLGIpWzBdLnRva2VucyxkPSIiO2Zvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKXt2YXIgZz1jW2ZdO2cudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MD9kKz1nLnZhbHVlOmQrPWUuc3RyaW5nUmVwZWF0KCIgIixnLnZhbHVlLmxlbmd0aCl9cmV0dXJuIHRoaXMuX3BhcnNlVGFnKGQpfSx0aGlzLnRhZ1JlPS9eKFxzKikoPD8oXC8/KShbLV9hLXpBLVowLTk6IV0qKVxzKihcLz8pPj8pLyx0aGlzLl9wYXJzZVRhZz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnRhZ1JlLmV4ZWMoYSksYz10aGlzLnRhZ1JlLmxhc3RJbmRleHx8MDtyZXR1cm4gdGhpcy50YWdSZS5sYXN0SW5kZXg9MCx7dmFsdWU6YSxtYXRjaDpiP2JbMl06IiIsY2xvc2luZzpiPyEhYlszXTohMSxzZWxmQ2xvc2luZzpiPyEhYls1XXx8YlsyXT09Ii8+IjohMSx0YWdOYW1lOmI/Yls0XToiIixjb2x1bW46YlsxXT9jK2JbMV0ubGVuZ3RoOmN9fSx0aGlzLl9yZWFkVGFnRm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYj1hLmdldEN1cnJlbnRUb2tlbigpO2lmKCFiKXJldHVybiBudWxsO3ZhciBjPSIiLGQ7ZG8gaWYoYi50eXBlLmluZGV4T2YoIm1ldGEudGFnIik9PT0wKXtpZighZCl2YXIgZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9O2MrPWIudmFsdWU7aWYoYy5pbmRleE9mKCI+IikhPT0tMSl7dmFyIGU9dGhpcy5fcGFyc2VUYWcoYyk7cmV0dXJuIGUuc3RhcnQ9ZCxlLmVuZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrYi52YWx1ZS5sZW5ndGh9LGEuc3RlcEZvcndhcmQoKSxlfX13aGlsZShiPWEuc3RlcEZvcndhcmQoKSk7cmV0dXJuIG51bGx9LHRoaXMuX3JlYWRUYWdCYWNrd2FyZD1mdW5jdGlvbihhKXt2YXIgYj1hLmdldEN1cnJlbnRUb2tlbigpO2lmKCFiKXJldHVybiBudWxsO3ZhciBjPSIiLGQ7ZG8gaWYoYi50eXBlLmluZGV4T2YoIm1ldGEudGFnIik9PT0wKXtkfHwoZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrYi52YWx1ZS5sZW5ndGh9KSxjPWIudmFsdWUrYztpZihjLmluZGV4T2YoIjwiKSE9PS0xKXt2YXIgZT10aGlzLl9wYXJzZVRhZyhjKTtyZXR1cm4gZS5lbmQ9ZCxlLnN0YXJ0PXtyb3c6YS5nZXRDdXJyZW50VG9rZW5Sb3coKSxjb2x1bW46YS5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKX0sYS5zdGVwQmFja3dhcmQoKSxlfX13aGlsZShiPWEuc3RlcEJhY2t3YXJkKCkpO3JldHVybiBudWxsfSx0aGlzLl9wb3A9ZnVuY3Rpb24oYSxiKXt3aGlsZShhLmxlbmd0aCl7dmFyIGM9YVthLmxlbmd0aC0xXTtpZighYnx8Yy50YWdOYW1lPT1iLnRhZ05hbWUpcmV0dXJuIGEucG9wKCk7aWYodGhpcy52b2lkRWxlbWVudHNbYi50YWdOYW1lXSlyZXR1cm47aWYodGhpcy52b2lkRWxlbWVudHNbYy50YWdOYW1lXSl7YS5wb3AoKTtjb250aW51ZX1yZXR1cm4gbnVsbH19LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9nZXRGaXJzdFRhZ0luTGluZShhLGMpO2lmKCFkLm1hdGNoKXJldHVybiBudWxsO3ZhciBlPWQuY2xvc2luZ3x8ZC5zZWxmQ2xvc2luZyxnPVtdLGk7aWYoIWUpe3ZhciBqPW5ldyBoKGEsYyxkLmNvbHVtbiksaz17cm93OmMsY29sdW1uOmQuY29sdW1uK2QudGFnTmFtZS5sZW5ndGgrMn07d2hpbGUoaT10aGlzLl9yZWFkVGFnRm9yd2FyZChqKSl7aWYoaS5zZWxmQ2xvc2luZyl7aWYoIWcubGVuZ3RoKXJldHVybiBpLnN0YXJ0LmNvbHVtbis9aS50YWdOYW1lLmxlbmd0aCsyLGkuZW5kLmNvbHVtbi09MixmLmZyb21Qb2ludHMoaS5zdGFydCxpLmVuZCk7Y29udGludWV9aWYoaS5jbG9zaW5nKXt0aGlzLl9wb3AoZyxpKTtpZihnLmxlbmd0aD09MClyZXR1cm4gZi5mcm9tUG9pbnRzKGssaS5zdGFydCl9ZWxzZSBnLnB1c2goaSl9fWVsc2V7dmFyIGo9bmV3IGgoYSxjLGQuY29sdW1uK2QubWF0Y2gubGVuZ3RoKSxsPXtyb3c6Yyxjb2x1bW46ZC5jb2x1bW59O3doaWxlKGk9dGhpcy5fcmVhZFRhZ0JhY2t3YXJkKGopKXtpZihpLnNlbGZDbG9zaW5nKXtpZighZy5sZW5ndGgpcmV0dXJuIGkuc3RhcnQuY29sdW1uKz1pLnRhZ05hbWUubGVuZ3RoKzIsaS5lbmQuY29sdW1uLT0yLGYuZnJvbVBvaW50cyhpLnN0YXJ0LGkuZW5kKTtjb250aW51ZX1pZighaS5jbG9zaW5nKXt0aGlzLl9wb3AoZyxpKTtpZihnLmxlbmd0aD09MClyZXR1cm4gaS5zdGFydC5jb2x1bW4rPWkudGFnTmFtZS5sZW5ndGgrMixmLmZyb21Qb2ludHMoaS5zdGFydCxsKX1lbHNlIGcucHVzaChpKX19fX0uY2FsbChpLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IiwiYWNlL3JhbmdlIiwiYWNlL3dvcmtlci93b3JrZXJfY2xpZW50IiwiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyxoPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGk9YSgiLi4vcmFuZ2UiKS5SYW5nZSxqPWEoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50LGs9YSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLGw9YSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlLG09ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRvdXRkZW50PW5ldyBoLHRoaXMuJGJlaGF2aW91cj1uZXcgayx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgbH07ZC5pbmhlcml0cyhtLGUpLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ITAsZj0vXihccyopXC9cLy87Zm9yKHZhciBnPWM7Zzw9ZDtnKyspaWYoIWYudGVzdChiLmdldExpbmUoZykpKXtlPSExO2JyZWFrfWlmKGUpe3ZhciBoPW5ldyBpKDAsMCwwLDApO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKXt2YXIgaj1iLmdldExpbmUoZyksaz1qLm1hdGNoKGYpO2guc3RhcnQucm93PWcsaC5lbmQucm93PWcsaC5lbmQuY29sdW1uPWtbMF0ubGVuZ3RoLGIucmVwbGFjZShoLGtbMV0pfX1lbHNlIGIuaW5kZW50Um93cyhjLGQsIi8vIil9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucyxnPWUuc3RhdGU7aWYoZi5sZW5ndGgmJmZbZi5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiBkO2lmKGE9PSJzdGFydCJ8fGE9PSJyZWdleF9hbGxvd2VkIil7dmFyIGg9Yi5tYXRjaCgvXi4qKD86XGJjYXNlXGIuKlw6fFtce1woXFtdKVxzKiQvKTtoJiYoZCs9Yyl9ZWxzZSBpZihhPT0iZG9jLXN0YXJ0Iil7aWYoZz09InN0YXJ0Inx8YT09InJlZ2V4X2FsbG93ZWQiKXJldHVybiIiO3ZhciBoPWIubWF0Y2goL15ccyooXC8/KVwqLyk7aCYmKGhbMV0mJihkKz0iICIpLGQrPSIqICIpfXJldHVybiBkfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGooWyJhY2UiXSwid29ya2VyLWphdmFzY3JpcHQuanMiLCJhY2UvbW9kZS9qYXZhc2NyaXB0X3dvcmtlciIsIkphdmFTY3JpcHRXb3JrZXIiKTtyZXR1cm4gYi5hdHRhY2hUb0RvY3VtZW50KGEuZ2V0RG9jdW1lbnQoKSksYi5vbigianNsaW50IixmdW5jdGlvbihiKXt2YXIgYz1bXTtmb3IodmFyIGQ9MDtkPGIuZGF0YS5sZW5ndGg7ZCsrKXt2YXIgZT1iLmRhdGFbZF07ZSYmYy5wdXNoKHtyb3c6ZS5saW5lLTEsY29sdW1uOmUuY2hhcmFjdGVyLTEsdGV4dDplLnJlYXNvbix0eXBlOiJ3YXJuaW5nIixsaW50OmV9KX1hLnNldEFubm90YXRpb25zKGMpfSksYi5vbigibmFyY2lzc3VzIixmdW5jdGlvbihiKXthLnNldEFubm90YXRpb25zKFtiLmRhdGFdKX0pLGIub24oInRlcm1pbmF0ZSIsZnVuY3Rpb24oKXthLmNsZWFyQW5ub3RhdGlvbnMoKX0pLGJ9fS5jYWxsKG0ucHJvdG90eXBlKSxiLk1vZGU9bX0pLGRlZmluZSgiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS91bmljb2RlIiwiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4uL2xpYi9sYW5nIiksZj1hKCIuLi91bmljb2RlIiksZz1hKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyxoPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsaT1mdW5jdGlvbigpe3ZhciBhPWUuYXJyYXlUb01hcCgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXxOYW1lc3BhY2V8UU5hbWV8WE1MfFhNTExpc3R8QXJyYXlCdWZmZXJ8RmxvYXQzMkFycmF5fEZsb2F0NjRBcnJheXxJbnQxNkFycmF5fEludDMyQXJyYXl8SW50OEFycmF5fFVpbnQxNkFycmF5fFVpbnQzMkFycmF5fFVpbnQ4QXJyYXl8VWludDhDbGFtcGVkQXJyYXl8RXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufFN5bnRheEVycm9yfFR5cGVFcnJvcnxVUklFcnJvcnxkZWNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxlbmNvZGVVUklDb21wb25lbnR8ZXZhbHxpc0Zpbml0ZXxpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fEpTT058TWF0aHx0aGlzfGFyZ3VtZW50c3xwcm90b3R5cGV8d2luZG93fGRvY3VtZW50Ii5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgiYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufGlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8Y29uc3R8eWllbGR8aW1wb3J0fGdldHxzZXQiLnNwbGl0KCJ8IikpLGM9ImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGQiLGQ9ZS5hcnJheVRvTWFwKCJfX3BhcmVudF9ffF9fY291bnRfX3xlc2NhcGV8dW5lc2NhcGV8d2l0aHxfX3Byb3RvX18iLnNwbGl0KCJ8IikpLGg9ZS5hcnJheVRvTWFwKCJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIi5zcGxpdCgifCIpKSxpPWUuYXJyYXlUb01hcCgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIi5zcGxpdCgifCIpKSxqPWUuYXJyYXlUb01hcCgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8cHVibGljfGludGVyZmFjZXxwYWNrYWdlfHByb3RlY3RlZHxzdGF0aWMiLnNwbGl0KCJ8IikpLGs9IlsiK2YucGFja2FnZXMuTCsiXFwkX11bIitmLnBhY2thZ2VzLkwrZi5wYWNrYWdlcy5NbitmLnBhY2thZ2VzLk1jK2YucGFja2FnZXMuTmQrZi5wYWNrYWdlcy5QYysiXFwkX10qXFxiIjt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qJCJ9LChuZXcgZykuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qXFxcXCQnLG5leHQ6InFxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKlxcXFwkIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiMFt4WF1bMC05YS1mQS1GXStcXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjpbImtleXdvcmQuZGVmaW5pdGlvbiIsInRleHQiLCJlbnRpdHkubmFtZS5mdW5jdGlvbiJdLHJlZ2V4OiIoZnVuY3Rpb24pKFxccyspKCIraysiKSJ9LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIscmVnZXg6Iig/OnRydWV8ZmFsc2UpXFxiIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiKD86IitjKyIpXFxiIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOmZ1bmN0aW9uKGMpe3JldHVybiBhLmhhc093blByb3BlcnR5KGMpPyJ2YXJpYWJsZS5sYW5ndWFnZSI6ZC5oYXNPd25Qcm9wZXJ0eShjKT8iaW52YWxpZC5kZXByZWNhdGVkIjpoLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkLmRlZmluaXRpb24iOmIuaGFzT3duUHJvcGVydHkoYyk/ImtleXdvcmQiOmkuaGFzT3duUHJvcGVydHkoYyk/ImNvbnN0YW50Lmxhbmd1YWdlIjpqLmhhc093blByb3BlcnR5KGMpPyJpbnZhbGlkLmlsbGVnYWwiOmM9PSJkZWJ1Z2dlciI/ImludmFsaWQuZGVwcmVjYXRlZCI6ImlkZW50aWZpZXIifSxyZWdleDprfSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkiLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDoiXFw/fFxcOnxcXCx8XFw7fFxcLiIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoicGFyZW4ubHBhcmVuIixyZWdleDoiW1soe10iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IltcXF0pfV0ifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXC89PyIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6Il4jIS4qJCJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0scmVnZXhfYWxsb3dlZDpbe3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50X3JlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJcXC8iLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLHJlZ2V4Olt7dG9rZW46InJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikiLG5leHQ6InJlZ2V4In0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiL1xcdyoiLG5leHQ6InN0YXJ0IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiW15cXFxcL1xcW10rIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLHJlZ2V4OiJcXFsiLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsbWVyZ2U6ITB9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLHJlZ2V4X2NoYXJhY3Rlcl9jbGFzczpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MifSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiXSIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiW15cXFxcXFxdXSsiLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsbWVyZ2U6ITB9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLGNvbW1lbnRfcmVnZXhfYWxsb3dlZDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixtZXJnZTohMCxuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixtZXJnZTohMCxuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Jyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSx0aGlzLmVtYmVkUnVsZXMoZywiZG9jLSIsWyhuZXcgZykuZ2V0RW5kUnVsZSgic3RhcnQiKV0pfTtkLmluaGVyaXRzKGksaCksYi5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM9aX0pLGRlZmluZSgiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQuZG9jLnRhZyIscmVnZXg6IkBbXFx3XFxkX10rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxccysifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiVE9ETyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJbXkBcXCpdKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiIuIn1dfX07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXRTdGFydFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKig/PVxcKikiLG5leHQ6YX19LHRoaXMuZ2V0RW5kUnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwqXFwvIixuZXh0OmF9fX0uY2FsbChmLnByb3RvdHlwZSksYi5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9Zn0pLGRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4vXlxzKyQvLnRlc3QoYSk/L15ccypcfS8udGVzdChiKTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0TGluZShiKSxlPWMubWF0Y2goL14oXHMqXH0pLyk7aWYoIWUpcmV0dXJuIDA7dmFyIGY9ZVsxXS5sZW5ndGgsZz1hLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpiLGNvbHVtbjpmfSk7aWYoIWd8fGcucm93PT1iKXJldHVybiAwO3ZhciBoPXRoaXMuJGdldEluZGVudChhLmdldExpbmUoZy5yb3cpKTthLnJlcGxhY2UobmV3IGQoYiwwLGIsZi0xKSxoKX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9ZX0pLGRlZmluZSgiYWNlL3dvcmtlci93b3JrZXJfY2xpZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLGY9ZnVuY3Rpb24oYixkLGUsZil7dGhpcy5jaGFuZ2VMaXN0ZW5lcj10aGlzLmNoYW5nZUxpc3RlbmVyLmJpbmQodGhpcyk7aWYoYy5wYWNrYWdlZCl7dmFyIGc9dGhpcy4kZ3Vlc3NCYXNlUGF0aCgpO3RoaXMuJHdvcmtlcj1uZXcgV29ya2VyKGcrZCl9ZWxzZXt2YXIgaD10aGlzLiRub3JtYWxpemVQYXRoKGEubmFtZVRvVXJsKCJhY2Uvd29ya2VyL3dvcmtlciIsbnVsbCwiXyIpKTt0aGlzLiR3b3JrZXI9bmV3IFdvcmtlcihoKTt2YXIgaT17fTtmb3IodmFyIGo9MDtqPGIubGVuZ3RoO2orKyl7dmFyIGs9YltqXSxsPXRoaXMuJG5vcm1hbGl6ZVBhdGgoYS5uYW1lVG9VcmwoayxudWxsLCJfIikucmVwbGFjZSgvLmpzJC8sIiIpKTtpW2tdPWx9fXRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7aW5pdDohMCx0bG5zOmksbW9kdWxlOmUsY2xhc3NuYW1lOmZ9KSx0aGlzLmNhbGxiYWNrSWQ9MSx0aGlzLmNhbGxiYWNrcz17fTt2YXIgbT10aGlzO3RoaXMuJHdvcmtlci5vbmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IHdpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZyYmY29uc29sZS5sb2coYSksYX0sdGhpcy4kd29ya2VyLm9ubWVzc2FnZT1mdW5jdGlvbihhKXt2YXIgYj1hLmRhdGE7c3dpdGNoKGIudHlwZSl7Y2FzZSJsb2ciOndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZyYmY29uc29sZS5sb2coYi5kYXRhKTticmVhaztjYXNlImV2ZW50IjptLl9lbWl0KGIubmFtZSx7ZGF0YTpiLmRhdGF9KTticmVhaztjYXNlImNhbGwiOnZhciBjPW0uY2FsbGJhY2tzW2IuaWRdO2MmJihjKGIuZGF0YSksZGVsZXRlIG0uY2FsbGJhY2tzW2IuaWRdKX19fTsoKGZ1bmN0aW9uKCl7ZC5pbXBsZW1lbnQodGhpcyxlKSx0aGlzLiRub3JtYWxpemVQYXRoPWZ1bmN0aW9uKGEpe3JldHVybiBhPWEucmVwbGFjZSgvXlthLXpdKzpcL1wvW15cL10rXC8vLCIiKSxhPWxvY2F0aW9uLnByb3RvY29sKyIvLyIrbG9jYXRpb24uaG9zdCsoYS5jaGFyQXQoMCk9PSIvIj8iIjpsb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKC9cL1teXC9dKiQvLCIiKSkrIi8iK2EucmVwbGFjZSgvXltcL10rLywiIiksYX0sdGhpcy4kZ3Vlc3NCYXNlUGF0aD1mdW5jdGlvbigpe2lmKGEuYWNlQmFzZVVybClyZXR1cm4gYS5hY2VCYXNlVXJsO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXSxlPWQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjZS1iYXNlIik7aWYoZSlyZXR1cm4gZS5yZXBsYWNlKC9cLyokLywiLyIpO3ZhciBmPWQuc3JjfHxkLmdldEF0dHJpYnV0ZSgic3JjIik7aWYoIWYpY29udGludWU7dmFyIGc9Zi5tYXRjaCgvXig/OiguKlwvKWFjZVwuanN8KC4qXC8pYWNlKC11bmNvbXByZXNzZWQpPygtbm9jb25mbGljdCk/XC5qcykoPzpcP3wkKS8pO2lmKGcpcmV0dXJuIGdbMV18fGdbMl19cmV0dXJuIiJ9LHRoaXMudGVybWluYXRlPWZ1bmN0aW9uKCl7dGhpcy5fZW1pdCgidGVybWluYXRlIix7fSksdGhpcy4kd29ya2VyLnRlcm1pbmF0ZSgpLHRoaXMuJHdvcmtlcj1udWxsLHRoaXMuJGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHRoaXMuY2hhbmdlTGlzdGVuZXIpLHRoaXMuJGRvYz1udWxsfSx0aGlzLnNlbmQ9ZnVuY3Rpb24oYSxiKXt0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6YSxhcmdzOmJ9KX0sdGhpcy5jYWxsPWZ1bmN0aW9uKGEsYixjKXtpZihjKXt2YXIgZD10aGlzLmNhbGxiYWNrSWQrKzt0aGlzLmNhbGxiYWNrc1tkXT1jLGIucHVzaChkKX10aGlzLnNlbmQoYSxiKX0sdGhpcy5lbWl0PWZ1bmN0aW9uKGEsYil7dHJ5e3RoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7ZXZlbnQ6YSxkYXRhOntkYXRhOmIuZGF0YX19KX1jYXRjaChjKXt9fSx0aGlzLmF0dGFjaFRvRG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dGhpcy4kZG9jJiZ0aGlzLnRlcm1pbmF0ZSgpLHRoaXMuJGRvYz1hLHRoaXMuY2FsbCgic2V0VmFsdWUiLFthLmdldFZhbHVlKCldKSxhLm9uKCJjaGFuZ2UiLHRoaXMuY2hhbmdlTGlzdGVuZXIpfSx0aGlzLmNoYW5nZUxpc3RlbmVyPWZ1bmN0aW9uKGEpe2EucmFuZ2U9e3N0YXJ0OmEuZGF0YS5yYW5nZS5zdGFydCxlbmQ6YS5kYXRhLnJhbmdlLmVuZH0sdGhpcy5lbWl0KCJjaGFuZ2UiLGEpfX0pKS5jYWxsKGYucHJvdG90eXBlKSxiLldvcmtlckNsaWVudD1mfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZj1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGc9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307ZC5pbmhlcml0cyhnLGYpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9Lyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS8sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKSxmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXg7aWYoZlsxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGEsZlsxXSxjLGcpO3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcrZlswXS5sZW5ndGgpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH1pZihiIT09Im1hcmtiZWdpbmVuZCIpcmV0dXJuO3ZhciBmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleCtmWzBdLmxlbmd0aDtpZihmWzJdKXt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9dmFyIGk9e3JvdzpjLGNvbHVtbjpnfSxqPWEuJGZpbmRPcGVuaW5nQnJhY2tldChmWzFdLGkpO2lmKCFqKXJldHVybjtyZXR1cm4gai5jb2x1bW4rKyxpLmNvbHVtbi0tLGUuZnJvbVBvaW50cyhqLGkpfX19LmNhbGwoZy5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9zdmdfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3htbF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS94bWxfdXRpbCJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyxmPWEoIi4veG1sX2hpZ2hsaWdodF9ydWxlcyIpLlhtbEhpZ2hsaWdodFJ1bGVzLGc9YSgiLi94bWxfdXRpbCIpLGg9ZnVuY3Rpb24oKXtmLmNhbGwodGhpcyksdGhpcy4kcnVsZXMuc3RhcnQuc3BsaWNlKDMsMCx7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPCg/PXMqc2NyaXB0KSIsbmV4dDoic2NyaXB0In0pLGcudGFnKHRoaXMuJHJ1bGVzLCJzY3JpcHQiLCJqcy1zdGFydCIpLHRoaXMuZW1iZWRSdWxlcyhlLCJqcy0iLFt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKig/PTxcXC9zY3JpcHQ+KSIsbmV4dDoidGFnIn0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjxcXC8oPz1zY3JpcHQpIixuZXh0OiJ0YWcifV0pfTtkLmluaGVyaXRzKGgsZiksYi5TdmdIaWdobGlnaHRSdWxlcz1ofSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL21peGVkIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxmPWIuRm9sZE1vZGU9ZnVuY3Rpb24oYSxiKXt0aGlzLmRlZmF1bHRNb2RlPWEsdGhpcy5zdWJNb2Rlcz1ifTtkLmluaGVyaXRzKGYsZSksZnVuY3Rpb24oKXt0aGlzLiRnZXRNb2RlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiB0aGlzLnN1Yk1vZGVzKWlmKGEuaW5kZXhPZihiKT09PTApcmV0dXJuIHRoaXMuc3ViTW9kZXNbYl07cmV0dXJuIG51bGx9LHRoaXMuJHRyeU1vZGU9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9dGhpcy4kZ2V0TW9kZShhKTtyZXR1cm4gZT9lLmdldEZvbGRXaWRnZXQoYixjLGQpOiIifSx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiR0cnlNb2RlKGEuZ2V0U3RhdGUoYy0xKSxhLGIsYyl8fHRoaXMuJHRyeU1vZGUoYS5nZXRTdGF0ZShjKSxhLGIsYyl8fHRoaXMuZGVmYXVsdE1vZGUuZ2V0Rm9sZFdpZGdldChhLGIsYyl9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLiRnZXRNb2RlKGEuZ2V0U3RhdGUoYy0xKSk7aWYoIWR8fCFkLmdldEZvbGRXaWRnZXQoYSxiLGMpKWQ9dGhpcy4kZ2V0TW9kZShhLmdldFN0YXRlKGMpKTtpZighZHx8IWQuZ2V0Rm9sZFdpZGdldChhLGIsYykpZD10aGlzLmRlZmF1bHRNb2RlO3JldHVybiBkLmdldEZvbGRXaWRnZXRSYW5nZShhLGIsYyl9fS5jYWxsKGYucHJvdG90eXBlKX0pLGZ1bmN0aW9uKCl7d2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sZnVuY3Rpb24oYSl7d2luZG93LmFjZXx8KHdpbmRvdy5hY2U9e30pO2Zvcih2YXIgYiBpbiBhKWEuaGFzT3duUHJvcGVydHkoYikmJihhY2VbYl09YVtiXSl9KX0oKQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-textile-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBLZWxsZXkgdmFuIEV2ZXJ0IDxrZWxsZXkudmFuZXZlcnRAZ21haWwuY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvdGV4dGlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3RleHRpbGVfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBUZXh0aWxlSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRpbGVfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dGlsZUhpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgVGV4dGlsZUhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICBpZiAoc3RhdGUgPT0gImludGFnIikNCiAgICAgICAgICAgIHJldHVybiB0YWI7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCiAgICANCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgS2VsbGV5IHZhbiBFdmVydCA8a2VsbGV5LnZhbmV2ZXJ0QGdtYWlsLmNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3RleHRpbGVfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgVGV4dGlsZUhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUubWF0Y2goL15oXGQkLykpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm1hcmt1cC5oZWFkaW5nLiIgKyB2YWx1ZS5jaGFyQXQoMSk7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAibWFya3VwLmhlYWRpbmciOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgcmVnZXggOiAiaDF8aDJ8aDN8aDR8aDV8aDZ8YnF8cHxiY3xwcmUiLA0KICAgICAgICAgICAgICAgIG5leHQgIDogImJsb2NrdGFnIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFwqXSt8WyNdKyINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJibG9ja3RhZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwuICIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcKCIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAiYmxvY2t0YWdwcm9wZXJ0aWVzIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiYmxvY2t0YWdwcm9wZXJ0aWVzIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXCkiLA0KICAgICAgICAgICAgICAgIG5leHQgIDogImJsb2NrdGFnIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlthLXpBLVowLTlcXC1fXSsiDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiMiDQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKFRleHRpbGVIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5UZXh0aWxlSGlnaGxpZ2h0UnVsZXMgPSBUZXh0aWxlSGlnaGxpZ2h0UnVsZXM7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7DQogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7DQoNCiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsNCiAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IGRvYy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59KTsNCg0KICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsNCn0pOw0KOw0KICAgICAgICAgICAgKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpDQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgIA==]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgWG1sSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3htbF9oaWdobGlnaHRfcnVsZXMiKS5YbWxIaWdobGlnaHRSdWxlczsNCnZhciBYbWxCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci94bWwiKS5YbWxCZWhhdmlvdXI7DQp2YXIgWG1sRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcveG1sIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgWG1sSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgWG1sQmVoYXZpb3VyKCk7DQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgWG1sRm9sZE1vZGUoKTsNCn07DQoNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCiAgICANCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICByZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS94bWxfdXRpbCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciB4bWxVdGlsID0gcmVxdWlyZSgiLi94bWxfdXRpbCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBYbWxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICBzdGFydCA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXCFcXFtDREFUQVxcWyIsDQogICAgICAgICAgICBuZXh0IDogImNkYXRhIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ4bWxfcGUiLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcPy4qP1xcPz4iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcIS0tIiwNCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLCAvLyBvcGVuaW5nIHRhZw0KICAgICAgICAgICAgcmVnZXggOiAiPFxcLz8iLA0KICAgICAgICAgICAgbmV4dCA6ICJ0YWciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJbXjxdKyINCiAgICAgICAgfV0sDQogICAgICAgIA0KICAgICAgICBjZGF0YSA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcXVxcXT4iLA0KICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxdXXxcXF0oPyFcXF0+KSkrIg0KICAgICAgICB9XSwNCg0KICAgICAgICBjb21tZW50IDogW3sNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgcmVnZXggOiAiLio/LS0+IiwNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgIH1dDQogICAgfTsNCiAgICANCiAgICB4bWxVdGlsLnRhZyh0aGlzLiRydWxlcywgInRhZyIsICJzdGFydCIpOw0KfTsNCg0Kb29wLmluaGVyaXRzKFhtbEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLlhtbEhpZ2hsaWdodFJ1bGVzID0gWG1sSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3htbF91dGlsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2xhbmcnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCg0KdmFyIGZvcm1UYWdzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICgiYnV0dG9ufGZvcm18aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhIikuc3BsaXQoInwiKQ0KKTsNCg0KdmFyIHRhYmxlVGFncyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAoInRhYmxlfHRib2R5fHRkfHRmb290fHRofHRyIikuc3BsaXQoInwiKQ0KKTsNCg0KZnVuY3Rpb24gc3RyaW5nKHN0YXRlKSB7DQogICAgcmV0dXJuIFt7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgIHJlZ2V4IDogJyIuKj8iJw0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICdbIl0uKicsDQogICAgICAgIG5leHQgOiBzdGF0ZSArICJfcXFzdHJpbmciDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICByZWdleCA6ICInLio/JyINCiAgICB9LCB7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgcmVnZXggOiAiWyddLioiLA0KICAgICAgICBuZXh0IDogc3RhdGUgKyAiX3FzdHJpbmciDQogICAgfV07DQp9DQoNCmZ1bmN0aW9uIG11bHRpTGluZVN0cmluZyhxdW90ZSwgc3RhdGUpIHsNCiAgICByZXR1cm4gW3sNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICIuKj8iICsgcXVvdGUsDQogICAgICAgIG5leHQgOiBzdGF0ZQ0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICcuKycNCiAgICB9XTsNCn0NCg0KZXhwb3J0cy50YWcgPSBmdW5jdGlvbihzdGF0ZXMsIG5hbWUsIG5leHRTdGF0ZSkgew0KICAgIHN0YXRlc1tuYW1lXSA9IFt7DQogICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgIH0sIHsNCiAgICAgICAgLy90b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgIA0KICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgIGlmICggdmFsdWU9PT0nYScgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5hbmNob3IiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlPT09J2ltZycgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5pbWFnZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc2NyaXB0JyApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLnNjcmlwdCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc3R5bGUnICkgew0KICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuc3R5bGUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoZm9ybVRhZ3MuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLmZvcm0iOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGFibGVUYWdzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy50YWJsZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwgICAgICAgIA0KICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgIHJlZ2V4IDogIlstX2EtekEtWjAtOTohXSsiLA0KICAgICAgICBuZXh0IDogbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiIA0KICAgIH0sIHsNCiAgICAgICAgdG9rZW46ICJlbXB0eSIsDQogICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgbmV4dCA6IG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Ig0KICAgIH1dOw0KDQogICAgc3RhdGVzW25hbWUgKyAiX3FzdHJpbmciXSA9IG11bHRpTGluZVN0cmluZygiJyIsIG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Iik7DQogICAgc3RhdGVzW25hbWUgKyAiX3Fxc3RyaW5nIl0gPSBtdWx0aUxpbmVTdHJpbmcoIlwiIiwgbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiKTsNCiAgICANCiAgICBzdGF0ZXNbbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiXSA9IFt7DQogICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICJcLz8+IiwNCiAgICAgICAgbmV4dCA6IG5leHRTdGF0ZQ0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgIHJlZ2V4IDogIj0iDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUiLA0KICAgICAgICByZWdleCA6ICJbLV9hLXpBLVowLTk6XSsiDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICB9XS5jb25jYXQoc3RyaW5nKG5hbWUpKTsNCn07DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXI7DQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQoNCnZhciBYbWxCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQogICAgDQogICAgdGhpcy5pbmhlcml0KENzdHlsZUJlaGF2aW91ciwgWyJzdHJpbmdfZHF1b3RlcyJdKTsgLy8gR2V0IHN0cmluZyBiZWhhdmlvdXINCiAgICANCiAgICB0aGlzLmFkZCgiYnJhY2tldHMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnPCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJzw+JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnPicpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICc+JykgeyAvLyBuZWVkIHNvbWUga2luZCBvZiBtYXRjaGluZyBjaGVjayBoZXJlDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhcnMgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFycyA9PSAnPC8nKSB7DQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpKSArIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCiAgICANCn0NCm9vcC5pbmhlcml0cyhYbWxCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuWG1sQmVoYXZpb3VyID0gWG1sQmVoYXZpb3VyOw0KfSk7LyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmVoYXZpb3VyID0gcmVxdWlyZSgnLi4vYmVoYXZpb3VyJykuQmVoYXZpb3VyOw0KDQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgew0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3snICsgc2VsZWN0ZWQgKyAnfScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7fScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJ30nKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJ30nLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiArIDF9KTsNCiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykNCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KDQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCcgKyBzZWxlY3RlZCArICcpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnKScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnKScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7DQoNCiAgICAgICAgICAgICAgICAvLyBXZSdyZSBlc2NhcGVkLg0KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIEZpbmQgd2hhdCB0b2tlbiB3ZSdyZSBpbnNpZGUuDQogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHNlbGVjdGlvbi5zdGFydC5yb3csIHNlbGVjdGlvbi5zdGFydC5yb3cpWzBdLnRva2VuczsNCiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47DQogICAgICAgICAgICAgICAgdmFyIHF1b3RlcG9zID0gLTE7IC8vIFRyYWNrIHdoZXRoZXIgd2UncmUgaW5zaWRlIGFuIG9wZW4gcXVvdGUuDQoNCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1t4XTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1b3RlcG9zIDwgMCkgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gdG9rZW4udmFsdWUuaW5kZXhPZignIicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgodG9rZW4udmFsdWUubGVuZ3RoICsgY29sKSA+IHNlbGVjdGlvbi5zdGFydC5jb2x1bW4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbCArPSB0b2tlbnNbeF0udmFsdWUubGVuZ3RoOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIFRyeSBhbmQgYmUgc21hcnQgYWJvdXQgd2hlbiB3ZSBhdXRvIGluc2VydC4NCiAgICAgICAgICAgICAgICBpZiAoIXRva2VuIHx8IChxdW90ZXBvcyA8IDAgJiYgdG9rZW4udHlwZSAhPT0gImNvbW1lbnQiICYmICh0b2tlbi50eXBlICE9PSAic3RyaW5nIiB8fCAoKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gIT09IHRva2VuLnZhbHVlLmxlbmd0aCtjb2wtMSkgJiYgdG9rZW4udmFsdWUubGFzdEluZGV4T2YoJyInKSA9PT0gdG9rZW4udmFsdWUubGVuZ3RoLTEpKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICciIicsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgPT09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnB1dCBhbmQgbW92ZSByaWdodCBvbmUgaWYgd2UncmUgdHlwaW5nIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuDQogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCn0NCm9vcC5pbmhlcml0cyhDc3R5bGVCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOw0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy94bWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCAnYWNlL3Rva2VuX2l0ZXJhdG9yJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi8uLi9saWIvbGFuZyIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KdmFyIFRva2VuSXRlcmF0b3IgPSByZXF1aXJlKCIuLi8uLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3I7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbih2b2lkRWxlbWVudHMpIHsNCiAgICBCYXNlRm9sZE1vZGUuY2FsbCh0aGlzKTsNCiAgICB0aGlzLnZvaWRFbGVtZW50cyA9IHZvaWRFbGVtZW50cyB8fCB7fTsNCn07DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciB0YWcgPSB0aGlzLl9nZXRGaXJzdFRhZ0luTGluZShzZXNzaW9uLCByb3cpOw0KDQogICAgICAgIGlmICh0YWcuY2xvc2luZykNCiAgICAgICAgICAgIHJldHVybiBmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCIgPyAiZW5kIiA6ICIiOw0KDQogICAgICAgIGlmICghdGFnLnRhZ05hbWUgfHwgdGhpcy52b2lkRWxlbWVudHNbdGFnLnRhZ05hbWUudG9Mb3dlckNhc2UoKV0pDQogICAgICAgICAgICByZXR1cm4gIiI7DQoNCiAgICAgICAgaWYgKHRhZy5zZWxmQ2xvc2luZykNCiAgICAgICAgICAgIHJldHVybiAiIjsNCg0KICAgICAgICBpZiAodGFnLnZhbHVlLmluZGV4T2YoIi8iICsgdGFnLnRhZ05hbWUpICE9PSAtMSkNCiAgICAgICAgICAgIHJldHVybiAiIjsNCg0KICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93KSB7DQogICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2Vucyhyb3csIHJvdylbMF0udG9rZW5zOw0KICAgICAgICB2YXIgdmFsdWUgPSAiIjsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsNCiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlLmluZGV4T2YoIm1ldGEudGFnIikgPT09IDApDQogICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW4udmFsdWU7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgdmFsdWUgKz0gbGFuZy5zdHJpbmdSZXBlYXQoIiAiLCB0b2tlbi52YWx1ZS5sZW5ndGgpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgIH07DQoNCiAgICB0aGlzLnRhZ1JlID0gL14oXHMqKSg8PyhcLz8pKFstX2EtekEtWjAtOTohXSopXHMqKFwvPyk+PykvOw0KICAgIHRoaXMuX3BhcnNlVGFnID0gZnVuY3Rpb24odGFnKSB7DQogICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSB0aGlzLnRhZ1JlLmV4ZWModGFnKTsNCiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMudGFnUmUubGFzdEluZGV4IHx8IDA7DQogICAgICAgIHRoaXMudGFnUmUubGFzdEluZGV4ID0gMDsNCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdmFsdWU6IHRhZywNCiAgICAgICAgICAgIG1hdGNoOiBtYXRjaCA/IG1hdGNoWzJdIDogIiIsDQogICAgICAgICAgICBjbG9zaW5nOiBtYXRjaCA/ICEhbWF0Y2hbM10gOiBmYWxzZSwNCiAgICAgICAgICAgIHNlbGZDbG9zaW5nOiBtYXRjaCA/ICEhbWF0Y2hbNV0gfHwgbWF0Y2hbMl0gPT0gIi8+IiA6IGZhbHNlLA0KICAgICAgICAgICAgdGFnTmFtZTogbWF0Y2ggPyBtYXRjaFs0XSA6ICIiLA0KICAgICAgICAgICAgY29sdW1uOiBtYXRjaFsxXSA/IGNvbHVtbiArIG1hdGNoWzFdLmxlbmd0aCA6IGNvbHVtbg0KICAgICAgICB9Ow0KICAgIH07DQogICAgDQogICAgLyoqDQogICAgICogcmVhZHMgYSBmdWxsIHRhZyBhbmQgcGxhY2VzIHRoZSBpdGVyYXRvciBhZnRlciB0aGUgdGFnDQogICAgICovDQogICAgdGhpcy5fcmVhZFRhZ0ZvcndhcmQgPSBmdW5jdGlvbihpdGVyYXRvcikgew0KICAgICAgICB2YXIgdG9rZW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW4oKTsNCiAgICAgICAgaWYgKCF0b2tlbikNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciB2YWx1ZSA9ICIiOw0KICAgICAgICB2YXIgc3RhcnQ7DQogICAgICAgIA0KICAgICAgICBkbyB7DQogICAgICAgICAgICBpZiAodG9rZW4udHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpID09PSAwKSB7DQogICAgICAgICAgICAgICAgaWYgKCFzdGFydCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YWx1ZSArPSB0b2tlbi52YWx1ZTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiPiIpICE9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQgPSBzdGFydDsNCiAgICAgICAgICAgICAgICAgICAgdGFnLmVuZCA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoDQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnN0ZXBGb3J3YXJkKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IHdoaWxlKHRva2VuID0gaXRlcmF0b3Iuc3RlcEZvcndhcmQoKSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX3JlYWRUYWdCYWNrd2FyZCA9IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogICAgICAgIHZhciB0b2tlbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbigpOw0KICAgICAgICBpZiAoIXRva2VuKQ0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICANCiAgICAgICAgdmFyIHZhbHVlID0gIiI7DQogICAgICAgIHZhciBlbmQ7DQoNCiAgICAgICAgZG8gew0KICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUuaW5kZXhPZigibWV0YS50YWciKSA9PT0gMCkgew0KICAgICAgICAgICAgICAgIGlmICghZW5kKSB7DQogICAgICAgICAgICAgICAgICAgIGVuZCA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoDQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhbHVlID0gdG9rZW4udmFsdWUgKyB2YWx1ZTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiPCIpICE9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICB0YWcuZW5kID0gZW5kOw0KICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zdGVwQmFja3dhcmQoKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gd2hpbGUodG9rZW4gPSBpdGVyYXRvci5zdGVwQmFja3dhcmQoKSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX3BvcCA9IGZ1bmN0aW9uKHN0YWNrLCB0YWcpIHsNCiAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkgew0KICAgICAgICAgICAgDQogICAgICAgICAgICB2YXIgdG9wID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdOw0KICAgICAgICAgICAgaWYgKCF0YWcgfHwgdG9wLnRhZ05hbWUgPT0gdGFnLnRhZ05hbWUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucG9wKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZvaWRFbGVtZW50c1t0YWcudGFnTmFtZV0pIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZvaWRFbGVtZW50c1t0b3AudGFnTmFtZV0pIHsNCiAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTsNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGZpcnN0VGFnID0gdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoc2Vzc2lvbiwgcm93KTsNCiAgICAgICAgDQogICAgICAgIGlmICghZmlyc3RUYWcubWF0Y2gpDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgDQogICAgICAgIHZhciBpc0JhY2t3YXJkID0gZmlyc3RUYWcuY2xvc2luZyB8fCBmaXJzdFRhZy5zZWxmQ2xvc2luZzsNCiAgICAgICAgdmFyIHN0YWNrID0gW107DQogICAgICAgIHZhciB0YWc7DQogICAgICAgIA0KICAgICAgICBpZiAoIWlzQmFja3dhcmQpIHsNCiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IG5ldyBUb2tlbkl0ZXJhdG9yKHNlc3Npb24sIHJvdywgZmlyc3RUYWcuY29sdW1uKTsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IHJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IGZpcnN0VGFnLmNvbHVtbiArIGZpcnN0VGFnLnRhZ05hbWUubGVuZ3RoICsgMg0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHdoaWxlICh0YWcgPSB0aGlzLl9yZWFkVGFnRm9yd2FyZChpdGVyYXRvcikpIHsNCiAgICAgICAgICAgICAgICBpZiAodGFnLnNlbGZDbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCB0YWcuZW5kKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHRhZy5jbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcChzdGFjaywgdGFnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIHRhZy5zdGFydCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRhZykNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcihzZXNzaW9uLCByb3csIGZpcnN0VGFnLmNvbHVtbiArIGZpcnN0VGFnLm1hdGNoLmxlbmd0aCk7DQogICAgICAgICAgICB2YXIgZW5kID0gew0KICAgICAgICAgICAgICAgIHJvdzogcm93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogZmlyc3RUYWcuY29sdW1uDQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgDQogICAgICAgICAgICB3aGlsZSAodGFnID0gdGhpcy5fcmVhZFRhZ0JhY2t3YXJkKGl0ZXJhdG9yKSkgew0KICAgICAgICAgICAgICAgIGlmICh0YWcuc2VsZkNsb3NpbmcpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFjay5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5zdGFydC5jb2x1bW4gKz0gdGFnLnRhZ05hbWUubGVuZ3RoICsgMjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIHRhZy5lbmQpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoIXRhZy5jbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcChzdGFjaywgdGFnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIGVuZCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godGFnKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-xml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS94bWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2JlaGF2aW91ci94bWwiLCJhY2UvbW9kZS9mb2xkaW5nL3htbCJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4veG1sX2hpZ2hsaWdodF9ydWxlcyIpLlhtbEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9iZWhhdmlvdXIveG1sIikuWG1sQmVoYXZpb3VyLGk9YSgiLi9mb2xkaW5nL3htbCIpLkZvbGRNb2RlLGo9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRiZWhhdmlvdXI9bmV3IGgsdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGl9O2QuaW5oZXJpdHMoaixlKSxmdW5jdGlvbigpe3RoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRnZXRJbmRlbnQoYil9fS5jYWxsKGoucHJvdG90eXBlKSxiLk1vZGU9an0pLGRlZmluZSgiYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUveG1sX3V0aWwiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi94bWxfdXRpbCIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46InRleHQiLHJlZ2V4OiI8XFwhXFxbQ0RBVEFcXFsiLG5leHQ6ImNkYXRhIn0se3Rva2VuOiJ4bWxfcGUiLHJlZ2V4OiI8XFw/Lio/XFw/PiJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IjxcXCEtLSIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8XFwvPyIsbmV4dDoidGFnIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IltePF0rIn1dLGNkYXRhOlt7dG9rZW46InRleHQiLHJlZ2V4OiJcXF1cXF0+IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46InRleHQiLHJlZ2V4OiIoPzpbXlxcXV18XFxdKD8hXFxdPikpKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj8tLT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV19LGUudGFnKHRoaXMuJHJ1bGVzLCJ0YWciLCJzdGFydCIpfTtkLmluaGVyaXRzKGcsZiksYi5YbWxIaWdobGlnaHRSdWxlcz1nfSksZGVmaW5lKCJhY2UvbW9kZS94bWxfdXRpbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBnKGEpe3JldHVyblt7dG9rZW46InN0cmluZyIscmVnZXg6JyIuKj8iJ30se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OidbIl0uKicsbmV4dDphKyJfcXFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6IicuKj8nIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKiIsbmV4dDphKyJfcXN0cmluZyJ9XX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW3t0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLio/IithLG5leHQ6Yn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0idXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2xhbmciKSxlPWQuYXJyYXlUb01hcCgiYnV0dG9ufGZvcm18aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhIi5zcGxpdCgifCIpKSxmPWQuYXJyYXlUb01hcCgidGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dHIiLnNwbGl0KCJ8IikpO2IudGFnPWZ1bmN0aW9uKGEsYixjKXthW2JdPVt7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09ImEiPyJtZXRhLnRhZy5hbmNob3IiOmE9PT0iaW1nIj8ibWV0YS50YWcuaW1hZ2UiOmE9PT0ic2NyaXB0Ij8ibWV0YS50YWcuc2NyaXB0IjphPT09InN0eWxlIj8ibWV0YS50YWcuc3R5bGUiOmUuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT8ibWV0YS50YWcuZm9ybSI6Zi5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpPyJtZXRhLnRhZy50YWJsZSI6Im1ldGEudGFnIn0sbWVyZ2U6ITAscmVnZXg6IlstX2EtekEtWjAtOTohXSsiLG5leHQ6YisiX2VtYmVkX2F0dHJpYnV0ZV9saXN0In0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDpiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QifV0sYVtiKyJfcXN0cmluZyJdPWgoIiciLGIrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCIpLGFbYisiX3Fxc3RyaW5nIl09aCgnIicsYisiX2VtYmVkX2F0dHJpYnV0ZV9saXN0IiksYVtiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QiXT1be3Rva2VuOiJtZXRhLnRhZyIsbWVyZ2U6ITAscmVnZXg6Ii8/PiIsbmV4dDpjfSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiI9In0se3Rva2VuOiJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUiLHJlZ2V4OiJbLV9hLXpBLVowLTk6XSsifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0uY29uY2F0KGcoYikpfX0pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL3htbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIiwiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9YSgiLi9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXIsZz1mdW5jdGlvbigpe3RoaXMuaW5oZXJpdChmLFsic3RyaW5nX2RxdW90ZXMiXSksdGhpcy5hZGQoImJyYWNrZXRzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSI8Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/ITE6e3RleHQ6Ijw+IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSI+Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iPiIpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX1lbHNlIGlmKGU9PSJcbiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGs9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMik7aWYoaz09IjwvIil7dmFyIGw9dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUoaC5yb3cpKStkLmdldFRhYlN0cmluZygpLG09dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUoaC5yb3cpKTtyZXR1cm57dGV4dDoiXG4iK2wrIlxuIittLHNlbGVjdGlvbjpbMSxsLmxlbmd0aCwxLGwubGVuZ3RoXX19fX0pfTtkLmluaGVyaXRzKGcsZSksYi5YbWxCZWhhdmlvdXI9Z30pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1mdW5jdGlvbigpe3RoaXMuYWRkKCJicmFjZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09InsiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoieyIrZysifSIsc2VsZWN0aW9uOiExfTp7dGV4dDoie30iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09In0iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCJ9Iix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGw9ZC5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6aC5yb3csY29sdW1uOmguY29sdW1uKzF9KTtpZighbClyZXR1cm4gbnVsbDt2YXIgbT10aGlzLmdldE5leHRMaW5lSW5kZW50KGEsaS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0xKSxkLmdldFRhYlN0cmluZygpKSxuPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGwucm93KSk7cmV0dXJue3RleHQ6IlxuIittKyJcbiIrbixzZWxlY3Rpb246WzEsbS5sZW5ndGgsMSxtLmxlbmd0aF19fX19KSx0aGlzLmFkZCgiYnJhY2VzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSJ7Iil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLmVuZC5jb2x1bW4sZS5lbmQuY29sdW1uKzEpO2lmKGg9PSJ9IilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgicGFyZW5zIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSIoIil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6IigiK2crIikiLHNlbGVjdGlvbjohMX06e3RleHQ6IigpIixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSIpIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iKSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgiKSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09IigiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09IikiKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0nIicpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtpZihnIT09IiIpcmV0dXJue3RleHQ6JyInK2crJyInLHNlbGVjdGlvbjohMX07dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbi0xLGguY29sdW1uKTtpZihqPT0iXFwiKXJldHVybiBudWxsO3ZhciBrPWQuZ2V0VG9rZW5zKGYuc3RhcnQucm93LGYuc3RhcnQucm93KVswXS50b2tlbnMsbD0wLG0sbj0tMTtmb3IodmFyIG89MDtvPGsubGVuZ3RoO28rKyl7bT1rW29dLG0udHlwZT09InN0cmluZyI/bj0tMTpuPDAmJihuPW0udmFsdWUuaW5kZXhPZignIicpKTtpZihtLnZhbHVlLmxlbmd0aCtsPmYuc3RhcnQuY29sdW1uKWJyZWFrO2wrPWtbb10udmFsdWUubGVuZ3RofWlmKCFtfHxuPDAmJm0udHlwZSE9PSJjb21tZW50IiYmKG0udHlwZSE9PSJzdHJpbmcifHxmLnN0YXJ0LmNvbHVtbiE9PW0udmFsdWUubGVuZ3RoK2wtMSYmbS52YWx1ZS5sYXN0SW5kZXhPZignIicpPT09bS52YWx1ZS5sZW5ndGgtMSkpcmV0dXJue3RleHQ6JyIiJyxzZWxlY3Rpb246WzEsMV19O2lmKG0mJm0udHlwZT09PSJzdHJpbmciKXt2YXIgcD1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihwPT0nIicpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSciJyl7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSciJylyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KX07ZC5pbmhlcml0cyhmLGUpLGIuQ3N0eWxlQmVoYXZpb3VyPWZ9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcveG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsImFjZS90b2tlbl9pdGVyYXRvciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vbGliL2xhbmciKSxmPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZz1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGg9YSgiLi4vLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yLGk9Yi5Gb2xkTW9kZT1mdW5jdGlvbihhKXtnLmNhbGwodGhpcyksdGhpcy52b2lkRWxlbWVudHM9YXx8e319O2QuaW5oZXJpdHMoaSxnKSxmdW5jdGlvbigpe3RoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoYSxjKTtyZXR1cm4gZC5jbG9zaW5nP2I9PSJtYXJrYmVnaW5lbmQiPyJlbmQiOiIiOiFkLnRhZ05hbWV8fHRoaXMudm9pZEVsZW1lbnRzW2QudGFnTmFtZS50b0xvd2VyQ2FzZSgpXT8iIjpkLnNlbGZDbG9zaW5nPyIiOmQudmFsdWUuaW5kZXhPZigiLyIrZC50YWdOYW1lKSE9PS0xPyIiOiJzdGFydCJ9LHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRUb2tlbnMoYixiKVswXS50b2tlbnMsZD0iIjtmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKyl7dmFyIGc9Y1tmXTtnLnR5cGUuaW5kZXhPZigibWV0YS50YWciKT09PTA/ZCs9Zy52YWx1ZTpkKz1lLnN0cmluZ1JlcGVhdCgiICIsZy52YWx1ZS5sZW5ndGgpfXJldHVybiB0aGlzLl9wYXJzZVRhZyhkKX0sdGhpcy50YWdSZT0vXihccyopKDw/KFwvPykoWy1fYS16QS1aMC05OiFdKilccyooXC8/KT4/KS8sdGhpcy5fcGFyc2VUYWc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy50YWdSZS5leGVjKGEpLGM9dGhpcy50YWdSZS5sYXN0SW5kZXh8fDA7cmV0dXJuIHRoaXMudGFnUmUubGFzdEluZGV4PTAse3ZhbHVlOmEsbWF0Y2g6Yj9iWzJdOiIiLGNsb3Npbmc6Yj8hIWJbM106ITEsc2VsZkNsb3Npbmc6Yj8hIWJbNV18fGJbMl09PSIvPiI6ITEsdGFnTmFtZTpiP2JbNF06IiIsY29sdW1uOmJbMV0/YytiWzFdLmxlbmd0aDpjfX0sdGhpcy5fcmVhZFRhZ0ZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRDdXJyZW50VG9rZW4oKTtpZighYilyZXR1cm4gbnVsbDt2YXIgYz0iIixkO2RvIGlmKGIudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MCl7aWYoIWQpdmFyIGQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfTtjKz1iLnZhbHVlO2lmKGMuaW5kZXhPZigiPiIpIT09LTEpe3ZhciBlPXRoaXMuX3BhcnNlVGFnKGMpO3JldHVybiBlLnN0YXJ0PWQsZS5lbmQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2IudmFsdWUubGVuZ3RofSxhLnN0ZXBGb3J3YXJkKCksZX19d2hpbGUoYj1hLnN0ZXBGb3J3YXJkKCkpO3JldHVybiBudWxsfSx0aGlzLl9yZWFkVGFnQmFja3dhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRDdXJyZW50VG9rZW4oKTtpZighYilyZXR1cm4gbnVsbDt2YXIgYz0iIixkO2RvIGlmKGIudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MCl7ZHx8KGQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2IudmFsdWUubGVuZ3RofSksYz1iLnZhbHVlK2M7aWYoYy5pbmRleE9mKCI8IikhPT0tMSl7dmFyIGU9dGhpcy5fcGFyc2VUYWcoYyk7cmV0dXJuIGUuZW5kPWQsZS5zdGFydD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9LGEuc3RlcEJhY2t3YXJkKCksZX19d2hpbGUoYj1hLnN0ZXBCYWNrd2FyZCgpKTtyZXR1cm4gbnVsbH0sdGhpcy5fcG9wPWZ1bmN0aW9uKGEsYil7d2hpbGUoYS5sZW5ndGgpe3ZhciBjPWFbYS5sZW5ndGgtMV07aWYoIWJ8fGMudGFnTmFtZT09Yi50YWdOYW1lKXJldHVybiBhLnBvcCgpO2lmKHRoaXMudm9pZEVsZW1lbnRzW2IudGFnTmFtZV0pcmV0dXJuO2lmKHRoaXMudm9pZEVsZW1lbnRzW2MudGFnTmFtZV0pe2EucG9wKCk7Y29udGludWV9cmV0dXJuIG51bGx9fSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoYSxjKTtpZighZC5tYXRjaClyZXR1cm4gbnVsbDt2YXIgZT1kLmNsb3Npbmd8fGQuc2VsZkNsb3NpbmcsZz1bXSxpO2lmKCFlKXt2YXIgaj1uZXcgaChhLGMsZC5jb2x1bW4pLGs9e3JvdzpjLGNvbHVtbjpkLmNvbHVtbitkLnRhZ05hbWUubGVuZ3RoKzJ9O3doaWxlKGk9dGhpcy5fcmVhZFRhZ0ZvcndhcmQoaikpe2lmKGkuc2VsZkNsb3Npbmcpe2lmKCFnLmxlbmd0aClyZXR1cm4gaS5zdGFydC5jb2x1bW4rPWkudGFnTmFtZS5sZW5ndGgrMixpLmVuZC5jb2x1bW4tPTIsZi5mcm9tUG9pbnRzKGkuc3RhcnQsaS5lbmQpO2NvbnRpbnVlfWlmKGkuY2xvc2luZyl7dGhpcy5fcG9wKGcsaSk7aWYoZy5sZW5ndGg9PTApcmV0dXJuIGYuZnJvbVBvaW50cyhrLGkuc3RhcnQpfWVsc2UgZy5wdXNoKGkpfX1lbHNle3ZhciBqPW5ldyBoKGEsYyxkLmNvbHVtbitkLm1hdGNoLmxlbmd0aCksbD17cm93OmMsY29sdW1uOmQuY29sdW1ufTt3aGlsZShpPXRoaXMuX3JlYWRUYWdCYWNrd2FyZChqKSl7aWYoaS5zZWxmQ2xvc2luZyl7aWYoIWcubGVuZ3RoKXJldHVybiBpLnN0YXJ0LmNvbHVtbis9aS50YWdOYW1lLmxlbmd0aCsyLGkuZW5kLmNvbHVtbi09MixmLmZyb21Qb2ludHMoaS5zdGFydCxpLmVuZCk7Y29udGludWV9aWYoIWkuY2xvc2luZyl7dGhpcy5fcG9wKGcsaSk7aWYoZy5sZW5ndGg9PTApcmV0dXJuIGkuc3RhcnQuY29sdW1uKz1pLnRhZ05hbWUubGVuZ3RoKzIsZi5mcm9tUG9pbnRzKGkuc3RhcnQsbCl9ZWxzZSBnLnB1c2goaSl9fX19LmNhbGwoaS5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-chrome-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2Nocm9tZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLWNocm9tZSI7DQpleHBvcnRzLmNzc1RleHQgPSAiLmFjZS1jaHJvbWUgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9ndXR0ZXIge1wNCiAgd2lkdGg6IDUwcHg7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCiAgY29sb3I6ICMzMzM7XA0KICBvdmVyZmxvdyA6IGhpZGRlbjtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9ndXR0ZXItbGF5ZXIge1wNCiAgd2lkdGg6IDEwMCU7XA0KICB0ZXh0LWFsaWduOiByaWdodDtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9ndXR0ZXItbGF5ZXIgLmFjZV9ndXR0ZXItY2VsbCB7XA0KICBwYWRkaW5nLXJpZ2h0OiA2cHg7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfcHJpbnRfbWFyZ2luIHtcDQogIHdpZHRoOiAxcHg7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2N1cnNvciB7XA0KICBib3JkZXItbGVmdDogMnB4IHNvbGlkIGJsYWNrO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XA0KfVwNCiAgICAgICAgXA0KLmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiByZ2IoMTkxLCAxOTEsIDE5MSk7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2tleXdvcmQge1wNCiAgY29sb3I6IGJsdWU7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9idWlsZGluIHtcDQogIGNvbG9yOiByZ2IoODgsIDcyLCAyNDYpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6IHJnYig4OCwgOTIsIDI0Nik7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9saWJyYXJ5IHtcDQogIGNvbG9yOiByZ2IoNiwgMTUwLCAxNCk7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2ludmFsaWQge1wNCiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1MywgMCwgMCk7XA0KICBjb2xvcjogd2hpdGU7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2ZvbGQge1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjogcmdiKDYwLCA3NiwgMTE0KTtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY29uc3RhbnQge1wNCiAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfdHlwZSxcDQouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9jbGFzcyB7XA0KICBjb2xvcjogcmdiKDEwOSwgMTIxLCAyMjIpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjogcmdiKDEwNCwgMTE4LCAxMzUpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6ICMxOTE5YTY7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6ICMyMzZlMjQ7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQuYWNlX2RvYyB7XA0KICBjb2xvcjogIzIzNmUyNDtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jLmFjZV90YWcge1wNCiAgY29sb3I6ICMyMzZlMjQ7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcDQogIGNvbG9yOiByZ2IoMCwgMCwgMjA1KTtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfdmFyaWFibGUge1wNCiAgY29sb3I6IHJnYig0OSwgMTMyLCAxNDkpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV94bWxfcGUge1wNCiAgY29sb3I6IHJnYigxMDQsIDEwNCwgOTEpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6ICMwMDAwQTI7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbWFya3VwLmFjZV9tYXJrdXBpbmUge1wNCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7XA0KICBjb2xvcjogcmdiKDEyLCA3LCAyNTUpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XA0KICBjb2xvcjpyZ2IoMTg1LCA2LCAxNDQpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMTgxLCAyMTMsIDI1NSk7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyNTUsIDApO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0YWNrIHtcDQogIGJhY2tncm91bmQ6IHJnYigxNjQsIDIyOSwgMTAxKTtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcDQogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxOTIsIDE5MiwgMTkyKTtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDcpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYmFja2dyb3VuZDogcmdiKDI1MCwgMjUwLCAyNTUpO1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwMCwgMjAwLCAyNTApO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX21ldGEuYWNlX3RhZyB7XA0KICBjb2xvcjogcmdiKDE0NywgMTUsIDEyOCk7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2Vfc3RyaW5nLmFjZV9yZWdleCB7XA0KICBjb2xvcjogcmdiKDI1NSwgMCwgMClcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZXtcDQogIGNvbG9yOiAjOTk0NDA5O1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KDQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2Nsb3VkcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuaXNEYXJrID0gZmFsc2U7DQpleHBvcnRzLmNzc0NsYXNzID0gImFjZS1jbG91ZHMiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2UtY2xvdWRzIC5hY2VfZWRpdG9yIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XA0KfVwNClwNCi5hY2UtY2xvdWRzIC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9wcmludF9tYXJnaW4ge1wNCiAgd2lkdGg6IDFweDtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KfVwNClwNCi5hY2UtY2xvdWRzIC5hY2Vfc2Nyb2xsZXIge1wNCiAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjMDAwMDAwO1wNCn1cDQpcDQouYWNlLWNsb3VkcyAuYWNlX2N1cnNvciB7XA0KICBib3JkZXItbGVmdDogMnB4IHNvbGlkICMwMDAwMDA7XA0KfVwNClwNCi5hY2UtY2xvdWRzIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wNCiAgYm9yZGVyLWxlZnQ6IDBweDtcDQogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMDAwMDAwO1wNCn1cDQogXA0KLmFjZS1jbG91ZHMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogI0JERDVGQztcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcDQogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcDQogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcDQogIGJvcmRlcjogMXB4IHNvbGlkICNCRkJGQkY7XA0KfVwNClwNCi5hY2UtY2xvdWRzIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogI0ZGRkJEMTtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcDQogIGJvcmRlcjogMXB4IHNvbGlkICNCREQ1RkM7XA0KfVwNCiAgICAgICBcDQouYWNlLWNsb3VkcyAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogI0JGQkZCRjtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiNBRjk1NkY7XA0KfVwNClwNCi5hY2UtY2xvdWRzIC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige1wNCiAgY29sb3I6IzQ4NDg0ODtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6IzM5OTQ2QTtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7XA0KICBjb2xvcjojNDZBNjA5O1wNCn1cDQpcDQouYWNlLWNsb3VkcyAuYWNlX2ludmFsaWQge1wNCiAgYmFja2dyb3VuZC1jb2xvcjojRkYwMDJBO1wNCn1cDQpcDQouYWNlLWNsb3VkcyAuYWNlX2ZvbGQge1wNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQUY5NTZGO1wNCiAgICBib3JkZXItY29sb3I6ICMwMDAwMDA7XA0KfVwNClwNCi5hY2UtY2xvdWRzIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6I0M1MjcyNztcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6IzVEOTBDRDtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9jb21tZW50IHtcDQogIGNvbG9yOiNCQ0M4QkE7XA0KfVwNClwNCi5hY2UtY2xvdWRzIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wNCiAgY29sb3I6IzYwNjA2MDtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfSI7DQoNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7DQoNCn0pOw0KOw0KICAgICAgICAgICAgKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpDQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgIA==]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2Nsb3Vkc19taWRuaWdodCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLWNsb3Vkcy1taWRuaWdodCI7DQpleHBvcnRzLmNzc1RleHQgPSAiXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9ndXR0ZXIge1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQogIGNvbG9yOiAjMzMzO1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9zY3JvbGxlciB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTkxOTE5O1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCiAgY29sb3I6ICM5MjkyOTI7XA0KfVwNClwNCi5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzdEQTVEQztcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM3REE1REM7XA0KfVwNCiBcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiAjMDAwMDAwO1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgI0JGQkZCRjtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDIxNSwgMjE1LCAyMTUsIDAuMDMxKTtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcDQogIGJvcmRlcjogMXB4IHNvbGlkICMwMDAwMDA7XA0KfVwNCiAgICAgICBcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogI0JGQkZCRjtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiM5MjdDNUQ7XA0KfVwNClwNCi5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige1wNCiAgY29sb3I6IzRCNEI0QjtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6IzM5OTQ2QTtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7XA0KICBjb2xvcjojNDZBNjA5O1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2ludmFsaWQge1wNCiAgY29sb3I6I0ZGRkZGRjtcDQpiYWNrZ3JvdW5kLWNvbG9yOiNFOTJFMkU7XA0KfVwNClwNCi5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfZm9sZCB7XA0KICAgIGJhY2tncm91bmQtY29sb3I6ICM5MjdDNUQ7XA0KICAgIGJvcmRlci1jb2xvcjogIzkyOTI5MjtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjojRTkyRTJFO1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX3N0cmluZyB7XA0KICBjb2xvcjojNUQ5MENEO1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6IzNDNDAzQjtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7XA0KICBjb2xvcjojNjA2MDYwO1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcDQogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcDQp9IjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsNCg0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2NvYmFsdCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLWNvYmFsdCI7DQpleHBvcnRzLmNzc1RleHQgPSAiXA0KLmFjZS1jb2JhbHQgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLWNvYmFsdCAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9ndXR0ZXIge1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQogIGNvbG9yOiAjMzMzO1wNCn1cDQpcDQouYWNlLWNvYmFsdCAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9zY3JvbGxlciB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAyMjQwO1wNCn1cDQpcDQouYWNlLWNvYmFsdCAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCiAgY29sb3I6ICNGRkZGRkY7XA0KfVwNClwNCi5hY2UtY29iYWx0IC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkZGRkY7XA0KfVwNCiBcDQouYWNlLWNvYmFsdCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDE3OSwgMTAxLCA1NywgMC43NSk7XA0KfVwNClwNCi5hY2UtY29iYWx0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7XA0KfVwNClwNCi5hY2UtY29iYWx0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpO1wNCn1cDQpcDQouYWNlLWNvYmFsdCAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcDQogIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XA0KfVwNClwNCi5hY2UtY29iYWx0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XA0KICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE3OSwgMTAxLCA1NywgMC43NSk7XA0KfVwNCiAgICAgICBcDQouYWNlLWNvYmFsdCAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTtcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiNGRjlEMDA7XA0KfVwNClwNCi5hY2UtY29iYWx0IC5hY2VfY29uc3RhbnQge1wNCiAgY29sb3I6I0ZGNjI4QztcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9pbnZhbGlkIHtcDQogIGNvbG9yOiNGOEY4Rjg7XA0KYmFja2dyb3VuZC1jb2xvcjojODAwRjAwO1wNCn1cDQpcDQouYWNlLWNvYmFsdCAuYWNlX3N1cHBvcnQge1wNCiAgY29sb3I6IzgwRkZCQjtcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGOUQwMDtcDQogICAgYm9yZGVyLWNvbG9yOiAjRkZGRkZGO1wNCn1cDQpcDQouYWNlLWNvYmFsdCAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiNGRkIwNTQ7XA0KfVwNClwNCi5hY2UtY29iYWx0IC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAge1wNCiAgY29sb3I6IzgwRkZDMjtcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9jb21tZW50IHtcDQogIGZvbnQtc3R5bGU6aXRhbGljO1wNCmNvbG9yOiMwMDg4RkY7XA0KfVwNClwNCi5hY2UtY29iYWx0IC5hY2VfdmFyaWFibGUge1wNCiAgY29sb3I6I0NDQ0NDQztcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV92YXJpYWJsZS5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6I0ZGODBFMTtcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9tZXRhLmFjZV90YWcge1wNCiAgY29sb3I6IzlFRkZGRjtcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfVwNClwNCi5hY2UtY29iYWx0IC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHtcDQogIGNvbG9yOiNDOEU0RkQ7XA0KYmFja2dyb3VuZC1jb2xvcjojMDAxMjIxO1wNCn1cDQpcDQouYWNlLWNvYmFsdCAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiMxMzBEMjY7XA0KfSI7DQoNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7DQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2NyaW1zb25fZWRpdG9yJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCmV4cG9ydHMuaXNEYXJrID0gZmFsc2U7DQpleHBvcnRzLmNzc1RleHQgPSAiLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2VkaXRvciB7XA0KICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9ndXR0ZXIge1wNCiAgd2lkdGg6IDUwcHg7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCiAgY29sb3I6ICMzMzM7XA0KICBvdmVyZmxvdyA6IGhpZGRlbjtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2d1dHRlci1sYXllciB7XA0KICB3aWR0aDogMTAwJTtcDQogIHRleHQtYWxpZ246IHJpZ2h0O1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfZ3V0dGVyLWxheWVyIC5hY2VfZ3V0dGVyLWNlbGwge1wNCiAgcGFkZGluZy1yaWdodDogNnB4O1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfcHJpbnRfbWFyZ2luIHtcDQogIHdpZHRoOiAxcHg7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfdGV4dC1sYXllciB7XA0KICBjdXJzb3I6IHRleHQ7XA0KICBjb2xvcjogcmdiKDY0LCA2NCwgNjQpO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgYmxhY2s7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogcmdiKDE5MSwgMTkxLCAxOTEpO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2lkZW50aWZpZXIge1wNCiAgY29sb3I6IGJsYWNrO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2tleXdvcmQge1wNCiAgY29sb3I6IGJsdWU7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2J1aWxkaW4ge1wNCiAgY29sb3I6IHJnYig4OCwgNzIsIDI0Nik7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcDQogIGNvbG9yOiByZ2IoMjU1LCAxNTYsIDApO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9saWJyYXJ5IHtcDQogIGNvbG9yOiByZ2IoNiwgMTUwLCAxNCk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfaW52YWxpZCB7XA0KICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcDQogIGNvbG9yOiByZ2IoMjI0LCAwLCAwKTtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9mb2xkIHtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjogcmdiKDE5MiwgMCwgMCk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY29uc3RhbnQge1wNCiAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV90eXBlLFwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY2xhc3Mge1wNCiAgY29sb3I6IHJnYigxMDksIDEyMSwgMjIyKTtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjogcmdiKDQ5LCAxMzIsIDE0OSk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2Vfc3RyaW5nIHtcDQogIGNvbG9yOiByZ2IoMTI4LCAwLCAxMjgpO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6IHJnYig3NiwgMTM2LCAxMDcpO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQuYWNlX2RvYyB7XA0KICBjb2xvcjogcmdiKDAsIDEwMiwgMjU1KTtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MuYWNlX3RhZyB7XA0KICBjb2xvcjogcmdiKDEyOCwgMTU5LCAxOTEpO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcDQogIGNvbG9yOiByZ2IoMCwgMCwgNjQpO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX3ZhcmlhYmxlIHtcDQogIGNvbG9yOiByZ2IoMCwgNjQsIDEyOCk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfeG1sX3BlIHtcDQogIGNvbG9yOiByZ2IoMTA0LCAxMDQsIDkxKTtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMTgxLCAyMTMsIDI1NSk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcDQogIGJhY2tncm91bmQ6IHJnYigyNTIsIDI1NSwgMCk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGFjayB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMTY0LCAyMjksIDEwMSk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcDQogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxOTIsIDE5MiwgMTkyKTtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcDQogIGJhY2tncm91bmQ6IHJnYigyMzIsIDI0MiwgMjU0KTtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX21ldGEuYWNlX3RhZyB7XA0KICBjb2xvcjpyZ2IoMjgsIDIsIDI1NSk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcDQogIGJhY2tncm91bmQ6IHJnYigyNTAsIDI1MCwgMjU1KTtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigyMDAsIDIwMCwgMjUwKTtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX3N0cmluZy5hY2VfcmVnZXgge1wNCiAgY29sb3I6IHJnYigxOTIsIDAsIDE5Mik7XA0KfSI7DQoNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLWNyaW1zb24tZWRpdG9yIjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsNCn0pOw0KOw0KICAgICAgICAgICAgKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpDQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgIA==]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2Rhd24nLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KDQpleHBvcnRzLmlzRGFyayA9IGZhbHNlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtZGF3biI7DQpleHBvcnRzLmNzc1RleHQgPSAiXA0KLmFjZS1kYXduIC5hY2VfZWRpdG9yIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcDQp9XA0KXA0KLmFjZS1kYXduIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLWRhd24gLmFjZV9ndXR0ZXIge1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQogIGNvbG9yOiAjMzMzO1wNCn1cDQpcDQouYWNlLWRhd24gLmFjZV9wcmludF9tYXJnaW4ge1wNCiAgd2lkdGg6IDFweDtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX3Njcm9sbGVyIHtcDQogIGJhY2tncm91bmQtY29sb3I6ICNGOUY5Rjk7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCiAgY29sb3I6ICMwODA4MDg7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX2N1cnNvciB7XA0KICBib3JkZXItbGVmdDogMnB4IHNvbGlkICMwMDAwMDA7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzAwMDAwMDtcDQp9XA0KIFwNCi5hY2UtZGF3biAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDM5LCA5NSwgMjU1LCAwLjMwKTtcDQp9XA0KXA0KLmFjZS1kYXduIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg3NSwgNzUsIDEyNiwgMC41MCk7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcDQogIGJhY2tncm91bmQ6IHJnYmEoMzYsIDk5LCAxODAsIDAuMTIpO1wNCn1cDQpcDQouYWNlLWRhd24gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMzksIDk1LCAyNTUsIDAuMzApO1wNCn1cDQogICAgICAgXA0KLmFjZS1kYXduIC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiByZ2JhKDc1LCA3NSwgMTI2LCAwLjUwKTtcDQp9XA0KXA0KLmFjZS1kYXduIC5hY2Vfa2V5d29yZCB7XA0KICBjb2xvcjojNzk0OTM4O1wNCn1cDQpcDQouYWNlLWRhd24gLmFjZV9jb25zdGFudCB7XA0KICBjb2xvcjojODExRjI0O1wNCn1cDQpcDQouYWNlLWRhd24gLmFjZV9pbnZhbGlkLmFjZV9pbGxlZ2FsIHtcDQogIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KZm9udC1zdHlsZTppdGFsaWM7XA0KY29sb3I6I0Y4RjhGODtcDQpiYWNrZ3JvdW5kLWNvbG9yOiNCNTJBMUQ7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX2ludmFsaWQuYWNlX2RlcHJlY2F0ZWQge1wNCiAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcDQpmb250LXN0eWxlOml0YWxpYztcDQpjb2xvcjojQjUyQTFEO1wNCn1cDQpcDQouYWNlLWRhd24gLmFjZV9zdXBwb3J0IHtcDQogIGNvbG9yOiM2OTFDOTc7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX2ZvbGQge1wNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzk0OTM4O1wNCiAgICBib3JkZXItY29sb3I6ICMwODA4MDg7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiM2OTNBMTc7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX3N0cmluZyB7XA0KICBjb2xvcjojMEI2MTI1O1wNCn1cDQpcDQouYWNlLWRhd24gLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7XA0KICBjb2xvcjojQ0Y1NjI4O1wNCn1cDQpcDQouYWNlLWRhd24gLmFjZV9jb21tZW50IHtcDQogIGZvbnQtc3R5bGU6aXRhbGljO1wNCmNvbG9yOiM1QTUyNUY7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX3ZhcmlhYmxlIHtcDQogIGNvbG9yOiMyMzRBOTc7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcDQogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcDQp9XA0KXA0KLmFjZS1kYXduIC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHtcDQogIGNvbG9yOiMxOTM1NkQ7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XA0KICBjb2xvcjojNjkzQTE3O1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBBZGFtIEppbWVuZXogPGFkYW0gQVQgc2hpZnRjcmVhdGUgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS90aGVtZS9kcmVhbXdlYXZlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQpleHBvcnRzLmlzRGFyayA9IGZhbHNlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtdG0iOw0KZXhwb3J0cy5jc3NUZXh0ID0gIi5hY2UtdG0gLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS10bSAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2ZvbGQge1wNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDBGO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfdGV4dC1sYXllciB7XA0KICBjdXJzb3I6IHRleHQ7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9jdXJzb3Ige1wNCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCBibGFjaztcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XA0KfVwNCiAgICAgICAgXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9pbnZpc2libGUge1wNCiAgY29sb3I6IHJnYigxOTEsIDE5MSwgMTkxKTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiBibHVlO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9idWlsZGluIHtcDQogIGNvbG9yOiByZ2IoODgsIDcyLCAyNDYpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XA0KICBjb2xvcjogcmdiKDg4LCA5MiwgMjQ2KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGlicmFyeSB7XA0KICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2ludmFsaWQge1wNCiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1MywgMCwgMCk7XA0KICBjb2xvcjogd2hpdGU7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IHJnYig2MCwgNzYsIDExNCk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY29uc3RhbnQge1wNCiAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV90eXBlLFwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY2xhc3Mge1wNCiAgY29sb3I6ICMwMDk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfcGhwX3RhZyB7XA0KICBjb2xvcjogI2YwMDtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjogcmdiKDEwNCwgMTE4LCAxMzUpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N0cmluZyB7XA0KICBjb2xvcjogIzAwRjtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb21tZW50IHtcDQogIGNvbG9yOiByZ2IoNzYsIDEzNiwgMTA3KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2Mge1wNCiAgY29sb3I6IHJnYigwLCAxMDIsIDI1NSk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jLmFjZV90YWcge1wNCiAgY29sb3I6IHJnYigxMjgsIDE1OSwgMTkxKTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7XA0KICBjb2xvcjogcmdiKDAsIDAsIDIwNSk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfdmFyaWFibGUge1wNCiAgY29sb3I6ICMwNkZcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV94bWxfcGUge1wNCiAgY29sb3I6IHJnYigxMDQsIDEwNCwgOTEpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjogIzAwRjtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmt1cC5hY2VfbWFya3VwaW5lIHtcDQogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7XA0KICBjb2xvcjogcmdiKDEyLCA3LCAyNTUpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWFya3VwLmFjZV9saXN0IHtcDQogIGNvbG9yOnJnYigxODUsIDYsIDE0NCk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogcmdiKDE4MSwgMjEzLCAyNTUpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyNTUsIDApO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RhY2sge1wNCiAgYmFja2dyb3VuZDogcmdiKDE2NCwgMjI5LCAxMDEpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTkyLCAxOTIsIDE5Mik7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDcpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMjUwLCAyNTAsIDI1NSk7XA0KICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjAwLCAyMDAsIDI1MCk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcge1wNCiAgY29sb3I6IzAwOTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZy5hY2VfYW5jaG9yIHtcDQogIGNvbG9yOiMwNjA7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcuYWNlX2Zvcm0ge1wNCiAgY29sb3I6I0Y5MDtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZy5hY2VfaW1hZ2Uge1wNCiAgY29sb3I6IzkwOTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZy5hY2Vfc2NyaXB0IHtcDQogIGNvbG9yOiM5MDA7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcuYWNlX3N0eWxlIHtcDQogIGNvbG9yOiM5MDk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcuYWNlX3RhYmxlIHtcDQogIGNvbG9yOiMwOTk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9zdHJpbmcuYWNlX3JlZ2V4IHtcDQogIGNvbG9yOiByZ2IoMjU1LCAwLCAwKVwNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2VjbGlwc2UnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQpleHBvcnRzLmlzRGFyayA9IGZhbHNlOw0KZXhwb3J0cy5jc3NUZXh0ID0gIi5hY2UtZWNsaXBzZSAuYWNlX2VkaXRvciB7XA0KICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XA0KfVwNClwNCi5hY2UtZWNsaXBzZSAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS1lY2xpcHNlIC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6IHJnYigyMjcsIDIyNywgMjI3KTtcDQogIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcDQogIGNvbG9yOiByZ2IoMTM2LCAxMzYsIDEzNik7XA0KfVwNClwNCi5hY2UtZWNsaXBzZSAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2IxYjRiYTtcDQp9XA0KXA0KLmFjZS1lY2xpcHNlIC5hY2VfZm9sZCB7XA0KICAgIGJhY2tncm91bmQtY29sb3I6IHJnYig2MCwgNzYsIDExNCk7XA0KfVwNClwNCi5hY2UtZWNsaXBzZSAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCn1cDQpcDQouYWNlLWVjbGlwc2UgLmFjZV9jdXJzb3Ige1wNCiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBibGFjaztcDQp9XA0KXA0KLmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX2tleXdvcmQsIC5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV92YXJpYWJsZSB7XA0KICBjb2xvcjogcmdiKDEyNywgMCwgODUpO1wNCn1cDQpcDQouYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2J1aWxkaW4ge1wNCiAgY29sb3I6IHJnYig4OCwgNzIsIDI0Nik7XA0KfVwNClwNCi5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGlicmFyeSB7XA0KICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO1wNCn1cDQpcDQouYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IHJnYig2MCwgNzYsIDExNCk7XA0KfVwNClwNCi5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6IHJnYig0MiwgMCwgMjU1KTtcDQp9XA0KXA0KLmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6IHJnYig2MywgMTI3LCA5NSk7XA0KfVwNClwNCi5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2Mge1wNCiAgY29sb3I6IHJnYig2MywgOTUsIDE5MSk7XA0KfVwNClwNCi5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MuYWNlX3RhZyB7XA0KICBjb2xvcjogcmdiKDEyNywgMTU5LCAxOTEpO1wNCn1cDQpcDQouYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCn1cDQpcDQouYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfdGFnIHtcDQogIGNvbG9yOiByZ2IoNjMsIDEyNywgMTI3KTtcDQp9XA0KXA0KLmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX3R5cGUge1wNCiAgY29sb3I6IHJnYigxMjcsIDAsIDEyNyk7XA0KfVwNClwNCi5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV94bWxfcGUge1wNCiAgY29sb3I6IHJnYigxMDQsIDEwNCwgOTEpO1wNCn1cDQpcDQouYWNlLWVjbGlwc2UgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogcmdiKDE4MSwgMjEzLCAyNTUpO1wNCn1cDQpcDQouYWNlLWVjbGlwc2UgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcDQogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxOTIsIDE5MiwgMTkyKTtcDQp9XA0KXA0KLmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX21ldGEuYWNlX3RhZyB7XA0KICBjb2xvcjpyZ2IoNjMsIDEyNywgMTI3KTtcDQp9XA0KXA0KLmFjZS1lY2xpcHNlIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wNCiAgY29sb3I6cmdiKDEyNywgMCwgMTI3KTtcDQp9XA0KXA0KLmFjZS1lY2xpcHNlIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogcmdiKDIzMiwgMjQyLCAyNTQpO1wNCn0iOw0KDQpleHBvcnRzLmNzc0NsYXNzID0gImFjZS1lY2xpcHNlIjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsNCn0pOw0KOw0KICAgICAgICAgICAgKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpDQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgIA==]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2lkbGVfZmluZ2VycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLWlkbGUtZmluZ2VycyI7DQpleHBvcnRzLmNzc1RleHQgPSAiXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLWlkbGUtZmluZ2VycyAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9ndXR0ZXIge1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQogIGNvbG9yOiAjMzMzO1wNCn1cDQpcDQouYWNlLWlkbGUtZmluZ2VycyAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9zY3JvbGxlciB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzIzMjMyO1wNCn1cDQpcDQouYWNlLWlkbGUtZmluZ2VycyAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCiAgY29sb3I6ICNGRkZGRkY7XA0KfVwNClwNCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzkxRkYwMDtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM5MUZGMDA7XA0KfVwNCiBcDQouYWNlLWlkbGUtZmluZ2VycyAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDkwLCAxMDAsIDEyNiwgMC44OCk7XA0KfVwNClwNCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7XA0KfVwNClwNCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCAjNDA0MDQwO1wNCn1cDQpcDQouYWNlLWlkbGUtZmluZ2VycyAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcDQogIGJhY2tncm91bmQ6ICMzNTM2Mzc7XA0KfVwNClwNCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XA0KICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDkwLCAxMDAsIDEyNiwgMC44OCk7XA0KfVwNCiAgICAgICBcDQouYWNlLWlkbGUtZmluZ2VycyAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogIzQwNDA0MDtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiNDQzc4MzM7XA0KfVwNClwNCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfY29uc3RhbnQge1wNCiAgY29sb3I6IzZDOTlCQjtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9pbnZhbGlkIHtcDQogIGNvbG9yOiNGRkZGRkY7XA0KYmFja2dyb3VuZC1jb2xvcjojRkYwMDAwO1wNCn1cDQpcDQouYWNlLWlkbGUtZmluZ2VycyAuYWNlX2ZvbGQge1wNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0M3ODMzO1wNCiAgICBib3JkZXItY29sb3I6ICNGRkZGRkY7XA0KfVwNClwNCi5hY2UtaWRsZS1maW5nZXJzIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6I0I4MzQyNjtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6I0E1QzI2MTtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7XA0KICBjb2xvcjojQ0NDQzMzO1wNCn1cDQpcDQouYWNlLWlkbGUtZmluZ2VycyAuYWNlX2NvbW1lbnQge1wNCiAgZm9udC1zdHlsZTppdGFsaWM7XA0KY29sb3I6I0JDOTQ1ODtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9tZXRhLmFjZV90YWcge1wNCiAgY29sb3I6I0ZGRTVCQjtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9lbnRpdHkuYWNlX25hbWUge1wNCiAgY29sb3I6I0ZGQzY2RDtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfVwNClwNCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfY29sbGFiLmFjZV91c2VyMSB7XA0KICBjb2xvcjojMzIzMjMyO1wNCmJhY2tncm91bmQtY29sb3I6I0ZGRjk4MDsgICBcDQp9IjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsNCn0pOw0KOw0KICAgICAgICAgICAgKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpDQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgIA==]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2tyX3RoZW1lJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KZXhwb3J0cy5pc0RhcmsgPSB0cnVlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2Uta3ItdGhlbWUiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2Uta3ItdGhlbWUgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLWtyLXRoZW1lIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLWtyLXRoZW1lIC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX3Njcm9sbGVyIHtcDQogIGJhY2tncm91bmQtY29sb3I6ICMwQjBBMDk7XA0KfVwNClwNCi5hY2Uta3ItdGhlbWUgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjRkNGRkUwO1wNCn1cDQpcDQouYWNlLWtyLXRoZW1lIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGOTkwMDtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGOTkwMDtcDQp9XA0KIFwNCi5hY2Uta3ItdGhlbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogcmdiYSgxNzAsIDAsIDI1NSwgMC40NSk7XA0KfVwNClwNCi5hY2Uta3ItdGhlbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcDQogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDE3NywgMTExLCAwLjMyKTtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcDQogIGJhY2tncm91bmQ6ICMzODQwM0Q7XA0KfVwNClwNCi5hY2Uta3ItdGhlbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTcwLCAwLCAyNTUsIDAuNDUpO1wNCn1cDQogICAgICAgXA0KLmFjZS1rci10aGVtZSAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogcmdiYSgyNTUsIDE3NywgMTExLCAwLjMyKTtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX2tleXdvcmQge1wNCiAgY29sb3I6Izk0OUM4QjtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX2NvbnN0YW50IHtcDQogIGNvbG9yOnJnYmEoMjEwLCAxMTcsIDI0LCAwLjc2KTtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX2ludmFsaWQge1wNCiAgY29sb3I6I0Y4RjhGODtcDQpiYWNrZ3JvdW5kLWNvbG9yOiNBNDEzMDA7XA0KfVwNClwNCi5hY2Uta3ItdGhlbWUgLmFjZV9zdXBwb3J0IHtcDQogIGNvbG9yOiM5RkMyOEE7XA0KfVwNClwNCi5hY2Uta3ItdGhlbWUgLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogIzk0OUM4QjtcDQogICAgYm9yZGVyLWNvbG9yOiAjRkNGRkUwO1wNCn1cDQpcDQouYWNlLWtyLXRoZW1lIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6Izg1ODczQTtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHtcDQogIGNvbG9yOnJnYmEoMTI1LCAyNTUsIDE5MiwgMC42NSk7XA0KfVwNClwNCi5hY2Uta3ItdGhlbWUgLmFjZV9jb21tZW50IHtcDQogIGZvbnQtc3R5bGU6aXRhbGljO1wNCmNvbG9yOiM3MDZENUI7XA0KfVwNClwNCi5hY2Uta3ItdGhlbWUgLmFjZV92YXJpYWJsZSB7XA0KICBjb2xvcjojRDFBNzk2O1wNCn1cDQpcDQouYWNlLWtyLXRoZW1lIC5hY2VfdmFyaWFibGUuYWNlX2xhbmd1YWdlIHtcDQogIGNvbG9yOiNGRjgwRTE7XA0KfVwNClwNCi5hY2Uta3ItdGhlbWUgLmFjZV9tZXRhLmFjZV90YWcge1wNCiAgY29sb3I6I0JBQkQ5QztcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcDQogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiMwRjAwNDA7XA0KfSI7DQoNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7DQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBNaWNoYWVsIFNjaHdhcnR6IDxtci5wYW50cyBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL21lcmJpdm9yZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLW1lcmJpdm9yZSI7DQpleHBvcnRzLmNzc1RleHQgPSAiXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9ndXR0ZXIge1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQogIGNvbG9yOiAjMzMzO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9zY3JvbGxlciB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTYxNjE2O1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCiAgY29sb3I6ICNFNkUxREM7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkZGRkY7XA0KfVwNCiBcDQouYWNlLW1lcmJpdm9yZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiAjNDU0NTQ1O1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzQwNDA0MDtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XA0KICBiYWNrZ3JvdW5kOiAjMzMzNDM1O1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzQ1NDU0NTtcDQp9XA0KICAgICAgIFwNCi5hY2UtbWVyYml2b3JlIC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiAjNDA0MDQwO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX2tleXdvcmQge1wNCiAgY29sb3I6I0ZDNkYwOTtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9jb25zdGFudCB7XA0KICBjb2xvcjojMUVEQUZCO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XA0KICBjb2xvcjojRkRDMjUxO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX2NvbnN0YW50LmFjZV9saWJyYXJ5IHtcDQogIGNvbG9yOiM4REZGMEE7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6IzU4QzU1NDtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9pbnZhbGlkIHtcDQogIGNvbG9yOiNGRkZGRkY7XA0KYmFja2dyb3VuZC1jb2xvcjojOTkwMDAwO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX2ZvbGQge1wNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkM2RjA5O1wNCiAgICBib3JkZXItY29sb3I6ICNFNkUxREM7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6I0ZDNkYwOTtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6IzhERkYwQTtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9jb21tZW50IHtcDQogIGZvbnQtc3R5bGU6aXRhbGljO1wNCmNvbG9yOiNBRDJFQTQ7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlIC5hY2VfbWV0YS5hY2VfdGFnIHtcDQogIGNvbG9yOiNGQzZGMDk7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wNCiAgY29sb3I6I0ZGRkY4OTtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfSI7DQoNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7DQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBNaWNoYWVsIFNjaHdhcnR6IDxtci5wYW50cyBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL21lcmJpdm9yZV9zb2Z0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KZXhwb3J0cy5pc0RhcmsgPSB0cnVlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtbWVyYml2b3JlLXNvZnQiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX3Njcm9sbGVyIHtcDQogIGJhY2tncm91bmQtY29sb3I6ICMxQzFDMUM7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjRTZFMURDO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGRkZGRjtcDQp9XA0KIFwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogIzQ5NDk0OTtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCAjNDA0MDQwO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogIzMzMzQzNTtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzQ5NDk0OTtcDQp9XA0KICAgICAgIFwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9pbnZpc2libGUge1wNCiAgY29sb3I6ICM0MDQwNDA7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiNGQzgwM0E7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9jb25zdGFudCB7XA0KICBjb2xvcjojNjhDMUQ4O1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcDQogIGNvbG9yOiNFMUM1ODI7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9jb25zdGFudC5hY2VfbGlicmFyeSB7XA0KICBjb2xvcjojOEVDNjVGO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6IzdGQzU3ODtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2ludmFsaWQge1wNCiAgY29sb3I6I0ZGRkZGRjtcDQpiYWNrZ3JvdW5kLWNvbG9yOiNGRTM4Mzg7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHtcDQogIGNvbG9yOiNGRkZGRkY7XA0KYmFja2dyb3VuZC1jb2xvcjojRkUzODM4O1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfZm9sZCB7XA0KICAgIGJhY2tncm91bmQtY29sb3I6ICNGQzgwM0E7XA0KICAgIGJvcmRlci1jb2xvcjogI0U2RTFEQztcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX3N0cmluZyB7XA0KICBjb2xvcjojOEVDNjVGO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY29tbWVudCB7XA0KICBmb250LXN0eWxlOml0YWxpYztcDQpjb2xvcjojQUM0QkI4O1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWV0YSB7XA0KICBmb250LXN0eWxlOml0YWxpYztcDQpjb2xvcjojQUM0QkI4O1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWV0YS5hY2VfdGFnIHtcDQogIGNvbG9yOiNGQzgwM0E7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7XA0KICBjb2xvcjojRUFGMUEzO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wNCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL21vbm9rYWknLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KDQpleHBvcnRzLmlzRGFyayA9IHRydWU7DQpleHBvcnRzLmNzc0NsYXNzID0gImFjZS1tb25va2FpIjsNCmV4cG9ydHMuY3NzVGV4dCA9ICJcDQouYWNlLW1vbm9rYWkgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLW1vbm9rYWkgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XA0KfVwNClwNCi5hY2UtbW9ub2thaSAuYWNlX2d1dHRlciB7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCiAgY29sb3I6ICMzMzM7XA0KfVwNClwNCi5hY2UtbW9ub2thaSAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2Vfc2Nyb2xsZXIge1wNCiAgYmFja2dyb3VuZC1jb2xvcjogIzI3MjgyMjtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfdGV4dC1sYXllciB7XA0KICBjdXJzb3I6IHRleHQ7XA0KICBjb2xvcjogI0Y4RjhGMjtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0Y4RjhGMDtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wNCiAgYm9yZGVyLWxlZnQ6IDBweDtcDQogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRjhGOEYwO1wNCn1cDQogXA0KLmFjZS1tb25va2FpIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtcDQogIGJhY2tncm91bmQ6ICM0OTQ4M0U7XA0KfVwNClwNCi5hY2UtbW9ub2thaSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLW1vbm9rYWkgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcDQogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcDQogIGJvcmRlcjogMXB4IHNvbGlkICM0OTQ4M0U7XA0KfVwNClwNCi5hY2UtbW9ub2thaSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcDQogIGJhY2tncm91bmQ6ICM0OTQ4M0U7XA0KfVwNClwNCi5hY2UtbW9ub2thaSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzQ5NDgzRTtcDQp9XA0KICAgICAgIFwNCi5hY2UtbW9ub2thaSAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogIzQ5NDgzRTtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2Vfa2V5d29yZCB7XA0KICBjb2xvcjojRjkyNjcyO1wNCn1cDQpcDQouYWNlLW1vbm9rYWkgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6I0FFODFGRjtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6I0FFODFGRjtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfaW52YWxpZCB7XA0KICBjb2xvcjojRjhGOEYwO1wNCmJhY2tncm91bmQtY29sb3I6I0Y5MjY3MjtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7XA0KICBjb2xvcjojRjhGOEYwO1wNCmJhY2tncm91bmQtY29sb3I6I0FFODFGRjtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfZm9sZCB7XA0KICAgIGJhY2tncm91bmQtY29sb3I6ICNBNkUyMkU7XA0KICAgIGJvcmRlci1jb2xvcjogI0Y4RjhGMjtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IzY2RDlFRjtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2Vfc3RyaW5nIHtcDQogIGNvbG9yOiNFNkRCNzQ7XA0KfVwNClwNCi5hY2UtbW9ub2thaSAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6Izc1NzE1RTtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wNCiAgY29sb3I6I0E2RTIyRTtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjojQTZFMjJFO1wNCn1cDQpcDQouYWNlLW1vbm9rYWkgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfSI7DQoNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7DQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL21vbm9faW5kdXN0cmlhbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLW1vbm8taW5kdXN0cmlhbCI7DQpleHBvcnRzLmNzc1RleHQgPSAiXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9ndXR0ZXIge1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQogIGNvbG9yOiAjMzMzO1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9zY3JvbGxlciB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjIyQzI4O1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCiAgY29sb3I6ICNGRkZGRkY7XA0KfVwNClwNCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkZGRkY7XA0KfVwNCiBcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDE0NSwgMTUzLCAxNDgsIDAuNDApO1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMDIsIDEwOCwgMTA0LCAwLjUwKTtcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDEyLCAxMywgMTIsIDAuMjUpO1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxNDUsIDE1MywgMTQ4LCAwLjQwKTtcDQp9XA0KICAgICAgIFwNCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiByZ2JhKDEwMiwgMTA4LCAxMDQsIDAuNTApO1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2tleXdvcmQge1wNCiAgY29sb3I6I0EzOUU2NDtcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjojQThCM0FCO1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2NvbnN0YW50IHtcDQogIGNvbG9yOiNFOTg4MDA7XA0KfVwNClwNCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6I0U5ODgwMDtcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9pbnZhbGlkIHtcDQogIGNvbG9yOiNGRkZGRkY7XA0KYmFja2dyb3VuZC1jb2xvcjpyZ2JhKDE1MywgMCwgMCwgMC42OCk7XA0KfVwNClwNCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfZm9sZCB7XA0KICAgIGJhY2tncm91bmQtY29sb3I6ICNBOEIzQUI7XA0KICAgIGJvcmRlci1jb2xvcjogI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjojNTg4RTYwO1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6IzY2NkM2ODtcDQpiYWNrZ3JvdW5kLWNvbG9yOiMxNTFDMTk7XA0KfVwNClwNCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfdmFyaWFibGUuYWNlX2xhbmd1YWdlIHtcDQogIGNvbG9yOiM2NDhCRDI7XA0KfVwNClwNCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wNCiAgY29sb3I6IzkwOTk5MztcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9lbnRpdHkuYWNlX25hbWUge1wNCiAgY29sb3I6IzU3NzhCNjtcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiNBOEIzQUI7XA0KfVwNClwNCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wNCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBBbmRyw6kgRmllZGxlciA8ZmllZGxlciBkb3QgYW5kcmUgYSB0IGdtYWlsIGRvdCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvdGhlbWUvcGFzdGVsX29uX2RhcmsnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KDQpleHBvcnRzLmlzRGFyayA9IHRydWU7DQpleHBvcnRzLmNzc0NsYXNzID0gImFjZS1wYXN0ZWwtb24tZGFyayI7DQpleHBvcnRzLmNzc1RleHQgPSAiXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2VkaXRvciB7XA0KICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9ndXR0ZXIge1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQogIGNvbG9yOiAjMzMzO1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfcHJpbnRfbWFyZ2luIHtcDQogIHdpZHRoOiAxcHg7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2Vfc2Nyb2xsZXIge1wNCiAgYmFja2dyb3VuZC1jb2xvcjogIzJDMjgyODtcDQp9XA0KXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCiAgY29sb3I6ICM4RjkzOEY7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9jdXJzb3Ige1wNCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQTdBN0E3O1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wNCiAgYm9yZGVyLWxlZnQ6IDBweDtcDQogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQTdBN0E3O1wNCn1cDQogXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDIyMSwgMjQwLCAyNTUsIDAuMjApO1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcDQogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMxKTtcDQp9XA0KXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMjEsIDI0MCwgMjU1LCAwLjIwKTtcDQp9XA0KICAgICAgIFwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9pbnZpc2libGUge1wNCiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiM3NTdhRDg7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjojNzk3ODc4O1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfY29uc3RhbnQge1wNCiAgY29sb3I6IzRGQjdDNTtcDQp9XA0KXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XA0KICBjb2xvcjojREU4RTMwO1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6I0NDQ0NDQztcDQp9XA0KXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2ludmFsaWQge1wNCiAgY29sb3I6I0Y4RjhGODtcDQpiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoODYsIDQ1LCA4NiwgMC43NSk7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9pbnZhbGlkLmFjZV9pbGxlZ2FsIHtcDQogIGNvbG9yOiNGOEY4Rjg7XA0KYmFja2dyb3VuZC1jb2xvcjpyZ2JhKDg2LCA0NSwgODYsIDAuNzUpO1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7XA0KICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCmZvbnQtc3R5bGU6aXRhbGljO1wNCmNvbG9yOiNEMkE4QTE7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogIzc1N2FEODtcDQogICAgYm9yZGVyLWNvbG9yOiAjOEY5MzhGO1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6I0FFQjJGODtcDQp9XA0KXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3N0cmluZyB7XA0KICBjb2xvcjojNjZBOTY4O1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAge1wNCiAgY29sb3I6I0U5QzA2MjtcDQp9XA0KXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6I0E2QzZGRjtcDQp9XA0KXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3ZhcmlhYmxlIHtcDQogIGNvbG9yOiNCRUJGNTU7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV92YXJpYWJsZS5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6I0MxQzE0NDtcDQp9XA0KXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3htbF9wZSB7XA0KICBjb2xvcjojNDk0OTQ5O1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wNCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3NvbGFyaXplZF9kYXJrJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KZXhwb3J0cy5pc0RhcmsgPSB0cnVlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2Utc29sYXJpemVkLWRhcmsiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX3Njcm9sbGVyIHtcDQogIGJhY2tncm91bmQtY29sb3I6ICMwMDJCMzY7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjOTNBMUExO1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0QzMDEwMjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0QzMDEwMjtcDQp9XA0KIFwNCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogIzA3MzY0MjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE0NywgMTYxLCAxNjEsIDAuNTApO1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogIzA3MzY0MjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzA3MzY0MjtcDQp9XA0KICAgICAgIFwNCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9pbnZpc2libGUge1wNCiAgY29sb3I6IHJnYmEoMTQ3LCAxNjEsIDE2MSwgMC41MCk7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiM4NTk5MDA7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6I0I1ODkwMDtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcDQogIGNvbG9yOiNEMzM2ODI7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogIzI2OEJEMjtcDQogICAgYm9yZGVyLWNvbG9yOiAjOTNBMUExO1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IzI2OEJEMjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX3N0cmluZyB7XA0KICBjb2xvcjojMkFBMTk4O1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAge1wNCiAgY29sb3I6I0QzMDEwMjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2NvbW1lbnQge1wNCiAgZm9udC1zdHlsZTppdGFsaWM7XA0KY29sb3I6IzY1N0I4MztcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX3ZhcmlhYmxlLmFjZV9sYW5ndWFnZSB7XA0KICBjb2xvcjojMjY4QkQyO1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wNCiAgY29sb3I6IzkzQTFBMTtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IzI2OEJEMjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcDQogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcDQp9IjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsNCn0pOw0KOw0KICAgICAgICAgICAgKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpDQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgIA==]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3NvbGFyaXplZF9saWdodCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuaXNEYXJrID0gZmFsc2U7DQpleHBvcnRzLmNzc0NsYXNzID0gImFjZS1zb2xhcml6ZWQtbGlnaHQiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfZWRpdG9yIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9wcmludF9tYXJnaW4ge1wNCiAgd2lkdGg6IDFweDtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2Vfc2Nyb2xsZXIge1wNCiAgYmFja2dyb3VuZC1jb2xvcjogI0ZERjZFMztcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjNTg2RTc1O1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2N1cnNvciB7XA0KICBib3JkZXItbGVmdDogMnB4IHNvbGlkICMwMDAwMDA7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wNCiAgYm9yZGVyLWxlZnQ6IDBweDtcDQogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMDAwMDAwO1wNCn1cDQogXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogIzA3MzY0MjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcDQogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcDQogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTQ3LCAxNjEsIDE2MSwgMC41MCk7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogI0VFRThENTtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcDQogIGJvcmRlcjogMXB4IHNvbGlkICMwNzM2NDI7XA0KfVwNCiAgICAgICBcDQouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogcmdiYSgxNDcsIDE2MSwgMTYxLCAwLjUwKTtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiM4NTk5MDA7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcDQogIGNvbG9yOiNCNTg5MDA7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6I0QzMzY4MjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogIzI2OEJEMjtcDQogICAgYm9yZGVyLWNvbG9yOiAjNTg2RTc1O1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiMyNjhCRDI7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2Vfc3RyaW5nIHtcDQogIGNvbG9yOiMyQUExOTg7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAge1wNCiAgY29sb3I6I0QzMDEwMjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9jb21tZW50IHtcDQogIGNvbG9yOiM5M0ExQTE7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfdmFyaWFibGUuYWNlX2xhbmd1YWdlIHtcDQogIGNvbG9yOiMyNjhCRDI7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wNCiAgY29sb3I6IzkzQTFBMTtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiMyNjhCRDI7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wNCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3RleHRtYXRlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KZXhwb3J0cy5pc0RhcmsgPSBmYWxzZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLXRtIjsNCmV4cG9ydHMuY3NzVGV4dCA9ICIuYWNlLXRtIC5hY2VfZWRpdG9yIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2d1dHRlciB7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCiAgY29sb3I6ICMzMzM7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9wcmludF9tYXJnaW4ge1wNCiAgd2lkdGg6IDFweDtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogIzZCNzJFNjtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgYmxhY2s7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1wNCn1cDQogICAgICAgIFwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiByZ2IoMTkxLCAxOTEsIDE5MSk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfa2V5d29yZCB7XA0KICBjb2xvcjogYmx1ZTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfYnVpbGRpbiB7XA0KICBjb2xvcjogcmdiKDg4LCA3MiwgMjQ2KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6IHJnYig4OCwgOTIsIDI0Nik7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xpYnJhcnkge1wNCiAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9pbnZhbGlkIHtcDQogIGJhY2tncm91bmQtY29sb3I6IHJnYigxNTMsIDAsIDApO1wNCiAgY29sb3I6IHdoaXRlO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiByZ2IoNjAsIDc2LCAxMTQpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2NvbnN0YW50IHtcDQogIGNvbG9yOiByZ2IoNiwgMTUwLCAxNCk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfdHlwZSxcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2NsYXNzIHtcDQogIGNvbG9yOiByZ2IoMTA5LCAxMjEsIDIyMik7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige1wNCiAgY29sb3I6IHJnYigxMDQsIDExOCwgMTM1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6IHJnYigzLCAxMDYsIDcpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6IHJnYig3NiwgMTM2LCAxMDcpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQuYWNlX2RvYyB7XA0KICBjb2xvcjogcmdiKDAsIDEwMiwgMjU1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MuYWNlX3RhZyB7XA0KICBjb2xvcjogcmdiKDEyOCwgMTU5LCAxOTEpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcDQogIGNvbG9yOiByZ2IoMCwgMCwgMjA1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV92YXJpYWJsZSB7XA0KICBjb2xvcjogcmdiKDQ5LCAxMzIsIDE0OSk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfeG1sX3BlIHtcDQogIGNvbG9yOiByZ2IoMTA0LCAxMDQsIDkxKTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6ICMwMDAwQTI7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tYXJrdXAuYWNlX21hcmt1cGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcge1wNCiAgY29sb3I6IHJnYigxMiwgNywgMjU1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XA0KICBjb2xvcjpyZ2IoMTg1LCA2LCAxNDQpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtcDQogIGJhY2tncm91bmQ6IHJnYigxODEsIDIxMywgMjU1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDI1MiwgMjU1LCAwKTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0YWNrIHtcDQogIGJhY2tncm91bmQ6IHJnYigxNjQsIDIyOSwgMTAxKTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE5MiwgMTkyLCAxOTIpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA3KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYmFja2dyb3VuZDogcmdiKDI1MCwgMjUwLCAyNTUpO1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwMCwgMjAwLCAyNTApO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWV0YS5hY2VfdGFnIHtcDQogIGNvbG9yOnJnYigyOCwgMiwgMjU1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX3N0cmluZy5hY2VfcmVnZXgge1wNCiAgY29sb3I6IHJnYigyNTUsIDAsIDApXA0KfSI7DQoNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7DQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-textmate.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvdGV4dG1hdGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiLGIuaXNEYXJrPSExLGIuY3NzQ2xhc3M9ImFjZS10bSIsYi5jc3NUZXh0PSIuYWNlLXRtIC5hY2VfZWRpdG9yIHsgIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTt9LmFjZS10bSAuYWNlX2VkaXRvci5hY2VfZm9jdXMgeyAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDt9LmFjZS10bSAuYWNlX2d1dHRlciB7ICBiYWNrZ3JvdW5kOiAjZThlOGU4OyAgY29sb3I6ICMzMzM7fS5hY2UtdG0gLmFjZV9wcmludF9tYXJnaW4geyAgd2lkdGg6IDFweDsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7fS5hY2UtdG0gLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogIzZCNzJFNjt9LmFjZS10bSAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0O30uYWNlLXRtIC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgYmxhY2s7fS5hY2UtdG0gLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7ICBib3JkZXItbGVmdDogMHB4OyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30gICAgICAgIC5hY2UtdG0gLmFjZV9saW5lIC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiByZ2IoMTkxLCAxOTEsIDE5MSk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfa2V5d29yZCB7ICBjb2xvcjogYmx1ZTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfYnVpbGRpbiB7ICBjb2xvcjogcmdiKDg4LCA3MiwgMjQ2KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6IHJnYig4OCwgOTIsIDI0Nik7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xpYnJhcnkgeyAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9pbnZhbGlkIHsgIGJhY2tncm91bmQtY29sb3I6IHJnYigxNTMsIDAsIDApOyAgY29sb3I6IHdoaXRlO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiByZ2IoNjAsIDc2LCAxMTQpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2NvbnN0YW50IHsgIGNvbG9yOiByZ2IoNiwgMTUwLCAxNCk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfdHlwZSwuYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2NsYXNzIHsgIGNvbG9yOiByZ2IoMTA5LCAxMjEsIDIyMik7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3IgeyAgY29sb3I6IHJnYigxMDQsIDExOCwgMTM1KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdHJpbmcgeyAgY29sb3I6IHJnYigzLCAxMDYsIDcpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQgeyAgY29sb3I6IHJnYig3NiwgMTM2LCAxMDcpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQuYWNlX2RvYyB7ICBjb2xvcjogcmdiKDAsIDEwMiwgMjU1KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MuYWNlX3RhZyB7ICBjb2xvcjogcmdiKDEyOCwgMTU5LCAxOTEpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHsgIGNvbG9yOiByZ2IoMCwgMCwgMjA1KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV92YXJpYWJsZSB7ICBjb2xvcjogcmdiKDQ5LCAxMzIsIDE0OSk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfeG1sX3BlIHsgIGNvbG9yOiByZ2IoMTA0LCAxMDQsIDkxKTt9LmFjZS10bSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24geyAgY29sb3I6ICMwMDAwQTI7fS5hY2UtdG0gLmFjZV9tYXJrdXAuYWNlX21hcmt1cGluZSB7ICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fS5hY2UtdG0gLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcgeyAgY29sb3I6IHJnYigxMiwgNywgMjU1KTt9LmFjZS10bSAuYWNlX21hcmt1cC5hY2VfbGlzdCB7ICBjb2xvcjpyZ2IoMTg1LCA2LCAxNDQpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHsgIGJhY2tncm91bmQ6IHJnYigxODEsIDIxMywgMjU1KTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDI1MiwgMjU1LCAwKTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0YWNrIHsgIGJhY2tncm91bmQ6IHJnYigxNjQsIDIyOSwgMTAxKTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQgeyAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4OyAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE5MiwgMTkyLCAxOTIpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA3KTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYmFja2dyb3VuZDogcmdiKDI1MCwgMjUwLCAyNTUpOyAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwMCwgMjAwLCAyNTApO30uYWNlLXRtIC5hY2VfbWV0YS5hY2VfdGFnIHsgIGNvbG9yOnJnYigyOCwgMiwgMjU1KTt9LmFjZS10bSAuYWNlX3N0cmluZy5hY2VfcmVnZXggeyAgY29sb3I6IHJnYigyNTUsIDAsIDApfSI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0pLGZ1bmN0aW9uKCl7d2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sZnVuY3Rpb24oYSl7d2luZG93LmFjZXx8KHdpbmRvdy5hY2U9e30pO2Zvcih2YXIgYiBpbiBhKWEuaGFzT3duUHJvcGVydHkoYikmJihhY2VbYl09YVtiXSl9KX0oKQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3RvbW9ycm93JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KZXhwb3J0cy5pc0RhcmsgPSBmYWxzZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLXRvbW9ycm93IjsNCmV4cG9ydHMuY3NzVGV4dCA9ICJcDQouYWNlLXRvbW9ycm93IC5hY2VfZWRpdG9yIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX2d1dHRlciB7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCiAgY29sb3I6ICMzMzM7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9wcmludF9tYXJnaW4ge1wNCiAgd2lkdGg6IDFweDtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9zY3JvbGxlciB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2VfdGV4dC1sYXllciB7XA0KICBjdXJzb3I6IHRleHQ7XA0KICBjb2xvcjogIzRENEQ0QztcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX2N1cnNvciB7XA0KICBib3JkZXItbGVmdDogMnB4IHNvbGlkICNBRUFGQUQ7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNBRUFGQUQ7XA0KfVwNCiBcDQouYWNlLXRvbW9ycm93IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtcDQogIGJhY2tncm91bmQ6ICNENkQ2RDY7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcDQogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgI0QxRDFEMTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcDQogIGJhY2tncm91bmQ6ICNFRkVGRUY7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcDQogIGJvcmRlcjogMXB4IHNvbGlkICNENkQ2RDY7XA0KfVwNCiAgICAgICBcDQouYWNlLXRvbW9ycm93IC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiAjRDFEMUQxO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2Vfa2V5d29yZCB7XA0KICBjb2xvcjojODk1OUE4O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige1wNCiAgY29sb3I6IzNFOTk5RjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XA0KICBjb2xvcjojRjU4NzFGO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6I0Y1ODcxRjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX2ludmFsaWQge1wNCiAgY29sb3I6I0ZGRkZGRjtcDQpiYWNrZ3JvdW5kLWNvbG9yOiNDODI4Mjk7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHtcDQogIGNvbG9yOiNGRkZGRkY7XA0KYmFja2dyb3VuZC1jb2xvcjojODk1OUE4O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2VfZm9sZCB7XA0KICAgIGJhY2tncm91bmQtY29sb3I6ICM0MjcxQUU7XA0KICAgIGJvcmRlci1jb2xvcjogIzRENEQ0QztcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiM0MjcxQUU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6IzcxOEMwMDtcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHtcDQogIGNvbG9yOiNDODI4Mjk7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9jb21tZW50IHtcDQogIGNvbG9yOiM4RTkwOEM7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV92YXJpYWJsZSB7XA0KICBjb2xvcjojQzgyODI5O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2VfbWV0YS5hY2VfdGFnIHtcDQogIGNvbG9yOiNDODI4Mjk7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7XA0KICBjb2xvcjojQzgyODI5O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjojNDI3MUFFO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wNCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHtcDQogIGNvbG9yOiM3MThDMDA7XA0KfSI7DQoNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7DQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3RvbW9ycm93X25pZ2h0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KZXhwb3J0cy5pc0RhcmsgPSB0cnVlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtdG9tb3Jyb3ctbmlnaHQiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3Njcm9sbGVyIHtcDQogIGJhY2tncm91bmQtY29sb3I6ICMxRDFGMjE7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjQzVDOEM2O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0FFQUZBRDtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0FFQUZBRDtcDQp9XA0KIFwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogIzM3M0I0MTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCAjNEI0RTU1O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogIzI4MkEyRTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzM3M0I0MTtcDQp9XA0KICAgICAgIFwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9pbnZpc2libGUge1wNCiAgY29sb3I6ICM0QjRFNTU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiNCMjk0QkI7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjojOEFCRUI3O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcDQogIGNvbG9yOiNERTkzNUY7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7XA0KICBjb2xvcjojREU5MzVGO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfaW52YWxpZCB7XA0KICBjb2xvcjojQ0VEMkNGO1wNCmJhY2tncm91bmQtY29sb3I6I0RGNUY1RjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2ludmFsaWQuYWNlX2RlcHJlY2F0ZWQge1wNCiAgY29sb3I6I0NFRDJDRjtcDQpiYWNrZ3JvdW5kLWNvbG9yOiNCNzk4QkY7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogIzgxQTJCRTtcDQogICAgYm9yZGVyLWNvbG9yOiAjQzVDOEM2O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IzgxQTJCRTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3N0cmluZyB7XA0KICBjb2xvcjojQjVCRDY4O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAge1wNCiAgY29sb3I6I0NDNjY2NjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6Izk2OTg5NjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3ZhcmlhYmxlIHtcDQogIGNvbG9yOiNDQzY2NjY7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tZXRhLmFjZV90YWcge1wNCiAgY29sb3I6I0NDNjY2NjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHtcDQogIGNvbG9yOiNDQzY2NjY7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiM4MUEyQkU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcge1wNCiAgY29sb3I6I0I1QkQ2ODtcDQp9IjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsNCn0pOw0KOw0KICAgICAgICAgICAgKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpDQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgIA==]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3RvbW9ycm93X25pZ2h0X2JsdWUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KDQpleHBvcnRzLmlzRGFyayA9IHRydWU7DQpleHBvcnRzLmNzc0NsYXNzID0gImFjZS10b21vcnJvdy1uaWdodC1ibHVlIjsNCmV4cG9ydHMuY3NzVGV4dCA9ICJcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2d1dHRlciB7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCiAgY29sb3I6ICMzMzM7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfc2Nyb2xsZXIge1wNCiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMjQ1MTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfdGV4dC1sYXllciB7XA0KICBjdXJzb3I6IHRleHQ7XA0KICBjb2xvcjogI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wNCiAgYm9yZGVyLWxlZnQ6IDBweDtcDQogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRkZGRkZGO1wNCn1cDQogXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtcDQogIGJhY2tncm91bmQ6ICMwMDNGOEU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcDQogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcDQogIGJvcmRlcjogMXB4IHNvbGlkICM0MDRGN0Q7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcDQogIGJhY2tncm91bmQ6ICMwMDM0NkU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzAwM0Y4RTtcDQp9XA0KICAgICAgIFwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogIzQwNEY3RDtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfa2V5d29yZCB7XA0KICBjb2xvcjojRUJCQkZGO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjojOTlGRkZGO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6I0ZGQzU4RjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6I0ZGQzU4RjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfaW52YWxpZCB7XA0KICBjb2xvcjojRkZGRkZGO1wNCmJhY2tncm91bmQtY29sb3I6I0Y5OURBNTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7XA0KICBjb2xvcjojRkZGRkZGO1wNCmJhY2tncm91bmQtY29sb3I6I0VCQkJGRjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfZm9sZCB7XA0KICAgIGJhY2tncm91bmQtY29sb3I6ICNCQkRBRkY7XA0KICAgIGJvcmRlci1jb2xvcjogI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6I0JCREFGRjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfc3RyaW5nIHtcDQogIGNvbG9yOiNEMUYxQTk7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHtcDQogIGNvbG9yOiNGRjlEQTQ7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6IzcyODVCNztcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfdmFyaWFibGUge1wNCiAgY29sb3I6I0ZGOURBNDtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWV0YS5hY2VfdGFnIHtcDQogIGNvbG9yOiNGRjlEQTQ7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHtcDQogIGNvbG9yOiNGRjlEQTQ7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6I0JCREFGRjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wNCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcge1wNCiAgY29sb3I6I0QxRjFBOTtcDQp9IjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsNCn0pOw0KOw0KICAgICAgICAgICAgKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpDQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgIA==]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3RvbW9ycm93X25pZ2h0X2JyaWdodCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCI7DQpleHBvcnRzLmNzc1RleHQgPSAiXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9ndXR0ZXIge1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQogIGNvbG9yOiAjMzMzO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9zY3JvbGxlciB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCiAgY29sb3I6ICNERURFREU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzlGOUY5RjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM5RjlGOUY7XA0KfVwNCiBcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiAjNDI0MjQyO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzM0MzQzNDtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XA0KICBiYWNrZ3JvdW5kOiAjMkEyQTJBO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzQyNDI0MjtcDQp9XA0KICAgICAgIFwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiAjMzQzNDM0O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2tleXdvcmQge1wNCiAgY29sb3I6I0MzOTdEODtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjojNzBDMEIxO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XA0KICBjb2xvcjojRTc4QzQ1O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcDQogIGNvbG9yOiNFNzhDNDU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfaW52YWxpZCB7XA0KICBjb2xvcjojQ0VEMkNGO1wNCmJhY2tncm91bmQtY29sb3I6I0RGNUY1RjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHtcDQogIGNvbG9yOiNDRUQyQ0Y7XA0KYmFja2dyb3VuZC1jb2xvcjojQjc5OEJGO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2ZvbGQge1wNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjN0FBNkRBO1wNCiAgICBib3JkZXItY29sb3I6ICNERURFREU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IzdBQTZEQTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6I0I5Q0E0QTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7XA0KICBjb2xvcjojRDU0RTUzO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6Izk2OTg5NjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV92YXJpYWJsZSB7XA0KICBjb2xvcjojRDU0RTUzO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21ldGEuYWNlX3RhZyB7XA0KICBjb2xvcjojRDU0RTUzO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHtcDQogIGNvbG9yOiNENTRFNTM7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjojN0FBNkRBO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcDQogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcge1wNCiAgY29sb3I6I0I5Q0E0QTtcDQp9IjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsNCn0pOw0KOw0KICAgICAgICAgICAgKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpDQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pKCk7DQogICAgICAgIA==]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3RvbW9ycm93X25pZ2h0X2VpZ2h0aWVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KZXhwb3J0cy5pc0RhcmsgPSB0cnVlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX3Njcm9sbGVyIHtcDQogIGJhY2tncm91bmQtY29sb3I6ICMyRDJEMkQ7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjQ0NDQ0NDO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0NDQ0NDQztcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0NDQ0NDQztcDQp9XA0KIFwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogIzUxNTE1MTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCAjNkE2QTZBO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogIzM5MzkzOTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzUxNTE1MTtcDQp9XA0KICAgICAgIFwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9pbnZpc2libGUge1wNCiAgY29sb3I6ICM2QTZBNkE7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiNDQzk5Q0M7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjojNjZDQ0NDO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcDQogIGNvbG9yOiNGOTkxNTc7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7XA0KICBjb2xvcjojRjk5MTU3O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfaW52YWxpZCB7XA0KICBjb2xvcjojQ0RDRENEO1wNCmJhY2tncm91bmQtY29sb3I6I0YyNzc3QTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2ludmFsaWQuYWNlX2RlcHJlY2F0ZWQge1wNCiAgY29sb3I6I0NEQ0RDRDtcDQpiYWNrZ3JvdW5kLWNvbG9yOiNDQzk5Q0M7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogIzY2OTlDQztcDQogICAgYm9yZGVyLWNvbG9yOiAjQ0NDQ0NDO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IzY2OTlDQztcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX3N0cmluZyB7XA0KICBjb2xvcjojOTlDQzk5O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfY29tbWVudCB7XA0KICBjb2xvcjojOTk5OTk5O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfdmFyaWFibGUge1wNCiAgY29sb3I6I0YyNzc3QTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21ldGEuYWNlX3RhZyB7XA0KICBjb2xvcjojRjI3NzdBO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wNCiAgY29sb3I6I0YyNzc3QTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IzY2OTlDQztcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcDQogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7XA0KICBjb2xvcjojOTlDQzk5O1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3R3aWxpZ2h0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KZXhwb3J0cy5pc0RhcmsgPSB0cnVlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtdHdpbGlnaHQiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2UtdHdpbGlnaHQgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX3Njcm9sbGVyIHtcDQogIGJhY2tncm91bmQtY29sb3I6ICMxNDE0MTQ7XA0KfVwNClwNCi5hY2UtdHdpbGlnaHQgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjRjhGOEY4O1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0E3QTdBNztcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0E3QTdBNztcDQp9XA0KIFwNCi5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogcmdiYSgyMjEsIDI0MCwgMjU1LCAwLjIwKTtcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpO1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzMSk7XA0KfVwNClwNCi5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjIxLCAyNDAsIDI1NSwgMC4yMCk7XA0KfVwNCiAgICAgICBcDQouYWNlLXR3aWxpZ2h0IC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpO1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2Vfa2V5d29yZCB7XA0KICBjb2xvcjojQ0RBODY5O1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfY29uc3RhbnQge1wNCiAgY29sb3I6I0NGNkE0QztcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX2ludmFsaWQuYWNlX2lsbGVnYWwge1wNCiAgY29sb3I6I0Y4RjhGODtcDQpiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoODYsIDQ1LCA4NiwgMC43NSk7XA0KfVwNClwNCi5hY2UtdHdpbGlnaHQgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHtcDQogIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KZm9udC1zdHlsZTppdGFsaWM7XA0KY29sb3I6I0QyQThBMTtcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX3N1cHBvcnQge1wNCiAgY29sb3I6IzlCODU5RDtcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX2ZvbGQge1wNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQUM4ODVCO1wNCiAgICBib3JkZXItY29sb3I6ICNGOEY4Rjg7XA0KfVwNClwNCi5hY2UtdHdpbGlnaHQgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjojREFEMDg1O1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2Vfc3RyaW5nIHtcDQogIGNvbG9yOiM4RjlENkE7XA0KfVwNClwNCi5hY2UtdHdpbGlnaHQgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7XA0KICBjb2xvcjojRTlDMDYyO1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfY29tbWVudCB7XA0KICBmb250LXN0eWxlOml0YWxpYztcDQpjb2xvcjojNUY1QTYwO1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfdmFyaWFibGUge1wNCiAgY29sb3I6Izc1ODdBNjtcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX3htbF9wZSB7XA0KICBjb2xvcjojNDk0OTQ5O1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfbWV0YS5hY2VfdGFnIHtcDQogIGNvbG9yOiNBQzg4NUI7XA0KfVwNClwNCi5hY2UtdHdpbGlnaHQgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiNBQzg4NUI7XA0KfVwNClwNCi5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfVwNClwNCi5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcge1wNCiAgY29sb3I6I0NGNkE0QztcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XA0KICBjb2xvcjojRjlFRTk4O1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBNaWNoYWVsIFNjaHdhcnR6IDxtci5wYW50cyBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3ZpYnJhbnRfaW5rJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KZXhwb3J0cy5pc0RhcmsgPSB0cnVlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtdmlicmFudC1pbmsiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS12aWJyYW50LWluayAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS12aWJyYW50LWluayAuYWNlX3Njcm9sbGVyIHtcDQogIGJhY2tncm91bmQtY29sb3I6ICMwRjBGMEY7XA0KfVwNClwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjRkZGRkZGO1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS12aWJyYW50LWluayAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGRkZGRjtcDQp9XA0KIFwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogIzY2OTlDQztcDQp9XA0KXA0KLmFjZS12aWJyYW50LWluayAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCAjNDA0MDQwO1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogIzMzMzMzMztcDQp9XA0KXA0KLmFjZS12aWJyYW50LWluayAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzY2OTlDQztcDQp9XA0KICAgICAgIFwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9pbnZpc2libGUge1wNCiAgY29sb3I6ICM0MDQwNDA7XA0KfVwNClwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiNGRjY2MDA7XA0KfVwNClwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9jb25zdGFudCB7XA0KICBjb2xvcjojMzM5OTk5O1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6Izk5Q0M5OTtcDQp9XA0KXA0KLmFjZS12aWJyYW50LWluayAuYWNlX2ludmFsaWQge1wNCiAgY29sb3I6I0NDRkYzMztcDQpiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7XA0KfVwNClwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHtcDQogIGNvbG9yOiNDQ0ZGMzM7XA0KYmFja2dyb3VuZC1jb2xvcjojMDAwMDAwO1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfZm9sZCB7XA0KICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkNDMDA7XA0KICAgIGJvcmRlci1jb2xvcjogI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS12aWJyYW50LWluayAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiNGRkNDMDA7XA0KfVwNClwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6IzY2RkYwMDtcDQp9XA0KXA0KLmFjZS12aWJyYW50LWluayAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHtcDQogIGNvbG9yOiM0NEI0Q0M7XA0KfVwNClwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9jb21tZW50IHtcDQogIGNvbG9yOiM5OTMzQ0M7XA0KfVwNClwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7XA0KICBmb250LXN0eWxlOml0YWxpYztcDQpjb2xvcjojOTlDQzk5O1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjojRkZDQzAwO1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wNCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo7DQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSkoKTsNCiAgICAgICAg]]></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[Im5vIHVzZSBzdHJpY3QiOw0KDQp2YXIgY29uc29sZSA9IHsNCiAgICBsb2c6IGZ1bmN0aW9uKG1zZykgew0KICAgICAgICBwb3N0TWVzc2FnZSh7dHlwZTogImxvZyIsIGRhdGE6IG1zZ30pOw0KICAgIH0NCn07DQp2YXIgd2luZG93ID0gew0KICAgIGNvbnNvbGU6IGNvbnNvbGUNCn07DQoNCnZhciBub3JtYWxpemVNb2R1bGUgPSBmdW5jdGlvbihwYXJlbnRJZCwgbW9kdWxlTmFtZSkgew0KICAgIC8vIG5vcm1hbGl6ZSBwbHVnaW4gcmVxdWlyZXMNCiAgICBpZiAobW9kdWxlTmFtZS5pbmRleE9mKCIhIikgIT09IC0xKSB7DQogICAgICAgIHZhciBjaHVua3MgPSBtb2R1bGVOYW1lLnNwbGl0KCIhIik7DQogICAgICAgIHJldHVybiBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1swXSkgKyAiISIgKyBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1sxXSk7DQogICAgfQ0KICAgIC8vIG5vcm1hbGl6ZSByZWxhdGl2ZSByZXF1aXJlcw0KICAgIGlmIChtb2R1bGVOYW1lLmNoYXJBdCgwKSA9PSAiLiIpIHsNCiAgICAgICAgdmFyIGJhc2UgPSBwYXJlbnRJZC5zcGxpdCgiLyIpLnNsaWNlKDAsIC0xKS5qb2luKCIvIik7DQogICAgICAgIHZhciBtb2R1bGVOYW1lID0gYmFzZSArICIvIiArIG1vZHVsZU5hbWU7DQogICAgICAgIA0KICAgICAgICB3aGlsZShtb2R1bGVOYW1lLmluZGV4T2YoIi4iKSAhPT0gLTEgJiYgcHJldmlvdXMgIT0gbW9kdWxlTmFtZSkgew0KICAgICAgICAgICAgdmFyIHByZXZpb3VzID0gbW9kdWxlTmFtZTsNCiAgICAgICAgICAgIHZhciBtb2R1bGVOYW1lID0gbW9kdWxlTmFtZS5yZXBsYWNlKC9cL1wuXC8vLCAiLyIpLnJlcGxhY2UoL1teXC9dK1wvXC5cLlwvLywgIiIpOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIHJldHVybiBtb2R1bGVOYW1lOw0KfTsNCg0KdmFyIHJlcXVpcmUgPSBmdW5jdGlvbihwYXJlbnRJZCwgaWQpIHsNCiAgICB2YXIgaWQgPSBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGlkKTsNCiAgICANCiAgICB2YXIgbW9kdWxlID0gcmVxdWlyZS5tb2R1bGVzW2lkXTsNCiAgICBpZiAobW9kdWxlKSB7DQogICAgICAgIGlmICghbW9kdWxlLmluaXRpYWxpemVkKSB7DQogICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG1vZHVsZS5mYWN0b3J5KCkuZXhwb3J0czsNCiAgICAgICAgICAgIG1vZHVsZS5pbml0aWFsaXplZCA9IHRydWU7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzOw0KICAgIH0NCiAgICANCiAgICB2YXIgY2h1bmtzID0gaWQuc3BsaXQoIi8iKTsNCiAgICBjaHVua3NbMF0gPSByZXF1aXJlLnRsbnNbY2h1bmtzWzBdXSB8fCBjaHVua3NbMF07DQogICAgdmFyIHBhdGggPSBjaHVua3Muam9pbigiLyIpICsgIi5qcyI7DQogICAgDQogICAgcmVxdWlyZS5pZCA9IGlkOw0KICAgIGltcG9ydFNjcmlwdHMocGF0aCk7DQogICAgcmV0dXJuIHJlcXVpcmUocGFyZW50SWQsIGlkKTsgICAgDQp9Ow0KDQpyZXF1aXJlLm1vZHVsZXMgPSB7fTsNCnJlcXVpcmUudGxucyA9IHt9Ow0KDQp2YXIgZGVmaW5lID0gZnVuY3Rpb24oaWQsIGRlcHMsIGZhY3RvcnkpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7DQogICAgICAgIGZhY3RvcnkgPSBkZXBzOw0KICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICAgIGZhY3RvcnkgPSBpZDsNCiAgICAgICAgaWQgPSByZXF1aXJlLmlkOw0KICAgIH0NCg0KICAgIGlmIChpZC5pbmRleE9mKCJ0ZXh0ISIpID09PSAwKSANCiAgICAgICAgcmV0dXJuOw0KICAgIA0KICAgIHZhciByZXEgPSBmdW5jdGlvbihkZXBzLCBmYWN0b3J5KSB7DQogICAgICAgIHJldHVybiByZXF1aXJlKGlkLCBkZXBzLCBmYWN0b3J5KTsNCiAgICB9Ow0KDQogICAgcmVxdWlyZS5tb2R1bGVzW2lkXSA9IHsNCiAgICAgICAgZmFjdG9yeTogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgbW9kdWxlID0gew0KICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdmFyIHJldHVybkV4cG9ydHMgPSBmYWN0b3J5KHJlcSwgbW9kdWxlLmV4cG9ydHMsIG1vZHVsZSk7DQogICAgICAgICAgICBpZiAocmV0dXJuRXhwb3J0cykNCiAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHJldHVybkV4cG9ydHM7DQogICAgICAgICAgICByZXR1cm4gbW9kdWxlOw0KICAgICAgICB9DQogICAgfTsNCn07DQoNCmZ1bmN0aW9uIGluaXRCYXNlVXJscyh0b3BMZXZlbE5hbWVzcGFjZXMpIHsNCiAgICByZXF1aXJlLnRsbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXM7DQp9DQoNCmZ1bmN0aW9uIGluaXRTZW5kZXIoKSB7DQoNCiAgICB2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZShudWxsLCAiYWNlL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KICAgIHZhciBvb3AgPSByZXF1aXJlKG51bGwsICJhY2UvbGliL29vcCIpOw0KICAgIA0KICAgIHZhciBTZW5kZXIgPSBmdW5jdGlvbigpIHt9Ow0KICAgIA0KICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgDQogICAgICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrSWQpIHsNCiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAiY2FsbCIsDQogICAgICAgICAgICAgICAgaWQ6IGNhbGxiYWNrSWQsDQogICAgICAgICAgICAgICAgZGF0YTogZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQogICAgDQogICAgICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uKG5hbWUsIGRhdGEpIHsNCiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAiZXZlbnQiLA0KICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsDQogICAgICAgICAgICAgICAgZGF0YTogZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQogICAgICAgIA0KICAgIH0pLmNhbGwoU2VuZGVyLnByb3RvdHlwZSk7DQogICAgDQogICAgcmV0dXJuIG5ldyBTZW5kZXIoKTsNCn0NCg0KdmFyIG1haW47DQp2YXIgc2VuZGVyOw0KDQpvbm1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7DQogICAgdmFyIG1zZyA9IGUuZGF0YTsNCiAgICBpZiAobXNnLmNvbW1hbmQpIHsNCiAgICAgICAgbWFpblttc2cuY29tbWFuZF0uYXBwbHkobWFpbiwgbXNnLmFyZ3MpOw0KICAgIH0NCiAgICBlbHNlIGlmIChtc2cuaW5pdCkgeyAgICAgICAgDQogICAgICAgIGluaXRCYXNlVXJscyhtc2cudGxucyk7DQogICAgICAgIHJlcXVpcmUobnVsbCwgImFjZS9saWIvZml4b2xkYnJvd3NlcnMiKTsNCiAgICAgICAgc2VuZGVyID0gaW5pdFNlbmRlcigpOw0KICAgICAgICB2YXIgY2xhenogPSByZXF1aXJlKG51bGwsIG1zZy5tb2R1bGUpW21zZy5jbGFzc25hbWVdOw0KICAgICAgICBtYWluID0gbmV3IGNsYXp6KHNlbmRlcik7DQogICAgfSANCiAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgc2VuZGVyKSB7DQogICAgICAgIHNlbmRlci5fZW1pdChtc2cuZXZlbnQsIG1zZy5kYXRhKTsNCiAgICB9DQp9Ow0KLy8gdmltOnNldCB0cz00IHN0cz00IHN3PTQgc3Q6DQovLyAtLSBrcmlza293YWwgS3JpcyBLb3dhbCBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBNSVQgTGljZW5zZQ0KLy8gLS0gdGxyb2JpbnNvbiBUb20gUm9iaW5zb24gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTUlUIExpY2Vuc2UgKE5hcndoYWwgUHJvamVjdCkNCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0KEMpIDIwMTAgWFhYIE5vIExpY2Vuc2UgU3BlY2lmaWVkDQovLyAtLSBmc2NoYWVmZXIgRmxvcmlhbiBTY2jDpGZlciBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIElyYWtsaSBHb3phbGlzaHZpbGkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQoNCi8qIQ0KICAgIENvcHlyaWdodCAoYykgMjAwOSwgMjgwIE5vcnRoIEluYy4gaHR0cDovLzI4MG5vcnRoLmNvbS8NCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQNCiovDQoNCmRlZmluZSgnYWNlL2xpYi9maXhvbGRicm93c2VycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9yZWdleHAnLCAnYWNlL2xpYi9lczUtc2hpbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KcmVxdWlyZSgiLi9yZWdleHAiKTsNCnJlcXVpcmUoIi4vZXM1LXNoaW0iKTsNCg0KfSk7LyoqDQogKiAgQmFzZWQgb24gY29kZSBmcm9tOg0KICoNCiAqIFhSZWdFeHAgMS41LjANCiAqIChjKSAyMDA3LTIwMTAgU3RldmVuIExldml0aGFuDQogKiBNSVQgTGljZW5zZQ0KICogPGh0dHA6Ly94cmVnZXhwLmNvbT4NCiAqIFByb3ZpZGVzIGFuIGF1Z21lbnRlZCwgZXh0ZW5zaWJsZSwgY3Jvc3MtYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiByZWd1bGFyIGV4cHJlc3Npb25zLA0KICogaW5jbHVkaW5nIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgc3ludGF4LCBmbGFncywgYW5kIG1ldGhvZHMNCiAqLw0KIA0KZGVmaW5lKCdhY2UvbGliL3JlZ2V4cCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vICBQcml2YXRlIHZhcmlhYmxlcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICB2YXIgcmVhbCA9IHsNCiAgICAgICAgICAgIGV4ZWM6IFJlZ0V4cC5wcm90b3R5cGUuZXhlYywNCiAgICAgICAgICAgIHRlc3Q6IFJlZ0V4cC5wcm90b3R5cGUudGVzdCwNCiAgICAgICAgICAgIG1hdGNoOiBTdHJpbmcucHJvdG90eXBlLm1hdGNoLA0KICAgICAgICAgICAgcmVwbGFjZTogU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlLA0KICAgICAgICAgICAgc3BsaXQ6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQNCiAgICAgICAgfSwNCiAgICAgICAgY29tcGxpYW50RXhlY05wY2cgPSByZWFsLmV4ZWMuY2FsbCgvKCk/Py8sICIiKVsxXSA9PT0gdW5kZWZpbmVkLCAvLyBjaGVjayBgZXhlY2AgaGFuZGxpbmcgb2Ygbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzDQogICAgICAgIGNvbXBsaWFudExhc3RJbmRleEluY3JlbWVudCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciB4ID0gL14vZzsNCiAgICAgICAgICAgIHJlYWwudGVzdC5jYWxsKHgsICIiKTsNCiAgICAgICAgICAgIHJldHVybiAheC5sYXN0SW5kZXg7DQogICAgICAgIH0oKTsNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gIE92ZXJyaWRlbiBuYXRpdmUgbWV0aG9kcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAvLyBBZGRzIG5hbWVkIGNhcHR1cmUgc3VwcG9ydCAod2l0aCBiYWNrcmVmZXJlbmNlcyByZXR1cm5lZCBhcyBgcmVzdWx0Lm5hbWVgKSwgYW5kIGZpeGVzIHR3bw0KICAgIC8vIGNyb3NzLWJyb3dzZXIgaXNzdWVzIHBlciBFUzM6DQogICAgLy8gLSBDYXB0dXJlZCB2YWx1ZXMgZm9yIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYHVuZGVmaW5lZGAsDQogICAgLy8gICByYXRoZXIgdGhhbiB0aGUgZW1wdHkgc3RyaW5nLg0KICAgIC8vIC0gYGxhc3RJbmRleGAgc2hvdWxkIG5vdCBiZSBpbmNyZW1lbnRlZCBhZnRlciB6ZXJvLWxlbmd0aCBtYXRjaGVzLg0KICAgIFJlZ0V4cC5wcm90b3R5cGUuZXhlYyA9IGZ1bmN0aW9uIChzdHIpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gcmVhbC5leGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksDQogICAgICAgICAgICBuYW1lLCByMjsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYCBmb3INCiAgICAgICAgICAgIC8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3Vwcw0KICAgICAgICAgICAgaWYgKCFjb21wbGlhbnRFeGVjTnBjZyAmJiBtYXRjaC5sZW5ndGggPiAxICYmIGluZGV4T2YobWF0Y2gsICIiKSA+IC0xKSB7DQogICAgICAgICAgICAgICAgcjIgPSBSZWdFeHAodGhpcy5zb3VyY2UsIHJlYWwucmVwbGFjZS5jYWxsKGdldE5hdGl2ZUZsYWdzKHRoaXMpLCAiZyIsICIiKSk7DQogICAgICAgICAgICAgICAgLy8gVXNpbmcgYHN0ci5zbGljZShtYXRjaC5pbmRleClgIHJhdGhlciB0aGFuIGBtYXRjaFswXWAgaW4gY2FzZSBsb29rYWhlYWQgYWxsb3dlZA0KICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIGR1ZSB0byBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIG1hdGNoDQogICAgICAgICAgICAgICAgcmVhbC5yZXBsYWNlLmNhbGwoc3RyLnNsaWNlKG1hdGNoLmluZGV4KSwgcjIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMjsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzW2ldID09PSB1bmRlZmluZWQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0gPSB1bmRlZmluZWQ7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIEF0dGFjaCBuYW1lZCBjYXB0dXJlIHByb3BlcnRpZXMNCiAgICAgICAgICAgIGlmICh0aGlzLl94cmVnZXhwICYmIHRoaXMuX3hyZWdleHAuY2FwdHVyZU5hbWVzKSB7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBtYXRjaC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gdGhpcy5feHJlZ2V4cC5jYXB0dXJlTmFtZXNbaSAtIDFdOw0KICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSkNCiAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbbmFtZV0gPSBtYXRjaFtpXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgdGhhdCBpbmNyZW1lbnQgYGxhc3RJbmRleGAgYWZ0ZXIgemVyby1sZW5ndGggbWF0Y2hlcw0KICAgICAgICAgICAgaWYgKCFjb21wbGlhbnRMYXN0SW5kZXhJbmNyZW1lbnQgJiYgdGhpcy5nbG9iYWwgJiYgIW1hdGNoWzBdLmxlbmd0aCAmJiAodGhpcy5sYXN0SW5kZXggPiBtYXRjaC5pbmRleCkpDQogICAgICAgICAgICAgICAgdGhpcy5sYXN0SW5kZXgtLTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbWF0Y2g7DQogICAgfTsNCg0KICAgIC8vIERvbid0IG92ZXJyaWRlIGB0ZXN0YCBpZiBpdCB3b24ndCBjaGFuZ2UgYW55dGhpbmcNCiAgICBpZiAoIWNvbXBsaWFudExhc3RJbmRleEluY3JlbWVudCkgew0KICAgICAgICAvLyBGaXggYnJvd3NlciBidWcgaW4gbmF0aXZlIG1ldGhvZA0KICAgICAgICBSZWdFeHAucHJvdG90eXBlLnRlc3QgPSBmdW5jdGlvbiAoc3RyKSB7DQogICAgICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBgZXhlY2AgdG8gc2tpcCBzb21lIHByb2Nlc3Npbmcgb3ZlcmhlYWQsIGV2ZW4gdGhvdWdoIHRoZSBvdmVycmlkZW4NCiAgICAgICAgICAgIC8vIGBleGVjYCB3b3VsZCB0YWtlIGNhcmUgb2YgdGhlIGBsYXN0SW5kZXhgIGZpeA0KICAgICAgICAgICAgdmFyIG1hdGNoID0gcmVhbC5leGVjLmNhbGwodGhpcywgc3RyKTsNCiAgICAgICAgICAgIC8vIEZpeCBicm93c2VycyB0aGF0IGluY3JlbWVudCBgbGFzdEluZGV4YCBhZnRlciB6ZXJvLWxlbmd0aCBtYXRjaGVzDQogICAgICAgICAgICBpZiAobWF0Y2ggJiYgdGhpcy5nbG9iYWwgJiYgIW1hdGNoWzBdLmxlbmd0aCAmJiAodGhpcy5sYXN0SW5kZXggPiBtYXRjaC5pbmRleCkpDQogICAgICAgICAgICAgICAgdGhpcy5sYXN0SW5kZXgtLTsNCiAgICAgICAgICAgIHJldHVybiAhIW1hdGNoOw0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9ucw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICBmdW5jdGlvbiBnZXROYXRpdmVGbGFncyAocmVnZXgpIHsNCiAgICAgICAgcmV0dXJuIChyZWdleC5nbG9iYWwgICAgID8gImciIDogIiIpICsNCiAgICAgICAgICAgICAgIChyZWdleC5pZ25vcmVDYXNlID8gImkiIDogIiIpICsNCiAgICAgICAgICAgICAgIChyZWdleC5tdWx0aWxpbmUgID8gIm0iIDogIiIpICsNCiAgICAgICAgICAgICAgIChyZWdleC5leHRlbmRlZCAgID8gIngiIDogIiIpICsgLy8gUHJvcG9zZWQgZm9yIEVTNDsgaW5jbHVkZWQgaW4gQVMzDQogICAgICAgICAgICAgICAocmVnZXguc3RpY2t5ICAgICA/ICJ5IiA6ICIiKTsNCiAgICB9Ow0KDQogICAgZnVuY3Rpb24gaW5kZXhPZiAoYXJyYXksIGl0ZW0sIGZyb20pIHsNCiAgICAgICAgaWYgKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKSAvLyBVc2UgdGhlIG5hdGl2ZSBhcnJheSBtZXRob2QgaWYgYXZhaWxhYmxlDQogICAgICAgICAgICByZXR1cm4gYXJyYXkuaW5kZXhPZihpdGVtLCBmcm9tKTsNCiAgICAgICAgZm9yICh2YXIgaSA9IGZyb20gfHwgMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoYXJyYXlbaV0gPT09IGl0ZW0pDQogICAgICAgICAgICAgICAgcmV0dXJuIGk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH07DQoNCn0pOy8vIHZpbTogdHM9NCBzdHM9NCBzdz00IGV4cGFuZHRhYg0KLy8gLS0ga3Jpc2tvd2FsIEtyaXMgS293YWwgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIHRscm9iaW5zb24gVG9tIFJvYmluc29uIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlIChOYXJ3aGFsIFByb2plY3QpDQovLyAtLSBkYW50bWFuIERhbmllbCBGcmllc2VuIENvcHlyaWdodCAoQykgMjAxMCBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQ0KLy8gLS0gZnNjaGFlZmVyIEZsb3JpYW4gU2Now6RmZXIgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQovLyAtLSBHb3phbGEgSXJha2xpIEdvemFsaXNodmlsaSBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIGtpdGNhbWJyaWRnZSBLaXQgQ2FtYnJpZGdlIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0ga29zc25vY29ycCBTYXNoYSBLb3NzIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBicnlhbmZvcmJlcyBCcnlhbiBGb3JiZXMgWFhYIFRPRE8gTGljZW5zZSBvciBDTEENCi8vIC0tIGtpbGxkcmVhbSBRdWlsZHJlZW4gTW90dGEgQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbmNlDQovLyAtLSBtaWNoYWVsZmljYXJyYSBNaWNoYWVsIEZpY2FycmEgQ29weXJpZ2h0IChDKSAyMDExIDMtY2xhdXNlIEJTRCBMaWNlbnNlDQovLyAtLSBzaGFya2JyYWluZ3V5IEdlcmFyZCBQYWFwdSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIGJicXNyYyBCcmVuZGFuIE1vbGxveSAoQykgMjAxMSBDcmVhdGl2ZSBDb21tb25zIFplcm8gKHB1YmxpYyBkb21haW4pDQovLyAtLSBpd3lnIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBEb21lbmljRGVuaWNvbGEgRG9tZW5pYyBEZW5pY29sYSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIHhhdmllcm0wMiBNb250aWxsZXQgWGF2aWVyIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBSYXlub3MgUmF5bm9zIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBzYW1zb25qcyBTYW1pIFNhbWh1cmkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQovLyAtLSByd2xkcm4gUmljayBXYWxkcm9uIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0gbGV4ZXIgQWxleGV5IFpha2hhcm92IFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQoNCi8qIQ0KICAgIENvcHlyaWdodCAoYykgMjAwOSwgMjgwIE5vcnRoIEluYy4gaHR0cDovLzI4MG5vcnRoLmNvbS8NCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQNCiovDQoNCmRlZmluZSgnYWNlL2xpYi9lczUtc2hpbScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCi8qKg0KICogQnJpbmdzIGFuIGVudmlyb25tZW50IGFzIGNsb3NlIHRvIEVDTUFTY3JpcHQgNSBjb21wbGlhbmNlDQogKiBhcyBpcyBwb3NzaWJsZSB3aXRoIHRoZSBmYWNpbGl0aWVzIG9mIGVyc3R3aGlsZSBlbmdpbmVzLg0KICoNCiAqIEFubm90YXRlZCBFUzU6IGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8gKHNwZWNpZmljIGxpbmtzIGJlbG93KQ0KICogRVM1IFNwZWM6IGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FY21hLTI2Mi5wZGYNCiAqDQogKiBAbW9kdWxlDQogKi8NCg0KLyp3aGF0c3VwZG9jKi8NCg0KLy8NCi8vIEZ1bmN0aW9uDQovLyA9PT09PT09PQ0KLy8NCg0KLy8gRVMtNSAxNS4zLjQuNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMy40LjUNCg0KaWYgKCFGdW5jdGlvbi5wcm90b3R5cGUuYmluZCkgew0KICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7IC8vIC5sZW5ndGggaXMgMQ0KICAgICAgICAvLyAxLiBMZXQgVGFyZ2V0IGJlIHRoZSB0aGlzIHZhbHVlLg0KICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpczsNCiAgICAgICAgLy8gMi4gSWYgSXNDYWxsYWJsZShUYXJnZXQpIGlzIGZhbHNlLCB0aHJvdyBhIFR5cGVFcnJvciBleGNlcHRpb24uDQogICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9ICJmdW5jdGlvbiIpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICAvLyAzLiBMZXQgQSBiZSBhIG5ldyAocG9zc2libHkgZW1wdHkpIGludGVybmFsIGxpc3Qgb2YgYWxsIG9mIHRoZQ0KICAgICAgICAvLyAgIGFyZ3VtZW50IHZhbHVlcyBwcm92aWRlZCBhZnRlciB0aGlzQXJnIChhcmcxLCBhcmcyIGV0YyksIGluIG9yZGVyLg0KICAgICAgICAvLyBYWFggc2xpY2VkQXJncyB3aWxsIHN0YW5kIGluIGZvciAiQSIgaWYgdXNlZA0KICAgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsgLy8gZm9yIG5vcm1hbCBjYWxsDQogICAgICAgIC8vIDQuIExldCBGIGJlIGEgbmV3IG5hdGl2ZSBFQ01BU2NyaXB0IG9iamVjdC4NCiAgICAgICAgLy8gMTEuIFNldCB0aGUgW1tQcm90b3R5cGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRoZSBzdGFuZGFyZA0KICAgICAgICAvLyAgIGJ1aWx0LWluIEZ1bmN0aW9uIHByb3RvdHlwZSBvYmplY3QgYXMgc3BlY2lmaWVkIGluIDE1LjMuMy4xLg0KICAgICAgICAvLyAxMi4gU2V0IHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbg0KICAgICAgICAvLyAgIDE1LjMuNC41LjEuDQogICAgICAgIC8vIDEzLiBTZXQgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW4NCiAgICAgICAgLy8gICAxNS4zLjQuNS4yLg0KICAgICAgICAvLyAxNC4gU2V0IHRoZSBbW0hhc0luc3RhbmNlXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW4NCiAgICAgICAgLy8gICAxNS4zLjQuNS4zLg0KICAgICAgICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHsNCiAgICAgICAgICAgICAgICAvLyAxNS4zLjQuNS4yIFtbQ29uc3RydWN0XV0NCiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwNCiAgICAgICAgICAgICAgICAvLyBGIHRoYXQgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIGJpbmQgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYQ0KICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYXJndW1lbnRzIEV4dHJhQXJncywgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46DQogICAgICAgICAgICAgICAgLy8gMS4gTGV0IHRhcmdldCBiZSB0aGUgdmFsdWUgb2YgRidzIFtbVGFyZ2V0RnVuY3Rpb25dXQ0KICAgICAgICAgICAgICAgIC8vICAgaW50ZXJuYWwgcHJvcGVydHkuDQogICAgICAgICAgICAgICAgLy8gMi4gSWYgdGFyZ2V0IGhhcyBubyBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCwgYQ0KICAgICAgICAgICAgICAgIC8vICAgVHlwZUVycm9yIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQogICAgICAgICAgICAgICAgLy8gMy4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDQuIExldCBhcmdzIGJlIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlDQogICAgICAgICAgICAgICAgLy8gICBsaXN0IGJvdW5kQXJncyBpbiB0aGUgc2FtZSBvcmRlciBmb2xsb3dlZCBieSB0aGUgc2FtZQ0KICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4NCiAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIA0KICAgICAgICAgICAgICAgIC8vICAgbWV0aG9kIG9mIHRhcmdldCBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLg0KDQogICAgICAgICAgICAgICAgdmFyIEYgPSBmdW5jdGlvbigpe307DQogICAgICAgICAgICAgICAgRi5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlOw0KICAgICAgICAgICAgICAgIHZhciBzZWxmID0gbmV3IEY7DQoNCiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGFyZ2V0LmFwcGx5KA0KICAgICAgICAgICAgICAgICAgICBzZWxmLA0KICAgICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY7DQoNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgLy8gMTUuMy40LjUuMSBbW0NhbGxdXQ0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwgRiwNCiAgICAgICAgICAgICAgICAvLyB3aGljaCB3YXMgY3JlYXRlZCB1c2luZyB0aGUgYmluZCBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhDQogICAgICAgICAgICAgICAgLy8gdGhpcyB2YWx1ZSBhbmQgYSBsaXN0IG9mIGFyZ3VtZW50cyBFeHRyYUFyZ3MsIHRoZSBmb2xsb3dpbmcNCiAgICAgICAgICAgICAgICAvLyBzdGVwcyBhcmUgdGFrZW46DQogICAgICAgICAgICAgICAgLy8gMS4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDIuIExldCBib3VuZFRoaXMgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kVGhpc11dIGludGVybmFsDQogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyAzLiBMZXQgdGFyZ2V0IGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tUYXJnZXRGdW5jdGlvbl1dIGludGVybmFsDQogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyA0LiBMZXQgYXJncyBiZSBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSANCiAgICAgICAgICAgICAgICAvLyAgIGxpc3QgYm91bmRBcmdzIGluIHRoZSBzYW1lIG9yZGVyIGZvbGxvd2VkIGJ5IHRoZSBzYW1lIA0KICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4NCiAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2QgDQogICAgICAgICAgICAgICAgLy8gICBvZiB0YXJnZXQgcHJvdmlkaW5nIGJvdW5kVGhpcyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgDQogICAgICAgICAgICAgICAgLy8gICBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLg0KDQogICAgICAgICAgICAgICAgLy8gZXF1aXY6IHRhcmdldC5jYWxsKHRoaXMsIC4uLmJvdW5kQXJncywgLi4uYXJncykNCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KA0KICAgICAgICAgICAgICAgICAgICB0aGF0LA0KICAgICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH07DQogICAgICAgIC8vIFhYWCBib3VuZC5sZW5ndGggaXMgbmV2ZXIgd3JpdGFibGUsIHNvIGRvbid0IGV2ZW4gdHJ5DQogICAgICAgIC8vDQogICAgICAgIC8vIDE1LiBJZiB0aGUgW1tDbGFzc11dIGludGVybmFsIHByb3BlcnR5IG9mIFRhcmdldCBpcyAiRnVuY3Rpb24iLCB0aGVuDQogICAgICAgIC8vICAgICBhLiBMZXQgTCBiZSB0aGUgbGVuZ3RoIHByb3BlcnR5IG9mIFRhcmdldCBtaW51cyB0aGUgbGVuZ3RoIG9mIEEuDQogICAgICAgIC8vICAgICBiLiBTZXQgdGhlIGxlbmd0aCBvd24gcHJvcGVydHkgb2YgRiB0byBlaXRoZXIgMCBvciBMLCB3aGljaGV2ZXIgaXMgDQogICAgICAgIC8vICAgICAgIGxhcmdlci4NCiAgICAgICAgLy8gMTYuIEVsc2Ugc2V0IHRoZSBsZW5ndGggb3duIHByb3BlcnR5IG9mIEYgdG8gMC4NCiAgICAgICAgLy8gMTcuIFNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIHRoZSB2YWx1ZXMNCiAgICAgICAgLy8gICBzcGVjaWZpZWQgaW4gMTUuMy41LjEuDQoNCiAgICAgICAgLy8gVE9ETw0KICAgICAgICAvLyAxOC4gU2V0IHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRydWUuDQogICAgICAgIA0KICAgICAgICAvLyBUT0RPDQogICAgICAgIC8vIDE5LiBMZXQgdGhyb3dlciBiZSB0aGUgW1tUaHJvd1R5cGVFcnJvcl1dIGZ1bmN0aW9uIE9iamVjdCAoMTMuMi4zKS4NCiAgICAgICAgLy8gMjAuIENhbGwgdGhlIFtbRGVmaW5lT3duUHJvcGVydHldXSBpbnRlcm5hbCBtZXRob2Qgb2YgRiB3aXRoIA0KICAgICAgICAvLyAgIGFyZ3VtZW50cyAiY2FsbGVyIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCBbW1NldF1dOg0KICAgICAgICAvLyAgIHRocm93ZXIsIFtbRW51bWVyYWJsZV1dOiBmYWxzZSwgW1tDb25maWd1cmFibGVdXTogZmFsc2V9LCBhbmQgDQogICAgICAgIC8vICAgZmFsc2UuDQogICAgICAgIC8vIDIxLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aCANCiAgICAgICAgLy8gICBhcmd1bWVudHMgImFyZ3VtZW50cyIsIFByb3BlcnR5RGVzY3JpcHRvciB7W1tHZXRdXTogdGhyb3dlciwgDQogICAgICAgIC8vICAgW1tTZXRdXTogdGhyb3dlciwgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiBmYWxzZX0sDQogICAgICAgIC8vICAgYW5kIGZhbHNlLg0KDQogICAgICAgIC8vIFRPRE8NCiAgICAgICAgLy8gTk9URSBGdW5jdGlvbiBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgZG8gbm90IA0KICAgICAgICAvLyBoYXZlIGEgcHJvdG90eXBlIHByb3BlcnR5IG9yIHRoZSBbW0NvZGVdXSwgW1tGb3JtYWxQYXJhbWV0ZXJzXV0sIGFuZA0KICAgICAgICAvLyBbW1Njb3BlXV0gaW50ZXJuYWwgcHJvcGVydGllcy4NCiAgICAgICAgLy8gWFhYIGNhbid0IGRlbGV0ZSBwcm90b3R5cGUgaW4gcHVyZS1qcy4NCg0KICAgICAgICAvLyAyMi4gUmV0dXJuIEYuDQogICAgICAgIHJldHVybiBib3VuZDsNCiAgICB9Ow0KfQ0KDQovLyBTaG9ydGN1dCB0byBhbiBvZnRlbiBhY2Nlc3NlZCBwcm9wZXJ0aWVzLCBpbiBvcmRlciB0byBhdm9pZCBtdWx0aXBsZQ0KLy8gZGVyZWZlcmVuY2UgdGhhdCBjb3N0cyB1bml2ZXJzYWxseS4NCi8vIF9QbGVhc2Ugbm90ZTogU2hvcnRjdXRzIGFyZSBkZWZpbmVkIGFmdGVyIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgYXMgd2UNCi8vIHVzIGl0IGluIGRlZmluaW5nIHNob3J0Y3V0cy4NCnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7DQp2YXIgcHJvdG90eXBlT2ZBcnJheSA9IEFycmF5LnByb3RvdHlwZTsNCnZhciBwcm90b3R5cGVPZk9iamVjdCA9IE9iamVjdC5wcm90b3R5cGU7DQp2YXIgc2xpY2UgPSBwcm90b3R5cGVPZkFycmF5LnNsaWNlOw0KdmFyIHRvU3RyaW5nID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0LnRvU3RyaW5nKTsNCnZhciBvd25zID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Lmhhc093blByb3BlcnR5KTsNCg0KLy8gSWYgSlMgZW5naW5lIHN1cHBvcnRzIGFjY2Vzc29ycyBjcmVhdGluZyBzaG9ydGN1dHMuDQp2YXIgZGVmaW5lR2V0dGVyOw0KdmFyIGRlZmluZVNldHRlcjsNCnZhciBsb29rdXBHZXR0ZXI7DQp2YXIgbG9va3VwU2V0dGVyOw0KdmFyIHN1cHBvcnRzQWNjZXNzb3JzOw0KaWYgKChzdXBwb3J0c0FjY2Vzc29ycyA9IG93bnMocHJvdG90eXBlT2ZPYmplY3QsICJfX2RlZmluZUdldHRlcl9fIikpKSB7DQogICAgZGVmaW5lR2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fZGVmaW5lR2V0dGVyX18pOw0KICAgIGRlZmluZVNldHRlciA9IGNhbGwuYmluZChwcm90b3R5cGVPZk9iamVjdC5fX2RlZmluZVNldHRlcl9fKTsNCiAgICBsb29rdXBHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBHZXR0ZXJfXyk7DQogICAgbG9va3VwU2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fbG9va3VwU2V0dGVyX18pOw0KfQ0KDQovLw0KLy8gQXJyYXkNCi8vID09PT09DQovLw0KDQovLyBFUzUgMTUuNC4zLjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuMy4yDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pc0FycmF5DQppZiAoIUFycmF5LmlzQXJyYXkpIHsNCiAgICBBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gaXNBcnJheShvYmopIHsNCiAgICAgICAgcmV0dXJuIHRvU3RyaW5nKG9iaikgPT0gIltvYmplY3QgQXJyYXldIjsNCiAgICB9Ow0KfQ0KDQovLyBUaGUgSXNDYWxsYWJsZSgpIGNoZWNrIGluIHRoZSBBcnJheSBmdW5jdGlvbnMNCi8vIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSBzdHJpY3QgY2hlY2sgb24gdGhlDQovLyBpbnRlcm5hbCBjbGFzcyBvZiB0aGUgb2JqZWN0IHRvIHRyYXAgY2FzZXMgd2hlcmUNCi8vIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB3YXMgYWN0dWFsbHkgYSByZWd1bGFyDQovLyBleHByZXNzaW9uIGxpdGVyYWwsIHdoaWNoIGluIFY4IGFuZA0KLy8gSmF2YVNjcmlwdENvcmUgaXMgYSB0eXBlb2YgImZ1bmN0aW9uIi4gIE9ubHkgaW4NCi8vIFY4IGFyZSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbHMgcGVybWl0dGVkIGFzDQovLyByZWR1Y2UgcGFyYW1ldGVycywgc28gaXQgaXMgZGVzaXJhYmxlIGluIHRoZQ0KLy8gZ2VuZXJhbCBjYXNlIGZvciB0aGUgc2hpbSB0byBtYXRjaCB0aGUgbW9yZQ0KLy8gc3RyaWN0IGFuZCBjb21tb24gYmVoYXZpb3Igb2YgcmVqZWN0aW5nIHJlZ3VsYXINCi8vIGV4cHJlc3Npb25zLg0KDQovLyBFUzUgMTUuNC40LjE4DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTgNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2FycmF5L2ZvckVhY2gNCmlmICghQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIGZvckVhY2goZnVuIC8qLCB0aGlzcCovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXSwNCiAgICAgICAgICAgIGkgPSAwLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmKSB7DQogICAgICAgICAgICAgICAgLy8gSW52b2tlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGNhbGwsIHBhc3NpbmcgYXJndW1lbnRzOg0KICAgICAgICAgICAgICAgIC8vIGNvbnRleHQsIHByb3BlcnR5IHZhbHVlLCBwcm9wZXJ0eSBrZXksIHRoaXNBcmcgb2JqZWN0IGNvbnRleHQNCiAgICAgICAgICAgICAgICBmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpKys7DQogICAgICAgIH0NCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjE5DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTkNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvbWFwDQppZiAoIUFycmF5LnByb3RvdHlwZS5tYXApIHsNCiAgICBBcnJheS5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gbWFwKGZ1biAvKiwgdGhpc3AqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDAsDQogICAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpDQogICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4yMA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIwDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L2ZpbHRlcg0KaWYgKCFBcnJheS5wcm90b3R5cGUuZmlsdGVyKSB7DQogICAgQXJyYXkucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlcihmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHJlc3VsdCA9IFtdLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpKQ0KICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNlbGZbaV0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE2DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9ldmVyeQ0KaWYgKCFBcnJheS5wcm90b3R5cGUuZXZlcnkpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZXZlcnkgPSBmdW5jdGlvbiBldmVyeShmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmICFmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZikpDQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS40LjQuMTcNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xNw0KLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29tZQ0KaWYgKCFBcnJheS5wcm90b3R5cGUuc29tZSkgew0KICAgIEFycmF5LnByb3RvdHlwZS5zb21lID0gZnVuY3Rpb24gc29tZShmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4yMQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIxDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L3JlZHVjZQ0KaWYgKCFBcnJheS5wcm90b3R5cGUucmVkdWNlKSB7DQogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uIHJlZHVjZShmdW4gLyosIGluaXRpYWwqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlIGFuZCBhbiBlbXB0eSBhcnJheQ0KICAgICAgICBpZiAoIWxlbmd0aCAmJiBhcmd1bWVudHMubGVuZ3RoID09IDEpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KDQogICAgICAgIHZhciBpID0gMDsNCiAgICAgICAgdmFyIHJlc3VsdDsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpKytdOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuDQogICAgICAgICAgICAgICAgaWYgKCsraSA+PSBsZW5ndGgpDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuLmNhbGwodm9pZCAwLCByZXN1bHQsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjIyDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMjINCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvcmVkdWNlUmlnaHQNCmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0KSB7DQogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gcmVkdWNlUmlnaHQoZnVuIC8qLCBpbml0aWFsKi8pIHsNCiAgICAgICAgdmFyIHNlbGYgPSB0b09iamVjdCh0aGlzKSwNCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICAvLyBubyB2YWx1ZSB0byByZXR1cm4gaWYgbm8gaW5pdGlhbCB2YWx1ZSwgZW1wdHkgYXJyYXkNCiAgICAgICAgaWYgKCFsZW5ndGggJiYgYXJndW1lbnRzLmxlbmd0aCA9PSAxKQ0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCg0KICAgICAgICB2YXIgcmVzdWx0LCBpID0gbGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpLS1dOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuDQogICAgICAgICAgICAgICAgaWYgKC0taSA8IDApDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIGlmIChpIGluIHRoaXMpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuLmNhbGwodm9pZCAwLCByZXN1bHQsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9IHdoaWxlIChpLS0pOw0KDQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE0DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pbmRleE9mDQppZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7DQogICAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKHNvdWdodCAvKiwgZnJvbUluZGV4ICovICkgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgaWYgKCFsZW5ndGgpDQogICAgICAgICAgICByZXR1cm4gLTE7DQoNCiAgICAgICAgdmFyIGkgPSAwOw0KICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpDQogICAgICAgICAgICBpID0gdG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSk7DQoNCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMNCiAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBNYXRoLm1heCgwLCBsZW5ndGggKyBpKTsNCiAgICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiBzZWxmW2ldID09PSBzb3VnaHQpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE1DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9sYXN0SW5kZXhPZg0KaWYgKCFBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YpIHsNCiAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZihzb3VnaHQgLyosIGZyb21JbmRleCAqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgaWYgKCFsZW5ndGgpDQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIHZhciBpID0gbGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKQ0KICAgICAgICAgICAgaSA9IE1hdGgubWluKGksIHRvSW50ZWdlcihhcmd1bWVudHNbMV0pKTsNCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMNCiAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBsZW5ndGggLSBNYXRoLmFicyhpKTsNCiAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIHNvdWdodCA9PT0gc2VsZltpXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCn0NCg0KLy8NCi8vIE9iamVjdA0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgMTUuMi4zLjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4yDQppZiAoIU9iamVjdC5nZXRQcm90b3R5cGVPZikgew0KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvZXM1LXNoaW0vaXNzdWVzI2lzc3VlLzINCiAgICAvLyBodHRwOi8vZWpvaG4ub3JnL2Jsb2cvb2JqZWN0Z2V0cHJvdG90eXBlb2YvDQogICAgLy8gcmVjb21tZW5kZWQgYnkgZnNjaGFlZmVyIG9uIGdpdGh1Yg0KICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gb2JqZWN0Ll9fcHJvdG9fXyB8fCAoDQogICAgICAgICAgICBvYmplY3QuY29uc3RydWN0b3IgPw0KICAgICAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSA6DQogICAgICAgICAgICBwcm90b3R5cGVPZk9iamVjdA0KICAgICAgICApOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMw0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjMNCmlmICghT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcikgew0KICAgIHZhciBFUlJfTk9OX09CSkVDVCA9ICJPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIGNhbGxlZCBvbiBhICIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICJub24tb2JqZWN0OiAiOw0KICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgew0KICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9OT05fT0JKRUNUICsgb2JqZWN0KTsNCiAgICAgICAgLy8gSWYgb2JqZWN0IGRvZXMgbm90IG93bnMgcHJvcGVydHkgcmV0dXJuIHVuZGVmaW5lZCBpbW1lZGlhdGVseS4NCiAgICAgICAgaWYgKCFvd25zKG9iamVjdCwgcHJvcGVydHkpKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBkZXNjcmlwdG9yLCBnZXR0ZXIsIHNldHRlcjsNCg0KICAgICAgICAvLyBJZiBvYmplY3QgaGFzIGEgcHJvcGVydHkgdGhlbiBpdCdzIGZvciBzdXJlIGJvdGggYGVudW1lcmFibGVgIGFuZA0KICAgICAgICAvLyBgY29uZmlndXJhYmxlYC4NCiAgICAgICAgZGVzY3JpcHRvciA9ICB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9Ow0KDQogICAgICAgIC8vIElmIEpTIGVuZ2luZSBzdXBwb3J0cyBhY2Nlc3NvciBwcm9wZXJ0aWVzIHRoZW4gcHJvcGVydHkgbWF5IGJlIGENCiAgICAgICAgLy8gZ2V0dGVyIG9yIHNldHRlci4NCiAgICAgICAgaWYgKHN1cHBvcnRzQWNjZXNzb3JzKSB7DQogICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBhIGdldHRlciBldmVuDQogICAgICAgICAgICAvLyBpZiBvYmplY3QgaGFzIG93biBub24gZ2V0dGVyIHByb3BlcnR5IGFsb25nIHdpdGggYSBzYW1lIG5hbWVkDQogICAgICAgICAgICAvLyBpbmhlcml0ZWQgZ2V0dGVyLiBUbyBhdm9pZCBtaXNiZWhhdmlvciB3ZSB0ZW1wb3JhcnkgcmVtb3ZlDQogICAgICAgICAgICAvLyBgX19wcm90b19fYCBzbyB0aGF0IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBnZXR0ZXIgb25seQ0KICAgICAgICAgICAgLy8gaWYgaXQncyBvd25lZCBieSBhbiBvYmplY3QuDQogICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gb2JqZWN0Ll9fcHJvdG9fXzsNCiAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGVPZk9iamVjdDsNCg0KICAgICAgICAgICAgdmFyIGdldHRlciA9IGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KTsNCiAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSk7DQoNCiAgICAgICAgICAgIC8vIE9uY2Ugd2UgaGF2ZSBnZXR0ZXIgYW5kIHNldHRlciB3ZSBjYW4gcHV0IHZhbHVlcyBiYWNrLg0KICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsNCg0KICAgICAgICAgICAgaWYgKGdldHRlciB8fCBzZXR0ZXIpIHsNCiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSBkZXNjcmlwdG9yLmdldCA9IGdldHRlcjsNCiAgICAgICAgICAgICAgICBpZiAoc2V0dGVyKSBkZXNjcmlwdG9yLnNldCA9IHNldHRlcjsNCg0KICAgICAgICAgICAgICAgIC8vIElmIGl0IHdhcyBhY2Nlc3NvciBwcm9wZXJ0eSB3ZSdyZSBkb25lIGFuZCByZXR1cm4gaGVyZQ0KICAgICAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGF2b2lkIGFkZGluZyBgdmFsdWVgIHRvIHRoZSBkZXNjcmlwdG9yLg0KICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyIHdlIGtub3cgdGhhdCBvYmplY3QgaGFzIGFuIG93biBwcm9wZXJ0eSB0aGF0IGlzDQogICAgICAgIC8vIG5vdCBhbiBhY2Nlc3NvciBzbyB3ZSBzZXQgaXQgYXMgYSB2YWx1ZSBhbmQgcmV0dXJuIGRlc2NyaXB0b3IuDQogICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBvYmplY3RbcHJvcGVydHldOw0KICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy40DQppZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7DQogICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjUNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy41DQppZiAoIU9iamVjdC5jcmVhdGUpIHsNCiAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgew0KICAgICAgICB2YXIgb2JqZWN0Ow0KICAgICAgICBpZiAocHJvdG90eXBlID09PSBudWxsKSB7DQogICAgICAgICAgICBvYmplY3QgPSB7ICJfX3Byb3RvX18iOiBudWxsIH07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAodHlwZW9mIHByb3RvdHlwZSAhPSAib2JqZWN0IikNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlb2YgcHJvdG90eXBlWyIrKHR5cGVvZiBwcm90b3R5cGUpKyJdICE9ICdvYmplY3QnIik7DQogICAgICAgICAgICB2YXIgVHlwZSA9IGZ1bmN0aW9uICgpIHt9Ow0KICAgICAgICAgICAgVHlwZS5wcm90b3R5cGUgPSBwcm90b3R5cGU7DQogICAgICAgICAgICBvYmplY3QgPSBuZXcgVHlwZSgpOw0KICAgICAgICAgICAgLy8gSUUgaGFzIG5vIGJ1aWx0LWluIGltcGxlbWVudGF0aW9uIG9mIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgDQogICAgICAgICAgICAvLyBuZWl0aGVyIGBfX3Byb3RvX19gLCBidXQgdGhpcyBtYW51YWxseSBzZXR0aW5nIGBfX3Byb3RvX19gIHdpbGwNCiAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIHdpbGwgd29yayBhcyBleHBlY3RlZCB3aXRoDQogICAgICAgICAgICAvLyBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgYE9iamVjdC5jcmVhdGVgDQogICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KICAgICAgICB9DQogICAgICAgIGlmIChwcm9wZXJ0aWVzICE9PSB2b2lkIDApDQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpOw0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuNg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjYNCg0KLy8gUGF0Y2ggZm9yIFdlYktpdCBhbmQgSUU4IHN0YW5kYXJkIG1vZGUNCi8vIERlc2lnbmVkIGJ5IGhheCA8aGF4LmdpdGh1Yi5jb20+DQovLyByZWxhdGVkIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL2VzNS1zaGltL2lzc3VlcyNpc3N1ZS81DQovLyBJRTggUmVmZXJlbmNlOg0KLy8gICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZDI4MjkwMC5hc3B4DQovLyAgICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMjI5OTE2LmFzcHgNCi8vIFdlYktpdCBCdWdzOg0KLy8gICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNjQyMw0KDQpmdW5jdGlvbiBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKG9iamVjdCkgew0KICAgIHRyeSB7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsICJzZW50aW5lbCIsIHt9KTsNCiAgICAgICAgcmV0dXJuICJzZW50aW5lbCIgaW4gb2JqZWN0Ow0KICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgew0KICAgICAgICAvLyByZXR1cm5zIGZhbHN5DQogICAgfQ0KfQ0KDQovLyBjaGVjayB3aGV0aGVyIGRlZmluZVByb3BlcnR5IHdvcmtzIGlmIGl0J3MgZ2l2ZW4uIE90aGVyd2lzZSwNCi8vIHNoaW0gcGFydGlhbGx5Lg0KaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgew0KICAgIHZhciBkZWZpbmVQcm9wZXJ0eVdvcmtzT25PYmplY3QgPSBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKHt9KTsNCiAgICB2YXIgZGVmaW5lUHJvcGVydHlXb3Jrc09uRG9tID0gdHlwZW9mIGRvY3VtZW50ID09ICJ1bmRlZmluZWQiIHx8DQogICAgICAgIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOw0KICAgIGlmICghZGVmaW5lUHJvcGVydHlXb3Jrc09uT2JqZWN0IHx8ICFkZWZpbmVQcm9wZXJ0eVdvcmtzT25Eb20pIHsNCiAgICAgICAgdmFyIGRlZmluZVByb3BlcnR5RmFsbGJhY2sgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7DQogICAgfQ0KfQ0KDQppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUX0RFU0NSSVBUT1IgPSAiUHJvcGVydHkgZGVzY3JpcHRpb24gbXVzdCBiZSBhbiBvYmplY3Q6ICI7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUX1RBUkdFVCA9ICJPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbGVkIG9uIG5vbi1vYmplY3Q6ICINCiAgICB2YXIgRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEID0gImdldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCAiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgamF2YXNjcmlwdCBlbmdpbmUiOw0KDQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcikgew0KICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9OT05fT0JKRUNUX1RBUkdFVCArIG9iamVjdCk7DQogICAgICAgIGlmICgodHlwZW9mIGRlc2NyaXB0b3IgIT0gIm9iamVjdCIgJiYgdHlwZW9mIGRlc2NyaXB0b3IgIT0gImZ1bmN0aW9uIikgfHwgZGVzY3JpcHRvciA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX05PTl9PQkpFQ1RfREVTQ1JJUFRPUiArIGRlc2NyaXB0b3IpOw0KDQogICAgICAgIC8vIG1ha2UgYSB2YWxpYW50IGF0dGVtcHQgdG8gdXNlIHRoZSByZWFsIGRlZmluZVByb3BlcnR5DQogICAgICAgIC8vIGZvciBJOCdzIERPTSBlbGVtZW50cy4NCiAgICAgICAgaWYgKGRlZmluZVByb3BlcnR5RmFsbGJhY2spIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5RmFsbGJhY2suY2FsbChPYmplY3QsIG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3IpOw0KICAgICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7DQogICAgICAgICAgICAgICAgLy8gdHJ5IHRoZSBzaGltIGlmIHRoZSByZWFsIG9uZSBkb2Vzbid0IHdvcmsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIElmIGl0J3MgYSBkYXRhIHByb3BlcnR5Lg0KICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAidmFsdWUiKSkgew0KICAgICAgICAgICAgLy8gZmFpbCBzaWxlbnRseSBpZiAid3JpdGFibGUiLCAiZW51bWVyYWJsZSIsIG9yICJjb25maWd1cmFibGUiDQogICAgICAgICAgICAvLyBhcmUgcmVxdWVzdGVkIGJ1dCBub3Qgc3VwcG9ydGVkDQogICAgICAgICAgICAvKg0KICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGFwcHJvYWNoOg0KICAgICAgICAgICAgaWYgKCAvLyBjYW4ndCBpbXBsZW1lbnQgdGhlc2UgZmVhdHVyZXM7IGFsbG93IGZhbHNlIGJ1dCBub3QgdHJ1ZQ0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAid3JpdGFibGUiKSA/IGRlc2NyaXB0b3Iud3JpdGFibGUgOiB0cnVlKSB8fA0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiZW51bWVyYWJsZSIpID8gZGVzY3JpcHRvci5lbnVtZXJhYmxlIDogdHJ1ZSkgfHwNCiAgICAgICAgICAgICAgICAhKG93bnMoZGVzY3JpcHRvciwgImNvbmZpZ3VyYWJsZSIpID8gZGVzY3JpcHRvci5jb25maWd1cmFibGUgOiB0cnVlKQ0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKA0KICAgICAgICAgICAgICAgICAgICAiVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgZG9lcyBub3QgIiArDQogICAgICAgICAgICAgICAgICAgICJzdXBwb3J0IGNvbmZpZ3VyYWJsZSwgZW51bWVyYWJsZSwgb3Igd3JpdGFibGUuIg0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAqLw0KDQogICAgICAgICAgICBpZiAoc3VwcG9ydHNBY2Nlc3NvcnMgJiYgKGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KSB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSkpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIEFzIGFjY2Vzc29ycyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gZW5naW5lcyBpbXBsZW1lbnRpbmcNCiAgICAgICAgICAgICAgICAvLyBgX19wcm90b19fYCB3ZSBjYW4gc2FmZWx5IG92ZXJyaWRlIGBfX3Byb3RvX19gIHdoaWxlIGRlZmluaW5nDQogICAgICAgICAgICAgICAgLy8gYSBwcm9wZXJ0eSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBoaXQgYW4gaW5oZXJpdGVkDQogICAgICAgICAgICAgICAgLy8gYWNjZXNzb3IuDQogICAgICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IG9iamVjdC5fX3Byb3RvX187DQogICAgICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZU9mT2JqZWN0Ow0KICAgICAgICAgICAgICAgIC8vIERlbGV0aW5nIGEgcHJvcGVydHkgYW55d2F5IHNpbmNlIGdldHRlciAvIHNldHRlciBtYXkgYmUNCiAgICAgICAgICAgICAgICAvLyBkZWZpbmVkIG9uIG9iamVjdCBpdHNlbGYuDQogICAgICAgICAgICAgICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV07DQogICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IGRlc2NyaXB0b3IudmFsdWU7DQogICAgICAgICAgICAgICAgLy8gU2V0dGluZyBvcmlnaW5hbCBgX19wcm90b19fYCBiYWNrIG5vdy4NCiAgICAgICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBvYmplY3RbcHJvcGVydHldID0gZGVzY3JpcHRvci52YWx1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICghc3VwcG9ydHNBY2Nlc3NvcnMpDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfQUNDRVNTT1JTX05PVF9TVVBQT1JURUQpOw0KICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoYXQgZmFyIHRoZW4gZ2V0dGVycyBhbmQgc2V0dGVycyBjYW4gYmUgZGVmaW5lZCAhIQ0KICAgICAgICAgICAgaWYgKG93bnMoZGVzY3JpcHRvciwgImdldCIpKQ0KICAgICAgICAgICAgICAgIGRlZmluZUdldHRlcihvYmplY3QsIHByb3BlcnR5LCBkZXNjcmlwdG9yLmdldCk7DQogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAic2V0IikpDQogICAgICAgICAgICAgICAgZGVmaW5lU2V0dGVyKG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3Iuc2V0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy43DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNw0KaWYgKCFPYmplY3QuZGVmaW5lUHJvcGVydGllcykgew0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpIHsNCiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllcykgew0KICAgICAgICAgICAgaWYgKG93bnMocHJvcGVydGllcywgcHJvcGVydHkpKQ0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBwcm9wZXJ0aWVzW3Byb3BlcnR5XSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG9iamVjdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjgNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy44DQppZiAoIU9iamVjdC5zZWFsKSB7DQogICAgT2JqZWN0LnNlYWwgPSBmdW5jdGlvbiBzZWFsKG9iamVjdCkgew0KICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0DQogICAgICAgIC8vIGFsbG93cyAic2VjdXJhYmxlIiBjb2RlIHRvICJncmFjZWZ1bGx5IiBkZWdyYWRlIHRvIHdvcmtpbmcNCiAgICAgICAgLy8gYnV0IGluc2VjdXJlIGNvZGUuDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy45DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuOQ0KaWYgKCFPYmplY3QuZnJlZXplKSB7DQogICAgT2JqZWN0LmZyZWV6ZSA9IGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHsNCiAgICAgICAgLy8gdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCBicmVha3MgZmVhdHVyZS1kZXRlY3Rpb24sIGJ1dA0KICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nDQogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLg0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIGRldGVjdCBhIFJoaW5vIGJ1ZyBhbmQgcGF0Y2ggaXQNCnRyeSB7DQogICAgT2JqZWN0LmZyZWV6ZShmdW5jdGlvbiAoKSB7fSk7DQp9IGNhdGNoIChleGNlcHRpb24pIHsNCiAgICBPYmplY3QuZnJlZXplID0gKGZ1bmN0aW9uIGZyZWV6ZShmcmVlemVPYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHsNCiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09ICJmdW5jdGlvbiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplT2JqZWN0KG9iamVjdCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgfSkoT2JqZWN0LmZyZWV6ZSk7DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTANCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMA0KaWYgKCFPYmplY3QucHJldmVudEV4dGVuc2lvbnMpIHsNCiAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPSBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhvYmplY3QpIHsNCiAgICAgICAgLy8gdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCBicmVha3MgZmVhdHVyZS1kZXRlY3Rpb24sIGJ1dA0KICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nDQogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLg0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTENCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMQ0KaWYgKCFPYmplY3QuaXNTZWFsZWQpIHsNCiAgICBPYmplY3QuaXNTZWFsZWQgPSBmdW5jdGlvbiBpc1NlYWxlZChvYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMg0KaWYgKCFPYmplY3QuaXNGcm96ZW4pIHsNCiAgICBPYmplY3QuaXNGcm96ZW4gPSBmdW5jdGlvbiBpc0Zyb3plbihvYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTMNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMw0KaWYgKCFPYmplY3QuaXNFeHRlbnNpYmxlKSB7DQogICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShvYmplY3QpIHsNCiAgICAgICAgLy8gMS4gSWYgVHlwZShPKSBpcyBub3QgT2JqZWN0IHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKE9iamVjdChvYmplY3QpID09PSBvYmplY3QpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCiAgICAgICAgLy8gMi4gUmV0dXJuIHRoZSBCb29sZWFuIHZhbHVlIG9mIHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBPLg0KICAgICAgICB2YXIgbmFtZSA9ICcnOw0KICAgICAgICB3aGlsZSAob3ducyhvYmplY3QsIG5hbWUpKSB7DQogICAgICAgICAgICBuYW1lICs9ICc/JzsNCiAgICAgICAgfQ0KICAgICAgICBvYmplY3RbbmFtZV0gPSB0cnVlOw0KICAgICAgICB2YXIgcmV0dXJuVmFsdWUgPSBvd25zKG9iamVjdCwgbmFtZSk7DQogICAgICAgIGRlbGV0ZSBvYmplY3RbbmFtZV07DQogICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjE0DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTQNCmlmICghT2JqZWN0LmtleXMpIHsNCiAgICAvLyBodHRwOi8vd2hhdHRoZWhlYWRzYWlkLmNvbS8yMDEwLzEwL2Etc2FmZXItb2JqZWN0LWtleXMtY29tcGF0aWJpbGl0eS1pbXBsZW1lbnRhdGlvbg0KICAgIHZhciBoYXNEb250RW51bUJ1ZyA9IHRydWUsDQogICAgICAgIGRvbnRFbnVtcyA9IFsNCiAgICAgICAgICAgICJ0b1N0cmluZyIsDQogICAgICAgICAgICAidG9Mb2NhbGVTdHJpbmciLA0KICAgICAgICAgICAgInZhbHVlT2YiLA0KICAgICAgICAgICAgImhhc093blByb3BlcnR5IiwNCiAgICAgICAgICAgICJpc1Byb3RvdHlwZU9mIiwNCiAgICAgICAgICAgICJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsDQogICAgICAgICAgICAiY29uc3RydWN0b3IiDQogICAgICAgIF0sDQogICAgICAgIGRvbnRFbnVtc0xlbmd0aCA9IGRvbnRFbnVtcy5sZW5ndGg7DQoNCiAgICBmb3IgKHZhciBrZXkgaW4geyJ0b1N0cmluZyI6IG51bGx9KQ0KICAgICAgICBoYXNEb250RW51bUJ1ZyA9IGZhbHNlOw0KDQogICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgew0KDQogICAgICAgIGlmICgodHlwZW9mIG9iamVjdCAhPSAib2JqZWN0IiAmJiB0eXBlb2Ygb2JqZWN0ICE9ICJmdW5jdGlvbiIpIHx8IG9iamVjdCA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTsNCg0KICAgICAgICB2YXIga2V5cyA9IFtdOw0KICAgICAgICBmb3IgKHZhciBuYW1lIGluIG9iamVjdCkgew0KICAgICAgICAgICAgaWYgKG93bnMob2JqZWN0LCBuYW1lKSkgew0KICAgICAgICAgICAgICAgIGtleXMucHVzaChuYW1lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChoYXNEb250RW51bUJ1Zykgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZG9udEVudW1zTGVuZ3RoOyBpIDwgaWk7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBkb250RW51bSA9IGRvbnRFbnVtc1tpXTsNCiAgICAgICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIGRvbnRFbnVtKSkgew0KICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goZG9udEVudW0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBrZXlzOw0KICAgIH07DQoNCn0NCg0KLy8NCi8vIERhdGUNCi8vID09PT0NCi8vDQoNCi8vIEVTNSAxNS45LjUuNDMNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40Mw0KLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHJlcHJlc2VudCB0aGUgaW5zdGFuY2UgaW4gdGltZSANCi8vIHJlcHJlc2VudGVkIGJ5IHRoaXMgRGF0ZSBvYmplY3QuIFRoZSBmb3JtYXQgb2YgdGhlIFN0cmluZyBpcyB0aGUgRGF0ZSBUaW1lIA0KLy8gc3RyaW5nIGZvcm1hdCBkZWZpbmVkIGluIDE1LjkuMS4xNS4gQWxsIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgU3RyaW5nLiANCi8vIFRoZSB0aW1lIHpvbmUgaXMgYWx3YXlzIFVUQywgZGVub3RlZCBieSB0aGUgc3VmZml4IFouIElmIHRoZSB0aW1lIHZhbHVlIG9mIA0KLy8gdGhpcyBvYmplY3QgaXMgbm90IGEgZmluaXRlIE51bWJlciBhIFJhbmdlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi4NCmlmICghRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgfHwgKG5ldyBEYXRlKC02MjE5ODc1NTIwMDAwMCkudG9JU09TdHJpbmcoKS5pbmRleE9mKCctMDAwMDAxJykgPT09IC0xKSkgew0KICAgIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7DQogICAgICAgIHZhciByZXN1bHQsIGxlbmd0aCwgdmFsdWUsIHllYXI7DQogICAgICAgIGlmICghaXNGaW5pdGUodGhpcykpDQogICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcjsNCg0KICAgICAgICAvLyB0aGUgZGF0ZSB0aW1lIHN0cmluZyBmb3JtYXQgaXMgc3BlY2lmaWVkIGluIDE1LjkuMS4xNS4NCiAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2V0VVRDTW9udGgoKSArIDEsIHRoaXMuZ2V0VVRDRGF0ZSgpLA0KICAgICAgICAgICAgdGhpcy5nZXRVVENIb3VycygpLCB0aGlzLmdldFVUQ01pbnV0ZXMoKSwgdGhpcy5nZXRVVENTZWNvbmRzKCldOw0KICAgICAgICB5ZWFyID0gdGhpcy5nZXRVVENGdWxsWWVhcigpOw0KICAgICAgICB5ZWFyID0gKHllYXIgPCAwID8gJy0nIDogKHllYXIgPiA5OTk5ID8gJysnIDogJycpKSArICgnMDAwMDAnICsgTWF0aC5hYnMoeWVhcikpLnNsaWNlKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5OTkgPyAtNCA6IC02KTsNCg0KICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoOw0KICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsNCiAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0W2xlbmd0aF07DQogICAgICAgICAgICAvLyBwYWQgbW9udGhzLCBkYXlzLCBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMgdG8gaGF2ZSB0d28gZGlnaXRzLg0KICAgICAgICAgICAgaWYgKHZhbHVlIDwgMTApDQogICAgICAgICAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSAiMCIgKyB2YWx1ZTsNCiAgICAgICAgfQ0KICAgICAgICAvLyBwYWQgbWlsbGlzZWNvbmRzIHRvIGhhdmUgdGhyZWUgZGlnaXRzLg0KICAgICAgICByZXR1cm4geWVhciArICItIiArIHJlc3VsdC5zbGljZSgwLCAyKS5qb2luKCItIikgKyAiVCIgKyByZXN1bHQuc2xpY2UoMikuam9pbigiOiIpICsgIi4iICsNCiAgICAgICAgICAgICgiMDAwIiArIHRoaXMuZ2V0VVRDTWlsbGlzZWNvbmRzKCkpLnNsaWNlKC0zKSArICJaIjsNCiAgICB9DQp9DQoNCi8vIEVTNSAxNS45LjQuNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuOS40LjQNCmlmICghRGF0ZS5ub3cpIHsNCiAgICBEYXRlLm5vdyA9IGZ1bmN0aW9uIG5vdygpIHsNCiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS45LjUuNDQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40NA0KLy8gVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIERhdGUgb2JqZWN0IGZvciB1c2UgYnkgDQovLyBKU09OLnN0cmluZ2lmeSAoMTUuMTIuMykuDQppZiAoIURhdGUucHJvdG90eXBlLnRvSlNPTikgew0KICAgIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHsNCiAgICAgICAgLy8gV2hlbiB0aGUgdG9KU09OIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhcmd1bWVudCBrZXksIHRoZSBmb2xsb3dpbmcgDQogICAgICAgIC8vIHN0ZXBzIGFyZSB0YWtlbjoNCg0KICAgICAgICAvLyAxLiAgTGV0IE8gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFRvT2JqZWN0LCBnaXZpbmcgaXQgdGhlIHRoaXMNCiAgICAgICAgLy8gdmFsdWUgYXMgaXRzIGFyZ3VtZW50Lg0KICAgICAgICAvLyAyLiBMZXQgdHYgYmUgVG9QcmltaXRpdmUoTywgaGludCBOdW1iZXIpLg0KICAgICAgICAvLyAzLiBJZiB0diBpcyBhIE51bWJlciBhbmQgaXMgbm90IGZpbml0ZSwgcmV0dXJuIG51bGwuDQogICAgICAgIC8vIFhYWA0KICAgICAgICAvLyA0LiBMZXQgdG9JU08gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0dldF1dIGludGVybmFsIG1ldGhvZCBvZg0KICAgICAgICAvLyBPIHdpdGggYXJndW1lbnQgInRvSVNPU3RyaW5nIi4NCiAgICAgICAgLy8gNS4gSWYgSXNDYWxsYWJsZSh0b0lTTykgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRvSVNPU3RyaW5nICE9ICJmdW5jdGlvbiIpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICAvLyA2LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2Qgb2YNCiAgICAgICAgLy8gIHRvSVNPIHdpdGggTyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgYW4gZW1wdHkgYXJndW1lbnQgbGlzdC4NCiAgICAgICAgcmV0dXJuIHRoaXMudG9JU09TdHJpbmcoKTsNCg0KICAgICAgICAvLyBOT1RFIDEgVGhlIGFyZ3VtZW50IGlzIGlnbm9yZWQuDQoNCiAgICAgICAgLy8gTk9URSAyIFRoZSB0b0pTT04gZnVuY3Rpb24gaXMgaW50ZW50aW9uYWxseSBnZW5lcmljOyBpdCBkb2VzIG5vdA0KICAgICAgICAvLyByZXF1aXJlIHRoYXQgaXRzIHRoaXMgdmFsdWUgYmUgYSBEYXRlIG9iamVjdC4gVGhlcmVmb3JlLCBpdCBjYW4gYmUNCiAgICAgICAgLy8gdHJhbnNmZXJyZWQgdG8gb3RoZXIga2luZHMgb2Ygb2JqZWN0cyBmb3IgdXNlIGFzIGEgbWV0aG9kLiBIb3dldmVyLA0KICAgICAgICAvLyBpdCBkb2VzIHJlcXVpcmUgdGhhdCBhbnkgc3VjaCBvYmplY3QgaGF2ZSBhIHRvSVNPU3RyaW5nIG1ldGhvZC4gQW4NCiAgICAgICAgLy8gb2JqZWN0IGlzIGZyZWUgdG8gdXNlIHRoZSBhcmd1bWVudCBrZXkgdG8gZmlsdGVyIGl0cw0KICAgICAgICAvLyBzdHJpbmdpZmljYXRpb24uDQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjkuNC4yDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjQuMg0KLy8gYmFzZWQgb24gd29yayBzaGFyZWQgYnkgRGFuaWVsIEZyaWVzZW4gKGRhbnRtYW4pDQovLyBodHRwOi8vZ2lzdC5naXRodWIuY29tLzMwMzI0OQ0KaWYgKERhdGUucGFyc2UoIisyNzU3NjAtMDktMTNUMDA6MDA6MDAuMDAwWiIpICE9PSA4LjY0ZTE1KSB7DQogICAgLy8gWFhYIGdsb2JhbCBhc3NpZ25tZW50IHdvbid0IHdvcmsgaW4gZW1iZWRkaW5ncyB0aGF0IHVzZQ0KICAgIC8vIGFuIGFsdGVybmF0ZSBvYmplY3QgZm9yIHRoZSBjb250ZXh0Lg0KICAgIERhdGUgPSAoZnVuY3Rpb24oTmF0aXZlRGF0ZSkgew0KDQogICAgICAgIC8vIERhdGUubGVuZ3RoID09PSA3DQogICAgICAgIHZhciBEYXRlID0gZnVuY3Rpb24gRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgew0KICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7DQogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE5hdGl2ZURhdGUpIHsNCiAgICAgICAgICAgICAgICB2YXIgZGF0ZSA9IGxlbmd0aCA9PSAxICYmIFN0cmluZyhZKSA9PT0gWSA/IC8vIGlzU3RyaW5nKFkpDQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGV4cGxpY2l0bHkgcGFzcyBpdCB0aHJvdWdoIHBhcnNlOg0KICAgICAgICAgICAgICAgICAgICBuZXcgTmF0aXZlRGF0ZShEYXRlLnBhcnNlKFkpKSA6DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gbWFudWFsbHkgbWFrZSBjYWxscyBkZXBlbmRpbmcgb24gYXJndW1lbnQNCiAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIGhlcmUNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDcgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gNiA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQsIGgsIG0sIHMpIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDUgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA0ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCkgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gMyA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQpIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDIgPyBuZXcgTmF0aXZlRGF0ZShZLCBNKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAxID8gbmV3IE5hdGl2ZURhdGUoWSkgOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOYXRpdmVEYXRlKCk7DQogICAgICAgICAgICAgICAgLy8gUHJldmVudCBtaXh1cHMgd2l0aCB1bmZpeGVkIERhdGUgb2JqZWN0DQogICAgICAgICAgICAgICAgZGF0ZS5jb25zdHJ1Y3RvciA9IERhdGU7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICB9Ow0KDQogICAgICAgIC8vIDE1LjkuMS4xNSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdC4NCiAgICAgICAgdmFyIGlzb0RhdGVFeHByZXNzaW9uID0gbmV3IFJlZ0V4cCgiXiIgKw0KICAgICAgICAgICAgIihcXGR7NH18W1wrXC1dXFxkezZ9KSIgKyAvLyBmb3VyLWRpZ2l0IHllYXIgY2FwdHVyZSBvciBzaWduICsgNi1kaWdpdCBleHRlbmRlZCB5ZWFyDQogICAgICAgICAgICAiKD86LShcXGR7Mn0pIiArIC8vIG9wdGlvbmFsIG1vbnRoIGNhcHR1cmUNCiAgICAgICAgICAgICIoPzotKFxcZHsyfSkiICsgLy8gb3B0aW9uYWwgZGF5IGNhcHR1cmUNCiAgICAgICAgICAgICIoPzoiICsgLy8gY2FwdHVyZSBob3VyczptaW51dGVzOnNlY29uZHMubWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgIlQoXFxkezJ9KSIgKyAvLyBob3VycyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIjooXFxkezJ9KSIgKyAvLyBtaW51dGVzIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAiKD86IiArIC8vIG9wdGlvbmFsIDpzZWNvbmRzLm1pbGxpc2Vjb25kcw0KICAgICAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIHNlY29uZHMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICAgICAiKD86XFwuKFxcZHszfSkpPyIgKyAvLyBtaWxsaXNlY29uZHMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIpPyIgKw0KICAgICAgICAgICAgIig/OiIgKyAvLyBjYXB0dXJlIFVUQyBvZmZzZXQgY29tcG9uZW50DQogICAgICAgICAgICAgICAgIlp8IiArIC8vIFVUQyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIig/OiIgKyAvLyBvZmZzZXQgc3BlY2lmaWVyICsvLWhvdXJzOm1pbnV0ZXMNCiAgICAgICAgICAgICAgICAgICAgIihbLStdKSIgKyAvLyBzaWduIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAgICAgIihcXGR7Mn0pIiArIC8vIGhvdXJzIG9mZnNldCBjYXB0dXJlDQogICAgICAgICAgICAgICAgICAgICI6KFxcZHsyfSkiICsgLy8gbWludXRlcyBvZmZzZXQgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIpIiArDQogICAgICAgICAgICAiKT8pPyk/KT8iICsNCiAgICAgICAgIiQiKTsNCg0KICAgICAgICAvLyBDb3B5IGFueSBjdXN0b20gbWV0aG9kcyBhIDNyZCBwYXJ0eSBsaWJyYXJ5IG1heSBoYXZlIGFkZGVkDQogICAgICAgIGZvciAodmFyIGtleSBpbiBOYXRpdmVEYXRlKQ0KICAgICAgICAgICAgRGF0ZVtrZXldID0gTmF0aXZlRGF0ZVtrZXldOw0KDQogICAgICAgIC8vIENvcHkgIm5hdGl2ZSIgbWV0aG9kcyBleHBsaWNpdGx5OyB0aGV5IG1heSBiZSBub24tZW51bWVyYWJsZQ0KICAgICAgICBEYXRlLm5vdyA9IE5hdGl2ZURhdGUubm93Ow0KICAgICAgICBEYXRlLlVUQyA9IE5hdGl2ZURhdGUuVVRDOw0KICAgICAgICBEYXRlLnByb3RvdHlwZSA9IE5hdGl2ZURhdGUucHJvdG90eXBlOw0KICAgICAgICBEYXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGU7DQoNCiAgICAgICAgLy8gVXBncmFkZSBEYXRlLnBhcnNlIHRvIGhhbmRsZSBzaW1wbGlmaWVkIElTTyA4NjAxIHN0cmluZ3MNCiAgICAgICAgRGF0ZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKHN0cmluZykgew0KICAgICAgICAgICAgdmFyIG1hdGNoID0gaXNvRGF0ZUV4cHJlc3Npb24uZXhlYyhzdHJpbmcpOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgbWF0Y2guc2hpZnQoKTsgLy8ga2lsbCBtYXRjaFswXSwgdGhlIGZ1bGwgbWF0Y2gNCiAgICAgICAgICAgICAgICAvLyBwYXJzZSBtb250aHMsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgbWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA3OyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBpZiBuZWNlc3NhcnkNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0gPSArKG1hdGNoW2ldIHx8IChpIDwgMyA/IDEgOiAwKSk7DQogICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoWzFdIGlzIHRoZSBtb250aC4gTW9udGhzIGFyZSAwLTExIGluIEphdmFTY3JpcHQNCiAgICAgICAgICAgICAgICAgICAgLy8gYERhdGVgIG9iamVjdHMsIGJ1dCAxLTEyIGluIElTTyBub3RhdGlvbiwgc28gd2UNCiAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50Lg0KICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0tLTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgVVRDIG9mZnNldCBjb21wb25lbnQNCiAgICAgICAgICAgICAgICB2YXIgbWludXRlT2Zmc2V0ID0gK21hdGNoLnBvcCgpLCBob3VyT2Zmc2V0ID0gK21hdGNoLnBvcCgpLCBzaWduID0gbWF0Y2gucG9wKCk7DQoNCiAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBleHBsaWNpdCB0aW1lIHpvbmUgb2Zmc2V0IGlmIHNwZWNpZmllZA0KICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwOw0KICAgICAgICAgICAgICAgIGlmIChzaWduKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIGRldGVjdCBpbnZhbGlkIG9mZnNldHMgYW5kIHJldHVybiBlYXJseQ0KICAgICAgICAgICAgICAgICAgICBpZiAoaG91ck9mZnNldCA+IDIzIHx8IG1pbnV0ZU9mZnNldCA+IDU5KQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hTjsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBleHByZXNzIHRoZSBwcm92aWRlZCB0aW1lIHpvbmUgb2Zmc2V0IGluIG1pbnV0ZXMuIFRoZSBvZmZzZXQgaXMNCiAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgZm9yIHRpbWUgem9uZXMgd2VzdCBvZiBVVEM7IHBvc2l0aXZlIG90aGVyd2lzZS4NCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGhvdXJPZmZzZXQgKiA2MCArIG1pbnV0ZU9mZnNldCkgKiA2ZTQgKiAoc2lnbiA9PSAiKyIgPyAtMSA6IDEpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIERhdGUuVVRDIGZvciB5ZWFycyBiZXR3ZWVuIDAgYW5kIDk5IGNvbnZlcnRzIHllYXIgdG8gMTkwMCArIHllYXINCiAgICAgICAgICAgICAgICAvLyBUaGUgR3JlZ29yaWFuIGNhbGVuZGFyIGhhcyBhIDQwMC15ZWFyIGN5Y2xlLCBzbyANCiAgICAgICAgICAgICAgICAvLyB0byBEYXRlLlVUQyh5ZWFyICsgNDAwLCAuLi4uICkgLSAxMjYyMjc4MDgwMDAwMCA9PSBEYXRlLlVUQyh5ZWFyLCAuLi4pLA0KICAgICAgICAgICAgICAgIC8vIHdoZXJlIDEyNjIyNzgwODAwMDAwIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBHcmVnb3JpYW4gY2FsZW5kYXIgNDAwIHllYXJzDQogICAgICAgICAgICAgICAgdmFyIHllYXIgPSArbWF0Y2hbMF07DQogICAgICAgICAgICAgICAgaWYgKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5KSB7DQogICAgICAgICAgICAgICAgICAgIG1hdGNoWzBdID0geWVhciArIDQwMDsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUuVVRDLmFwcGx5KHRoaXMsIG1hdGNoKSArIG9mZnNldCAtIDEyNjIyNzgwODAwMDAwOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgYSBuZXcgVVRDIGRhdGUgdmFsdWUsIGFjY291bnRpbmcgZm9yIHRoZSBvcHRpb25hbCBvZmZzZXQNCiAgICAgICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5VVEMuYXBwbHkodGhpcywgbWF0Y2gpICsgb2Zmc2V0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUucGFyc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICAgICAgfTsNCg0KICAgICAgICByZXR1cm4gRGF0ZTsNCiAgICB9KShEYXRlKTsNCn0NCg0KLy8NCi8vIFN0cmluZw0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgMTUuNS40LjIwDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS41LjQuMjANCnZhciB3cyA9ICJceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceEEwXHUxNjgwXHUxODBFXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzIiArDQogICAgIlx1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwQVx1MjAyRlx1MjA1Rlx1MzAwMFx1MjAyOCIgKw0KICAgICJcdTIwMjlcdUZFRkYiOw0KaWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW0gfHwgd3MudHJpbSgpKSB7DQogICAgLy8gaHR0cDovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL2Zhc3Rlci10cmltLWphdmFzY3JpcHQNCiAgICAvLyBodHRwOi8vcGVyZmVjdGlvbmtpbGxzLmNvbS93aGl0ZXNwYWNlLWRldmlhdGlvbnMvDQogICAgd3MgPSAiWyIgKyB3cyArICJdIjsNCiAgICB2YXIgdHJpbUJlZ2luUmVnZXhwID0gbmV3IFJlZ0V4cCgiXiIgKyB3cyArIHdzICsgIioiKSwNCiAgICAgICAgdHJpbUVuZFJlZ2V4cCA9IG5ldyBSZWdFeHAod3MgKyB3cyArICIqJCIpOw0KICAgIFN0cmluZy5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uIHRyaW0oKSB7DQogICAgICAgIHJldHVybiBTdHJpbmcodGhpcykucmVwbGFjZSh0cmltQmVnaW5SZWdleHAsICIiKS5yZXBsYWNlKHRyaW1FbmRSZWdleHAsICIiKTsNCiAgICB9Ow0KfQ0KDQovLw0KLy8gVXRpbA0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgOS40DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3g5LjQNCi8vIGh0dHA6Ly9qc3BlcmYuY29tL3RvLWludGVnZXINCnZhciB0b0ludGVnZXIgPSBmdW5jdGlvbiAobikgew0KICAgIG4gPSArbjsNCiAgICBpZiAobiAhPT0gbikgLy8gaXNOYU4NCiAgICAgICAgbiA9IDA7DQogICAgZWxzZSBpZiAobiAhPT0gMCAmJiBuICE9PSAoMS8wKSAmJiBuICE9PSAtKDEvMCkpDQogICAgICAgIG4gPSAobiA+IDAgfHwgLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7DQogICAgcmV0dXJuIG47DQp9Ow0KDQp2YXIgcHJlcGFyZVN0cmluZyA9ICJhIlswXSAhPSAiYSIsDQogICAgLy8gRVM1IDkuOQ0KICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuOQ0KICAgIHRvT2JqZWN0ID0gZnVuY3Rpb24gKG8pIHsNCiAgICAgICAgaWYgKG8gPT0gbnVsbCkgeyAvLyB0aGlzIG1hdGNoZXMgYm90aCBudWxsIGFuZCB1bmRlZmluZWQNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCiAgICAgICAgLy8gSWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBieS1pbmRleCBhY2Nlc3Mgb2YNCiAgICAgICAgLy8gc3RyaW5nIGNoYXJhY3RlcnMgKGV4LiBJRSA8IDcpLCBzcGxpdCB0aGUgc3RyaW5nDQogICAgICAgIGlmIChwcmVwYXJlU3RyaW5nICYmIHR5cGVvZiBvID09ICJzdHJpbmciICYmIG8pIHsNCiAgICAgICAgICAgIHJldHVybiBvLnNwbGl0KCIiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gT2JqZWN0KG8pOw0KICAgIH07DQp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPiAoaHR0cDovL2plZGl0b29sa2l0LmNvbSkNCiAqICAgICAgTWlrZSBkZSBCb2VyIDxtaWtlIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBFdmVudEVtaXR0ZXIgPSB7fTsNCg0KRXZlbnRFbWl0dGVyLl9lbWl0ID0NCkV2ZW50RW1pdHRlci5fZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgZSkgew0KICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5IHx8IHt9Ow0KICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVycyA9IHRoaXMuX2RlZmF1bHRIYW5kbGVycyB8fCB7fTsNCg0KICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV0gfHwgW107DQogICAgdmFyIGRlZmF1bHRIYW5kbGVyID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzW2V2ZW50TmFtZV07DQogICAgaWYgKCFsaXN0ZW5lcnMubGVuZ3RoICYmICFkZWZhdWx0SGFuZGxlcikNCiAgICAgICAgcmV0dXJuOw0KDQogICAgZSA9IGUgfHwge307DQogICAgZS50eXBlID0gZXZlbnROYW1lOw0KICAgIA0KICAgIGlmICghZS5zdG9wUHJvcGFnYXRpb24pIHsNCiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsNCiAgICAgICAgfTsNCiAgICB9DQogICAgDQogICAgaWYgKCFlLnByZXZlbnREZWZhdWx0KSB7DQogICAgICAgIGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7DQogICAgICAgIH07DQogICAgfQ0KDQogICAgZm9yICh2YXIgaT0wOyBpPGxpc3RlbmVycy5sZW5ndGg7IGkrKykgew0KICAgICAgICBsaXN0ZW5lcnNbaV0oZSk7DQogICAgICAgIGlmIChlLnByb3BhZ2F0aW9uU3RvcHBlZCkNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICANCiAgICBpZiAoZGVmYXVsdEhhbmRsZXIgJiYgIWUuZGVmYXVsdFByZXZlbnRlZCkNCiAgICAgICAgZGVmYXVsdEhhbmRsZXIoZSk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIuc2V0RGVmYXVsdEhhbmRsZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzIHx8IHt9Ow0KICAgIA0KICAgIGlmICh0aGlzLl9kZWZhdWx0SGFuZGxlcnNbZXZlbnROYW1lXSkNCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgZGVmYXVsdCBoYW5kbGVyIGZvciAnIiArIGV2ZW50TmFtZSArICInIGlzIGFscmVhZHkgc2V0Iik7DQogICAgICAgIA0KICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVyc1tldmVudE5hbWVdID0gY2FsbGJhY2s7DQp9Ow0KDQpFdmVudEVtaXR0ZXIub24gPQ0KRXZlbnRFbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307DQoNCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOw0KICAgIGlmICghbGlzdGVuZXJzKQ0KICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdID0gW107DQoNCiAgICBpZiAobGlzdGVuZXJzLmluZGV4T2YoY2FsbGJhY2spID09IC0xKQ0KICAgICAgICBsaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPQ0KRXZlbnRFbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307DQoNCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOw0KICAgIGlmICghbGlzdGVuZXJzKQ0KICAgICAgICByZXR1cm47DQoNCiAgICB2YXIgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihjYWxsYmFjayk7DQogICAgaWYgKGluZGV4ICE9PSAtMSkNCiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7DQogICAgaWYgKHRoaXMuX2V2ZW50UmVnaXN0cnkpIHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSA9IFtdOw0KfTsNCg0KZXhwb3J0cy5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvb29wJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KZXhwb3J0cy5pbmhlcml0cyA9IChmdW5jdGlvbigpIHsNCiAgICB2YXIgdGVtcEN0b3IgPSBmdW5jdGlvbigpIHt9Ow0KICAgIHJldHVybiBmdW5jdGlvbihjdG9yLCBzdXBlckN0b3IpIHsNCiAgICAgICAgdGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTsNCiAgICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3IucHJvdG90eXBlOw0KICAgICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOw0KICAgICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7DQogICAgfTsNCn0oKSk7DQoNCmV4cG9ydHMubWl4aW4gPSBmdW5jdGlvbihvYmosIG1peGluKSB7DQogICAgZm9yICh2YXIga2V5IGluIG1peGluKSB7DQogICAgICAgIG9ialtrZXldID0gbWl4aW5ba2V5XTsNCiAgICB9DQp9Ow0KDQpleHBvcnRzLmltcGxlbWVudCA9IGZ1bmN0aW9uKHByb3RvLCBtaXhpbikgew0KICAgIGV4cG9ydHMubWl4aW4ocHJvdG8sIG1peGluKTsNCn07DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQogDQpkZWZpbmUoJ2FjZS9tb2RlL2NvZmZlZV93b3JrZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS93b3JrZXIvbWlycm9yJywgJ2FjZS9tb2RlL2NvZmZlZS9jb2ZmZWUtc2NyaXB0J10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KICAgIA0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBNaXJyb3IgPSByZXF1aXJlKCIuLi93b3JrZXIvbWlycm9yIikuTWlycm9yOw0KdmFyIGNvZmZlZSA9IHJlcXVpcmUoIi4uL21vZGUvY29mZmVlL2NvZmZlZS1zY3JpcHQiKTsNCg0Kd2luZG93LmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbigpIHt9Ow0KDQoNCnZhciBXb3JrZXIgPSBleHBvcnRzLldvcmtlciA9IGZ1bmN0aW9uKHNlbmRlcikgew0KICAgIE1pcnJvci5jYWxsKHRoaXMsIHNlbmRlcik7DQogICAgdGhpcy5zZXRUaW1lb3V0KDIwMCk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoV29ya2VyLCBNaXJyb3IpOw0KDQooZnVuY3Rpb24oKSB7DQogICAgDQogICAgdGhpcy5vblVwZGF0ZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRvYy5nZXRWYWx1ZSgpOw0KICAgICAgICANCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIGNvZmZlZS5wYXJzZSh2YWx1ZSk7DQogICAgICAgIH0gY2F0Y2goZSkgew0KICAgICAgICAgICAgdmFyIG0gPSBlLm1lc3NhZ2UubWF0Y2goL1BhcnNlIGVycm9yIG9uIGxpbmUgKFxkKyk6ICguKikvKTsNCiAgICAgICAgICAgIGlmIChtKSB7DQogICAgICAgICAgICAgICAgdGhpcy5zZW5kZXIuZW1pdCgiZXJyb3IiLCB7DQogICAgICAgICAgICAgICAgICAgIHJvdzogcGFyc2VJbnQobVsxXSkgLSAxLA0KICAgICAgICAgICAgICAgICAgICBjb2x1bW46IG51bGwsDQogICAgICAgICAgICAgICAgICAgIHRleHQ6IG1bMl0sDQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJlcnJvciINCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGUubWVzc2FnZS5tYXRjaCgvIG9uIGxpbmUgKFxkKykvKTsNCiAgICAgICAgICAgICAgICBpZiAobSkgeyAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZGVyLmVtaXQoImVycm9yIiwgew0KICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBwYXJzZUludChtWzFdKSAtIDEsDQogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IG51bGwsDQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlLm1lc3NhZ2UucmVwbGFjZShtWzBdLCAiIiksDQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiZXJyb3IiDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnNlbmRlci5lbWl0KCJvayIpOw0KICAgIH07DQogICAgDQp9KS5jYWxsKFdvcmtlci5wcm90b3R5cGUpOw0KDQp9KTtkZWZpbmUoJ2FjZS93b3JrZXIvbWlycm9yJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvZG9jdW1lbnQnLCAnYWNlL2xpYi9sYW5nJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgRG9jdW1lbnQgPSByZXF1aXJlKCIuLi9kb2N1bWVudCIpLkRvY3VtZW50Ow0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KICAgIA0KdmFyIE1pcnJvciA9IGV4cG9ydHMuTWlycm9yID0gZnVuY3Rpb24oc2VuZGVyKSB7DQogICAgdGhpcy5zZW5kZXIgPSBzZW5kZXI7DQogICAgdmFyIGRvYyA9IHRoaXMuZG9jID0gbmV3IERvY3VtZW50KCIiKTsNCiAgICANCiAgICB2YXIgZGVmZXJyZWRVcGRhdGUgPSB0aGlzLmRlZmVycmVkVXBkYXRlID0gbGFuZy5kZWZlcnJlZENhbGwodGhpcy5vblVwZGF0ZS5iaW5kKHRoaXMpKTsNCiAgICANCiAgICB2YXIgX3NlbGYgPSB0aGlzOw0KICAgIHNlbmRlci5vbigiY2hhbmdlIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICBkb2MuYXBwbHlEZWx0YXMoW2UuZGF0YV0pOyAgICAgICAgDQogICAgICAgIGRlZmVycmVkVXBkYXRlLnNjaGVkdWxlKF9zZWxmLiR0aW1lb3V0KTsNCiAgICB9KTsNCn07DQoNCihmdW5jdGlvbigpIHsNCiAgICANCiAgICB0aGlzLiR0aW1lb3V0ID0gNTAwOw0KICAgIA0KICAgIHRoaXMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHsNCiAgICAgICAgdGhpcy4kdGltZW91dCA9IHRpbWVvdXQ7DQogICAgfTsNCiAgICANCiAgICB0aGlzLnNldFZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgdGhpcy5kb2Muc2V0VmFsdWUodmFsdWUpOw0KICAgICAgICB0aGlzLmRlZmVycmVkVXBkYXRlLnNjaGVkdWxlKHRoaXMuJHRpbWVvdXQpOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRWYWx1ZSA9IGZ1bmN0aW9uKGNhbGxiYWNrSWQpIHsNCiAgICAgICAgdGhpcy5zZW5kZXIuY2FsbGJhY2sodGhpcy5kb2MuZ2V0VmFsdWUoKSwgY2FsbGJhY2tJZCk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLm9uVXBkYXRlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIC8vIGFic3RyYWN0IG1ldGhvZA0KICAgIH07DQogICAgDQp9KS5jYWxsKE1pcnJvci5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvZG9jdW1lbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsICdhY2UvcmFuZ2UnLCAnYWNlL2FuY2hvciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuL3JhbmdlIikuUmFuZ2U7DQp2YXIgQW5jaG9yID0gcmVxdWlyZSgiLi9hbmNob3IiKS5BbmNob3I7DQoNCnZhciBEb2N1bWVudCA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICB0aGlzLiRsaW5lcyA9IFtdOw0KDQogICAgaWYgKEFycmF5LmlzQXJyYXkodGV4dCkpIHsNCiAgICAgICAgdGhpcy5pbnNlcnRMaW5lcygwLCB0ZXh0KTsNCiAgICB9DQogICAgLy8gVGhlcmUgaGFzIHRvIGJlIG9uZSBsaW5lIGF0IGxlYXN0IGluIHRoZSBkb2N1bWVudC4gSWYgeW91IHBhc3MgYW4gZW1wdHkNCiAgICAvLyBzdHJpbmcgdG8gdGhlIGluc2VydCBmdW5jdGlvbiwgbm90aGluZyB3aWxsIGhhcHBlbi4gV29ya2Fyb3VuZC4NCiAgICBlbHNlIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSB7DQogICAgICAgIHRoaXMuJGxpbmVzID0gWyIiXTsNCiAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLmluc2VydCh7cm93OiAwLCBjb2x1bW46MH0sIHRleHQpOw0KICAgIH0NCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCg0KICAgIHRoaXMuc2V0VmFsdWUgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgIHZhciBsZW4gPSB0aGlzLmdldExlbmd0aCgpOw0KICAgICAgICB0aGlzLnJlbW92ZShuZXcgUmFuZ2UoMCwgMCwgbGVuLCB0aGlzLmdldExpbmUobGVuLTEpLmxlbmd0aCkpOw0KICAgICAgICB0aGlzLmluc2VydCh7cm93OiAwLCBjb2x1bW46MH0sIHRleHQpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmdldEFsbExpbmVzKCkuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSk7DQogICAgfTsNCg0KICAgIHRoaXMuY3JlYXRlQW5jaG9yID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIG5ldyBBbmNob3IodGhpcywgcm93LCBjb2x1bW4pOw0KICAgIH07DQoNCiAgICAvLyBjaGVjayBmb3IgSUUgc3BsaXQgYnVnDQogICAgaWYgKCJhYWEiLnNwbGl0KC9hLykubGVuZ3RoID09IDApDQogICAgICAgIHRoaXMuJHNwbGl0ID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXHJcbnxcci9nLCAiXG4iKS5zcGxpdCgiXG4iKTsNCiAgICAgICAgfQ0KICAgIGVsc2UNCiAgICAgICAgdGhpcy4kc3BsaXQgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgICAgICByZXR1cm4gdGV4dC5zcGxpdCgvXHJcbnxccnxcbi8pOw0KICAgICAgICB9Ow0KDQoNCiAgICB0aGlzLiRkZXRlY3ROZXdMaW5lID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICB2YXIgbWF0Y2ggPSB0ZXh0Lm1hdGNoKC9eLio/KFxyXG58XHJ8XG4pL20pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gbWF0Y2hbMV07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLiRhdXRvTmV3TGluZSA9ICJcbiI7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyID0gZnVuY3Rpb24oKSB7DQogICAgICBzd2l0Y2ggKHRoaXMuJG5ld0xpbmVNb2RlKSB7DQogICAgICAgICAgY2FzZSAid2luZG93cyI6DQogICAgICAgICAgICAgIHJldHVybiAiXHJcbiI7DQoNCiAgICAgICAgICBjYXNlICJ1bml4IjoNCiAgICAgICAgICAgICAgcmV0dXJuICJcbiI7DQoNCiAgICAgICAgICBjYXNlICJhdXRvIjoNCiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGF1dG9OZXdMaW5lOw0KICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLiRhdXRvTmV3TGluZSA9ICJcbiI7DQogICAgdGhpcy4kbmV3TGluZU1vZGUgPSAiYXV0byI7DQogICAgdGhpcy5zZXROZXdMaW5lTW9kZSA9IGZ1bmN0aW9uKG5ld0xpbmVNb2RlKSB7DQogICAgICAgIGlmICh0aGlzLiRuZXdMaW5lTW9kZSA9PT0gbmV3TGluZU1vZGUpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdGhpcy4kbmV3TGluZU1vZGUgPSBuZXdMaW5lTW9kZTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXdMaW5lTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kbmV3TGluZU1vZGU7DQogICAgfTsNCg0KICAgIHRoaXMuaXNOZXdMaW5lID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICByZXR1cm4gKHRleHQgPT0gIlxyXG4iIHx8IHRleHQgPT0gIlxyIiB8fCB0ZXh0ID09ICJcbiIpOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBHZXQgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBnaXZlbiBsaW5lIGFzIGl0IGlzIGluIHRoZSBkb2N1bWVudA0KICAgICAqLw0KICAgIHRoaXMuZ2V0TGluZSA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICByZXR1cm4gdGhpcy4kbGluZXNbcm93XSB8fCAiIjsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5zbGljZShmaXJzdFJvdywgbGFzdFJvdyArIDEpOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBSZXR1cm5zIGFsbCBsaW5lcyBpbiB0aGUgZG9jdW1lbnQgYXMgc3RyaW5nIGFycmF5LiBXYXJuaW5nOiBUaGUgY2FsbGVyDQogICAgICogc2hvdWxkIG5vdCBtb2RpZnkgdGhpcyBhcnJheSENCiAgICAgKi8NCiAgICB0aGlzLmdldEFsbExpbmVzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmdldExpbmVzKDAsIHRoaXMuZ2V0TGVuZ3RoKCkpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldExlbmd0aCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kbGluZXMubGVuZ3RoOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFRleHRSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcmFuZ2UuZW5kLnJvdykgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzW3JhbmdlLnN0YXJ0LnJvd10uc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4pOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdmFyIGxpbmVzID0gW107DQogICAgICAgICAgICBsaW5lcy5wdXNoKHRoaXMuJGxpbmVzW3JhbmdlLnN0YXJ0LnJvd10uc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbikpOw0KICAgICAgICAgICAgbGluZXMucHVzaC5hcHBseShsaW5lcywgdGhpcy5nZXRMaW5lcyhyYW5nZS5zdGFydC5yb3crMSwgcmFuZ2UuZW5kLnJvdy0xKSk7DQogICAgICAgICAgICBsaW5lcy5wdXNoKHRoaXMuJGxpbmVzW3JhbmdlLmVuZC5yb3ddLnN1YnN0cmluZygwLCByYW5nZS5lbmQuY29sdW1uKSk7DQogICAgICAgICAgICByZXR1cm4gbGluZXMuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy4kY2xpcFBvc2l0aW9uID0gZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuZ2V0TGVuZ3RoKCk7DQogICAgICAgIGlmIChwb3NpdGlvbi5yb3cgPj0gbGVuZ3RoKSB7DQogICAgICAgICAgICBwb3NpdGlvbi5yb3cgPSBNYXRoLm1heCgwLCBsZW5ndGggLSAxKTsNCiAgICAgICAgICAgIHBvc2l0aW9uLmNvbHVtbiA9IHRoaXMuZ2V0TGluZShsZW5ndGgtMSkubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBwb3NpdGlvbjsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnQgPSBmdW5jdGlvbihwb3NpdGlvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsNCg0KICAgICAgICBwb3NpdGlvbiA9IHRoaXMuJGNsaXBQb3NpdGlvbihwb3NpdGlvbik7DQoNCiAgICAgICAgaWYgKHRoaXMuZ2V0TGVuZ3RoKCkgPD0gMSkNCiAgICAgICAgICAgIHRoaXMuJGRldGVjdE5ld0xpbmUodGV4dCk7DQoNCiAgICAgICAgdmFyIGxpbmVzID0gdGhpcy4kc3BsaXQodGV4dCk7DQogICAgICAgIHZhciBmaXJzdExpbmUgPSBsaW5lcy5zcGxpY2UoMCwgMSlbMF07DQogICAgICAgIHZhciBsYXN0TGluZSA9IGxpbmVzLmxlbmd0aCA9PSAwID8gbnVsbCA6IGxpbmVzLnNwbGljZShsaW5lcy5sZW5ndGggLSAxLCAxKVswXTsNCg0KICAgICAgICBwb3NpdGlvbiA9IHRoaXMuaW5zZXJ0SW5MaW5lKHBvc2l0aW9uLCBmaXJzdExpbmUpOw0KICAgICAgICBpZiAobGFzdExpbmUgIT09IG51bGwpIHsNCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnROZXdMaW5lKHBvc2l0aW9uKTsgLy8gdGVybWluYXRlIGZpcnN0IGxpbmUNCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRMaW5lcyhwb3NpdGlvbi5yb3csIGxpbmVzKTsNCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRJbkxpbmUocG9zaXRpb24sIGxhc3RMaW5lIHx8ICIiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcG9zaXRpb247DQogICAgfTsNCg0KICAgIHRoaXMuaW5zZXJ0TGluZXMgPSBmdW5jdGlvbihyb3csIGxpbmVzKSB7DQogICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgIHJldHVybiB7cm93OiByb3csIGNvbHVtbjogMH07DQoNCiAgICAgICAgdmFyIGFyZ3MgPSBbcm93LCAwXTsNCiAgICAgICAgYXJncy5wdXNoLmFwcGx5KGFyZ3MsIGxpbmVzKTsNCiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlLmFwcGx5KHRoaXMuJGxpbmVzLCBhcmdzKTsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCAwLCByb3cgKyBsaW5lcy5sZW5ndGgsIDApOw0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJpbnNlcnRMaW5lcyIsDQogICAgICAgICAgICByYW5nZTogcmFuZ2UsDQogICAgICAgICAgICBsaW5lczogbGluZXMNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCiAgICAgICAgcmV0dXJuIHJhbmdlLmVuZDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnROZXdMaW5lID0gZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICAgICAgcG9zaXRpb24gPSB0aGlzLiRjbGlwUG9zaXRpb24ocG9zaXRpb24pOw0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuJGxpbmVzW3Bvc2l0aW9uLnJvd10gfHwgIiI7DQoNCiAgICAgICAgdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSA9IGxpbmUuc3Vic3RyaW5nKDAsIHBvc2l0aW9uLmNvbHVtbik7DQogICAgICAgIHRoaXMuJGxpbmVzLnNwbGljZShwb3NpdGlvbi5yb3cgKyAxLCAwLCBsaW5lLnN1YnN0cmluZyhwb3NpdGlvbi5jb2x1bW4sIGxpbmUubGVuZ3RoKSk7DQoNCiAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgIHJvdyA6IHBvc2l0aW9uLnJvdyArIDEsDQogICAgICAgICAgICBjb2x1bW4gOiAwDQogICAgICAgIH07DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0VGV4dCIsDQogICAgICAgICAgICByYW5nZTogUmFuZ2UuZnJvbVBvaW50cyhwb3NpdGlvbiwgZW5kKSwNCiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQoNCiAgICAgICAgcmV0dXJuIGVuZDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnRJbkxpbmUgPSBmdW5jdGlvbihwb3NpdGlvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsNCg0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuJGxpbmVzW3Bvc2l0aW9uLnJvd10gfHwgIiI7DQoNCiAgICAgICAgdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSA9IGxpbmUuc3Vic3RyaW5nKDAsIHBvc2l0aW9uLmNvbHVtbikgKyB0ZXh0DQogICAgICAgICAgICAgICAgKyBsaW5lLnN1YnN0cmluZyhwb3NpdGlvbi5jb2x1bW4pOw0KDQogICAgICAgIHZhciBlbmQgPSB7DQogICAgICAgICAgICByb3cgOiBwb3NpdGlvbi5yb3csDQogICAgICAgICAgICBjb2x1bW4gOiBwb3NpdGlvbi5jb2x1bW4gKyB0ZXh0Lmxlbmd0aA0KICAgICAgICB9Ow0KDQogICAgICAgIHZhciBkZWx0YSA9IHsNCiAgICAgICAgICAgIGFjdGlvbjogImluc2VydFRleHQiLA0KICAgICAgICAgICAgcmFuZ2U6IFJhbmdlLmZyb21Qb2ludHMocG9zaXRpb24sIGVuZCksDQogICAgICAgICAgICB0ZXh0OiB0ZXh0DQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQoNCiAgICAgICAgcmV0dXJuIGVuZDsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmUgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICAvLyBjbGlwIHRvIGRvY3VtZW50DQogICAgICAgIHJhbmdlLnN0YXJ0ID0gdGhpcy4kY2xpcFBvc2l0aW9uKHJhbmdlLnN0YXJ0KTsNCiAgICAgICAgcmFuZ2UuZW5kID0gdGhpcy4kY2xpcFBvc2l0aW9uKHJhbmdlLmVuZCk7DQoNCiAgICAgICAgaWYgKHJhbmdlLmlzRW1wdHkoKSkNCiAgICAgICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCg0KICAgICAgICB2YXIgZmlyc3RSb3cgPSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgIHZhciBsYXN0Um93ID0gcmFuZ2UuZW5kLnJvdzsNCg0KICAgICAgICBpZiAocmFuZ2UuaXNNdWx0aUxpbmUoKSkgew0KICAgICAgICAgICAgdmFyIGZpcnN0RnVsbFJvdyA9IHJhbmdlLnN0YXJ0LmNvbHVtbiA9PSAwID8gZmlyc3RSb3cgOiBmaXJzdFJvdyArIDE7DQogICAgICAgICAgICB2YXIgbGFzdEZ1bGxSb3cgPSBsYXN0Um93IC0gMTsNCg0KICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5jb2x1bW4gPiAwKQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSW5MaW5lKGxhc3RSb3csIDAsIHJhbmdlLmVuZC5jb2x1bW4pOw0KDQogICAgICAgICAgICBpZiAobGFzdEZ1bGxSb3cgPj0gZmlyc3RGdWxsUm93KQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGluZXMoZmlyc3RGdWxsUm93LCBsYXN0RnVsbFJvdyk7DQoNCiAgICAgICAgICAgIGlmIChmaXJzdEZ1bGxSb3cgIT0gZmlyc3RSb3cpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUluTGluZShmaXJzdFJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLCB0aGlzLmdldExpbmUoZmlyc3RSb3cpLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVOZXdMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB0aGlzLnJlbW92ZUluTGluZShmaXJzdFJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlSW5MaW5lID0gZnVuY3Rpb24ocm93LCBzdGFydENvbHVtbiwgZW5kQ29sdW1uKSB7DQogICAgICAgIGlmIChzdGFydENvbHVtbiA9PSBlbmRDb2x1bW4pDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKHJvdywgc3RhcnRDb2x1bW4sIHJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHJlbW92ZWQgPSBsaW5lLnN1YnN0cmluZyhzdGFydENvbHVtbiwgZW5kQ29sdW1uKTsNCiAgICAgICAgdmFyIG5ld0xpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBzdGFydENvbHVtbikgKyBsaW5lLnN1YnN0cmluZyhlbmRDb2x1bW4sIGxpbmUubGVuZ3RoKTsNCiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlKHJvdywgMSwgbmV3TGluZSk7DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAicmVtb3ZlVGV4dCIsDQogICAgICAgICAgICByYW5nZTogcmFuZ2UsDQogICAgICAgICAgICB0ZXh0OiByZW1vdmVkDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQogICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogUmVtb3ZlcyBhIHJhbmdlIG9mIGZ1bGwgbGluZXMNCiAgICAgKg0KICAgICAqIEBwYXJhbSBmaXJzdFJvdyB7SW50ZWdlcn0gVGhlIGZpcnN0IHJvdyB0byBiZSByZW1vdmVkDQogICAgICogQHBhcmFtIGxhc3RSb3cge0ludGVnZXJ9IFRoZSBsYXN0IHJvdyB0byBiZSByZW1vdmVkDQogICAgICogQHJldHVybiB7U3RyaW5nW119IFRoZSByZW1vdmVkIGxpbmVzDQogICAgICovDQogICAgdGhpcy5yZW1vdmVMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShmaXJzdFJvdywgMCwgbGFzdFJvdyArIDEsIDApOw0KICAgICAgICB2YXIgcmVtb3ZlZCA9IHRoaXMuJGxpbmVzLnNwbGljZShmaXJzdFJvdywgbGFzdFJvdyAtIGZpcnN0Um93ICsgMSk7DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAicmVtb3ZlTGluZXMiLA0KICAgICAgICAgICAgcmFuZ2U6IHJhbmdlLA0KICAgICAgICAgICAgbmw6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpLA0KICAgICAgICAgICAgbGluZXM6IHJlbW92ZWQNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCiAgICAgICAgcmV0dXJuIHJlbW92ZWQ7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlTmV3TGluZSA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICB2YXIgZmlyc3RMaW5lID0gdGhpcy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBzZWNvbmRMaW5lID0gdGhpcy5nZXRMaW5lKHJvdysxKTsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCBmaXJzdExpbmUubGVuZ3RoLCByb3crMSwgMCk7DQogICAgICAgIHZhciBsaW5lID0gZmlyc3RMaW5lICsgc2Vjb25kTGluZTsNCg0KICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2Uocm93LCAyLCBsaW5lKTsNCg0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVUZXh0IiwNCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwNCiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQogICAgfTsNCg0KICAgIHRoaXMucmVwbGFjZSA9IGZ1bmN0aW9uKHJhbmdlLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwICYmIHJhbmdlLmlzRW1wdHkoKSkNCiAgICAgICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCg0KICAgICAgICAvLyBTaG9ydGN1dDogSWYgdGhlIHRleHQgd2Ugd2FudCB0byBpbnNlcnQgaXMgdGhlIHNhbWUgYXMgaXQgaXMgYWxyZWFkeQ0KICAgICAgICAvLyBpbiB0aGUgZG9jdW1lbnQsIHdlIGRvbid0IGhhdmUgdG8gcmVwbGFjZSBhbnl0aGluZy4NCiAgICAgICAgaWYgKHRleHQgPT0gdGhpcy5nZXRUZXh0UmFuZ2UocmFuZ2UpKQ0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlLmVuZDsNCg0KICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7DQogICAgICAgIGlmICh0ZXh0KSB7DQogICAgICAgICAgICB2YXIgZW5kID0gdGhpcy5pbnNlcnQocmFuZ2Uuc3RhcnQsIHRleHQpOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZW5kID0gcmFuZ2Uuc3RhcnQ7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gZW5kOw0KICAgIH07DQoNCiAgICB0aGlzLmFwcGx5RGVsdGFzID0gZnVuY3Rpb24oZGVsdGFzKSB7DQogICAgICAgIGZvciAodmFyIGk9MDsgaTxkZWx0YXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBkZWx0YSA9IGRlbHRhc1tpXTsNCiAgICAgICAgICAgIHZhciByYW5nZSA9IFJhbmdlLmZyb21Qb2ludHMoZGVsdGEucmFuZ2Uuc3RhcnQsIGRlbHRhLnJhbmdlLmVuZCk7DQoNCiAgICAgICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydExpbmVzIikNCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydExpbmVzKHJhbmdlLnN0YXJ0LnJvdywgZGVsdGEubGluZXMpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRUZXh0IikNCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydChyYW5nZS5zdGFydCwgZGVsdGEudGV4dCk7DQogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyAtIDEpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVUZXh0IikNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5yZXZlcnREZWx0YXMgPSBmdW5jdGlvbihkZWx0YXMpIHsNCiAgICAgICAgZm9yICh2YXIgaT1kZWx0YXMubGVuZ3RoLTE7IGk+PTA7IGktLSkgew0KICAgICAgICAgICAgdmFyIGRlbHRhID0gZGVsdGFzW2ldOw0KDQogICAgICAgICAgICB2YXIgcmFuZ2UgPSBSYW5nZS5mcm9tUG9pbnRzKGRlbHRhLnJhbmdlLnN0YXJ0LCBkZWx0YS5yYW5nZS5lbmQpOw0KDQogICAgICAgICAgICBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRMaW5lcyIpDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMaW5lcyhyYW5nZS5zdGFydC5yb3csIHJhbmdlLmVuZC5yb3cgLSAxKTsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0VGV4dCIpDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUocmFuZ2UpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVMaW5lcyIpDQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRMaW5lcyhyYW5nZS5zdGFydC5yb3csIGRlbHRhLmxpbmVzKTsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlVGV4dCIpDQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQocmFuZ2Uuc3RhcnQsIGRlbHRhLnRleHQpOw0KICAgICAgICB9DQogICAgfTsNCg0KfSkuY2FsbChEb2N1bWVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkRvY3VtZW50ID0gRG9jdW1lbnQ7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9yYW5nZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pIHsNCiAgICB0aGlzLnN0YXJ0ID0gew0KICAgICAgICByb3c6IHN0YXJ0Um93LA0KICAgICAgICBjb2x1bW46IHN0YXJ0Q29sdW1uDQogICAgfTsNCg0KICAgIHRoaXMuZW5kID0gew0KICAgICAgICByb3c6IGVuZFJvdywNCiAgICAgICAgY29sdW1uOiBlbmRDb2x1bW4NCiAgICB9Ow0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuaXNFZXF1YWwgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT0gcmFuZ2Uuc3RhcnQucm93ICYmDQogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPT0gcmFuZ2UuZW5kLnJvdyAmJg0KICAgICAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gPT0gcmFuZ2Uuc3RhcnQuY29sdW1uICYmDQogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPT0gcmFuZ2UuZW5kLmNvbHVtbg0KICAgIH07DQoNCiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiAoIlJhbmdlOiBbIiArIHRoaXMuc3RhcnQucm93ICsgIi8iICsgdGhpcy5zdGFydC5jb2x1bW4gKw0KICAgICAgICAgICAgIl0gLT4gWyIgKyB0aGlzLmVuZC5yb3cgKyAiLyIgKyB0aGlzLmVuZC5jb2x1bW4gKyAiXSIpOw0KICAgIH07DQoNCiAgICB0aGlzLmNvbnRhaW5zID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMDsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogQ29tcGFyZXMgdGhpcyByYW5nZSAoQSkgd2l0aCBhbm90aGVyIHJhbmdlIChCKSwgd2hlcmUgQiBpcyB0aGUgcGFzc2VkIGluDQogICAgICogcmFuZ2UuDQogICAgICoNCiAgICAgKiBSZXR1cm4gdmFsdWVzOg0KICAgICAqICAtMjogKEIpIGlzIGluZnJvbnQgb2YgKEEpIGFuZCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIChBKQ0KICAgICAqICAtMTogKEIpIGJlZ2lucyBiZWZvcmUgKEEpIGJ1dCBlbmRzIGluc2lkZSBvZiAoQSkNCiAgICAgKiAgIDA6IChCKSBpcyBjb21wbGV0bHkgaW5zaWRlIG9mIChBKSBPUiAoQSkgaXMgY29tcGxldHkgaW5zaWRlIG9mIChCKQ0KICAgICAqICArMTogKEIpIGJlZ2lucyBpbnNpZGUgb2YgKEEpIGJ1dCBlbmRzIG91dHNpZGUgb2YgKEEpDQogICAgICogICsyOiAoQikgaXMgYWZ0ZXIgKEEpIGFuZCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIChBKQ0KICAgICAqDQogICAgICogIDQyOiBGVFcgc3RhdGU6IChCKSBlbmRzIGluIChBKSBidXQgc3RhcnRzIG91dHNpZGUgb2YgKEEpDQogICAgICovDQogICAgdGhpcy5jb21wYXJlUmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICB2YXIgY21wLA0KICAgICAgICAgICAgZW5kID0gcmFuZ2UuZW5kLA0KICAgICAgICAgICAgc3RhcnQgPSByYW5nZS5zdGFydDsNCg0KICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoZW5kLnJvdywgZW5kLmNvbHVtbik7DQogICAgICAgIGlmIChjbXAgPT0gMSkgew0KICAgICAgICAgICAgY21wID0gdGhpcy5jb21wYXJlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uKTsNCiAgICAgICAgICAgIGlmIChjbXAgPT0gMSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAyOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMCkgew0KICAgICAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gLTEpIHsNCiAgICAgICAgICAgIHJldHVybiAtMjsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbik7DQogICAgICAgICAgICBpZiAoY21wID09IC0xKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMSkgew0KICAgICAgICAgICAgICAgIHJldHVybiA0MjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmNvbXBhcmVQb2ludCA9IGZ1bmN0aW9uKHApIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShwLnJvdywgcC5jb2x1bW4pOw0KICAgIH0NCg0KICAgIHRoaXMuY29udGFpbnNSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVQb2ludChyYW5nZS5zdGFydCkgPT0gMCAmJiB0aGlzLmNvbXBhcmVQb2ludChyYW5nZS5lbmQpID09IDA7DQogICAgfQ0KDQogICAgdGhpcy5pc0VuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHJldHVybiB0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW47DQogICAgfQ0KDQogICAgdGhpcy5pc1N0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW47DQogICAgfQ0KDQogICAgdGhpcy5zZXRTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0eXBlb2Ygcm93ID09ICJvYmplY3QiKSB7DQogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IHJvdy5jb2x1bW47DQogICAgICAgICAgICB0aGlzLnN0YXJ0LnJvdyA9IHJvdy5yb3c7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLnN0YXJ0LnJvdyA9IHJvdzsNCiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID0gY29sdW1uOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5zZXRFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodHlwZW9mIHJvdyA9PSAib2JqZWN0Iikgew0KICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uID0gcm93LmNvbHVtbjsNCiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IHJvdy5yb3c7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPSByb3c7DQogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPSBjb2x1bW47DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmluc2lkZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmlzRW5kKHJvdywgY29sdW1uKSB8fCB0aGlzLmlzU3RhcnQocm93LCBjb2x1bW4pKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgdGhpcy5pbnNpZGVTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmlzRW5kKHJvdywgY29sdW1uKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIHRoaXMuaW5zaWRlRW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuaXNTdGFydChyb3csIGNvbHVtbikpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICB0aGlzLmNvbXBhcmUgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAoIXRoaXMuaXNNdWx0aUxpbmUoKSkgew0KICAgICAgICAgICAgaWYgKHJvdyA9PT0gdGhpcy5zdGFydC5yb3cpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uIDwgdGhpcy5zdGFydC5jb2x1bW4gPyAtMSA6IChjb2x1bW4gPiB0aGlzLmVuZC5jb2x1bW4gPyAxIDogMCk7DQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHJvdyA8IHRoaXMuc3RhcnQucm93KQ0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KDQogICAgICAgIGlmIChyb3cgPiB0aGlzLmVuZC5yb3cpDQogICAgICAgICAgICByZXR1cm4gMTsNCg0KICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPT09IHJvdykNCiAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPj0gdGhpcy5zdGFydC5jb2x1bW4gPyAwIDogLTE7DQoNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PT0gcm93KQ0KICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA8PSB0aGlzLmVuZC5jb2x1bW4gPyAwIDogMTsNCg0KICAgICAgICByZXR1cm4gMDsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogTGlrZSAuY29tcGFyZSgpLCBidXQgaWYgaXNTdGFydCBpcyB0cnVlLCByZXR1cm4gLTE7DQogICAgICovDQogICAgdGhpcy5jb21wYXJlU3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbikgew0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBMaWtlIC5jb21wYXJlKCksIGJ1dCBpZiBpc0VuZCBpcyB0cnVlLCByZXR1cm4gMTsNCiAgICAgKi8NCiAgICB0aGlzLmNvbXBhcmVFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5lbmQucm93ID09IHJvdyAmJiB0aGlzLmVuZC5jb2x1bW4gPT0gY29sdW1uKSB7DQogICAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5jb21wYXJlSW5zaWRlID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbikgew0KICAgICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbikgew0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmNsaXBSb3dzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA+IGxhc3RSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBsYXN0Um93KzEsDQogICAgICAgICAgICAgICAgY29sdW1uOiAwDQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID4gbGFzdFJvdykgew0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gew0KICAgICAgICAgICAgICAgIHJvdzogbGFzdFJvdysxLA0KICAgICAgICAgICAgICAgIGNvbHVtbjogMA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA8IGZpcnN0Um93KSB7DQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBmaXJzdFJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IDANCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy5lbmQucm93IDwgZmlyc3RSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBmaXJzdFJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IDANCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQgfHwgdGhpcy5zdGFydCwgZW5kIHx8IHRoaXMuZW5kKTsNCiAgICB9Ow0KDQogICAgdGhpcy5leHRlbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgY21wID0gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsNCg0KICAgICAgICBpZiAoY21wID09IDApDQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgZWxzZSBpZiAoY21wID09IC0xKQ0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn07DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1ufTsNCg0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCB8fCB0aGlzLnN0YXJ0LCBlbmQgfHwgdGhpcy5lbmQpOw0KICAgIH07DQoNCiAgICB0aGlzLmlzRW1wdHkgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuICh0aGlzLnN0YXJ0LnJvdyA9PSB0aGlzLmVuZC5yb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gdGhpcy5lbmQuY29sdW1uKTsNCiAgICB9Ow0KDQogICAgdGhpcy5pc011bHRpTGluZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gKHRoaXMuc3RhcnQucm93ICE9PSB0aGlzLmVuZC5yb3cpOw0KICAgIH07DQoNCiAgICB0aGlzLmNsb25lID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRoaXMuc3RhcnQsIHRoaXMuZW5kKTsNCiAgICB9Ow0KDQogICAgdGhpcy5jb2xsYXBzZVJvd3MgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuZW5kLmNvbHVtbiA9PSAwKQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0LnJvdywgMCwgTWF0aC5tYXgodGhpcy5zdGFydC5yb3csIHRoaXMuZW5kLnJvdy0xKSwgMCkNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0LnJvdywgMCwgdGhpcy5lbmQucm93LCAwKQ0KICAgIH07DQoNCiAgICB0aGlzLnRvU2NyZWVuUmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHZhciBzY3JlZW5Qb3NTdGFydCA9DQogICAgICAgICAgICBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLnN0YXJ0KTsNCiAgICAgICAgdmFyIHNjcmVlblBvc0VuZCA9DQogICAgICAgICAgICBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmVuZCk7DQoNCiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSgNCiAgICAgICAgICAgIHNjcmVlblBvc1N0YXJ0LnJvdywgc2NyZWVuUG9zU3RhcnQuY29sdW1uLA0KICAgICAgICAgICAgc2NyZWVuUG9zRW5kLnJvdywgc2NyZWVuUG9zRW5kLmNvbHVtbg0KICAgICAgICApOw0KICAgIH07DQoNCn0pLmNhbGwoUmFuZ2UucHJvdG90eXBlKTsNCg0KDQpSYW5nZS5mcm9tUG9pbnRzID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnQucm93LCBzdGFydC5jb2x1bW4sIGVuZC5yb3csIGVuZC5jb2x1bW4pOw0KfTsNCg0KZXhwb3J0cy5SYW5nZSA9IFJhbmdlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvYW5jaG9yJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuL2xpYi9vb3AiKTsNCnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KDQovKioNCiAqIEFuIEFuY2hvciBpcyBhIGZsb2F0aW5nIHBvaW50ZXIgaW4gdGhlIGRvY3VtZW50LiBXaGVuZXZlciB0ZXh0IGlzIGluc2VydGVkIG9yDQogKiBkZWxldGVkIGJlZm9yZSB0aGUgY3Vyc29yLCB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnNvciBpcyB1cGRhdGVkDQogKi8NCnZhciBBbmNob3IgPSBleHBvcnRzLkFuY2hvciA9IGZ1bmN0aW9uKGRvYywgcm93LCBjb2x1bW4pIHsNCiAgICB0aGlzLmRvY3VtZW50ID0gZG9jOw0KICAgIA0KICAgIGlmICh0eXBlb2YgY29sdW1uID09ICJ1bmRlZmluZWQiKQ0KICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdy5yb3csIHJvdy5jb2x1bW4pOw0KICAgIGVsc2UNCiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihyb3csIGNvbHVtbik7DQoNCiAgICB0aGlzLiRvbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTsNCiAgICBkb2Mub24oImNoYW5nZSIsIHRoaXMuJG9uQ2hhbmdlKTsNCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCiAgICANCiAgICB0aGlzLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KHRoaXMucm93LCB0aGlzLmNvbHVtbik7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldERvY3VtZW50ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5vbkNoYW5nZSA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIGRlbHRhID0gZS5kYXRhOw0KICAgICAgICB2YXIgcmFuZ2UgPSBkZWx0YS5yYW5nZTsNCiAgICAgICAgICAgIA0KICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHJhbmdlLmVuZC5yb3cgJiYgcmFuZ2Uuc3RhcnQucm93ICE9IHRoaXMucm93KQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPiB0aGlzLnJvdykNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHRoaXMucm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA+IHRoaXMuY29sdW1uKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgIA0KICAgICAgICB2YXIgcm93ID0gdGhpcy5yb3c7DQogICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmNvbHVtbjsNCiAgICAgICAgDQogICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT09ICJpbnNlcnRUZXh0Iikgew0KICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PT0gcm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA8PSBjb2x1bW4pIHsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09PSByYW5nZS5lbmQucm93KSB7DQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiArPSByYW5nZS5lbmQuY29sdW1uIC0gcmFuZ2Uuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uIC09IHJhbmdlLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgICAgICAgICAgcm93ICs9IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2Uuc3RhcnQucm93ICE9PSByYW5nZS5lbmQucm93ICYmIHJhbmdlLnN0YXJ0LnJvdyA8IHJvdykgew0KICAgICAgICAgICAgICAgIHJvdyArPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PT0gImluc2VydExpbmVzIikgew0KICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA8PSByb3cpIHsNCiAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZVRleHQiKSB7DQogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHJvdyAmJiByYW5nZS5zdGFydC5jb2x1bW4gPCBjb2x1bW4pIHsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZW5kLmNvbHVtbiA+PSBjb2x1bW4pDQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IHJhbmdlLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IE1hdGgubWF4KDAsIGNvbHVtbiAtIChyYW5nZS5lbmQuY29sdW1uIC0gcmFuZ2Uuc3RhcnQuY29sdW1uKSk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9IGVsc2UgaWYgKHJhbmdlLnN0YXJ0LnJvdyAhPT0gcmFuZ2UuZW5kLnJvdyAmJiByYW5nZS5zdGFydC5yb3cgPCByb3cpIHsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZW5kLnJvdyA9PSByb3cpIHsNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gTWF0aC5tYXgoMCwgY29sdW1uIC0gcmFuZ2UuZW5kLmNvbHVtbikgKyByYW5nZS5zdGFydC5jb2x1bW47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJvdyAtPSAocmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChyYW5nZS5lbmQucm93ID09IHJvdykgew0KICAgICAgICAgICAgICAgIHJvdyAtPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgICAgIGNvbHVtbiA9IE1hdGgubWF4KDAsIGNvbHVtbiAtIHJhbmdlLmVuZC5jb2x1bW4pICsgcmFuZ2Uuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlTGluZXMiKSB7DQogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93IDw9IHJvdykgew0KICAgICAgICAgICAgICAgIGlmIChyYW5nZS5lbmQucm93IDw9IHJvdykNCiAgICAgICAgICAgICAgICAgICAgcm93IC09IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJvdyA9IHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gMDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdywgY29sdW1uLCB0cnVlKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKHJvdywgY29sdW1uLCBub0NsaXApIHsNCiAgICAgICAgdmFyIHBvczsNCiAgICAgICAgaWYgKG5vQ2xpcCkgew0KICAgICAgICAgICAgcG9zID0gew0KICAgICAgICAgICAgICAgIHJvdzogcm93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uDQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgcG9zID0gdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICh0aGlzLnJvdyA9PSBwb3Mucm93ICYmIHRoaXMuY29sdW1uID09IHBvcy5jb2x1bW4pDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG9sZCA9IHsNCiAgICAgICAgICAgIHJvdzogdGhpcy5yb3csDQogICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uDQogICAgICAgIH07DQogICAgICAgIA0KICAgICAgICB0aGlzLnJvdyA9IHBvcy5yb3c7DQogICAgICAgIHRoaXMuY29sdW1uID0gcG9zLmNvbHVtbjsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgew0KICAgICAgICAgICAgb2xkOiBvbGQsDQogICAgICAgICAgICB2YWx1ZTogcG9zDQogICAgICAgIH0pOw0KICAgIH07DQogICAgDQogICAgdGhpcy5kZXRhY2ggPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLiRvbkNoYW5nZSk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHBvcyA9IHt9Ow0KICAgIA0KICAgICAgICBpZiAocm93ID49IHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsNCiAgICAgICAgICAgIHBvcy5yb3cgPSBNYXRoLm1heCgwLCB0aGlzLmRvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7DQogICAgICAgICAgICBwb3MuY29sdW1uID0gdGhpcy5kb2N1bWVudC5nZXRMaW5lKHBvcy5yb3cpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChyb3cgPCAwKSB7DQogICAgICAgICAgICBwb3Mucm93ID0gMDsNCiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSAwOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgcG9zLnJvdyA9IHJvdzsNCiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSBNYXRoLm1pbih0aGlzLmRvY3VtZW50LmdldExpbmUocG9zLnJvdykubGVuZ3RoLCBNYXRoLm1heCgwLCBjb2x1bW4pKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKGNvbHVtbiA8IDApDQogICAgICAgICAgICBwb3MuY29sdW1uID0gMDsNCiAgICAgICAgICAgIA0KICAgICAgICByZXR1cm4gcG9zOw0KICAgIH07DQogICAgDQp9KS5jYWxsKEFuY2hvci5wcm90b3R5cGUpOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvbGFuZycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCmV4cG9ydHMuc3RyaW5nUmV2ZXJzZSA9IGZ1bmN0aW9uKHN0cmluZykgew0KICAgIHJldHVybiBzdHJpbmcuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTsNCn07DQoNCmV4cG9ydHMuc3RyaW5nUmVwZWF0ID0gZnVuY3Rpb24gKHN0cmluZywgY291bnQpIHsNCiAgICAgcmV0dXJuIG5ldyBBcnJheShjb3VudCArIDEpLmpvaW4oc3RyaW5nKTsNCn07DQoNCnZhciB0cmltQmVnaW5SZWdleHAgPSAvXlxzXHMqLzsNCnZhciB0cmltRW5kUmVnZXhwID0gL1xzXHMqJC87DQoNCmV4cG9ydHMuc3RyaW5nVHJpbUxlZnQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7DQogICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHRyaW1CZWdpblJlZ2V4cCwgJycpOw0KfTsNCg0KZXhwb3J0cy5zdHJpbmdUcmltUmlnaHQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7DQogICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHRyaW1FbmRSZWdleHAsICcnKTsNCn07DQoNCmV4cG9ydHMuY29weU9iamVjdCA9IGZ1bmN0aW9uKG9iaikgew0KICAgIHZhciBjb3B5ID0ge307DQogICAgZm9yICh2YXIga2V5IGluIG9iaikgew0KICAgICAgICBjb3B5W2tleV0gPSBvYmpba2V5XTsNCiAgICB9DQogICAgcmV0dXJuIGNvcHk7DQp9Ow0KDQpleHBvcnRzLmNvcHlBcnJheSA9IGZ1bmN0aW9uKGFycmF5KXsNCiAgICB2YXIgY29weSA9IFtdOw0KICAgIGZvciAodmFyIGk9MCwgbD1hcnJheS5sZW5ndGg7IGk8bDsgaSsrKSB7DQogICAgICAgIGlmIChhcnJheVtpXSAmJiB0eXBlb2YgYXJyYXlbaV0gPT0gIm9iamVjdCIpDQogICAgICAgICAgICBjb3B5W2ldID0gdGhpcy5jb3B5T2JqZWN0KCBhcnJheVtpXSApOw0KICAgICAgICBlbHNlIA0KICAgICAgICAgICAgY29weVtpXSA9IGFycmF5W2ldOw0KICAgIH0NCiAgICByZXR1cm4gY29weTsNCn07DQoNCmV4cG9ydHMuZGVlcENvcHkgPSBmdW5jdGlvbiAob2JqKSB7DQogICAgaWYgKHR5cGVvZiBvYmogIT0gIm9iamVjdCIpIHsNCiAgICAgICAgcmV0dXJuIG9iajsNCiAgICB9DQogICAgDQogICAgdmFyIGNvcHkgPSBvYmouY29uc3RydWN0b3IoKTsNCiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7DQogICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0gPT0gIm9iamVjdCIpIHsNCiAgICAgICAgICAgIGNvcHlba2V5XSA9IHRoaXMuZGVlcENvcHkob2JqW2tleV0pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgY29weVtrZXldID0gb2JqW2tleV07DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGNvcHk7DQp9Ow0KDQpleHBvcnRzLmFycmF5VG9NYXAgPSBmdW5jdGlvbihhcnIpIHsNCiAgICB2YXIgbWFwID0ge307DQogICAgZm9yICh2YXIgaT0wOyBpPGFyci5sZW5ndGg7IGkrKykgew0KICAgICAgICBtYXBbYXJyW2ldXSA9IDE7DQogICAgfQ0KICAgIHJldHVybiBtYXA7DQoNCn07DQoNCi8qKg0KICogc3BsaWNlIG91dCBvZiAnYXJyYXknIGFueXRoaW5nIHRoYXQgPT09ICd2YWx1ZScNCiAqLw0KZXhwb3J0cy5hcnJheVJlbW92ZSA9IGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSkgew0KICBmb3IgKHZhciBpID0gMDsgaSA8PSBhcnJheS5sZW5ndGg7IGkrKykgew0KICAgIGlmICh2YWx1ZSA9PT0gYXJyYXlbaV0pIHsNCiAgICAgIGFycmF5LnNwbGljZShpLCAxKTsNCiAgICB9DQogIH0NCn07DQoNCmV4cG9ydHMuZXNjYXBlUmVnRXhwID0gZnVuY3Rpb24oc3RyKSB7DQogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oWy4qKz9eJHt9KCl8W1xdXC9cXF0pL2csICdcXCQxJyk7DQp9Ow0KDQpleHBvcnRzLmRlZmVycmVkQ2FsbCA9IGZ1bmN0aW9uKGZjbikgew0KDQogICAgdmFyIHRpbWVyID0gbnVsbDsNCiAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGltZXIgPSBudWxsOw0KICAgICAgICBmY24oKTsNCiAgICB9Ow0KDQogICAgdmFyIGRlZmVycmVkID0gZnVuY3Rpb24odGltZW91dCkgew0KICAgICAgICBkZWZlcnJlZC5jYW5jZWwoKTsNCiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGNhbGxiYWNrLCB0aW1lb3V0IHx8IDApOw0KICAgICAgICByZXR1cm4gZGVmZXJyZWQ7DQogICAgfTsNCg0KICAgIGRlZmVycmVkLnNjaGVkdWxlID0gZGVmZXJyZWQ7DQoNCiAgICBkZWZlcnJlZC5jYWxsID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuY2FuY2VsKCk7DQogICAgICAgIGZjbigpOw0KICAgICAgICByZXR1cm4gZGVmZXJyZWQ7DQogICAgfTsNCg0KICAgIGRlZmVycmVkLmNhbmNlbCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpOw0KICAgICAgICB0aW1lciA9IG51bGw7DQogICAgICAgIHJldHVybiBkZWZlcnJlZDsNCiAgICB9Ow0KDQogICAgcmV0dXJuIGRlZmVycmVkOw0KfTsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCiANCmRlZmluZSgnYWNlL21vZGUvY29mZmVlL2NvZmZlZS1zY3JpcHQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9tb2RlL2NvZmZlZS9sZXhlcicsICdhY2UvbW9kZS9jb2ZmZWUvcGFyc2VyJywgJ2FjZS9tb2RlL2NvZmZlZS9ub2RlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiAgICANCiAgICB2YXIgTGV4ZXIgPSByZXF1aXJlKCIuL2xleGVyIikuTGV4ZXI7DQogICAgdmFyIHBhcnNlciA9IHJlcXVpcmUoIi4vcGFyc2VyIik7DQoNCiAgICB2YXIgbGV4ZXIgPSBuZXcgTGV4ZXIoKTsNCiAgICBwYXJzZXIubGV4ZXIgPSB7DQogICAgICAgIGxleDogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgdGFnLCBfcmVmMjsNCiAgICAgICAgICAgIF9yZWYyID0gdGhpcy50b2tlbnNbdGhpcy5wb3MrK10gfHwgWycnXSwgdGFnID0gX3JlZjJbMF0sIHRoaXMueXl0ZXh0ID0gX3JlZjJbMV0sIHRoaXMueXlsaW5lbm8gPSBfcmVmMlsyXTsNCiAgICAgICAgICAgIHJldHVybiB0YWc7DQogICAgICAgIH0sDQogICAgICAgIHNldElucHV0OiBmdW5jdGlvbih0b2tlbnMpIHsNCiAgICAgICAgICAgIHRoaXMudG9rZW5zID0gdG9rZW5zOw0KICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zID0gMDsNCiAgICAgICAgfSwNCiAgICAgICAgdXBjb21pbmdJbnB1dDogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIHBhcnNlci55eSA9IHJlcXVpcmUoJy4vbm9kZXMnKTsNCiAgICANCiAgICBleHBvcnRzLnBhcnNlID0gZnVuY3Rpb24oY29kZSkgew0KICAgICAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGxleGVyLnRva2VuaXplKGNvZGUpKTsNCiAgICB9Ow0KfSk7LyoqDQogKiBDb3B5cmlnaHQgKGMpIDIwMTEgSmVyZW15IEFzaGtlbmFzDQogKg0KICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24NCiAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uDQogKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0DQogKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwNCiAqIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUNCiAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nDQogKiBjb25kaXRpb25zOg0KICogDQogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQ0KICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQogKiANCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELA0KICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTDQogKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORA0KICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQNCiAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLA0KICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HDQogKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SDQogKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jb2ZmZWUvbGV4ZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9tb2RlL2NvZmZlZS9yZXdyaXRlcicsICdhY2UvbW9kZS9jb2ZmZWUvaGVscGVycyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiAgICANCiAgdmFyIEFTU0lHTkVELCBCT09MLCBDQUxMQUJMRSwgQ09ERSwgQ09GRkVFX0FMSUFTRVMsIENPRkZFRV9BTElBU19NQVAsIENPRkZFRV9LRVlXT1JEUywgQ09NTUVOVCwgQ09NUEFSRSwgQ09NUE9VTkRfQVNTSUdOLCBIRVJFRE9DLCBIRVJFRE9DX0lMTEVHQUwsIEhFUkVET0NfSU5ERU5ULCBIRVJFR0VYLCBIRVJFR0VYX09NSVQsIElERU5USUZJRVIsIElOREVYQUJMRSwgSlNUT0tFTiwgSlNfRk9SQklEREVOLCBKU19LRVlXT1JEUywgTElORV9CUkVBSywgTElORV9DT05USU5VRVIsIExPR0lDLCBMZXhlciwgTUFUSCwgTVVMVElMSU5FUiwgTVVMVElfREVOVCwgTk9UX1JFR0VYLCBOT1RfU1BBQ0VEX1JFR0VYLCBOT19ORVdMSU5FLCBOVU1CRVIsIE9QRVJBVE9SLCBSRUdFWCwgUkVMQVRJT04sIFJFU0VSVkVELCBSZXdyaXRlciwgU0hJRlQsIFNJTVBMRVNUUiwgVFJBSUxJTkdfU1BBQ0VTLCBVTkFSWSwgV0hJVEVTUEFDRSwgY29tcGFjdCwgY291bnQsIGtleSwgbGFzdCwgc3RhcnRzLCBfcmVmOw0KICB2YXIgX19pbmRleE9mID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2YgfHwgZnVuY3Rpb24oaXRlbSkgew0KICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCiAgICAgIGlmICh0aGlzW2ldID09PSBpdGVtKSByZXR1cm4gaTsNCiAgICB9DQogICAgcmV0dXJuIC0xOw0KICB9Ow0KICBSZXdyaXRlciA9IHJlcXVpcmUoJy4vcmV3cml0ZXInKS5SZXdyaXRlcjsNCiAgX3JlZiA9IHJlcXVpcmUoJy4vaGVscGVycycpLCBjb3VudCA9IF9yZWYuY291bnQsIHN0YXJ0cyA9IF9yZWYuc3RhcnRzLCBjb21wYWN0ID0gX3JlZi5jb21wYWN0LCBsYXN0ID0gX3JlZi5sYXN0Ow0KICBleHBvcnRzLkxleGVyID0gTGV4ZXIgPSAoZnVuY3Rpb24oKSB7DQogICAgZnVuY3Rpb24gTGV4ZXIoKSB7fQ0KICAgIExleGVyLnByb3RvdHlwZS50b2tlbml6ZSA9IGZ1bmN0aW9uKGNvZGUsIG9wdHMpIHsNCiAgICAgIHZhciBpOw0KICAgICAgaWYgKG9wdHMgPT0gbnVsbCkgew0KICAgICAgICBvcHRzID0ge307DQogICAgICB9DQogICAgICBpZiAoV0hJVEVTUEFDRS50ZXN0KGNvZGUpKSB7DQogICAgICAgIGNvZGUgPSAiXG4iICsgY29kZTsNCiAgICAgIH0NCiAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2UoL1xyL2csICcnKS5yZXBsYWNlKFRSQUlMSU5HX1NQQUNFUywgJycpOw0KICAgICAgdGhpcy5jb2RlID0gY29kZTsNCiAgICAgIHRoaXMubGluZSA9IG9wdHMubGluZSB8fCAwOw0KICAgICAgdGhpcy5pbmRlbnQgPSAwOw0KICAgICAgdGhpcy5pbmRlYnQgPSAwOw0KICAgICAgdGhpcy5vdXRkZWJ0ID0gMDsNCiAgICAgIHRoaXMuaW5kZW50cyA9IFtdOw0KICAgICAgdGhpcy50b2tlbnMgPSBbXTsNCiAgICAgIGkgPSAwOw0KICAgICAgd2hpbGUgKHRoaXMuY2h1bmsgPSBjb2RlLnNsaWNlKGkpKSB7DQogICAgICAgIGkgKz0gdGhpcy5pZGVudGlmaWVyVG9rZW4oKSB8fCB0aGlzLmNvbW1lbnRUb2tlbigpIHx8IHRoaXMud2hpdGVzcGFjZVRva2VuKCkgfHwgdGhpcy5saW5lVG9rZW4oKSB8fCB0aGlzLmhlcmVkb2NUb2tlbigpIHx8IHRoaXMuc3RyaW5nVG9rZW4oKSB8fCB0aGlzLm51bWJlclRva2VuKCkgfHwgdGhpcy5yZWdleFRva2VuKCkgfHwgdGhpcy5qc1Rva2VuKCkgfHwgdGhpcy5saXRlcmFsVG9rZW4oKTsNCiAgICAgIH0NCiAgICAgIHRoaXMuY2xvc2VJbmRlbnRhdGlvbigpOw0KICAgICAgaWYgKG9wdHMucmV3cml0ZSA9PT0gZmFsc2UpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIChuZXcgUmV3cml0ZXIpLnJld3JpdGUodGhpcy50b2tlbnMpOw0KICAgIH07DQogICAgTGV4ZXIucHJvdG90eXBlLmlkZW50aWZpZXJUb2tlbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGNvbG9uLCBmb3JjZWRJZGVudGlmaWVyLCBpZCwgaW5wdXQsIG1hdGNoLCBwcmV2LCB0YWcsIF9yZWYyLCBfcmVmMzsNCiAgICAgIGlmICghKG1hdGNoID0gSURFTlRJRklFUi5leGVjKHRoaXMuY2h1bmspKSkgew0KICAgICAgICByZXR1cm4gMDsNCiAgICAgIH0NCiAgICAgIGlucHV0ID0gbWF0Y2hbMF0sIGlkID0gbWF0Y2hbMV0sIGNvbG9uID0gbWF0Y2hbMl07DQogICAgICBpZiAoaWQgPT09ICdvd24nICYmIHRoaXMudGFnKCkgPT09ICdGT1InKSB7DQogICAgICAgIHRoaXMudG9rZW4oJ09XTicsIGlkKTsNCiAgICAgICAgcmV0dXJuIGlkLmxlbmd0aDsNCiAgICAgIH0NCiAgICAgIGZvcmNlZElkZW50aWZpZXIgPSBjb2xvbiB8fCAocHJldiA9IGxhc3QodGhpcy50b2tlbnMpKSAmJiAoKChfcmVmMiA9IHByZXZbMF0pID09PSAnLicgfHwgX3JlZjIgPT09ICc/LicgfHwgX3JlZjIgPT09ICc6OicpIHx8ICFwcmV2LnNwYWNlZCAmJiBwcmV2WzBdID09PSAnQCcpOw0KICAgICAgdGFnID0gJ0lERU5USUZJRVInOw0KICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKEpTX0tFWVdPUkRTLCBpZCkgPj0gMCB8fCAhZm9yY2VkSWRlbnRpZmllciAmJiBfX2luZGV4T2YuY2FsbChDT0ZGRUVfS0VZV09SRFMsIGlkKSA+PSAwKSB7DQogICAgICAgIHRhZyA9IGlkLnRvVXBwZXJDYXNlKCk7DQogICAgICAgIGlmICh0YWcgPT09ICdXSEVOJyAmJiAoX3JlZjMgPSB0aGlzLnRhZygpLCBfX2luZGV4T2YuY2FsbChMSU5FX0JSRUFLLCBfcmVmMykgPj0gMCkpIHsNCiAgICAgICAgICB0YWcgPSAnTEVBRElOR19XSEVOJzsNCiAgICAgICAgfSBlbHNlIGlmICh0YWcgPT09ICdGT1InKSB7DQogICAgICAgICAgdGhpcy5zZWVuRm9yID0gdHJ1ZTsNCiAgICAgICAgfSBlbHNlIGlmICh0YWcgPT09ICdVTkxFU1MnKSB7DQogICAgICAgICAgdGFnID0gJ0lGJzsNCiAgICAgICAgfSBlbHNlIGlmIChfX2luZGV4T2YuY2FsbChVTkFSWSwgdGFnKSA+PSAwKSB7DQogICAgICAgICAgdGFnID0gJ1VOQVJZJzsNCiAgICAgICAgfSBlbHNlIGlmIChfX2luZGV4T2YuY2FsbChSRUxBVElPTiwgdGFnKSA+PSAwKSB7DQogICAgICAgICAgaWYgKHRhZyAhPT0gJ0lOU1RBTkNFT0YnICYmIHRoaXMuc2VlbkZvcikgew0KICAgICAgICAgICAgdGFnID0gJ0ZPUicgKyB0YWc7DQogICAgICAgICAgICB0aGlzLnNlZW5Gb3IgPSBmYWxzZTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGFnID0gJ1JFTEFUSU9OJzsNCiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKCkgPT09ICchJykgew0KICAgICAgICAgICAgICB0aGlzLnRva2Vucy5wb3AoKTsNCiAgICAgICAgICAgICAgaWQgPSAnIScgKyBpZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGlmIChfX2luZGV4T2YuY2FsbChKU19GT1JCSURERU4sIGlkKSA+PSAwKSB7DQogICAgICAgIGlmIChmb3JjZWRJZGVudGlmaWVyKSB7DQogICAgICAgICAgdGFnID0gJ0lERU5USUZJRVInOw0KICAgICAgICAgIGlkID0gbmV3IFN0cmluZyhpZCk7DQogICAgICAgICAgaWQucmVzZXJ2ZWQgPSB0cnVlOw0KICAgICAgICB9IGVsc2UgaWYgKF9faW5kZXhPZi5jYWxsKFJFU0VSVkVELCBpZCkgPj0gMCkgew0KICAgICAgICAgIHRoaXMuaWRlbnRpZmllckVycm9yKGlkKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKCFmb3JjZWRJZGVudGlmaWVyKSB7DQogICAgICAgIGlmIChfX2luZGV4T2YuY2FsbChDT0ZGRUVfQUxJQVNFUywgaWQpID49IDApIHsNCiAgICAgICAgICBpZCA9IENPRkZFRV9BTElBU19NQVBbaWRdOw0KICAgICAgICB9DQogICAgICAgIHRhZyA9IChmdW5jdGlvbigpIHsNCiAgICAgICAgICBzd2l0Y2ggKGlkKSB7DQogICAgICAgICAgICBjYXNlICchJzoNCiAgICAgICAgICAgICAgcmV0dXJuICdVTkFSWSc7DQogICAgICAgICAgICBjYXNlICc9PSc6DQogICAgICAgICAgICBjYXNlICchPSc6DQogICAgICAgICAgICAgIHJldHVybiAnQ09NUEFSRSc7DQogICAgICAgICAgICBjYXNlICcmJic6DQogICAgICAgICAgICBjYXNlICd8fCc6DQogICAgICAgICAgICAgIHJldHVybiAnTE9HSUMnOw0KICAgICAgICAgICAgY2FzZSAndHJ1ZSc6DQogICAgICAgICAgICBjYXNlICdmYWxzZSc6DQogICAgICAgICAgICBjYXNlICdudWxsJzoNCiAgICAgICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6DQogICAgICAgICAgICAgIHJldHVybiAnQk9PTCc7DQogICAgICAgICAgICBjYXNlICdicmVhayc6DQogICAgICAgICAgICBjYXNlICdjb250aW51ZSc6DQogICAgICAgICAgICBjYXNlICdkZWJ1Z2dlcic6DQogICAgICAgICAgICAgIHJldHVybiAnU1RBVEVNRU5UJzsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgIHJldHVybiB0YWc7DQogICAgICAgICAgfQ0KICAgICAgICB9KSgpOw0KICAgICAgfQ0KICAgICAgdGhpcy50b2tlbih0YWcsIGlkKTsNCiAgICAgIGlmIChjb2xvbikgew0KICAgICAgICB0aGlzLnRva2VuKCc6JywgJzonKTsNCiAgICAgIH0NCiAgICAgIHJldHVybiBpbnB1dC5sZW5ndGg7DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUubnVtYmVyVG9rZW4gPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBtYXRjaCwgbnVtYmVyOw0KICAgICAgaWYgKCEobWF0Y2ggPSBOVU1CRVIuZXhlYyh0aGlzLmNodW5rKSkpIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgICB9DQogICAgICBudW1iZXIgPSBtYXRjaFswXTsNCiAgICAgIHRoaXMudG9rZW4oJ05VTUJFUicsIG51bWJlcik7DQogICAgICByZXR1cm4gbnVtYmVyLmxlbmd0aDsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5zdHJpbmdUb2tlbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIG1hdGNoLCBzdHJpbmc7DQogICAgICBzd2l0Y2ggKHRoaXMuY2h1bmsuY2hhckF0KDApKSB7DQogICAgICAgIGNhc2UgIiciOg0KICAgICAgICAgIGlmICghKG1hdGNoID0gU0lNUExFU1RSLmV4ZWModGhpcy5jaHVuaykpKSB7DQogICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgICB9DQogICAgICAgICAgdGhpcy50b2tlbignU1RSSU5HJywgKHN0cmluZyA9IG1hdGNoWzBdKS5yZXBsYWNlKE1VTFRJTElORVIsICdcXFxuJykpOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICciJzoNCiAgICAgICAgICBpZiAoIShzdHJpbmcgPSB0aGlzLmJhbGFuY2VkU3RyaW5nKHRoaXMuY2h1bmssICciJykpKSB7DQogICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKDAgPCBzdHJpbmcuaW5kZXhPZignI3snLCAxKSkgew0KICAgICAgICAgICAgdGhpcy5pbnRlcnBvbGF0ZVN0cmluZyhzdHJpbmcuc2xpY2UoMSwgLTEpKTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhpcy50b2tlbignU1RSSU5HJywgdGhpcy5lc2NhcGVMaW5lcyhzdHJpbmcpKTsNCiAgICAgICAgICB9DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgcmV0dXJuIDA7DQogICAgICB9DQogICAgICB0aGlzLmxpbmUgKz0gY291bnQoc3RyaW5nLCAnXG4nKTsNCiAgICAgIHJldHVybiBzdHJpbmcubGVuZ3RoOw0KICAgIH07DQogICAgTGV4ZXIucHJvdG90eXBlLmhlcmVkb2NUb2tlbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGRvYywgaGVyZWRvYywgbWF0Y2gsIHF1b3RlOw0KICAgICAgaWYgKCEobWF0Y2ggPSBIRVJFRE9DLmV4ZWModGhpcy5jaHVuaykpKSB7DQogICAgICAgIHJldHVybiAwOw0KICAgICAgfQ0KICAgICAgaGVyZWRvYyA9IG1hdGNoWzBdOw0KICAgICAgcXVvdGUgPSBoZXJlZG9jLmNoYXJBdCgwKTsNCiAgICAgIGRvYyA9IHRoaXMuc2FuaXRpemVIZXJlZG9jKG1hdGNoWzJdLCB7DQogICAgICAgIHF1b3RlOiBxdW90ZSwNCiAgICAgICAgaW5kZW50OiBudWxsDQogICAgICB9KTsNCiAgICAgIGlmIChxdW90ZSA9PT0gJyInICYmIDAgPD0gZG9jLmluZGV4T2YoJyN7JykpIHsNCiAgICAgICAgdGhpcy5pbnRlcnBvbGF0ZVN0cmluZyhkb2MsIHsNCiAgICAgICAgICBoZXJlZG9jOiB0cnVlDQogICAgICAgIH0pOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy50b2tlbignU1RSSU5HJywgdGhpcy5tYWtlU3RyaW5nKGRvYywgcXVvdGUsIHRydWUpKTsNCiAgICAgIH0NCiAgICAgIHRoaXMubGluZSArPSBjb3VudChoZXJlZG9jLCAnXG4nKTsNCiAgICAgIHJldHVybiBoZXJlZG9jLmxlbmd0aDsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5jb21tZW50VG9rZW4gPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBjb21tZW50LCBoZXJlLCBtYXRjaDsNCiAgICAgIGlmICghKG1hdGNoID0gdGhpcy5jaHVuay5tYXRjaChDT01NRU5UKSkpIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgICB9DQogICAgICBjb21tZW50ID0gbWF0Y2hbMF0sIGhlcmUgPSBtYXRjaFsxXTsNCiAgICAgIGlmIChoZXJlKSB7DQogICAgICAgIHRoaXMudG9rZW4oJ0hFUkVDT01NRU5UJywgdGhpcy5zYW5pdGl6ZUhlcmVkb2MoaGVyZSwgew0KICAgICAgICAgIGhlcmVjb21tZW50OiB0cnVlLA0KICAgICAgICAgIGluZGVudDogQXJyYXkodGhpcy5pbmRlbnQgKyAxKS5qb2luKCcgJykNCiAgICAgICAgfSkpOw0KICAgICAgICB0aGlzLnRva2VuKCdURVJNSU5BVE9SJywgJ1xuJyk7DQogICAgICB9DQogICAgICB0aGlzLmxpbmUgKz0gY291bnQoY29tbWVudCwgJ1xuJyk7DQogICAgICByZXR1cm4gY29tbWVudC5sZW5ndGg7DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUuanNUb2tlbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIG1hdGNoLCBzY3JpcHQ7DQogICAgICBpZiAoISh0aGlzLmNodW5rLmNoYXJBdCgwKSA9PT0gJ2AnICYmIChtYXRjaCA9IEpTVE9LRU4uZXhlYyh0aGlzLmNodW5rKSkpKSB7DQogICAgICAgIHJldHVybiAwOw0KICAgICAgfQ0KICAgICAgdGhpcy50b2tlbignSlMnLCAoc2NyaXB0ID0gbWF0Y2hbMF0pLnNsaWNlKDEsIC0xKSk7DQogICAgICByZXR1cm4gc2NyaXB0Lmxlbmd0aDsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5yZWdleFRva2VuID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgbWF0Y2gsIHByZXYsIHJlZ2V4LCBfcmVmMjsNCiAgICAgIGlmICh0aGlzLmNodW5rLmNoYXJBdCgwKSAhPT0gJy8nKSB7DQogICAgICAgIHJldHVybiAwOw0KICAgICAgfQ0KICAgICAgaWYgKG1hdGNoID0gSEVSRUdFWC5leGVjKHRoaXMuY2h1bmspKSB7DQogICAgICAgIHRoaXMubGluZSArPSBjb3VudChtYXRjaFswXSwgJ1xuJyk7ICAgICAgICANCiAgICAgICAgcmV0dXJuIHRoaXMuaGVyZWdleFRva2VuKG1hdGNoKTsNCiAgICAgIH0NCiAgICAgIHByZXYgPSBsYXN0KHRoaXMudG9rZW5zKTsNCiAgICAgIGlmIChwcmV2ICYmIChfcmVmMiA9IHByZXZbMF0sIF9faW5kZXhPZi5jYWxsKChwcmV2LnNwYWNlZCA/IE5PVF9SRUdFWCA6IE5PVF9TUEFDRURfUkVHRVgpLCBfcmVmMikgPj0gMCkpIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgICB9DQogICAgICBpZiAoIShtYXRjaCA9IFJFR0VYLmV4ZWModGhpcy5jaHVuaykpKSB7DQogICAgICAgIHJldHVybiAwOw0KICAgICAgfQ0KICAgICAgcmVnZXggPSBtYXRjaFswXTsNCiAgICAgIHRoaXMudG9rZW4oJ1JFR0VYJywgcmVnZXggPT09ICcvLycgPyAnLyg/OikvJyA6IHJlZ2V4KTsNCiAgICAgIHJldHVybiByZWdleC5sZW5ndGg7DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUuaGVyZWdleFRva2VuID0gZnVuY3Rpb24obWF0Y2gpIHsNCiAgICAgIHZhciBib2R5LCBmbGFncywgaGVyZWdleCwgcmUsIHRhZywgdG9rZW5zLCB2YWx1ZSwgX2ksIF9sZW4sIF9yZWYyLCBfcmVmMywgX3JlZjQsIF9yZWY1Ow0KICAgICAgaGVyZWdleCA9IG1hdGNoWzBdLCBib2R5ID0gbWF0Y2hbMV0sIGZsYWdzID0gbWF0Y2hbMl07DQogICAgICBpZiAoMCA+IGJvZHkuaW5kZXhPZignI3snKSkgew0KICAgICAgICByZSA9IGJvZHkucmVwbGFjZShIRVJFR0VYX09NSVQsICcnKS5yZXBsYWNlKC9cLy9nLCAnXFwvJyk7DQogICAgICAgIHRoaXMudG9rZW4oJ1JFR0VYJywgIi8iICsgKHJlIHx8ICcoPzopJykgKyAiLyIgKyBmbGFncyk7DQogICAgICAgIHJldHVybiBoZXJlZ2V4Lmxlbmd0aDsNCiAgICAgIH0NCiAgICAgIHRoaXMudG9rZW4oJ0lERU5USUZJRVInLCAnUmVnRXhwJyk7DQogICAgICB0aGlzLnRva2Vucy5wdXNoKFsnQ0FMTF9TVEFSVCcsICcoJ10pOw0KICAgICAgdG9rZW5zID0gW107DQogICAgICBfcmVmMiA9IHRoaXMuaW50ZXJwb2xhdGVTdHJpbmcoYm9keSwgew0KICAgICAgICByZWdleDogdHJ1ZQ0KICAgICAgfSk7DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIF9yZWYzID0gX3JlZjJbX2ldLCB0YWcgPSBfcmVmM1swXSwgdmFsdWUgPSBfcmVmM1sxXTsNCiAgICAgICAgaWYgKHRhZyA9PT0gJ1RPS0VOUycpIHsNCiAgICAgICAgICB0b2tlbnMucHVzaC5hcHBseSh0b2tlbnMsIHZhbHVlKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBpZiAoISh2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoSEVSRUdFWF9PTUlULCAnJykpKSB7DQogICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICB9DQogICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXC9nLCAnXFxcXCcpOw0KICAgICAgICAgIHRva2Vucy5wdXNoKFsnU1RSSU5HJywgdGhpcy5tYWtlU3RyaW5nKHZhbHVlLCAnIicsIHRydWUpXSk7DQogICAgICAgIH0NCiAgICAgICAgdG9rZW5zLnB1c2goWycrJywgJysnXSk7DQogICAgICB9DQogICAgICB0b2tlbnMucG9wKCk7DQogICAgICBpZiAoKChfcmVmNCA9IHRva2Vuc1swXSkgIT0gbnVsbCA/IF9yZWY0WzBdIDogdm9pZCAwKSAhPT0gJ1NUUklORycpIHsNCiAgICAgICAgdGhpcy50b2tlbnMucHVzaChbJ1NUUklORycsICciIiddLCBbJysnLCAnKyddKTsNCiAgICAgIH0NCiAgICAgIChfcmVmNSA9IHRoaXMudG9rZW5zKS5wdXNoLmFwcGx5KF9yZWY1LCB0b2tlbnMpOw0KICAgICAgaWYgKGZsYWdzKSB7DQogICAgICAgIHRoaXMudG9rZW5zLnB1c2goWycsJywgJywnXSwgWydTVFJJTkcnLCAnIicgKyBmbGFncyArICciJ10pOw0KICAgICAgfQ0KICAgICAgdGhpcy50b2tlbignKScsICcpJyk7DQogICAgICByZXR1cm4gaGVyZWdleC5sZW5ndGg7DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUubGluZVRva2VuID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgZGlmZiwgaW5kZW50LCBtYXRjaCwgbm9OZXdsaW5lcywgcHJldiwgc2l6ZTsNCiAgICAgIGlmICghKG1hdGNoID0gTVVMVElfREVOVC5leGVjKHRoaXMuY2h1bmspKSkgew0KICAgICAgICByZXR1cm4gMDsNCiAgICAgIH0NCiAgICAgIGluZGVudCA9IG1hdGNoWzBdOw0KICAgICAgdGhpcy5saW5lICs9IGNvdW50KGluZGVudCwgJ1xuJyk7DQogICAgICBwcmV2ID0gbGFzdCh0aGlzLnRva2VucywgMSk7DQogICAgICBzaXplID0gaW5kZW50Lmxlbmd0aCAtIDEgLSBpbmRlbnQubGFzdEluZGV4T2YoJ1xuJyk7DQogICAgICBub05ld2xpbmVzID0gdGhpcy51bmZpbmlzaGVkKCk7DQogICAgICBpZiAoc2l6ZSAtIHRoaXMuaW5kZWJ0ID09PSB0aGlzLmluZGVudCkgew0KICAgICAgICBpZiAobm9OZXdsaW5lcykgew0KICAgICAgICAgIHRoaXMuc3VwcHJlc3NOZXdsaW5lcygpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHRoaXMubmV3bGluZVRva2VuKCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGluZGVudC5sZW5ndGg7DQogICAgICB9DQogICAgICBpZiAoc2l6ZSA+IHRoaXMuaW5kZW50KSB7DQogICAgICAgIGlmIChub05ld2xpbmVzKSB7DQogICAgICAgICAgdGhpcy5pbmRlYnQgPSBzaXplIC0gdGhpcy5pbmRlbnQ7DQogICAgICAgICAgdGhpcy5zdXBwcmVzc05ld2xpbmVzKCk7DQogICAgICAgICAgcmV0dXJuIGluZGVudC5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgZGlmZiA9IHNpemUgLSB0aGlzLmluZGVudCArIHRoaXMub3V0ZGVidDsNCiAgICAgICAgdGhpcy50b2tlbignSU5ERU5UJywgZGlmZik7DQogICAgICAgIHRoaXMuaW5kZW50cy5wdXNoKGRpZmYpOw0KICAgICAgICB0aGlzLm91dGRlYnQgPSB0aGlzLmluZGVidCA9IDA7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLmluZGVidCA9IDA7DQogICAgICAgIHRoaXMub3V0ZGVudFRva2VuKHRoaXMuaW5kZW50IC0gc2l6ZSwgbm9OZXdsaW5lcyk7DQogICAgICB9DQogICAgICB0aGlzLmluZGVudCA9IHNpemU7DQogICAgICByZXR1cm4gaW5kZW50Lmxlbmd0aDsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5vdXRkZW50VG9rZW4gPSBmdW5jdGlvbihtb3ZlT3V0LCBub05ld2xpbmVzLCBjbG9zZSkgew0KICAgICAgdmFyIGRlbnQsIGxlbjsNCiAgICAgIHdoaWxlIChtb3ZlT3V0ID4gMCkgew0KICAgICAgICBsZW4gPSB0aGlzLmluZGVudHMubGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKHRoaXMuaW5kZW50c1tsZW5dID09PSB2b2lkIDApIHsNCiAgICAgICAgICBtb3ZlT3V0ID0gMDsNCiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluZGVudHNbbGVuXSA9PT0gdGhpcy5vdXRkZWJ0KSB7DQogICAgICAgICAgbW92ZU91dCAtPSB0aGlzLm91dGRlYnQ7DQogICAgICAgICAgdGhpcy5vdXRkZWJ0ID0gMDsNCiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluZGVudHNbbGVuXSA8IHRoaXMub3V0ZGVidCkgew0KICAgICAgICAgIHRoaXMub3V0ZGVidCAtPSB0aGlzLmluZGVudHNbbGVuXTsNCiAgICAgICAgICBtb3ZlT3V0IC09IHRoaXMuaW5kZW50c1tsZW5dOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGRlbnQgPSB0aGlzLmluZGVudHMucG9wKCkgLSB0aGlzLm91dGRlYnQ7DQogICAgICAgICAgbW92ZU91dCAtPSBkZW50Ow0KICAgICAgICAgIHRoaXMub3V0ZGVidCA9IDA7DQogICAgICAgICAgdGhpcy50b2tlbignT1VUREVOVCcsIGRlbnQpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZiAoZGVudCkgew0KICAgICAgICB0aGlzLm91dGRlYnQgLT0gbW92ZU91dDsNCiAgICAgIH0NCiAgICAgIGlmICghKHRoaXMudGFnKCkgPT09ICdURVJNSU5BVE9SJyB8fCBub05ld2xpbmVzKSkgew0KICAgICAgICB0aGlzLnRva2VuKCdURVJNSU5BVE9SJywgJ1xuJyk7DQogICAgICB9DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS53aGl0ZXNwYWNlVG9rZW4gPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBtYXRjaCwgbmxpbmUsIHByZXY7DQogICAgICBpZiAoISgobWF0Y2ggPSBXSElURVNQQUNFLmV4ZWModGhpcy5jaHVuaykpIHx8IChubGluZSA9IHRoaXMuY2h1bmsuY2hhckF0KDApID09PSAnXG4nKSkpIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgICB9DQogICAgICBwcmV2ID0gbGFzdCh0aGlzLnRva2Vucyk7DQogICAgICBpZiAocHJldikgew0KICAgICAgICBwcmV2W21hdGNoID8gJ3NwYWNlZCcgOiAnbmV3TGluZSddID0gdHJ1ZTsNCiAgICAgIH0NCiAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICByZXR1cm4gbWF0Y2hbMF0ubGVuZ3RoOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgICB9DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUubmV3bGluZVRva2VuID0gZnVuY3Rpb24oKSB7DQogICAgICBpZiAodGhpcy50YWcoKSAhPT0gJ1RFUk1JTkFUT1InKSB7DQogICAgICAgIHRoaXMudG9rZW4oJ1RFUk1JTkFUT1InLCAnXG4nKTsNCiAgICAgIH0NCiAgICAgIHJldHVybiB0aGlzOw0KICAgIH07DQogICAgTGV4ZXIucHJvdG90eXBlLnN1cHByZXNzTmV3bGluZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgIGlmICh0aGlzLnZhbHVlKCkgPT09ICdcXCcpIHsNCiAgICAgICAgdGhpcy50b2tlbnMucG9wKCk7DQogICAgICB9DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5saXRlcmFsVG9rZW4gPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBtYXRjaCwgcHJldiwgdGFnLCB2YWx1ZSwgX3JlZjIsIF9yZWYzLCBfcmVmNCwgX3JlZjU7DQogICAgICBpZiAobWF0Y2ggPSBPUEVSQVRPUi5leGVjKHRoaXMuY2h1bmspKSB7DQogICAgICAgIHZhbHVlID0gbWF0Y2hbMF07DQogICAgICAgIGlmIChDT0RFLnRlc3QodmFsdWUpKSB7DQogICAgICAgICAgdGhpcy50YWdQYXJhbWV0ZXJzKCk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHZhbHVlID0gdGhpcy5jaHVuay5jaGFyQXQoMCk7DQogICAgICB9DQogICAgICB0YWcgPSB2YWx1ZTsNCiAgICAgIHByZXYgPSBsYXN0KHRoaXMudG9rZW5zKTsNCiAgICAgIGlmICh2YWx1ZSA9PT0gJz0nICYmIHByZXYpIHsNCiAgICAgICAgaWYgKCFwcmV2WzFdLnJlc2VydmVkICYmIChfcmVmMiA9IHByZXZbMV0sIF9faW5kZXhPZi5jYWxsKEpTX0ZPUkJJRERFTiwgX3JlZjIpID49IDApKSB7DQogICAgICAgICAgdGhpcy5hc3NpZ25tZW50RXJyb3IoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoKF9yZWYzID0gcHJldlsxXSkgPT09ICd8fCcgfHwgX3JlZjMgPT09ICcmJicpIHsNCiAgICAgICAgICBwcmV2WzBdID0gJ0NPTVBPVU5EX0FTU0lHTic7DQogICAgICAgICAgcHJldlsxXSArPSAnPSc7DQogICAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKHZhbHVlID09PSAnOycpIHsNCiAgICAgICAgdGFnID0gJ1RFUk1JTkFUT1InOw0KICAgICAgfSBlbHNlIGlmIChfX2luZGV4T2YuY2FsbChNQVRILCB2YWx1ZSkgPj0gMCkgew0KICAgICAgICB0YWcgPSAnTUFUSCc7DQogICAgICB9IGVsc2UgaWYgKF9faW5kZXhPZi5jYWxsKENPTVBBUkUsIHZhbHVlKSA+PSAwKSB7DQogICAgICAgIHRhZyA9ICdDT01QQVJFJzsNCiAgICAgIH0gZWxzZSBpZiAoX19pbmRleE9mLmNhbGwoQ09NUE9VTkRfQVNTSUdOLCB2YWx1ZSkgPj0gMCkgew0KICAgICAgICB0YWcgPSAnQ09NUE9VTkRfQVNTSUdOJzsNCiAgICAgIH0gZWxzZSBpZiAoX19pbmRleE9mLmNhbGwoVU5BUlksIHZhbHVlKSA+PSAwKSB7DQogICAgICAgIHRhZyA9ICdVTkFSWSc7DQogICAgICB9IGVsc2UgaWYgKF9faW5kZXhPZi5jYWxsKFNISUZULCB2YWx1ZSkgPj0gMCkgew0KICAgICAgICB0YWcgPSAnU0hJRlQnOw0KICAgICAgfSBlbHNlIGlmIChfX2luZGV4T2YuY2FsbChMT0dJQywgdmFsdWUpID49IDAgfHwgdmFsdWUgPT09ICc/JyAmJiAocHJldiAhPSBudWxsID8gcHJldi5zcGFjZWQgOiB2b2lkIDApKSB7DQogICAgICAgIHRhZyA9ICdMT0dJQyc7DQogICAgICB9IGVsc2UgaWYgKHByZXYgJiYgIXByZXYuc3BhY2VkKSB7DQogICAgICAgIGlmICh2YWx1ZSA9PT0gJygnICYmIChfcmVmNCA9IHByZXZbMF0sIF9faW5kZXhPZi5jYWxsKENBTExBQkxFLCBfcmVmNCkgPj0gMCkpIHsNCiAgICAgICAgICBpZiAocHJldlswXSA9PT0gJz8nKSB7DQogICAgICAgICAgICBwcmV2WzBdID0gJ0ZVTkNfRVhJU1QnOw0KICAgICAgICAgIH0NCiAgICAgICAgICB0YWcgPSAnQ0FMTF9TVEFSVCc7DQogICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdbJyAmJiAoX3JlZjUgPSBwcmV2WzBdLCBfX2luZGV4T2YuY2FsbChJTkRFWEFCTEUsIF9yZWY1KSA+PSAwKSkgew0KICAgICAgICAgIHRhZyA9ICdJTkRFWF9TVEFSVCc7DQogICAgICAgICAgc3dpdGNoIChwcmV2WzBdKSB7DQogICAgICAgICAgICBjYXNlICc/JzoNCiAgICAgICAgICAgICAgcHJldlswXSA9ICdJTkRFWF9TT0FLJzsNCiAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICc6Oic6DQogICAgICAgICAgICAgIHByZXZbMF0gPSAnSU5ERVhfUFJPVE8nOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgdGhpcy50b2tlbih0YWcsIHZhbHVlKTsNCiAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGg7DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUuc2FuaXRpemVIZXJlZG9jID0gZnVuY3Rpb24oZG9jLCBvcHRpb25zKSB7DQogICAgICB2YXIgYXR0ZW1wdCwgaGVyZWNvbW1lbnQsIGluZGVudCwgbWF0Y2gsIF9yZWYyOw0KICAgICAgaW5kZW50ID0gb3B0aW9ucy5pbmRlbnQsIGhlcmVjb21tZW50ID0gb3B0aW9ucy5oZXJlY29tbWVudDsNCiAgICAgIGlmIChoZXJlY29tbWVudCkgew0KICAgICAgICBpZiAoSEVSRURPQ19JTExFR0FMLnRlc3QoZG9jKSkgew0KICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiYmxvY2sgY29tbWVudCBjYW5ub3QgY29udGFpbiBcIiovXCIsIHN0YXJ0aW5nIG9uIGxpbmUgIiArICh0aGlzLmxpbmUgKyAxKSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGRvYy5pbmRleE9mKCdcbicpIDw9IDApIHsNCiAgICAgICAgICByZXR1cm4gZG9jOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICB3aGlsZSAobWF0Y2ggPSBIRVJFRE9DX0lOREVOVC5leGVjKGRvYykpIHsNCiAgICAgICAgICBhdHRlbXB0ID0gbWF0Y2hbMV07DQogICAgICAgICAgaWYgKGluZGVudCA9PT0gbnVsbCB8fCAoMCA8IChfcmVmMiA9IGF0dGVtcHQubGVuZ3RoKSAmJiBfcmVmMiA8IGluZGVudC5sZW5ndGgpKSB7DQogICAgICAgICAgICBpbmRlbnQgPSBhdHRlbXB0Ow0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKGluZGVudCkgew0KICAgICAgICBkb2MgPSBkb2MucmVwbGFjZShSZWdFeHAoIlxcbiIgKyBpbmRlbnQsICJnIiksICdcbicpOw0KICAgICAgfQ0KICAgICAgaWYgKCFoZXJlY29tbWVudCkgew0KICAgICAgICBkb2MgPSBkb2MucmVwbGFjZSgvXlxuLywgJycpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGRvYzsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS50YWdQYXJhbWV0ZXJzID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgaSwgc3RhY2ssIHRvaywgdG9rZW5zOw0KICAgICAgaWYgKHRoaXMudGFnKCkgIT09ICcpJykgew0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgIH0NCiAgICAgIHN0YWNrID0gW107DQogICAgICB0b2tlbnMgPSB0aGlzLnRva2VuczsNCiAgICAgIGkgPSB0b2tlbnMubGVuZ3RoOw0KICAgICAgdG9rZW5zWy0taV1bMF0gPSAnUEFSQU1fRU5EJzsNCiAgICAgIHdoaWxlICh0b2sgPSB0b2tlbnNbLS1pXSkgew0KICAgICAgICBzd2l0Y2ggKHRva1swXSkgew0KICAgICAgICAgIGNhc2UgJyknOg0KICAgICAgICAgICAgc3RhY2sucHVzaCh0b2spOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgY2FzZSAnKCc6DQogICAgICAgICAgY2FzZSAnQ0FMTF9TVEFSVCc6DQogICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoKSB7DQogICAgICAgICAgICAgIHN0YWNrLnBvcCgpOw0KICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tbMF0gPT09ICcoJykgew0KICAgICAgICAgICAgICB0b2tbMF0gPSAnUEFSQU1fU1RBUlQnOw0KICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRoaXM7DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUuY2xvc2VJbmRlbnRhdGlvbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuIHRoaXMub3V0ZGVudFRva2VuKHRoaXMuaW5kZW50KTsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5pZGVudGlmaWVyRXJyb3IgPSBmdW5jdGlvbih3b3JkKSB7DQogICAgICB0aHJvdyBTeW50YXhFcnJvcigiUmVzZXJ2ZWQgd29yZCBcIiIgKyB3b3JkICsgIlwiIG9uIGxpbmUgIiArICh0aGlzLmxpbmUgKyAxKSk7DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUuYXNzaWdubWVudEVycm9yID0gZnVuY3Rpb24oKSB7DQogICAgICB0aHJvdyBTeW50YXhFcnJvcigiUmVzZXJ2ZWQgd29yZCBcIiIgKyAodGhpcy52YWx1ZSgpKSArICJcIiBvbiBsaW5lICIgKyAodGhpcy5saW5lICsgMSkgKyAiIGNhbid0IGJlIGFzc2lnbmVkIik7DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUuYmFsYW5jZWRTdHJpbmcgPSBmdW5jdGlvbihzdHIsIGVuZCkgew0KICAgICAgdmFyIGksIGxldHRlciwgcHJldiwgc3RhY2ssIF9yZWYyOw0KICAgICAgc3RhY2sgPSBbZW5kXTsNCiAgICAgIGZvciAoaSA9IDEsIF9yZWYyID0gc3RyLmxlbmd0aDsgMSA8PSBfcmVmMiA/IGkgPCBfcmVmMiA6IGkgPiBfcmVmMjsgMSA8PSBfcmVmMiA/IGkrKyA6IGktLSkgew0KICAgICAgICBzd2l0Y2ggKGxldHRlciA9IHN0ci5jaGFyQXQoaSkpIHsNCiAgICAgICAgICBjYXNlICdcXCc6DQogICAgICAgICAgICBpKys7DQogICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICBjYXNlIGVuZDoNCiAgICAgICAgICAgIHN0YWNrLnBvcCgpOw0KICAgICAgICAgICAgaWYgKCFzdGFjay5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgcmV0dXJuIHN0ci5zbGljZSgwLCBpICsgMSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbmQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTsNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9DQogICAgICAgIGlmIChlbmQgPT09ICd9JyAmJiAobGV0dGVyID09PSAnIicgfHwgbGV0dGVyID09PSAiJyIpKSB7DQogICAgICAgICAgc3RhY2sucHVzaChlbmQgPSBsZXR0ZXIpOw0KICAgICAgICB9IGVsc2UgaWYgKGVuZCA9PT0gJ30nICYmIGxldHRlciA9PT0gJ3snKSB7DQogICAgICAgICAgc3RhY2sucHVzaChlbmQgPSAnfScpOw0KICAgICAgICB9IGVsc2UgaWYgKGVuZCA9PT0gJyInICYmIHByZXYgPT09ICcjJyAmJiBsZXR0ZXIgPT09ICd7Jykgew0KICAgICAgICAgIHN0YWNrLnB1c2goZW5kID0gJ30nKTsNCiAgICAgICAgfQ0KICAgICAgICBwcmV2ID0gbGV0dGVyOw0KICAgICAgfQ0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nICIgKyAoc3RhY2sucG9wKCkpICsgIiwgc3RhcnRpbmcgb24gbGluZSAiICsgKHRoaXMubGluZSArIDEpKTsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5pbnRlcnBvbGF0ZVN0cmluZyA9IGZ1bmN0aW9uKHN0ciwgb3B0aW9ucykgew0KICAgICAgdmFyIGV4cHIsIGhlcmVkb2MsIGksIGlubmVyLCBpbnRlcnBvbGF0ZWQsIGxlbiwgbGV0dGVyLCBuZXN0ZWQsIHBpLCByZWdleCwgdGFnLCB0b2tlbnMsIHZhbHVlLCBfbGVuLCBfcmVmMiwgX3JlZjMsIF9yZWY0Ow0KICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgew0KICAgICAgICBvcHRpb25zID0ge307DQogICAgICB9DQogICAgICBoZXJlZG9jID0gb3B0aW9ucy5oZXJlZG9jLCByZWdleCA9IG9wdGlvbnMucmVnZXg7DQogICAgICB0b2tlbnMgPSBbXTsNCiAgICAgIHBpID0gMDsNCiAgICAgIGkgPSAtMTsNCiAgICAgIHdoaWxlIChsZXR0ZXIgPSBzdHIuY2hhckF0KGkgKz0gMSkpIHsNCiAgICAgICAgaWYgKGxldHRlciA9PT0gJ1xcJykgew0KICAgICAgICAgIGkgKz0gMTsNCiAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIShsZXR0ZXIgPT09ICcjJyAmJiBzdHIuY2hhckF0KGkgKyAxKSA9PT0gJ3snICYmIChleHByID0gdGhpcy5iYWxhbmNlZFN0cmluZyhzdHIuc2xpY2UoaSArIDEpLCAnfScpKSkpIHsNCiAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocGkgPCBpKSB7DQogICAgICAgICAgdG9rZW5zLnB1c2goWydORU9TVFJJTkcnLCBzdHIuc2xpY2UocGksIGkpXSk7DQogICAgICAgIH0NCiAgICAgICAgaW5uZXIgPSBleHByLnNsaWNlKDEsIC0xKTsNCiAgICAgICAgaWYgKGlubmVyLmxlbmd0aCkgew0KICAgICAgICAgIG5lc3RlZCA9IG5ldyBMZXhlcigpLnRva2VuaXplKGlubmVyLCB7DQogICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsDQogICAgICAgICAgICByZXdyaXRlOiBmYWxzZQ0KICAgICAgICAgIH0pOw0KICAgICAgICAgIG5lc3RlZC5wb3AoKTsNCiAgICAgICAgICBpZiAoKChfcmVmMiA9IG5lc3RlZFswXSkgIT0gbnVsbCA/IF9yZWYyWzBdIDogdm9pZCAwKSA9PT0gJ1RFUk1JTkFUT1InKSB7DQogICAgICAgICAgICBuZXN0ZWQuc2hpZnQoKTsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKGxlbiA9IG5lc3RlZC5sZW5ndGgpIHsNCiAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7DQogICAgICAgICAgICAgIG5lc3RlZC51bnNoaWZ0KFsnKCcsICcoJ10pOw0KICAgICAgICAgICAgICBuZXN0ZWQucHVzaChbJyknLCAnKSddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRva2Vucy5wdXNoKFsnVE9LRU5TJywgbmVzdGVkXSk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGkgKz0gZXhwci5sZW5ndGg7DQogICAgICAgIHBpID0gaSArIDE7DQogICAgICB9DQogICAgICBpZiAoKGkgPiBwaSAmJiBwaSA8IHN0ci5sZW5ndGgpKSB7DQogICAgICAgIHRva2Vucy5wdXNoKFsnTkVPU1RSSU5HJywgc3RyLnNsaWNlKHBpKV0pOw0KICAgICAgfQ0KICAgICAgaWYgKHJlZ2V4KSB7DQogICAgICAgIHJldHVybiB0b2tlbnM7DQogICAgICB9DQogICAgICBpZiAoIXRva2Vucy5sZW5ndGgpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW4oJ1NUUklORycsICciIicpOw0KICAgICAgfQ0KICAgICAgaWYgKHRva2Vuc1swXVswXSAhPT0gJ05FT1NUUklORycpIHsNCiAgICAgICAgdG9rZW5zLnVuc2hpZnQoWycnLCAnJ10pOw0KICAgICAgfQ0KICAgICAgaWYgKGludGVycG9sYXRlZCA9IHRva2Vucy5sZW5ndGggPiAxKSB7DQogICAgICAgIHRoaXMudG9rZW4oJygnLCAnKCcpOw0KICAgICAgfQ0KICAgICAgZm9yIChpID0gMCwgX2xlbiA9IHRva2Vucy5sZW5ndGg7IGkgPCBfbGVuOyBpKyspIHsNCiAgICAgICAgX3JlZjMgPSB0b2tlbnNbaV0sIHRhZyA9IF9yZWYzWzBdLCB2YWx1ZSA9IF9yZWYzWzFdOw0KICAgICAgICBpZiAoaSkgew0KICAgICAgICAgIHRoaXMudG9rZW4oJysnLCAnKycpOw0KICAgICAgICB9DQogICAgICAgIGlmICh0YWcgPT09ICdUT0tFTlMnKSB7DQogICAgICAgICAgKF9yZWY0ID0gdGhpcy50b2tlbnMpLnB1c2guYXBwbHkoX3JlZjQsIHZhbHVlKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aGlzLnRva2VuKCdTVFJJTkcnLCB0aGlzLm1ha2VTdHJpbmcodmFsdWUsICciJywgaGVyZWRvYykpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZiAoaW50ZXJwb2xhdGVkKSB7DQogICAgICAgIHRoaXMudG9rZW4oJyknLCAnKScpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRva2VuczsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS50b2tlbiA9IGZ1bmN0aW9uKHRhZywgdmFsdWUpIHsNCiAgICAgIHJldHVybiB0aGlzLnRva2Vucy5wdXNoKFt0YWcsIHZhbHVlLCB0aGlzLmxpbmVdKTsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS50YWcgPSBmdW5jdGlvbihpbmRleCwgdGFnKSB7DQogICAgICB2YXIgdG9rOw0KICAgICAgcmV0dXJuICh0b2sgPSBsYXN0KHRoaXMudG9rZW5zLCBpbmRleCkpICYmICh0YWcgPyB0b2tbMF0gPSB0YWcgOiB0b2tbMF0pOw0KICAgIH07DQogICAgTGV4ZXIucHJvdG90eXBlLnZhbHVlID0gZnVuY3Rpb24oaW5kZXgsIHZhbCkgew0KICAgICAgdmFyIHRvazsNCiAgICAgIHJldHVybiAodG9rID0gbGFzdCh0aGlzLnRva2VucywgaW5kZXgpKSAmJiAodmFsID8gdG9rWzFdID0gdmFsIDogdG9rWzFdKTsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS51bmZpbmlzaGVkID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgcHJldiwgdmFsdWU7DQogICAgICByZXR1cm4gTElORV9DT05USU5VRVIudGVzdCh0aGlzLmNodW5rKSB8fCAocHJldiA9IGxhc3QodGhpcy50b2tlbnMsIDEpKSAmJiBwcmV2WzBdICE9PSAnLicgJiYgKHZhbHVlID0gdGhpcy52YWx1ZSgpKSAmJiAhdmFsdWUucmVzZXJ2ZWQgJiYgTk9fTkVXTElORS50ZXN0KHZhbHVlKSAmJiAhQ09ERS50ZXN0KHZhbHVlKSAmJiAhQVNTSUdORUQudGVzdCh0aGlzLmNodW5rKTsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5lc2NhcGVMaW5lcyA9IGZ1bmN0aW9uKHN0ciwgaGVyZWRvYykgew0KICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKE1VTFRJTElORVIsIGhlcmVkb2MgPyAnXFxuJyA6ICcnKTsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5tYWtlU3RyaW5nID0gZnVuY3Rpb24oYm9keSwgcXVvdGUsIGhlcmVkb2MpIHsNCiAgICAgIGlmICghYm9keSkgew0KICAgICAgICByZXR1cm4gcXVvdGUgKyBxdW90ZTsNCiAgICAgIH0NCiAgICAgIGJvZHkgPSBib2R5LnJlcGxhY2UoL1xcKFtcc1xTXSkvZywgZnVuY3Rpb24obWF0Y2gsIGNvbnRlbnRzKSB7DQogICAgICAgIGlmIChjb250ZW50cyA9PT0gJ1xuJyB8fCBjb250ZW50cyA9PT0gcXVvdGUpIHsNCiAgICAgICAgICByZXR1cm4gY29udGVudHM7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgcmV0dXJuIG1hdGNoOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICAgIGJvZHkgPSBib2R5LnJlcGxhY2UoUmVnRXhwKCIiICsgcXVvdGUsICJnIiksICdcXCQmJyk7DQogICAgICByZXR1cm4gcXVvdGUgKyB0aGlzLmVzY2FwZUxpbmVzKGJvZHksIGhlcmVkb2MpICsgcXVvdGU7DQogICAgfTsNCiAgICByZXR1cm4gTGV4ZXI7DQogIH0pKCk7DQogIEpTX0tFWVdPUkRTID0gWyd0cnVlJywgJ2ZhbHNlJywgJ251bGwnLCAndGhpcycsICduZXcnLCAnZGVsZXRlJywgJ3R5cGVvZicsICdpbicsICdpbnN0YW5jZW9mJywgJ3JldHVybicsICd0aHJvdycsICdicmVhaycsICdjb250aW51ZScsICdkZWJ1Z2dlcicsICdpZicsICdlbHNlJywgJ3N3aXRjaCcsICdmb3InLCAnd2hpbGUnLCAnZG8nLCAndHJ5JywgJ2NhdGNoJywgJ2ZpbmFsbHknLCAnY2xhc3MnLCAnZXh0ZW5kcycsICdzdXBlciddOw0KICBDT0ZGRUVfS0VZV09SRFMgPSBbJ3VuZGVmaW5lZCcsICd0aGVuJywgJ3VubGVzcycsICd1bnRpbCcsICdsb29wJywgJ29mJywgJ2J5JywgJ3doZW4nXTsNCiAgQ09GRkVFX0FMSUFTX01BUCA9IHsNCiAgICBhbmQ6ICcmJicsDQogICAgb3I6ICd8fCcsDQogICAgaXM6ICc9PScsDQogICAgaXNudDogJyE9JywNCiAgICBub3Q6ICchJywNCiAgICB5ZXM6ICd0cnVlJywNCiAgICBubzogJ2ZhbHNlJywNCiAgICBvbjogJ3RydWUnLA0KICAgIG9mZjogJ2ZhbHNlJw0KICB9Ow0KICBDT0ZGRUVfQUxJQVNFUyA9IChmdW5jdGlvbigpIHsNCiAgICB2YXIgX3Jlc3VsdHM7DQogICAgX3Jlc3VsdHMgPSBbXTsNCiAgICBmb3IgKGtleSBpbiBDT0ZGRUVfQUxJQVNfTUFQKSB7DQogICAgICBfcmVzdWx0cy5wdXNoKGtleSk7DQogICAgfQ0KICAgIHJldHVybiBfcmVzdWx0czsNCiAgfSkoKTsNCiAgQ09GRkVFX0tFWVdPUkRTID0gQ09GRkVFX0tFWVdPUkRTLmNvbmNhdChDT0ZGRUVfQUxJQVNFUyk7DQogIFJFU0VSVkVEID0gWydjYXNlJywgJ2RlZmF1bHQnLCAnZnVuY3Rpb24nLCAndmFyJywgJ3ZvaWQnLCAnd2l0aCcsICdjb25zdCcsICdsZXQnLCAnZW51bScsICdleHBvcnQnLCAnaW1wb3J0JywgJ25hdGl2ZScsICdfX2hhc1Byb3AnLCAnX19leHRlbmRzJywgJ19fc2xpY2UnLCAnX19iaW5kJywgJ19faW5kZXhPZiddOw0KICBKU19GT1JCSURERU4gPSBKU19LRVlXT1JEUy5jb25jYXQoUkVTRVJWRUQpOw0KICBleHBvcnRzLlJFU0VSVkVEID0gUkVTRVJWRUQuY29uY2F0KEpTX0tFWVdPUkRTKS5jb25jYXQoQ09GRkVFX0tFWVdPUkRTKTsNCiAgSURFTlRJRklFUiA9IC9eKFskQS1aYS16X1x4N2YtXHVmZmZmXVskXHdceDdmLVx1ZmZmZl0qKShbXlxuXFNdKjooPyE6KSk/LzsNCiAgTlVNQkVSID0gL14weFtcZGEtZl0rfF4oPzpcZCsoXC5cZCspP3xcLlxkKykoPzplWystXT9cZCspPy9pOw0KICBIRVJFRE9DID0gL14oIiIifCcnJykoW1xzXFNdKj8pKD86XG5bXlxuXFNdKik/XDEvOw0KICBPUEVSQVRPUiA9IC9eKD86Wy09XT58Wy0rKlwvJTw+JnxeIT89XT18Pj4+PT98KFstKzpdKVwxfChbJnw8Pl0pXDI9P3xcP1wufFwuezIsM30pLzsNCiAgV0hJVEVTUEFDRSA9IC9eW15cblxTXSsvOw0KICBDT01NRU5UID0gL14jIyMoW14jXVtcc1xTXSo/KSg/OiMjI1teXG5cU10qfCg/OiMjIyk/JCl8Xig/OlxzKiMoPyEjI1teI10pLiopKy87DQogIENPREUgPSAvXlstPV0+LzsNCiAgTVVMVElfREVOVCA9IC9eKD86XG5bXlxuXFNdKikrLzsNCiAgU0lNUExFU1RSID0gL14nW15cXCddKig/OlxcLlteXFwnXSopKicvOw0KICBKU1RPS0VOID0gL15gW15cXGBdKig/OlxcLlteXFxgXSopKmAvOw0KICBSRUdFWCA9IC9eXC8oPyFbXHM9XSlbXltcL1xuXFxdKig/Oig/OlxcW1xzXFNdfFxbW15cXVxuXFxdKig/OlxcW1xzXFNdW15cXVxuXFxdKikqXSlbXltcL1xuXFxdKikqXC9baW1neV17MCw0fSg/IVx3KS87DQogIEhFUkVHRVggPSAvXlwvezN9KFtcc1xTXSs/KVwvezN9KFtpbWd5XXswLDR9KSg/IVx3KS87DQogIEhFUkVHRVhfT01JVCA9IC9ccysoPzojLiopPy9nOw0KICBNVUxUSUxJTkVSID0gL1xuL2c7DQogIEhFUkVET0NfSU5ERU5UID0gL1xuKyhbXlxuXFNdKikvZzsNCiAgSEVSRURPQ19JTExFR0FMID0gL1wqXC8vOw0KICBBU1NJR05FRCA9IC9eXHMqQD8oWyRBLVphLXpfXVskXHdceDdmLVx1ZmZmZl0qfFsnIl0uKlsnIl0pW15cblxTXSo/Wzo9XVteOj0+XS87DQogIExJTkVfQ09OVElOVUVSID0gL15ccyooPzosfFw/P1wuKD8hWy5cZF0pfDo6KS87DQogIFRSQUlMSU5HX1NQQUNFUyA9IC9ccyskLzsNCiAgTk9fTkVXTElORSA9IC9eKD86Wy0rKiZ8XC8lPTw+IS5cXF1bPD49JnxdKnxhbmR8b3J8aXMoPzpudCk/fG4oPzpvdHxldyl8ZGVsZXRlfHR5cGVvZnxpbnN0YW5jZW9mKSQvOw0KICBDT01QT1VORF9BU1NJR04gPSBbJy09JywgJys9JywgJy89JywgJyo9JywgJyU9JywgJ3x8PScsICcmJj0nLCAnPz0nLCAnPDw9JywgJz4+PScsICc+Pj49JywgJyY9JywgJ149JywgJ3w9J107DQogIFVOQVJZID0gWychJywgJ34nLCAnTkVXJywgJ1RZUEVPRicsICdERUxFVEUnLCAnRE8nXTsNCiAgTE9HSUMgPSBbJyYmJywgJ3x8JywgJyYnLCAnfCcsICdeJ107DQogIFNISUZUID0gWyc8PCcsICc+PicsICc+Pj4nXTsNCiAgQ09NUEFSRSA9IFsnPT0nLCAnIT0nLCAnPCcsICc+JywgJzw9JywgJz49J107DQogIE1BVEggPSBbJyonLCAnLycsICclJ107DQogIFJFTEFUSU9OID0gWydJTicsICdPRicsICdJTlNUQU5DRU9GJ107DQogIEJPT0wgPSBbJ1RSVUUnLCAnRkFMU0UnLCAnTlVMTCcsICdVTkRFRklORUQnXTsNCiAgTk9UX1JFR0VYID0gWydOVU1CRVInLCAnUkVHRVgnLCAnQk9PTCcsICcrKycsICctLScsICddJ107DQogIE5PVF9TUEFDRURfUkVHRVggPSBOT1RfUkVHRVguY29uY2F0KCcpJywgJ30nLCAnVEhJUycsICdJREVOVElGSUVSJywgJ1NUUklORycpOw0KICBDQUxMQUJMRSA9IFsnSURFTlRJRklFUicsICdTVFJJTkcnLCAnUkVHRVgnLCAnKScsICddJywgJ30nLCAnPycsICc6OicsICdAJywgJ1RISVMnLCAnU1VQRVInXTsNCiAgSU5ERVhBQkxFID0gQ0FMTEFCTEUuY29uY2F0KCdOVU1CRVInLCAnQk9PTCcpOw0KICBMSU5FX0JSRUFLID0gWydJTkRFTlQnLCAnT1VUREVOVCcsICdURVJNSU5BVE9SJ107DQp9KTsNCi8qKg0KICogQ29weXJpZ2h0IChjKSAyMDExIEplcmVteSBBc2hrZW5hcw0KICoNCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uDQogKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbg0KICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dA0KICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsDQogKiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbA0KICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlDQogKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZw0KICogY29uZGl0aW9uczoNCiAqIA0KICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUNCiAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KICogDQogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwNCiAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUw0KICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQNCiAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUDQogKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwNCiAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORw0KICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUg0KICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLg0KICovDQoNCmRlZmluZSgnYWNlL21vZGUvY29mZmVlL3Jld3JpdGVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiAgICANCiAgdmFyIEJBTEFOQ0VEX1BBSVJTLCBFWFBSRVNTSU9OX0NMT1NFLCBFWFBSRVNTSU9OX0VORCwgRVhQUkVTU0lPTl9TVEFSVCwgSU1QTElDSVRfQkxPQ0ssIElNUExJQ0lUX0NBTEwsIElNUExJQ0lUX0VORCwgSU1QTElDSVRfRlVOQywgSU1QTElDSVRfVU5TUEFDRURfQ0FMTCwgSU5WRVJTRVMsIExJTkVCUkVBS1MsIFNJTkdMRV9DTE9TRVJTLCBTSU5HTEVfTElORVJTLCBsZWZ0LCByaXRlLCBfaSwgX2xlbiwgX3JlZjsNCiAgdmFyIF9faW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mIHx8IGZ1bmN0aW9uKGl0ZW0pIHsNCiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQogICAgICBpZiAodGhpc1tpXSA9PT0gaXRlbSkgcmV0dXJuIGk7DQogICAgfQ0KICAgIHJldHVybiAtMTsNCiAgfSwgX19zbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsNCiAgZXhwb3J0cy5SZXdyaXRlciA9IChmdW5jdGlvbigpIHsNCiAgICBmdW5jdGlvbiBSZXdyaXRlcigpIHt9DQogICAgUmV3cml0ZXIucHJvdG90eXBlLnJld3JpdGUgPSBmdW5jdGlvbih0b2tlbnMpIHsNCiAgICAgIHRoaXMudG9rZW5zID0gdG9rZW5zOw0KICAgICAgdGhpcy5yZW1vdmVMZWFkaW5nTmV3bGluZXMoKTsNCiAgICAgIHRoaXMucmVtb3ZlTWlkRXhwcmVzc2lvbk5ld2xpbmVzKCk7DQogICAgICB0aGlzLmNsb3NlT3BlbkNhbGxzKCk7DQogICAgICB0aGlzLmNsb3NlT3BlbkluZGV4ZXMoKTsNCiAgICAgIHRoaXMuYWRkSW1wbGljaXRJbmRlbnRhdGlvbigpOw0KICAgICAgdGhpcy50YWdQb3N0Zml4Q29uZGl0aW9uYWxzKCk7DQogICAgICB0aGlzLmFkZEltcGxpY2l0QnJhY2VzKCk7DQogICAgICB0aGlzLmFkZEltcGxpY2l0UGFyZW50aGVzZXMoKTsNCiAgICAgIHRoaXMuZW5zdXJlQmFsYW5jZShCQUxBTkNFRF9QQUlSUyk7DQogICAgICB0aGlzLnJld3JpdGVDbG9zaW5nUGFyZW5zKCk7DQogICAgICByZXR1cm4gdGhpcy50b2tlbnM7DQogICAgfTsNCiAgICBSZXdyaXRlci5wcm90b3R5cGUuc2NhblRva2VucyA9IGZ1bmN0aW9uKGJsb2NrKSB7DQogICAgICB2YXIgaSwgdG9rZW4sIHRva2VuczsNCiAgICAgIHRva2VucyA9IHRoaXMudG9rZW5zOw0KICAgICAgaSA9IDA7DQogICAgICB3aGlsZSAodG9rZW4gPSB0b2tlbnNbaV0pIHsNCiAgICAgICAgaSArPSBibG9jay5jYWxsKHRoaXMsIHRva2VuLCBpLCB0b2tlbnMpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRydWU7DQogICAgfTsNCiAgICBSZXdyaXRlci5wcm90b3R5cGUuZGV0ZWN0RW5kID0gZnVuY3Rpb24oaSwgY29uZGl0aW9uLCBhY3Rpb24pIHsNCiAgICAgIHZhciBsZXZlbHMsIHRva2VuLCB0b2tlbnMsIF9yZWYsIF9yZWYyOw0KICAgICAgdG9rZW5zID0gdGhpcy50b2tlbnM7DQogICAgICBsZXZlbHMgPSAwOw0KICAgICAgd2hpbGUgKHRva2VuID0gdG9rZW5zW2ldKSB7DQogICAgICAgIGlmIChsZXZlbHMgPT09IDAgJiYgY29uZGl0aW9uLmNhbGwodGhpcywgdG9rZW4sIGkpKSB7DQogICAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsKHRoaXMsIHRva2VuLCBpKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIXRva2VuIHx8IGxldmVscyA8IDApIHsNCiAgICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGwodGhpcywgdG9rZW4sIGkgLSAxKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoX3JlZiA9IHRva2VuWzBdLCBfX2luZGV4T2YuY2FsbChFWFBSRVNTSU9OX1NUQVJULCBfcmVmKSA+PSAwKSB7DQogICAgICAgICAgbGV2ZWxzICs9IDE7DQogICAgICAgIH0gZWxzZSBpZiAoX3JlZjIgPSB0b2tlblswXSwgX19pbmRleE9mLmNhbGwoRVhQUkVTU0lPTl9FTkQsIF9yZWYyKSA+PSAwKSB7DQogICAgICAgICAgbGV2ZWxzIC09IDE7DQogICAgICAgIH0NCiAgICAgICAgaSArPSAxOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGkgLSAxOw0KICAgIH07DQogICAgUmV3cml0ZXIucHJvdG90eXBlLnJlbW92ZUxlYWRpbmdOZXdsaW5lcyA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGksIHRhZywgX2xlbiwgX3JlZjsNCiAgICAgIF9yZWYgPSB0aGlzLnRva2VuczsNCiAgICAgIGZvciAoaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgaSA8IF9sZW47IGkrKykgew0KICAgICAgICB0YWcgPSBfcmVmW2ldWzBdOw0KICAgICAgICBpZiAodGFnICE9PSAnVEVSTUlOQVRPUicpIHsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKGkpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnNwbGljZSgwLCBpKTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIFJld3JpdGVyLnByb3RvdHlwZS5yZW1vdmVNaWRFeHByZXNzaW9uTmV3bGluZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiB0aGlzLnNjYW5Ub2tlbnMoZnVuY3Rpb24odG9rZW4sIGksIHRva2Vucykgew0KICAgICAgICB2YXIgX3JlZjsNCiAgICAgICAgaWYgKCEodG9rZW5bMF0gPT09ICdURVJNSU5BVE9SJyAmJiAoX3JlZiA9IHRoaXMudGFnKGkgKyAxKSwgX19pbmRleE9mLmNhbGwoRVhQUkVTU0lPTl9DTE9TRSwgX3JlZikgPj0gMCkpKSB7DQogICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0NCiAgICAgICAgdG9rZW5zLnNwbGljZShpLCAxKTsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgICB9KTsNCiAgICB9Ow0KICAgIFJld3JpdGVyLnByb3RvdHlwZS5jbG9zZU9wZW5DYWxscyA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGFjdGlvbiwgY29uZGl0aW9uOw0KICAgICAgY29uZGl0aW9uID0gZnVuY3Rpb24odG9rZW4sIGkpIHsNCiAgICAgICAgdmFyIF9yZWY7DQogICAgICAgIHJldHVybiAoKF9yZWYgPSB0b2tlblswXSkgPT09ICcpJyB8fCBfcmVmID09PSAnQ0FMTF9FTkQnKSB8fCB0b2tlblswXSA9PT0gJ09VVERFTlQnICYmIHRoaXMudGFnKGkgLSAxKSA9PT0gJyknOw0KICAgICAgfTsNCiAgICAgIGFjdGlvbiA9IGZ1bmN0aW9uKHRva2VuLCBpKSB7DQogICAgICAgIHJldHVybiB0aGlzLnRva2Vuc1t0b2tlblswXSA9PT0gJ09VVERFTlQnID8gaSAtIDEgOiBpXVswXSA9ICdDQUxMX0VORCc7DQogICAgICB9Ow0KICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VucyhmdW5jdGlvbih0b2tlbiwgaSkgew0KICAgICAgICBpZiAodG9rZW5bMF0gPT09ICdDQUxMX1NUQVJUJykgew0KICAgICAgICAgIHRoaXMuZGV0ZWN0RW5kKGkgKyAxLCBjb25kaXRpb24sIGFjdGlvbik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIDE7DQogICAgICB9KTsNCiAgICB9Ow0KICAgIFJld3JpdGVyLnByb3RvdHlwZS5jbG9zZU9wZW5JbmRleGVzID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgYWN0aW9uLCBjb25kaXRpb247DQogICAgICBjb25kaXRpb24gPSBmdW5jdGlvbih0b2tlbiwgaSkgew0KICAgICAgICB2YXIgX3JlZjsNCiAgICAgICAgcmV0dXJuIChfcmVmID0gdG9rZW5bMF0pID09PSAnXScgfHwgX3JlZiA9PT0gJ0lOREVYX0VORCc7DQogICAgICB9Ow0KICAgICAgYWN0aW9uID0gZnVuY3Rpb24odG9rZW4sIGkpIHsNCiAgICAgICAgcmV0dXJuIHRva2VuWzBdID0gJ0lOREVYX0VORCc7DQogICAgICB9Ow0KICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VucyhmdW5jdGlvbih0b2tlbiwgaSkgew0KICAgICAgICBpZiAodG9rZW5bMF0gPT09ICdJTkRFWF9TVEFSVCcpIHsNCiAgICAgICAgICB0aGlzLmRldGVjdEVuZChpICsgMSwgY29uZGl0aW9uLCBhY3Rpb24pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAxOw0KICAgICAgfSk7DQogICAgfTsNCiAgICBSZXdyaXRlci5wcm90b3R5cGUuYWRkSW1wbGljaXRCcmFjZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBhY3Rpb24sIGNvbmRpdGlvbiwgc3RhY2ssIHN0YXJ0LCBzdGFydEluZGVudDsNCiAgICAgIHN0YWNrID0gW107DQogICAgICBzdGFydCA9IG51bGw7DQogICAgICBzdGFydEluZGVudCA9IDA7DQogICAgICBjb25kaXRpb24gPSBmdW5jdGlvbih0b2tlbiwgaSkgew0KICAgICAgICB2YXIgb25lLCB0YWcsIHRocmVlLCB0d28sIF9yZWYsIF9yZWYyOw0KICAgICAgICBfcmVmID0gdGhpcy50b2tlbnMuc2xpY2UoaSArIDEsIChpICsgMyArIDEpIHx8IDllOSksIG9uZSA9IF9yZWZbMF0sIHR3byA9IF9yZWZbMV0sIHRocmVlID0gX3JlZlsyXTsNCiAgICAgICAgaWYgKCdIRVJFQ09NTUVOVCcgPT09IChvbmUgIT0gbnVsbCA/IG9uZVswXSA6IHZvaWQgMCkpIHsNCiAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgdGFnID0gdG9rZW5bMF07DQogICAgICAgIHJldHVybiAoKHRhZyA9PT0gJ1RFUk1JTkFUT1InIHx8IHRhZyA9PT0gJ09VVERFTlQnKSAmJiAhKCh0d28gIT0gbnVsbCA/IHR3b1swXSA6IHZvaWQgMCkgPT09ICc6JyB8fCAob25lICE9IG51bGwgPyBvbmVbMF0gOiB2b2lkIDApID09PSAnQCcgJiYgKHRocmVlICE9IG51bGwgPyB0aHJlZVswXSA6IHZvaWQgMCkgPT09ICc6JykpIHx8ICh0YWcgPT09ICcsJyAmJiBvbmUgJiYgKChfcmVmMiA9IG9uZVswXSkgIT09ICdJREVOVElGSUVSJyAmJiBfcmVmMiAhPT0gJ05VTUJFUicgJiYgX3JlZjIgIT09ICdTVFJJTkcnICYmIF9yZWYyICE9PSAnQCcgJiYgX3JlZjIgIT09ICdURVJNSU5BVE9SJyAmJiBfcmVmMiAhPT0gJ09VVERFTlQnKSk7DQogICAgICB9Ow0KICAgICAgYWN0aW9uID0gZnVuY3Rpb24odG9rZW4sIGkpIHsNCiAgICAgICAgdmFyIHRvazsNCiAgICAgICAgdG9rID0gWyd9JywgJ30nLCB0b2tlblsyXV07DQogICAgICAgIHRvay5nZW5lcmF0ZWQgPSB0cnVlOw0KICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc3BsaWNlKGksIDAsIHRvayk7DQogICAgICB9Ow0KICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VucyhmdW5jdGlvbih0b2tlbiwgaSwgdG9rZW5zKSB7DQogICAgICAgIHZhciBhZ28sIGlkeCwgdGFnLCB0b2ssIHZhbHVlLCBfcmVmLCBfcmVmMjsNCiAgICAgICAgaWYgKF9yZWYgPSAodGFnID0gdG9rZW5bMF0pLCBfX2luZGV4T2YuY2FsbChFWFBSRVNTSU9OX1NUQVJULCBfcmVmKSA+PSAwKSB7DQogICAgICAgICAgc3RhY2sucHVzaChbKHRhZyA9PT0gJ0lOREVOVCcgJiYgdGhpcy50YWcoaSAtIDEpID09PSAneycgPyAneycgOiB0YWcpLCBpXSk7DQogICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0NCiAgICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKEVYUFJFU1NJT05fRU5ELCB0YWcpID49IDApIHsNCiAgICAgICAgICBzdGFydCA9IHN0YWNrLnBvcCgpOw0KICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9DQogICAgICAgIGlmICghKHRhZyA9PT0gJzonICYmICgoYWdvID0gdGhpcy50YWcoaSAtIDIpKSA9PT0gJzonIHx8ICgoX3JlZjIgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXSkgIT0gbnVsbCA/IF9yZWYyWzBdIDogdm9pZCAwKSAhPT0gJ3snKSkpIHsNCiAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgfQ0KICAgICAgICBzdGFjay5wdXNoKFsneyddKTsNCiAgICAgICAgaWR4ID0gYWdvID09PSAnQCcgPyBpIC0gMiA6IGkgLSAxOw0KICAgICAgICB3aGlsZSAodGhpcy50YWcoaWR4IC0gMikgPT09ICdIRVJFQ09NTUVOVCcpIHsNCiAgICAgICAgICBpZHggLT0gMjsNCiAgICAgICAgfQ0KICAgICAgICB2YWx1ZSA9IG5ldyBTdHJpbmcoJ3snKTsNCiAgICAgICAgdmFsdWUuZ2VuZXJhdGVkID0gdHJ1ZTsNCiAgICAgICAgdG9rID0gWyd7JywgdmFsdWUsIHRva2VuWzJdXTsNCiAgICAgICAgdG9rLmdlbmVyYXRlZCA9IHRydWU7DQogICAgICAgIHRva2Vucy5zcGxpY2UoaWR4LCAwLCB0b2spOw0KICAgICAgICB0aGlzLmRldGVjdEVuZChpICsgMiwgY29uZGl0aW9uLCBhY3Rpb24pOw0KICAgICAgICByZXR1cm4gMjsNCiAgICAgIH0pOw0KICAgIH07DQogICAgUmV3cml0ZXIucHJvdG90eXBlLmFkZEltcGxpY2l0UGFyZW50aGVzZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBhY3Rpb24sIG5vQ2FsbDsNCiAgICAgIG5vQ2FsbCA9IGZhbHNlOw0KICAgICAgYWN0aW9uID0gZnVuY3Rpb24odG9rZW4sIGkpIHsNCiAgICAgICAgdmFyIGlkeDsNCiAgICAgICAgaWR4ID0gdG9rZW5bMF0gPT09ICdPVVRERU5UJyA/IGkgKyAxIDogaTsNCiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnNwbGljZShpZHgsIDAsIFsnQ0FMTF9FTkQnLCAnKScsIHRva2VuWzJdXSk7DQogICAgICB9Ow0KICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VucyhmdW5jdGlvbih0b2tlbiwgaSwgdG9rZW5zKSB7DQogICAgICAgIHZhciBjYWxsT2JqZWN0LCBjdXJyZW50LCBuZXh0LCBwcmV2LCBzZWVuQ29udHJvbCwgc2VlblNpbmdsZSwgdGFnLCBfcmVmLCBfcmVmMiwgX3JlZjM7DQogICAgICAgIHRhZyA9IHRva2VuWzBdOw0KICAgICAgICBpZiAodGFnID09PSAnQ0xBU1MnIHx8IHRhZyA9PT0gJ0lGJykgew0KICAgICAgICAgIG5vQ2FsbCA9IHRydWU7DQogICAgICAgIH0NCiAgICAgICAgX3JlZiA9IHRva2Vucy5zbGljZShpIC0gMSwgKGkgKyAxICsgMSkgfHwgOWU5KSwgcHJldiA9IF9yZWZbMF0sIGN1cnJlbnQgPSBfcmVmWzFdLCBuZXh0ID0gX3JlZlsyXTsNCiAgICAgICAgY2FsbE9iamVjdCA9ICFub0NhbGwgJiYgdGFnID09PSAnSU5ERU5UJyAmJiBuZXh0ICYmIG5leHQuZ2VuZXJhdGVkICYmIG5leHRbMF0gPT09ICd7JyAmJiBwcmV2ICYmIChfcmVmMiA9IHByZXZbMF0sIF9faW5kZXhPZi5jYWxsKElNUExJQ0lUX0ZVTkMsIF9yZWYyKSA+PSAwKTsNCiAgICAgICAgc2VlblNpbmdsZSA9IGZhbHNlOw0KICAgICAgICBzZWVuQ29udHJvbCA9IGZhbHNlOw0KICAgICAgICBpZiAoX19pbmRleE9mLmNhbGwoTElORUJSRUFLUywgdGFnKSA+PSAwKSB7DQogICAgICAgICAgbm9DYWxsID0gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHByZXYgJiYgIXByZXYuc3BhY2VkICYmIHRhZyA9PT0gJz8nKSB7DQogICAgICAgICAgdG9rZW4uY2FsbCA9IHRydWU7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHRva2VuLmZyb21UaGVuKSB7DQogICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCEoY2FsbE9iamVjdCB8fCAocHJldiAhPSBudWxsID8gcHJldi5zcGFjZWQgOiB2b2lkIDApICYmIChwcmV2LmNhbGwgfHwgKF9yZWYzID0gcHJldlswXSwgX19pbmRleE9mLmNhbGwoSU1QTElDSVRfRlVOQywgX3JlZjMpID49IDApKSAmJiAoX19pbmRleE9mLmNhbGwoSU1QTElDSVRfQ0FMTCwgdGFnKSA+PSAwIHx8ICEodG9rZW4uc3BhY2VkIHx8IHRva2VuLm5ld0xpbmUpICYmIF9faW5kZXhPZi5jYWxsKElNUExJQ0lUX1VOU1BBQ0VEX0NBTEwsIHRhZykgPj0gMCkpKSB7DQogICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0NCiAgICAgICAgdG9rZW5zLnNwbGljZShpLCAwLCBbJ0NBTExfU1RBUlQnLCAnKCcsIHRva2VuWzJdXSk7DQogICAgICAgIHRoaXMuZGV0ZWN0RW5kKGkgKyAxLCBmdW5jdGlvbih0b2tlbiwgaSkgew0KICAgICAgICAgIHZhciBwb3N0LCBfcmVmNDsNCiAgICAgICAgICB0YWcgPSB0b2tlblswXTsNCiAgICAgICAgICBpZiAoIXNlZW5TaW5nbGUgJiYgdG9rZW4uZnJvbVRoZW4pIHsNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAodGFnID09PSAnSUYnIHx8IHRhZyA9PT0gJ0VMU0UnIHx8IHRhZyA9PT0gJ0NBVENIJyB8fCB0YWcgPT09ICctPicgfHwgdGFnID09PSAnPT4nKSB7DQogICAgICAgICAgICBzZWVuU2luZ2xlID0gdHJ1ZTsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKHRhZyA9PT0gJ0lGJyB8fCB0YWcgPT09ICdFTFNFJyB8fCB0YWcgPT09ICdTV0lUQ0gnIHx8IHRhZyA9PT0gJ1RSWScpIHsNCiAgICAgICAgICAgIHNlZW5Db250cm9sID0gdHJ1ZTsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKCh0YWcgPT09ICcuJyB8fCB0YWcgPT09ICc/LicgfHwgdGFnID09PSAnOjonKSAmJiB0aGlzLnRhZyhpIC0gMSkgPT09ICdPVVRERU5UJykgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgfQ0KICAgICAgICAgIHJldHVybiAhdG9rZW4uZ2VuZXJhdGVkICYmIHRoaXMudGFnKGkgLSAxKSAhPT0gJywnICYmIChfX2luZGV4T2YuY2FsbChJTVBMSUNJVF9FTkQsIHRhZykgPj0gMCB8fCAodGFnID09PSAnSU5ERU5UJyAmJiAhc2VlbkNvbnRyb2wpKSAmJiAodGFnICE9PSAnSU5ERU5UJyB8fCAodGhpcy50YWcoaSAtIDIpICE9PSAnQ0xBU1MnICYmIChfcmVmNCA9IHRoaXMudGFnKGkgLSAxKSwgX19pbmRleE9mLmNhbGwoSU1QTElDSVRfQkxPQ0ssIF9yZWY0KSA8IDApICYmICEoKHBvc3QgPSB0aGlzLnRva2Vuc1tpICsgMV0pICYmIHBvc3QuZ2VuZXJhdGVkICYmIHBvc3RbMF0gPT09ICd7JykpKTsNCiAgICAgICAgfSwgYWN0aW9uKTsNCiAgICAgICAgaWYgKHByZXZbMF0gPT09ICc/Jykgew0KICAgICAgICAgIHByZXZbMF0gPSAnRlVOQ19FWElTVCc7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIDI7DQogICAgICB9KTsNCiAgICB9Ow0KICAgIFJld3JpdGVyLnByb3RvdHlwZS5hZGRJbXBsaWNpdEluZGVudGF0aW9uID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gdGhpcy5zY2FuVG9rZW5zKGZ1bmN0aW9uKHRva2VuLCBpLCB0b2tlbnMpIHsNCiAgICAgICAgdmFyIGFjdGlvbiwgY29uZGl0aW9uLCBpbmRlbnQsIG91dGRlbnQsIHN0YXJ0ZXIsIHRhZywgX3JlZiwgX3JlZjI7DQogICAgICAgIHRhZyA9IHRva2VuWzBdOw0KICAgICAgICBpZiAodGFnID09PSAnVEVSTUlOQVRPUicgJiYgdGhpcy50YWcoaSArIDEpID09PSAnVEhFTicpIHsNCiAgICAgICAgICB0b2tlbnMuc3BsaWNlKGksIDEpOw0KICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9DQogICAgICAgIGlmICh0YWcgPT09ICdFTFNFJyAmJiB0aGlzLnRhZyhpIC0gMSkgIT09ICdPVVRERU5UJykgew0KICAgICAgICAgIHRva2Vucy5zcGxpY2UuYXBwbHkodG9rZW5zLCBbaSwgMF0uY29uY2F0KF9fc2xpY2UuY2FsbCh0aGlzLmluZGVudGF0aW9uKHRva2VuKSkpKTsNCiAgICAgICAgICByZXR1cm4gMjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGFnID09PSAnQ0FUQ0gnICYmICgoX3JlZiA9IHRoaXMudGFnKGkgKyAyKSkgPT09ICdPVVRERU5UJyB8fCBfcmVmID09PSAnVEVSTUlOQVRPUicgfHwgX3JlZiA9PT0gJ0ZJTkFMTFknKSkgew0KICAgICAgICAgIHRva2Vucy5zcGxpY2UuYXBwbHkodG9rZW5zLCBbaSArIDIsIDBdLmNvbmNhdChfX3NsaWNlLmNhbGwodGhpcy5pbmRlbnRhdGlvbih0b2tlbikpKSk7DQogICAgICAgICAgcmV0dXJuIDQ7DQogICAgICAgIH0NCiAgICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKFNJTkdMRV9MSU5FUlMsIHRhZykgPj0gMCAmJiB0aGlzLnRhZyhpICsgMSkgIT09ICdJTkRFTlQnICYmICEodGFnID09PSAnRUxTRScgJiYgdGhpcy50YWcoaSArIDEpID09PSAnSUYnKSkgew0KICAgICAgICAgIHN0YXJ0ZXIgPSB0YWc7DQogICAgICAgICAgX3JlZjIgPSB0aGlzLmluZGVudGF0aW9uKHRva2VuKSwgaW5kZW50ID0gX3JlZjJbMF0sIG91dGRlbnQgPSBfcmVmMlsxXTsNCiAgICAgICAgICBpZiAoc3RhcnRlciA9PT0gJ1RIRU4nKSB7DQogICAgICAgICAgICBpbmRlbnQuZnJvbVRoZW4gPSB0cnVlOw0KICAgICAgICAgIH0NCiAgICAgICAgICBpbmRlbnQuZ2VuZXJhdGVkID0gb3V0ZGVudC5nZW5lcmF0ZWQgPSB0cnVlOw0KICAgICAgICAgIHRva2Vucy5zcGxpY2UoaSArIDEsIDAsIGluZGVudCk7DQogICAgICAgICAgY29uZGl0aW9uID0gZnVuY3Rpb24odG9rZW4sIGkpIHsNCiAgICAgICAgICAgIHZhciBfcmVmMzsNCiAgICAgICAgICAgIHJldHVybiB0b2tlblsxXSAhPT0gJzsnICYmIChfcmVmMyA9IHRva2VuWzBdLCBfX2luZGV4T2YuY2FsbChTSU5HTEVfQ0xPU0VSUywgX3JlZjMpID49IDApICYmICEodG9rZW5bMF0gPT09ICdFTFNFJyAmJiAoc3RhcnRlciAhPT0gJ0lGJyAmJiBzdGFydGVyICE9PSAnVEhFTicpKTsNCiAgICAgICAgICB9Ow0KICAgICAgICAgIGFjdGlvbiA9IGZ1bmN0aW9uKHRva2VuLCBpKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc3BsaWNlKCh0aGlzLnRhZyhpIC0gMSkgPT09ICcsJyA/IGkgLSAxIDogaSksIDAsIG91dGRlbnQpOw0KICAgICAgICAgIH07DQogICAgICAgICAgdGhpcy5kZXRlY3RFbmQoaSArIDIsIGNvbmRpdGlvbiwgYWN0aW9uKTsNCiAgICAgICAgICBpZiAodGFnID09PSAnVEhFTicpIHsNCiAgICAgICAgICAgIHRva2Vucy5zcGxpY2UoaSwgMSk7DQogICAgICAgICAgfQ0KICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAxOw0KICAgICAgfSk7DQogICAgfTsNCiAgICBSZXdyaXRlci5wcm90b3R5cGUudGFnUG9zdGZpeENvbmRpdGlvbmFscyA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGNvbmRpdGlvbjsNCiAgICAgIGNvbmRpdGlvbiA9IGZ1bmN0aW9uKHRva2VuLCBpKSB7DQogICAgICAgIHZhciBfcmVmOw0KICAgICAgICByZXR1cm4gKF9yZWYgPSB0b2tlblswXSkgPT09ICdURVJNSU5BVE9SJyB8fCBfcmVmID09PSAnSU5ERU5UJzsNCiAgICAgIH07DQogICAgICByZXR1cm4gdGhpcy5zY2FuVG9rZW5zKGZ1bmN0aW9uKHRva2VuLCBpKSB7DQogICAgICAgIHZhciBvcmlnaW5hbDsNCiAgICAgICAgaWYgKHRva2VuWzBdICE9PSAnSUYnKSB7DQogICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0NCiAgICAgICAgb3JpZ2luYWwgPSB0b2tlbjsNCiAgICAgICAgdGhpcy5kZXRlY3RFbmQoaSArIDEsIGNvbmRpdGlvbiwgZnVuY3Rpb24odG9rZW4sIGkpIHsNCiAgICAgICAgICBpZiAodG9rZW5bMF0gIT09ICdJTkRFTlQnKSB7DQogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxbMF0gPSAnUE9TVF8nICsgb3JpZ2luYWxbMF07DQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuIDE7DQogICAgICB9KTsNCiAgICB9Ow0KICAgIFJld3JpdGVyLnByb3RvdHlwZS5lbnN1cmVCYWxhbmNlID0gZnVuY3Rpb24ocGFpcnMpIHsNCiAgICAgIHZhciBjbG9zZSwgbGV2ZWwsIGxldmVscywgb3Blbiwgb3BlbkxpbmUsIHRhZywgdG9rZW4sIF9pLCBfaiwgX2xlbiwgX2xlbjIsIF9yZWYsIF9yZWYyOw0KICAgICAgbGV2ZWxzID0ge307DQogICAgICBvcGVuTGluZSA9IHt9Ow0KICAgICAgX3JlZiA9IHRoaXMudG9rZW5zOw0KICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIHRva2VuID0gX3JlZltfaV07DQogICAgICAgIHRhZyA9IHRva2VuWzBdOw0KICAgICAgICBmb3IgKF9qID0gMCwgX2xlbjIgPSBwYWlycy5sZW5ndGg7IF9qIDwgX2xlbjI7IF9qKyspIHsNCiAgICAgICAgICBfcmVmMiA9IHBhaXJzW19qXSwgb3BlbiA9IF9yZWYyWzBdLCBjbG9zZSA9IF9yZWYyWzFdOw0KICAgICAgICAgIGxldmVsc1tvcGVuXSB8PSAwOw0KICAgICAgICAgIGlmICh0YWcgPT09IG9wZW4pIHsNCiAgICAgICAgICAgIGlmIChsZXZlbHNbb3Blbl0rKyA9PT0gMCkgew0KICAgICAgICAgICAgICBvcGVuTGluZVtvcGVuXSA9IHRva2VuWzJdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gZWxzZSBpZiAodGFnID09PSBjbG9zZSAmJiAtLWxldmVsc1tvcGVuXSA8IDApIHsNCiAgICAgICAgICAgIHRocm93IEVycm9yKCJ0b28gbWFueSAiICsgdG9rZW5bMV0gKyAiIG9uIGxpbmUgIiArICh0b2tlblsyXSArIDEpKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGZvciAob3BlbiBpbiBsZXZlbHMpIHsNCiAgICAgICAgbGV2ZWwgPSBsZXZlbHNbb3Blbl07DQogICAgICAgIGlmIChsZXZlbCA+IDApIHsNCiAgICAgICAgICB0aHJvdyBFcnJvcigidW5jbG9zZWQgIiArIG9wZW4gKyAiIG9uIGxpbmUgIiArIChvcGVuTGluZVtvcGVuXSArIDEpKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRoaXM7DQogICAgfTsNCiAgICBSZXdyaXRlci5wcm90b3R5cGUucmV3cml0ZUNsb3NpbmdQYXJlbnMgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBkZWJ0LCBrZXksIHN0YWNrOw0KICAgICAgc3RhY2sgPSBbXTsNCiAgICAgIGRlYnQgPSB7fTsNCiAgICAgIGZvciAoa2V5IGluIElOVkVSU0VTKSB7DQogICAgICAgIGRlYnRba2V5XSA9IDA7DQogICAgICB9DQogICAgICByZXR1cm4gdGhpcy5zY2FuVG9rZW5zKGZ1bmN0aW9uKHRva2VuLCBpLCB0b2tlbnMpIHsNCiAgICAgICAgdmFyIGludiwgbWF0Y2gsIG10YWcsIG9wcG9zLCB0YWcsIHZhbCwgX3JlZjsNCiAgICAgICAgaWYgKF9yZWYgPSAodGFnID0gdG9rZW5bMF0pLCBfX2luZGV4T2YuY2FsbChFWFBSRVNTSU9OX1NUQVJULCBfcmVmKSA+PSAwKSB7DQogICAgICAgICAgc3RhY2sucHVzaCh0b2tlbik7DQogICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0NCiAgICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKEVYUFJFU1NJT05fRU5ELCB0YWcpIDwgMCkgew0KICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9DQogICAgICAgIGlmIChkZWJ0W2ludiA9IElOVkVSU0VTW3RhZ11dID4gMCkgew0KICAgICAgICAgIGRlYnRbaW52XSAtPSAxOw0KICAgICAgICAgIHRva2Vucy5zcGxpY2UoaSwgMSk7DQogICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgIH0NCiAgICAgICAgbWF0Y2ggPSBzdGFjay5wb3AoKTsNCiAgICAgICAgbXRhZyA9IG1hdGNoWzBdOw0KICAgICAgICBvcHBvcyA9IElOVkVSU0VTW210YWddOw0KICAgICAgICBpZiAodGFnID09PSBvcHBvcykgew0KICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9DQogICAgICAgIGRlYnRbbXRhZ10gKz0gMTsNCiAgICAgICAgdmFsID0gW29wcG9zLCBtdGFnID09PSAnSU5ERU5UJyA/IG1hdGNoWzFdIDogb3Bwb3NdOw0KICAgICAgICBpZiAodGhpcy50YWcoaSArIDIpID09PSBtdGFnKSB7DQogICAgICAgICAgdG9rZW5zLnNwbGljZShpICsgMywgMCwgdmFsKTsNCiAgICAgICAgICBzdGFjay5wdXNoKG1hdGNoKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0b2tlbnMuc3BsaWNlKGksIDAsIHZhbCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIDE7DQogICAgICB9KTsNCiAgICB9Ow0KICAgIFJld3JpdGVyLnByb3RvdHlwZS5pbmRlbnRhdGlvbiA9IGZ1bmN0aW9uKHRva2VuKSB7DQogICAgICByZXR1cm4gW1snSU5ERU5UJywgMiwgdG9rZW5bMl1dLCBbJ09VVERFTlQnLCAyLCB0b2tlblsyXV1dOw0KICAgIH07DQogICAgUmV3cml0ZXIucHJvdG90eXBlLnRhZyA9IGZ1bmN0aW9uKGkpIHsNCiAgICAgIHZhciBfcmVmOw0KICAgICAgcmV0dXJuIChfcmVmID0gdGhpcy50b2tlbnNbaV0pICE9IG51bGwgPyBfcmVmWzBdIDogdm9pZCAwOw0KICAgIH07DQogICAgcmV0dXJuIFJld3JpdGVyOw0KICB9KSgpOw0KICBCQUxBTkNFRF9QQUlSUyA9IFtbJygnLCAnKSddLCBbJ1snLCAnXSddLCBbJ3snLCAnfSddLCBbJ0lOREVOVCcsICdPVVRERU5UJ10sIFsnQ0FMTF9TVEFSVCcsICdDQUxMX0VORCddLCBbJ1BBUkFNX1NUQVJUJywgJ1BBUkFNX0VORCddLCBbJ0lOREVYX1NUQVJUJywgJ0lOREVYX0VORCddXTsNCiAgSU5WRVJTRVMgPSB7fTsNCiAgRVhQUkVTU0lPTl9TVEFSVCA9IFtdOw0KICBFWFBSRVNTSU9OX0VORCA9IFtdOw0KICBmb3IgKF9pID0gMCwgX2xlbiA9IEJBTEFOQ0VEX1BBSVJTLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgX3JlZiA9IEJBTEFOQ0VEX1BBSVJTW19pXSwgbGVmdCA9IF9yZWZbMF0sIHJpdGUgPSBfcmVmWzFdOw0KICAgIEVYUFJFU1NJT05fU1RBUlQucHVzaChJTlZFUlNFU1tyaXRlXSA9IGxlZnQpOw0KICAgIEVYUFJFU1NJT05fRU5ELnB1c2goSU5WRVJTRVNbbGVmdF0gPSByaXRlKTsNCiAgfQ0KICBFWFBSRVNTSU9OX0NMT1NFID0gWydDQVRDSCcsICdXSEVOJywgJ0VMU0UnLCAnRklOQUxMWSddLmNvbmNhdChFWFBSRVNTSU9OX0VORCk7DQogIElNUExJQ0lUX0ZVTkMgPSBbJ0lERU5USUZJRVInLCAnU1VQRVInLCAnKScsICdDQUxMX0VORCcsICddJywgJ0lOREVYX0VORCcsICdAJywgJ1RISVMnXTsNCiAgSU1QTElDSVRfQ0FMTCA9IFsnSURFTlRJRklFUicsICdOVU1CRVInLCAnU1RSSU5HJywgJ0pTJywgJ1JFR0VYJywgJ05FVycsICdQQVJBTV9TVEFSVCcsICdDTEFTUycsICdJRicsICdUUlknLCAnU1dJVENIJywgJ1RISVMnLCAnQk9PTCcsICdVTkFSWScsICdTVVBFUicsICdAJywgJy0+JywgJz0+JywgJ1snLCAnKCcsICd7JywgJy0tJywgJysrJ107DQogIElNUExJQ0lUX1VOU1BBQ0VEX0NBTEwgPSBbJysnLCAnLSddOw0KICBJTVBMSUNJVF9CTE9DSyA9IFsnLT4nLCAnPT4nLCAneycsICdbJywgJywnXTsNCiAgSU1QTElDSVRfRU5EID0gWydQT1NUX0lGJywgJ0ZPUicsICdXSElMRScsICdVTlRJTCcsICdXSEVOJywgJ0JZJywgJ0xPT1AnLCAnVEVSTUlOQVRPUiddOw0KICBTSU5HTEVfTElORVJTID0gWydFTFNFJywgJy0+JywgJz0+JywgJ1RSWScsICdGSU5BTExZJywgJ1RIRU4nXTsNCiAgU0lOR0xFX0NMT1NFUlMgPSBbJ1RFUk1JTkFUT1InLCAnQ0FUQ0gnLCAnRklOQUxMWScsICdFTFNFJywgJ09VVERFTlQnLCAnTEVBRElOR19XSEVOJ107DQogIExJTkVCUkVBS1MgPSBbJ1RFUk1JTkFUT1InLCAnSU5ERU5UJywgJ09VVERFTlQnXTsNCn0pOw0KLyoqDQogKiBDb3B5cmlnaHQgKGMpIDIwMTEgSmVyZW15IEFzaGtlbmFzDQogKg0KICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24NCiAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uDQogKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0DQogKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwNCiAqIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUNCiAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nDQogKiBjb25kaXRpb25zOg0KICogDQogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQ0KICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQogKiANCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELA0KICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTDQogKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORA0KICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQNCiAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLA0KICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HDQogKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SDQogKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jb2ZmZWUvaGVscGVycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQogICAgDQogIHZhciBleHRlbmQsIGZsYXR0ZW47DQogIGV4cG9ydHMuc3RhcnRzID0gZnVuY3Rpb24oc3RyaW5nLCBsaXRlcmFsLCBzdGFydCkgew0KICAgIHJldHVybiBsaXRlcmFsID09PSBzdHJpbmcuc3Vic3RyKHN0YXJ0LCBsaXRlcmFsLmxlbmd0aCk7DQogIH07DQogIGV4cG9ydHMuZW5kcyA9IGZ1bmN0aW9uKHN0cmluZywgbGl0ZXJhbCwgYmFjaykgew0KICAgIHZhciBsZW47DQogICAgbGVuID0gbGl0ZXJhbC5sZW5ndGg7DQogICAgcmV0dXJuIGxpdGVyYWwgPT09IHN0cmluZy5zdWJzdHIoc3RyaW5nLmxlbmd0aCAtIGxlbiAtIChiYWNrIHx8IDApLCBsZW4pOw0KICB9Ow0KICBleHBvcnRzLmNvbXBhY3QgPSBmdW5jdGlvbihhcnJheSkgew0KICAgIHZhciBpdGVtLCBfaSwgX2xlbiwgX3Jlc3VsdHM7DQogICAgX3Jlc3VsdHMgPSBbXTsNCiAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGFycmF5Lmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICBpdGVtID0gYXJyYXlbX2ldOw0KICAgICAgaWYgKGl0ZW0pIHsNCiAgICAgICAgX3Jlc3VsdHMucHVzaChpdGVtKTsNCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIF9yZXN1bHRzOw0KICB9Ow0KICBleHBvcnRzLmNvdW50ID0gZnVuY3Rpb24oc3RyaW5nLCBzdWJzdHIpIHsNCiAgICB2YXIgbnVtLCBwb3M7DQogICAgbnVtID0gcG9zID0gMDsNCiAgICBpZiAoIXN1YnN0ci5sZW5ndGgpIHsNCiAgICAgIHJldHVybiAxIC8gMDsNCiAgICB9DQogICAgd2hpbGUgKHBvcyA9IDEgKyBzdHJpbmcuaW5kZXhPZihzdWJzdHIsIHBvcykpIHsNCiAgICAgIG51bSsrOw0KICAgIH0NCiAgICByZXR1cm4gbnVtOw0KICB9Ow0KICBleHBvcnRzLm1lcmdlID0gZnVuY3Rpb24ob3B0aW9ucywgb3ZlcnJpZGVzKSB7DQogICAgcmV0dXJuIGV4dGVuZChleHRlbmQoe30sIG9wdGlvbnMpLCBvdmVycmlkZXMpOw0KICB9Ow0KICBleHRlbmQgPSBleHBvcnRzLmV4dGVuZCA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydGllcykgew0KICAgIHZhciBrZXksIHZhbDsNCiAgICBmb3IgKGtleSBpbiBwcm9wZXJ0aWVzKSB7DQogICAgICB2YWwgPSBwcm9wZXJ0aWVzW2tleV07DQogICAgICBvYmplY3Rba2V5XSA9IHZhbDsNCiAgICB9DQogICAgcmV0dXJuIG9iamVjdDsNCiAgfTsNCiAgZXhwb3J0cy5mbGF0dGVuID0gZmxhdHRlbiA9IGZ1bmN0aW9uKGFycmF5KSB7DQogICAgdmFyIGVsZW1lbnQsIGZsYXR0ZW5lZCwgX2ksIF9sZW47DQogICAgZmxhdHRlbmVkID0gW107DQogICAgZm9yIChfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgew0KICAgICAgZWxlbWVudCA9IGFycmF5W19pXTsNCiAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJyYXkpIHsNCiAgICAgICAgZmxhdHRlbmVkID0gZmxhdHRlbmVkLmNvbmNhdChmbGF0dGVuKGVsZW1lbnQpKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGZsYXR0ZW5lZC5wdXNoKGVsZW1lbnQpOw0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gZmxhdHRlbmVkOw0KICB9Ow0KICBleHBvcnRzLmRlbCA9IGZ1bmN0aW9uKG9iaiwga2V5KSB7DQogICAgdmFyIHZhbDsNCiAgICB2YWwgPSBvYmpba2V5XTsNCiAgICBkZWxldGUgb2JqW2tleV07DQogICAgcmV0dXJuIHZhbDsNCiAgfTsNCiAgZXhwb3J0cy5sYXN0ID0gZnVuY3Rpb24oYXJyYXksIGJhY2spIHsNCiAgICByZXR1cm4gYXJyYXlbYXJyYXkubGVuZ3RoIC0gKGJhY2sgfHwgMCkgLSAxXTsNCiAgfTsNCn0pOw0KLyoqDQogKiBDb3B5cmlnaHQgKGMpIDIwMTEgSmVyZW15IEFzaGtlbmFzDQogKg0KICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24NCiAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uDQogKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0DQogKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwNCiAqIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUNCiAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nDQogKiBjb25kaXRpb25zOg0KICogDQogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQ0KICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQogKiANCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELA0KICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTDQogKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORA0KICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQNCiAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLA0KICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HDQogKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SDQogKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jb2ZmZWUvcGFyc2VyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KLyogSmlzb24gZ2VuZXJhdGVkIHBhcnNlciAqLw0KdmFyIHBhcnNlciA9IHt0cmFjZTogZnVuY3Rpb24gdHJhY2UoKSB7IH0sDQp5eToge30sDQpzeW1ib2xzXzogeyJlcnJvciI6MiwiUm9vdCI6MywiQm9keSI6NCwiQmxvY2siOjUsIlRFUk1JTkFUT1IiOjYsIkxpbmUiOjcsIkV4cHJlc3Npb24iOjgsIlN0YXRlbWVudCI6OSwiUmV0dXJuIjoxMCwiVGhyb3ciOjExLCJDb21tZW50IjoxMiwiU1RBVEVNRU5UIjoxMywiVmFsdWUiOjE0LCJJbnZvY2F0aW9uIjoxNSwiQ29kZSI6MTYsIk9wZXJhdGlvbiI6MTcsIkFzc2lnbiI6MTgsIklmIjoxOSwiVHJ5IjoyMCwiV2hpbGUiOjIxLCJGb3IiOjIyLCJTd2l0Y2giOjIzLCJDbGFzcyI6MjQsIklOREVOVCI6MjUsIk9VVERFTlQiOjI2LCJJZGVudGlmaWVyIjoyNywiSURFTlRJRklFUiI6MjgsIkFscGhhTnVtZXJpYyI6MjksIk5VTUJFUiI6MzAsIlNUUklORyI6MzEsIkxpdGVyYWwiOjMyLCJKUyI6MzMsIlJFR0VYIjozNCwiQk9PTCI6MzUsIkFzc2lnbmFibGUiOjM2LCI9IjozNywiQXNzaWduT2JqIjozOCwiT2JqQXNzaWduYWJsZSI6MzksIjoiOjQwLCJUaGlzUHJvcGVydHkiOjQxLCJSRVRVUk4iOjQyLCJIRVJFQ09NTUVOVCI6NDMsIlBBUkFNX1NUQVJUIjo0NCwiUGFyYW1MaXN0Ijo0NSwiUEFSQU1fRU5EIjo0NiwiRnVuY0dseXBoIjo0NywiLT4iOjQ4LCI9PiI6NDksIk9wdENvbW1hIjo1MCwiLCI6NTEsIlBhcmFtIjo1MiwiUGFyYW1WYXIiOjUzLCIuLi4iOjU0LCJBcnJheSI6NTUsIk9iamVjdCI6NTYsIlNwbGF0Ijo1NywiU2ltcGxlQXNzaWduYWJsZSI6NTgsIkFjY2Vzc29yIjo1OSwiUGFyZW50aGV0aWNhbCI6NjAsIlJhbmdlIjo2MSwiVGhpcyI6NjIsIi4iOjYzLCI/LiI6NjQsIjo6Ijo2NSwiSW5kZXgiOjY2LCJJTkRFWF9TVEFSVCI6NjcsIkluZGV4VmFsdWUiOjY4LCJJTkRFWF9FTkQiOjY5LCJJTkRFWF9TT0FLIjo3MCwiSU5ERVhfUFJPVE8iOjcxLCJTbGljZSI6NzIsInsiOjczLCJBc3NpZ25MaXN0Ijo3NCwifSI6NzUsIkNMQVNTIjo3NiwiRVhURU5EUyI6NzcsIk9wdEZ1bmNFeGlzdCI6NzgsIkFyZ3VtZW50cyI6NzksIlNVUEVSIjo4MCwiRlVOQ19FWElTVCI6ODEsIkNBTExfU1RBUlQiOjgyLCJDQUxMX0VORCI6ODMsIkFyZ0xpc3QiOjg0LCJUSElTIjo4NSwiQCI6ODYsIlsiOjg3LCJdIjo4OCwiUmFuZ2VEb3RzIjo4OSwiLi4iOjkwLCJBcmciOjkxLCJTaW1wbGVBcmdzIjo5MiwiVFJZIjo5MywiQ2F0Y2giOjk0LCJGSU5BTExZIjo5NSwiQ0FUQ0giOjk2LCJUSFJPVyI6OTcsIigiOjk4LCIpIjo5OSwiV2hpbGVTb3VyY2UiOjEwMCwiV0hJTEUiOjEwMSwiV0hFTiI6MTAyLCJVTlRJTCI6MTAzLCJMb29wIjoxMDQsIkxPT1AiOjEwNSwiRm9yQm9keSI6MTA2LCJGT1IiOjEwNywiRm9yU3RhcnQiOjEwOCwiRm9yU291cmNlIjoxMDksIkZvclZhcmlhYmxlcyI6MTEwLCJPV04iOjExMSwiRm9yVmFsdWUiOjExMiwiRk9SSU4iOjExMywiRk9ST0YiOjExNCwiQlkiOjExNSwiU1dJVENIIjoxMTYsIldoZW5zIjoxMTcsIkVMU0UiOjExOCwiV2hlbiI6MTE5LCJMRUFESU5HX1dIRU4iOjEyMCwiSWZCbG9jayI6MTIxLCJJRiI6MTIyLCJQT1NUX0lGIjoxMjMsIlVOQVJZIjoxMjQsIi0iOjEyNSwiKyI6MTI2LCItLSI6MTI3LCIrKyI6MTI4LCI/IjoxMjksIk1BVEgiOjEzMCwiU0hJRlQiOjEzMSwiQ09NUEFSRSI6MTMyLCJMT0dJQyI6MTMzLCJSRUxBVElPTiI6MTM0LCJDT01QT1VORF9BU1NJR04iOjEzNSwiJGFjY2VwdCI6MCwiJGVuZCI6MX0sDQp0ZXJtaW5hbHNfOiB7MjoiZXJyb3IiLDY6IlRFUk1JTkFUT1IiLDEzOiJTVEFURU1FTlQiLDI1OiJJTkRFTlQiLDI2OiJPVVRERU5UIiwyODoiSURFTlRJRklFUiIsMzA6Ik5VTUJFUiIsMzE6IlNUUklORyIsMzM6IkpTIiwzNDoiUkVHRVgiLDM1OiJCT09MIiwzNzoiPSIsNDA6IjoiLDQyOiJSRVRVUk4iLDQzOiJIRVJFQ09NTUVOVCIsNDQ6IlBBUkFNX1NUQVJUIiw0NjoiUEFSQU1fRU5EIiw0ODoiLT4iLDQ5OiI9PiIsNTE6IiwiLDU0OiIuLi4iLDYzOiIuIiw2NDoiPy4iLDY1OiI6OiIsNjc6IklOREVYX1NUQVJUIiw2OToiSU5ERVhfRU5EIiw3MDoiSU5ERVhfU09BSyIsNzE6IklOREVYX1BST1RPIiw3MzoieyIsNzU6In0iLDc2OiJDTEFTUyIsNzc6IkVYVEVORFMiLDgwOiJTVVBFUiIsODE6IkZVTkNfRVhJU1QiLDgyOiJDQUxMX1NUQVJUIiw4MzoiQ0FMTF9FTkQiLDg1OiJUSElTIiw4NjoiQCIsODc6IlsiLDg4OiJdIiw5MDoiLi4iLDkzOiJUUlkiLDk1OiJGSU5BTExZIiw5NjoiQ0FUQ0giLDk3OiJUSFJPVyIsOTg6IigiLDk5OiIpIiwxMDE6IldISUxFIiwxMDI6IldIRU4iLDEwMzoiVU5USUwiLDEwNToiTE9PUCIsMTA3OiJGT1IiLDExMToiT1dOIiwxMTM6IkZPUklOIiwxMTQ6IkZPUk9GIiwxMTU6IkJZIiwxMTY6IlNXSVRDSCIsMTE4OiJFTFNFIiwxMjA6IkxFQURJTkdfV0hFTiIsMTIyOiJJRiIsMTIzOiJQT1NUX0lGIiwxMjQ6IlVOQVJZIiwxMjU6Ii0iLDEyNjoiKyIsMTI3OiItLSIsMTI4OiIrKyIsMTI5OiI/IiwxMzA6Ik1BVEgiLDEzMToiU0hJRlQiLDEzMjoiQ09NUEFSRSIsMTMzOiJMT0dJQyIsMTM0OiJSRUxBVElPTiIsMTM1OiJDT01QT1VORF9BU1NJR04ifSwNCnByb2R1Y3Rpb25zXzogWzAsWzMsMF0sWzMsMV0sWzMsMl0sWzQsMV0sWzQsM10sWzQsMl0sWzcsMV0sWzcsMV0sWzksMV0sWzksMV0sWzksMV0sWzksMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzUsMl0sWzUsM10sWzI3LDFdLFsyOSwxXSxbMjksMV0sWzMyLDFdLFszMiwxXSxbMzIsMV0sWzMyLDFdLFsxOCwzXSxbMTgsNV0sWzM4LDFdLFszOCwzXSxbMzgsNV0sWzM4LDFdLFszOSwxXSxbMzksMV0sWzM5LDFdLFsxMCwyXSxbMTAsMV0sWzEyLDFdLFsxNiw1XSxbMTYsMl0sWzQ3LDFdLFs0NywxXSxbNTAsMF0sWzUwLDFdLFs0NSwwXSxbNDUsMV0sWzQ1LDNdLFs1MiwxXSxbNTIsMl0sWzUyLDNdLFs1MywxXSxbNTMsMV0sWzUzLDFdLFs1MywxXSxbNTcsMl0sWzU4LDFdLFs1OCwyXSxbNTgsMl0sWzU4LDFdLFszNiwxXSxbMzYsMV0sWzM2LDFdLFsxNCwxXSxbMTQsMV0sWzE0LDFdLFsxNCwxXSxbMTQsMV0sWzU5LDJdLFs1OSwyXSxbNTksMl0sWzU5LDFdLFs1OSwxXSxbNjYsM10sWzY2LDJdLFs2NiwyXSxbNjgsMV0sWzY4LDFdLFs1Niw0XSxbNzQsMF0sWzc0LDFdLFs3NCwzXSxbNzQsNF0sWzc0LDZdLFsyNCwxXSxbMjQsMl0sWzI0LDNdLFsyNCw0XSxbMjQsMl0sWzI0LDNdLFsyNCw0XSxbMjQsNV0sWzE1LDNdLFsxNSwzXSxbMTUsMV0sWzE1LDJdLFs3OCwwXSxbNzgsMV0sWzc5LDJdLFs3OSw0XSxbNjIsMV0sWzYyLDFdLFs0MSwyXSxbNTUsMl0sWzU1LDRdLFs4OSwxXSxbODksMV0sWzYxLDVdLFs3MiwzXSxbNzIsMl0sWzcyLDJdLFs4NCwxXSxbODQsM10sWzg0LDRdLFs4NCw0XSxbODQsNl0sWzkxLDFdLFs5MSwxXSxbOTIsMV0sWzkyLDNdLFsyMCwyXSxbMjAsM10sWzIwLDRdLFsyMCw1XSxbOTQsM10sWzExLDJdLFs2MCwzXSxbNjAsNV0sWzEwMCwyXSxbMTAwLDRdLFsxMDAsMl0sWzEwMCw0XSxbMjEsMl0sWzIxLDJdLFsyMSwyXSxbMjEsMV0sWzEwNCwyXSxbMTA0LDJdLFsyMiwyXSxbMjIsMl0sWzIyLDJdLFsxMDYsMl0sWzEwNiwyXSxbMTA4LDJdLFsxMDgsM10sWzExMiwxXSxbMTEyLDFdLFsxMTIsMV0sWzExMCwxXSxbMTEwLDNdLFsxMDksMl0sWzEwOSwyXSxbMTA5LDRdLFsxMDksNF0sWzEwOSw0XSxbMTA5LDZdLFsxMDksNl0sWzIzLDVdLFsyMyw3XSxbMjMsNF0sWzIzLDZdLFsxMTcsMV0sWzExNywyXSxbMTE5LDNdLFsxMTksNF0sWzEyMSwzXSxbMTIxLDVdLFsxOSwxXSxbMTksM10sWzE5LDNdLFsxOSwzXSxbMTcsMl0sWzE3LDJdLFsxNywyXSxbMTcsMl0sWzE3LDJdLFsxNywyXSxbMTcsMl0sWzE3LDJdLFsxNywzXSxbMTcsM10sWzE3LDNdLFsxNywzXSxbMTcsM10sWzE3LDNdLFsxNywzXSxbMTcsM10sWzE3LDVdLFsxNywzXV0sDQpwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LHl5bGVuZyx5eWxpbmVubyx5eSx5eXN0YXRlLCQkLF8kKSB7DQoNCnZhciAkMCA9ICQkLmxlbmd0aCAtIDE7DQpzd2l0Y2ggKHl5c3RhdGUpIHsNCmNhc2UgMTpyZXR1cm4gdGhpcy4kID0gbmV3IHl5LkJsb2NrOw0KYnJlYWs7DQpjYXNlIDI6cmV0dXJuIHRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAzOnJldHVybiB0aGlzLiQgPSAkJFskMC0xXTsNCmJyZWFrOw0KY2FzZSA0OnRoaXMuJCA9IHl5LkJsb2NrLndyYXAoWyQkWyQwXV0pOw0KYnJlYWs7DQpjYXNlIDU6dGhpcy4kID0gJCRbJDAtMl0ucHVzaCgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDY6dGhpcy4kID0gJCRbJDAtMV07DQpicmVhazsNCmNhc2UgNzp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgODp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgOTp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgMTA6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDExOnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAxMjp0aGlzLiQgPSBuZXcgeXkuTGl0ZXJhbCgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDEzOnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAxNDp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgMTU6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDE2OnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAxNzp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgMTg6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDE5OnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAyMDp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgMjE6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDIyOnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAyMzp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgMjQ6dGhpcy4kID0gbmV3IHl5LkJsb2NrOw0KYnJlYWs7DQpjYXNlIDI1OnRoaXMuJCA9ICQkWyQwLTFdOw0KYnJlYWs7DQpjYXNlIDI2OnRoaXMuJCA9IG5ldyB5eS5MaXRlcmFsKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgMjc6dGhpcy4kID0gbmV3IHl5LkxpdGVyYWwoJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSAyODp0aGlzLiQgPSBuZXcgeXkuTGl0ZXJhbCgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDI5OnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAzMDp0aGlzLiQgPSBuZXcgeXkuTGl0ZXJhbCgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDMxOnRoaXMuJCA9IG5ldyB5eS5MaXRlcmFsKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgMzI6dGhpcy4kID0gKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdmFyIHZhbDsNCiAgICAgICAgdmFsID0gbmV3IHl5LkxpdGVyYWwoJCRbJDBdKTsNCiAgICAgICAgaWYgKCQkWyQwXSA9PT0gJ3VuZGVmaW5lZCcpIHsNCiAgICAgICAgICB2YWwuaXNVbmRlZmluZWQgPSB0cnVlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB2YWw7DQogICAgICB9KCkpOw0KYnJlYWs7DQpjYXNlIDMzOnRoaXMuJCA9IG5ldyB5eS5Bc3NpZ24oJCRbJDAtMl0sICQkWyQwXSk7DQpicmVhazsNCmNhc2UgMzQ6dGhpcy4kID0gbmV3IHl5LkFzc2lnbigkJFskMC00XSwgJCRbJDAtMV0pOw0KYnJlYWs7DQpjYXNlIDM1OnRoaXMuJCA9IG5ldyB5eS5WYWx1ZSgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDM2OnRoaXMuJCA9IG5ldyB5eS5Bc3NpZ24obmV3IHl5LlZhbHVlKCQkWyQwLTJdKSwgJCRbJDBdLCAnb2JqZWN0Jyk7DQpicmVhazsNCmNhc2UgMzc6dGhpcy4kID0gbmV3IHl5LkFzc2lnbihuZXcgeXkuVmFsdWUoJCRbJDAtNF0pLCAkJFskMC0xXSwgJ29iamVjdCcpOw0KYnJlYWs7DQpjYXNlIDM4OnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAzOTp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgNDA6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDQxOnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSA0Mjp0aGlzLiQgPSBuZXcgeXkuUmV0dXJuKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgNDM6dGhpcy4kID0gbmV3IHl5LlJldHVybjsNCmJyZWFrOw0KY2FzZSA0NDp0aGlzLiQgPSBuZXcgeXkuQ29tbWVudCgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDQ1OnRoaXMuJCA9IG5ldyB5eS5Db2RlKCQkWyQwLTNdLCAkJFskMF0sICQkWyQwLTFdKTsNCmJyZWFrOw0KY2FzZSA0Njp0aGlzLiQgPSBuZXcgeXkuQ29kZShbXSwgJCRbJDBdLCAkJFskMC0xXSk7DQpicmVhazsNCmNhc2UgNDc6dGhpcy4kID0gJ2Z1bmMnOw0KYnJlYWs7DQpjYXNlIDQ4OnRoaXMuJCA9ICdib3VuZGZ1bmMnOw0KYnJlYWs7DQpjYXNlIDQ5OnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSA1MDp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgNTE6dGhpcy4kID0gW107DQpicmVhazsNCmNhc2UgNTI6dGhpcy4kID0gWyQkWyQwXV07DQpicmVhazsNCmNhc2UgNTM6dGhpcy4kID0gJCRbJDAtMl0uY29uY2F0KCQkWyQwXSk7DQpicmVhazsNCmNhc2UgNTQ6dGhpcy4kID0gbmV3IHl5LlBhcmFtKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgNTU6dGhpcy4kID0gbmV3IHl5LlBhcmFtKCQkWyQwLTFdLCBudWxsLCB0cnVlKTsNCmJyZWFrOw0KY2FzZSA1Njp0aGlzLiQgPSBuZXcgeXkuUGFyYW0oJCRbJDAtMl0sICQkWyQwXSk7DQpicmVhazsNCmNhc2UgNTc6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDU4OnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSA1OTp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgNjA6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDYxOnRoaXMuJCA9IG5ldyB5eS5TcGxhdCgkJFskMC0xXSk7DQpicmVhazsNCmNhc2UgNjI6dGhpcy4kID0gbmV3IHl5LlZhbHVlKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgNjM6dGhpcy4kID0gJCRbJDAtMV0ucHVzaCgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDY0OnRoaXMuJCA9IG5ldyB5eS5WYWx1ZSgkJFskMC0xXSwgWyQkWyQwXV0pOw0KYnJlYWs7DQpjYXNlIDY1OnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSA2Njp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgNjc6dGhpcy4kID0gbmV3IHl5LlZhbHVlKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgNjg6dGhpcy4kID0gbmV3IHl5LlZhbHVlKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgNjk6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDcwOnRoaXMuJCA9IG5ldyB5eS5WYWx1ZSgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDcxOnRoaXMuJCA9IG5ldyB5eS5WYWx1ZSgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDcyOnRoaXMuJCA9IG5ldyB5eS5WYWx1ZSgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDczOnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSA3NDp0aGlzLiQgPSBuZXcgeXkuQWNjZXNzKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgNzU6dGhpcy4kID0gbmV3IHl5LkFjY2VzcygkJFskMF0sICdzb2FrJyk7DQpicmVhazsNCmNhc2UgNzY6dGhpcy4kID0gbmV3IHl5LkFjY2VzcygkJFskMF0sICdwcm90bycpOw0KYnJlYWs7DQpjYXNlIDc3OnRoaXMuJCA9IG5ldyB5eS5BY2Nlc3MobmV3IHl5LkxpdGVyYWwoJ3Byb3RvdHlwZScpKTsNCmJyZWFrOw0KY2FzZSA3ODp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgNzk6dGhpcy4kID0gJCRbJDAtMV07DQpicmVhazsNCmNhc2UgODA6dGhpcy4kID0geXkuZXh0ZW5kKCQkWyQwXSwgew0KICAgICAgICAgIHNvYWs6IHRydWUNCiAgICAgICAgfSk7DQpicmVhazsNCmNhc2UgODE6dGhpcy4kID0geXkuZXh0ZW5kKCQkWyQwXSwgew0KICAgICAgICAgIHByb3RvOiB0cnVlDQogICAgICAgIH0pOw0KYnJlYWs7DQpjYXNlIDgyOnRoaXMuJCA9IG5ldyB5eS5JbmRleCgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDgzOnRoaXMuJCA9IG5ldyB5eS5TbGljZSgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDg0OnRoaXMuJCA9IG5ldyB5eS5PYmooJCRbJDAtMl0sICQkWyQwLTNdLmdlbmVyYXRlZCk7DQpicmVhazsNCmNhc2UgODU6dGhpcy4kID0gW107DQpicmVhazsNCmNhc2UgODY6dGhpcy4kID0gWyQkWyQwXV07DQpicmVhazsNCmNhc2UgODc6dGhpcy4kID0gJCRbJDAtMl0uY29uY2F0KCQkWyQwXSk7DQpicmVhazsNCmNhc2UgODg6dGhpcy4kID0gJCRbJDAtM10uY29uY2F0KCQkWyQwXSk7DQpicmVhazsNCmNhc2UgODk6dGhpcy4kID0gJCRbJDAtNV0uY29uY2F0KCQkWyQwLTJdKTsNCmJyZWFrOw0KY2FzZSA5MDp0aGlzLiQgPSBuZXcgeXkuQ2xhc3M7DQpicmVhazsNCmNhc2UgOTE6dGhpcy4kID0gbmV3IHl5LkNsYXNzKG51bGwsIG51bGwsICQkWyQwXSk7DQpicmVhazsNCmNhc2UgOTI6dGhpcy4kID0gbmV3IHl5LkNsYXNzKG51bGwsICQkWyQwXSk7DQpicmVhazsNCmNhc2UgOTM6dGhpcy4kID0gbmV3IHl5LkNsYXNzKG51bGwsICQkWyQwLTFdLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDk0OnRoaXMuJCA9IG5ldyB5eS5DbGFzcygkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDk1OnRoaXMuJCA9IG5ldyB5eS5DbGFzcygkJFskMC0xXSwgbnVsbCwgJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSA5Njp0aGlzLiQgPSBuZXcgeXkuQ2xhc3MoJCRbJDAtMl0sICQkWyQwXSk7DQpicmVhazsNCmNhc2UgOTc6dGhpcy4kID0gbmV3IHl5LkNsYXNzKCQkWyQwLTNdLCAkJFskMC0xXSwgJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSA5ODp0aGlzLiQgPSBuZXcgeXkuQ2FsbCgkJFskMC0yXSwgJCRbJDBdLCAkJFskMC0xXSk7DQpicmVhazsNCmNhc2UgOTk6dGhpcy4kID0gbmV3IHl5LkNhbGwoJCRbJDAtMl0sICQkWyQwXSwgJCRbJDAtMV0pOw0KYnJlYWs7DQpjYXNlIDEwMDp0aGlzLiQgPSBuZXcgeXkuQ2FsbCgnc3VwZXInLCBbbmV3IHl5LlNwbGF0KG5ldyB5eS5MaXRlcmFsKCdhcmd1bWVudHMnKSldKTsNCmJyZWFrOw0KY2FzZSAxMDE6dGhpcy4kID0gbmV3IHl5LkNhbGwoJ3N1cGVyJywgJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSAxMDI6dGhpcy4kID0gZmFsc2U7DQpicmVhazsNCmNhc2UgMTAzOnRoaXMuJCA9IHRydWU7DQpicmVhazsNCmNhc2UgMTA0OnRoaXMuJCA9IFtdOw0KYnJlYWs7DQpjYXNlIDEwNTp0aGlzLiQgPSAkJFskMC0yXTsNCmJyZWFrOw0KY2FzZSAxMDY6dGhpcy4kID0gbmV3IHl5LlZhbHVlKG5ldyB5eS5MaXRlcmFsKCd0aGlzJykpOw0KYnJlYWs7DQpjYXNlIDEwNzp0aGlzLiQgPSBuZXcgeXkuVmFsdWUobmV3IHl5LkxpdGVyYWwoJ3RoaXMnKSk7DQpicmVhazsNCmNhc2UgMTA4OnRoaXMuJCA9IG5ldyB5eS5WYWx1ZShuZXcgeXkuTGl0ZXJhbCgndGhpcycpLCBbbmV3IHl5LkFjY2VzcygkJFskMF0pXSwgJ3RoaXMnKTsNCmJyZWFrOw0KY2FzZSAxMDk6dGhpcy4kID0gbmV3IHl5LkFycihbXSk7DQpicmVhazsNCmNhc2UgMTEwOnRoaXMuJCA9IG5ldyB5eS5BcnIoJCRbJDAtMl0pOw0KYnJlYWs7DQpjYXNlIDExMTp0aGlzLiQgPSAnaW5jbHVzaXZlJzsNCmJyZWFrOw0KY2FzZSAxMTI6dGhpcy4kID0gJ2V4Y2x1c2l2ZSc7DQpicmVhazsNCmNhc2UgMTEzOnRoaXMuJCA9IG5ldyB5eS5SYW5nZSgkJFskMC0zXSwgJCRbJDAtMV0sICQkWyQwLTJdKTsNCmJyZWFrOw0KY2FzZSAxMTQ6dGhpcy4kID0gbmV3IHl5LlJhbmdlKCQkWyQwLTJdLCAkJFskMF0sICQkWyQwLTFdKTsNCmJyZWFrOw0KY2FzZSAxMTU6dGhpcy4kID0gbmV3IHl5LlJhbmdlKCQkWyQwLTFdLCBudWxsLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDExNjp0aGlzLiQgPSBuZXcgeXkuUmFuZ2UobnVsbCwgJCRbJDBdLCAkJFskMC0xXSk7DQpicmVhazsNCmNhc2UgMTE3OnRoaXMuJCA9IFskJFskMF1dOw0KYnJlYWs7DQpjYXNlIDExODp0aGlzLiQgPSAkJFskMC0yXS5jb25jYXQoJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSAxMTk6dGhpcy4kID0gJCRbJDAtM10uY29uY2F0KCQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTIwOnRoaXMuJCA9ICQkWyQwLTJdOw0KYnJlYWs7DQpjYXNlIDEyMTp0aGlzLiQgPSAkJFskMC01XS5jb25jYXQoJCRbJDAtMl0pOw0KYnJlYWs7DQpjYXNlIDEyMjp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgMTIzOnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAxMjQ6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDEyNTp0aGlzLiQgPSBbXS5jb25jYXQoJCRbJDAtMl0sICQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTI2OnRoaXMuJCA9IG5ldyB5eS5UcnkoJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSAxMjc6dGhpcy4kID0gbmV3IHl5LlRyeSgkJFskMC0xXSwgJCRbJDBdWzBdLCAkJFskMF1bMV0pOw0KYnJlYWs7DQpjYXNlIDEyODp0aGlzLiQgPSBuZXcgeXkuVHJ5KCQkWyQwLTJdLCBudWxsLCBudWxsLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDEyOTp0aGlzLiQgPSBuZXcgeXkuVHJ5KCQkWyQwLTNdLCAkJFskMC0yXVswXSwgJCRbJDAtMl1bMV0sICQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTMwOnRoaXMuJCA9IFskJFskMC0xXSwgJCRbJDBdXTsNCmJyZWFrOw0KY2FzZSAxMzE6dGhpcy4kID0gbmV3IHl5LlRocm93KCQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTMyOnRoaXMuJCA9IG5ldyB5eS5QYXJlbnMoJCRbJDAtMV0pOw0KYnJlYWs7DQpjYXNlIDEzMzp0aGlzLiQgPSBuZXcgeXkuUGFyZW5zKCQkWyQwLTJdKTsNCmJyZWFrOw0KY2FzZSAxMzQ6dGhpcy4kID0gbmV3IHl5LldoaWxlKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTM1OnRoaXMuJCA9IG5ldyB5eS5XaGlsZSgkJFskMC0yXSwgew0KICAgICAgICAgIGd1YXJkOiAkJFskMF0NCiAgICAgICAgfSk7DQpicmVhazsNCmNhc2UgMTM2OnRoaXMuJCA9IG5ldyB5eS5XaGlsZSgkJFskMF0sIHsNCiAgICAgICAgICBpbnZlcnQ6IHRydWUNCiAgICAgICAgfSk7DQpicmVhazsNCmNhc2UgMTM3OnRoaXMuJCA9IG5ldyB5eS5XaGlsZSgkJFskMC0yXSwgew0KICAgICAgICAgIGludmVydDogdHJ1ZSwNCiAgICAgICAgICBndWFyZDogJCRbJDBdDQogICAgICAgIH0pOw0KYnJlYWs7DQpjYXNlIDEzODp0aGlzLiQgPSAkJFskMC0xXS5hZGRCb2R5KCQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTM5OnRoaXMuJCA9ICQkWyQwXS5hZGRCb2R5KHl5LkJsb2NrLndyYXAoWyQkWyQwLTFdXSkpOw0KYnJlYWs7DQpjYXNlIDE0MDp0aGlzLiQgPSAkJFskMF0uYWRkQm9keSh5eS5CbG9jay53cmFwKFskJFskMC0xXV0pKTsNCmJyZWFrOw0KY2FzZSAxNDE6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDE0Mjp0aGlzLiQgPSBuZXcgeXkuV2hpbGUobmV3IHl5LkxpdGVyYWwoJ3RydWUnKSkuYWRkQm9keSgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE0Mzp0aGlzLiQgPSBuZXcgeXkuV2hpbGUobmV3IHl5LkxpdGVyYWwoJ3RydWUnKSkuYWRkQm9keSh5eS5CbG9jay53cmFwKFskJFskMF1dKSk7DQpicmVhazsNCmNhc2UgMTQ0OnRoaXMuJCA9IG5ldyB5eS5Gb3IoJCRbJDAtMV0sICQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTQ1OnRoaXMuJCA9IG5ldyB5eS5Gb3IoJCRbJDAtMV0sICQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTQ2OnRoaXMuJCA9IG5ldyB5eS5Gb3IoJCRbJDBdLCAkJFskMC0xXSk7DQpicmVhazsNCmNhc2UgMTQ3OnRoaXMuJCA9IHsNCiAgICAgICAgICBzb3VyY2U6IG5ldyB5eS5WYWx1ZSgkJFskMF0pDQogICAgICAgIH07DQpicmVhazsNCmNhc2UgMTQ4OnRoaXMuJCA9IChmdW5jdGlvbiAoKSB7DQogICAgICAgICQkWyQwXS5vd24gPSAkJFskMC0xXS5vd247DQogICAgICAgICQkWyQwXS5uYW1lID0gJCRbJDAtMV1bMF07DQogICAgICAgICQkWyQwXS5pbmRleCA9ICQkWyQwLTFdWzFdOw0KICAgICAgICByZXR1cm4gJCRbJDBdOw0KICAgICAgfSgpKTsNCmJyZWFrOw0KY2FzZSAxNDk6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDE1MDp0aGlzLiQgPSAoZnVuY3Rpb24gKCkgew0KICAgICAgICAkJFskMF0ub3duID0gdHJ1ZTsNCiAgICAgICAgcmV0dXJuICQkWyQwXTsNCiAgICAgIH0oKSk7DQpicmVhazsNCmNhc2UgMTUxOnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAxNTI6dGhpcy4kID0gbmV3IHl5LlZhbHVlKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTUzOnRoaXMuJCA9IG5ldyB5eS5WYWx1ZSgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE1NDp0aGlzLiQgPSBbJCRbJDBdXTsNCmJyZWFrOw0KY2FzZSAxNTU6dGhpcy4kID0gWyQkWyQwLTJdLCAkJFskMF1dOw0KYnJlYWs7DQpjYXNlIDE1Njp0aGlzLiQgPSB7DQogICAgICAgICAgc291cmNlOiAkJFskMF0NCiAgICAgICAgfTsNCmJyZWFrOw0KY2FzZSAxNTc6dGhpcy4kID0gew0KICAgICAgICAgIHNvdXJjZTogJCRbJDBdLA0KICAgICAgICAgIG9iamVjdDogdHJ1ZQ0KICAgICAgICB9Ow0KYnJlYWs7DQpjYXNlIDE1ODp0aGlzLiQgPSB7DQogICAgICAgICAgc291cmNlOiAkJFskMC0yXSwNCiAgICAgICAgICBndWFyZDogJCRbJDBdDQogICAgICAgIH07DQpicmVhazsNCmNhc2UgMTU5OnRoaXMuJCA9IHsNCiAgICAgICAgICBzb3VyY2U6ICQkWyQwLTJdLA0KICAgICAgICAgIGd1YXJkOiAkJFskMF0sDQogICAgICAgICAgb2JqZWN0OiB0cnVlDQogICAgICAgIH07DQpicmVhazsNCmNhc2UgMTYwOnRoaXMuJCA9IHsNCiAgICAgICAgICBzb3VyY2U6ICQkWyQwLTJdLA0KICAgICAgICAgIHN0ZXA6ICQkWyQwXQ0KICAgICAgICB9Ow0KYnJlYWs7DQpjYXNlIDE2MTp0aGlzLiQgPSB7DQogICAgICAgICAgc291cmNlOiAkJFskMC00XSwNCiAgICAgICAgICBndWFyZDogJCRbJDAtMl0sDQogICAgICAgICAgc3RlcDogJCRbJDBdDQogICAgICAgIH07DQpicmVhazsNCmNhc2UgMTYyOnRoaXMuJCA9IHsNCiAgICAgICAgICBzb3VyY2U6ICQkWyQwLTRdLA0KICAgICAgICAgIHN0ZXA6ICQkWyQwLTJdLA0KICAgICAgICAgIGd1YXJkOiAkJFskMF0NCiAgICAgICAgfTsNCmJyZWFrOw0KY2FzZSAxNjM6dGhpcy4kID0gbmV3IHl5LlN3aXRjaCgkJFskMC0zXSwgJCRbJDAtMV0pOw0KYnJlYWs7DQpjYXNlIDE2NDp0aGlzLiQgPSBuZXcgeXkuU3dpdGNoKCQkWyQwLTVdLCAkJFskMC0zXSwgJCRbJDAtMV0pOw0KYnJlYWs7DQpjYXNlIDE2NTp0aGlzLiQgPSBuZXcgeXkuU3dpdGNoKG51bGwsICQkWyQwLTFdKTsNCmJyZWFrOw0KY2FzZSAxNjY6dGhpcy4kID0gbmV3IHl5LlN3aXRjaChudWxsLCAkJFskMC0zXSwgJCRbJDAtMV0pOw0KYnJlYWs7DQpjYXNlIDE2Nzp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgMTY4OnRoaXMuJCA9ICQkWyQwLTFdLmNvbmNhdCgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE2OTp0aGlzLiQgPSBbWyQkWyQwLTFdLCAkJFskMF1dXTsNCmJyZWFrOw0KY2FzZSAxNzA6dGhpcy4kID0gW1skJFskMC0yXSwgJCRbJDAtMV1dXTsNCmJyZWFrOw0KY2FzZSAxNzE6dGhpcy4kID0gbmV3IHl5LklmKCQkWyQwLTFdLCAkJFskMF0sIHsNCiAgICAgICAgICB0eXBlOiAkJFskMC0yXQ0KICAgICAgICB9KTsNCmJyZWFrOw0KY2FzZSAxNzI6dGhpcy4kID0gJCRbJDAtNF0uYWRkRWxzZShuZXcgeXkuSWYoJCRbJDAtMV0sICQkWyQwXSwgew0KICAgICAgICAgIHR5cGU6ICQkWyQwLTJdDQogICAgICAgIH0pKTsNCmJyZWFrOw0KY2FzZSAxNzM6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDE3NDp0aGlzLiQgPSAkJFskMC0yXS5hZGRFbHNlKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTc1OnRoaXMuJCA9IG5ldyB5eS5JZigkJFskMF0sIHl5LkJsb2NrLndyYXAoWyQkWyQwLTJdXSksIHsNCiAgICAgICAgICB0eXBlOiAkJFskMC0xXSwNCiAgICAgICAgICBzdGF0ZW1lbnQ6IHRydWUNCiAgICAgICAgfSk7DQpicmVhazsNCmNhc2UgMTc2OnRoaXMuJCA9IG5ldyB5eS5JZigkJFskMF0sIHl5LkJsb2NrLndyYXAoWyQkWyQwLTJdXSksIHsNCiAgICAgICAgICB0eXBlOiAkJFskMC0xXSwNCiAgICAgICAgICBzdGF0ZW1lbnQ6IHRydWUNCiAgICAgICAgfSk7DQpicmVhazsNCmNhc2UgMTc3OnRoaXMuJCA9IG5ldyB5eS5PcCgkJFskMC0xXSwgJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSAxNzg6dGhpcy4kID0gbmV3IHl5Lk9wKCctJywgJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSAxNzk6dGhpcy4kID0gbmV3IHl5Lk9wKCcrJywgJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSAxODA6dGhpcy4kID0gbmV3IHl5Lk9wKCctLScsICQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTgxOnRoaXMuJCA9IG5ldyB5eS5PcCgnKysnLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE4Mjp0aGlzLiQgPSBuZXcgeXkuT3AoJy0tJywgJCRbJDAtMV0sIG51bGwsIHRydWUpOw0KYnJlYWs7DQpjYXNlIDE4Mzp0aGlzLiQgPSBuZXcgeXkuT3AoJysrJywgJCRbJDAtMV0sIG51bGwsIHRydWUpOw0KYnJlYWs7DQpjYXNlIDE4NDp0aGlzLiQgPSBuZXcgeXkuRXhpc3RlbmNlKCQkWyQwLTFdKTsNCmJyZWFrOw0KY2FzZSAxODU6dGhpcy4kID0gbmV3IHl5Lk9wKCcrJywgJCRbJDAtMl0sICQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTg2OnRoaXMuJCA9IG5ldyB5eS5PcCgnLScsICQkWyQwLTJdLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE4Nzp0aGlzLiQgPSBuZXcgeXkuT3AoJCRbJDAtMV0sICQkWyQwLTJdLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE4ODp0aGlzLiQgPSBuZXcgeXkuT3AoJCRbJDAtMV0sICQkWyQwLTJdLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE4OTp0aGlzLiQgPSBuZXcgeXkuT3AoJCRbJDAtMV0sICQkWyQwLTJdLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE5MDp0aGlzLiQgPSBuZXcgeXkuT3AoJCRbJDAtMV0sICQkWyQwLTJdLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE5MTp0aGlzLiQgPSAoZnVuY3Rpb24gKCkgew0KICAgICAgICBpZiAoJCRbJDAtMV0uY2hhckF0KDApID09PSAnIScpIHsNCiAgICAgICAgICByZXR1cm4gbmV3IHl5Lk9wKCQkWyQwLTFdLnNsaWNlKDEpLCAkJFskMC0yXSwgJCRbJDBdKS5pbnZlcnQoKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICByZXR1cm4gbmV3IHl5Lk9wKCQkWyQwLTFdLCAkJFskMC0yXSwgJCRbJDBdKTsNCiAgICAgICAgfQ0KICAgICAgfSgpKTsNCmJyZWFrOw0KY2FzZSAxOTI6dGhpcy4kID0gbmV3IHl5LkFzc2lnbigkJFskMC0yXSwgJCRbJDBdLCAkJFskMC0xXSk7DQpicmVhazsNCmNhc2UgMTkzOnRoaXMuJCA9IG5ldyB5eS5Bc3NpZ24oJCRbJDAtNF0sICQkWyQwLTFdLCAkJFskMC0zXSk7DQpicmVhazsNCmNhc2UgMTk0OnRoaXMuJCA9IG5ldyB5eS5FeHRlbmRzKCQkWyQwLTJdLCAkJFskMF0pOw0KYnJlYWs7DQp9DQp9LA0KdGFibGU6IFt7MTpbMiwxXSwzOjEsNDoyLDU6Myw3OjQsODo2LDk6NywxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI1OlsxLDVdLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlszXX0sezE6WzIsMl0sNjpbMSw3MV19LHs2OlsxLDcyXX0sezE6WzIsNF0sNjpbMiw0XSwyNjpbMiw0XSw5OTpbMiw0XX0sezQ6NzQsNzo0LDg6Niw5OjcsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNjpbMSw3M10sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsN10sNjpbMiw3XSwyNjpbMiw3XSw5OTpbMiw3XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezE6WzIsOF0sNjpbMiw4XSwyNjpbMiw4XSw5OTpbMiw4XSwxMDA6ODcsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4OCwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODZdfSx7MTpbMiwxM10sNjpbMiwxM10sMjU6WzIsMTNdLDI2OlsyLDEzXSw0NjpbMiwxM10sNTE6WzIsMTNdLDU0OlsyLDEzXSw1OTo5MCw2MzpbMSw5Ml0sNjQ6WzEsOTNdLDY1OlsxLDk0XSw2Njo5NSw2NzpbMSw5Nl0sNjk6WzIsMTNdLDcwOlsxLDk3XSw3MTpbMSw5OF0sNzU6WzIsMTNdLDc4Ojg5LDgxOlsxLDkxXSw4MjpbMiwxMDJdLDgzOlsyLDEzXSw4ODpbMiwxM10sOTA6WzIsMTNdLDk5OlsyLDEzXSwxMDE6WzIsMTNdLDEwMjpbMiwxM10sMTAzOlsyLDEzXSwxMDc6WzIsMTNdLDExNTpbMiwxM10sMTIzOlsyLDEzXSwxMjU6WzIsMTNdLDEyNjpbMiwxM10sMTI5OlsyLDEzXSwxMzA6WzIsMTNdLDEzMTpbMiwxM10sMTMyOlsyLDEzXSwxMzM6WzIsMTNdLDEzNDpbMiwxM119LHsxOlsyLDE0XSw2OlsyLDE0XSwyNTpbMiwxNF0sMjY6WzIsMTRdLDQ2OlsyLDE0XSw1MTpbMiwxNF0sNTQ6WzIsMTRdLDU5OjEwMCw2MzpbMSw5Ml0sNjQ6WzEsOTNdLDY1OlsxLDk0XSw2Njo5NSw2NzpbMSw5Nl0sNjk6WzIsMTRdLDcwOlsxLDk3XSw3MTpbMSw5OF0sNzU6WzIsMTRdLDc4Ojk5LDgxOlsxLDkxXSw4MjpbMiwxMDJdLDgzOlsyLDE0XSw4ODpbMiwxNF0sOTA6WzIsMTRdLDk5OlsyLDE0XSwxMDE6WzIsMTRdLDEwMjpbMiwxNF0sMTAzOlsyLDE0XSwxMDc6WzIsMTRdLDExNTpbMiwxNF0sMTIzOlsyLDE0XSwxMjU6WzIsMTRdLDEyNjpbMiwxNF0sMTI5OlsyLDE0XSwxMzA6WzIsMTRdLDEzMTpbMiwxNF0sMTMyOlsyLDE0XSwxMzM6WzIsMTRdLDEzNDpbMiwxNF19LHsxOlsyLDE1XSw2OlsyLDE1XSwyNTpbMiwxNV0sMjY6WzIsMTVdLDQ2OlsyLDE1XSw1MTpbMiwxNV0sNTQ6WzIsMTVdLDY5OlsyLDE1XSw3NTpbMiwxNV0sODM6WzIsMTVdLDg4OlsyLDE1XSw5MDpbMiwxNV0sOTk6WzIsMTVdLDEwMTpbMiwxNV0sMTAyOlsyLDE1XSwxMDM6WzIsMTVdLDEwNzpbMiwxNV0sMTE1OlsyLDE1XSwxMjM6WzIsMTVdLDEyNTpbMiwxNV0sMTI2OlsyLDE1XSwxMjk6WzIsMTVdLDEzMDpbMiwxNV0sMTMxOlsyLDE1XSwxMzI6WzIsMTVdLDEzMzpbMiwxNV0sMTM0OlsyLDE1XX0sezE6WzIsMTZdLDY6WzIsMTZdLDI1OlsyLDE2XSwyNjpbMiwxNl0sNDY6WzIsMTZdLDUxOlsyLDE2XSw1NDpbMiwxNl0sNjk6WzIsMTZdLDc1OlsyLDE2XSw4MzpbMiwxNl0sODg6WzIsMTZdLDkwOlsyLDE2XSw5OTpbMiwxNl0sMTAxOlsyLDE2XSwxMDI6WzIsMTZdLDEwMzpbMiwxNl0sMTA3OlsyLDE2XSwxMTU6WzIsMTZdLDEyMzpbMiwxNl0sMTI1OlsyLDE2XSwxMjY6WzIsMTZdLDEyOTpbMiwxNl0sMTMwOlsyLDE2XSwxMzE6WzIsMTZdLDEzMjpbMiwxNl0sMTMzOlsyLDE2XSwxMzQ6WzIsMTZdfSx7MTpbMiwxN10sNjpbMiwxN10sMjU6WzIsMTddLDI2OlsyLDE3XSw0NjpbMiwxN10sNTE6WzIsMTddLDU0OlsyLDE3XSw2OTpbMiwxN10sNzU6WzIsMTddLDgzOlsyLDE3XSw4ODpbMiwxN10sOTA6WzIsMTddLDk5OlsyLDE3XSwxMDE6WzIsMTddLDEwMjpbMiwxN10sMTAzOlsyLDE3XSwxMDc6WzIsMTddLDExNTpbMiwxN10sMTIzOlsyLDE3XSwxMjU6WzIsMTddLDEyNjpbMiwxN10sMTI5OlsyLDE3XSwxMzA6WzIsMTddLDEzMTpbMiwxN10sMTMyOlsyLDE3XSwxMzM6WzIsMTddLDEzNDpbMiwxN119LHsxOlsyLDE4XSw2OlsyLDE4XSwyNTpbMiwxOF0sMjY6WzIsMThdLDQ2OlsyLDE4XSw1MTpbMiwxOF0sNTQ6WzIsMThdLDY5OlsyLDE4XSw3NTpbMiwxOF0sODM6WzIsMThdLDg4OlsyLDE4XSw5MDpbMiwxOF0sOTk6WzIsMThdLDEwMTpbMiwxOF0sMTAyOlsyLDE4XSwxMDM6WzIsMThdLDEwNzpbMiwxOF0sMTE1OlsyLDE4XSwxMjM6WzIsMThdLDEyNTpbMiwxOF0sMTI2OlsyLDE4XSwxMjk6WzIsMThdLDEzMDpbMiwxOF0sMTMxOlsyLDE4XSwxMzI6WzIsMThdLDEzMzpbMiwxOF0sMTM0OlsyLDE4XX0sezE6WzIsMTldLDY6WzIsMTldLDI1OlsyLDE5XSwyNjpbMiwxOV0sNDY6WzIsMTldLDUxOlsyLDE5XSw1NDpbMiwxOV0sNjk6WzIsMTldLDc1OlsyLDE5XSw4MzpbMiwxOV0sODg6WzIsMTldLDkwOlsyLDE5XSw5OTpbMiwxOV0sMTAxOlsyLDE5XSwxMDI6WzIsMTldLDEwMzpbMiwxOV0sMTA3OlsyLDE5XSwxMTU6WzIsMTldLDEyMzpbMiwxOV0sMTI1OlsyLDE5XSwxMjY6WzIsMTldLDEyOTpbMiwxOV0sMTMwOlsyLDE5XSwxMzE6WzIsMTldLDEzMjpbMiwxOV0sMTMzOlsyLDE5XSwxMzQ6WzIsMTldfSx7MTpbMiwyMF0sNjpbMiwyMF0sMjU6WzIsMjBdLDI2OlsyLDIwXSw0NjpbMiwyMF0sNTE6WzIsMjBdLDU0OlsyLDIwXSw2OTpbMiwyMF0sNzU6WzIsMjBdLDgzOlsyLDIwXSw4ODpbMiwyMF0sOTA6WzIsMjBdLDk5OlsyLDIwXSwxMDE6WzIsMjBdLDEwMjpbMiwyMF0sMTAzOlsyLDIwXSwxMDc6WzIsMjBdLDExNTpbMiwyMF0sMTIzOlsyLDIwXSwxMjU6WzIsMjBdLDEyNjpbMiwyMF0sMTI5OlsyLDIwXSwxMzA6WzIsMjBdLDEzMTpbMiwyMF0sMTMyOlsyLDIwXSwxMzM6WzIsMjBdLDEzNDpbMiwyMF19LHsxOlsyLDIxXSw2OlsyLDIxXSwyNTpbMiwyMV0sMjY6WzIsMjFdLDQ2OlsyLDIxXSw1MTpbMiwyMV0sNTQ6WzIsMjFdLDY5OlsyLDIxXSw3NTpbMiwyMV0sODM6WzIsMjFdLDg4OlsyLDIxXSw5MDpbMiwyMV0sOTk6WzIsMjFdLDEwMTpbMiwyMV0sMTAyOlsyLDIxXSwxMDM6WzIsMjFdLDEwNzpbMiwyMV0sMTE1OlsyLDIxXSwxMjM6WzIsMjFdLDEyNTpbMiwyMV0sMTI2OlsyLDIxXSwxMjk6WzIsMjFdLDEzMDpbMiwyMV0sMTMxOlsyLDIxXSwxMzI6WzIsMjFdLDEzMzpbMiwyMV0sMTM0OlsyLDIxXX0sezE6WzIsMjJdLDY6WzIsMjJdLDI1OlsyLDIyXSwyNjpbMiwyMl0sNDY6WzIsMjJdLDUxOlsyLDIyXSw1NDpbMiwyMl0sNjk6WzIsMjJdLDc1OlsyLDIyXSw4MzpbMiwyMl0sODg6WzIsMjJdLDkwOlsyLDIyXSw5OTpbMiwyMl0sMTAxOlsyLDIyXSwxMDI6WzIsMjJdLDEwMzpbMiwyMl0sMTA3OlsyLDIyXSwxMTU6WzIsMjJdLDEyMzpbMiwyMl0sMTI1OlsyLDIyXSwxMjY6WzIsMjJdLDEyOTpbMiwyMl0sMTMwOlsyLDIyXSwxMzE6WzIsMjJdLDEzMjpbMiwyMl0sMTMzOlsyLDIyXSwxMzQ6WzIsMjJdfSx7MTpbMiwyM10sNjpbMiwyM10sMjU6WzIsMjNdLDI2OlsyLDIzXSw0NjpbMiwyM10sNTE6WzIsMjNdLDU0OlsyLDIzXSw2OTpbMiwyM10sNzU6WzIsMjNdLDgzOlsyLDIzXSw4ODpbMiwyM10sOTA6WzIsMjNdLDk5OlsyLDIzXSwxMDE6WzIsMjNdLDEwMjpbMiwyM10sMTAzOlsyLDIzXSwxMDc6WzIsMjNdLDExNTpbMiwyM10sMTIzOlsyLDIzXSwxMjU6WzIsMjNdLDEyNjpbMiwyM10sMTI5OlsyLDIzXSwxMzA6WzIsMjNdLDEzMTpbMiwyM10sMTMyOlsyLDIzXSwxMzM6WzIsMjNdLDEzNDpbMiwyM119LHsxOlsyLDldLDY6WzIsOV0sMjY6WzIsOV0sOTk6WzIsOV0sMTAxOlsyLDldLDEwMzpbMiw5XSwxMDc6WzIsOV0sMTIzOlsyLDldfSx7MTpbMiwxMF0sNjpbMiwxMF0sMjY6WzIsMTBdLDk5OlsyLDEwXSwxMDE6WzIsMTBdLDEwMzpbMiwxMF0sMTA3OlsyLDEwXSwxMjM6WzIsMTBdfSx7MTpbMiwxMV0sNjpbMiwxMV0sMjY6WzIsMTFdLDk5OlsyLDExXSwxMDE6WzIsMTFdLDEwMzpbMiwxMV0sMTA3OlsyLDExXSwxMjM6WzIsMTFdfSx7MTpbMiwxMl0sNjpbMiwxMl0sMjY6WzIsMTJdLDk5OlsyLDEyXSwxMDE6WzIsMTJdLDEwMzpbMiwxMl0sMTA3OlsyLDEyXSwxMjM6WzIsMTJdfSx7MTpbMiw2OV0sNjpbMiw2OV0sMjU6WzIsNjldLDI2OlsyLDY5XSwzNzpbMSwxMDFdLDQ2OlsyLDY5XSw1MTpbMiw2OV0sNTQ6WzIsNjldLDYzOlsyLDY5XSw2NDpbMiw2OV0sNjU6WzIsNjldLDY3OlsyLDY5XSw2OTpbMiw2OV0sNzA6WzIsNjldLDcxOlsyLDY5XSw3NTpbMiw2OV0sODE6WzIsNjldLDgyOlsyLDY5XSw4MzpbMiw2OV0sODg6WzIsNjldLDkwOlsyLDY5XSw5OTpbMiw2OV0sMTAxOlsyLDY5XSwxMDI6WzIsNjldLDEwMzpbMiw2OV0sMTA3OlsyLDY5XSwxMTU6WzIsNjldLDEyMzpbMiw2OV0sMTI1OlsyLDY5XSwxMjY6WzIsNjldLDEyOTpbMiw2OV0sMTMwOlsyLDY5XSwxMzE6WzIsNjldLDEzMjpbMiw2OV0sMTMzOlsyLDY5XSwxMzQ6WzIsNjldfSx7MTpbMiw3MF0sNjpbMiw3MF0sMjU6WzIsNzBdLDI2OlsyLDcwXSw0NjpbMiw3MF0sNTE6WzIsNzBdLDU0OlsyLDcwXSw2MzpbMiw3MF0sNjQ6WzIsNzBdLDY1OlsyLDcwXSw2NzpbMiw3MF0sNjk6WzIsNzBdLDcwOlsyLDcwXSw3MTpbMiw3MF0sNzU6WzIsNzBdLDgxOlsyLDcwXSw4MjpbMiw3MF0sODM6WzIsNzBdLDg4OlsyLDcwXSw5MDpbMiw3MF0sOTk6WzIsNzBdLDEwMTpbMiw3MF0sMTAyOlsyLDcwXSwxMDM6WzIsNzBdLDEwNzpbMiw3MF0sMTE1OlsyLDcwXSwxMjM6WzIsNzBdLDEyNTpbMiw3MF0sMTI2OlsyLDcwXSwxMjk6WzIsNzBdLDEzMDpbMiw3MF0sMTMxOlsyLDcwXSwxMzI6WzIsNzBdLDEzMzpbMiw3MF0sMTM0OlsyLDcwXX0sezE6WzIsNzFdLDY6WzIsNzFdLDI1OlsyLDcxXSwyNjpbMiw3MV0sNDY6WzIsNzFdLDUxOlsyLDcxXSw1NDpbMiw3MV0sNjM6WzIsNzFdLDY0OlsyLDcxXSw2NTpbMiw3MV0sNjc6WzIsNzFdLDY5OlsyLDcxXSw3MDpbMiw3MV0sNzE6WzIsNzFdLDc1OlsyLDcxXSw4MTpbMiw3MV0sODI6WzIsNzFdLDgzOlsyLDcxXSw4ODpbMiw3MV0sOTA6WzIsNzFdLDk5OlsyLDcxXSwxMDE6WzIsNzFdLDEwMjpbMiw3MV0sMTAzOlsyLDcxXSwxMDc6WzIsNzFdLDExNTpbMiw3MV0sMTIzOlsyLDcxXSwxMjU6WzIsNzFdLDEyNjpbMiw3MV0sMTI5OlsyLDcxXSwxMzA6WzIsNzFdLDEzMTpbMiw3MV0sMTMyOlsyLDcxXSwxMzM6WzIsNzFdLDEzNDpbMiw3MV19LHsxOlsyLDcyXSw2OlsyLDcyXSwyNTpbMiw3Ml0sMjY6WzIsNzJdLDQ2OlsyLDcyXSw1MTpbMiw3Ml0sNTQ6WzIsNzJdLDYzOlsyLDcyXSw2NDpbMiw3Ml0sNjU6WzIsNzJdLDY3OlsyLDcyXSw2OTpbMiw3Ml0sNzA6WzIsNzJdLDcxOlsyLDcyXSw3NTpbMiw3Ml0sODE6WzIsNzJdLDgyOlsyLDcyXSw4MzpbMiw3Ml0sODg6WzIsNzJdLDkwOlsyLDcyXSw5OTpbMiw3Ml0sMTAxOlsyLDcyXSwxMDI6WzIsNzJdLDEwMzpbMiw3Ml0sMTA3OlsyLDcyXSwxMTU6WzIsNzJdLDEyMzpbMiw3Ml0sMTI1OlsyLDcyXSwxMjY6WzIsNzJdLDEyOTpbMiw3Ml0sMTMwOlsyLDcyXSwxMzE6WzIsNzJdLDEzMjpbMiw3Ml0sMTMzOlsyLDcyXSwxMzQ6WzIsNzJdfSx7MTpbMiw3M10sNjpbMiw3M10sMjU6WzIsNzNdLDI2OlsyLDczXSw0NjpbMiw3M10sNTE6WzIsNzNdLDU0OlsyLDczXSw2MzpbMiw3M10sNjQ6WzIsNzNdLDY1OlsyLDczXSw2NzpbMiw3M10sNjk6WzIsNzNdLDcwOlsyLDczXSw3MTpbMiw3M10sNzU6WzIsNzNdLDgxOlsyLDczXSw4MjpbMiw3M10sODM6WzIsNzNdLDg4OlsyLDczXSw5MDpbMiw3M10sOTk6WzIsNzNdLDEwMTpbMiw3M10sMTAyOlsyLDczXSwxMDM6WzIsNzNdLDEwNzpbMiw3M10sMTE1OlsyLDczXSwxMjM6WzIsNzNdLDEyNTpbMiw3M10sMTI2OlsyLDczXSwxMjk6WzIsNzNdLDEzMDpbMiw3M10sMTMxOlsyLDczXSwxMzI6WzIsNzNdLDEzMzpbMiw3M10sMTM0OlsyLDczXX0sezE6WzIsMTAwXSw2OlsyLDEwMF0sMjU6WzIsMTAwXSwyNjpbMiwxMDBdLDQ2OlsyLDEwMF0sNTE6WzIsMTAwXSw1NDpbMiwxMDBdLDYzOlsyLDEwMF0sNjQ6WzIsMTAwXSw2NTpbMiwxMDBdLDY3OlsyLDEwMF0sNjk6WzIsMTAwXSw3MDpbMiwxMDBdLDcxOlsyLDEwMF0sNzU6WzIsMTAwXSw3OToxMDIsODE6WzIsMTAwXSw4MjpbMSwxMDNdLDgzOlsyLDEwMF0sODg6WzIsMTAwXSw5MDpbMiwxMDBdLDk5OlsyLDEwMF0sMTAxOlsyLDEwMF0sMTAyOlsyLDEwMF0sMTAzOlsyLDEwMF0sMTA3OlsyLDEwMF0sMTE1OlsyLDEwMF0sMTIzOlsyLDEwMF0sMTI1OlsyLDEwMF0sMTI2OlsyLDEwMF0sMTI5OlsyLDEwMF0sMTMwOlsyLDEwMF0sMTMxOlsyLDEwMF0sMTMyOlsyLDEwMF0sMTMzOlsyLDEwMF0sMTM0OlsyLDEwMF19LHsyNzoxMDcsMjg6WzEsNzBdLDQxOjEwOCw0NToxMDQsNDY6WzIsNTFdLDUxOlsyLDUxXSw1MjoxMDUsNTM6MTA2LDU1OjEwOSw1NjoxMTAsNzM6WzEsNjddLDg2OlsxLDExMV0sODc6WzEsMTEyXX0sezU6MTEzLDI1OlsxLDVdfSx7ODoxMTQsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxMTYsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxMTcsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTQ6MTE5LDE1OjEyMCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoxMjEsNDE6NjAsNTU6NDcsNTY6NDgsNTg6MTE4LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTg6WzEsNTNdfSx7MTQ6MTE5LDE1OjEyMCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoxMjEsNDE6NjAsNTU6NDcsNTY6NDgsNTg6MTIyLDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTg6WzEsNTNdfSx7MTpbMiw2Nl0sNjpbMiw2Nl0sMjU6WzIsNjZdLDI2OlsyLDY2XSwzNzpbMiw2Nl0sNDY6WzIsNjZdLDUxOlsyLDY2XSw1NDpbMiw2Nl0sNjM6WzIsNjZdLDY0OlsyLDY2XSw2NTpbMiw2Nl0sNjc6WzIsNjZdLDY5OlsyLDY2XSw3MDpbMiw2Nl0sNzE6WzIsNjZdLDc1OlsyLDY2XSw3NzpbMSwxMjZdLDgxOlsyLDY2XSw4MjpbMiw2Nl0sODM6WzIsNjZdLDg4OlsyLDY2XSw5MDpbMiw2Nl0sOTk6WzIsNjZdLDEwMTpbMiw2Nl0sMTAyOlsyLDY2XSwxMDM6WzIsNjZdLDEwNzpbMiw2Nl0sMTE1OlsyLDY2XSwxMjM6WzIsNjZdLDEyNTpbMiw2Nl0sMTI2OlsyLDY2XSwxMjc6WzEsMTIzXSwxMjg6WzEsMTI0XSwxMjk6WzIsNjZdLDEzMDpbMiw2Nl0sMTMxOlsyLDY2XSwxMzI6WzIsNjZdLDEzMzpbMiw2Nl0sMTM0OlsyLDY2XSwxMzU6WzEsMTI1XX0sezE6WzIsMTczXSw2OlsyLDE3M10sMjU6WzIsMTczXSwyNjpbMiwxNzNdLDQ2OlsyLDE3M10sNTE6WzIsMTczXSw1NDpbMiwxNzNdLDY5OlsyLDE3M10sNzU6WzIsMTczXSw4MzpbMiwxNzNdLDg4OlsyLDE3M10sOTA6WzIsMTczXSw5OTpbMiwxNzNdLDEwMTpbMiwxNzNdLDEwMjpbMiwxNzNdLDEwMzpbMiwxNzNdLDEwNzpbMiwxNzNdLDExNTpbMiwxNzNdLDExODpbMSwxMjddLDEyMzpbMiwxNzNdLDEyNTpbMiwxNzNdLDEyNjpbMiwxNzNdLDEyOTpbMiwxNzNdLDEzMDpbMiwxNzNdLDEzMTpbMiwxNzNdLDEzMjpbMiwxNzNdLDEzMzpbMiwxNzNdLDEzNDpbMiwxNzNdfSx7NToxMjgsMjU6WzEsNV19LHs1OjEyOSwyNTpbMSw1XX0sezE6WzIsMTQxXSw2OlsyLDE0MV0sMjU6WzIsMTQxXSwyNjpbMiwxNDFdLDQ2OlsyLDE0MV0sNTE6WzIsMTQxXSw1NDpbMiwxNDFdLDY5OlsyLDE0MV0sNzU6WzIsMTQxXSw4MzpbMiwxNDFdLDg4OlsyLDE0MV0sOTA6WzIsMTQxXSw5OTpbMiwxNDFdLDEwMTpbMiwxNDFdLDEwMjpbMiwxNDFdLDEwMzpbMiwxNDFdLDEwNzpbMiwxNDFdLDExNTpbMiwxNDFdLDEyMzpbMiwxNDFdLDEyNTpbMiwxNDFdLDEyNjpbMiwxNDFdLDEyOTpbMiwxNDFdLDEzMDpbMiwxNDFdLDEzMTpbMiwxNDFdLDEzMjpbMiwxNDFdLDEzMzpbMiwxNDFdLDEzNDpbMiwxNDFdfSx7NToxMzAsMjU6WzEsNV19LHs4OjEzMSw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI1OlsxLDEzMl0sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsOTBdLDU6MTMzLDY6WzIsOTBdLDE0OjExOSwxNToxMjAsMjU6WzEsNV0sMjY6WzIsOTBdLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjEyMSw0MTo2MCw0NjpbMiw5MF0sNTE6WzIsOTBdLDU0OlsyLDkwXSw1NTo0Nyw1Njo0OCw1ODoxMzUsNjA6MjUsNjE6MjYsNjI6MjcsNjk6WzIsOTBdLDczOlsxLDY3XSw3NTpbMiw5MF0sNzc6WzEsMTM0XSw4MDpbMSwyOF0sODM6WzIsOTBdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDg4OlsyLDkwXSw5MDpbMiw5MF0sOTg6WzEsNTNdLDk5OlsyLDkwXSwxMDE6WzIsOTBdLDEwMjpbMiw5MF0sMTAzOlsyLDkwXSwxMDc6WzIsOTBdLDExNTpbMiw5MF0sMTIzOlsyLDkwXSwxMjU6WzIsOTBdLDEyNjpbMiw5MF0sMTI5OlsyLDkwXSwxMzA6WzIsOTBdLDEzMTpbMiw5MF0sMTMyOlsyLDkwXSwxMzM6WzIsOTBdLDEzNDpbMiw5MF19LHsxOlsyLDQzXSw2OlsyLDQzXSw4OjEzNiw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI2OlsyLDQzXSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDk5OlsyLDQzXSwxMDA6MzksMTAxOlsyLDQzXSwxMDM6WzIsNDNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzIsNDNdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyMzpbMiw0M10sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxMzcsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTpbMiw0NF0sNjpbMiw0NF0sMjU6WzIsNDRdLDI2OlsyLDQ0XSw1MTpbMiw0NF0sNzU6WzIsNDRdLDk5OlsyLDQ0XSwxMDE6WzIsNDRdLDEwMzpbMiw0NF0sMTA3OlsyLDQ0XSwxMjM6WzIsNDRdfSx7MTpbMiw2N10sNjpbMiw2N10sMjU6WzIsNjddLDI2OlsyLDY3XSwzNzpbMiw2N10sNDY6WzIsNjddLDUxOlsyLDY3XSw1NDpbMiw2N10sNjM6WzIsNjddLDY0OlsyLDY3XSw2NTpbMiw2N10sNjc6WzIsNjddLDY5OlsyLDY3XSw3MDpbMiw2N10sNzE6WzIsNjddLDc1OlsyLDY3XSw4MTpbMiw2N10sODI6WzIsNjddLDgzOlsyLDY3XSw4ODpbMiw2N10sOTA6WzIsNjddLDk5OlsyLDY3XSwxMDE6WzIsNjddLDEwMjpbMiw2N10sMTAzOlsyLDY3XSwxMDc6WzIsNjddLDExNTpbMiw2N10sMTIzOlsyLDY3XSwxMjU6WzIsNjddLDEyNjpbMiw2N10sMTI5OlsyLDY3XSwxMzA6WzIsNjddLDEzMTpbMiw2N10sMTMyOlsyLDY3XSwxMzM6WzIsNjddLDEzNDpbMiw2N119LHsxOlsyLDY4XSw2OlsyLDY4XSwyNTpbMiw2OF0sMjY6WzIsNjhdLDM3OlsyLDY4XSw0NjpbMiw2OF0sNTE6WzIsNjhdLDU0OlsyLDY4XSw2MzpbMiw2OF0sNjQ6WzIsNjhdLDY1OlsyLDY4XSw2NzpbMiw2OF0sNjk6WzIsNjhdLDcwOlsyLDY4XSw3MTpbMiw2OF0sNzU6WzIsNjhdLDgxOlsyLDY4XSw4MjpbMiw2OF0sODM6WzIsNjhdLDg4OlsyLDY4XSw5MDpbMiw2OF0sOTk6WzIsNjhdLDEwMTpbMiw2OF0sMTAyOlsyLDY4XSwxMDM6WzIsNjhdLDEwNzpbMiw2OF0sMTE1OlsyLDY4XSwxMjM6WzIsNjhdLDEyNTpbMiw2OF0sMTI2OlsyLDY4XSwxMjk6WzIsNjhdLDEzMDpbMiw2OF0sMTMxOlsyLDY4XSwxMzI6WzIsNjhdLDEzMzpbMiw2OF0sMTM0OlsyLDY4XX0sezE6WzIsMjldLDY6WzIsMjldLDI1OlsyLDI5XSwyNjpbMiwyOV0sNDY6WzIsMjldLDUxOlsyLDI5XSw1NDpbMiwyOV0sNjM6WzIsMjldLDY0OlsyLDI5XSw2NTpbMiwyOV0sNjc6WzIsMjldLDY5OlsyLDI5XSw3MDpbMiwyOV0sNzE6WzIsMjldLDc1OlsyLDI5XSw4MTpbMiwyOV0sODI6WzIsMjldLDgzOlsyLDI5XSw4ODpbMiwyOV0sOTA6WzIsMjldLDk5OlsyLDI5XSwxMDE6WzIsMjldLDEwMjpbMiwyOV0sMTAzOlsyLDI5XSwxMDc6WzIsMjldLDExNTpbMiwyOV0sMTIzOlsyLDI5XSwxMjU6WzIsMjldLDEyNjpbMiwyOV0sMTI5OlsyLDI5XSwxMzA6WzIsMjldLDEzMTpbMiwyOV0sMTMyOlsyLDI5XSwxMzM6WzIsMjldLDEzNDpbMiwyOV19LHsxOlsyLDMwXSw2OlsyLDMwXSwyNTpbMiwzMF0sMjY6WzIsMzBdLDQ2OlsyLDMwXSw1MTpbMiwzMF0sNTQ6WzIsMzBdLDYzOlsyLDMwXSw2NDpbMiwzMF0sNjU6WzIsMzBdLDY3OlsyLDMwXSw2OTpbMiwzMF0sNzA6WzIsMzBdLDcxOlsyLDMwXSw3NTpbMiwzMF0sODE6WzIsMzBdLDgyOlsyLDMwXSw4MzpbMiwzMF0sODg6WzIsMzBdLDkwOlsyLDMwXSw5OTpbMiwzMF0sMTAxOlsyLDMwXSwxMDI6WzIsMzBdLDEwMzpbMiwzMF0sMTA3OlsyLDMwXSwxMTU6WzIsMzBdLDEyMzpbMiwzMF0sMTI1OlsyLDMwXSwxMjY6WzIsMzBdLDEyOTpbMiwzMF0sMTMwOlsyLDMwXSwxMzE6WzIsMzBdLDEzMjpbMiwzMF0sMTMzOlsyLDMwXSwxMzQ6WzIsMzBdfSx7MTpbMiwzMV0sNjpbMiwzMV0sMjU6WzIsMzFdLDI2OlsyLDMxXSw0NjpbMiwzMV0sNTE6WzIsMzFdLDU0OlsyLDMxXSw2MzpbMiwzMV0sNjQ6WzIsMzFdLDY1OlsyLDMxXSw2NzpbMiwzMV0sNjk6WzIsMzFdLDcwOlsyLDMxXSw3MTpbMiwzMV0sNzU6WzIsMzFdLDgxOlsyLDMxXSw4MjpbMiwzMV0sODM6WzIsMzFdLDg4OlsyLDMxXSw5MDpbMiwzMV0sOTk6WzIsMzFdLDEwMTpbMiwzMV0sMTAyOlsyLDMxXSwxMDM6WzIsMzFdLDEwNzpbMiwzMV0sMTE1OlsyLDMxXSwxMjM6WzIsMzFdLDEyNTpbMiwzMV0sMTI2OlsyLDMxXSwxMjk6WzIsMzFdLDEzMDpbMiwzMV0sMTMxOlsyLDMxXSwxMzI6WzIsMzFdLDEzMzpbMiwzMV0sMTM0OlsyLDMxXX0sezE6WzIsMzJdLDY6WzIsMzJdLDI1OlsyLDMyXSwyNjpbMiwzMl0sNDY6WzIsMzJdLDUxOlsyLDMyXSw1NDpbMiwzMl0sNjM6WzIsMzJdLDY0OlsyLDMyXSw2NTpbMiwzMl0sNjc6WzIsMzJdLDY5OlsyLDMyXSw3MDpbMiwzMl0sNzE6WzIsMzJdLDc1OlsyLDMyXSw4MTpbMiwzMl0sODI6WzIsMzJdLDgzOlsyLDMyXSw4ODpbMiwzMl0sOTA6WzIsMzJdLDk5OlsyLDMyXSwxMDE6WzIsMzJdLDEwMjpbMiwzMl0sMTAzOlsyLDMyXSwxMDc6WzIsMzJdLDExNTpbMiwzMl0sMTIzOlsyLDMyXSwxMjU6WzIsMzJdLDEyNjpbMiwzMl0sMTI5OlsyLDMyXSwxMzA6WzIsMzJdLDEzMTpbMiwzMl0sMTMyOlsyLDMyXSwxMzM6WzIsMzJdLDEzNDpbMiwzMl19LHs0OjEzOCw3OjQsODo2LDk6NywxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI1OlsxLDEzOV0sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTQwLDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjU6WzEsMTQ0XSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU3OjE0NSw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NDoxNDIsODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sODg6WzEsMTQxXSw5MToxNDMsOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDEwNl0sNjpbMiwxMDZdLDI1OlsyLDEwNl0sMjY6WzIsMTA2XSw0NjpbMiwxMDZdLDUxOlsyLDEwNl0sNTQ6WzIsMTA2XSw2MzpbMiwxMDZdLDY0OlsyLDEwNl0sNjU6WzIsMTA2XSw2NzpbMiwxMDZdLDY5OlsyLDEwNl0sNzA6WzIsMTA2XSw3MTpbMiwxMDZdLDc1OlsyLDEwNl0sODE6WzIsMTA2XSw4MjpbMiwxMDZdLDgzOlsyLDEwNl0sODg6WzIsMTA2XSw5MDpbMiwxMDZdLDk5OlsyLDEwNl0sMTAxOlsyLDEwNl0sMTAyOlsyLDEwNl0sMTAzOlsyLDEwNl0sMTA3OlsyLDEwNl0sMTE1OlsyLDEwNl0sMTIzOlsyLDEwNl0sMTI1OlsyLDEwNl0sMTI2OlsyLDEwNl0sMTI5OlsyLDEwNl0sMTMwOlsyLDEwNl0sMTMxOlsyLDEwNl0sMTMyOlsyLDEwNl0sMTMzOlsyLDEwNl0sMTM0OlsyLDEwNl19LHsxOlsyLDEwN10sNjpbMiwxMDddLDI1OlsyLDEwN10sMjY6WzIsMTA3XSwyNzoxNDYsMjg6WzEsNzBdLDQ2OlsyLDEwN10sNTE6WzIsMTA3XSw1NDpbMiwxMDddLDYzOlsyLDEwN10sNjQ6WzIsMTA3XSw2NTpbMiwxMDddLDY3OlsyLDEwN10sNjk6WzIsMTA3XSw3MDpbMiwxMDddLDcxOlsyLDEwN10sNzU6WzIsMTA3XSw4MTpbMiwxMDddLDgyOlsyLDEwN10sODM6WzIsMTA3XSw4ODpbMiwxMDddLDkwOlsyLDEwN10sOTk6WzIsMTA3XSwxMDE6WzIsMTA3XSwxMDI6WzIsMTA3XSwxMDM6WzIsMTA3XSwxMDc6WzIsMTA3XSwxMTU6WzIsMTA3XSwxMjM6WzIsMTA3XSwxMjU6WzIsMTA3XSwxMjY6WzIsMTA3XSwxMjk6WzIsMTA3XSwxMzA6WzIsMTA3XSwxMzE6WzIsMTA3XSwxMzI6WzIsMTA3XSwxMzM6WzIsMTA3XSwxMzQ6WzIsMTA3XX0sezI1OlsyLDQ3XX0sezI1OlsyLDQ4XX0sezE6WzIsNjJdLDY6WzIsNjJdLDI1OlsyLDYyXSwyNjpbMiw2Ml0sMzc6WzIsNjJdLDQ2OlsyLDYyXSw1MTpbMiw2Ml0sNTQ6WzIsNjJdLDYzOlsyLDYyXSw2NDpbMiw2Ml0sNjU6WzIsNjJdLDY3OlsyLDYyXSw2OTpbMiw2Ml0sNzA6WzIsNjJdLDcxOlsyLDYyXSw3NTpbMiw2Ml0sNzc6WzIsNjJdLDgxOlsyLDYyXSw4MjpbMiw2Ml0sODM6WzIsNjJdLDg4OlsyLDYyXSw5MDpbMiw2Ml0sOTk6WzIsNjJdLDEwMTpbMiw2Ml0sMTAyOlsyLDYyXSwxMDM6WzIsNjJdLDEwNzpbMiw2Ml0sMTE1OlsyLDYyXSwxMjM6WzIsNjJdLDEyNTpbMiw2Ml0sMTI2OlsyLDYyXSwxMjc6WzIsNjJdLDEyODpbMiw2Ml0sMTI5OlsyLDYyXSwxMzA6WzIsNjJdLDEzMTpbMiw2Ml0sMTMyOlsyLDYyXSwxMzM6WzIsNjJdLDEzNDpbMiw2Ml0sMTM1OlsyLDYyXX0sezE6WzIsNjVdLDY6WzIsNjVdLDI1OlsyLDY1XSwyNjpbMiw2NV0sMzc6WzIsNjVdLDQ2OlsyLDY1XSw1MTpbMiw2NV0sNTQ6WzIsNjVdLDYzOlsyLDY1XSw2NDpbMiw2NV0sNjU6WzIsNjVdLDY3OlsyLDY1XSw2OTpbMiw2NV0sNzA6WzIsNjVdLDcxOlsyLDY1XSw3NTpbMiw2NV0sNzc6WzIsNjVdLDgxOlsyLDY1XSw4MjpbMiw2NV0sODM6WzIsNjVdLDg4OlsyLDY1XSw5MDpbMiw2NV0sOTk6WzIsNjVdLDEwMTpbMiw2NV0sMTAyOlsyLDY1XSwxMDM6WzIsNjVdLDEwNzpbMiw2NV0sMTE1OlsyLDY1XSwxMjM6WzIsNjVdLDEyNTpbMiw2NV0sMTI2OlsyLDY1XSwxMjc6WzIsNjVdLDEyODpbMiw2NV0sMTI5OlsyLDY1XSwxMzA6WzIsNjVdLDEzMTpbMiw2NV0sMTMyOlsyLDY1XSwxMzM6WzIsNjVdLDEzNDpbMiw2NV0sMTM1OlsyLDY1XX0sezg6MTQ3LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTQ4LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTQ5LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezU6MTUwLDg6MTUxLDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjU6WzEsNV0sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezI3OjE1NiwyODpbMSw3MF0sNTU6MTU3LDU2OjE1OCw2MToxNTIsNzM6WzEsNjddLDg3OlsxLDU0XSwxMTA6MTUzLDExMTpbMSwxNTRdLDExMjoxNTV9LHsxMDk6MTU5LDExMzpbMSwxNjBdLDExNDpbMSwxNjFdfSx7NjpbMiw4NV0sMTI6MTY1LDI1OlsyLDg1XSwyNzoxNjYsMjg6WzEsNzBdLDI5OjE2NywzMDpbMSw2OF0sMzE6WzEsNjldLDM4OjE2MywzOToxNjQsNDE6MTY4LDQzOlsxLDQ2XSw1MTpbMiw4NV0sNzQ6MTYyLDc1OlsyLDg1XSw4NjpbMSwxMTFdfSx7MTpbMiwyN10sNjpbMiwyN10sMjU6WzIsMjddLDI2OlsyLDI3XSw0MDpbMiwyN10sNDY6WzIsMjddLDUxOlsyLDI3XSw1NDpbMiwyN10sNjM6WzIsMjddLDY0OlsyLDI3XSw2NTpbMiwyN10sNjc6WzIsMjddLDY5OlsyLDI3XSw3MDpbMiwyN10sNzE6WzIsMjddLDc1OlsyLDI3XSw4MTpbMiwyN10sODI6WzIsMjddLDgzOlsyLDI3XSw4ODpbMiwyN10sOTA6WzIsMjddLDk5OlsyLDI3XSwxMDE6WzIsMjddLDEwMjpbMiwyN10sMTAzOlsyLDI3XSwxMDc6WzIsMjddLDExNTpbMiwyN10sMTIzOlsyLDI3XSwxMjU6WzIsMjddLDEyNjpbMiwyN10sMTI5OlsyLDI3XSwxMzA6WzIsMjddLDEzMTpbMiwyN10sMTMyOlsyLDI3XSwxMzM6WzIsMjddLDEzNDpbMiwyN119LHsxOlsyLDI4XSw2OlsyLDI4XSwyNTpbMiwyOF0sMjY6WzIsMjhdLDQwOlsyLDI4XSw0NjpbMiwyOF0sNTE6WzIsMjhdLDU0OlsyLDI4XSw2MzpbMiwyOF0sNjQ6WzIsMjhdLDY1OlsyLDI4XSw2NzpbMiwyOF0sNjk6WzIsMjhdLDcwOlsyLDI4XSw3MTpbMiwyOF0sNzU6WzIsMjhdLDgxOlsyLDI4XSw4MjpbMiwyOF0sODM6WzIsMjhdLDg4OlsyLDI4XSw5MDpbMiwyOF0sOTk6WzIsMjhdLDEwMTpbMiwyOF0sMTAyOlsyLDI4XSwxMDM6WzIsMjhdLDEwNzpbMiwyOF0sMTE1OlsyLDI4XSwxMjM6WzIsMjhdLDEyNTpbMiwyOF0sMTI2OlsyLDI4XSwxMjk6WzIsMjhdLDEzMDpbMiwyOF0sMTMxOlsyLDI4XSwxMzI6WzIsMjhdLDEzMzpbMiwyOF0sMTM0OlsyLDI4XX0sezE6WzIsMjZdLDY6WzIsMjZdLDI1OlsyLDI2XSwyNjpbMiwyNl0sMzc6WzIsMjZdLDQwOlsyLDI2XSw0NjpbMiwyNl0sNTE6WzIsMjZdLDU0OlsyLDI2XSw2MzpbMiwyNl0sNjQ6WzIsMjZdLDY1OlsyLDI2XSw2NzpbMiwyNl0sNjk6WzIsMjZdLDcwOlsyLDI2XSw3MTpbMiwyNl0sNzU6WzIsMjZdLDc3OlsyLDI2XSw4MTpbMiwyNl0sODI6WzIsMjZdLDgzOlsyLDI2XSw4ODpbMiwyNl0sOTA6WzIsMjZdLDk5OlsyLDI2XSwxMDE6WzIsMjZdLDEwMjpbMiwyNl0sMTAzOlsyLDI2XSwxMDc6WzIsMjZdLDExMzpbMiwyNl0sMTE0OlsyLDI2XSwxMTU6WzIsMjZdLDEyMzpbMiwyNl0sMTI1OlsyLDI2XSwxMjY6WzIsMjZdLDEyNzpbMiwyNl0sMTI4OlsyLDI2XSwxMjk6WzIsMjZdLDEzMDpbMiwyNl0sMTMxOlsyLDI2XSwxMzI6WzIsMjZdLDEzMzpbMiwyNl0sMTM0OlsyLDI2XSwxMzU6WzIsMjZdfSx7MTpbMiw2XSw2OlsyLDZdLDc6MTY5LDg6Niw5OjcsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNjpbMiw2XSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDk5OlsyLDZdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTpbMiwzXX0sezE6WzIsMjRdLDY6WzIsMjRdLDI1OlsyLDI0XSwyNjpbMiwyNF0sNDY6WzIsMjRdLDUxOlsyLDI0XSw1NDpbMiwyNF0sNjk6WzIsMjRdLDc1OlsyLDI0XSw4MzpbMiwyNF0sODg6WzIsMjRdLDkwOlsyLDI0XSw5NTpbMiwyNF0sOTY6WzIsMjRdLDk5OlsyLDI0XSwxMDE6WzIsMjRdLDEwMjpbMiwyNF0sMTAzOlsyLDI0XSwxMDc6WzIsMjRdLDExNTpbMiwyNF0sMTE4OlsyLDI0XSwxMjA6WzIsMjRdLDEyMzpbMiwyNF0sMTI1OlsyLDI0XSwxMjY6WzIsMjRdLDEyOTpbMiwyNF0sMTMwOlsyLDI0XSwxMzE6WzIsMjRdLDEzMjpbMiwyNF0sMTMzOlsyLDI0XSwxMzQ6WzIsMjRdfSx7NjpbMSw3MV0sMjY6WzEsMTcwXX0sezE6WzIsMTg0XSw2OlsyLDE4NF0sMjU6WzIsMTg0XSwyNjpbMiwxODRdLDQ2OlsyLDE4NF0sNTE6WzIsMTg0XSw1NDpbMiwxODRdLDY5OlsyLDE4NF0sNzU6WzIsMTg0XSw4MzpbMiwxODRdLDg4OlsyLDE4NF0sOTA6WzIsMTg0XSw5OTpbMiwxODRdLDEwMTpbMiwxODRdLDEwMjpbMiwxODRdLDEwMzpbMiwxODRdLDEwNzpbMiwxODRdLDExNTpbMiwxODRdLDEyMzpbMiwxODRdLDEyNTpbMiwxODRdLDEyNjpbMiwxODRdLDEyOTpbMiwxODRdLDEzMDpbMiwxODRdLDEzMTpbMiwxODRdLDEzMjpbMiwxODRdLDEzMzpbMiwxODRdLDEzNDpbMiwxODRdfSx7ODoxNzEsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxNzIsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxNzMsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxNzQsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxNzUsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxNzYsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxNzcsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxNzgsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTpbMiwxNDBdLDY6WzIsMTQwXSwyNTpbMiwxNDBdLDI2OlsyLDE0MF0sNDY6WzIsMTQwXSw1MTpbMiwxNDBdLDU0OlsyLDE0MF0sNjk6WzIsMTQwXSw3NTpbMiwxNDBdLDgzOlsyLDE0MF0sODg6WzIsMTQwXSw5MDpbMiwxNDBdLDk5OlsyLDE0MF0sMTAxOlsyLDE0MF0sMTAyOlsyLDE0MF0sMTAzOlsyLDE0MF0sMTA3OlsyLDE0MF0sMTE1OlsyLDE0MF0sMTIzOlsyLDE0MF0sMTI1OlsyLDE0MF0sMTI2OlsyLDE0MF0sMTI5OlsyLDE0MF0sMTMwOlsyLDE0MF0sMTMxOlsyLDE0MF0sMTMyOlsyLDE0MF0sMTMzOlsyLDE0MF0sMTM0OlsyLDE0MF19LHsxOlsyLDE0NV0sNjpbMiwxNDVdLDI1OlsyLDE0NV0sMjY6WzIsMTQ1XSw0NjpbMiwxNDVdLDUxOlsyLDE0NV0sNTQ6WzIsMTQ1XSw2OTpbMiwxNDVdLDc1OlsyLDE0NV0sODM6WzIsMTQ1XSw4ODpbMiwxNDVdLDkwOlsyLDE0NV0sOTk6WzIsMTQ1XSwxMDE6WzIsMTQ1XSwxMDI6WzIsMTQ1XSwxMDM6WzIsMTQ1XSwxMDc6WzIsMTQ1XSwxMTU6WzIsMTQ1XSwxMjM6WzIsMTQ1XSwxMjU6WzIsMTQ1XSwxMjY6WzIsMTQ1XSwxMjk6WzIsMTQ1XSwxMzA6WzIsMTQ1XSwxMzE6WzIsMTQ1XSwxMzI6WzIsMTQ1XSwxMzM6WzIsMTQ1XSwxMzQ6WzIsMTQ1XX0sezg6MTc5LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsMTM5XSw2OlsyLDEzOV0sMjU6WzIsMTM5XSwyNjpbMiwxMzldLDQ2OlsyLDEzOV0sNTE6WzIsMTM5XSw1NDpbMiwxMzldLDY5OlsyLDEzOV0sNzU6WzIsMTM5XSw4MzpbMiwxMzldLDg4OlsyLDEzOV0sOTA6WzIsMTM5XSw5OTpbMiwxMzldLDEwMTpbMiwxMzldLDEwMjpbMiwxMzldLDEwMzpbMiwxMzldLDEwNzpbMiwxMzldLDExNTpbMiwxMzldLDEyMzpbMiwxMzldLDEyNTpbMiwxMzldLDEyNjpbMiwxMzldLDEyOTpbMiwxMzldLDEzMDpbMiwxMzldLDEzMTpbMiwxMzldLDEzMjpbMiwxMzldLDEzMzpbMiwxMzldLDEzNDpbMiwxMzldfSx7MTpbMiwxNDRdLDY6WzIsMTQ0XSwyNTpbMiwxNDRdLDI2OlsyLDE0NF0sNDY6WzIsMTQ0XSw1MTpbMiwxNDRdLDU0OlsyLDE0NF0sNjk6WzIsMTQ0XSw3NTpbMiwxNDRdLDgzOlsyLDE0NF0sODg6WzIsMTQ0XSw5MDpbMiwxNDRdLDk5OlsyLDE0NF0sMTAxOlsyLDE0NF0sMTAyOlsyLDE0NF0sMTAzOlsyLDE0NF0sMTA3OlsyLDE0NF0sMTE1OlsyLDE0NF0sMTIzOlsyLDE0NF0sMTI1OlsyLDE0NF0sMTI2OlsyLDE0NF0sMTI5OlsyLDE0NF0sMTMwOlsyLDE0NF0sMTMxOlsyLDE0NF0sMTMyOlsyLDE0NF0sMTMzOlsyLDE0NF0sMTM0OlsyLDE0NF19LHs3OToxODAsODI6WzEsMTAzXX0sezE6WzIsNjNdLDY6WzIsNjNdLDI1OlsyLDYzXSwyNjpbMiw2M10sMzc6WzIsNjNdLDQ2OlsyLDYzXSw1MTpbMiw2M10sNTQ6WzIsNjNdLDYzOlsyLDYzXSw2NDpbMiw2M10sNjU6WzIsNjNdLDY3OlsyLDYzXSw2OTpbMiw2M10sNzA6WzIsNjNdLDcxOlsyLDYzXSw3NTpbMiw2M10sNzc6WzIsNjNdLDgxOlsyLDYzXSw4MjpbMiw2M10sODM6WzIsNjNdLDg4OlsyLDYzXSw5MDpbMiw2M10sOTk6WzIsNjNdLDEwMTpbMiw2M10sMTAyOlsyLDYzXSwxMDM6WzIsNjNdLDEwNzpbMiw2M10sMTE1OlsyLDYzXSwxMjM6WzIsNjNdLDEyNTpbMiw2M10sMTI2OlsyLDYzXSwxMjc6WzIsNjNdLDEyODpbMiw2M10sMTI5OlsyLDYzXSwxMzA6WzIsNjNdLDEzMTpbMiw2M10sMTMyOlsyLDYzXSwxMzM6WzIsNjNdLDEzNDpbMiw2M10sMTM1OlsyLDYzXX0sezgyOlsyLDEwM119LHsyNzoxODEsMjg6WzEsNzBdfSx7Mjc6MTgyLDI4OlsxLDcwXX0sezE6WzIsNzddLDY6WzIsNzddLDI1OlsyLDc3XSwyNjpbMiw3N10sMjc6MTgzLDI4OlsxLDcwXSwzNzpbMiw3N10sNDY6WzIsNzddLDUxOlsyLDc3XSw1NDpbMiw3N10sNjM6WzIsNzddLDY0OlsyLDc3XSw2NTpbMiw3N10sNjc6WzIsNzddLDY5OlsyLDc3XSw3MDpbMiw3N10sNzE6WzIsNzddLDc1OlsyLDc3XSw3NzpbMiw3N10sODE6WzIsNzddLDgyOlsyLDc3XSw4MzpbMiw3N10sODg6WzIsNzddLDkwOlsyLDc3XSw5OTpbMiw3N10sMTAxOlsyLDc3XSwxMDI6WzIsNzddLDEwMzpbMiw3N10sMTA3OlsyLDc3XSwxMTU6WzIsNzddLDEyMzpbMiw3N10sMTI1OlsyLDc3XSwxMjY6WzIsNzddLDEyNzpbMiw3N10sMTI4OlsyLDc3XSwxMjk6WzIsNzddLDEzMDpbMiw3N10sMTMxOlsyLDc3XSwxMzI6WzIsNzddLDEzMzpbMiw3N10sMTM0OlsyLDc3XSwxMzU6WzIsNzddfSx7MTpbMiw3OF0sNjpbMiw3OF0sMjU6WzIsNzhdLDI2OlsyLDc4XSwzNzpbMiw3OF0sNDY6WzIsNzhdLDUxOlsyLDc4XSw1NDpbMiw3OF0sNjM6WzIsNzhdLDY0OlsyLDc4XSw2NTpbMiw3OF0sNjc6WzIsNzhdLDY5OlsyLDc4XSw3MDpbMiw3OF0sNzE6WzIsNzhdLDc1OlsyLDc4XSw3NzpbMiw3OF0sODE6WzIsNzhdLDgyOlsyLDc4XSw4MzpbMiw3OF0sODg6WzIsNzhdLDkwOlsyLDc4XSw5OTpbMiw3OF0sMTAxOlsyLDc4XSwxMDI6WzIsNzhdLDEwMzpbMiw3OF0sMTA3OlsyLDc4XSwxMTU6WzIsNzhdLDEyMzpbMiw3OF0sMTI1OlsyLDc4XSwxMjY6WzIsNzhdLDEyNzpbMiw3OF0sMTI4OlsyLDc4XSwxMjk6WzIsNzhdLDEzMDpbMiw3OF0sMTMxOlsyLDc4XSwxMzI6WzIsNzhdLDEzMzpbMiw3OF0sMTM0OlsyLDc4XSwxMzU6WzIsNzhdfSx7ODoxODUsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU0OlsxLDE4OV0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNjg6MTg0LDcyOjE4Niw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw4OToxODcsOTA6WzEsMTg4XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezY2OjE5MCw2NzpbMSw5Nl0sNzA6WzEsOTddLDcxOlsxLDk4XX0sezY2OjE5MSw2NzpbMSw5Nl0sNzA6WzEsOTddLDcxOlsxLDk4XX0sezc5OjE5Miw4MjpbMSwxMDNdfSx7MTpbMiw2NF0sNjpbMiw2NF0sMjU6WzIsNjRdLDI2OlsyLDY0XSwzNzpbMiw2NF0sNDY6WzIsNjRdLDUxOlsyLDY0XSw1NDpbMiw2NF0sNjM6WzIsNjRdLDY0OlsyLDY0XSw2NTpbMiw2NF0sNjc6WzIsNjRdLDY5OlsyLDY0XSw3MDpbMiw2NF0sNzE6WzIsNjRdLDc1OlsyLDY0XSw3NzpbMiw2NF0sODE6WzIsNjRdLDgyOlsyLDY0XSw4MzpbMiw2NF0sODg6WzIsNjRdLDkwOlsyLDY0XSw5OTpbMiw2NF0sMTAxOlsyLDY0XSwxMDI6WzIsNjRdLDEwMzpbMiw2NF0sMTA3OlsyLDY0XSwxMTU6WzIsNjRdLDEyMzpbMiw2NF0sMTI1OlsyLDY0XSwxMjY6WzIsNjRdLDEyNzpbMiw2NF0sMTI4OlsyLDY0XSwxMjk6WzIsNjRdLDEzMDpbMiw2NF0sMTMxOlsyLDY0XSwxMzI6WzIsNjRdLDEzMzpbMiw2NF0sMTM0OlsyLDY0XSwxMzU6WzIsNjRdfSx7ODoxOTMsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNTpbMSwxOTRdLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDEwMV0sNjpbMiwxMDFdLDI1OlsyLDEwMV0sMjY6WzIsMTAxXSw0NjpbMiwxMDFdLDUxOlsyLDEwMV0sNTQ6WzIsMTAxXSw2MzpbMiwxMDFdLDY0OlsyLDEwMV0sNjU6WzIsMTAxXSw2NzpbMiwxMDFdLDY5OlsyLDEwMV0sNzA6WzIsMTAxXSw3MTpbMiwxMDFdLDc1OlsyLDEwMV0sODE6WzIsMTAxXSw4MjpbMiwxMDFdLDgzOlsyLDEwMV0sODg6WzIsMTAxXSw5MDpbMiwxMDFdLDk5OlsyLDEwMV0sMTAxOlsyLDEwMV0sMTAyOlsyLDEwMV0sMTAzOlsyLDEwMV0sMTA3OlsyLDEwMV0sMTE1OlsyLDEwMV0sMTIzOlsyLDEwMV0sMTI1OlsyLDEwMV0sMTI2OlsyLDEwMV0sMTI5OlsyLDEwMV0sMTMwOlsyLDEwMV0sMTMxOlsyLDEwMV0sMTMyOlsyLDEwMV0sMTMzOlsyLDEwMV0sMTM0OlsyLDEwMV19LHs4OjE5Nyw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI1OlsxLDE0NF0sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1NzoxNDUsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODM6WzEsMTk1XSw4NDoxOTYsODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTE6MTQzLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7NDY6WzEsMTk4XSw1MTpbMSwxOTldfSx7NDY6WzIsNTJdLDUxOlsyLDUyXX0sezM3OlsxLDIwMV0sNDY6WzIsNTRdLDUxOlsyLDU0XSw1NDpbMSwyMDBdfSx7Mzc6WzIsNTddLDQ2OlsyLDU3XSw1MTpbMiw1N10sNTQ6WzIsNTddfSx7Mzc6WzIsNThdLDQ2OlsyLDU4XSw1MTpbMiw1OF0sNTQ6WzIsNThdfSx7Mzc6WzIsNTldLDQ2OlsyLDU5XSw1MTpbMiw1OV0sNTQ6WzIsNTldfSx7Mzc6WzIsNjBdLDQ2OlsyLDYwXSw1MTpbMiw2MF0sNTQ6WzIsNjBdfSx7Mjc6MTQ2LDI4OlsxLDcwXX0sezg6MTk3LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjU6WzEsMTQ0XSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU3OjE0NSw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NDoxNDIsODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sODg6WzEsMTQxXSw5MToxNDMsOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDQ2XSw2OlsyLDQ2XSwyNTpbMiw0Nl0sMjY6WzIsNDZdLDQ2OlsyLDQ2XSw1MTpbMiw0Nl0sNTQ6WzIsNDZdLDY5OlsyLDQ2XSw3NTpbMiw0Nl0sODM6WzIsNDZdLDg4OlsyLDQ2XSw5MDpbMiw0Nl0sOTk6WzIsNDZdLDEwMTpbMiw0Nl0sMTAyOlsyLDQ2XSwxMDM6WzIsNDZdLDEwNzpbMiw0Nl0sMTE1OlsyLDQ2XSwxMjM6WzIsNDZdLDEyNTpbMiw0Nl0sMTI2OlsyLDQ2XSwxMjk6WzIsNDZdLDEzMDpbMiw0Nl0sMTMxOlsyLDQ2XSwxMzI6WzIsNDZdLDEzMzpbMiw0Nl0sMTM0OlsyLDQ2XX0sezE6WzIsMTc3XSw2OlsyLDE3N10sMjU6WzIsMTc3XSwyNjpbMiwxNzddLDQ2OlsyLDE3N10sNTE6WzIsMTc3XSw1NDpbMiwxNzddLDY5OlsyLDE3N10sNzU6WzIsMTc3XSw4MzpbMiwxNzddLDg4OlsyLDE3N10sOTA6WzIsMTc3XSw5OTpbMiwxNzddLDEwMDo4NCwxMDE6WzIsMTc3XSwxMDI6WzIsMTc3XSwxMDM6WzIsMTc3XSwxMDY6ODUsMTA3OlsyLDE3N10sMTA4OjY2LDExNTpbMiwxNzddLDEyMzpbMiwxNzddLDEyNTpbMiwxNzddLDEyNjpbMiwxNzddLDEyOTpbMSw3NV0sMTMwOlsyLDE3N10sMTMxOlsyLDE3N10sMTMyOlsyLDE3N10sMTMzOlsyLDE3N10sMTM0OlsyLDE3N119LHsxMDA6ODcsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4OCwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODZdfSx7MTpbMiwxNzhdLDY6WzIsMTc4XSwyNTpbMiwxNzhdLDI2OlsyLDE3OF0sNDY6WzIsMTc4XSw1MTpbMiwxNzhdLDU0OlsyLDE3OF0sNjk6WzIsMTc4XSw3NTpbMiwxNzhdLDgzOlsyLDE3OF0sODg6WzIsMTc4XSw5MDpbMiwxNzhdLDk5OlsyLDE3OF0sMTAwOjg0LDEwMTpbMiwxNzhdLDEwMjpbMiwxNzhdLDEwMzpbMiwxNzhdLDEwNjo4NSwxMDc6WzIsMTc4XSwxMDg6NjYsMTE1OlsyLDE3OF0sMTIzOlsyLDE3OF0sMTI1OlsyLDE3OF0sMTI2OlsyLDE3OF0sMTI5OlsxLDc1XSwxMzA6WzIsMTc4XSwxMzE6WzIsMTc4XSwxMzI6WzIsMTc4XSwxMzM6WzIsMTc4XSwxMzQ6WzIsMTc4XX0sezE6WzIsMTc5XSw2OlsyLDE3OV0sMjU6WzIsMTc5XSwyNjpbMiwxNzldLDQ2OlsyLDE3OV0sNTE6WzIsMTc5XSw1NDpbMiwxNzldLDY5OlsyLDE3OV0sNzU6WzIsMTc5XSw4MzpbMiwxNzldLDg4OlsyLDE3OV0sOTA6WzIsMTc5XSw5OTpbMiwxNzldLDEwMDo4NCwxMDE6WzIsMTc5XSwxMDI6WzIsMTc5XSwxMDM6WzIsMTc5XSwxMDY6ODUsMTA3OlsyLDE3OV0sMTA4OjY2LDExNTpbMiwxNzldLDEyMzpbMiwxNzldLDEyNTpbMiwxNzldLDEyNjpbMiwxNzldLDEyOTpbMSw3NV0sMTMwOlsyLDE3OV0sMTMxOlsyLDE3OV0sMTMyOlsyLDE3OV0sMTMzOlsyLDE3OV0sMTM0OlsyLDE3OV19LHsxOlsyLDE4MF0sNjpbMiwxODBdLDI1OlsyLDE4MF0sMjY6WzIsMTgwXSw0NjpbMiwxODBdLDUxOlsyLDE4MF0sNTQ6WzIsMTgwXSw2MzpbMiw2Nl0sNjQ6WzIsNjZdLDY1OlsyLDY2XSw2NzpbMiw2Nl0sNjk6WzIsMTgwXSw3MDpbMiw2Nl0sNzE6WzIsNjZdLDc1OlsyLDE4MF0sODE6WzIsNjZdLDgyOlsyLDY2XSw4MzpbMiwxODBdLDg4OlsyLDE4MF0sOTA6WzIsMTgwXSw5OTpbMiwxODBdLDEwMTpbMiwxODBdLDEwMjpbMiwxODBdLDEwMzpbMiwxODBdLDEwNzpbMiwxODBdLDExNTpbMiwxODBdLDEyMzpbMiwxODBdLDEyNTpbMiwxODBdLDEyNjpbMiwxODBdLDEyOTpbMiwxODBdLDEzMDpbMiwxODBdLDEzMTpbMiwxODBdLDEzMjpbMiwxODBdLDEzMzpbMiwxODBdLDEzNDpbMiwxODBdfSx7NTk6OTAsNjM6WzEsOTJdLDY0OlsxLDkzXSw2NTpbMSw5NF0sNjY6OTUsNjc6WzEsOTZdLDcwOlsxLDk3XSw3MTpbMSw5OF0sNzg6ODksODE6WzEsOTFdLDgyOlsyLDEwMl19LHs1OToxMDAsNjM6WzEsOTJdLDY0OlsxLDkzXSw2NTpbMSw5NF0sNjY6OTUsNjc6WzEsOTZdLDcwOlsxLDk3XSw3MTpbMSw5OF0sNzg6OTksODE6WzEsOTFdLDgyOlsyLDEwMl19LHsxOlsyLDY5XSw2OlsyLDY5XSwyNTpbMiw2OV0sMjY6WzIsNjldLDQ2OlsyLDY5XSw1MTpbMiw2OV0sNTQ6WzIsNjldLDYzOlsyLDY5XSw2NDpbMiw2OV0sNjU6WzIsNjldLDY3OlsyLDY5XSw2OTpbMiw2OV0sNzA6WzIsNjldLDcxOlsyLDY5XSw3NTpbMiw2OV0sODE6WzIsNjldLDgyOlsyLDY5XSw4MzpbMiw2OV0sODg6WzIsNjldLDkwOlsyLDY5XSw5OTpbMiw2OV0sMTAxOlsyLDY5XSwxMDI6WzIsNjldLDEwMzpbMiw2OV0sMTA3OlsyLDY5XSwxMTU6WzIsNjldLDEyMzpbMiw2OV0sMTI1OlsyLDY5XSwxMjY6WzIsNjldLDEyOTpbMiw2OV0sMTMwOlsyLDY5XSwxMzE6WzIsNjldLDEzMjpbMiw2OV0sMTMzOlsyLDY5XSwxMzQ6WzIsNjldfSx7MTpbMiwxODFdLDY6WzIsMTgxXSwyNTpbMiwxODFdLDI2OlsyLDE4MV0sNDY6WzIsMTgxXSw1MTpbMiwxODFdLDU0OlsyLDE4MV0sNjM6WzIsNjZdLDY0OlsyLDY2XSw2NTpbMiw2Nl0sNjc6WzIsNjZdLDY5OlsyLDE4MV0sNzA6WzIsNjZdLDcxOlsyLDY2XSw3NTpbMiwxODFdLDgxOlsyLDY2XSw4MjpbMiw2Nl0sODM6WzIsMTgxXSw4ODpbMiwxODFdLDkwOlsyLDE4MV0sOTk6WzIsMTgxXSwxMDE6WzIsMTgxXSwxMDI6WzIsMTgxXSwxMDM6WzIsMTgxXSwxMDc6WzIsMTgxXSwxMTU6WzIsMTgxXSwxMjM6WzIsMTgxXSwxMjU6WzIsMTgxXSwxMjY6WzIsMTgxXSwxMjk6WzIsMTgxXSwxMzA6WzIsMTgxXSwxMzE6WzIsMTgxXSwxMzI6WzIsMTgxXSwxMzM6WzIsMTgxXSwxMzQ6WzIsMTgxXX0sezE6WzIsMTgyXSw2OlsyLDE4Ml0sMjU6WzIsMTgyXSwyNjpbMiwxODJdLDQ2OlsyLDE4Ml0sNTE6WzIsMTgyXSw1NDpbMiwxODJdLDY5OlsyLDE4Ml0sNzU6WzIsMTgyXSw4MzpbMiwxODJdLDg4OlsyLDE4Ml0sOTA6WzIsMTgyXSw5OTpbMiwxODJdLDEwMTpbMiwxODJdLDEwMjpbMiwxODJdLDEwMzpbMiwxODJdLDEwNzpbMiwxODJdLDExNTpbMiwxODJdLDEyMzpbMiwxODJdLDEyNTpbMiwxODJdLDEyNjpbMiwxODJdLDEyOTpbMiwxODJdLDEzMDpbMiwxODJdLDEzMTpbMiwxODJdLDEzMjpbMiwxODJdLDEzMzpbMiwxODJdLDEzNDpbMiwxODJdfSx7MTpbMiwxODNdLDY6WzIsMTgzXSwyNTpbMiwxODNdLDI2OlsyLDE4M10sNDY6WzIsMTgzXSw1MTpbMiwxODNdLDU0OlsyLDE4M10sNjk6WzIsMTgzXSw3NTpbMiwxODNdLDgzOlsyLDE4M10sODg6WzIsMTgzXSw5MDpbMiwxODNdLDk5OlsyLDE4M10sMTAxOlsyLDE4M10sMTAyOlsyLDE4M10sMTAzOlsyLDE4M10sMTA3OlsyLDE4M10sMTE1OlsyLDE4M10sMTIzOlsyLDE4M10sMTI1OlsyLDE4M10sMTI2OlsyLDE4M10sMTI5OlsyLDE4M10sMTMwOlsyLDE4M10sMTMxOlsyLDE4M10sMTMyOlsyLDE4M10sMTMzOlsyLDE4M10sMTM0OlsyLDE4M119LHs4OjIwMiw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI1OlsxLDIwM10sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MjA0LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezU6MjA1LDI1OlsxLDVdLDEyMjpbMSwyMDZdfSx7MTpbMiwxMjZdLDY6WzIsMTI2XSwyNTpbMiwxMjZdLDI2OlsyLDEyNl0sNDY6WzIsMTI2XSw1MTpbMiwxMjZdLDU0OlsyLDEyNl0sNjk6WzIsMTI2XSw3NTpbMiwxMjZdLDgzOlsyLDEyNl0sODg6WzIsMTI2XSw5MDpbMiwxMjZdLDk0OjIwNyw5NTpbMSwyMDhdLDk2OlsxLDIwOV0sOTk6WzIsMTI2XSwxMDE6WzIsMTI2XSwxMDI6WzIsMTI2XSwxMDM6WzIsMTI2XSwxMDc6WzIsMTI2XSwxMTU6WzIsMTI2XSwxMjM6WzIsMTI2XSwxMjU6WzIsMTI2XSwxMjY6WzIsMTI2XSwxMjk6WzIsMTI2XSwxMzA6WzIsMTI2XSwxMzE6WzIsMTI2XSwxMzI6WzIsMTI2XSwxMzM6WzIsMTI2XSwxMzQ6WzIsMTI2XX0sezE6WzIsMTM4XSw2OlsyLDEzOF0sMjU6WzIsMTM4XSwyNjpbMiwxMzhdLDQ2OlsyLDEzOF0sNTE6WzIsMTM4XSw1NDpbMiwxMzhdLDY5OlsyLDEzOF0sNzU6WzIsMTM4XSw4MzpbMiwxMzhdLDg4OlsyLDEzOF0sOTA6WzIsMTM4XSw5OTpbMiwxMzhdLDEwMTpbMiwxMzhdLDEwMjpbMiwxMzhdLDEwMzpbMiwxMzhdLDEwNzpbMiwxMzhdLDExNTpbMiwxMzhdLDEyMzpbMiwxMzhdLDEyNTpbMiwxMzhdLDEyNjpbMiwxMzhdLDEyOTpbMiwxMzhdLDEzMDpbMiwxMzhdLDEzMTpbMiwxMzhdLDEzMjpbMiwxMzhdLDEzMzpbMiwxMzhdLDEzNDpbMiwxMzhdfSx7MTpbMiwxNDZdLDY6WzIsMTQ2XSwyNTpbMiwxNDZdLDI2OlsyLDE0Nl0sNDY6WzIsMTQ2XSw1MTpbMiwxNDZdLDU0OlsyLDE0Nl0sNjk6WzIsMTQ2XSw3NTpbMiwxNDZdLDgzOlsyLDE0Nl0sODg6WzIsMTQ2XSw5MDpbMiwxNDZdLDk5OlsyLDE0Nl0sMTAxOlsyLDE0Nl0sMTAyOlsyLDE0Nl0sMTAzOlsyLDE0Nl0sMTA3OlsyLDE0Nl0sMTE1OlsyLDE0Nl0sMTIzOlsyLDE0Nl0sMTI1OlsyLDE0Nl0sMTI2OlsyLDE0Nl0sMTI5OlsyLDE0Nl0sMTMwOlsyLDE0Nl0sMTMxOlsyLDE0Nl0sMTMyOlsyLDE0Nl0sMTMzOlsyLDE0Nl0sMTM0OlsyLDE0Nl19LHsyNTpbMSwyMTBdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTE3OjIxMSwxMTk6MjEyLDEyMDpbMSwyMTNdfSx7MTpbMiw5MV0sNjpbMiw5MV0sMjU6WzIsOTFdLDI2OlsyLDkxXSw0NjpbMiw5MV0sNTE6WzIsOTFdLDU0OlsyLDkxXSw2OTpbMiw5MV0sNzU6WzIsOTFdLDgzOlsyLDkxXSw4ODpbMiw5MV0sOTA6WzIsOTFdLDk5OlsyLDkxXSwxMDE6WzIsOTFdLDEwMjpbMiw5MV0sMTAzOlsyLDkxXSwxMDc6WzIsOTFdLDExNTpbMiw5MV0sMTIzOlsyLDkxXSwxMjU6WzIsOTFdLDEyNjpbMiw5MV0sMTI5OlsyLDkxXSwxMzA6WzIsOTFdLDEzMTpbMiw5MV0sMTMyOlsyLDkxXSwxMzM6WzIsOTFdLDEzNDpbMiw5MV19LHsxNDoyMTQsMTU6MTIwLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjEyMSw0MTo2MCw1NTo0Nyw1Njo0OCw1ODoyMTUsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5ODpbMSw1M119LHsxOlsyLDk0XSw1OjIxNiw2OlsyLDk0XSwyNTpbMSw1XSwyNjpbMiw5NF0sNDY6WzIsOTRdLDUxOlsyLDk0XSw1NDpbMiw5NF0sNjM6WzIsNjZdLDY0OlsyLDY2XSw2NTpbMiw2Nl0sNjc6WzIsNjZdLDY5OlsyLDk0XSw3MDpbMiw2Nl0sNzE6WzIsNjZdLDc1OlsyLDk0XSw3NzpbMSwyMTddLDgxOlsyLDY2XSw4MjpbMiw2Nl0sODM6WzIsOTRdLDg4OlsyLDk0XSw5MDpbMiw5NF0sOTk6WzIsOTRdLDEwMTpbMiw5NF0sMTAyOlsyLDk0XSwxMDM6WzIsOTRdLDEwNzpbMiw5NF0sMTE1OlsyLDk0XSwxMjM6WzIsOTRdLDEyNTpbMiw5NF0sMTI2OlsyLDk0XSwxMjk6WzIsOTRdLDEzMDpbMiw5NF0sMTMxOlsyLDk0XSwxMzI6WzIsOTRdLDEzMzpbMiw5NF0sMTM0OlsyLDk0XX0sezE6WzIsNDJdLDY6WzIsNDJdLDI2OlsyLDQyXSw5OTpbMiw0Ml0sMTAwOjg0LDEwMTpbMiw0Ml0sMTAzOlsyLDQyXSwxMDY6ODUsMTA3OlsyLDQyXSwxMDg6NjYsMTIzOlsyLDQyXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDEzMV0sNjpbMiwxMzFdLDI2OlsyLDEzMV0sOTk6WzIsMTMxXSwxMDA6ODQsMTAxOlsyLDEzMV0sMTAzOlsyLDEzMV0sMTA2Ojg1LDEwNzpbMiwxMzFdLDEwODo2NiwxMjM6WzIsMTMxXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHs2OlsxLDcxXSw5OTpbMSwyMThdfSx7NDoyMTksNzo0LDg6Niw5OjcsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7NjpbMiwxMjJdLDI1OlsyLDEyMl0sNTE6WzIsMTIyXSw1NDpbMSwyMjFdLDg4OlsyLDEyMl0sODk6MjIwLDkwOlsxLDE4OF0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTIzOlsxLDgzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDEwOV0sNjpbMiwxMDldLDI1OlsyLDEwOV0sMjY6WzIsMTA5XSwzNzpbMiwxMDldLDQ2OlsyLDEwOV0sNTE6WzIsMTA5XSw1NDpbMiwxMDldLDYzOlsyLDEwOV0sNjQ6WzIsMTA5XSw2NTpbMiwxMDldLDY3OlsyLDEwOV0sNjk6WzIsMTA5XSw3MDpbMiwxMDldLDcxOlsyLDEwOV0sNzU6WzIsMTA5XSw4MTpbMiwxMDldLDgyOlsyLDEwOV0sODM6WzIsMTA5XSw4ODpbMiwxMDldLDkwOlsyLDEwOV0sOTk6WzIsMTA5XSwxMDE6WzIsMTA5XSwxMDI6WzIsMTA5XSwxMDM6WzIsMTA5XSwxMDc6WzIsMTA5XSwxMTM6WzIsMTA5XSwxMTQ6WzIsMTA5XSwxMTU6WzIsMTA5XSwxMjM6WzIsMTA5XSwxMjU6WzIsMTA5XSwxMjY6WzIsMTA5XSwxMjk6WzIsMTA5XSwxMzA6WzIsMTA5XSwxMzE6WzIsMTA5XSwxMzI6WzIsMTA5XSwxMzM6WzIsMTA5XSwxMzQ6WzIsMTA5XX0sezY6WzIsNDldLDI1OlsyLDQ5XSw1MDoyMjIsNTE6WzEsMjIzXSw4ODpbMiw0OV19LHs2OlsyLDExN10sMjU6WzIsMTE3XSwyNjpbMiwxMTddLDUxOlsyLDExN10sODM6WzIsMTE3XSw4ODpbMiwxMTddfSx7ODoxOTcsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNTpbMSwxNDRdLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTc6MTQ1LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg0OjIyNCw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MToxNDMsOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHs2OlsyLDEyM10sMjU6WzIsMTIzXSwyNjpbMiwxMjNdLDUxOlsyLDEyM10sODM6WzIsMTIzXSw4ODpbMiwxMjNdfSx7MTpbMiwxMDhdLDY6WzIsMTA4XSwyNTpbMiwxMDhdLDI2OlsyLDEwOF0sMzc6WzIsMTA4XSw0MDpbMiwxMDhdLDQ2OlsyLDEwOF0sNTE6WzIsMTA4XSw1NDpbMiwxMDhdLDYzOlsyLDEwOF0sNjQ6WzIsMTA4XSw2NTpbMiwxMDhdLDY3OlsyLDEwOF0sNjk6WzIsMTA4XSw3MDpbMiwxMDhdLDcxOlsyLDEwOF0sNzU6WzIsMTA4XSw3NzpbMiwxMDhdLDgxOlsyLDEwOF0sODI6WzIsMTA4XSw4MzpbMiwxMDhdLDg4OlsyLDEwOF0sOTA6WzIsMTA4XSw5OTpbMiwxMDhdLDEwMTpbMiwxMDhdLDEwMjpbMiwxMDhdLDEwMzpbMiwxMDhdLDEwNzpbMiwxMDhdLDExNTpbMiwxMDhdLDEyMzpbMiwxMDhdLDEyNTpbMiwxMDhdLDEyNjpbMiwxMDhdLDEyNzpbMiwxMDhdLDEyODpbMiwxMDhdLDEyOTpbMiwxMDhdLDEzMDpbMiwxMDhdLDEzMTpbMiwxMDhdLDEzMjpbMiwxMDhdLDEzMzpbMiwxMDhdLDEzNDpbMiwxMDhdLDEzNTpbMiwxMDhdfSx7NToyMjUsMjU6WzEsNV0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTIzOlsxLDgzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDEzNF0sNjpbMiwxMzRdLDI1OlsyLDEzNF0sMjY6WzIsMTM0XSw0NjpbMiwxMzRdLDUxOlsyLDEzNF0sNTQ6WzIsMTM0XSw2OTpbMiwxMzRdLDc1OlsyLDEzNF0sODM6WzIsMTM0XSw4ODpbMiwxMzRdLDkwOlsyLDEzNF0sOTk6WzIsMTM0XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDI6WzEsMjI2XSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMTU6WzIsMTM0XSwxMjM6WzIsMTM0XSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDEzNl0sNjpbMiwxMzZdLDI1OlsyLDEzNl0sMjY6WzIsMTM2XSw0NjpbMiwxMzZdLDUxOlsyLDEzNl0sNTQ6WzIsMTM2XSw2OTpbMiwxMzZdLDc1OlsyLDEzNl0sODM6WzIsMTM2XSw4ODpbMiwxMzZdLDkwOlsyLDEzNl0sOTk6WzIsMTM2XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDI6WzEsMjI3XSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMTU6WzIsMTM2XSwxMjM6WzIsMTM2XSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDE0Ml0sNjpbMiwxNDJdLDI1OlsyLDE0Ml0sMjY6WzIsMTQyXSw0NjpbMiwxNDJdLDUxOlsyLDE0Ml0sNTQ6WzIsMTQyXSw2OTpbMiwxNDJdLDc1OlsyLDE0Ml0sODM6WzIsMTQyXSw4ODpbMiwxNDJdLDkwOlsyLDE0Ml0sOTk6WzIsMTQyXSwxMDE6WzIsMTQyXSwxMDI6WzIsMTQyXSwxMDM6WzIsMTQyXSwxMDc6WzIsMTQyXSwxMTU6WzIsMTQyXSwxMjM6WzIsMTQyXSwxMjU6WzIsMTQyXSwxMjY6WzIsMTQyXSwxMjk6WzIsMTQyXSwxMzA6WzIsMTQyXSwxMzE6WzIsMTQyXSwxMzI6WzIsMTQyXSwxMzM6WzIsMTQyXSwxMzQ6WzIsMTQyXX0sezE6WzIsMTQzXSw2OlsyLDE0M10sMjU6WzIsMTQzXSwyNjpbMiwxNDNdLDQ2OlsyLDE0M10sNTE6WzIsMTQzXSw1NDpbMiwxNDNdLDY5OlsyLDE0M10sNzU6WzIsMTQzXSw4MzpbMiwxNDNdLDg4OlsyLDE0M10sOTA6WzIsMTQzXSw5OTpbMiwxNDNdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMjpbMiwxNDNdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDExNTpbMiwxNDNdLDEyMzpbMiwxNDNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezE6WzIsMTQ3XSw2OlsyLDE0N10sMjU6WzIsMTQ3XSwyNjpbMiwxNDddLDQ2OlsyLDE0N10sNTE6WzIsMTQ3XSw1NDpbMiwxNDddLDY5OlsyLDE0N10sNzU6WzIsMTQ3XSw4MzpbMiwxNDddLDg4OlsyLDE0N10sOTA6WzIsMTQ3XSw5OTpbMiwxNDddLDEwMTpbMiwxNDddLDEwMjpbMiwxNDddLDEwMzpbMiwxNDddLDEwNzpbMiwxNDddLDExNTpbMiwxNDddLDEyMzpbMiwxNDddLDEyNTpbMiwxNDddLDEyNjpbMiwxNDddLDEyOTpbMiwxNDddLDEzMDpbMiwxNDddLDEzMTpbMiwxNDddLDEzMjpbMiwxNDddLDEzMzpbMiwxNDddLDEzNDpbMiwxNDddfSx7MTEzOlsyLDE0OV0sMTE0OlsyLDE0OV19LHsyNzoxNTYsMjg6WzEsNzBdLDU1OjE1Nyw1NjoxNTgsNzM6WzEsNjddLDg3OlsxLDExMl0sMTEwOjIyOCwxMTI6MTU1fSx7NTE6WzEsMjI5XSwxMTM6WzIsMTU0XSwxMTQ6WzIsMTU0XX0sezUxOlsyLDE1MV0sMTEzOlsyLDE1MV0sMTE0OlsyLDE1MV19LHs1MTpbMiwxNTJdLDExMzpbMiwxNTJdLDExNDpbMiwxNTJdfSx7NTE6WzIsMTUzXSwxMTM6WzIsMTUzXSwxMTQ6WzIsMTUzXX0sezE6WzIsMTQ4XSw2OlsyLDE0OF0sMjU6WzIsMTQ4XSwyNjpbMiwxNDhdLDQ2OlsyLDE0OF0sNTE6WzIsMTQ4XSw1NDpbMiwxNDhdLDY5OlsyLDE0OF0sNzU6WzIsMTQ4XSw4MzpbMiwxNDhdLDg4OlsyLDE0OF0sOTA6WzIsMTQ4XSw5OTpbMiwxNDhdLDEwMTpbMiwxNDhdLDEwMjpbMiwxNDhdLDEwMzpbMiwxNDhdLDEwNzpbMiwxNDhdLDExNTpbMiwxNDhdLDEyMzpbMiwxNDhdLDEyNTpbMiwxNDhdLDEyNjpbMiwxNDhdLDEyOTpbMiwxNDhdLDEzMDpbMiwxNDhdLDEzMTpbMiwxNDhdLDEzMjpbMiwxNDhdLDEzMzpbMiwxNDhdLDEzNDpbMiwxNDhdfSx7ODoyMzAsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoyMzEsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7NjpbMiw0OV0sMjU6WzIsNDldLDUwOjIzMiw1MTpbMSwyMzNdLDc1OlsyLDQ5XX0sezY6WzIsODZdLDI1OlsyLDg2XSwyNjpbMiw4Nl0sNTE6WzIsODZdLDc1OlsyLDg2XX0sezY6WzIsMzVdLDI1OlsyLDM1XSwyNjpbMiwzNV0sNDA6WzEsMjM0XSw1MTpbMiwzNV0sNzU6WzIsMzVdfSx7NjpbMiwzOF0sMjU6WzIsMzhdLDI2OlsyLDM4XSw1MTpbMiwzOF0sNzU6WzIsMzhdfSx7NjpbMiwzOV0sMjU6WzIsMzldLDI2OlsyLDM5XSw0MDpbMiwzOV0sNTE6WzIsMzldLDc1OlsyLDM5XX0sezY6WzIsNDBdLDI1OlsyLDQwXSwyNjpbMiw0MF0sNDA6WzIsNDBdLDUxOlsyLDQwXSw3NTpbMiw0MF19LHs2OlsyLDQxXSwyNTpbMiw0MV0sMjY6WzIsNDFdLDQwOlsyLDQxXSw1MTpbMiw0MV0sNzU6WzIsNDFdfSx7MTpbMiw1XSw2OlsyLDVdLDI2OlsyLDVdLDk5OlsyLDVdfSx7MTpbMiwyNV0sNjpbMiwyNV0sMjU6WzIsMjVdLDI2OlsyLDI1XSw0NjpbMiwyNV0sNTE6WzIsMjVdLDU0OlsyLDI1XSw2OTpbMiwyNV0sNzU6WzIsMjVdLDgzOlsyLDI1XSw4ODpbMiwyNV0sOTA6WzIsMjVdLDk1OlsyLDI1XSw5NjpbMiwyNV0sOTk6WzIsMjVdLDEwMTpbMiwyNV0sMTAyOlsyLDI1XSwxMDM6WzIsMjVdLDEwNzpbMiwyNV0sMTE1OlsyLDI1XSwxMTg6WzIsMjVdLDEyMDpbMiwyNV0sMTIzOlsyLDI1XSwxMjU6WzIsMjVdLDEyNjpbMiwyNV0sMTI5OlsyLDI1XSwxMzA6WzIsMjVdLDEzMTpbMiwyNV0sMTMyOlsyLDI1XSwxMzM6WzIsMjVdLDEzNDpbMiwyNV19LHsxOlsyLDE4NV0sNjpbMiwxODVdLDI1OlsyLDE4NV0sMjY6WzIsMTg1XSw0NjpbMiwxODVdLDUxOlsyLDE4NV0sNTQ6WzIsMTg1XSw2OTpbMiwxODVdLDc1OlsyLDE4NV0sODM6WzIsMTg1XSw4ODpbMiwxODVdLDkwOlsyLDE4NV0sOTk6WzIsMTg1XSwxMDA6ODQsMTAxOlsyLDE4NV0sMTAyOlsyLDE4NV0sMTAzOlsyLDE4NV0sMTA2Ojg1LDEwNzpbMiwxODVdLDEwODo2NiwxMTU6WzIsMTg1XSwxMjM6WzIsMTg1XSwxMjU6WzIsMTg1XSwxMjY6WzIsMTg1XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsyLDE4NV0sMTMyOlsyLDE4NV0sMTMzOlsyLDE4NV0sMTM0OlsyLDE4NV19LHsxOlsyLDE4Nl0sNjpbMiwxODZdLDI1OlsyLDE4Nl0sMjY6WzIsMTg2XSw0NjpbMiwxODZdLDUxOlsyLDE4Nl0sNTQ6WzIsMTg2XSw2OTpbMiwxODZdLDc1OlsyLDE4Nl0sODM6WzIsMTg2XSw4ODpbMiwxODZdLDkwOlsyLDE4Nl0sOTk6WzIsMTg2XSwxMDA6ODQsMTAxOlsyLDE4Nl0sMTAyOlsyLDE4Nl0sMTAzOlsyLDE4Nl0sMTA2Ojg1LDEwNzpbMiwxODZdLDEwODo2NiwxMTU6WzIsMTg2XSwxMjM6WzIsMTg2XSwxMjU6WzIsMTg2XSwxMjY6WzIsMTg2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsyLDE4Nl0sMTMyOlsyLDE4Nl0sMTMzOlsyLDE4Nl0sMTM0OlsyLDE4Nl19LHsxOlsyLDE4N10sNjpbMiwxODddLDI1OlsyLDE4N10sMjY6WzIsMTg3XSw0NjpbMiwxODddLDUxOlsyLDE4N10sNTQ6WzIsMTg3XSw2OTpbMiwxODddLDc1OlsyLDE4N10sODM6WzIsMTg3XSw4ODpbMiwxODddLDkwOlsyLDE4N10sOTk6WzIsMTg3XSwxMDA6ODQsMTAxOlsyLDE4N10sMTAyOlsyLDE4N10sMTAzOlsyLDE4N10sMTA2Ojg1LDEwNzpbMiwxODddLDEwODo2NiwxMTU6WzIsMTg3XSwxMjM6WzIsMTg3XSwxMjU6WzIsMTg3XSwxMjY6WzIsMTg3XSwxMjk6WzEsNzVdLDEzMDpbMiwxODddLDEzMTpbMiwxODddLDEzMjpbMiwxODddLDEzMzpbMiwxODddLDEzNDpbMiwxODddfSx7MTpbMiwxODhdLDY6WzIsMTg4XSwyNTpbMiwxODhdLDI2OlsyLDE4OF0sNDY6WzIsMTg4XSw1MTpbMiwxODhdLDU0OlsyLDE4OF0sNjk6WzIsMTg4XSw3NTpbMiwxODhdLDgzOlsyLDE4OF0sODg6WzIsMTg4XSw5MDpbMiwxODhdLDk5OlsyLDE4OF0sMTAwOjg0LDEwMTpbMiwxODhdLDEwMjpbMiwxODhdLDEwMzpbMiwxODhdLDEwNjo4NSwxMDc6WzIsMTg4XSwxMDg6NjYsMTE1OlsyLDE4OF0sMTIzOlsyLDE4OF0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzIsMTg4XSwxMzI6WzIsMTg4XSwxMzM6WzIsMTg4XSwxMzQ6WzIsMTg4XX0sezE6WzIsMTg5XSw2OlsyLDE4OV0sMjU6WzIsMTg5XSwyNjpbMiwxODldLDQ2OlsyLDE4OV0sNTE6WzIsMTg5XSw1NDpbMiwxODldLDY5OlsyLDE4OV0sNzU6WzIsMTg5XSw4MzpbMiwxODldLDg4OlsyLDE4OV0sOTA6WzIsMTg5XSw5OTpbMiwxODldLDEwMDo4NCwxMDE6WzIsMTg5XSwxMDI6WzIsMTg5XSwxMDM6WzIsMTg5XSwxMDY6ODUsMTA3OlsyLDE4OV0sMTA4OjY2LDExNTpbMiwxODldLDEyMzpbMiwxODldLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzIsMTg5XSwxMzM6WzIsMTg5XSwxMzQ6WzEsODJdfSx7MTpbMiwxOTBdLDY6WzIsMTkwXSwyNTpbMiwxOTBdLDI2OlsyLDE5MF0sNDY6WzIsMTkwXSw1MTpbMiwxOTBdLDU0OlsyLDE5MF0sNjk6WzIsMTkwXSw3NTpbMiwxOTBdLDgzOlsyLDE5MF0sODg6WzIsMTkwXSw5MDpbMiwxOTBdLDk5OlsyLDE5MF0sMTAwOjg0LDEwMTpbMiwxOTBdLDEwMjpbMiwxOTBdLDEwMzpbMiwxOTBdLDEwNjo4NSwxMDc6WzIsMTkwXSwxMDg6NjYsMTE1OlsyLDE5MF0sMTIzOlsyLDE5MF0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsyLDE5MF0sMTM0OlsxLDgyXX0sezE6WzIsMTkxXSw2OlsyLDE5MV0sMjU6WzIsMTkxXSwyNjpbMiwxOTFdLDQ2OlsyLDE5MV0sNTE6WzIsMTkxXSw1NDpbMiwxOTFdLDY5OlsyLDE5MV0sNzU6WzIsMTkxXSw4MzpbMiwxOTFdLDg4OlsyLDE5MV0sOTA6WzIsMTkxXSw5OTpbMiwxOTFdLDEwMDo4NCwxMDE6WzIsMTkxXSwxMDI6WzIsMTkxXSwxMDM6WzIsMTkxXSwxMDY6ODUsMTA3OlsyLDE5MV0sMTA4OjY2LDExNTpbMiwxOTFdLDEyMzpbMiwxOTFdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzIsMTkxXSwxMzM6WzIsMTkxXSwxMzQ6WzIsMTkxXX0sezE6WzIsMTc2XSw2OlsyLDE3Nl0sMjU6WzIsMTc2XSwyNjpbMiwxNzZdLDQ2OlsyLDE3Nl0sNTE6WzIsMTc2XSw1NDpbMiwxNzZdLDY5OlsyLDE3Nl0sNzU6WzIsMTc2XSw4MzpbMiwxNzZdLDg4OlsyLDE3Nl0sOTA6WzIsMTc2XSw5OTpbMiwxNzZdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMjpbMiwxNzZdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDExNTpbMiwxNzZdLDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiwxNzVdLDY6WzIsMTc1XSwyNTpbMiwxNzVdLDI2OlsyLDE3NV0sNDY6WzIsMTc1XSw1MTpbMiwxNzVdLDU0OlsyLDE3NV0sNjk6WzIsMTc1XSw3NTpbMiwxNzVdLDgzOlsyLDE3NV0sODg6WzIsMTc1XSw5MDpbMiwxNzVdLDk5OlsyLDE3NV0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAyOlsyLDE3NV0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTE1OlsyLDE3NV0sMTIzOlsxLDgzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDk4XSw2OlsyLDk4XSwyNTpbMiw5OF0sMjY6WzIsOThdLDQ2OlsyLDk4XSw1MTpbMiw5OF0sNTQ6WzIsOThdLDYzOlsyLDk4XSw2NDpbMiw5OF0sNjU6WzIsOThdLDY3OlsyLDk4XSw2OTpbMiw5OF0sNzA6WzIsOThdLDcxOlsyLDk4XSw3NTpbMiw5OF0sODE6WzIsOThdLDgyOlsyLDk4XSw4MzpbMiw5OF0sODg6WzIsOThdLDkwOlsyLDk4XSw5OTpbMiw5OF0sMTAxOlsyLDk4XSwxMDI6WzIsOThdLDEwMzpbMiw5OF0sMTA3OlsyLDk4XSwxMTU6WzIsOThdLDEyMzpbMiw5OF0sMTI1OlsyLDk4XSwxMjY6WzIsOThdLDEyOTpbMiw5OF0sMTMwOlsyLDk4XSwxMzE6WzIsOThdLDEzMjpbMiw5OF0sMTMzOlsyLDk4XSwxMzQ6WzIsOThdfSx7MTpbMiw3NF0sNjpbMiw3NF0sMjU6WzIsNzRdLDI2OlsyLDc0XSwzNzpbMiw3NF0sNDY6WzIsNzRdLDUxOlsyLDc0XSw1NDpbMiw3NF0sNjM6WzIsNzRdLDY0OlsyLDc0XSw2NTpbMiw3NF0sNjc6WzIsNzRdLDY5OlsyLDc0XSw3MDpbMiw3NF0sNzE6WzIsNzRdLDc1OlsyLDc0XSw3NzpbMiw3NF0sODE6WzIsNzRdLDgyOlsyLDc0XSw4MzpbMiw3NF0sODg6WzIsNzRdLDkwOlsyLDc0XSw5OTpbMiw3NF0sMTAxOlsyLDc0XSwxMDI6WzIsNzRdLDEwMzpbMiw3NF0sMTA3OlsyLDc0XSwxMTU6WzIsNzRdLDEyMzpbMiw3NF0sMTI1OlsyLDc0XSwxMjY6WzIsNzRdLDEyNzpbMiw3NF0sMTI4OlsyLDc0XSwxMjk6WzIsNzRdLDEzMDpbMiw3NF0sMTMxOlsyLDc0XSwxMzI6WzIsNzRdLDEzMzpbMiw3NF0sMTM0OlsyLDc0XSwxMzU6WzIsNzRdfSx7MTpbMiw3NV0sNjpbMiw3NV0sMjU6WzIsNzVdLDI2OlsyLDc1XSwzNzpbMiw3NV0sNDY6WzIsNzVdLDUxOlsyLDc1XSw1NDpbMiw3NV0sNjM6WzIsNzVdLDY0OlsyLDc1XSw2NTpbMiw3NV0sNjc6WzIsNzVdLDY5OlsyLDc1XSw3MDpbMiw3NV0sNzE6WzIsNzVdLDc1OlsyLDc1XSw3NzpbMiw3NV0sODE6WzIsNzVdLDgyOlsyLDc1XSw4MzpbMiw3NV0sODg6WzIsNzVdLDkwOlsyLDc1XSw5OTpbMiw3NV0sMTAxOlsyLDc1XSwxMDI6WzIsNzVdLDEwMzpbMiw3NV0sMTA3OlsyLDc1XSwxMTU6WzIsNzVdLDEyMzpbMiw3NV0sMTI1OlsyLDc1XSwxMjY6WzIsNzVdLDEyNzpbMiw3NV0sMTI4OlsyLDc1XSwxMjk6WzIsNzVdLDEzMDpbMiw3NV0sMTMxOlsyLDc1XSwxMzI6WzIsNzVdLDEzMzpbMiw3NV0sMTM0OlsyLDc1XSwxMzU6WzIsNzVdfSx7MTpbMiw3Nl0sNjpbMiw3Nl0sMjU6WzIsNzZdLDI2OlsyLDc2XSwzNzpbMiw3Nl0sNDY6WzIsNzZdLDUxOlsyLDc2XSw1NDpbMiw3Nl0sNjM6WzIsNzZdLDY0OlsyLDc2XSw2NTpbMiw3Nl0sNjc6WzIsNzZdLDY5OlsyLDc2XSw3MDpbMiw3Nl0sNzE6WzIsNzZdLDc1OlsyLDc2XSw3NzpbMiw3Nl0sODE6WzIsNzZdLDgyOlsyLDc2XSw4MzpbMiw3Nl0sODg6WzIsNzZdLDkwOlsyLDc2XSw5OTpbMiw3Nl0sMTAxOlsyLDc2XSwxMDI6WzIsNzZdLDEwMzpbMiw3Nl0sMTA3OlsyLDc2XSwxMTU6WzIsNzZdLDEyMzpbMiw3Nl0sMTI1OlsyLDc2XSwxMjY6WzIsNzZdLDEyNzpbMiw3Nl0sMTI4OlsyLDc2XSwxMjk6WzIsNzZdLDEzMDpbMiw3Nl0sMTMxOlsyLDc2XSwxMzI6WzIsNzZdLDEzMzpbMiw3Nl0sMTM0OlsyLDc2XSwxMzU6WzIsNzZdfSx7Njk6WzEsMjM1XX0sezU0OlsxLDE4OV0sNjk6WzIsODJdLDg5OjIzNiw5MDpbMSwxODhdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7Njk6WzIsODNdfSx7ODoyMzcsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTM6WzIsMTExXSwyODpbMiwxMTFdLDMwOlsyLDExMV0sMzE6WzIsMTExXSwzMzpbMiwxMTFdLDM0OlsyLDExMV0sMzU6WzIsMTExXSw0MjpbMiwxMTFdLDQzOlsyLDExMV0sNDQ6WzIsMTExXSw0ODpbMiwxMTFdLDQ5OlsyLDExMV0sNjk6WzIsMTExXSw3MzpbMiwxMTFdLDc2OlsyLDExMV0sODA6WzIsMTExXSw4NTpbMiwxMTFdLDg2OlsyLDExMV0sODc6WzIsMTExXSw5MzpbMiwxMTFdLDk3OlsyLDExMV0sOTg6WzIsMTExXSwxMDE6WzIsMTExXSwxMDM6WzIsMTExXSwxMDU6WzIsMTExXSwxMDc6WzIsMTExXSwxMTY6WzIsMTExXSwxMjI6WzIsMTExXSwxMjQ6WzIsMTExXSwxMjU6WzIsMTExXSwxMjY6WzIsMTExXSwxMjc6WzIsMTExXSwxMjg6WzIsMTExXX0sezEzOlsyLDExMl0sMjg6WzIsMTEyXSwzMDpbMiwxMTJdLDMxOlsyLDExMl0sMzM6WzIsMTEyXSwzNDpbMiwxMTJdLDM1OlsyLDExMl0sNDI6WzIsMTEyXSw0MzpbMiwxMTJdLDQ0OlsyLDExMl0sNDg6WzIsMTEyXSw0OTpbMiwxMTJdLDY5OlsyLDExMl0sNzM6WzIsMTEyXSw3NjpbMiwxMTJdLDgwOlsyLDExMl0sODU6WzIsMTEyXSw4NjpbMiwxMTJdLDg3OlsyLDExMl0sOTM6WzIsMTEyXSw5NzpbMiwxMTJdLDk4OlsyLDExMl0sMTAxOlsyLDExMl0sMTAzOlsyLDExMl0sMTA1OlsyLDExMl0sMTA3OlsyLDExMl0sMTE2OlsyLDExMl0sMTIyOlsyLDExMl0sMTI0OlsyLDExMl0sMTI1OlsyLDExMl0sMTI2OlsyLDExMl0sMTI3OlsyLDExMl0sMTI4OlsyLDExMl19LHsxOlsyLDgwXSw2OlsyLDgwXSwyNTpbMiw4MF0sMjY6WzIsODBdLDM3OlsyLDgwXSw0NjpbMiw4MF0sNTE6WzIsODBdLDU0OlsyLDgwXSw2MzpbMiw4MF0sNjQ6WzIsODBdLDY1OlsyLDgwXSw2NzpbMiw4MF0sNjk6WzIsODBdLDcwOlsyLDgwXSw3MTpbMiw4MF0sNzU6WzIsODBdLDc3OlsyLDgwXSw4MTpbMiw4MF0sODI6WzIsODBdLDgzOlsyLDgwXSw4ODpbMiw4MF0sOTA6WzIsODBdLDk5OlsyLDgwXSwxMDE6WzIsODBdLDEwMjpbMiw4MF0sMTAzOlsyLDgwXSwxMDc6WzIsODBdLDExNTpbMiw4MF0sMTIzOlsyLDgwXSwxMjU6WzIsODBdLDEyNjpbMiw4MF0sMTI3OlsyLDgwXSwxMjg6WzIsODBdLDEyOTpbMiw4MF0sMTMwOlsyLDgwXSwxMzE6WzIsODBdLDEzMjpbMiw4MF0sMTMzOlsyLDgwXSwxMzQ6WzIsODBdLDEzNTpbMiw4MF19LHsxOlsyLDgxXSw2OlsyLDgxXSwyNTpbMiw4MV0sMjY6WzIsODFdLDM3OlsyLDgxXSw0NjpbMiw4MV0sNTE6WzIsODFdLDU0OlsyLDgxXSw2MzpbMiw4MV0sNjQ6WzIsODFdLDY1OlsyLDgxXSw2NzpbMiw4MV0sNjk6WzIsODFdLDcwOlsyLDgxXSw3MTpbMiw4MV0sNzU6WzIsODFdLDc3OlsyLDgxXSw4MTpbMiw4MV0sODI6WzIsODFdLDgzOlsyLDgxXSw4ODpbMiw4MV0sOTA6WzIsODFdLDk5OlsyLDgxXSwxMDE6WzIsODFdLDEwMjpbMiw4MV0sMTAzOlsyLDgxXSwxMDc6WzIsODFdLDExNTpbMiw4MV0sMTIzOlsyLDgxXSwxMjU6WzIsODFdLDEyNjpbMiw4MV0sMTI3OlsyLDgxXSwxMjg6WzIsODFdLDEyOTpbMiw4MV0sMTMwOlsyLDgxXSwxMzE6WzIsODFdLDEzMjpbMiw4MV0sMTMzOlsyLDgxXSwxMzQ6WzIsODFdLDEzNTpbMiw4MV19LHsxOlsyLDk5XSw2OlsyLDk5XSwyNTpbMiw5OV0sMjY6WzIsOTldLDQ2OlsyLDk5XSw1MTpbMiw5OV0sNTQ6WzIsOTldLDYzOlsyLDk5XSw2NDpbMiw5OV0sNjU6WzIsOTldLDY3OlsyLDk5XSw2OTpbMiw5OV0sNzA6WzIsOTldLDcxOlsyLDk5XSw3NTpbMiw5OV0sODE6WzIsOTldLDgyOlsyLDk5XSw4MzpbMiw5OV0sODg6WzIsOTldLDkwOlsyLDk5XSw5OTpbMiw5OV0sMTAxOlsyLDk5XSwxMDI6WzIsOTldLDEwMzpbMiw5OV0sMTA3OlsyLDk5XSwxMTU6WzIsOTldLDEyMzpbMiw5OV0sMTI1OlsyLDk5XSwxMjY6WzIsOTldLDEyOTpbMiw5OV0sMTMwOlsyLDk5XSwxMzE6WzIsOTldLDEzMjpbMiw5OV0sMTMzOlsyLDk5XSwxMzQ6WzIsOTldfSx7MTpbMiwzM10sNjpbMiwzM10sMjU6WzIsMzNdLDI2OlsyLDMzXSw0NjpbMiwzM10sNTE6WzIsMzNdLDU0OlsyLDMzXSw2OTpbMiwzM10sNzU6WzIsMzNdLDgzOlsyLDMzXSw4ODpbMiwzM10sOTA6WzIsMzNdLDk5OlsyLDMzXSwxMDA6ODQsMTAxOlsyLDMzXSwxMDI6WzIsMzNdLDEwMzpbMiwzM10sMTA2Ojg1LDEwNzpbMiwzM10sMTA4OjY2LDExNTpbMiwzM10sMTIzOlsyLDMzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHs4OjIzOCw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDEwNF0sNjpbMiwxMDRdLDI1OlsyLDEwNF0sMjY6WzIsMTA0XSw0NjpbMiwxMDRdLDUxOlsyLDEwNF0sNTQ6WzIsMTA0XSw2MzpbMiwxMDRdLDY0OlsyLDEwNF0sNjU6WzIsMTA0XSw2NzpbMiwxMDRdLDY5OlsyLDEwNF0sNzA6WzIsMTA0XSw3MTpbMiwxMDRdLDc1OlsyLDEwNF0sODE6WzIsMTA0XSw4MjpbMiwxMDRdLDgzOlsyLDEwNF0sODg6WzIsMTA0XSw5MDpbMiwxMDRdLDk5OlsyLDEwNF0sMTAxOlsyLDEwNF0sMTAyOlsyLDEwNF0sMTAzOlsyLDEwNF0sMTA3OlsyLDEwNF0sMTE1OlsyLDEwNF0sMTIzOlsyLDEwNF0sMTI1OlsyLDEwNF0sMTI2OlsyLDEwNF0sMTI5OlsyLDEwNF0sMTMwOlsyLDEwNF0sMTMxOlsyLDEwNF0sMTMyOlsyLDEwNF0sMTMzOlsyLDEwNF0sMTM0OlsyLDEwNF19LHs2OlsyLDQ5XSwyNTpbMiw0OV0sNTA6MjM5LDUxOlsxLDIyM10sODM6WzIsNDldfSx7NjpbMiwxMjJdLDI1OlsyLDEyMl0sMjY6WzIsMTIyXSw1MTpbMiwxMjJdLDU0OlsxLDI0MF0sODM6WzIsMTIyXSw4ODpbMiwxMjJdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7NDc6MjQxLDQ4OlsxLDU3XSw0OTpbMSw1OF19LHsyNzoxMDcsMjg6WzEsNzBdLDQxOjEwOCw1MjoyNDIsNTM6MTA2LDU1OjEwOSw1NjoxMTAsNzM6WzEsNjddLDg2OlsxLDExMV0sODc6WzEsMTEyXX0sezQ2OlsyLDU1XSw1MTpbMiw1NV19LHs4OjI0Myw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDE5Ml0sNjpbMiwxOTJdLDI1OlsyLDE5Ml0sMjY6WzIsMTkyXSw0NjpbMiwxOTJdLDUxOlsyLDE5Ml0sNTQ6WzIsMTkyXSw2OTpbMiwxOTJdLDc1OlsyLDE5Ml0sODM6WzIsMTkyXSw4ODpbMiwxOTJdLDkwOlsyLDE5Ml0sOTk6WzIsMTkyXSwxMDA6ODQsMTAxOlsyLDE5Ml0sMTAyOlsyLDE5Ml0sMTAzOlsyLDE5Ml0sMTA2Ojg1LDEwNzpbMiwxOTJdLDEwODo2NiwxMTU6WzIsMTkyXSwxMjM6WzIsMTkyXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHs4OjI0NCw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDE5NF0sNjpbMiwxOTRdLDI1OlsyLDE5NF0sMjY6WzIsMTk0XSw0NjpbMiwxOTRdLDUxOlsyLDE5NF0sNTQ6WzIsMTk0XSw2OTpbMiwxOTRdLDc1OlsyLDE5NF0sODM6WzIsMTk0XSw4ODpbMiwxOTRdLDkwOlsyLDE5NF0sOTk6WzIsMTk0XSwxMDA6ODQsMTAxOlsyLDE5NF0sMTAyOlsyLDE5NF0sMTAzOlsyLDE5NF0sMTA2Ojg1LDEwNzpbMiwxOTRdLDEwODo2NiwxMTU6WzIsMTk0XSwxMjM6WzIsMTk0XSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDE3NF0sNjpbMiwxNzRdLDI1OlsyLDE3NF0sMjY6WzIsMTc0XSw0NjpbMiwxNzRdLDUxOlsyLDE3NF0sNTQ6WzIsMTc0XSw2OTpbMiwxNzRdLDc1OlsyLDE3NF0sODM6WzIsMTc0XSw4ODpbMiwxNzRdLDkwOlsyLDE3NF0sOTk6WzIsMTc0XSwxMDE6WzIsMTc0XSwxMDI6WzIsMTc0XSwxMDM6WzIsMTc0XSwxMDc6WzIsMTc0XSwxMTU6WzIsMTc0XSwxMjM6WzIsMTc0XSwxMjU6WzIsMTc0XSwxMjY6WzIsMTc0XSwxMjk6WzIsMTc0XSwxMzA6WzIsMTc0XSwxMzE6WzIsMTc0XSwxMzI6WzIsMTc0XSwxMzM6WzIsMTc0XSwxMzQ6WzIsMTc0XX0sezg6MjQ1LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsMTI3XSw2OlsyLDEyN10sMjU6WzIsMTI3XSwyNjpbMiwxMjddLDQ2OlsyLDEyN10sNTE6WzIsMTI3XSw1NDpbMiwxMjddLDY5OlsyLDEyN10sNzU6WzIsMTI3XSw4MzpbMiwxMjddLDg4OlsyLDEyN10sOTA6WzIsMTI3XSw5NTpbMSwyNDZdLDk5OlsyLDEyN10sMTAxOlsyLDEyN10sMTAyOlsyLDEyN10sMTAzOlsyLDEyN10sMTA3OlsyLDEyN10sMTE1OlsyLDEyN10sMTIzOlsyLDEyN10sMTI1OlsyLDEyN10sMTI2OlsyLDEyN10sMTI5OlsyLDEyN10sMTMwOlsyLDEyN10sMTMxOlsyLDEyN10sMTMyOlsyLDEyN10sMTMzOlsyLDEyN10sMTM0OlsyLDEyN119LHs1OjI0NywyNTpbMSw1XX0sezI3OjI0OCwyODpbMSw3MF19LHsxMTc6MjQ5LDExOToyMTIsMTIwOlsxLDIxM119LHsyNjpbMSwyNTBdLDExODpbMSwyNTFdLDExOToyNTIsMTIwOlsxLDIxM119LHsyNjpbMiwxNjddLDExODpbMiwxNjddLDEyMDpbMiwxNjddfSx7ODoyNTQsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkyOjI1Myw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsOTJdLDU6MjU1LDY6WzIsOTJdLDI1OlsxLDVdLDI2OlsyLDkyXSw0NjpbMiw5Ml0sNTE6WzIsOTJdLDU0OlsyLDkyXSw1OTo5MCw2MzpbMSw5Ml0sNjQ6WzEsOTNdLDY1OlsxLDk0XSw2Njo5NSw2NzpbMSw5Nl0sNjk6WzIsOTJdLDcwOlsxLDk3XSw3MTpbMSw5OF0sNzU6WzIsOTJdLDc4Ojg5LDgxOlsxLDkxXSw4MjpbMiwxMDJdLDgzOlsyLDkyXSw4ODpbMiw5Ml0sOTA6WzIsOTJdLDk5OlsyLDkyXSwxMDE6WzIsOTJdLDEwMjpbMiw5Ml0sMTAzOlsyLDkyXSwxMDc6WzIsOTJdLDExNTpbMiw5Ml0sMTIzOlsyLDkyXSwxMjU6WzIsOTJdLDEyNjpbMiw5Ml0sMTI5OlsyLDkyXSwxMzA6WzIsOTJdLDEzMTpbMiw5Ml0sMTMyOlsyLDkyXSwxMzM6WzIsOTJdLDEzNDpbMiw5Ml19LHsxOlsyLDY2XSw2OlsyLDY2XSwyNTpbMiw2Nl0sMjY6WzIsNjZdLDQ2OlsyLDY2XSw1MTpbMiw2Nl0sNTQ6WzIsNjZdLDYzOlsyLDY2XSw2NDpbMiw2Nl0sNjU6WzIsNjZdLDY3OlsyLDY2XSw2OTpbMiw2Nl0sNzA6WzIsNjZdLDcxOlsyLDY2XSw3NTpbMiw2Nl0sODE6WzIsNjZdLDgyOlsyLDY2XSw4MzpbMiw2Nl0sODg6WzIsNjZdLDkwOlsyLDY2XSw5OTpbMiw2Nl0sMTAxOlsyLDY2XSwxMDI6WzIsNjZdLDEwMzpbMiw2Nl0sMTA3OlsyLDY2XSwxMTU6WzIsNjZdLDEyMzpbMiw2Nl0sMTI1OlsyLDY2XSwxMjY6WzIsNjZdLDEyOTpbMiw2Nl0sMTMwOlsyLDY2XSwxMzE6WzIsNjZdLDEzMjpbMiw2Nl0sMTMzOlsyLDY2XSwxMzQ6WzIsNjZdfSx7MTpbMiw5NV0sNjpbMiw5NV0sMjU6WzIsOTVdLDI2OlsyLDk1XSw0NjpbMiw5NV0sNTE6WzIsOTVdLDU0OlsyLDk1XSw2OTpbMiw5NV0sNzU6WzIsOTVdLDgzOlsyLDk1XSw4ODpbMiw5NV0sOTA6WzIsOTVdLDk5OlsyLDk1XSwxMDE6WzIsOTVdLDEwMjpbMiw5NV0sMTAzOlsyLDk1XSwxMDc6WzIsOTVdLDExNTpbMiw5NV0sMTIzOlsyLDk1XSwxMjU6WzIsOTVdLDEyNjpbMiw5NV0sMTI5OlsyLDk1XSwxMzA6WzIsOTVdLDEzMTpbMiw5NV0sMTMyOlsyLDk1XSwxMzM6WzIsOTVdLDEzNDpbMiw5NV19LHsxNDoyNTYsMTU6MTIwLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjEyMSw0MTo2MCw1NTo0Nyw1Njo0OCw1ODoyMTUsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5ODpbMSw1M119LHsxOlsyLDEzMl0sNjpbMiwxMzJdLDI1OlsyLDEzMl0sMjY6WzIsMTMyXSw0NjpbMiwxMzJdLDUxOlsyLDEzMl0sNTQ6WzIsMTMyXSw2MzpbMiwxMzJdLDY0OlsyLDEzMl0sNjU6WzIsMTMyXSw2NzpbMiwxMzJdLDY5OlsyLDEzMl0sNzA6WzIsMTMyXSw3MTpbMiwxMzJdLDc1OlsyLDEzMl0sODE6WzIsMTMyXSw4MjpbMiwxMzJdLDgzOlsyLDEzMl0sODg6WzIsMTMyXSw5MDpbMiwxMzJdLDk5OlsyLDEzMl0sMTAxOlsyLDEzMl0sMTAyOlsyLDEzMl0sMTAzOlsyLDEzMl0sMTA3OlsyLDEzMl0sMTE1OlsyLDEzMl0sMTIzOlsyLDEzMl0sMTI1OlsyLDEzMl0sMTI2OlsyLDEzMl0sMTI5OlsyLDEzMl0sMTMwOlsyLDEzMl0sMTMxOlsyLDEzMl0sMTMyOlsyLDEzMl0sMTMzOlsyLDEzMl0sMTM0OlsyLDEzMl19LHs2OlsxLDcxXSwyNjpbMSwyNTddfSx7ODoyNTgsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7NjpbMiw2MV0sMTM6WzIsMTEyXSwyNTpbMiw2MV0sMjg6WzIsMTEyXSwzMDpbMiwxMTJdLDMxOlsyLDExMl0sMzM6WzIsMTEyXSwzNDpbMiwxMTJdLDM1OlsyLDExMl0sNDI6WzIsMTEyXSw0MzpbMiwxMTJdLDQ0OlsyLDExMl0sNDg6WzIsMTEyXSw0OTpbMiwxMTJdLDUxOlsyLDYxXSw3MzpbMiwxMTJdLDc2OlsyLDExMl0sODA6WzIsMTEyXSw4NTpbMiwxMTJdLDg2OlsyLDExMl0sODc6WzIsMTEyXSw4ODpbMiw2MV0sOTM6WzIsMTEyXSw5NzpbMiwxMTJdLDk4OlsyLDExMl0sMTAxOlsyLDExMl0sMTAzOlsyLDExMl0sMTA1OlsyLDExMl0sMTA3OlsyLDExMl0sMTE2OlsyLDExMl0sMTIyOlsyLDExMl0sMTI0OlsyLDExMl0sMTI1OlsyLDExMl0sMTI2OlsyLDExMl0sMTI3OlsyLDExMl0sMTI4OlsyLDExMl19LHs2OlsxLDI2MF0sMjU6WzEsMjYxXSw4ODpbMSwyNTldfSx7NjpbMiw1MF0sODoxOTcsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNTpbMiw1MF0sMjY6WzIsNTBdLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTc6MTQ1LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDgzOlsyLDUwXSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw4ODpbMiw1MF0sOTE6MjYyLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7NjpbMiw0OV0sMjU6WzIsNDldLDI2OlsyLDQ5XSw1MDoyNjMsNTE6WzEsMjIzXX0sezE6WzIsMTcxXSw2OlsyLDE3MV0sMjU6WzIsMTcxXSwyNjpbMiwxNzFdLDQ2OlsyLDE3MV0sNTE6WzIsMTcxXSw1NDpbMiwxNzFdLDY5OlsyLDE3MV0sNzU6WzIsMTcxXSw4MzpbMiwxNzFdLDg4OlsyLDE3MV0sOTA6WzIsMTcxXSw5OTpbMiwxNzFdLDEwMTpbMiwxNzFdLDEwMjpbMiwxNzFdLDEwMzpbMiwxNzFdLDEwNzpbMiwxNzFdLDExNTpbMiwxNzFdLDExODpbMiwxNzFdLDEyMzpbMiwxNzFdLDEyNTpbMiwxNzFdLDEyNjpbMiwxNzFdLDEyOTpbMiwxNzFdLDEzMDpbMiwxNzFdLDEzMTpbMiwxNzFdLDEzMjpbMiwxNzFdLDEzMzpbMiwxNzFdLDEzNDpbMiwxNzFdfSx7ODoyNjQsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoyNjUsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTEzOlsyLDE1MF0sMTE0OlsyLDE1MF19LHsyNzoxNTYsMjg6WzEsNzBdLDU1OjE1Nyw1NjoxNTgsNzM6WzEsNjddLDg3OlsxLDExMl0sMTEyOjI2Nn0sezE6WzIsMTU2XSw2OlsyLDE1Nl0sMjU6WzIsMTU2XSwyNjpbMiwxNTZdLDQ2OlsyLDE1Nl0sNTE6WzIsMTU2XSw1NDpbMiwxNTZdLDY5OlsyLDE1Nl0sNzU6WzIsMTU2XSw4MzpbMiwxNTZdLDg4OlsyLDE1Nl0sOTA6WzIsMTU2XSw5OTpbMiwxNTZdLDEwMDo4NCwxMDE6WzIsMTU2XSwxMDI6WzEsMjY3XSwxMDM6WzIsMTU2XSwxMDY6ODUsMTA3OlsyLDE1Nl0sMTA4OjY2LDExNTpbMSwyNjhdLDEyMzpbMiwxNTZdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezE6WzIsMTU3XSw2OlsyLDE1N10sMjU6WzIsMTU3XSwyNjpbMiwxNTddLDQ2OlsyLDE1N10sNTE6WzIsMTU3XSw1NDpbMiwxNTddLDY5OlsyLDE1N10sNzU6WzIsMTU3XSw4MzpbMiwxNTddLDg4OlsyLDE1N10sOTA6WzIsMTU3XSw5OTpbMiwxNTddLDEwMDo4NCwxMDE6WzIsMTU3XSwxMDI6WzEsMjY5XSwxMDM6WzIsMTU3XSwxMDY6ODUsMTA3OlsyLDE1N10sMTA4OjY2LDExNTpbMiwxNTddLDEyMzpbMiwxNTddLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezY6WzEsMjcxXSwyNTpbMSwyNzJdLDc1OlsxLDI3MF19LHs2OlsyLDUwXSwxMjoxNjUsMjU6WzIsNTBdLDI2OlsyLDUwXSwyNzoxNjYsMjg6WzEsNzBdLDI5OjE2NywzMDpbMSw2OF0sMzE6WzEsNjldLDM4OjI3MywzOToxNjQsNDE6MTY4LDQzOlsxLDQ2XSw3NTpbMiw1MF0sODY6WzEsMTExXX0sezg6Mjc0LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjU6WzEsMjc1XSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTpbMiw3OV0sNjpbMiw3OV0sMjU6WzIsNzldLDI2OlsyLDc5XSwzNzpbMiw3OV0sNDY6WzIsNzldLDUxOlsyLDc5XSw1NDpbMiw3OV0sNjM6WzIsNzldLDY0OlsyLDc5XSw2NTpbMiw3OV0sNjc6WzIsNzldLDY5OlsyLDc5XSw3MDpbMiw3OV0sNzE6WzIsNzldLDc1OlsyLDc5XSw3NzpbMiw3OV0sODE6WzIsNzldLDgyOlsyLDc5XSw4MzpbMiw3OV0sODg6WzIsNzldLDkwOlsyLDc5XSw5OTpbMiw3OV0sMTAxOlsyLDc5XSwxMDI6WzIsNzldLDEwMzpbMiw3OV0sMTA3OlsyLDc5XSwxMTU6WzIsNzldLDEyMzpbMiw3OV0sMTI1OlsyLDc5XSwxMjY6WzIsNzldLDEyNzpbMiw3OV0sMTI4OlsyLDc5XSwxMjk6WzIsNzldLDEzMDpbMiw3OV0sMTMxOlsyLDc5XSwxMzI6WzIsNzldLDEzMzpbMiw3OV0sMTM0OlsyLDc5XSwxMzU6WzIsNzldfSx7ODoyNzYsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDY5OlsyLDExNV0sNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHs2OTpbMiwxMTZdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MjY6WzEsMjc3XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezY6WzEsMjYwXSwyNTpbMSwyNjFdLDgzOlsxLDI3OF19LHs2OlsyLDYxXSwyNTpbMiw2MV0sMjY6WzIsNjFdLDUxOlsyLDYxXSw4MzpbMiw2MV0sODg6WzIsNjFdfSx7NToyNzksMjU6WzEsNV19LHs0NjpbMiw1M10sNTE6WzIsNTNdfSx7NDY6WzIsNTZdLDUxOlsyLDU2XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezI2OlsxLDI4MF0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTIzOlsxLDgzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHs1OjI4MSwyNTpbMSw1XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezU6MjgyLDI1OlsxLDVdfSx7MTpbMiwxMjhdLDY6WzIsMTI4XSwyNTpbMiwxMjhdLDI2OlsyLDEyOF0sNDY6WzIsMTI4XSw1MTpbMiwxMjhdLDU0OlsyLDEyOF0sNjk6WzIsMTI4XSw3NTpbMiwxMjhdLDgzOlsyLDEyOF0sODg6WzIsMTI4XSw5MDpbMiwxMjhdLDk5OlsyLDEyOF0sMTAxOlsyLDEyOF0sMTAyOlsyLDEyOF0sMTAzOlsyLDEyOF0sMTA3OlsyLDEyOF0sMTE1OlsyLDEyOF0sMTIzOlsyLDEyOF0sMTI1OlsyLDEyOF0sMTI2OlsyLDEyOF0sMTI5OlsyLDEyOF0sMTMwOlsyLDEyOF0sMTMxOlsyLDEyOF0sMTMyOlsyLDEyOF0sMTMzOlsyLDEyOF0sMTM0OlsyLDEyOF19LHs1OjI4MywyNTpbMSw1XX0sezI2OlsxLDI4NF0sMTE4OlsxLDI4NV0sMTE5OjI1MiwxMjA6WzEsMjEzXX0sezE6WzIsMTY1XSw2OlsyLDE2NV0sMjU6WzIsMTY1XSwyNjpbMiwxNjVdLDQ2OlsyLDE2NV0sNTE6WzIsMTY1XSw1NDpbMiwxNjVdLDY5OlsyLDE2NV0sNzU6WzIsMTY1XSw4MzpbMiwxNjVdLDg4OlsyLDE2NV0sOTA6WzIsMTY1XSw5OTpbMiwxNjVdLDEwMTpbMiwxNjVdLDEwMjpbMiwxNjVdLDEwMzpbMiwxNjVdLDEwNzpbMiwxNjVdLDExNTpbMiwxNjVdLDEyMzpbMiwxNjVdLDEyNTpbMiwxNjVdLDEyNjpbMiwxNjVdLDEyOTpbMiwxNjVdLDEzMDpbMiwxNjVdLDEzMTpbMiwxNjVdLDEzMjpbMiwxNjVdLDEzMzpbMiwxNjVdLDEzNDpbMiwxNjVdfSx7NToyODYsMjU6WzEsNV19LHsyNjpbMiwxNjhdLDExODpbMiwxNjhdLDEyMDpbMiwxNjhdfSx7NToyODcsMjU6WzEsNV0sNTE6WzEsMjg4XX0sezI1OlsyLDEyNF0sNTE6WzIsMTI0XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezE6WzIsOTNdLDY6WzIsOTNdLDI1OlsyLDkzXSwyNjpbMiw5M10sNDY6WzIsOTNdLDUxOlsyLDkzXSw1NDpbMiw5M10sNjk6WzIsOTNdLDc1OlsyLDkzXSw4MzpbMiw5M10sODg6WzIsOTNdLDkwOlsyLDkzXSw5OTpbMiw5M10sMTAxOlsyLDkzXSwxMDI6WzIsOTNdLDEwMzpbMiw5M10sMTA3OlsyLDkzXSwxMTU6WzIsOTNdLDEyMzpbMiw5M10sMTI1OlsyLDkzXSwxMjY6WzIsOTNdLDEyOTpbMiw5M10sMTMwOlsyLDkzXSwxMzE6WzIsOTNdLDEzMjpbMiw5M10sMTMzOlsyLDkzXSwxMzQ6WzIsOTNdfSx7MTpbMiw5Nl0sNToyODksNjpbMiw5Nl0sMjU6WzEsNV0sMjY6WzIsOTZdLDQ2OlsyLDk2XSw1MTpbMiw5Nl0sNTQ6WzIsOTZdLDU5OjkwLDYzOlsxLDkyXSw2NDpbMSw5M10sNjU6WzEsOTRdLDY2Ojk1LDY3OlsxLDk2XSw2OTpbMiw5Nl0sNzA6WzEsOTddLDcxOlsxLDk4XSw3NTpbMiw5Nl0sNzg6ODksODE6WzEsOTFdLDgyOlsyLDEwMl0sODM6WzIsOTZdLDg4OlsyLDk2XSw5MDpbMiw5Nl0sOTk6WzIsOTZdLDEwMTpbMiw5Nl0sMTAyOlsyLDk2XSwxMDM6WzIsOTZdLDEwNzpbMiw5Nl0sMTE1OlsyLDk2XSwxMjM6WzIsOTZdLDEyNTpbMiw5Nl0sMTI2OlsyLDk2XSwxMjk6WzIsOTZdLDEzMDpbMiw5Nl0sMTMxOlsyLDk2XSwxMzI6WzIsOTZdLDEzMzpbMiw5Nl0sMTM0OlsyLDk2XX0sezk5OlsxLDI5MF19LHs4ODpbMSwyOTFdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiwxMTBdLDY6WzIsMTEwXSwyNTpbMiwxMTBdLDI2OlsyLDExMF0sMzc6WzIsMTEwXSw0NjpbMiwxMTBdLDUxOlsyLDExMF0sNTQ6WzIsMTEwXSw2MzpbMiwxMTBdLDY0OlsyLDExMF0sNjU6WzIsMTEwXSw2NzpbMiwxMTBdLDY5OlsyLDExMF0sNzA6WzIsMTEwXSw3MTpbMiwxMTBdLDc1OlsyLDExMF0sODE6WzIsMTEwXSw4MjpbMiwxMTBdLDgzOlsyLDExMF0sODg6WzIsMTEwXSw5MDpbMiwxMTBdLDk5OlsyLDExMF0sMTAxOlsyLDExMF0sMTAyOlsyLDExMF0sMTAzOlsyLDExMF0sMTA3OlsyLDExMF0sMTEzOlsyLDExMF0sMTE0OlsyLDExMF0sMTE1OlsyLDExMF0sMTIzOlsyLDExMF0sMTI1OlsyLDExMF0sMTI2OlsyLDExMF0sMTI5OlsyLDExMF0sMTMwOlsyLDExMF0sMTMxOlsyLDExMF0sMTMyOlsyLDExMF0sMTMzOlsyLDExMF0sMTM0OlsyLDExMF19LHs4OjE5Nyw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTc6MTQ1LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkxOjI5Miw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTk3LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjU6WzEsMTQ0XSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU3OjE0NSw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NDoyOTMsODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTE6MTQzLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7NjpbMiwxMThdLDI1OlsyLDExOF0sMjY6WzIsMTE4XSw1MTpbMiwxMThdLDgzOlsyLDExOF0sODg6WzIsMTE4XX0sezY6WzEsMjYwXSwyNTpbMSwyNjFdLDI2OlsxLDI5NF19LHsxOlsyLDEzNV0sNjpbMiwxMzVdLDI1OlsyLDEzNV0sMjY6WzIsMTM1XSw0NjpbMiwxMzVdLDUxOlsyLDEzNV0sNTQ6WzIsMTM1XSw2OTpbMiwxMzVdLDc1OlsyLDEzNV0sODM6WzIsMTM1XSw4ODpbMiwxMzVdLDkwOlsyLDEzNV0sOTk6WzIsMTM1XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDI6WzIsMTM1XSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMTU6WzIsMTM1XSwxMjM6WzIsMTM1XSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDEzN10sNjpbMiwxMzddLDI1OlsyLDEzN10sMjY6WzIsMTM3XSw0NjpbMiwxMzddLDUxOlsyLDEzN10sNTQ6WzIsMTM3XSw2OTpbMiwxMzddLDc1OlsyLDEzN10sODM6WzIsMTM3XSw4ODpbMiwxMzddLDkwOlsyLDEzN10sOTk6WzIsMTM3XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDI6WzIsMTM3XSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMTU6WzIsMTM3XSwxMjM6WzIsMTM3XSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxMTM6WzIsMTU1XSwxMTQ6WzIsMTU1XX0sezg6Mjk1LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6Mjk2LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6Mjk3LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsODRdLDY6WzIsODRdLDI1OlsyLDg0XSwyNjpbMiw4NF0sMzc6WzIsODRdLDQ2OlsyLDg0XSw1MTpbMiw4NF0sNTQ6WzIsODRdLDYzOlsyLDg0XSw2NDpbMiw4NF0sNjU6WzIsODRdLDY3OlsyLDg0XSw2OTpbMiw4NF0sNzA6WzIsODRdLDcxOlsyLDg0XSw3NTpbMiw4NF0sODE6WzIsODRdLDgyOlsyLDg0XSw4MzpbMiw4NF0sODg6WzIsODRdLDkwOlsyLDg0XSw5OTpbMiw4NF0sMTAxOlsyLDg0XSwxMDI6WzIsODRdLDEwMzpbMiw4NF0sMTA3OlsyLDg0XSwxMTM6WzIsODRdLDExNDpbMiw4NF0sMTE1OlsyLDg0XSwxMjM6WzIsODRdLDEyNTpbMiw4NF0sMTI2OlsyLDg0XSwxMjk6WzIsODRdLDEzMDpbMiw4NF0sMTMxOlsyLDg0XSwxMzI6WzIsODRdLDEzMzpbMiw4NF0sMTM0OlsyLDg0XX0sezEyOjE2NSwyNzoxNjYsMjg6WzEsNzBdLDI5OjE2NywzMDpbMSw2OF0sMzE6WzEsNjldLDM4OjI5OCwzOToxNjQsNDE6MTY4LDQzOlsxLDQ2XSw4NjpbMSwxMTFdfSx7NjpbMiw4NV0sMTI6MTY1LDI1OlsyLDg1XSwyNjpbMiw4NV0sMjc6MTY2LDI4OlsxLDcwXSwyOToxNjcsMzA6WzEsNjhdLDMxOlsxLDY5XSwzODoxNjMsMzk6MTY0LDQxOjE2OCw0MzpbMSw0Nl0sNTE6WzIsODVdLDc0OjI5OSw4NjpbMSwxMTFdfSx7NjpbMiw4N10sMjU6WzIsODddLDI2OlsyLDg3XSw1MTpbMiw4N10sNzU6WzIsODddfSx7NjpbMiwzNl0sMjU6WzIsMzZdLDI2OlsyLDM2XSw1MTpbMiwzNl0sNzU6WzIsMzZdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7ODozMDAsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7Njk6WzIsMTE0XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezE6WzIsMzRdLDY6WzIsMzRdLDI1OlsyLDM0XSwyNjpbMiwzNF0sNDY6WzIsMzRdLDUxOlsyLDM0XSw1NDpbMiwzNF0sNjk6WzIsMzRdLDc1OlsyLDM0XSw4MzpbMiwzNF0sODg6WzIsMzRdLDkwOlsyLDM0XSw5OTpbMiwzNF0sMTAxOlsyLDM0XSwxMDI6WzIsMzRdLDEwMzpbMiwzNF0sMTA3OlsyLDM0XSwxMTU6WzIsMzRdLDEyMzpbMiwzNF0sMTI1OlsyLDM0XSwxMjY6WzIsMzRdLDEyOTpbMiwzNF0sMTMwOlsyLDM0XSwxMzE6WzIsMzRdLDEzMjpbMiwzNF0sMTMzOlsyLDM0XSwxMzQ6WzIsMzRdfSx7MTpbMiwxMDVdLDY6WzIsMTA1XSwyNTpbMiwxMDVdLDI2OlsyLDEwNV0sNDY6WzIsMTA1XSw1MTpbMiwxMDVdLDU0OlsyLDEwNV0sNjM6WzIsMTA1XSw2NDpbMiwxMDVdLDY1OlsyLDEwNV0sNjc6WzIsMTA1XSw2OTpbMiwxMDVdLDcwOlsyLDEwNV0sNzE6WzIsMTA1XSw3NTpbMiwxMDVdLDgxOlsyLDEwNV0sODI6WzIsMTA1XSw4MzpbMiwxMDVdLDg4OlsyLDEwNV0sOTA6WzIsMTA1XSw5OTpbMiwxMDVdLDEwMTpbMiwxMDVdLDEwMjpbMiwxMDVdLDEwMzpbMiwxMDVdLDEwNzpbMiwxMDVdLDExNTpbMiwxMDVdLDEyMzpbMiwxMDVdLDEyNTpbMiwxMDVdLDEyNjpbMiwxMDVdLDEyOTpbMiwxMDVdLDEzMDpbMiwxMDVdLDEzMTpbMiwxMDVdLDEzMjpbMiwxMDVdLDEzMzpbMiwxMDVdLDEzNDpbMiwxMDVdfSx7MTpbMiw0NV0sNjpbMiw0NV0sMjU6WzIsNDVdLDI2OlsyLDQ1XSw0NjpbMiw0NV0sNTE6WzIsNDVdLDU0OlsyLDQ1XSw2OTpbMiw0NV0sNzU6WzIsNDVdLDgzOlsyLDQ1XSw4ODpbMiw0NV0sOTA6WzIsNDVdLDk5OlsyLDQ1XSwxMDE6WzIsNDVdLDEwMjpbMiw0NV0sMTAzOlsyLDQ1XSwxMDc6WzIsNDVdLDExNTpbMiw0NV0sMTIzOlsyLDQ1XSwxMjU6WzIsNDVdLDEyNjpbMiw0NV0sMTI5OlsyLDQ1XSwxMzA6WzIsNDVdLDEzMTpbMiw0NV0sMTMyOlsyLDQ1XSwxMzM6WzIsNDVdLDEzNDpbMiw0NV19LHsxOlsyLDE5M10sNjpbMiwxOTNdLDI1OlsyLDE5M10sMjY6WzIsMTkzXSw0NjpbMiwxOTNdLDUxOlsyLDE5M10sNTQ6WzIsMTkzXSw2OTpbMiwxOTNdLDc1OlsyLDE5M10sODM6WzIsMTkzXSw4ODpbMiwxOTNdLDkwOlsyLDE5M10sOTk6WzIsMTkzXSwxMDE6WzIsMTkzXSwxMDI6WzIsMTkzXSwxMDM6WzIsMTkzXSwxMDc6WzIsMTkzXSwxMTU6WzIsMTkzXSwxMjM6WzIsMTkzXSwxMjU6WzIsMTkzXSwxMjY6WzIsMTkzXSwxMjk6WzIsMTkzXSwxMzA6WzIsMTkzXSwxMzE6WzIsMTkzXSwxMzI6WzIsMTkzXSwxMzM6WzIsMTkzXSwxMzQ6WzIsMTkzXX0sezE6WzIsMTcyXSw2OlsyLDE3Ml0sMjU6WzIsMTcyXSwyNjpbMiwxNzJdLDQ2OlsyLDE3Ml0sNTE6WzIsMTcyXSw1NDpbMiwxNzJdLDY5OlsyLDE3Ml0sNzU6WzIsMTcyXSw4MzpbMiwxNzJdLDg4OlsyLDE3Ml0sOTA6WzIsMTcyXSw5OTpbMiwxNzJdLDEwMTpbMiwxNzJdLDEwMjpbMiwxNzJdLDEwMzpbMiwxNzJdLDEwNzpbMiwxNzJdLDExNTpbMiwxNzJdLDExODpbMiwxNzJdLDEyMzpbMiwxNzJdLDEyNTpbMiwxNzJdLDEyNjpbMiwxNzJdLDEyOTpbMiwxNzJdLDEzMDpbMiwxNzJdLDEzMTpbMiwxNzJdLDEzMjpbMiwxNzJdLDEzMzpbMiwxNzJdLDEzNDpbMiwxNzJdfSx7MTpbMiwxMjldLDY6WzIsMTI5XSwyNTpbMiwxMjldLDI2OlsyLDEyOV0sNDY6WzIsMTI5XSw1MTpbMiwxMjldLDU0OlsyLDEyOV0sNjk6WzIsMTI5XSw3NTpbMiwxMjldLDgzOlsyLDEyOV0sODg6WzIsMTI5XSw5MDpbMiwxMjldLDk5OlsyLDEyOV0sMTAxOlsyLDEyOV0sMTAyOlsyLDEyOV0sMTAzOlsyLDEyOV0sMTA3OlsyLDEyOV0sMTE1OlsyLDEyOV0sMTIzOlsyLDEyOV0sMTI1OlsyLDEyOV0sMTI2OlsyLDEyOV0sMTI5OlsyLDEyOV0sMTMwOlsyLDEyOV0sMTMxOlsyLDEyOV0sMTMyOlsyLDEyOV0sMTMzOlsyLDEyOV0sMTM0OlsyLDEyOV19LHsxOlsyLDEzMF0sNjpbMiwxMzBdLDI1OlsyLDEzMF0sMjY6WzIsMTMwXSw0NjpbMiwxMzBdLDUxOlsyLDEzMF0sNTQ6WzIsMTMwXSw2OTpbMiwxMzBdLDc1OlsyLDEzMF0sODM6WzIsMTMwXSw4ODpbMiwxMzBdLDkwOlsyLDEzMF0sOTU6WzIsMTMwXSw5OTpbMiwxMzBdLDEwMTpbMiwxMzBdLDEwMjpbMiwxMzBdLDEwMzpbMiwxMzBdLDEwNzpbMiwxMzBdLDExNTpbMiwxMzBdLDEyMzpbMiwxMzBdLDEyNTpbMiwxMzBdLDEyNjpbMiwxMzBdLDEyOTpbMiwxMzBdLDEzMDpbMiwxMzBdLDEzMTpbMiwxMzBdLDEzMjpbMiwxMzBdLDEzMzpbMiwxMzBdLDEzNDpbMiwxMzBdfSx7MTpbMiwxNjNdLDY6WzIsMTYzXSwyNTpbMiwxNjNdLDI2OlsyLDE2M10sNDY6WzIsMTYzXSw1MTpbMiwxNjNdLDU0OlsyLDE2M10sNjk6WzIsMTYzXSw3NTpbMiwxNjNdLDgzOlsyLDE2M10sODg6WzIsMTYzXSw5MDpbMiwxNjNdLDk5OlsyLDE2M10sMTAxOlsyLDE2M10sMTAyOlsyLDE2M10sMTAzOlsyLDE2M10sMTA3OlsyLDE2M10sMTE1OlsyLDE2M10sMTIzOlsyLDE2M10sMTI1OlsyLDE2M10sMTI2OlsyLDE2M10sMTI5OlsyLDE2M10sMTMwOlsyLDE2M10sMTMxOlsyLDE2M10sMTMyOlsyLDE2M10sMTMzOlsyLDE2M10sMTM0OlsyLDE2M119LHs1OjMwMSwyNTpbMSw1XX0sezI2OlsxLDMwMl19LHs2OlsxLDMwM10sMjY6WzIsMTY5XSwxMTg6WzIsMTY5XSwxMjA6WzIsMTY5XX0sezg6MzA0LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsOTddLDY6WzIsOTddLDI1OlsyLDk3XSwyNjpbMiw5N10sNDY6WzIsOTddLDUxOlsyLDk3XSw1NDpbMiw5N10sNjk6WzIsOTddLDc1OlsyLDk3XSw4MzpbMiw5N10sODg6WzIsOTddLDkwOlsyLDk3XSw5OTpbMiw5N10sMTAxOlsyLDk3XSwxMDI6WzIsOTddLDEwMzpbMiw5N10sMTA3OlsyLDk3XSwxMTU6WzIsOTddLDEyMzpbMiw5N10sMTI1OlsyLDk3XSwxMjY6WzIsOTddLDEyOTpbMiw5N10sMTMwOlsyLDk3XSwxMzE6WzIsOTddLDEzMjpbMiw5N10sMTMzOlsyLDk3XSwxMzQ6WzIsOTddfSx7MTpbMiwxMzNdLDY6WzIsMTMzXSwyNTpbMiwxMzNdLDI2OlsyLDEzM10sNDY6WzIsMTMzXSw1MTpbMiwxMzNdLDU0OlsyLDEzM10sNjM6WzIsMTMzXSw2NDpbMiwxMzNdLDY1OlsyLDEzM10sNjc6WzIsMTMzXSw2OTpbMiwxMzNdLDcwOlsyLDEzM10sNzE6WzIsMTMzXSw3NTpbMiwxMzNdLDgxOlsyLDEzM10sODI6WzIsMTMzXSw4MzpbMiwxMzNdLDg4OlsyLDEzM10sOTA6WzIsMTMzXSw5OTpbMiwxMzNdLDEwMTpbMiwxMzNdLDEwMjpbMiwxMzNdLDEwMzpbMiwxMzNdLDEwNzpbMiwxMzNdLDExNTpbMiwxMzNdLDEyMzpbMiwxMzNdLDEyNTpbMiwxMzNdLDEyNjpbMiwxMzNdLDEyOTpbMiwxMzNdLDEzMDpbMiwxMzNdLDEzMTpbMiwxMzNdLDEzMjpbMiwxMzNdLDEzMzpbMiwxMzNdLDEzNDpbMiwxMzNdfSx7MTpbMiwxMTNdLDY6WzIsMTEzXSwyNTpbMiwxMTNdLDI2OlsyLDExM10sNDY6WzIsMTEzXSw1MTpbMiwxMTNdLDU0OlsyLDExM10sNjM6WzIsMTEzXSw2NDpbMiwxMTNdLDY1OlsyLDExM10sNjc6WzIsMTEzXSw2OTpbMiwxMTNdLDcwOlsyLDExM10sNzE6WzIsMTEzXSw3NTpbMiwxMTNdLDgxOlsyLDExM10sODI6WzIsMTEzXSw4MzpbMiwxMTNdLDg4OlsyLDExM10sOTA6WzIsMTEzXSw5OTpbMiwxMTNdLDEwMTpbMiwxMTNdLDEwMjpbMiwxMTNdLDEwMzpbMiwxMTNdLDEwNzpbMiwxMTNdLDExNTpbMiwxMTNdLDEyMzpbMiwxMTNdLDEyNTpbMiwxMTNdLDEyNjpbMiwxMTNdLDEyOTpbMiwxMTNdLDEzMDpbMiwxMTNdLDEzMTpbMiwxMTNdLDEzMjpbMiwxMTNdLDEzMzpbMiwxMTNdLDEzNDpbMiwxMTNdfSx7NjpbMiwxMTldLDI1OlsyLDExOV0sMjY6WzIsMTE5XSw1MTpbMiwxMTldLDgzOlsyLDExOV0sODg6WzIsMTE5XX0sezY6WzIsNDldLDI1OlsyLDQ5XSwyNjpbMiw0OV0sNTA6MzA1LDUxOlsxLDIyM119LHs2OlsyLDEyMF0sMjU6WzIsMTIwXSwyNjpbMiwxMjBdLDUxOlsyLDEyMF0sODM6WzIsMTIwXSw4ODpbMiwxMjBdfSx7MTpbMiwxNThdLDY6WzIsMTU4XSwyNTpbMiwxNThdLDI2OlsyLDE1OF0sNDY6WzIsMTU4XSw1MTpbMiwxNThdLDU0OlsyLDE1OF0sNjk6WzIsMTU4XSw3NTpbMiwxNThdLDgzOlsyLDE1OF0sODg6WzIsMTU4XSw5MDpbMiwxNThdLDk5OlsyLDE1OF0sMTAwOjg0LDEwMTpbMiwxNThdLDEwMjpbMiwxNThdLDEwMzpbMiwxNThdLDEwNjo4NSwxMDc6WzIsMTU4XSwxMDg6NjYsMTE1OlsxLDMwNl0sMTIzOlsyLDE1OF0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiwxNjBdLDY6WzIsMTYwXSwyNTpbMiwxNjBdLDI2OlsyLDE2MF0sNDY6WzIsMTYwXSw1MTpbMiwxNjBdLDU0OlsyLDE2MF0sNjk6WzIsMTYwXSw3NTpbMiwxNjBdLDgzOlsyLDE2MF0sODg6WzIsMTYwXSw5MDpbMiwxNjBdLDk5OlsyLDE2MF0sMTAwOjg0LDEwMTpbMiwxNjBdLDEwMjpbMSwzMDddLDEwMzpbMiwxNjBdLDEwNjo4NSwxMDc6WzIsMTYwXSwxMDg6NjYsMTE1OlsyLDE2MF0sMTIzOlsyLDE2MF0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiwxNTldLDY6WzIsMTU5XSwyNTpbMiwxNTldLDI2OlsyLDE1OV0sNDY6WzIsMTU5XSw1MTpbMiwxNTldLDU0OlsyLDE1OV0sNjk6WzIsMTU5XSw3NTpbMiwxNTldLDgzOlsyLDE1OV0sODg6WzIsMTU5XSw5MDpbMiwxNTldLDk5OlsyLDE1OV0sMTAwOjg0LDEwMTpbMiwxNTldLDEwMjpbMiwxNTldLDEwMzpbMiwxNTldLDEwNjo4NSwxMDc6WzIsMTU5XSwxMDg6NjYsMTE1OlsyLDE1OV0sMTIzOlsyLDE1OV0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7NjpbMiw4OF0sMjU6WzIsODhdLDI2OlsyLDg4XSw1MTpbMiw4OF0sNzU6WzIsODhdfSx7NjpbMiw0OV0sMjU6WzIsNDldLDI2OlsyLDQ5XSw1MDozMDgsNTE6WzEsMjMzXX0sezI2OlsxLDMwOV0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTIzOlsxLDgzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsyNjpbMSwzMTBdfSx7MTpbMiwxNjZdLDY6WzIsMTY2XSwyNTpbMiwxNjZdLDI2OlsyLDE2Nl0sNDY6WzIsMTY2XSw1MTpbMiwxNjZdLDU0OlsyLDE2Nl0sNjk6WzIsMTY2XSw3NTpbMiwxNjZdLDgzOlsyLDE2Nl0sODg6WzIsMTY2XSw5MDpbMiwxNjZdLDk5OlsyLDE2Nl0sMTAxOlsyLDE2Nl0sMTAyOlsyLDE2Nl0sMTAzOlsyLDE2Nl0sMTA3OlsyLDE2Nl0sMTE1OlsyLDE2Nl0sMTIzOlsyLDE2Nl0sMTI1OlsyLDE2Nl0sMTI2OlsyLDE2Nl0sMTI5OlsyLDE2Nl0sMTMwOlsyLDE2Nl0sMTMxOlsyLDE2Nl0sMTMyOlsyLDE2Nl0sMTMzOlsyLDE2Nl0sMTM0OlsyLDE2Nl19LHsyNjpbMiwxNzBdLDExODpbMiwxNzBdLDEyMDpbMiwxNzBdfSx7MjU6WzIsMTI1XSw1MTpbMiwxMjVdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7NjpbMSwyNjBdLDI1OlsxLDI2MV0sMjY6WzEsMzExXX0sezg6MzEyLDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MzEzLDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezY6WzEsMjcxXSwyNTpbMSwyNzJdLDI2OlsxLDMxNF19LHs2OlsyLDM3XSwyNTpbMiwzN10sMjY6WzIsMzddLDUxOlsyLDM3XSw3NTpbMiwzN119LHsxOlsyLDE2NF0sNjpbMiwxNjRdLDI1OlsyLDE2NF0sMjY6WzIsMTY0XSw0NjpbMiwxNjRdLDUxOlsyLDE2NF0sNTQ6WzIsMTY0XSw2OTpbMiwxNjRdLDc1OlsyLDE2NF0sODM6WzIsMTY0XSw4ODpbMiwxNjRdLDkwOlsyLDE2NF0sOTk6WzIsMTY0XSwxMDE6WzIsMTY0XSwxMDI6WzIsMTY0XSwxMDM6WzIsMTY0XSwxMDc6WzIsMTY0XSwxMTU6WzIsMTY0XSwxMjM6WzIsMTY0XSwxMjU6WzIsMTY0XSwxMjY6WzIsMTY0XSwxMjk6WzIsMTY0XSwxMzA6WzIsMTY0XSwxMzE6WzIsMTY0XSwxMzI6WzIsMTY0XSwxMzM6WzIsMTY0XSwxMzQ6WzIsMTY0XX0sezY6WzIsMTIxXSwyNTpbMiwxMjFdLDI2OlsyLDEyMV0sNTE6WzIsMTIxXSw4MzpbMiwxMjFdLDg4OlsyLDEyMV19LHsxOlsyLDE2MV0sNjpbMiwxNjFdLDI1OlsyLDE2MV0sMjY6WzIsMTYxXSw0NjpbMiwxNjFdLDUxOlsyLDE2MV0sNTQ6WzIsMTYxXSw2OTpbMiwxNjFdLDc1OlsyLDE2MV0sODM6WzIsMTYxXSw4ODpbMiwxNjFdLDkwOlsyLDE2MV0sOTk6WzIsMTYxXSwxMDA6ODQsMTAxOlsyLDE2MV0sMTAyOlsyLDE2MV0sMTAzOlsyLDE2MV0sMTA2Ojg1LDEwNzpbMiwxNjFdLDEwODo2NiwxMTU6WzIsMTYxXSwxMjM6WzIsMTYxXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDE2Ml0sNjpbMiwxNjJdLDI1OlsyLDE2Ml0sMjY6WzIsMTYyXSw0NjpbMiwxNjJdLDUxOlsyLDE2Ml0sNTQ6WzIsMTYyXSw2OTpbMiwxNjJdLDc1OlsyLDE2Ml0sODM6WzIsMTYyXSw4ODpbMiwxNjJdLDkwOlsyLDE2Ml0sOTk6WzIsMTYyXSwxMDA6ODQsMTAxOlsyLDE2Ml0sMTAyOlsyLDE2Ml0sMTAzOlsyLDE2Ml0sMTA2Ojg1LDEwNzpbMiwxNjJdLDEwODo2NiwxMTU6WzIsMTYyXSwxMjM6WzIsMTYyXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHs2OlsyLDg5XSwyNTpbMiw4OV0sMjY6WzIsODldLDUxOlsyLDg5XSw3NTpbMiw4OV19XSwNCmRlZmF1bHRBY3Rpb25zOiB7NTc6WzIsNDddLDU4OlsyLDQ4XSw3MjpbMiwzXSw5MTpbMiwxMDNdLDE4NjpbMiw4M119LA0KcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsNCiAgICB0aHJvdyBuZXcgRXJyb3Ioc3RyKTsNCn0sDQpwYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHsNCiAgICB2YXIgc2VsZiA9IHRoaXMsDQogICAgICAgIHN0YWNrID0gWzBdLA0KICAgICAgICB2c3RhY2sgPSBbbnVsbF0sIC8vIHNlbWFudGljIHZhbHVlIHN0YWNrDQogICAgICAgIGxzdGFjayA9IFtdLCAvLyBsb2NhdGlvbiBzdGFjaw0KICAgICAgICB0YWJsZSA9IHRoaXMudGFibGUsDQogICAgICAgIHl5dGV4dCA9ICcnLA0KICAgICAgICB5eWxpbmVubyA9IDAsDQogICAgICAgIHl5bGVuZyA9IDAsDQogICAgICAgIHJlY292ZXJpbmcgPSAwLA0KICAgICAgICBURVJST1IgPSAyLA0KICAgICAgICBFT0YgPSAxOw0KDQogICAgLy90aGlzLnJlZHVjdGlvbkNvdW50ID0gdGhpcy5zaGlmdENvdW50ID0gMDsNCg0KICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpOw0KICAgIHRoaXMubGV4ZXIueXkgPSB0aGlzLnl5Ow0KICAgIHRoaXMueXkubGV4ZXIgPSB0aGlzLmxleGVyOw0KICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gJ3VuZGVmaW5lZCcpDQogICAgICAgIHRoaXMubGV4ZXIueXlsbG9jID0ge307DQogICAgdmFyIHl5bG9jID0gdGhpcy5sZXhlci55eWxsb2M7DQogICAgbHN0YWNrLnB1c2goeXlsb2MpOw0KDQogICAgaWYgKHR5cGVvZiB0aGlzLnl5LnBhcnNlRXJyb3IgPT09ICdmdW5jdGlvbicpDQogICAgICAgIHRoaXMucGFyc2VFcnJvciA9IHRoaXMueXkucGFyc2VFcnJvcjsNCg0KICAgIGZ1bmN0aW9uIHBvcFN0YWNrIChuKSB7DQogICAgICAgIHN0YWNrLmxlbmd0aCA9IHN0YWNrLmxlbmd0aCAtIDIqbjsNCiAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuOw0KICAgICAgICBsc3RhY2subGVuZ3RoID0gbHN0YWNrLmxlbmd0aCAtIG47DQogICAgfQ0KDQogICAgZnVuY3Rpb24gbGV4KCkgew0KICAgICAgICB2YXIgdG9rZW47DQogICAgICAgIHRva2VuID0gc2VsZi5sZXhlci5sZXgoKSB8fCAxOyAvLyAkZW5kID0gMQ0KICAgICAgICAvLyBpZiB0b2tlbiBpc24ndCBpdHMgbnVtZXJpYyB2YWx1ZSwgY29udmVydA0KICAgICAgICBpZiAodHlwZW9mIHRva2VuICE9PSAnbnVtYmVyJykgew0KICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdG9rZW47DQogICAgfTsNCg0KICAgIHZhciBzeW1ib2wsIHByZUVycm9yU3ltYm9sLCBzdGF0ZSwgYWN0aW9uLCBhLCByLCB5eXZhbD17fSxwLGxlbixuZXdTdGF0ZSwgZXhwZWN0ZWQ7DQogICAgd2hpbGUgKHRydWUpIHsNCiAgICAgICAgLy8gcmV0cmVpdmUgc3RhdGUgbnVtYmVyIGZyb20gdG9wIG9mIHN0YWNrDQogICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdOw0KDQogICAgICAgIC8vIHVzZSBkZWZhdWx0IGFjdGlvbnMgaWYgYXZhaWxhYmxlDQogICAgICAgIGlmICh0aGlzLmRlZmF1bHRBY3Rpb25zW3N0YXRlXSkgew0KICAgICAgICAgICAgYWN0aW9uID0gdGhpcy5kZWZhdWx0QWN0aW9uc1tzdGF0ZV07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAoc3ltYm9sID09IG51bGwpDQogICAgICAgICAgICAgICAgc3ltYm9sID0gbGV4KCk7DQogICAgICAgICAgICAvLyByZWFkIGFjdGlvbiBmb3IgY3VycmVudCBzdGF0ZSBhbmQgZmlyc3QgaW5wdXQNCiAgICAgICAgICAgIGFjdGlvbiA9IHRhYmxlW3N0YXRlXSAmJiB0YWJsZVtzdGF0ZV1bc3ltYm9sXTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIGhhbmRsZSBwYXJzZSBlcnJvcg0KICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ3VuZGVmaW5lZCcgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkgew0KDQogICAgICAgICAgICBpZiAoIXJlY292ZXJpbmcpIHsNCiAgICAgICAgICAgICAgICAvLyBSZXBvcnQgZXJyb3INCiAgICAgICAgICAgICAgICBleHBlY3RlZCA9IFtdOw0KICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHsNCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaCgiJyIrdGhpcy50ZXJtaW5hbHNfW3BdKyInIik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhciBlcnJTdHIgPSAnJzsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRpb24pIHsNCiAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gJ1BhcnNlIGVycm9yIG9uIGxpbmUgJysoeXlsaW5lbm8rMSkrIjpcbiIrdGhpcy5sZXhlci5zaG93UG9zaXRpb24oKSsnXG5FeHBlY3RpbmcgJytleHBlY3RlZC5qb2luKCcsICcpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGVyclN0ciA9ICdQYXJzZSBlcnJvciBvbiBsaW5lICcrKHl5bGluZW5vKzEpKyI6IFVuZXhwZWN0ZWQgIiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN5bWJvbCA9PSAxIC8qRU9GKi8gPyAiZW5kIG9mIGlucHV0IiA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCInIisodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSsiJyIpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5wYXJzZUVycm9yKGVyclN0ciwNCiAgICAgICAgICAgICAgICAgICAge3RleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBlY3RlZH0pOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBqdXN0IHJlY292ZXJlZCBmcm9tIGFub3RoZXIgZXJyb3INCiAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID09IDMpIHsNCiAgICAgICAgICAgICAgICBpZiAoc3ltYm9sID09IEVPRikgew0KICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyU3RyIHx8ICdQYXJzaW5nIGhhbHRlZC4nKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBkaXNjYXJkIGN1cnJlbnQgbG9va2FoZWFkIGFuZCBncmFiIGFub3RoZXINCiAgICAgICAgICAgICAgICB5eWxlbmcgPSB0aGlzLmxleGVyLnl5bGVuZzsNCiAgICAgICAgICAgICAgICB5eXRleHQgPSB0aGlzLmxleGVyLnl5dGV4dDsNCiAgICAgICAgICAgICAgICB5eWxpbmVubyA9IHRoaXMubGV4ZXIueXlsaW5lbm87DQogICAgICAgICAgICAgICAgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYzsNCiAgICAgICAgICAgICAgICBzeW1ib2wgPSBsZXgoKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gdHJ5IHRvIHJlY292ZXIgZnJvbSBlcnJvcg0KICAgICAgICAgICAgd2hpbGUgKDEpIHsNCiAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgZXJyb3IgcmVjb3ZlcnkgcnVsZSBpbiB0aGlzIHN0YXRlDQogICAgICAgICAgICAgICAgaWYgKChURVJST1IudG9TdHJpbmcoKSkgaW4gdGFibGVbc3RhdGVdKSB7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyU3RyIHx8ICdQYXJzaW5nIGhhbHRlZC4nKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcG9wU3RhY2soMSk7DQogICAgICAgICAgICAgICAgc3RhdGUgPSBzdGFja1tzdGFjay5sZW5ndGgtMV07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHByZUVycm9yU3ltYm9sID0gc3ltYm9sOyAvLyBzYXZlIHRoZSBsb29rYWhlYWQgdG9rZW4NCiAgICAgICAgICAgIHN5bWJvbCA9IFRFUlJPUjsgICAgICAgICAvLyBpbnNlcnQgZ2VuZXJpYyBlcnJvciBzeW1ib2wgYXMgbmV3IGxvb2thaGVhZA0KICAgICAgICAgICAgc3RhdGUgPSBzdGFja1tzdGFjay5sZW5ndGgtMV07DQogICAgICAgICAgICBhY3Rpb24gPSB0YWJsZVtzdGF0ZV0gJiYgdGFibGVbc3RhdGVdW1RFUlJPUl07DQogICAgICAgICAgICByZWNvdmVyaW5nID0gMzsgLy8gYWxsb3cgMyByZWFsIHN5bWJvbHMgdG8gYmUgc2hpZnRlZCBiZWZvcmUgcmVwb3J0aW5nIGEgbmV3IGVycm9yDQogICAgICAgIH0NCg0KICAgICAgICAvLyB0aGlzIHNob3VsZG4ndCBoYXBwZW4sIHVubGVzcyByZXNvbHZlIGRlZmF1bHRzIGFyZSBvZmYNCiAgICAgICAgaWYgKGFjdGlvblswXSBpbnN0YW5jZW9mIEFycmF5ICYmIGFjdGlvbi5sZW5ndGggPiAxKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNlIEVycm9yOiBtdWx0aXBsZSBhY3Rpb25zIHBvc3NpYmxlIGF0IHN0YXRlOiAnK3N0YXRlKycsIHRva2VuOiAnK3N5bWJvbCk7DQogICAgICAgIH0NCg0KICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkgew0KDQogICAgICAgICAgICBjYXNlIDE6IC8vIHNoaWZ0DQogICAgICAgICAgICAgICAgLy90aGlzLnNoaWZ0Q291bnQrKzsNCg0KICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goc3ltYm9sKTsNCiAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxleGVyLnl5dGV4dCk7DQogICAgICAgICAgICAgICAgbHN0YWNrLnB1c2godGhpcy5sZXhlci55eWxsb2MpOw0KICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYWN0aW9uWzFdKTsgLy8gcHVzaCBzdGF0ZQ0KICAgICAgICAgICAgICAgIHN5bWJvbCA9IG51bGw7DQogICAgICAgICAgICAgICAgaWYgKCFwcmVFcnJvclN5bWJvbCkgeyAvLyBub3JtYWwgZXhlY3V0aW9uL25vIGVycm9yDQogICAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOw0KICAgICAgICAgICAgICAgICAgICB5eXRleHQgPSB0aGlzLmxleGVyLnl5dGV4dDsNCiAgICAgICAgICAgICAgICAgICAgeXlsaW5lbm8gPSB0aGlzLmxleGVyLnl5bGluZW5vOw0KICAgICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOw0KICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3ZlcmluZyA+IDApDQogICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyaW5nLS07DQogICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZXJyb3IganVzdCBvY2N1cnJlZCwgcmVzdW1lIG9sZCBsb29rYWhlYWQgZi8gYmVmb3JlIGVycm9yDQogICAgICAgICAgICAgICAgICAgIHN5bWJvbCA9IHByZUVycm9yU3ltYm9sOw0KICAgICAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IG51bGw7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlIDI6IC8vIHJlZHVjZQ0KICAgICAgICAgICAgICAgIC8vdGhpcy5yZWR1Y3Rpb25Db3VudCsrOw0KDQogICAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsNCg0KICAgICAgICAgICAgICAgIC8vIHBlcmZvcm0gc2VtYW50aWMgYWN0aW9uDQogICAgICAgICAgICAgICAgeXl2YWwuJCA9IHZzdGFja1t2c3RhY2subGVuZ3RoLWxlbl07IC8vIGRlZmF1bHQgdG8gJCQgPSAkMQ0KICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgbG9jYXRpb24sIHVzZXMgZmlyc3QgdG9rZW4gZm9yIGZpcnN0cywgbGFzdCBmb3IgbGFzdHMNCiAgICAgICAgICAgICAgICB5eXZhbC5fJCA9IHsNCiAgICAgICAgICAgICAgICAgICAgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGgtKGxlbnx8MSldLmZpcnN0X2xpbmUsDQogICAgICAgICAgICAgICAgICAgIGxhc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGgtMV0ubGFzdF9saW5lLA0KICAgICAgICAgICAgICAgICAgICBmaXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoLShsZW58fDEpXS5maXJzdF9jb2x1bW4sDQogICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsc3RhY2tbbHN0YWNrLmxlbmd0aC0xXS5sYXN0X2NvbHVtbg0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5dmFsLCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNrLCBsc3RhY2spOw0KDQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBwb3Agb2ZmIHN0YWNrDQogICAgICAgICAgICAgICAgaWYgKGxlbikgew0KICAgICAgICAgICAgICAgICAgICBzdGFjayA9IHN0YWNrLnNsaWNlKDAsLTEqbGVuKjIpOw0KICAgICAgICAgICAgICAgICAgICB2c3RhY2sgPSB2c3RhY2suc2xpY2UoMCwgLTEqbGVuKTsNCiAgICAgICAgICAgICAgICAgICAgbHN0YWNrID0gbHN0YWNrLnNsaWNlKDAsIC0xKmxlbik7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0aGlzLnByb2R1Y3Rpb25zX1thY3Rpb25bMV1dWzBdKTsgICAgLy8gcHVzaCBub250ZXJtaW5hbCAocmVkdWNlKQ0KICAgICAgICAgICAgICAgIHZzdGFjay5wdXNoKHl5dmFsLiQpOw0KICAgICAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5dmFsLl8kKTsNCiAgICAgICAgICAgICAgICAvLyBnb3RvIG5ldyBzdGF0ZSA9IHRhYmxlW1NUQVRFXVtOT05URVJNSU5BTF0NCiAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IHRhYmxlW3N0YWNrW3N0YWNrLmxlbmd0aC0yXV1bc3RhY2tbc3RhY2subGVuZ3RoLTFdXTsNCiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgY2FzZSAzOiAvLyBhY2NlcHQNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KDQogICAgfQ0KDQogICAgcmV0dXJuIHRydWU7DQp9fTsNCg0KbW9kdWxlLmV4cG9ydHMgPSBwYXJzZXI7DQp9KTsvKioNCiAqIENvcHlyaWdodCAoYykgMjAxMSBKZXJlbXkgQXNoa2VuYXMNCiAqDQogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbg0KICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24NCiAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQNCiAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLA0KICogY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQ0KICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcNCiAqIGNvbmRpdGlvbnM6DQogKiANCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlDQogKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCiAqIA0KICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsDQogKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMNCiAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EDQogKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVA0KICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksDQogKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcNCiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1INCiAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4NCiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2NvZmZlZS9ub2RlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL21vZGUvY29mZmVlL3Njb3BlJywgJ2FjZS9tb2RlL2NvZmZlZS9oZWxwZXJzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KICB2YXIgQWNjZXNzLCBBcnIsIEFzc2lnbiwgQmFzZSwgQmxvY2ssIENhbGwsIENsYXNzLCBDbG9zdXJlLCBDb2RlLCBDb21tZW50LCBFeGlzdGVuY2UsIEV4dGVuZHMsIEZvciwgSURFTlRJRklFUiwgSVNfU1RSSU5HLCBJZiwgSW4sIEluZGV4LCBMRVZFTF9BQ0NFU1MsIExFVkVMX0NPTkQsIExFVkVMX0xJU1QsIExFVkVMX09QLCBMRVZFTF9QQVJFTiwgTEVWRUxfVE9QLCBMaXRlcmFsLCBNRVRIT0RfREVGLCBORUdBVEUsIE5PLCBPYmosIE9wLCBQYXJhbSwgUGFyZW5zLCBQdXNoLCBSYW5nZSwgUmV0dXJuLCBTSU1QTEVOVU0sIFNjb3BlLCBTbGljZSwgU3BsYXQsIFN3aXRjaCwgVEFCLCBUSElTLCBUaHJvdywgVHJ5LCBVVElMSVRJRVMsIFZhbHVlLCBXaGlsZSwgWUVTLCBjb21wYWN0LCBkZWwsIGVuZHMsIGV4dGVuZCwgZmxhdHRlbiwgbGFzdCwgbWVyZ2UsIG11bHRpZGVudCwgc3RhcnRzLCB1bmZvbGRTb2FrLCB1dGlsaXR5LCBfcmVmOw0KICB2YXIgX19oYXNQcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSwgX19leHRlbmRzID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgew0KICAgIGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKF9faGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9DQogICAgZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9DQogICAgY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOw0KICAgIGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yOw0KICAgIGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7DQogICAgcmV0dXJuIGNoaWxkOw0KICB9LCBfX2JpbmQgPSBmdW5jdGlvbihmbiwgbWUpeyByZXR1cm4gZnVuY3Rpb24oKXsgcmV0dXJuIGZuLmFwcGx5KG1lLCBhcmd1bWVudHMpOyB9OyB9LCBfX2luZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiB8fCBmdW5jdGlvbihpdGVtKSB7DQogICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgaWYgKHRoaXNbaV0gPT09IGl0ZW0pIHJldHVybiBpOw0KICAgIH0NCiAgICByZXR1cm4gLTE7DQogIH07DQogIFNjb3BlID0gcmVxdWlyZSgnLi9zY29wZScpLlNjb3BlOw0KICBfcmVmID0gcmVxdWlyZSgnLi9oZWxwZXJzJyksIGNvbXBhY3QgPSBfcmVmLmNvbXBhY3QsIGZsYXR0ZW4gPSBfcmVmLmZsYXR0ZW4sIGV4dGVuZCA9IF9yZWYuZXh0ZW5kLCBtZXJnZSA9IF9yZWYubWVyZ2UsIGRlbCA9IF9yZWYuZGVsLCBzdGFydHMgPSBfcmVmLnN0YXJ0cywgZW5kcyA9IF9yZWYuZW5kcywgbGFzdCA9IF9yZWYubGFzdDsNCiAgZXhwb3J0cy5leHRlbmQgPSBleHRlbmQ7DQogIFlFUyA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0cnVlOw0KICB9Ow0KICBOTyA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBmYWxzZTsNCiAgfTsNCiAgVEhJUyA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzOw0KICB9Ow0KICBORUdBVEUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLm5lZ2F0ZWQgPSAhdGhpcy5uZWdhdGVkOw0KICAgIHJldHVybiB0aGlzOw0KICB9Ow0KICBleHBvcnRzLkJhc2UgPSBCYXNlID0gKGZ1bmN0aW9uKCkgew0KICAgIGZ1bmN0aW9uIEJhc2UoKSB7fQ0KICAgIEJhc2UucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbihvLCBsdmwpIHsNCiAgICAgIHZhciBub2RlOw0KICAgICAgbyA9IGV4dGVuZCh7fSwgbyk7DQogICAgICBpZiAobHZsKSB7DQogICAgICAgIG8ubGV2ZWwgPSBsdmw7DQogICAgICB9DQogICAgICBub2RlID0gdGhpcy51bmZvbGRTb2FrKG8pIHx8IHRoaXM7DQogICAgICBub2RlLnRhYiA9IG8uaW5kZW50Ow0KICAgICAgaWYgKG8ubGV2ZWwgPT09IExFVkVMX1RPUCB8fCAhbm9kZS5pc1N0YXRlbWVudChvKSkgew0KICAgICAgICByZXR1cm4gbm9kZS5jb21waWxlTm9kZShvKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiBub2RlLmNvbXBpbGVDbG9zdXJlKG8pOw0KICAgICAgfQ0KICAgIH07DQogICAgQmFzZS5wcm90b3R5cGUuY29tcGlsZUNsb3N1cmUgPSBmdW5jdGlvbihvKSB7DQogICAgICBpZiAodGhpcy5qdW1wcygpIHx8IHRoaXMgaW5zdGFuY2VvZiBUaHJvdykgew0KICAgICAgICB0aHJvdyBTeW50YXhFcnJvcignY2Fubm90IHVzZSBhIHB1cmUgc3RhdGVtZW50IGluIGFuIGV4cHJlc3Npb24uJyk7DQogICAgICB9DQogICAgICBvLnNoYXJlZFNjb3BlID0gdHJ1ZTsNCiAgICAgIHJldHVybiBDbG9zdXJlLndyYXAodGhpcykuY29tcGlsZU5vZGUobyk7DQogICAgfTsNCiAgICBCYXNlLnByb3RvdHlwZS5jYWNoZSA9IGZ1bmN0aW9uKG8sIGxldmVsLCByZXVzZWQpIHsNCiAgICAgIHZhciByZWYsIHN1YjsNCiAgICAgIGlmICghdGhpcy5pc0NvbXBsZXgoKSkgew0KICAgICAgICByZWYgPSBsZXZlbCA/IHRoaXMuY29tcGlsZShvLCBsZXZlbCkgOiB0aGlzOw0KICAgICAgICByZXR1cm4gW3JlZiwgcmVmXTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJlZiA9IG5ldyBMaXRlcmFsKHJldXNlZCB8fCBvLnNjb3BlLmZyZWVWYXJpYWJsZSgncmVmJykpOw0KICAgICAgICBzdWIgPSBuZXcgQXNzaWduKHJlZiwgdGhpcyk7DQogICAgICAgIGlmIChsZXZlbCkgew0KICAgICAgICAgIHJldHVybiBbc3ViLmNvbXBpbGUobywgbGV2ZWwpLCByZWYudmFsdWVdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHJldHVybiBbc3ViLCByZWZdOw0KICAgICAgICB9DQogICAgICB9DQogICAgfTsNCiAgICBCYXNlLnByb3RvdHlwZS5jb21waWxlTG9vcFJlZmVyZW5jZSA9IGZ1bmN0aW9uKG8sIG5hbWUpIHsNCiAgICAgIHZhciBzcmMsIHRtcDsNCiAgICAgIHNyYyA9IHRtcCA9IHRoaXMuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsNCiAgICAgIGlmICghKCgtSW5maW5pdHkgPCArc3JjICYmICtzcmMgPCBJbmZpbml0eSkgfHwgSURFTlRJRklFUi50ZXN0KHNyYykgJiYgby5zY29wZS5jaGVjayhzcmMsIHRydWUpKSkgew0KICAgICAgICBzcmMgPSAiIiArICh0bXAgPSBvLnNjb3BlLmZyZWVWYXJpYWJsZShuYW1lKSkgKyAiID0gIiArIHNyYzsNCiAgICAgIH0NCiAgICAgIHJldHVybiBbc3JjLCB0bXBdOw0KICAgIH07DQogICAgQmFzZS5wcm90b3R5cGUubWFrZVJldHVybiA9IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuIG5ldyBSZXR1cm4odGhpcyk7DQogICAgfTsNCiAgICBCYXNlLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKHByZWQpIHsNCiAgICAgIHZhciBjb250YWluczsNCiAgICAgIGNvbnRhaW5zID0gZmFsc2U7DQogICAgICB0aGlzLnRyYXZlcnNlQ2hpbGRyZW4oZmFsc2UsIGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgICAgaWYgKHByZWQobm9kZSkpIHsNCiAgICAgICAgICBjb250YWlucyA9IHRydWU7DQogICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICAgIHJldHVybiBjb250YWluczsNCiAgICB9Ow0KICAgIEJhc2UucHJvdG90eXBlLmNvbnRhaW5zVHlwZSA9IGZ1bmN0aW9uKHR5cGUpIHsNCiAgICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgdHlwZSB8fCB0aGlzLmNvbnRhaW5zKGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiB0eXBlOw0KICAgICAgfSk7DQogICAgfTsNCiAgICBCYXNlLnByb3RvdHlwZS5sYXN0Tm9uQ29tbWVudCA9IGZ1bmN0aW9uKGxpc3QpIHsNCiAgICAgIHZhciBpOw0KICAgICAgaSA9IGxpc3QubGVuZ3RoOw0KICAgICAgd2hpbGUgKGktLSkgew0KICAgICAgICBpZiAoIShsaXN0W2ldIGluc3RhbmNlb2YgQ29tbWVudCkpIHsNCiAgICAgICAgICByZXR1cm4gbGlzdFtpXTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCiAgICBCYXNlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKGlkdCwgbmFtZSkgew0KICAgICAgdmFyIHRyZWU7DQogICAgICBpZiAoaWR0ID09IG51bGwpIHsNCiAgICAgICAgaWR0ID0gJyc7DQogICAgICB9DQogICAgICBpZiAobmFtZSA9PSBudWxsKSB7DQogICAgICAgIG5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7DQogICAgICB9DQogICAgICB0cmVlID0gJ1xuJyArIGlkdCArIG5hbWU7DQogICAgICBpZiAodGhpcy5zb2FrKSB7DQogICAgICAgIHRyZWUgKz0gJz8nOw0KICAgICAgfQ0KICAgICAgdGhpcy5lYWNoQ2hpbGQoZnVuY3Rpb24obm9kZSkgew0KICAgICAgICByZXR1cm4gdHJlZSArPSBub2RlLnRvU3RyaW5nKGlkdCArIFRBQik7DQogICAgICB9KTsNCiAgICAgIHJldHVybiB0cmVlOw0KICAgIH07DQogICAgQmFzZS5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24oZnVuYykgew0KICAgICAgdmFyIGF0dHIsIGNoaWxkLCBfaSwgX2osIF9sZW4sIF9sZW4yLCBfcmVmMiwgX3JlZjM7DQogICAgICBpZiAoIXRoaXMuY2hpbGRyZW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICB9DQogICAgICBfcmVmMiA9IHRoaXMuY2hpbGRyZW47DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIGF0dHIgPSBfcmVmMltfaV07DQogICAgICAgIGlmICh0aGlzW2F0dHJdKSB7DQogICAgICAgICAgX3JlZjMgPSBmbGF0dGVuKFt0aGlzW2F0dHJdXSk7DQogICAgICAgICAgZm9yIChfaiA9IDAsIF9sZW4yID0gX3JlZjMubGVuZ3RoOyBfaiA8IF9sZW4yOyBfaisrKSB7DQogICAgICAgICAgICBjaGlsZCA9IF9yZWYzW19qXTsNCiAgICAgICAgICAgIGlmIChmdW5jKGNoaWxkKSA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIEJhc2UucHJvdG90eXBlLnRyYXZlcnNlQ2hpbGRyZW4gPSBmdW5jdGlvbihjcm9zc1Njb3BlLCBmdW5jKSB7DQogICAgICByZXR1cm4gdGhpcy5lYWNoQ2hpbGQoZnVuY3Rpb24oY2hpbGQpIHsNCiAgICAgICAgaWYgKGZ1bmMoY2hpbGQpID09PSBmYWxzZSkgew0KICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gY2hpbGQudHJhdmVyc2VDaGlsZHJlbihjcm9zc1Njb3BlLCBmdW5jKTsNCiAgICAgIH0pOw0KICAgIH07DQogICAgQmFzZS5wcm90b3R5cGUuaW52ZXJ0ID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gbmV3IE9wKCchJywgdGhpcyk7DQogICAgfTsNCiAgICBCYXNlLnByb3RvdHlwZS51bndyYXBBbGwgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBub2RlOw0KICAgICAgbm9kZSA9IHRoaXM7DQogICAgICB3aGlsZSAobm9kZSAhPT0gKG5vZGUgPSBub2RlLnVud3JhcCgpKSkgew0KICAgICAgICBjb250aW51ZTsNCiAgICAgIH0NCiAgICAgIHJldHVybiBub2RlOw0KICAgIH07DQogICAgQmFzZS5wcm90b3R5cGUuY2hpbGRyZW4gPSBbXTsNCiAgICBCYXNlLnByb3RvdHlwZS5pc1N0YXRlbWVudCA9IE5POw0KICAgIEJhc2UucHJvdG90eXBlLmp1bXBzID0gTk87DQogICAgQmFzZS5wcm90b3R5cGUuaXNDb21wbGV4ID0gWUVTOw0KICAgIEJhc2UucHJvdG90eXBlLmlzQ2hhaW5hYmxlID0gTk87DQogICAgQmFzZS5wcm90b3R5cGUuaXNBc3NpZ25hYmxlID0gTk87DQogICAgQmFzZS5wcm90b3R5cGUudW53cmFwID0gVEhJUzsNCiAgICBCYXNlLnByb3RvdHlwZS51bmZvbGRTb2FrID0gTk87DQogICAgQmFzZS5wcm90b3R5cGUuYXNzaWducyA9IE5POw0KICAgIHJldHVybiBCYXNlOw0KICB9KSgpOw0KICBleHBvcnRzLkJsb2NrID0gQmxvY2sgPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKEJsb2NrLCBCYXNlKTsNCiAgICBmdW5jdGlvbiBCbG9jayhub2Rlcykgew0KICAgICAgdGhpcy5leHByZXNzaW9ucyA9IGNvbXBhY3QoZmxhdHRlbihub2RlcyB8fCBbXSkpOw0KICAgIH0NCiAgICBCbG9jay5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ2V4cHJlc3Npb25zJ107DQogICAgQmxvY2sucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihub2RlKSB7DQogICAgICB0aGlzLmV4cHJlc3Npb25zLnB1c2gobm9kZSk7DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIEJsb2NrLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25zLnBvcCgpOw0KICAgIH07DQogICAgQmxvY2sucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbihub2RlKSB7DQogICAgICB0aGlzLmV4cHJlc3Npb25zLnVuc2hpZnQobm9kZSk7DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIEJsb2NrLnByb3RvdHlwZS51bndyYXAgPSBmdW5jdGlvbigpIHsNCiAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMSkgew0KICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uc1swXTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgfQ0KICAgIH07DQogICAgQmxvY2sucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiAhdGhpcy5leHByZXNzaW9ucy5sZW5ndGg7DQogICAgfTsNCiAgICBCbG9jay5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgZXhwLCBfaSwgX2xlbiwgX3JlZjI7DQogICAgICBfcmVmMiA9IHRoaXMuZXhwcmVzc2lvbnM7DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIGV4cCA9IF9yZWYyW19pXTsNCiAgICAgICAgaWYgKGV4cC5pc1N0YXRlbWVudChvKSkgew0KICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCiAgICBCbG9jay5wcm90b3R5cGUuanVtcHMgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgZXhwLCBfaSwgX2xlbiwgX3JlZjI7DQogICAgICBfcmVmMiA9IHRoaXMuZXhwcmVzc2lvbnM7DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIGV4cCA9IF9yZWYyW19pXTsNCiAgICAgICAgaWYgKGV4cC5qdW1wcyhvKSkgew0KICAgICAgICAgIHJldHVybiBleHA7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9Ow0KICAgIEJsb2NrLnByb3RvdHlwZS5tYWtlUmV0dXJuID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgZXhwciwgbGVuOw0KICAgICAgbGVuID0gdGhpcy5leHByZXNzaW9ucy5sZW5ndGg7DQogICAgICB3aGlsZSAobGVuLS0pIHsNCiAgICAgICAgZXhwciA9IHRoaXMuZXhwcmVzc2lvbnNbbGVuXTsNCiAgICAgICAgaWYgKCEoZXhwciBpbnN0YW5jZW9mIENvbW1lbnQpKSB7DQogICAgICAgICAgdGhpcy5leHByZXNzaW9uc1tsZW5dID0gZXhwci5tYWtlUmV0dXJuKCk7DQogICAgICAgICAgaWYgKGV4cHIgaW5zdGFuY2VvZiBSZXR1cm4gJiYgIWV4cHIuZXhwcmVzc2lvbikgew0KICAgICAgICAgICAgdGhpcy5leHByZXNzaW9ucy5zcGxpY2UobGVuLCAxKTsNCiAgICAgICAgICB9DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiB0aGlzOw0KICAgIH07DQogICAgQmxvY2sucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbihvLCBsZXZlbCkgew0KICAgICAgaWYgKG8gPT0gbnVsbCkgew0KICAgICAgICBvID0ge307DQogICAgICB9DQogICAgICBpZiAoby5zY29wZSkgew0KICAgICAgICByZXR1cm4gQmxvY2suX19zdXBlcl9fLmNvbXBpbGUuY2FsbCh0aGlzLCBvLCBsZXZlbCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlUm9vdChvKTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIEJsb2NrLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjb2RlLCBjb2Rlcywgbm9kZSwgdG9wLCBfaSwgX2xlbiwgX3JlZjI7DQogICAgICB0aGlzLnRhYiA9IG8uaW5kZW50Ow0KICAgICAgdG9wID0gby5sZXZlbCA9PT0gTEVWRUxfVE9QOw0KICAgICAgY29kZXMgPSBbXTsNCiAgICAgIF9yZWYyID0gdGhpcy5leHByZXNzaW9uczsNCiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsNCiAgICAgICAgbm9kZSA9IF9yZWYyW19pXTsNCiAgICAgICAgbm9kZSA9IG5vZGUudW53cmFwQWxsKCk7DQogICAgICAgIG5vZGUgPSBub2RlLnVuZm9sZFNvYWsobykgfHwgbm9kZTsNCiAgICAgICAgaWYgKHRvcCkgew0KICAgICAgICAgIG5vZGUuZnJvbnQgPSB0cnVlOw0KICAgICAgICAgIGNvZGUgPSBub2RlLmNvbXBpbGUobyk7DQogICAgICAgICAgY29kZXMucHVzaChub2RlLmlzU3RhdGVtZW50KG8pID8gY29kZSA6IHRoaXMudGFiICsgY29kZSArICc7Jyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgY29kZXMucHVzaChub2RlLmNvbXBpbGUobywgTEVWRUxfTElTVCkpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZiAodG9wKSB7DQogICAgICAgIHJldHVybiBjb2Rlcy5qb2luKCdcbicpOw0KICAgICAgfQ0KICAgICAgY29kZSA9IGNvZGVzLmpvaW4oJywgJykgfHwgJ3ZvaWQgMCc7DQogICAgICBpZiAoY29kZXMubGVuZ3RoID4gMSAmJiBvLmxldmVsID49IExFVkVMX0xJU1QpIHsNCiAgICAgICAgcmV0dXJuICIoIiArIGNvZGUgKyAiKSI7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gY29kZTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIEJsb2NrLnByb3RvdHlwZS5jb21waWxlUm9vdCA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjb2RlOw0KICAgICAgby5pbmRlbnQgPSB0aGlzLnRhYiA9IG8uYmFyZSA/ICcnIDogVEFCOw0KICAgICAgby5zY29wZSA9IG5ldyBTY29wZShudWxsLCB0aGlzLCBudWxsKTsNCiAgICAgIG8ubGV2ZWwgPSBMRVZFTF9UT1A7DQogICAgICBjb2RlID0gdGhpcy5jb21waWxlV2l0aERlY2xhcmF0aW9ucyhvKTsNCiAgICAgIGlmIChvLmJhcmUpIHsNCiAgICAgICAgcmV0dXJuIGNvZGU7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gIihmdW5jdGlvbigpIHtcbiIgKyBjb2RlICsgIlxufSkuY2FsbCh0aGlzKTtcbiI7DQogICAgICB9DQogICAgfTsNCiAgICBCbG9jay5wcm90b3R5cGUuY29tcGlsZVdpdGhEZWNsYXJhdGlvbnMgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgYXNzaWducywgY29kZSwgZGVjbGFycywgZXhwLCBpLCBwb3N0LCByZXN0LCBzY29wZSwgX2xlbiwgX3JlZjI7DQogICAgICBjb2RlID0gcG9zdCA9ICcnOw0KICAgICAgX3JlZjIgPSB0aGlzLmV4cHJlc3Npb25zOw0KICAgICAgZm9yIChpID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgaSA8IF9sZW47IGkrKykgew0KICAgICAgICBleHAgPSBfcmVmMltpXTsNCiAgICAgICAgZXhwID0gZXhwLnVud3JhcCgpOw0KICAgICAgICBpZiAoIShleHAgaW5zdGFuY2VvZiBDb21tZW50IHx8IGV4cCBpbnN0YW5jZW9mIExpdGVyYWwpKSB7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIG8gPSBtZXJnZShvLCB7DQogICAgICAgIGxldmVsOiBMRVZFTF9UT1ANCiAgICAgIH0pOw0KICAgICAgaWYgKGkpIHsNCiAgICAgICAgcmVzdCA9IHRoaXMuZXhwcmVzc2lvbnMuc3BsaWNlKGksIHRoaXMuZXhwcmVzc2lvbnMubGVuZ3RoKTsNCiAgICAgICAgY29kZSA9IHRoaXMuY29tcGlsZU5vZGUobyk7DQogICAgICAgIHRoaXMuZXhwcmVzc2lvbnMgPSByZXN0Ow0KICAgICAgfQ0KICAgICAgcG9zdCA9IHRoaXMuY29tcGlsZU5vZGUobyk7DQogICAgICBzY29wZSA9IG8uc2NvcGU7DQogICAgICBpZiAoc2NvcGUuZXhwcmVzc2lvbnMgPT09IHRoaXMpIHsNCiAgICAgICAgZGVjbGFycyA9IG8uc2NvcGUuaGFzRGVjbGFyYXRpb25zKCk7DQogICAgICAgIGFzc2lnbnMgPSBzY29wZS5oYXNBc3NpZ25tZW50czsNCiAgICAgICAgaWYgKChkZWNsYXJzIHx8IGFzc2lnbnMpICYmIGkpIHsNCiAgICAgICAgICBjb2RlICs9ICdcbic7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGRlY2xhcnMpIHsNCiAgICAgICAgICBjb2RlICs9ICIiICsgdGhpcy50YWIgKyAidmFyICIgKyAoc2NvcGUuZGVjbGFyZWRWYXJpYWJsZXMoKS5qb2luKCcsICcpKSArICI7XG4iOw0KICAgICAgICB9DQogICAgICAgIGlmIChhc3NpZ25zKSB7DQogICAgICAgICAgY29kZSArPSAiIiArIHRoaXMudGFiICsgInZhciAiICsgKG11bHRpZGVudChzY29wZS5hc3NpZ25lZFZhcmlhYmxlcygpLmpvaW4oJywgJyksIHRoaXMudGFiKSkgKyAiO1xuIjsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIGNvZGUgKyBwb3N0Ow0KICAgIH07DQogICAgQmxvY2sud3JhcCA9IGZ1bmN0aW9uKG5vZGVzKSB7DQogICAgICBpZiAobm9kZXMubGVuZ3RoID09PSAxICYmIG5vZGVzWzBdIGluc3RhbmNlb2YgQmxvY2spIHsNCiAgICAgICAgcmV0dXJuIG5vZGVzWzBdOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIG5ldyBCbG9jayhub2Rlcyk7DQogICAgfTsNCiAgICByZXR1cm4gQmxvY2s7DQogIH0pKCk7DQogIGV4cG9ydHMuTGl0ZXJhbCA9IExpdGVyYWwgPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKExpdGVyYWwsIEJhc2UpOw0KICAgIGZ1bmN0aW9uIExpdGVyYWwodmFsdWUpIHsNCiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCiAgICB9DQogICAgTGl0ZXJhbC5wcm90b3R5cGUubWFrZVJldHVybiA9IGZ1bmN0aW9uKCkgew0KICAgICAgaWYgKHRoaXMuaXNTdGF0ZW1lbnQoKSkgew0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiBuZXcgUmV0dXJuKHRoaXMpOw0KICAgICAgfQ0KICAgIH07DQogICAgTGl0ZXJhbC5wcm90b3R5cGUuaXNBc3NpZ25hYmxlID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gSURFTlRJRklFUi50ZXN0KHRoaXMudmFsdWUpOw0KICAgIH07DQogICAgTGl0ZXJhbC5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBfcmVmMjsNCiAgICAgIHJldHVybiAoX3JlZjIgPSB0aGlzLnZhbHVlKSA9PT0gJ2JyZWFrJyB8fCBfcmVmMiA9PT0gJ2NvbnRpbnVlJyB8fCBfcmVmMiA9PT0gJ2RlYnVnZ2VyJzsNCiAgICB9Ow0KICAgIExpdGVyYWwucHJvdG90eXBlLmlzQ29tcGxleCA9IE5POw0KICAgIExpdGVyYWwucHJvdG90eXBlLmFzc2lnbnMgPSBmdW5jdGlvbihuYW1lKSB7DQogICAgICByZXR1cm4gbmFtZSA9PT0gdGhpcy52YWx1ZTsNCiAgICB9Ow0KICAgIExpdGVyYWwucHJvdG90eXBlLmp1bXBzID0gZnVuY3Rpb24obykgew0KICAgICAgaWYgKCF0aGlzLmlzU3RhdGVtZW50KCkpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgfQ0KICAgICAgaWYgKCEobyAmJiAoby5sb29wIHx8IG8uYmxvY2sgJiYgKHRoaXMudmFsdWUgIT09ICdjb250aW51ZScpKSkpIHsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICB9DQogICAgfTsNCiAgICBMaXRlcmFsLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjb2RlOw0KICAgICAgY29kZSA9IHRoaXMuaXNVbmRlZmluZWQgPyBvLmxldmVsID49IExFVkVMX0FDQ0VTUyA/ICcodm9pZCAwKScgOiAndm9pZCAwJyA6IHRoaXMudmFsdWUucmVzZXJ2ZWQgPyAiXCIiICsgdGhpcy52YWx1ZSArICJcIiIgOiB0aGlzLnZhbHVlOw0KICAgICAgaWYgKHRoaXMuaXNTdGF0ZW1lbnQoKSkgew0KICAgICAgICByZXR1cm4gIiIgKyB0aGlzLnRhYiArIGNvZGUgKyAiOyI7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gY29kZTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIExpdGVyYWwucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gJyAiJyArIHRoaXMudmFsdWUgKyAnIic7DQogICAgfTsNCiAgICByZXR1cm4gTGl0ZXJhbDsNCiAgfSkoKTsNCiAgZXhwb3J0cy5SZXR1cm4gPSBSZXR1cm4gPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKFJldHVybiwgQmFzZSk7DQogICAgZnVuY3Rpb24gUmV0dXJuKGV4cHIpIHsNCiAgICAgIGlmIChleHByICYmICFleHByLnVud3JhcCgpLmlzVW5kZWZpbmVkKSB7DQogICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHI7DQogICAgICB9DQogICAgfQ0KICAgIFJldHVybi5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ2V4cHJlc3Npb24nXTsNCiAgICBSZXR1cm4ucHJvdG90eXBlLmlzU3RhdGVtZW50ID0gWUVTOw0KICAgIFJldHVybi5wcm90b3R5cGUubWFrZVJldHVybiA9IFRISVM7DQogICAgUmV0dXJuLnByb3RvdHlwZS5qdW1wcyA9IFRISVM7DQogICAgUmV0dXJuLnByb3RvdHlwZS5jb21waWxlID0gZnVuY3Rpb24obywgbGV2ZWwpIHsNCiAgICAgIHZhciBleHByLCBfcmVmMjsNCiAgICAgIGV4cHIgPSAoX3JlZjIgPSB0aGlzLmV4cHJlc3Npb24pICE9IG51bGwgPyBfcmVmMi5tYWtlUmV0dXJuKCkgOiB2b2lkIDA7DQogICAgICBpZiAoZXhwciAmJiAhKGV4cHIgaW5zdGFuY2VvZiBSZXR1cm4pKSB7DQogICAgICAgIHJldHVybiBleHByLmNvbXBpbGUobywgbGV2ZWwpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuIFJldHVybi5fX3N1cGVyX18uY29tcGlsZS5jYWxsKHRoaXMsIG8sIGxldmVsKTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIFJldHVybi5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICByZXR1cm4gdGhpcy50YWIgKyAoInJldHVybiIgKyAodGhpcy5leHByZXNzaW9uID8gJyAnICsgdGhpcy5leHByZXNzaW9uLmNvbXBpbGUobywgTEVWRUxfUEFSRU4pIDogJycpICsgIjsiKTsNCiAgICB9Ow0KICAgIHJldHVybiBSZXR1cm47DQogIH0pKCk7DQogIGV4cG9ydHMuVmFsdWUgPSBWYWx1ZSA9IChmdW5jdGlvbigpIHsNCiAgICBfX2V4dGVuZHMoVmFsdWUsIEJhc2UpOw0KICAgIGZ1bmN0aW9uIFZhbHVlKGJhc2UsIHByb3BzLCB0YWcpIHsNCiAgICAgIGlmICghcHJvcHMgJiYgYmFzZSBpbnN0YW5jZW9mIFZhbHVlKSB7DQogICAgICAgIHJldHVybiBiYXNlOw0KICAgICAgfQ0KICAgICAgdGhpcy5iYXNlID0gYmFzZTsNCiAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BzIHx8IFtdOw0KICAgICAgaWYgKHRhZykgew0KICAgICAgICB0aGlzW3RhZ10gPSB0cnVlOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRoaXM7DQogICAgfQ0KICAgIFZhbHVlLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnYmFzZScsICdwcm9wZXJ0aWVzJ107DQogICAgVmFsdWUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihwcm9wKSB7DQogICAgICB0aGlzLnByb3BlcnRpZXMucHVzaChwcm9wKTsNCiAgICAgIHJldHVybiB0aGlzOw0KICAgIH07DQogICAgVmFsdWUucHJvdG90eXBlLmhhc1Byb3BlcnRpZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiAhIXRoaXMucHJvcGVydGllcy5sZW5ndGg7DQogICAgfTsNCiAgICBWYWx1ZS5wcm90b3R5cGUuaXNBcnJheSA9IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuICF0aGlzLnByb3BlcnRpZXMubGVuZ3RoICYmIHRoaXMuYmFzZSBpbnN0YW5jZW9mIEFycjsNCiAgICB9Ow0KICAgIFZhbHVlLnByb3RvdHlwZS5pc0NvbXBsZXggPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiB0aGlzLmhhc1Byb3BlcnRpZXMoKSB8fCB0aGlzLmJhc2UuaXNDb21wbGV4KCk7DQogICAgfTsNCiAgICBWYWx1ZS5wcm90b3R5cGUuaXNBc3NpZ25hYmxlID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gdGhpcy5oYXNQcm9wZXJ0aWVzKCkgfHwgdGhpcy5iYXNlLmlzQXNzaWduYWJsZSgpOw0KICAgIH07DQogICAgVmFsdWUucHJvdG90eXBlLmlzU2ltcGxlTnVtYmVyID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gdGhpcy5iYXNlIGluc3RhbmNlb2YgTGl0ZXJhbCAmJiBTSU1QTEVOVU0udGVzdCh0aGlzLmJhc2UudmFsdWUpOw0KICAgIH07DQogICAgVmFsdWUucHJvdG90eXBlLmlzQXRvbWljID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgbm9kZSwgX2ksIF9sZW4sIF9yZWYyOw0KICAgICAgX3JlZjIgPSB0aGlzLnByb3BlcnRpZXMuY29uY2F0KHRoaXMuYmFzZSk7DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIG5vZGUgPSBfcmVmMltfaV07DQogICAgICAgIGlmIChub2RlLnNvYWsgfHwgbm9kZSBpbnN0YW5jZW9mIENhbGwpIHsNCiAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiB0cnVlOw0KICAgIH07DQogICAgVmFsdWUucHJvdG90eXBlLmlzU3RhdGVtZW50ID0gZnVuY3Rpb24obykgew0KICAgICAgcmV0dXJuICF0aGlzLnByb3BlcnRpZXMubGVuZ3RoICYmIHRoaXMuYmFzZS5pc1N0YXRlbWVudChvKTsNCiAgICB9Ow0KICAgIFZhbHVlLnByb3RvdHlwZS5hc3NpZ25zID0gZnVuY3Rpb24obmFtZSkgew0KICAgICAgcmV0dXJuICF0aGlzLnByb3BlcnRpZXMubGVuZ3RoICYmIHRoaXMuYmFzZS5hc3NpZ25zKG5hbWUpOw0KICAgIH07DQogICAgVmFsdWUucHJvdG90eXBlLmp1bXBzID0gZnVuY3Rpb24obykgew0KICAgICAgcmV0dXJuICF0aGlzLnByb3BlcnRpZXMubGVuZ3RoICYmIHRoaXMuYmFzZS5qdW1wcyhvKTsNCiAgICB9Ow0KICAgIFZhbHVlLnByb3RvdHlwZS5pc09iamVjdCA9IGZ1bmN0aW9uKG9ubHlHZW5lcmF0ZWQpIHsNCiAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMubGVuZ3RoKSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgIH0NCiAgICAgIHJldHVybiAodGhpcy5iYXNlIGluc3RhbmNlb2YgT2JqKSAmJiAoIW9ubHlHZW5lcmF0ZWQgfHwgdGhpcy5iYXNlLmdlbmVyYXRlZCk7DQogICAgfTsNCiAgICBWYWx1ZS5wcm90b3R5cGUuaXNTcGxpY2UgPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiBsYXN0KHRoaXMucHJvcGVydGllcykgaW5zdGFuY2VvZiBTbGljZTsNCiAgICB9Ow0KICAgIFZhbHVlLnByb3RvdHlwZS5tYWtlUmV0dXJuID0gZnVuY3Rpb24oKSB7DQogICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmxlbmd0aCkgew0KICAgICAgICByZXR1cm4gVmFsdWUuX19zdXBlcl9fLm1ha2VSZXR1cm4uY2FsbCh0aGlzKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiB0aGlzLmJhc2UubWFrZVJldHVybigpOw0KICAgICAgfQ0KICAgIH07DQogICAgVmFsdWUucHJvdG90eXBlLnVud3JhcCA9IGZ1bmN0aW9uKCkgew0KICAgICAgaWYgKHRoaXMucHJvcGVydGllcy5sZW5ndGgpIHsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gdGhpcy5iYXNlOw0KICAgICAgfQ0KICAgIH07DQogICAgVmFsdWUucHJvdG90eXBlLmNhY2hlUmVmZXJlbmNlID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIGJhc2UsIGJyZWYsIG5hbWUsIG5yZWY7DQogICAgICBuYW1lID0gbGFzdCh0aGlzLnByb3BlcnRpZXMpOw0KICAgICAgaWYgKHRoaXMucHJvcGVydGllcy5sZW5ndGggPCAyICYmICF0aGlzLmJhc2UuaXNDb21wbGV4KCkgJiYgIShuYW1lICE9IG51bGwgPyBuYW1lLmlzQ29tcGxleCgpIDogdm9pZCAwKSkgew0KICAgICAgICByZXR1cm4gW3RoaXMsIHRoaXNdOw0KICAgICAgfQ0KICAgICAgYmFzZSA9IG5ldyBWYWx1ZSh0aGlzLmJhc2UsIHRoaXMucHJvcGVydGllcy5zbGljZSgwLCAtMSkpOw0KICAgICAgaWYgKGJhc2UuaXNDb21wbGV4KCkpIHsNCiAgICAgICAgYnJlZiA9IG5ldyBMaXRlcmFsKG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdiYXNlJykpOw0KICAgICAgICBiYXNlID0gbmV3IFZhbHVlKG5ldyBQYXJlbnMobmV3IEFzc2lnbihicmVmLCBiYXNlKSkpOw0KICAgICAgfQ0KICAgICAgaWYgKCFuYW1lKSB7DQogICAgICAgIHJldHVybiBbYmFzZSwgYnJlZl07DQogICAgICB9DQogICAgICBpZiAobmFtZS5pc0NvbXBsZXgoKSkgew0KICAgICAgICBucmVmID0gbmV3IExpdGVyYWwoby5zY29wZS5mcmVlVmFyaWFibGUoJ25hbWUnKSk7DQogICAgICAgIG5hbWUgPSBuZXcgSW5kZXgobmV3IEFzc2lnbihucmVmLCBuYW1lLmluZGV4KSk7DQogICAgICAgIG5yZWYgPSBuZXcgSW5kZXgobnJlZik7DQogICAgICB9DQogICAgICByZXR1cm4gW2Jhc2UucHVzaChuYW1lKSwgbmV3IFZhbHVlKGJyZWYgfHwgYmFzZS5iYXNlLCBbbnJlZiB8fCBuYW1lXSldOw0KICAgIH07DQogICAgVmFsdWUucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIGNvZGUsIHByb3AsIHByb3BzLCBfaSwgX2xlbjsNCiAgICAgIHRoaXMuYmFzZS5mcm9udCA9IHRoaXMuZnJvbnQ7DQogICAgICBwcm9wcyA9IHRoaXMucHJvcGVydGllczsNCiAgICAgIGNvZGUgPSB0aGlzLmJhc2UuY29tcGlsZShvLCBwcm9wcy5sZW5ndGggPyBMRVZFTF9BQ0NFU1MgOiBudWxsKTsNCiAgICAgIGlmIChwcm9wc1swXSBpbnN0YW5jZW9mIEFjY2VzcyAmJiB0aGlzLmlzU2ltcGxlTnVtYmVyKCkpIHsNCiAgICAgICAgY29kZSA9ICIoIiArIGNvZGUgKyAiKSI7DQogICAgICB9DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IHByb3BzLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIHByb3AgPSBwcm9wc1tfaV07DQogICAgICAgIGNvZGUgKz0gcHJvcC5jb21waWxlKG8pOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGNvZGU7DQogICAgfTsNCiAgICBWYWx1ZS5wcm90b3R5cGUudW5mb2xkU29hayA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciByZXN1bHQ7DQogICAgICBpZiAodGhpcy51bmZvbGRlZFNvYWsgIT0gbnVsbCkgew0KICAgICAgICByZXR1cm4gdGhpcy51bmZvbGRlZFNvYWs7DQogICAgICB9DQogICAgICByZXN1bHQgPSBfX2JpbmQoZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBmc3QsIGksIGlmbiwgcHJvcCwgcmVmLCBzbmQsIF9sZW4sIF9yZWYyOw0KICAgICAgICBpZiAoaWZuID0gdGhpcy5iYXNlLnVuZm9sZFNvYWsobykpIHsNCiAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShpZm4uYm9keS5wcm9wZXJ0aWVzLCB0aGlzLnByb3BlcnRpZXMpOw0KICAgICAgICAgIHJldHVybiBpZm47DQogICAgICAgIH0NCiAgICAgICAgX3JlZjIgPSB0aGlzLnByb3BlcnRpZXM7DQogICAgICAgIGZvciAoaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IGkgPCBfbGVuOyBpKyspIHsNCiAgICAgICAgICBwcm9wID0gX3JlZjJbaV07DQogICAgICAgICAgaWYgKHByb3Auc29haykgew0KICAgICAgICAgICAgcHJvcC5zb2FrID0gZmFsc2U7DQogICAgICAgICAgICBmc3QgPSBuZXcgVmFsdWUodGhpcy5iYXNlLCB0aGlzLnByb3BlcnRpZXMuc2xpY2UoMCwgaSkpOw0KICAgICAgICAgICAgc25kID0gbmV3IFZhbHVlKHRoaXMuYmFzZSwgdGhpcy5wcm9wZXJ0aWVzLnNsaWNlKGkpKTsNCiAgICAgICAgICAgIGlmIChmc3QuaXNDb21wbGV4KCkpIHsNCiAgICAgICAgICAgICAgcmVmID0gbmV3IExpdGVyYWwoby5zY29wZS5mcmVlVmFyaWFibGUoJ3JlZicpKTsNCiAgICAgICAgICAgICAgZnN0ID0gbmV3IFBhcmVucyhuZXcgQXNzaWduKHJlZiwgZnN0KSk7DQogICAgICAgICAgICAgIHNuZC5iYXNlID0gcmVmOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBJZihuZXcgRXhpc3RlbmNlKGZzdCksIHNuZCwgew0KICAgICAgICAgICAgICBzb2FrOiB0cnVlDQogICAgICAgICAgICB9KTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICB9LCB0aGlzKSgpOw0KICAgICAgcmV0dXJuIHRoaXMudW5mb2xkZWRTb2FrID0gcmVzdWx0IHx8IGZhbHNlOw0KICAgIH07DQogICAgcmV0dXJuIFZhbHVlOw0KICB9KSgpOw0KICBleHBvcnRzLkNvbW1lbnQgPSBDb21tZW50ID0gKGZ1bmN0aW9uKCkgew0KICAgIF9fZXh0ZW5kcyhDb21tZW50LCBCYXNlKTsNCiAgICBmdW5jdGlvbiBDb21tZW50KGNvbW1lbnQpIHsNCiAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7DQogICAgfQ0KICAgIENvbW1lbnQucHJvdG90eXBlLmlzU3RhdGVtZW50ID0gWUVTOw0KICAgIENvbW1lbnQucHJvdG90eXBlLm1ha2VSZXR1cm4gPSBUSElTOw0KICAgIENvbW1lbnQucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obywgbGV2ZWwpIHsNCiAgICAgIHZhciBjb2RlOw0KICAgICAgY29kZSA9ICcvKicgKyBtdWx0aWRlbnQodGhpcy5jb21tZW50LCB0aGlzLnRhYikgKyAnKi8nOw0KICAgICAgaWYgKChsZXZlbCB8fCBvLmxldmVsKSA9PT0gTEVWRUxfVE9QKSB7DQogICAgICAgIGNvZGUgPSBvLmluZGVudCArIGNvZGU7DQogICAgICB9DQogICAgICByZXR1cm4gY29kZTsNCiAgICB9Ow0KICAgIHJldHVybiBDb21tZW50Ow0KICB9KSgpOw0KICBleHBvcnRzLkNhbGwgPSBDYWxsID0gKGZ1bmN0aW9uKCkgew0KICAgIF9fZXh0ZW5kcyhDYWxsLCBCYXNlKTsNCiAgICBmdW5jdGlvbiBDYWxsKHZhcmlhYmxlLCBhcmdzLCBzb2FrKSB7DQogICAgICB0aGlzLmFyZ3MgPSBhcmdzICE9IG51bGwgPyBhcmdzIDogW107DQogICAgICB0aGlzLnNvYWsgPSBzb2FrOw0KICAgICAgdGhpcy5pc05ldyA9IGZhbHNlOw0KICAgICAgdGhpcy5pc1N1cGVyID0gdmFyaWFibGUgPT09ICdzdXBlcic7DQogICAgICB0aGlzLnZhcmlhYmxlID0gdGhpcy5pc1N1cGVyID8gbnVsbCA6IHZhcmlhYmxlOw0KICAgIH0NCiAgICBDYWxsLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsndmFyaWFibGUnLCAnYXJncyddOw0KICAgIENhbGwucHJvdG90eXBlLm5ld0luc3RhbmNlID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgYmFzZTsNCiAgICAgIGJhc2UgPSB0aGlzLnZhcmlhYmxlLmJhc2UgfHwgdGhpcy52YXJpYWJsZTsNCiAgICAgIGlmIChiYXNlIGluc3RhbmNlb2YgQ2FsbCkgew0KICAgICAgICBiYXNlLm5ld0luc3RhbmNlKCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLmlzTmV3ID0gdHJ1ZTsNCiAgICAgIH0NCiAgICAgIHJldHVybiB0aGlzOw0KICAgIH07DQogICAgQ2FsbC5wcm90b3R5cGUuc3VwZXJSZWZlcmVuY2UgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgbWV0aG9kLCBuYW1lOw0KICAgICAgbWV0aG9kID0gby5zY29wZS5tZXRob2Q7DQogICAgICBpZiAoIW1ldGhvZCkgew0KICAgICAgICB0aHJvdyBTeW50YXhFcnJvcignY2Fubm90IGNhbGwgc3VwZXIgb3V0c2lkZSBvZiBhIGZ1bmN0aW9uLicpOw0KICAgICAgfQ0KICAgICAgbmFtZSA9IG1ldGhvZC5uYW1lOw0KICAgICAgaWYgKCFuYW1lKSB7DQogICAgICAgIHRocm93IFN5bnRheEVycm9yKCdjYW5ub3QgY2FsbCBzdXBlciBvbiBhbiBhbm9ueW1vdXMgZnVuY3Rpb24uJyk7DQogICAgICB9DQogICAgICBpZiAobWV0aG9kLmtsYXNzKSB7DQogICAgICAgIHJldHVybiAiIiArIG1ldGhvZC5rbGFzcyArICIuX19zdXBlcl9fLiIgKyBuYW1lOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuICIiICsgbmFtZSArICIuX19zdXBlcl9fLmNvbnN0cnVjdG9yIjsNCiAgICAgIH0NCiAgICB9Ow0KICAgIENhbGwucHJvdG90eXBlLnVuZm9sZFNvYWsgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgY2FsbCwgaWZuLCBsZWZ0LCBsaXN0LCByaXRlLCBfaSwgX2xlbiwgX3JlZjIsIF9yZWYzOw0KICAgICAgaWYgKHRoaXMuc29haykgew0KICAgICAgICBpZiAodGhpcy52YXJpYWJsZSkgew0KICAgICAgICAgIGlmIChpZm4gPSB1bmZvbGRTb2FrKG8sIHRoaXMsICd2YXJpYWJsZScpKSB7DQogICAgICAgICAgICByZXR1cm4gaWZuOw0KICAgICAgICAgIH0NCiAgICAgICAgICBfcmVmMiA9IG5ldyBWYWx1ZSh0aGlzLnZhcmlhYmxlKS5jYWNoZVJlZmVyZW5jZShvKSwgbGVmdCA9IF9yZWYyWzBdLCByaXRlID0gX3JlZjJbMV07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgbGVmdCA9IG5ldyBMaXRlcmFsKHRoaXMuc3VwZXJSZWZlcmVuY2UobykpOw0KICAgICAgICAgIHJpdGUgPSBuZXcgVmFsdWUobGVmdCk7DQogICAgICAgIH0NCiAgICAgICAgcml0ZSA9IG5ldyBDYWxsKHJpdGUsIHRoaXMuYXJncyk7DQogICAgICAgIHJpdGUuaXNOZXcgPSB0aGlzLmlzTmV3Ow0KICAgICAgICBsZWZ0ID0gbmV3IExpdGVyYWwoInR5cGVvZiAiICsgKGxlZnQuY29tcGlsZShvKSkgKyAiID09PSBcImZ1bmN0aW9uXCIiKTsNCiAgICAgICAgcmV0dXJuIG5ldyBJZihsZWZ0LCBuZXcgVmFsdWUocml0ZSksIHsNCiAgICAgICAgICBzb2FrOiB0cnVlDQogICAgICAgIH0pOw0KICAgICAgfQ0KICAgICAgY2FsbCA9IHRoaXM7DQogICAgICBsaXN0ID0gW107DQogICAgICB3aGlsZSAodHJ1ZSkgew0KICAgICAgICBpZiAoY2FsbC52YXJpYWJsZSBpbnN0YW5jZW9mIENhbGwpIHsNCiAgICAgICAgICBsaXN0LnB1c2goY2FsbCk7DQogICAgICAgICAgY2FsbCA9IGNhbGwudmFyaWFibGU7DQogICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCEoY2FsbC52YXJpYWJsZSBpbnN0YW5jZW9mIFZhbHVlKSkgew0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGxpc3QucHVzaChjYWxsKTsNCiAgICAgICAgaWYgKCEoKGNhbGwgPSBjYWxsLnZhcmlhYmxlLmJhc2UpIGluc3RhbmNlb2YgQ2FsbCkpIHsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgX3JlZjMgPSBsaXN0LnJldmVyc2UoKTsNCiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsNCiAgICAgICAgY2FsbCA9IF9yZWYzW19pXTsNCiAgICAgICAgaWYgKGlmbikgew0KICAgICAgICAgIGlmIChjYWxsLnZhcmlhYmxlIGluc3RhbmNlb2YgQ2FsbCkgew0KICAgICAgICAgICAgY2FsbC52YXJpYWJsZSA9IGlmbjsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgY2FsbC52YXJpYWJsZS5iYXNlID0gaWZuOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZm4gPSB1bmZvbGRTb2FrKG8sIGNhbGwsICd2YXJpYWJsZScpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGlmbjsNCiAgICB9Ow0KICAgIENhbGwucHJvdG90eXBlLmZpbHRlckltcGxpY2l0T2JqZWN0cyA9IGZ1bmN0aW9uKGxpc3QpIHsNCiAgICAgIHZhciBub2RlLCBub2Rlcywgb2JqLCBwcm9wLCBwcm9wZXJ0aWVzLCBfaSwgX2osIF9sZW4sIF9sZW4yLCBfcmVmMjsNCiAgICAgIG5vZGVzID0gW107DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGxpc3QubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsNCiAgICAgICAgbm9kZSA9IGxpc3RbX2ldOw0KICAgICAgICBpZiAoISgodHlwZW9mIG5vZGUuaXNPYmplY3QgPT09ICJmdW5jdGlvbiIgPyBub2RlLmlzT2JqZWN0KCkgOiB2b2lkIDApICYmIG5vZGUuYmFzZS5nZW5lcmF0ZWQpKSB7DQogICAgICAgICAgbm9kZXMucHVzaChub2RlKTsNCiAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KICAgICAgICBvYmogPSBudWxsOw0KICAgICAgICBfcmVmMiA9IG5vZGUuYmFzZS5wcm9wZXJ0aWVzOw0KICAgICAgICBmb3IgKF9qID0gMCwgX2xlbjIgPSBfcmVmMi5sZW5ndGg7IF9qIDwgX2xlbjI7IF9qKyspIHsNCiAgICAgICAgICBwcm9wID0gX3JlZjJbX2pdOw0KICAgICAgICAgIGlmIChwcm9wIGluc3RhbmNlb2YgQXNzaWduKSB7DQogICAgICAgICAgICBpZiAoIW9iaikgew0KICAgICAgICAgICAgICBub2Rlcy5wdXNoKG9iaiA9IG5ldyBPYmoocHJvcGVydGllcyA9IFtdLCB0cnVlKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2gocHJvcCk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIG5vZGVzLnB1c2gocHJvcCk7DQogICAgICAgICAgICBvYmogPSBudWxsOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIG5vZGVzOw0KICAgIH07DQogICAgQ2FsbC5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgYXJnLCBhcmdzLCBjb2RlLCBfcmVmMjsNCiAgICAgIGlmICgoX3JlZjIgPSB0aGlzLnZhcmlhYmxlKSAhPSBudWxsKSB7DQogICAgICAgIF9yZWYyLmZyb250ID0gdGhpcy5mcm9udDsNCiAgICAgIH0NCiAgICAgIGlmIChjb2RlID0gU3BsYXQuY29tcGlsZVNwbGF0dGVkQXJyYXkobywgdGhpcy5hcmdzLCB0cnVlKSkgew0KICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlU3BsYXQobywgY29kZSk7DQogICAgICB9DQogICAgICBhcmdzID0gdGhpcy5maWx0ZXJJbXBsaWNpdE9iamVjdHModGhpcy5hcmdzKTsNCiAgICAgIGFyZ3MgPSAoKGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgX2ksIF9sZW4sIF9yZXN1bHRzOw0KICAgICAgICBfcmVzdWx0cyA9IFtdOw0KICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGFyZ3MubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsNCiAgICAgICAgICBhcmcgPSBhcmdzW19pXTsNCiAgICAgICAgICBfcmVzdWx0cy5wdXNoKGFyZy5jb21waWxlKG8sIExFVkVMX0xJU1QpKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7DQogICAgICB9KSgpKS5qb2luKCcsICcpOw0KICAgICAgaWYgKHRoaXMuaXNTdXBlcikgew0KICAgICAgICByZXR1cm4gdGhpcy5zdXBlclJlZmVyZW5jZShvKSArICgiLmNhbGwodGhpcyIgKyAoYXJncyAmJiAnLCAnICsgYXJncykgKyAiKSIpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuICh0aGlzLmlzTmV3ID8gJ25ldyAnIDogJycpICsgdGhpcy52YXJpYWJsZS5jb21waWxlKG8sIExFVkVMX0FDQ0VTUykgKyAoIigiICsgYXJncyArICIpIik7DQogICAgICB9DQogICAgfTsNCiAgICBDYWxsLnByb3RvdHlwZS5jb21waWxlU3VwZXIgPSBmdW5jdGlvbihhcmdzLCBvKSB7DQogICAgICByZXR1cm4gIiIgKyAodGhpcy5zdXBlclJlZmVyZW5jZShvKSkgKyAiLmNhbGwodGhpcyIgKyAoYXJncy5sZW5ndGggPyAnLCAnIDogJycpICsgYXJncyArICIpIjsNCiAgICB9Ow0KICAgIENhbGwucHJvdG90eXBlLmNvbXBpbGVTcGxhdCA9IGZ1bmN0aW9uKG8sIHNwbGF0QXJncykgew0KICAgICAgdmFyIGJhc2UsIGZ1biwgaWR0LCBuYW1lLCByZWY7DQogICAgICBpZiAodGhpcy5pc1N1cGVyKSB7DQogICAgICAgIHJldHVybiAiIiArICh0aGlzLnN1cGVyUmVmZXJlbmNlKG8pKSArICIuYXBwbHkodGhpcywgIiArIHNwbGF0QXJncyArICIpIjsNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLmlzTmV3KSB7DQogICAgICAgIGlkdCA9IHRoaXMudGFiICsgVEFCOw0KICAgICAgICByZXR1cm4gIihmdW5jdGlvbihmdW5jLCBhcmdzLCBjdG9yKSB7XG4iICsgaWR0ICsgImN0b3IucHJvdG90eXBlID0gZnVuYy5wcm90b3R5cGU7XG4iICsgaWR0ICsgInZhciBjaGlsZCA9IG5ldyBjdG9yLCByZXN1bHQgPSBmdW5jLmFwcGx5KGNoaWxkLCBhcmdzKTtcbiIgKyBpZHQgKyAicmV0dXJuIHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIgPyByZXN1bHQgOiBjaGlsZDtcbiIgKyB0aGlzLnRhYiArICJ9KSgiICsgKHRoaXMudmFyaWFibGUuY29tcGlsZShvLCBMRVZFTF9MSVNUKSkgKyAiLCAiICsgc3BsYXRBcmdzICsgIiwgZnVuY3Rpb24oKSB7fSkiOw0KICAgICAgfQ0KICAgICAgYmFzZSA9IG5ldyBWYWx1ZSh0aGlzLnZhcmlhYmxlKTsNCiAgICAgIGlmICgobmFtZSA9IGJhc2UucHJvcGVydGllcy5wb3AoKSkgJiYgYmFzZS5pc0NvbXBsZXgoKSkgew0KICAgICAgICByZWYgPSBvLnNjb3BlLmZyZWVWYXJpYWJsZSgncmVmJyk7DQogICAgICAgIGZ1biA9ICIoIiArIHJlZiArICIgPSAiICsgKGJhc2UuY29tcGlsZShvLCBMRVZFTF9MSVNUKSkgKyAiKSIgKyAobmFtZS5jb21waWxlKG8pKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGZ1biA9IGJhc2UuY29tcGlsZShvLCBMRVZFTF9BQ0NFU1MpOw0KICAgICAgICBpZiAoU0lNUExFTlVNLnRlc3QoZnVuKSkgew0KICAgICAgICAgIGZ1biA9ICIoIiArIGZ1biArICIpIjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAobmFtZSkgew0KICAgICAgICAgIHJlZiA9IGZ1bjsNCiAgICAgICAgICBmdW4gKz0gbmFtZS5jb21waWxlKG8pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHJlZiA9ICdudWxsJzsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuICIiICsgZnVuICsgIi5hcHBseSgiICsgcmVmICsgIiwgIiArIHNwbGF0QXJncyArICIpIjsNCiAgICB9Ow0KICAgIHJldHVybiBDYWxsOw0KICB9KSgpOw0KICBleHBvcnRzLkV4dGVuZHMgPSBFeHRlbmRzID0gKGZ1bmN0aW9uKCkgew0KICAgIF9fZXh0ZW5kcyhFeHRlbmRzLCBCYXNlKTsNCiAgICBmdW5jdGlvbiBFeHRlbmRzKGNoaWxkLCBwYXJlbnQpIHsNCiAgICAgIHRoaXMuY2hpbGQgPSBjaGlsZDsNCiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50Ow0KICAgIH0NCiAgICBFeHRlbmRzLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnY2hpbGQnLCAncGFyZW50J107DQogICAgRXh0ZW5kcy5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHV0aWxpdHkoJ2hhc1Byb3AnKTsNCiAgICAgIHJldHVybiBuZXcgQ2FsbChuZXcgVmFsdWUobmV3IExpdGVyYWwodXRpbGl0eSgnZXh0ZW5kcycpKSksIFt0aGlzLmNoaWxkLCB0aGlzLnBhcmVudF0pLmNvbXBpbGUobyk7DQogICAgfTsNCiAgICByZXR1cm4gRXh0ZW5kczsNCiAgfSkoKTsNCiAgZXhwb3J0cy5BY2Nlc3MgPSBBY2Nlc3MgPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKEFjY2VzcywgQmFzZSk7DQogICAgZnVuY3Rpb24gQWNjZXNzKG5hbWUsIHRhZykgew0KICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCiAgICAgIHRoaXMubmFtZS5hc0tleSA9IHRydWU7DQogICAgICB0aGlzLnByb3RvID0gdGFnID09PSAncHJvdG8nID8gJy5wcm90b3R5cGUnIDogJyc7DQogICAgICB0aGlzLnNvYWsgPSB0YWcgPT09ICdzb2FrJzsNCiAgICB9DQogICAgQWNjZXNzLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnbmFtZSddOw0KICAgIEFjY2Vzcy5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBuYW1lOw0KICAgICAgbmFtZSA9IHRoaXMubmFtZS5jb21waWxlKG8pOw0KICAgICAgcmV0dXJuIHRoaXMucHJvdG8gKyAoSVNfU1RSSU5HLnRlc3QobmFtZSkgPyAiWyIgKyBuYW1lICsgIl0iIDogIi4iICsgbmFtZSk7DQogICAgfTsNCiAgICBBY2Nlc3MucHJvdG90eXBlLmlzQ29tcGxleCA9IE5POw0KICAgIHJldHVybiBBY2Nlc3M7DQogIH0pKCk7DQogIGV4cG9ydHMuSW5kZXggPSBJbmRleCA9IChmdW5jdGlvbigpIHsNCiAgICBfX2V4dGVuZHMoSW5kZXgsIEJhc2UpOw0KICAgIGZ1bmN0aW9uIEluZGV4KGluZGV4KSB7DQogICAgICB0aGlzLmluZGV4ID0gaW5kZXg7DQogICAgfQ0KICAgIEluZGV4LnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnaW5kZXgnXTsNCiAgICBJbmRleC5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHJldHVybiAodGhpcy5wcm90byA/ICcucHJvdG90eXBlJyA6ICcnKSArICgiWyIgKyAodGhpcy5pbmRleC5jb21waWxlKG8sIExFVkVMX1BBUkVOKSkgKyAiXSIpOw0KICAgIH07DQogICAgSW5kZXgucHJvdG90eXBlLmlzQ29tcGxleCA9IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuIHRoaXMuaW5kZXguaXNDb21wbGV4KCk7DQogICAgfTsNCiAgICByZXR1cm4gSW5kZXg7DQogIH0pKCk7DQogIGV4cG9ydHMuUmFuZ2UgPSBSYW5nZSA9IChmdW5jdGlvbigpIHsNCiAgICBfX2V4dGVuZHMoUmFuZ2UsIEJhc2UpOw0KICAgIFJhbmdlLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnZnJvbScsICd0byddOw0KICAgIGZ1bmN0aW9uIFJhbmdlKGZyb20sIHRvLCB0YWcpIHsNCiAgICAgIHRoaXMuZnJvbSA9IGZyb207DQogICAgICB0aGlzLnRvID0gdG87DQogICAgICB0aGlzLmV4Y2x1c2l2ZSA9IHRhZyA9PT0gJ2V4Y2x1c2l2ZSc7DQogICAgICB0aGlzLmVxdWFscyA9IHRoaXMuZXhjbHVzaXZlID8gJycgOiAnPSc7DQogICAgfQ0KICAgIFJhbmdlLnByb3RvdHlwZS5jb21waWxlVmFyaWFibGVzID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIHN0ZXAsIF9yZWYyLCBfcmVmMywgX3JlZjQsIF9yZWY1Ow0KICAgICAgbyA9IG1lcmdlKG8sIHsNCiAgICAgICAgdG9wOiB0cnVlDQogICAgICB9KTsNCiAgICAgIF9yZWYyID0gdGhpcy5mcm9tLmNhY2hlKG8sIExFVkVMX0xJU1QpLCB0aGlzLmZyb20gPSBfcmVmMlswXSwgdGhpcy5mcm9tVmFyID0gX3JlZjJbMV07DQogICAgICBfcmVmMyA9IHRoaXMudG8uY2FjaGUobywgTEVWRUxfTElTVCksIHRoaXMudG8gPSBfcmVmM1swXSwgdGhpcy50b1ZhciA9IF9yZWYzWzFdOw0KICAgICAgaWYgKHN0ZXAgPSBkZWwobywgJ3N0ZXAnKSkgew0KICAgICAgICBfcmVmNCA9IHN0ZXAuY2FjaGUobywgTEVWRUxfTElTVCksIHRoaXMuc3RlcCA9IF9yZWY0WzBdLCB0aGlzLnN0ZXBWYXIgPSBfcmVmNFsxXTsNCiAgICAgIH0NCiAgICAgIF9yZWY1ID0gW3RoaXMuZnJvbVZhci5tYXRjaChTSU1QTEVOVU0pLCB0aGlzLnRvVmFyLm1hdGNoKFNJTVBMRU5VTSldLCB0aGlzLmZyb21OdW0gPSBfcmVmNVswXSwgdGhpcy50b051bSA9IF9yZWY1WzFdOw0KICAgICAgaWYgKHRoaXMuc3RlcFZhcikgew0KICAgICAgICByZXR1cm4gdGhpcy5zdGVwTnVtID0gdGhpcy5zdGVwVmFyLm1hdGNoKFNJTVBMRU5VTSk7DQogICAgICB9DQogICAgfTsNCiAgICBSYW5nZS5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgY29uZCwgY29uZFBhcnQsIGZyb20sIGd0LCBpZHgsIGtub3duLCBsdCwgc3RlcFBhcnQsIHRvLCB2YXJQYXJ0LCBfcmVmMiwgX3JlZjM7DQogICAgICBpZiAoIXRoaXMuZnJvbVZhcikgew0KICAgICAgICB0aGlzLmNvbXBpbGVWYXJpYWJsZXMobyk7DQogICAgICB9DQogICAgICBpZiAoIW8uaW5kZXgpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZUFycmF5KG8pOw0KICAgICAgfQ0KICAgICAga25vd24gPSB0aGlzLmZyb21OdW0gJiYgdGhpcy50b051bTsNCiAgICAgIGlkeCA9IGRlbChvLCAnaW5kZXgnKTsNCiAgICAgIHZhclBhcnQgPSAiIiArIGlkeCArICIgPSAiICsgdGhpcy5mcm9tOw0KICAgICAgaWYgKHRoaXMudG8gIT09IHRoaXMudG9WYXIpIHsNCiAgICAgICAgdmFyUGFydCArPSAiLCAiICsgdGhpcy50bzsNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLnN0ZXAgIT09IHRoaXMuc3RlcFZhcikgew0KICAgICAgICB2YXJQYXJ0ICs9ICIsICIgKyB0aGlzLnN0ZXA7DQogICAgICB9DQogICAgICBfcmVmMiA9IFsiIiArIGlkeCArICIgPCIgKyB0aGlzLmVxdWFscywgIiIgKyBpZHggKyAiID4iICsgdGhpcy5lcXVhbHNdLCBsdCA9IF9yZWYyWzBdLCBndCA9IF9yZWYyWzFdOw0KICAgICAgY29uZFBhcnQgPSB0aGlzLnN0ZXBOdW0gPyBjb25kUGFydCA9ICt0aGlzLnN0ZXBOdW0gPiAwID8gIiIgKyBsdCArICIgIiArIHRoaXMudG9WYXIgOiAiIiArIGd0ICsgIiAiICsgdGhpcy50b1ZhciA6IGtub3duID8gKChfcmVmMyA9IFsrdGhpcy5mcm9tTnVtLCArdGhpcy50b051bV0sIGZyb20gPSBfcmVmM1swXSwgdG8gPSBfcmVmM1sxXSwgX3JlZjMpLCBjb25kUGFydCA9IGZyb20gPD0gdG8gPyAiIiArIGx0ICsgIiAiICsgdG8gOiAiIiArIGd0ICsgIiAiICsgdG8pIDogKGNvbmQgPSAiIiArIHRoaXMuZnJvbVZhciArICIgPD0gIiArIHRoaXMudG9WYXIsIGNvbmRQYXJ0ID0gIiIgKyBjb25kICsgIiA/ICIgKyBsdCArICIgIiArIHRoaXMudG9WYXIgKyAiIDogIiArIGd0ICsgIiAiICsgdGhpcy50b1Zhcik7DQogICAgICBzdGVwUGFydCA9IHRoaXMuc3RlcFZhciA/ICIiICsgaWR4ICsgIiArPSAiICsgdGhpcy5zdGVwVmFyIDoga25vd24gPyBmcm9tIDw9IHRvID8gIiIgKyBpZHggKyAiKysiIDogIiIgKyBpZHggKyAiLS0iIDogIiIgKyBjb25kICsgIiA/ICIgKyBpZHggKyAiKysgOiAiICsgaWR4ICsgIi0tIjsNCiAgICAgIHJldHVybiAiIiArIHZhclBhcnQgKyAiOyAiICsgY29uZFBhcnQgKyAiOyAiICsgc3RlcFBhcnQ7DQogICAgfTsNCiAgICBSYW5nZS5wcm90b3R5cGUuY29tcGlsZUFycmF5ID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIGJvZHksIGNvbmQsIGksIGlkdCwgcG9zdCwgcHJlLCByYW5nZSwgcmVzdWx0LCB2YXJzLCBfaSwgX3JlZjIsIF9yZWYzLCBfcmVzdWx0czsNCiAgICAgIGlmICh0aGlzLmZyb21OdW0gJiYgdGhpcy50b051bSAmJiBNYXRoLmFicyh0aGlzLmZyb21OdW0gLSB0aGlzLnRvTnVtKSA8PSAyMCkgew0KICAgICAgICByYW5nZSA9IChmdW5jdGlvbigpIHsNCiAgICAgICAgICBfcmVzdWx0cyA9IFtdOw0KICAgICAgICAgIGZvciAodmFyIF9pID0gX3JlZjIgPSArdGhpcy5mcm9tTnVtLCBfcmVmMyA9ICt0aGlzLnRvTnVtOyBfcmVmMiA8PSBfcmVmMyA/IF9pIDw9IF9yZWYzIDogX2kgPj0gX3JlZjM7IF9yZWYyIDw9IF9yZWYzID8gX2krKyA6IF9pLS0peyBfcmVzdWx0cy5wdXNoKF9pKTsgfQ0KICAgICAgICAgIHJldHVybiBfcmVzdWx0czsNCiAgICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICAgICAgaWYgKHRoaXMuZXhjbHVzaXZlKSB7DQogICAgICAgICAgcmFuZ2UucG9wKCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICJbIiArIChyYW5nZS5qb2luKCcsICcpKSArICJdIjsNCiAgICAgIH0NCiAgICAgIGlkdCA9IHRoaXMudGFiICsgVEFCOw0KICAgICAgaSA9IG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdpJyk7DQogICAgICByZXN1bHQgPSBvLnNjb3BlLmZyZWVWYXJpYWJsZSgncmVzdWx0cycpOw0KICAgICAgcHJlID0gIlxuIiArIGlkdCArIHJlc3VsdCArICIgPSBbXTsiOw0KICAgICAgaWYgKHRoaXMuZnJvbU51bSAmJiB0aGlzLnRvTnVtKSB7DQogICAgICAgIG8uaW5kZXggPSBpOw0KICAgICAgICBib2R5ID0gdGhpcy5jb21waWxlTm9kZShvKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHZhcnMgPSAoIiIgKyBpICsgIiA9ICIgKyB0aGlzLmZyb20pICsgKHRoaXMudG8gIT09IHRoaXMudG9WYXIgPyAiLCAiICsgdGhpcy50byA6ICcnKTsNCiAgICAgICAgY29uZCA9ICIiICsgdGhpcy5mcm9tVmFyICsgIiA8PSAiICsgdGhpcy50b1ZhcjsNCiAgICAgICAgYm9keSA9ICJ2YXIgIiArIHZhcnMgKyAiOyAiICsgY29uZCArICIgPyAiICsgaSArICIgPCIgKyB0aGlzLmVxdWFscyArICIgIiArIHRoaXMudG9WYXIgKyAiIDogIiArIGkgKyAiID4iICsgdGhpcy5lcXVhbHMgKyAiICIgKyB0aGlzLnRvVmFyICsgIjsgIiArIGNvbmQgKyAiID8gIiArIGkgKyAiKysgOiAiICsgaSArICItLSI7DQogICAgICB9DQogICAgICBwb3N0ID0gInsgIiArIHJlc3VsdCArICIucHVzaCgiICsgaSArICIpOyB9XG4iICsgaWR0ICsgInJldHVybiAiICsgcmVzdWx0ICsgIjtcbiIgKyBvLmluZGVudDsNCiAgICAgIHJldHVybiAiKGZ1bmN0aW9uKCkgeyIgKyBwcmUgKyAiXG4iICsgaWR0ICsgImZvciAoIiArIGJvZHkgKyAiKSIgKyBwb3N0ICsgIn0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykiOw0KICAgIH07DQogICAgcmV0dXJuIFJhbmdlOw0KICB9KSgpOw0KICBleHBvcnRzLlNsaWNlID0gU2xpY2UgPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKFNsaWNlLCBCYXNlKTsNCiAgICBTbGljZS5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ3JhbmdlJ107DQogICAgZnVuY3Rpb24gU2xpY2UocmFuZ2UpIHsNCiAgICAgIHRoaXMucmFuZ2UgPSByYW5nZTsNCiAgICAgIFNsaWNlLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOw0KICAgIH0NCiAgICBTbGljZS5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgY29tcGlsZWQsIGZyb20sIGZyb21TdHIsIHRvLCB0b1N0ciwgX3JlZjI7DQogICAgICBfcmVmMiA9IHRoaXMucmFuZ2UsIHRvID0gX3JlZjIudG8sIGZyb20gPSBfcmVmMi5mcm9tOw0KICAgICAgZnJvbVN0ciA9IGZyb20gJiYgZnJvbS5jb21waWxlKG8sIExFVkVMX1BBUkVOKSB8fCAnMCc7DQogICAgICBjb21waWxlZCA9IHRvICYmIHRvLmNvbXBpbGUobywgTEVWRUxfUEFSRU4pOw0KICAgICAgaWYgKHRvICYmICEoIXRoaXMucmFuZ2UuZXhjbHVzaXZlICYmICtjb21waWxlZCA9PT0gLTEpKSB7DQogICAgICAgIHRvU3RyID0gJywgJyArICh0aGlzLnJhbmdlLmV4Y2x1c2l2ZSA/IGNvbXBpbGVkIDogU0lNUExFTlVNLnRlc3QoY29tcGlsZWQpID8gKCtjb21waWxlZCArIDEpLnRvU3RyaW5nKCkgOiAiKCIgKyBjb21waWxlZCArICIgKyAxKSB8fCA5ZTkiKTsNCiAgICAgIH0NCiAgICAgIHJldHVybiAiLnNsaWNlKCIgKyBmcm9tU3RyICsgKHRvU3RyIHx8ICcnKSArICIpIjsNCiAgICB9Ow0KICAgIHJldHVybiBTbGljZTsNCiAgfSkoKTsNCiAgZXhwb3J0cy5PYmogPSBPYmogPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKE9iaiwgQmFzZSk7DQogICAgZnVuY3Rpb24gT2JqKHByb3BzLCBnZW5lcmF0ZWQpIHsNCiAgICAgIHRoaXMuZ2VuZXJhdGVkID0gZ2VuZXJhdGVkICE9IG51bGwgPyBnZW5lcmF0ZWQgOiBmYWxzZTsNCiAgICAgIHRoaXMub2JqZWN0cyA9IHRoaXMucHJvcGVydGllcyA9IHByb3BzIHx8IFtdOw0KICAgIH0NCiAgICBPYmoucHJvdG90eXBlLmNoaWxkcmVuID0gWydwcm9wZXJ0aWVzJ107DQogICAgT2JqLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBpLCBpZHQsIGluZGVudCwgam9pbiwgbGFzdE5vbmNvbSwgbm9kZSwgb2JqLCBwcm9wLCBwcm9wcywgX2ksIF9sZW47DQogICAgICBwcm9wcyA9IHRoaXMucHJvcGVydGllczsNCiAgICAgIGlmICghcHJvcHMubGVuZ3RoKSB7DQogICAgICAgIGlmICh0aGlzLmZyb250KSB7DQogICAgICAgICAgcmV0dXJuICcoe30pJzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICByZXR1cm4gJ3t9JzsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMuZ2VuZXJhdGVkKSB7DQogICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gcHJvcHMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsNCiAgICAgICAgICBub2RlID0gcHJvcHNbX2ldOw0KICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVmFsdWUpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGhhdmUgYW4gaW1wbGljaXQgdmFsdWUgaW4gYW4gaW1wbGljaXQgb2JqZWN0Jyk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZHQgPSBvLmluZGVudCArPSBUQUI7DQogICAgICBsYXN0Tm9uY29tID0gdGhpcy5sYXN0Tm9uQ29tbWVudCh0aGlzLnByb3BlcnRpZXMpOw0KICAgICAgcHJvcHMgPSAoZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBfbGVuMiwgX3Jlc3VsdHM7DQogICAgICAgIF9yZXN1bHRzID0gW107DQogICAgICAgIGZvciAoaSA9IDAsIF9sZW4yID0gcHJvcHMubGVuZ3RoOyBpIDwgX2xlbjI7IGkrKykgew0KICAgICAgICAgIHByb3AgPSBwcm9wc1tpXTsNCiAgICAgICAgICBqb2luID0gaSA9PT0gcHJvcHMubGVuZ3RoIC0gMSA/ICcnIDogcHJvcCA9PT0gbGFzdE5vbmNvbSB8fCBwcm9wIGluc3RhbmNlb2YgQ29tbWVudCA/ICdcbicgOiAnLFxuJzsNCiAgICAgICAgICBpbmRlbnQgPSBwcm9wIGluc3RhbmNlb2YgQ29tbWVudCA/ICcnIDogaWR0Ow0KICAgICAgICAgIGlmIChwcm9wIGluc3RhbmNlb2YgVmFsdWUgJiYgcHJvcFsidGhpcyJdKSB7DQogICAgICAgICAgICBwcm9wID0gbmV3IEFzc2lnbihwcm9wLnByb3BlcnRpZXNbMF0ubmFtZSwgcHJvcCwgJ29iamVjdCcpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAoIShwcm9wIGluc3RhbmNlb2YgQ29tbWVudCkpIHsNCiAgICAgICAgICAgIGlmICghKHByb3AgaW5zdGFuY2VvZiBBc3NpZ24pKSB7DQogICAgICAgICAgICAgIHByb3AgPSBuZXcgQXNzaWduKHByb3AsIHByb3AsICdvYmplY3QnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIChwcm9wLnZhcmlhYmxlLmJhc2UgfHwgcHJvcC52YXJpYWJsZSkuYXNLZXkgPSB0cnVlOw0KICAgICAgICAgIH0NCiAgICAgICAgICBfcmVzdWx0cy5wdXNoKGluZGVudCArIHByb3AuY29tcGlsZShvLCBMRVZFTF9UT1ApICsgam9pbik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIF9yZXN1bHRzOw0KICAgICAgfSkoKTsNCiAgICAgIHByb3BzID0gcHJvcHMuam9pbignJyk7DQogICAgICBvYmogPSAieyIgKyAocHJvcHMgJiYgJ1xuJyArIHByb3BzICsgJ1xuJyArIHRoaXMudGFiKSArICJ9IjsNCiAgICAgIGlmICh0aGlzLmZyb250KSB7DQogICAgICAgIHJldHVybiAiKCIgKyBvYmogKyAiKSI7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gb2JqOw0KICAgICAgfQ0KICAgIH07DQogICAgT2JqLnByb3RvdHlwZS5hc3NpZ25zID0gZnVuY3Rpb24obmFtZSkgew0KICAgICAgdmFyIHByb3AsIF9pLCBfbGVuLCBfcmVmMjsNCiAgICAgIF9yZWYyID0gdGhpcy5wcm9wZXJ0aWVzOw0KICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgew0KICAgICAgICBwcm9wID0gX3JlZjJbX2ldOw0KICAgICAgICBpZiAocHJvcC5hc3NpZ25zKG5hbWUpKSB7DQogICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9Ow0KICAgIHJldHVybiBPYmo7DQogIH0pKCk7DQogIGV4cG9ydHMuQXJyID0gQXJyID0gKGZ1bmN0aW9uKCkgew0KICAgIF9fZXh0ZW5kcyhBcnIsIEJhc2UpOw0KICAgIGZ1bmN0aW9uIEFycihvYmpzKSB7DQogICAgICB0aGlzLm9iamVjdHMgPSBvYmpzIHx8IFtdOw0KICAgIH0NCiAgICBBcnIucHJvdG90eXBlLmNoaWxkcmVuID0gWydvYmplY3RzJ107DQogICAgQXJyLnByb3RvdHlwZS5maWx0ZXJJbXBsaWNpdE9iamVjdHMgPSBDYWxsLnByb3RvdHlwZS5maWx0ZXJJbXBsaWNpdE9iamVjdHM7DQogICAgQXJyLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjb2RlLCBvYmosIG9ianM7DQogICAgICBpZiAoIXRoaXMub2JqZWN0cy5sZW5ndGgpIHsNCiAgICAgICAgcmV0dXJuICdbXSc7DQogICAgICB9DQogICAgICBvLmluZGVudCArPSBUQUI7DQogICAgICBvYmpzID0gdGhpcy5maWx0ZXJJbXBsaWNpdE9iamVjdHModGhpcy5vYmplY3RzKTsNCiAgICAgIGlmIChjb2RlID0gU3BsYXQuY29tcGlsZVNwbGF0dGVkQXJyYXkobywgb2JqcykpIHsNCiAgICAgICAgcmV0dXJuIGNvZGU7DQogICAgICB9DQogICAgICBjb2RlID0gKChmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIF9pLCBfbGVuLCBfcmVzdWx0czsNCiAgICAgICAgX3Jlc3VsdHMgPSBbXTsNCiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBvYmpzLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgICAgb2JqID0gb2Jqc1tfaV07DQogICAgICAgICAgX3Jlc3VsdHMucHVzaChvYmouY29tcGlsZShvLCBMRVZFTF9MSVNUKSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIF9yZXN1bHRzOw0KICAgICAgfSkoKSkuam9pbignLCAnKTsNCiAgICAgIGlmIChjb2RlLmluZGV4T2YoJ1xuJykgPj0gMCkgew0KICAgICAgICByZXR1cm4gIltcbiIgKyBvLmluZGVudCArIGNvZGUgKyAiXG4iICsgdGhpcy50YWIgKyAiXSI7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gIlsiICsgY29kZSArICJdIjsNCiAgICAgIH0NCiAgICB9Ow0KICAgIEFyci5wcm90b3R5cGUuYXNzaWducyA9IGZ1bmN0aW9uKG5hbWUpIHsNCiAgICAgIHZhciBvYmosIF9pLCBfbGVuLCBfcmVmMjsNCiAgICAgIF9yZWYyID0gdGhpcy5vYmplY3RzOw0KICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgew0KICAgICAgICBvYmogPSBfcmVmMltfaV07DQogICAgICAgIGlmIChvYmouYXNzaWducyhuYW1lKSkgew0KICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCiAgICByZXR1cm4gQXJyOw0KICB9KSgpOw0KICBleHBvcnRzLkNsYXNzID0gQ2xhc3MgPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKENsYXNzLCBCYXNlKTsNCiAgICBmdW5jdGlvbiBDbGFzcyh2YXJpYWJsZSwgcGFyZW50LCBib2R5KSB7DQogICAgICB0aGlzLnZhcmlhYmxlID0gdmFyaWFibGU7DQogICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsNCiAgICAgIHRoaXMuYm9keSA9IGJvZHkgIT0gbnVsbCA/IGJvZHkgOiBuZXcgQmxvY2s7DQogICAgICB0aGlzLmJvdW5kRnVuY3MgPSBbXTsNCiAgICAgIHRoaXMuYm9keS5jbGFzc0JvZHkgPSB0cnVlOw0KICAgIH0NCiAgICBDbGFzcy5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ3ZhcmlhYmxlJywgJ3BhcmVudCcsICdib2R5J107DQogICAgQ2xhc3MucHJvdG90eXBlLmRldGVybWluZU5hbWUgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBkZWNsLCB0YWlsOw0KICAgICAgaWYgKCF0aGlzLnZhcmlhYmxlKSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgICAgfQ0KICAgICAgZGVjbCA9ICh0YWlsID0gbGFzdCh0aGlzLnZhcmlhYmxlLnByb3BlcnRpZXMpKSA/IHRhaWwgaW5zdGFuY2VvZiBBY2Nlc3MgJiYgdGFpbC5uYW1lLnZhbHVlIDogdGhpcy52YXJpYWJsZS5iYXNlLnZhbHVlOw0KICAgICAgcmV0dXJuIGRlY2wgJiYgKGRlY2wgPSBJREVOVElGSUVSLnRlc3QoZGVjbCkgJiYgZGVjbCk7DQogICAgfTsNCiAgICBDbGFzcy5wcm90b3R5cGUuc2V0Q29udGV4dCA9IGZ1bmN0aW9uKG5hbWUpIHsNCiAgICAgIHJldHVybiB0aGlzLmJvZHkudHJhdmVyc2VDaGlsZHJlbihmYWxzZSwgZnVuY3Rpb24obm9kZSkgew0KICAgICAgICBpZiAobm9kZS5jbGFzc0JvZHkpIHsNCiAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBMaXRlcmFsICYmIG5vZGUudmFsdWUgPT09ICd0aGlzJykgew0KICAgICAgICAgIHJldHVybiBub2RlLnZhbHVlID0gbmFtZTsNCiAgICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ29kZSkgew0KICAgICAgICAgIG5vZGUua2xhc3MgPSBuYW1lOw0KICAgICAgICAgIGlmIChub2RlLmJvdW5kKSB7DQogICAgICAgICAgICByZXR1cm4gbm9kZS5jb250ZXh0ID0gbmFtZTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0pOw0KICAgIH07DQogICAgQ2xhc3MucHJvdG90eXBlLmFkZEJvdW5kRnVuY3Rpb25zID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIGJuYW1lLCBidmFyLCBfaSwgX2xlbiwgX3JlZjIsIF9yZXN1bHRzOw0KICAgICAgaWYgKHRoaXMuYm91bmRGdW5jcy5sZW5ndGgpIHsNCiAgICAgICAgX3JlZjIgPSB0aGlzLmJvdW5kRnVuY3M7DQogICAgICAgIF9yZXN1bHRzID0gW107DQogICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsNCiAgICAgICAgICBidmFyID0gX3JlZjJbX2ldOw0KICAgICAgICAgIGJuYW1lID0gYnZhci5jb21waWxlKG8pOw0KICAgICAgICAgIF9yZXN1bHRzLnB1c2godGhpcy5jdG9yLmJvZHkudW5zaGlmdChuZXcgTGl0ZXJhbCgidGhpcy4iICsgYm5hbWUgKyAiID0gIiArICh1dGlsaXR5KCdiaW5kJykpICsgIih0aGlzLiIgKyBibmFtZSArICIsIHRoaXMpIikpKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7DQogICAgICB9DQogICAgfTsNCiAgICBDbGFzcy5wcm90b3R5cGUuYWRkUHJvcGVydGllcyA9IGZ1bmN0aW9uKG5vZGUsIG5hbWUsIG8pIHsNCiAgICAgIHZhciBhc3NpZ24sIGJhc2UsIGV4cHJzLCBmdW5jLCBwcm9wczsNCiAgICAgIHByb3BzID0gbm9kZS5iYXNlLnByb3BlcnRpZXMuc2xpY2UoMCk7DQogICAgICBleHBycyA9IChmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIF9yZXN1bHRzOw0KICAgICAgICBfcmVzdWx0cyA9IFtdOw0KICAgICAgICB3aGlsZSAoYXNzaWduID0gcHJvcHMuc2hpZnQoKSkgew0KICAgICAgICAgIGlmIChhc3NpZ24gaW5zdGFuY2VvZiBBc3NpZ24pIHsNCiAgICAgICAgICAgIGJhc2UgPSBhc3NpZ24udmFyaWFibGUuYmFzZTsNCiAgICAgICAgICAgIGRlbGV0ZSBhc3NpZ24uY29udGV4dDsNCiAgICAgICAgICAgIGZ1bmMgPSBhc3NpZ24udmFsdWU7DQogICAgICAgICAgICBpZiAoYmFzZS52YWx1ZSA9PT0gJ2NvbnN0cnVjdG9yJykgew0KICAgICAgICAgICAgICBpZiAodGhpcy5jdG9yKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZGVmaW5lIG1vcmUgdGhhbiBvbmUgY29uc3RydWN0b3IgaW4gYSBjbGFzcycpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGlmIChmdW5jLmJvdW5kKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZGVmaW5lIGEgY29uc3RydWN0b3IgYXMgYSBib3VuZCBmdW5jdGlvbicpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGlmIChmdW5jIGluc3RhbmNlb2YgQ29kZSkgew0KICAgICAgICAgICAgICAgIGFzc2lnbiA9IHRoaXMuY3RvciA9IGZ1bmM7DQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdGhpcy5leHRlcm5hbEN0b3IgPSBvLnNjb3BlLmZyZWVWYXJpYWJsZSgnY2xhc3MnKTsNCiAgICAgICAgICAgICAgICBhc3NpZ24gPSBuZXcgQXNzaWduKG5ldyBMaXRlcmFsKHRoaXMuZXh0ZXJuYWxDdG9yKSwgZnVuYyk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGlmICghYXNzaWduLnZhcmlhYmxlWyJ0aGlzIl0pIHsNCiAgICAgICAgICAgICAgICBhc3NpZ24udmFyaWFibGUgPSBuZXcgVmFsdWUobmV3IExpdGVyYWwobmFtZSksIFtuZXcgQWNjZXNzKGJhc2UsICdwcm90bycpXSk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgaWYgKGZ1bmMgaW5zdGFuY2VvZiBDb2RlICYmIGZ1bmMuYm91bmQpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmJvdW5kRnVuY3MucHVzaChiYXNlKTsNCiAgICAgICAgICAgICAgICBmdW5jLmJvdW5kID0gZmFsc2U7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgX3Jlc3VsdHMucHVzaChhc3NpZ24pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBfcmVzdWx0czsNCiAgICAgIH0pLmNhbGwodGhpcyk7DQogICAgICByZXR1cm4gY29tcGFjdChleHBycyk7DQogICAgfTsNCiAgICBDbGFzcy5wcm90b3R5cGUud2Fsa0JvZHkgPSBmdW5jdGlvbihuYW1lLCBvKSB7DQogICAgICByZXR1cm4gdGhpcy50cmF2ZXJzZUNoaWxkcmVuKGZhbHNlLCBfX2JpbmQoZnVuY3Rpb24oY2hpbGQpIHsNCiAgICAgICAgdmFyIGV4cHMsIGksIG5vZGUsIF9sZW4sIF9yZWYyOw0KICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDbGFzcykgew0KICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBCbG9jaykgew0KICAgICAgICAgIF9yZWYyID0gZXhwcyA9IGNoaWxkLmV4cHJlc3Npb25zOw0KICAgICAgICAgIGZvciAoaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IGkgPCBfbGVuOyBpKyspIHsNCiAgICAgICAgICAgIG5vZGUgPSBfcmVmMltpXTsNCiAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVmFsdWUgJiYgbm9kZS5pc09iamVjdCh0cnVlKSkgew0KICAgICAgICAgICAgICBleHBzW2ldID0gdGhpcy5hZGRQcm9wZXJ0aWVzKG5vZGUsIG5hbWUsIG8pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICByZXR1cm4gY2hpbGQuZXhwcmVzc2lvbnMgPSBleHBzID0gZmxhdHRlbihleHBzKTsNCiAgICAgICAgfQ0KICAgICAgfSwgdGhpcykpOw0KICAgIH07DQogICAgQ2xhc3MucHJvdG90eXBlLmVuc3VyZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24obmFtZSkgew0KICAgICAgaWYgKCF0aGlzLmN0b3IpIHsNCiAgICAgICAgdGhpcy5jdG9yID0gbmV3IENvZGU7DQogICAgICAgIGlmICh0aGlzLnBhcmVudCkgew0KICAgICAgICAgIHRoaXMuY3Rvci5ib2R5LnB1c2gobmV3IExpdGVyYWwoIiIgKyBuYW1lICsgIi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSIpKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGhpcy5leHRlcm5hbEN0b3IpIHsNCiAgICAgICAgICB0aGlzLmN0b3IuYm9keS5wdXNoKG5ldyBMaXRlcmFsKCIiICsgdGhpcy5leHRlcm5hbEN0b3IgKyAiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykiKSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5ib2R5LmV4cHJlc3Npb25zLnVuc2hpZnQodGhpcy5jdG9yKTsNCiAgICAgIH0NCiAgICAgIHRoaXMuY3Rvci5jdG9yID0gdGhpcy5jdG9yLm5hbWUgPSBuYW1lOw0KICAgICAgdGhpcy5jdG9yLmtsYXNzID0gbnVsbDsNCiAgICAgIHJldHVybiB0aGlzLmN0b3Iubm9SZXR1cm4gPSB0cnVlOw0KICAgIH07DQogICAgQ2xhc3MucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIGRlY2wsIGtsYXNzLCBsbmFtZSwgbmFtZTsNCiAgICAgIGRlY2wgPSB0aGlzLmRldGVybWluZU5hbWUoKTsNCiAgICAgIG5hbWUgPSBkZWNsIHx8IHRoaXMubmFtZSB8fCAnX0NsYXNzJzsNCiAgICAgIGxuYW1lID0gbmV3IExpdGVyYWwobmFtZSk7DQogICAgICB0aGlzLnNldENvbnRleHQobmFtZSk7DQogICAgICB0aGlzLndhbGtCb2R5KG5hbWUsIG8pOw0KICAgICAgdGhpcy5lbnN1cmVDb25zdHJ1Y3RvcihuYW1lKTsNCiAgICAgIGlmICh0aGlzLnBhcmVudCkgew0KICAgICAgICB0aGlzLmJvZHkuZXhwcmVzc2lvbnMudW5zaGlmdChuZXcgRXh0ZW5kcyhsbmFtZSwgdGhpcy5wYXJlbnQpKTsNCiAgICAgIH0NCiAgICAgIGlmICghKHRoaXMuY3RvciBpbnN0YW5jZW9mIENvZGUpKSB7DQogICAgICAgIHRoaXMuYm9keS5leHByZXNzaW9ucy51bnNoaWZ0KHRoaXMuY3Rvcik7DQogICAgICB9DQogICAgICB0aGlzLmJvZHkuZXhwcmVzc2lvbnMucHVzaChsbmFtZSk7DQogICAgICB0aGlzLmFkZEJvdW5kRnVuY3Rpb25zKG8pOw0KICAgICAga2xhc3MgPSBuZXcgUGFyZW5zKENsb3N1cmUud3JhcCh0aGlzLmJvZHkpLCB0cnVlKTsNCiAgICAgIGlmICh0aGlzLnZhcmlhYmxlKSB7DQogICAgICAgIGtsYXNzID0gbmV3IEFzc2lnbih0aGlzLnZhcmlhYmxlLCBrbGFzcyk7DQogICAgICB9DQogICAgICByZXR1cm4ga2xhc3MuY29tcGlsZShvKTsNCiAgICB9Ow0KICAgIHJldHVybiBDbGFzczsNCiAgfSkoKTsNCiAgZXhwb3J0cy5Bc3NpZ24gPSBBc3NpZ24gPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKEFzc2lnbiwgQmFzZSk7DQogICAgZnVuY3Rpb24gQXNzaWduKHZhcmlhYmxlLCB2YWx1ZSwgY29udGV4dCwgb3B0aW9ucykgew0KICAgICAgdGhpcy52YXJpYWJsZSA9IHZhcmlhYmxlOw0KICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsNCiAgICAgIHRoaXMucGFyYW0gPSBvcHRpb25zICYmIG9wdGlvbnMucGFyYW07DQogICAgfQ0KICAgIEFzc2lnbi5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ3ZhcmlhYmxlJywgJ3ZhbHVlJ107DQogICAgQXNzaWduLnByb3RvdHlwZS5hc3NpZ25zID0gZnVuY3Rpb24obmFtZSkgew0KICAgICAgcmV0dXJuIHRoaXNbdGhpcy5jb250ZXh0ID09PSAnb2JqZWN0JyA/ICd2YWx1ZScgOiAndmFyaWFibGUnXS5hc3NpZ25zKG5hbWUpOw0KICAgIH07DQogICAgQXNzaWduLnByb3RvdHlwZS51bmZvbGRTb2FrID0gZnVuY3Rpb24obykgew0KICAgICAgcmV0dXJuIHVuZm9sZFNvYWsobywgdGhpcywgJ3ZhcmlhYmxlJyk7DQogICAgfTsNCiAgICBBc3NpZ24ucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIGlzVmFsdWUsIG1hdGNoLCBuYW1lLCB2YWwsIF9yZWYyOw0KICAgICAgaWYgKGlzVmFsdWUgPSB0aGlzLnZhcmlhYmxlIGluc3RhbmNlb2YgVmFsdWUpIHsNCiAgICAgICAgaWYgKHRoaXMudmFyaWFibGUuaXNBcnJheSgpIHx8IHRoaXMudmFyaWFibGUuaXNPYmplY3QoKSkgew0KICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVQYXR0ZXJuTWF0Y2gobyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHRoaXMudmFyaWFibGUuaXNTcGxpY2UoKSkgew0KICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVTcGxpY2Uobyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKChfcmVmMiA9IHRoaXMuY29udGV4dCkgPT09ICd8fD0nIHx8IF9yZWYyID09PSAnJiY9JyB8fCBfcmVmMiA9PT0gJz89Jykgew0KICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVDb25kaXRpb25hbChvKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgbmFtZSA9IHRoaXMudmFyaWFibGUuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsNCiAgICAgIGlmICghKHRoaXMuY29udGV4dCB8fCB0aGlzLnZhcmlhYmxlLmlzQXNzaWduYWJsZSgpKSkgew0KICAgICAgICB0aHJvdyBTeW50YXhFcnJvcigiXCIiICsgKHRoaXMudmFyaWFibGUuY29tcGlsZShvKSkgKyAiXCIgY2Fubm90IGJlIGFzc2lnbmVkLiIpOw0KICAgICAgfQ0KICAgICAgaWYgKCEodGhpcy5jb250ZXh0IHx8IGlzVmFsdWUgJiYgKHRoaXMudmFyaWFibGUubmFtZXNwYWNlZCB8fCB0aGlzLnZhcmlhYmxlLmhhc1Byb3BlcnRpZXMoKSkpKSB7DQogICAgICAgIGlmICh0aGlzLnBhcmFtKSB7DQogICAgICAgICAgby5zY29wZS5hZGQobmFtZSwgJ3ZhcicpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIG8uc2NvcGUuZmluZChuYW1lKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBDb2RlICYmIChtYXRjaCA9IE1FVEhPRF9ERUYuZXhlYyhuYW1lKSkpIHsNCiAgICAgICAgdGhpcy52YWx1ZS5uYW1lID0gbWF0Y2hbMl07DQogICAgICAgIGlmIChtYXRjaFsxXSkgew0KICAgICAgICAgIHRoaXMudmFsdWUua2xhc3MgPSBtYXRjaFsxXTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgdmFsID0gdGhpcy52YWx1ZS5jb21waWxlKG8sIExFVkVMX0xJU1QpOw0KICAgICAgaWYgKHRoaXMuY29udGV4dCA9PT0gJ29iamVjdCcpIHsNCiAgICAgICAgcmV0dXJuICIiICsgbmFtZSArICI6ICIgKyB2YWw7DQogICAgICB9DQogICAgICB2YWwgPSBuYW1lICsgKCIgIiArICh0aGlzLmNvbnRleHQgfHwgJz0nKSArICIgIikgKyB2YWw7DQogICAgICBpZiAoby5sZXZlbCA8PSBMRVZFTF9MSVNUKSB7DQogICAgICAgIHJldHVybiB2YWw7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gIigiICsgdmFsICsgIikiOw0KICAgICAgfQ0KICAgIH07DQogICAgQXNzaWduLnByb3RvdHlwZS5jb21waWxlUGF0dGVybk1hdGNoID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIGFjYywgYXNzaWducywgY29kZSwgaSwgaWR4LCBpc09iamVjdCwgaXZhciwgb2JqLCBvYmplY3RzLCBvbGVuLCByZWYsIHJlc3QsIHNwbGF0LCB0b3AsIHZhbCwgdmFsdWUsIHZ2YXIsIF9sZW4sIF9yZWYyLCBfcmVmMywgX3JlZjQsIF9yZWY1Ow0KICAgICAgdG9wID0gby5sZXZlbCA9PT0gTEVWRUxfVE9QOw0KICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlOw0KICAgICAgb2JqZWN0cyA9IHRoaXMudmFyaWFibGUuYmFzZS5vYmplY3RzOw0KICAgICAgaWYgKCEob2xlbiA9IG9iamVjdHMubGVuZ3RoKSkgew0KICAgICAgICBjb2RlID0gdmFsdWUuY29tcGlsZShvKTsNCiAgICAgICAgaWYgKG8ubGV2ZWwgPj0gTEVWRUxfT1ApIHsNCiAgICAgICAgICByZXR1cm4gIigiICsgY29kZSArICIpIjsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICByZXR1cm4gY29kZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaXNPYmplY3QgPSB0aGlzLnZhcmlhYmxlLmlzT2JqZWN0KCk7DQogICAgICBpZiAodG9wICYmIG9sZW4gPT09IDEgJiYgISgob2JqID0gb2JqZWN0c1swXSkgaW5zdGFuY2VvZiBTcGxhdCkpIHsNCiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEFzc2lnbikgew0KICAgICAgICAgIF9yZWYyID0gb2JqLCBpZHggPSBfcmVmMi52YXJpYWJsZS5iYXNlLCBvYmogPSBfcmVmMi52YWx1ZTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBpZiAob2JqLmJhc2UgaW5zdGFuY2VvZiBQYXJlbnMpIHsNCiAgICAgICAgICAgIF9yZWYzID0gbmV3IFZhbHVlKG9iai51bndyYXBBbGwoKSkuY2FjaGVSZWZlcmVuY2UobyksIG9iaiA9IF9yZWYzWzBdLCBpZHggPSBfcmVmM1sxXTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaWR4ID0gaXNPYmplY3QgPyBvYmpbInRoaXMiXSA/IG9iai5wcm9wZXJ0aWVzWzBdLm5hbWUgOiBvYmogOiBuZXcgTGl0ZXJhbCgwKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgYWNjID0gSURFTlRJRklFUi50ZXN0KGlkeC51bndyYXAoKS52YWx1ZSB8fCAwKTsNCiAgICAgICAgdmFsdWUgPSBuZXcgVmFsdWUodmFsdWUpOw0KICAgICAgICB2YWx1ZS5wcm9wZXJ0aWVzLnB1c2gobmV3IChhY2MgPyBBY2Nlc3MgOiBJbmRleCkoaWR4KSk7DQogICAgICAgIHJldHVybiBuZXcgQXNzaWduKG9iaiwgdmFsdWUsIG51bGwsIHsNCiAgICAgICAgICBwYXJhbTogdGhpcy5wYXJhbQ0KICAgICAgICB9KS5jb21waWxlKG8sIExFVkVMX1RPUCk7DQogICAgICB9DQogICAgICB2dmFyID0gdmFsdWUuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsNCiAgICAgIGFzc2lnbnMgPSBbXTsNCiAgICAgIHNwbGF0ID0gZmFsc2U7DQogICAgICBpZiAoIUlERU5USUZJRVIudGVzdCh2dmFyKSB8fCB0aGlzLnZhcmlhYmxlLmFzc2lnbnModnZhcikpIHsNCiAgICAgICAgYXNzaWducy5wdXNoKCIiICsgKHJlZiA9IG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdyZWYnKSkgKyAiID0gIiArIHZ2YXIpOw0KICAgICAgICB2dmFyID0gcmVmOw0KICAgICAgfQ0KICAgICAgZm9yIChpID0gMCwgX2xlbiA9IG9iamVjdHMubGVuZ3RoOyBpIDwgX2xlbjsgaSsrKSB7DQogICAgICAgIG9iaiA9IG9iamVjdHNbaV07DQogICAgICAgIGlkeCA9IGk7DQogICAgICAgIGlmIChpc09iamVjdCkgew0KICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBBc3NpZ24pIHsNCiAgICAgICAgICAgIF9yZWY0ID0gb2JqLCBpZHggPSBfcmVmNC52YXJpYWJsZS5iYXNlLCBvYmogPSBfcmVmNC52YWx1ZTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaWYgKG9iai5iYXNlIGluc3RhbmNlb2YgUGFyZW5zKSB7DQogICAgICAgICAgICAgIF9yZWY1ID0gbmV3IFZhbHVlKG9iai51bndyYXBBbGwoKSkuY2FjaGVSZWZlcmVuY2UobyksIG9iaiA9IF9yZWY1WzBdLCBpZHggPSBfcmVmNVsxXTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGlkeCA9IG9ialsidGhpcyJdID8gb2JqLnByb3BlcnRpZXNbMF0ubmFtZSA6IG9iajsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFzcGxhdCAmJiBvYmogaW5zdGFuY2VvZiBTcGxhdCkgew0KICAgICAgICAgIHZhbCA9ICIiICsgb2xlbiArICIgPD0gIiArIHZ2YXIgKyAiLmxlbmd0aCA/ICIgKyAodXRpbGl0eSgnc2xpY2UnKSkgKyAiLmNhbGwoIiArIHZ2YXIgKyAiLCAiICsgaTsNCiAgICAgICAgICBpZiAocmVzdCA9IG9sZW4gLSBpIC0gMSkgew0KICAgICAgICAgICAgaXZhciA9IG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdpJyk7DQogICAgICAgICAgICB2YWwgKz0gIiwgIiArIGl2YXIgKyAiID0gIiArIHZ2YXIgKyAiLmxlbmd0aCAtICIgKyByZXN0ICsgIikgOiAoIiArIGl2YXIgKyAiID0gIiArIGkgKyAiLCBbXSkiOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB2YWwgKz0gIikgOiBbXSI7DQogICAgICAgICAgfQ0KICAgICAgICAgIHZhbCA9IG5ldyBMaXRlcmFsKHZhbCk7DQogICAgICAgICAgc3BsYXQgPSAiIiArIGl2YXIgKyAiKysiOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTcGxhdCkgew0KICAgICAgICAgICAgb2JqID0gb2JqLm5hbWUuY29tcGlsZShvKTsNCiAgICAgICAgICAgIHRocm93IFN5bnRheEVycm9yKCJtdWx0aXBsZSBzcGxhdHMgYXJlIGRpc2FsbG93ZWQgaW4gYW4gYXNzaWdubWVudDogIiArIG9iaiArICIgLi4uIik7DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmICh0eXBlb2YgaWR4ID09PSAnbnVtYmVyJykgew0KICAgICAgICAgICAgaWR4ID0gbmV3IExpdGVyYWwoc3BsYXQgfHwgaWR4KTsNCiAgICAgICAgICAgIGFjYyA9IGZhbHNlOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBhY2MgPSBpc09iamVjdCAmJiBJREVOVElGSUVSLnRlc3QoaWR4LnVud3JhcCgpLnZhbHVlIHx8IDApOw0KICAgICAgICAgIH0NCiAgICAgICAgICB2YWwgPSBuZXcgVmFsdWUobmV3IExpdGVyYWwodnZhciksIFtuZXcgKGFjYyA/IEFjY2VzcyA6IEluZGV4KShpZHgpXSk7DQogICAgICAgIH0NCiAgICAgICAgYXNzaWducy5wdXNoKG5ldyBBc3NpZ24ob2JqLCB2YWwsIG51bGwsIHsNCiAgICAgICAgICBwYXJhbTogdGhpcy5wYXJhbQ0KICAgICAgICB9KS5jb21waWxlKG8sIExFVkVMX1RPUCkpOw0KICAgICAgfQ0KICAgICAgaWYgKCF0b3ApIHsNCiAgICAgICAgYXNzaWducy5wdXNoKHZ2YXIpOw0KICAgICAgfQ0KICAgICAgY29kZSA9IGFzc2lnbnMuam9pbignLCAnKTsNCiAgICAgIGlmIChvLmxldmVsIDwgTEVWRUxfTElTVCkgew0KICAgICAgICByZXR1cm4gY29kZTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiAiKCIgKyBjb2RlICsgIikiOw0KICAgICAgfQ0KICAgIH07DQogICAgQXNzaWduLnByb3RvdHlwZS5jb21waWxlQ29uZGl0aW9uYWwgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgbGVmdCwgcml0ZSwgX3JlZjI7DQogICAgICBfcmVmMiA9IHRoaXMudmFyaWFibGUuY2FjaGVSZWZlcmVuY2UobyksIGxlZnQgPSBfcmVmMlswXSwgcml0ZSA9IF9yZWYyWzFdOw0KICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKHRoaXMuY29udGV4dCwgIj8iKSA+PSAwKSB7DQogICAgICAgIG8uaXNFeGlzdGVudGlhbEVxdWFscyA9IHRydWU7DQogICAgICB9DQogICAgICByZXR1cm4gbmV3IE9wKHRoaXMuY29udGV4dC5zbGljZSgwLCAtMSksIGxlZnQsIG5ldyBBc3NpZ24ocml0ZSwgdGhpcy52YWx1ZSwgJz0nKSkuY29tcGlsZShvKTsNCiAgICB9Ow0KICAgIEFzc2lnbi5wcm90b3R5cGUuY29tcGlsZVNwbGljZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjb2RlLCBleGNsdXNpdmUsIGZyb20sIGZyb21EZWNsLCBmcm9tUmVmLCBuYW1lLCB0bywgdmFsRGVmLCB2YWxSZWYsIF9yZWYyLCBfcmVmMywgX3JlZjQ7DQogICAgICBfcmVmMiA9IHRoaXMudmFyaWFibGUucHJvcGVydGllcy5wb3AoKS5yYW5nZSwgZnJvbSA9IF9yZWYyLmZyb20sIHRvID0gX3JlZjIudG8sIGV4Y2x1c2l2ZSA9IF9yZWYyLmV4Y2x1c2l2ZTsNCiAgICAgIG5hbWUgPSB0aGlzLnZhcmlhYmxlLmNvbXBpbGUobyk7DQogICAgICBfcmVmMyA9IChmcm9tICE9IG51bGwgPyBmcm9tLmNhY2hlKG8sIExFVkVMX09QKSA6IHZvaWQgMCkgfHwgWycwJywgJzAnXSwgZnJvbURlY2wgPSBfcmVmM1swXSwgZnJvbVJlZiA9IF9yZWYzWzFdOw0KICAgICAgaWYgKHRvKSB7DQogICAgICAgIGlmICgoZnJvbSAhPSBudWxsID8gZnJvbS5pc1NpbXBsZU51bWJlcigpIDogdm9pZCAwKSAmJiB0by5pc1NpbXBsZU51bWJlcigpKSB7DQogICAgICAgICAgdG8gPSArdG8uY29tcGlsZShvKSAtICtmcm9tUmVmOw0KICAgICAgICAgIGlmICghZXhjbHVzaXZlKSB7DQogICAgICAgICAgICB0byArPSAxOw0KICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0byA9IHRvLmNvbXBpbGUobykgKyAnIC0gJyArIGZyb21SZWY7DQogICAgICAgICAgaWYgKCFleGNsdXNpdmUpIHsNCiAgICAgICAgICAgIHRvICs9ICcgKyAxJzsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRvID0gIjllOSI7DQogICAgICB9DQogICAgICBfcmVmNCA9IHRoaXMudmFsdWUuY2FjaGUobywgTEVWRUxfTElTVCksIHZhbERlZiA9IF9yZWY0WzBdLCB2YWxSZWYgPSBfcmVmNFsxXTsNCiAgICAgIGNvZGUgPSAiW10uc3BsaWNlLmFwcGx5KCIgKyBuYW1lICsgIiwgWyIgKyBmcm9tRGVjbCArICIsICIgKyB0byArICJdLmNvbmNhdCgiICsgdmFsRGVmICsgIikpLCAiICsgdmFsUmVmOw0KICAgICAgaWYgKG8ubGV2ZWwgPiBMRVZFTF9UT1ApIHsNCiAgICAgICAgcmV0dXJuICIoIiArIGNvZGUgKyAiKSI7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gY29kZTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIHJldHVybiBBc3NpZ247DQogIH0pKCk7DQogIGV4cG9ydHMuQ29kZSA9IENvZGUgPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKENvZGUsIEJhc2UpOw0KICAgIGZ1bmN0aW9uIENvZGUocGFyYW1zLCBib2R5LCB0YWcpIHsNCiAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zIHx8IFtdOw0KICAgICAgdGhpcy5ib2R5ID0gYm9keSB8fCBuZXcgQmxvY2s7DQogICAgICB0aGlzLmJvdW5kID0gdGFnID09PSAnYm91bmRmdW5jJzsNCiAgICAgIGlmICh0aGlzLmJvdW5kKSB7DQogICAgICAgIHRoaXMuY29udGV4dCA9ICd0aGlzJzsNCiAgICAgIH0NCiAgICB9DQogICAgQ29kZS5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ3BhcmFtcycsICdib2R5J107DQogICAgQ29kZS5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiAhIXRoaXMuY3RvcjsNCiAgICB9Ow0KICAgIENvZGUucHJvdG90eXBlLmp1bXBzID0gTk87DQogICAgQ29kZS5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgY29kZSwgZXhwcnMsIGksIGlkdCwgbGl0LCBwLCBwYXJhbSwgcmVmLCBzcGxhdHMsIHYsIHZhbCwgdmFycywgd2FzRW1wdHksIF9pLCBfaiwgX2ssIF9sZW4sIF9sZW4yLCBfbGVuMywgX2xlbjQsIF9yZWYyLCBfcmVmMywgX3JlZjQsIF9yZWY1Ow0KICAgICAgby5zY29wZSA9IG5ldyBTY29wZShvLnNjb3BlLCB0aGlzLmJvZHksIHRoaXMpOw0KICAgICAgby5zY29wZS5zaGFyZWQgPSBkZWwobywgJ3NoYXJlZFNjb3BlJyk7DQogICAgICBvLmluZGVudCArPSBUQUI7DQogICAgICBkZWxldGUgby5iYXJlOw0KICAgICAgdmFycyA9IFtdOw0KICAgICAgZXhwcnMgPSBbXTsNCiAgICAgIF9yZWYyID0gdGhpcy5wYXJhbXM7DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIHBhcmFtID0gX3JlZjJbX2ldOw0KICAgICAgICBpZiAocGFyYW0uc3BsYXQpIHsNCiAgICAgICAgICBfcmVmMyA9IHRoaXMucGFyYW1zOw0KICAgICAgICAgIGZvciAoX2ogPSAwLCBfbGVuMiA9IF9yZWYzLmxlbmd0aDsgX2ogPCBfbGVuMjsgX2orKykgew0KICAgICAgICAgICAgcCA9IF9yZWYzW19qXTsNCiAgICAgICAgICAgIGlmIChwLm5hbWUudmFsdWUpIHsNCiAgICAgICAgICAgICAgby5zY29wZS5hZGQocC5uYW1lLnZhbHVlLCAndmFyJywgdHJ1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIHNwbGF0cyA9IG5ldyBBc3NpZ24obmV3IFZhbHVlKG5ldyBBcnIoKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdmFyIF9rLCBfbGVuMywgX3JlZjQsIF9yZXN1bHRzOw0KICAgICAgICAgICAgX3JlZjQgPSB0aGlzLnBhcmFtczsNCiAgICAgICAgICAgIF9yZXN1bHRzID0gW107DQogICAgICAgICAgICBmb3IgKF9rID0gMCwgX2xlbjMgPSBfcmVmNC5sZW5ndGg7IF9rIDwgX2xlbjM7IF9rKyspIHsNCiAgICAgICAgICAgICAgcCA9IF9yZWY0W19rXTsNCiAgICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChwLmFzUmVmZXJlbmNlKG8pKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBfcmVzdWx0czsNCiAgICAgICAgICB9KS5jYWxsKHRoaXMpKSksIG5ldyBWYWx1ZShuZXcgTGl0ZXJhbCgnYXJndW1lbnRzJykpKTsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgX3JlZjQgPSB0aGlzLnBhcmFtczsNCiAgICAgIGZvciAoX2sgPSAwLCBfbGVuMyA9IF9yZWY0Lmxlbmd0aDsgX2sgPCBfbGVuMzsgX2srKykgew0KICAgICAgICBwYXJhbSA9IF9yZWY0W19rXTsNCiAgICAgICAgaWYgKHBhcmFtLmlzQ29tcGxleCgpKSB7DQogICAgICAgICAgdmFsID0gcmVmID0gcGFyYW0uYXNSZWZlcmVuY2Uobyk7DQogICAgICAgICAgaWYgKHBhcmFtLnZhbHVlKSB7DQogICAgICAgICAgICB2YWwgPSBuZXcgT3AoJz8nLCByZWYsIHBhcmFtLnZhbHVlKTsNCiAgICAgICAgICB9DQogICAgICAgICAgZXhwcnMucHVzaChuZXcgQXNzaWduKG5ldyBWYWx1ZShwYXJhbS5uYW1lKSwgdmFsLCAnPScsIHsNCiAgICAgICAgICAgIHBhcmFtOiB0cnVlDQogICAgICAgICAgfSkpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHJlZiA9IHBhcmFtOw0KICAgICAgICAgIGlmIChwYXJhbS52YWx1ZSkgew0KICAgICAgICAgICAgbGl0ID0gbmV3IExpdGVyYWwocmVmLm5hbWUudmFsdWUgKyAnID09IG51bGwnKTsNCiAgICAgICAgICAgIHZhbCA9IG5ldyBBc3NpZ24obmV3IFZhbHVlKHBhcmFtLm5hbWUpLCBwYXJhbS52YWx1ZSwgJz0nKTsNCiAgICAgICAgICAgIGV4cHJzLnB1c2gobmV3IElmKGxpdCwgdmFsKSk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICghc3BsYXRzKSB7DQogICAgICAgICAgdmFycy5wdXNoKHJlZik7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHdhc0VtcHR5ID0gdGhpcy5ib2R5LmlzRW1wdHkoKTsNCiAgICAgIGlmIChzcGxhdHMpIHsNCiAgICAgICAgZXhwcnMudW5zaGlmdChzcGxhdHMpOw0KICAgICAgfQ0KICAgICAgaWYgKGV4cHJzLmxlbmd0aCkgew0KICAgICAgICAoX3JlZjUgPSB0aGlzLmJvZHkuZXhwcmVzc2lvbnMpLnVuc2hpZnQuYXBwbHkoX3JlZjUsIGV4cHJzKTsNCiAgICAgIH0NCiAgICAgIGlmICghc3BsYXRzKSB7DQogICAgICAgIGZvciAoaSA9IDAsIF9sZW40ID0gdmFycy5sZW5ndGg7IGkgPCBfbGVuNDsgaSsrKSB7DQogICAgICAgICAgdiA9IHZhcnNbaV07DQogICAgICAgICAgby5zY29wZS5wYXJhbWV0ZXIodmFyc1tpXSA9IHYuY29tcGlsZShvKSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGlmICghKHdhc0VtcHR5IHx8IHRoaXMubm9SZXR1cm4pKSB7DQogICAgICAgIHRoaXMuYm9keS5tYWtlUmV0dXJuKCk7DQogICAgICB9DQogICAgICBpZHQgPSBvLmluZGVudDsNCiAgICAgIGNvZGUgPSAnZnVuY3Rpb24nOw0KICAgICAgaWYgKHRoaXMuY3Rvcikgew0KICAgICAgICBjb2RlICs9ICcgJyArIHRoaXMubmFtZTsNCiAgICAgIH0NCiAgICAgIGNvZGUgKz0gJygnICsgdmFycy5qb2luKCcsICcpICsgJykgeyc7DQogICAgICBpZiAoIXRoaXMuYm9keS5pc0VtcHR5KCkpIHsNCiAgICAgICAgY29kZSArPSAiXG4iICsgKHRoaXMuYm9keS5jb21waWxlV2l0aERlY2xhcmF0aW9ucyhvKSkgKyAiXG4iICsgdGhpcy50YWI7DQogICAgICB9DQogICAgICBjb2RlICs9ICd9JzsNCiAgICAgIGlmICh0aGlzLmN0b3IpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMudGFiICsgY29kZTsNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLmJvdW5kKSB7DQogICAgICAgIHJldHVybiB1dGlsaXR5KCdiaW5kJykgKyAoIigiICsgY29kZSArICIsICIgKyB0aGlzLmNvbnRleHQgKyAiKSIpOw0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMuZnJvbnQgfHwgKG8ubGV2ZWwgPj0gTEVWRUxfQUNDRVNTKSkgew0KICAgICAgICByZXR1cm4gIigiICsgY29kZSArICIpIjsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiBjb2RlOw0KICAgICAgfQ0KICAgIH07DQogICAgQ29kZS5wcm90b3R5cGUudHJhdmVyc2VDaGlsZHJlbiA9IGZ1bmN0aW9uKGNyb3NzU2NvcGUsIGZ1bmMpIHsNCiAgICAgIGlmIChjcm9zc1Njb3BlKSB7DQogICAgICAgIHJldHVybiBDb2RlLl9fc3VwZXJfXy50cmF2ZXJzZUNoaWxkcmVuLmNhbGwodGhpcywgY3Jvc3NTY29wZSwgZnVuYyk7DQogICAgICB9DQogICAgfTsNCiAgICByZXR1cm4gQ29kZTsNCiAgfSkoKTsNCiAgZXhwb3J0cy5QYXJhbSA9IFBhcmFtID0gKGZ1bmN0aW9uKCkgew0KICAgIF9fZXh0ZW5kcyhQYXJhbSwgQmFzZSk7DQogICAgZnVuY3Rpb24gUGFyYW0obmFtZSwgdmFsdWUsIHNwbGF0KSB7DQogICAgICB0aGlzLm5hbWUgPSBuYW1lOw0KICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KICAgICAgdGhpcy5zcGxhdCA9IHNwbGF0Ow0KICAgIH0NCiAgICBQYXJhbS5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ25hbWUnLCAndmFsdWUnXTsNCiAgICBQYXJhbS5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHJldHVybiB0aGlzLm5hbWUuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsNCiAgICB9Ow0KICAgIFBhcmFtLnByb3RvdHlwZS5hc1JlZmVyZW5jZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBub2RlOw0KICAgICAgaWYgKHRoaXMucmVmZXJlbmNlKSB7DQogICAgICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZTsNCiAgICAgIH0NCiAgICAgIG5vZGUgPSB0aGlzLm5hbWU7DQogICAgICBpZiAobm9kZVsidGhpcyJdKSB7DQogICAgICAgIG5vZGUgPSBub2RlLnByb3BlcnRpZXNbMF0ubmFtZTsNCiAgICAgICAgaWYgKG5vZGUudmFsdWUucmVzZXJ2ZWQpIHsNCiAgICAgICAgICBub2RlID0gbmV3IExpdGVyYWwoJ18nICsgbm9kZS52YWx1ZSk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSBpZiAobm9kZS5pc0NvbXBsZXgoKSkgew0KICAgICAgICBub2RlID0gbmV3IExpdGVyYWwoby5zY29wZS5mcmVlVmFyaWFibGUoJ2FyZycpKTsNCiAgICAgIH0NCiAgICAgIG5vZGUgPSBuZXcgVmFsdWUobm9kZSk7DQogICAgICBpZiAodGhpcy5zcGxhdCkgew0KICAgICAgICBub2RlID0gbmV3IFNwbGF0KG5vZGUpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlID0gbm9kZTsNCiAgICB9Ow0KICAgIFBhcmFtLnByb3RvdHlwZS5pc0NvbXBsZXggPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiB0aGlzLm5hbWUuaXNDb21wbGV4KCk7DQogICAgfTsNCiAgICByZXR1cm4gUGFyYW07DQogIH0pKCk7DQogIGV4cG9ydHMuU3BsYXQgPSBTcGxhdCA9IChmdW5jdGlvbigpIHsNCiAgICBfX2V4dGVuZHMoU3BsYXQsIEJhc2UpOw0KICAgIFNwbGF0LnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnbmFtZSddOw0KICAgIFNwbGF0LnByb3RvdHlwZS5pc0Fzc2lnbmFibGUgPSBZRVM7DQogICAgZnVuY3Rpb24gU3BsYXQobmFtZSkgew0KICAgICAgdGhpcy5uYW1lID0gbmFtZS5jb21waWxlID8gbmFtZSA6IG5ldyBMaXRlcmFsKG5hbWUpOw0KICAgIH0NCiAgICBTcGxhdC5wcm90b3R5cGUuYXNzaWducyA9IGZ1bmN0aW9uKG5hbWUpIHsNCiAgICAgIHJldHVybiB0aGlzLm5hbWUuYXNzaWducyhuYW1lKTsNCiAgICB9Ow0KICAgIFNwbGF0LnByb3RvdHlwZS5jb21waWxlID0gZnVuY3Rpb24obykgew0KICAgICAgaWYgKHRoaXMuaW5kZXggIT0gbnVsbCkgew0KICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlUGFyYW0obyk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gdGhpcy5uYW1lLmNvbXBpbGUobyk7DQogICAgICB9DQogICAgfTsNCiAgICBTcGxhdC5jb21waWxlU3BsYXR0ZWRBcnJheSA9IGZ1bmN0aW9uKG8sIGxpc3QsIGFwcGx5KSB7DQogICAgICB2YXIgYXJncywgYmFzZSwgY29kZSwgaSwgaW5kZXgsIG5vZGUsIF9sZW47DQogICAgICBpbmRleCA9IC0xOw0KICAgICAgd2hpbGUgKChub2RlID0gbGlzdFsrK2luZGV4XSkgJiYgIShub2RlIGluc3RhbmNlb2YgU3BsYXQpKSB7DQogICAgICAgIGNvbnRpbnVlOw0KICAgICAgfQ0KICAgICAgaWYgKGluZGV4ID49IGxpc3QubGVuZ3RoKSB7DQogICAgICAgIHJldHVybiAnJzsNCiAgICAgIH0NCiAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkgew0KICAgICAgICBjb2RlID0gbGlzdFswXS5jb21waWxlKG8sIExFVkVMX0xJU1QpOw0KICAgICAgICBpZiAoYXBwbHkpIHsNCiAgICAgICAgICByZXR1cm4gY29kZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gIiIgKyAodXRpbGl0eSgnc2xpY2UnKSkgKyAiLmNhbGwoIiArIGNvZGUgKyAiKSI7DQogICAgICB9DQogICAgICBhcmdzID0gbGlzdC5zbGljZShpbmRleCk7DQogICAgICBmb3IgKGkgPSAwLCBfbGVuID0gYXJncy5sZW5ndGg7IGkgPCBfbGVuOyBpKyspIHsNCiAgICAgICAgbm9kZSA9IGFyZ3NbaV07DQogICAgICAgIGNvZGUgPSBub2RlLmNvbXBpbGUobywgTEVWRUxfTElTVCk7DQogICAgICAgIGFyZ3NbaV0gPSBub2RlIGluc3RhbmNlb2YgU3BsYXQgPyAiIiArICh1dGlsaXR5KCdzbGljZScpKSArICIuY2FsbCgiICsgY29kZSArICIpIiA6ICJbIiArIGNvZGUgKyAiXSI7DQogICAgICB9DQogICAgICBpZiAoaW5kZXggPT09IDApIHsNCiAgICAgICAgcmV0dXJuIGFyZ3NbMF0gKyAoIi5jb25jYXQoIiArIChhcmdzLnNsaWNlKDEpLmpvaW4oJywgJykpICsgIikiKTsNCiAgICAgIH0NCiAgICAgIGJhc2UgPSAoZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBfaSwgX2xlbjIsIF9yZWYyLCBfcmVzdWx0czsNCiAgICAgICAgX3JlZjIgPSBsaXN0LnNsaWNlKDAsIGluZGV4KTsNCiAgICAgICAgX3Jlc3VsdHMgPSBbXTsNCiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4yID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW4yOyBfaSsrKSB7DQogICAgICAgICAgbm9kZSA9IF9yZWYyW19pXTsNCiAgICAgICAgICBfcmVzdWx0cy5wdXNoKG5vZGUuY29tcGlsZShvLCBMRVZFTF9MSVNUKSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIF9yZXN1bHRzOw0KICAgICAgfSkoKTsNCiAgICAgIHJldHVybiAiWyIgKyAoYmFzZS5qb2luKCcsICcpKSArICJdLmNvbmNhdCgiICsgKGFyZ3Muam9pbignLCAnKSkgKyAiKSI7DQogICAgfTsNCiAgICByZXR1cm4gU3BsYXQ7DQogIH0pKCk7DQogIGV4cG9ydHMuV2hpbGUgPSBXaGlsZSA9IChmdW5jdGlvbigpIHsNCiAgICBfX2V4dGVuZHMoV2hpbGUsIEJhc2UpOw0KICAgIGZ1bmN0aW9uIFdoaWxlKGNvbmRpdGlvbiwgb3B0aW9ucykgew0KICAgICAgdGhpcy5jb25kaXRpb24gPSAob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy5pbnZlcnQgOiB2b2lkIDApID8gY29uZGl0aW9uLmludmVydCgpIDogY29uZGl0aW9uOw0KICAgICAgdGhpcy5ndWFyZCA9IG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuZ3VhcmQgOiB2b2lkIDA7DQogICAgfQ0KICAgIFdoaWxlLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnY29uZGl0aW9uJywgJ2d1YXJkJywgJ2JvZHknXTsNCiAgICBXaGlsZS5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBZRVM7DQogICAgV2hpbGUucHJvdG90eXBlLm1ha2VSZXR1cm4gPSBmdW5jdGlvbigpIHsNCiAgICAgIHRoaXMucmV0dXJucyA9IHRydWU7DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIFdoaWxlLnByb3RvdHlwZS5hZGRCb2R5ID0gZnVuY3Rpb24oYm9keSkgew0KICAgICAgdGhpcy5ib2R5ID0gYm9keTsNCiAgICAgIHJldHVybiB0aGlzOw0KICAgIH07DQogICAgV2hpbGUucHJvdG90eXBlLmp1bXBzID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgZXhwcmVzc2lvbnMsIG5vZGUsIF9pLCBfbGVuOw0KICAgICAgZXhwcmVzc2lvbnMgPSB0aGlzLmJvZHkuZXhwcmVzc2lvbnM7DQogICAgICBpZiAoIWV4cHJlc3Npb25zLmxlbmd0aCkgew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICB9DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGV4cHJlc3Npb25zLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIG5vZGUgPSBleHByZXNzaW9uc1tfaV07DQogICAgICAgIGlmIChub2RlLmp1bXBzKHsNCiAgICAgICAgICBsb29wOiB0cnVlDQogICAgICAgIH0pKSB7DQogICAgICAgICAgcmV0dXJuIG5vZGU7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9Ow0KICAgIFdoaWxlLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBib2R5LCBjb2RlLCBydmFyLCBzZXQ7DQogICAgICBvLmluZGVudCArPSBUQUI7DQogICAgICBzZXQgPSAnJzsNCiAgICAgIGJvZHkgPSB0aGlzLmJvZHk7DQogICAgICBpZiAoYm9keS5pc0VtcHR5KCkpIHsNCiAgICAgICAgYm9keSA9ICcnOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgaWYgKG8ubGV2ZWwgPiBMRVZFTF9UT1AgfHwgdGhpcy5yZXR1cm5zKSB7DQogICAgICAgICAgcnZhciA9IG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdyZXN1bHRzJyk7DQogICAgICAgICAgc2V0ID0gIiIgKyB0aGlzLnRhYiArIHJ2YXIgKyAiID0gW107XG4iOw0KICAgICAgICAgIGlmIChib2R5KSB7DQogICAgICAgICAgICBib2R5ID0gUHVzaC53cmFwKHJ2YXIsIGJvZHkpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAodGhpcy5ndWFyZCkgew0KICAgICAgICAgIGJvZHkgPSBCbG9jay53cmFwKFtuZXcgSWYodGhpcy5ndWFyZCwgYm9keSldKTsNCiAgICAgICAgfQ0KICAgICAgICBib2R5ID0gIlxuIiArIChib2R5LmNvbXBpbGUobywgTEVWRUxfVE9QKSkgKyAiXG4iICsgdGhpcy50YWI7DQogICAgICB9DQogICAgICBjb2RlID0gc2V0ICsgdGhpcy50YWIgKyAoIndoaWxlICgiICsgKHRoaXMuY29uZGl0aW9uLmNvbXBpbGUobywgTEVWRUxfUEFSRU4pKSArICIpIHsiICsgYm9keSArICJ9Iik7DQogICAgICBpZiAodGhpcy5yZXR1cm5zKSB7DQogICAgICAgIGNvZGUgKz0gIlxuIiArIHRoaXMudGFiICsgInJldHVybiAiICsgcnZhciArICI7IjsNCiAgICAgIH0NCiAgICAgIHJldHVybiBjb2RlOw0KICAgIH07DQogICAgcmV0dXJuIFdoaWxlOw0KICB9KSgpOw0KICBleHBvcnRzLk9wID0gT3AgPSAoZnVuY3Rpb24oKSB7DQogICAgdmFyIENPTlZFUlNJT05TLCBJTlZFUlNJT05TOw0KICAgIF9fZXh0ZW5kcyhPcCwgQmFzZSk7DQogICAgZnVuY3Rpb24gT3Aob3AsIGZpcnN0LCBzZWNvbmQsIGZsaXApIHsNCiAgICAgIHZhciBjYWxsOw0KICAgICAgaWYgKG9wID09PSAnaW4nKSB7DQogICAgICAgIHJldHVybiBuZXcgSW4oZmlyc3QsIHNlY29uZCk7DQogICAgICB9DQogICAgICBpZiAob3AgPT09ICdkbycpIHsNCiAgICAgICAgY2FsbCA9IG5ldyBDYWxsKGZpcnN0LCBmaXJzdC5wYXJhbXMgfHwgW10pOw0KICAgICAgICBjYWxsWyJkbyJdID0gdHJ1ZTsNCiAgICAgICAgcmV0dXJuIGNhbGw7DQogICAgICB9DQogICAgICBpZiAob3AgPT09ICduZXcnKSB7DQogICAgICAgIGlmIChmaXJzdCBpbnN0YW5jZW9mIENhbGwgJiYgIWZpcnN0WyJkbyJdKSB7DQogICAgICAgICAgcmV0dXJuIGZpcnN0Lm5ld0luc3RhbmNlKCk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2YgQ29kZSAmJiBmaXJzdC5ib3VuZCB8fCBmaXJzdFsiZG8iXSkgew0KICAgICAgICAgIGZpcnN0ID0gbmV3IFBhcmVucyhmaXJzdCk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHRoaXMub3BlcmF0b3IgPSBDT05WRVJTSU9OU1tvcF0gfHwgb3A7DQogICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7DQogICAgICB0aGlzLnNlY29uZCA9IHNlY29uZDsNCiAgICAgIHRoaXMuZmxpcCA9ICEhZmxpcDsNCiAgICAgIHJldHVybiB0aGlzOw0KICAgIH0NCiAgICBDT05WRVJTSU9OUyA9IHsNCiAgICAgICc9PSc6ICc9PT0nLA0KICAgICAgJyE9JzogJyE9PScsDQogICAgICAnb2YnOiAnaW4nDQogICAgfTsNCiAgICBJTlZFUlNJT05TID0gew0KICAgICAgJyE9PSc6ICc9PT0nLA0KICAgICAgJz09PSc6ICchPT0nDQogICAgfTsNCiAgICBPcC5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ2ZpcnN0JywgJ3NlY29uZCddOw0KICAgIE9wLnByb3RvdHlwZS5pc1NpbXBsZU51bWJlciA9IE5POw0KICAgIE9wLnByb3RvdHlwZS5pc1VuYXJ5ID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gIXRoaXMuc2Vjb25kOw0KICAgIH07DQogICAgT3AucHJvdG90eXBlLmlzQ29tcGxleCA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIF9yZWYyOw0KICAgICAgcmV0dXJuICEodGhpcy5pc1VuYXJ5KCkgJiYgKChfcmVmMiA9IHRoaXMub3BlcmF0b3IpID09PSAnKycgfHwgX3JlZjIgPT09ICctJykpIHx8IHRoaXMuZmlyc3QuaXNDb21wbGV4KCk7DQogICAgfTsNCiAgICBPcC5wcm90b3R5cGUuaXNDaGFpbmFibGUgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBfcmVmMjsNCiAgICAgIHJldHVybiAoX3JlZjIgPSB0aGlzLm9wZXJhdG9yKSA9PT0gJzwnIHx8IF9yZWYyID09PSAnPicgfHwgX3JlZjIgPT09ICc+PScgfHwgX3JlZjIgPT09ICc8PScgfHwgX3JlZjIgPT09ICc9PT0nIHx8IF9yZWYyID09PSAnIT09JzsNCiAgICB9Ow0KICAgIE9wLnByb3RvdHlwZS5pbnZlcnQgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBhbGxJbnZlcnRhYmxlLCBjdXJyLCBmc3QsIG9wLCBfcmVmMjsNCiAgICAgIGlmICh0aGlzLmlzQ2hhaW5hYmxlKCkgJiYgdGhpcy5maXJzdC5pc0NoYWluYWJsZSgpKSB7DQogICAgICAgIGFsbEludmVydGFibGUgPSB0cnVlOw0KICAgICAgICBjdXJyID0gdGhpczsNCiAgICAgICAgd2hpbGUgKGN1cnIgJiYgY3Vyci5vcGVyYXRvcikgew0KICAgICAgICAgIGFsbEludmVydGFibGUgJiYgKGFsbEludmVydGFibGUgPSBjdXJyLm9wZXJhdG9yIGluIElOVkVSU0lPTlMpOw0KICAgICAgICAgIGN1cnIgPSBjdXJyLmZpcnN0Ow0KICAgICAgICB9DQogICAgICAgIGlmICghYWxsSW52ZXJ0YWJsZSkgew0KICAgICAgICAgIHJldHVybiBuZXcgUGFyZW5zKHRoaXMpLmludmVydCgpOw0KICAgICAgICB9DQogICAgICAgIGN1cnIgPSB0aGlzOw0KICAgICAgICB3aGlsZSAoY3VyciAmJiBjdXJyLm9wZXJhdG9yKSB7DQogICAgICAgICAgY3Vyci5pbnZlcnQgPSAhY3Vyci5pbnZlcnQ7DQogICAgICAgICAgY3Vyci5vcGVyYXRvciA9IElOVkVSU0lPTlNbY3Vyci5vcGVyYXRvcl07DQogICAgICAgICAgY3VyciA9IGN1cnIuZmlyc3Q7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICB9IGVsc2UgaWYgKG9wID0gSU5WRVJTSU9OU1t0aGlzLm9wZXJhdG9yXSkgew0KICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3A7DQogICAgICAgIGlmICh0aGlzLmZpcnN0LnVud3JhcCgpIGluc3RhbmNlb2YgT3ApIHsNCiAgICAgICAgICB0aGlzLmZpcnN0LmludmVydCgpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgfSBlbHNlIGlmICh0aGlzLnNlY29uZCkgew0KICAgICAgICByZXR1cm4gbmV3IFBhcmVucyh0aGlzKS5pbnZlcnQoKTsNCiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcGVyYXRvciA9PT0gJyEnICYmIChmc3QgPSB0aGlzLmZpcnN0LnVud3JhcCgpKSBpbnN0YW5jZW9mIE9wICYmICgoX3JlZjIgPSBmc3Qub3BlcmF0b3IpID09PSAnIScgfHwgX3JlZjIgPT09ICdpbicgfHwgX3JlZjIgPT09ICdpbnN0YW5jZW9mJykpIHsNCiAgICAgICAgcmV0dXJuIGZzdDsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiBuZXcgT3AoJyEnLCB0aGlzKTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIE9wLnByb3RvdHlwZS51bmZvbGRTb2FrID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIF9yZWYyOw0KICAgICAgcmV0dXJuICgoX3JlZjIgPSB0aGlzLm9wZXJhdG9yKSA9PT0gJysrJyB8fCBfcmVmMiA9PT0gJy0tJyB8fCBfcmVmMiA9PT0gJ2RlbGV0ZScpICYmIHVuZm9sZFNvYWsobywgdGhpcywgJ2ZpcnN0Jyk7DQogICAgfTsNCiAgICBPcC5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgY29kZTsNCiAgICAgIGlmICh0aGlzLmlzVW5hcnkoKSkgew0KICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlVW5hcnkobyk7DQogICAgICB9DQogICAgICBpZiAodGhpcy5pc0NoYWluYWJsZSgpICYmIHRoaXMuZmlyc3QuaXNDaGFpbmFibGUoKSkgew0KICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlQ2hhaW4obyk7DQogICAgICB9DQogICAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJz8nKSB7DQogICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVFeGlzdGVuY2Uobyk7DQogICAgICB9DQogICAgICB0aGlzLmZpcnN0LmZyb250ID0gdGhpcy5mcm9udDsNCiAgICAgIGNvZGUgPSB0aGlzLmZpcnN0LmNvbXBpbGUobywgTEVWRUxfT1ApICsgJyAnICsgdGhpcy5vcGVyYXRvciArICcgJyArIHRoaXMuc2Vjb25kLmNvbXBpbGUobywgTEVWRUxfT1ApOw0KICAgICAgaWYgKG8ubGV2ZWwgPD0gTEVWRUxfT1ApIHsNCiAgICAgICAgcmV0dXJuIGNvZGU7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gIigiICsgY29kZSArICIpIjsNCiAgICAgIH0NCiAgICB9Ow0KICAgIE9wLnByb3RvdHlwZS5jb21waWxlQ2hhaW4gPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgY29kZSwgZnN0LCBzaGFyZWQsIF9yZWYyOw0KICAgICAgX3JlZjIgPSB0aGlzLmZpcnN0LnNlY29uZC5jYWNoZShvKSwgdGhpcy5maXJzdC5zZWNvbmQgPSBfcmVmMlswXSwgc2hhcmVkID0gX3JlZjJbMV07DQogICAgICBmc3QgPSB0aGlzLmZpcnN0LmNvbXBpbGUobywgTEVWRUxfT1ApOw0KICAgICAgY29kZSA9ICIiICsgZnN0ICsgIiAiICsgKHRoaXMuaW52ZXJ0ID8gJyYmJyA6ICd8fCcpICsgIiAiICsgKHNoYXJlZC5jb21waWxlKG8pKSArICIgIiArIHRoaXMub3BlcmF0b3IgKyAiICIgKyAodGhpcy5zZWNvbmQuY29tcGlsZShvLCBMRVZFTF9PUCkpOw0KICAgICAgcmV0dXJuICIoIiArIGNvZGUgKyAiKSI7DQogICAgfTsNCiAgICBPcC5wcm90b3R5cGUuY29tcGlsZUV4aXN0ZW5jZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBmc3QsIHJlZjsNCiAgICAgIGlmICh0aGlzLmZpcnN0LmlzQ29tcGxleCgpKSB7DQogICAgICAgIHJlZiA9IG5ldyBMaXRlcmFsKG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdyZWYnKSk7DQogICAgICAgIGZzdCA9IG5ldyBQYXJlbnMobmV3IEFzc2lnbihyZWYsIHRoaXMuZmlyc3QpKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGZzdCA9IHRoaXMuZmlyc3Q7DQogICAgICAgIHJlZiA9IGZzdDsNCiAgICAgIH0NCiAgICAgIHJldHVybiBuZXcgSWYobmV3IEV4aXN0ZW5jZShmc3QpLCByZWYsIHsNCiAgICAgICAgdHlwZTogJ2lmJw0KICAgICAgfSkuYWRkRWxzZSh0aGlzLnNlY29uZCkuY29tcGlsZShvKTsNCiAgICB9Ow0KICAgIE9wLnByb3RvdHlwZS5jb21waWxlVW5hcnkgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgb3AsIHBhcnRzOw0KICAgICAgcGFydHMgPSBbb3AgPSB0aGlzLm9wZXJhdG9yXTsNCiAgICAgIGlmICgob3AgPT09ICduZXcnIHx8IG9wID09PSAndHlwZW9mJyB8fCBvcCA9PT0gJ2RlbGV0ZScpIHx8IChvcCA9PT0gJysnIHx8IG9wID09PSAnLScpICYmIHRoaXMuZmlyc3QgaW5zdGFuY2VvZiBPcCAmJiB0aGlzLmZpcnN0Lm9wZXJhdG9yID09PSBvcCkgew0KICAgICAgICBwYXJ0cy5wdXNoKCcgJyk7DQogICAgICB9DQogICAgICBpZiAob3AgPT09ICduZXcnICYmIHRoaXMuZmlyc3QuaXNTdGF0ZW1lbnQobykpIHsNCiAgICAgICAgdGhpcy5maXJzdCA9IG5ldyBQYXJlbnModGhpcy5maXJzdCk7DQogICAgICB9DQogICAgICBwYXJ0cy5wdXNoKHRoaXMuZmlyc3QuY29tcGlsZShvLCBMRVZFTF9PUCkpOw0KICAgICAgaWYgKHRoaXMuZmxpcCkgew0KICAgICAgICBwYXJ0cy5yZXZlcnNlKCk7DQogICAgICB9DQogICAgICByZXR1cm4gcGFydHMuam9pbignJyk7DQogICAgfTsNCiAgICBPcC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihpZHQpIHsNCiAgICAgIHJldHVybiBPcC5fX3N1cGVyX18udG9TdHJpbmcuY2FsbCh0aGlzLCBpZHQsIHRoaXMuY29uc3RydWN0b3IubmFtZSArICcgJyArIHRoaXMub3BlcmF0b3IpOw0KICAgIH07DQogICAgcmV0dXJuIE9wOw0KICB9KSgpOw0KICBleHBvcnRzLkluID0gSW4gPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKEluLCBCYXNlKTsNCiAgICBmdW5jdGlvbiBJbihvYmplY3QsIGFycmF5KSB7DQogICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsNCiAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTsNCiAgICB9DQogICAgSW4ucHJvdG90eXBlLmNoaWxkcmVuID0gWydvYmplY3QnLCAnYXJyYXknXTsNCiAgICBJbi5wcm90b3R5cGUuaW52ZXJ0ID0gTkVHQVRFOw0KICAgIEluLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBoYXNTcGxhdCwgb2JqLCBfaSwgX2xlbiwgX3JlZjI7DQogICAgICBpZiAodGhpcy5hcnJheSBpbnN0YW5jZW9mIFZhbHVlICYmIHRoaXMuYXJyYXkuaXNBcnJheSgpKSB7DQogICAgICAgIF9yZWYyID0gdGhpcy5hcnJheS5iYXNlLm9iamVjdHM7DQogICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsNCiAgICAgICAgICBvYmogPSBfcmVmMltfaV07DQogICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNwbGF0KSB7DQogICAgICAgICAgICBoYXNTcGxhdCA9IHRydWU7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFoYXNTcGxhdCkgew0KICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVPclRlc3Qobyk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVMb29wVGVzdChvKTsNCiAgICB9Ow0KICAgIEluLnByb3RvdHlwZS5jb21waWxlT3JUZXN0ID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIGNtcCwgY25qLCBpLCBpdGVtLCByZWYsIHN1YiwgdGVzdHMsIF9yZWYyLCBfcmVmMzsNCiAgICAgIF9yZWYyID0gdGhpcy5vYmplY3QuY2FjaGUobywgTEVWRUxfT1ApLCBzdWIgPSBfcmVmMlswXSwgcmVmID0gX3JlZjJbMV07DQogICAgICBfcmVmMyA9IHRoaXMubmVnYXRlZCA/IFsnICE9PSAnLCAnICYmICddIDogWycgPT09ICcsICcgfHwgJ10sIGNtcCA9IF9yZWYzWzBdLCBjbmogPSBfcmVmM1sxXTsNCiAgICAgIHRlc3RzID0gKGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgX2xlbiwgX3JlZjQsIF9yZXN1bHRzOw0KICAgICAgICBfcmVmNCA9IHRoaXMuYXJyYXkuYmFzZS5vYmplY3RzOw0KICAgICAgICBfcmVzdWx0cyA9IFtdOw0KICAgICAgICBmb3IgKGkgPSAwLCBfbGVuID0gX3JlZjQubGVuZ3RoOyBpIDwgX2xlbjsgaSsrKSB7DQogICAgICAgICAgaXRlbSA9IF9yZWY0W2ldOw0KICAgICAgICAgIF9yZXN1bHRzLnB1c2goKGkgPyByZWYgOiBzdWIpICsgY21wICsgaXRlbS5jb21waWxlKG8sIExFVkVMX09QKSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIF9yZXN1bHRzOw0KICAgICAgfSkuY2FsbCh0aGlzKTsNCiAgICAgIGlmICh0ZXN0cy5sZW5ndGggPT09IDApIHsNCiAgICAgICAgcmV0dXJuICdmYWxzZSc7DQogICAgICB9DQogICAgICB0ZXN0cyA9IHRlc3RzLmpvaW4oY25qKTsNCiAgICAgIGlmIChvLmxldmVsIDwgTEVWRUxfT1ApIHsNCiAgICAgICAgcmV0dXJuIHRlc3RzOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuICIoIiArIHRlc3RzICsgIikiOw0KICAgICAgfQ0KICAgIH07DQogICAgSW4ucHJvdG90eXBlLmNvbXBpbGVMb29wVGVzdCA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjb2RlLCByZWYsIHN1YiwgX3JlZjI7DQogICAgICBfcmVmMiA9IHRoaXMub2JqZWN0LmNhY2hlKG8sIExFVkVMX0xJU1QpLCBzdWIgPSBfcmVmMlswXSwgcmVmID0gX3JlZjJbMV07DQogICAgICBjb2RlID0gdXRpbGl0eSgnaW5kZXhPZicpICsgKCIuY2FsbCgiICsgKHRoaXMuYXJyYXkuY29tcGlsZShvLCBMRVZFTF9MSVNUKSkgKyAiLCAiICsgcmVmICsgIikgIikgKyAodGhpcy5uZWdhdGVkID8gJzwgMCcgOiAnPj0gMCcpOw0KICAgICAgaWYgKHN1YiA9PT0gcmVmKSB7DQogICAgICAgIHJldHVybiBjb2RlOw0KICAgICAgfQ0KICAgICAgY29kZSA9IHN1YiArICcsICcgKyBjb2RlOw0KICAgICAgaWYgKG8ubGV2ZWwgPCBMRVZFTF9MSVNUKSB7DQogICAgICAgIHJldHVybiBjb2RlOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuICIoIiArIGNvZGUgKyAiKSI7DQogICAgICB9DQogICAgfTsNCiAgICBJbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihpZHQpIHsNCiAgICAgIHJldHVybiBJbi5fX3N1cGVyX18udG9TdHJpbmcuY2FsbCh0aGlzLCBpZHQsIHRoaXMuY29uc3RydWN0b3IubmFtZSArICh0aGlzLm5lZ2F0ZWQgPyAnIScgOiAnJykpOw0KICAgIH07DQogICAgcmV0dXJuIEluOw0KICB9KSgpOw0KICBleHBvcnRzLlRyeSA9IFRyeSA9IChmdW5jdGlvbigpIHsNCiAgICBfX2V4dGVuZHMoVHJ5LCBCYXNlKTsNCiAgICBmdW5jdGlvbiBUcnkoYXR0ZW1wdCwgZXJyb3IsIHJlY292ZXJ5LCBlbnN1cmUpIHsNCiAgICAgIHRoaXMuYXR0ZW1wdCA9IGF0dGVtcHQ7DQogICAgICB0aGlzLmVycm9yID0gZXJyb3I7DQogICAgICB0aGlzLnJlY292ZXJ5ID0gcmVjb3Zlcnk7DQogICAgICB0aGlzLmVuc3VyZSA9IGVuc3VyZTsNCiAgICB9DQogICAgVHJ5LnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnYXR0ZW1wdCcsICdyZWNvdmVyeScsICdlbnN1cmUnXTsNCiAgICBUcnkucHJvdG90eXBlLmlzU3RhdGVtZW50ID0gWUVTOw0KICAgIFRyeS5wcm90b3R5cGUuanVtcHMgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgX3JlZjI7DQogICAgICByZXR1cm4gdGhpcy5hdHRlbXB0Lmp1bXBzKG8pIHx8ICgoX3JlZjIgPSB0aGlzLnJlY292ZXJ5KSAhPSBudWxsID8gX3JlZjIuanVtcHMobykgOiB2b2lkIDApOw0KICAgIH07DQogICAgVHJ5LnByb3RvdHlwZS5tYWtlUmV0dXJuID0gZnVuY3Rpb24oKSB7DQogICAgICBpZiAodGhpcy5hdHRlbXB0KSB7DQogICAgICAgIHRoaXMuYXR0ZW1wdCA9IHRoaXMuYXR0ZW1wdC5tYWtlUmV0dXJuKCk7DQogICAgICB9DQogICAgICBpZiAodGhpcy5yZWNvdmVyeSkgew0KICAgICAgICB0aGlzLnJlY292ZXJ5ID0gdGhpcy5yZWNvdmVyeS5tYWtlUmV0dXJuKCk7DQogICAgICB9DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIFRyeS5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgY2F0Y2hQYXJ0LCBlcnJvclBhcnQ7DQogICAgICBvLmluZGVudCArPSBUQUI7DQogICAgICBlcnJvclBhcnQgPSB0aGlzLmVycm9yID8gIiAoIiArICh0aGlzLmVycm9yLmNvbXBpbGUobykpICsgIikgIiA6ICcgJzsNCiAgICAgIGNhdGNoUGFydCA9IHRoaXMucmVjb3ZlcnkgPyAiIGNhdGNoIiArIGVycm9yUGFydCArICJ7XG4iICsgKHRoaXMucmVjb3ZlcnkuY29tcGlsZShvLCBMRVZFTF9UT1ApKSArICJcbiIgKyB0aGlzLnRhYiArICJ9IiA6ICEodGhpcy5lbnN1cmUgfHwgdGhpcy5yZWNvdmVyeSkgPyAnIGNhdGNoIChfZSkge30nIDogdm9pZCAwOw0KICAgICAgcmV0dXJuICgiIiArIHRoaXMudGFiICsgInRyeSB7XG4iICsgKHRoaXMuYXR0ZW1wdC5jb21waWxlKG8sIExFVkVMX1RPUCkpICsgIlxuIiArIHRoaXMudGFiICsgIn0iICsgKGNhdGNoUGFydCB8fCAnJykpICsgKHRoaXMuZW5zdXJlID8gIiBmaW5hbGx5IHtcbiIgKyAodGhpcy5lbnN1cmUuY29tcGlsZShvLCBMRVZFTF9UT1ApKSArICJcbiIgKyB0aGlzLnRhYiArICJ9IiA6ICcnKTsNCiAgICB9Ow0KICAgIHJldHVybiBUcnk7DQogIH0pKCk7DQogIGV4cG9ydHMuVGhyb3cgPSBUaHJvdyA9IChmdW5jdGlvbigpIHsNCiAgICBfX2V4dGVuZHMoVGhyb3csIEJhc2UpOw0KICAgIGZ1bmN0aW9uIFRocm93KGV4cHJlc3Npb24pIHsNCiAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247DQogICAgfQ0KICAgIFRocm93LnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnZXhwcmVzc2lvbiddOw0KICAgIFRocm93LnByb3RvdHlwZS5pc1N0YXRlbWVudCA9IFlFUzsNCiAgICBUaHJvdy5wcm90b3R5cGUuanVtcHMgPSBOTzsNCiAgICBUaHJvdy5wcm90b3R5cGUubWFrZVJldHVybiA9IFRISVM7DQogICAgVGhyb3cucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgew0KICAgICAgcmV0dXJuIHRoaXMudGFiICsgKCJ0aHJvdyAiICsgKHRoaXMuZXhwcmVzc2lvbi5jb21waWxlKG8pKSArICI7Iik7DQogICAgfTsNCiAgICByZXR1cm4gVGhyb3c7DQogIH0pKCk7DQogIGV4cG9ydHMuRXhpc3RlbmNlID0gRXhpc3RlbmNlID0gKGZ1bmN0aW9uKCkgew0KICAgIF9fZXh0ZW5kcyhFeGlzdGVuY2UsIEJhc2UpOw0KICAgIGZ1bmN0aW9uIEV4aXN0ZW5jZShleHByZXNzaW9uKSB7DQogICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOw0KICAgIH0NCiAgICBFeGlzdGVuY2UucHJvdG90eXBlLmNoaWxkcmVuID0gWydleHByZXNzaW9uJ107DQogICAgRXhpc3RlbmNlLnByb3RvdHlwZS5pbnZlcnQgPSBORUdBVEU7DQogICAgRXhpc3RlbmNlLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjbXAsIGNuaiwgY29kZSwgX3JlZjI7DQogICAgICBjb2RlID0gdGhpcy5leHByZXNzaW9uLmNvbXBpbGUobywgTEVWRUxfT1ApOw0KICAgICAgY29kZSA9IElERU5USUZJRVIudGVzdChjb2RlKSAmJiAhby5zY29wZS5jaGVjayhjb2RlKSA/ICgoX3JlZjIgPSB0aGlzLm5lZ2F0ZWQgPyBbJz09PScsICd8fCddIDogWychPT0nLCAnJiYnXSwgY21wID0gX3JlZjJbMF0sIGNuaiA9IF9yZWYyWzFdLCBfcmVmMiksICJ0eXBlb2YgIiArIGNvZGUgKyAiICIgKyBjbXAgKyAiIFwidW5kZWZpbmVkXCIgIiArIGNuaiArICIgIiArIGNvZGUgKyAiICIgKyBjbXAgKyAiIG51bGwiKSA6ICIiICsgY29kZSArICIgIiArICh0aGlzLm5lZ2F0ZWQgPyAnPT0nIDogJyE9JykgKyAiIG51bGwiOw0KICAgICAgaWYgKG8ubGV2ZWwgPD0gTEVWRUxfQ09ORCkgew0KICAgICAgICByZXR1cm4gY29kZTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiAiKCIgKyBjb2RlICsgIikiOw0KICAgICAgfQ0KICAgIH07DQogICAgcmV0dXJuIEV4aXN0ZW5jZTsNCiAgfSkoKTsNCiAgZXhwb3J0cy5QYXJlbnMgPSBQYXJlbnMgPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKFBhcmVucywgQmFzZSk7DQogICAgZnVuY3Rpb24gUGFyZW5zKGJvZHkpIHsNCiAgICAgIHRoaXMuYm9keSA9IGJvZHk7DQogICAgfQ0KICAgIFBhcmVucy5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ2JvZHknXTsNCiAgICBQYXJlbnMucHJvdG90eXBlLnVud3JhcCA9IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuIHRoaXMuYm9keTsNCiAgICB9Ow0KICAgIFBhcmVucy5wcm90b3R5cGUuaXNDb21wbGV4ID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gdGhpcy5ib2R5LmlzQ29tcGxleCgpOw0KICAgIH07DQogICAgUGFyZW5zLnByb3RvdHlwZS5tYWtlUmV0dXJuID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gdGhpcy5ib2R5Lm1ha2VSZXR1cm4oKTsNCiAgICB9Ow0KICAgIFBhcmVucy5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgYmFyZSwgY29kZSwgZXhwcjsNCiAgICAgIGV4cHIgPSB0aGlzLmJvZHkudW53cmFwKCk7DQogICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIFZhbHVlICYmIGV4cHIuaXNBdG9taWMoKSkgew0KICAgICAgICBleHByLmZyb250ID0gdGhpcy5mcm9udDsNCiAgICAgICAgcmV0dXJuIGV4cHIuY29tcGlsZShvKTsNCiAgICAgIH0NCiAgICAgIGNvZGUgPSBleHByLmNvbXBpbGUobywgTEVWRUxfUEFSRU4pOw0KICAgICAgYmFyZSA9IG8ubGV2ZWwgPCBMRVZFTF9PUCAmJiAoZXhwciBpbnN0YW5jZW9mIE9wIHx8IGV4cHIgaW5zdGFuY2VvZiBDYWxsIHx8IChleHByIGluc3RhbmNlb2YgRm9yICYmIGV4cHIucmV0dXJucykpOw0KICAgICAgaWYgKGJhcmUpIHsNCiAgICAgICAgcmV0dXJuIGNvZGU7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gIigiICsgY29kZSArICIpIjsNCiAgICAgIH0NCiAgICB9Ow0KICAgIHJldHVybiBQYXJlbnM7DQogIH0pKCk7DQogIGV4cG9ydHMuRm9yID0gRm9yID0gKGZ1bmN0aW9uKCkgew0KICAgIF9fZXh0ZW5kcyhGb3IsIEJhc2UpOw0KICAgIGZ1bmN0aW9uIEZvcihib2R5LCBzb3VyY2UpIHsNCiAgICAgIHZhciBfcmVmMjsNCiAgICAgIHRoaXMuc291cmNlID0gc291cmNlLnNvdXJjZSwgdGhpcy5ndWFyZCA9IHNvdXJjZS5ndWFyZCwgdGhpcy5zdGVwID0gc291cmNlLnN0ZXAsIHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lLCB0aGlzLmluZGV4ID0gc291cmNlLmluZGV4Ow0KICAgICAgdGhpcy5ib2R5ID0gQmxvY2sud3JhcChbYm9keV0pOw0KICAgICAgdGhpcy5vd24gPSAhIXNvdXJjZS5vd247DQogICAgICB0aGlzLm9iamVjdCA9ICEhc291cmNlLm9iamVjdDsNCiAgICAgIGlmICh0aGlzLm9iamVjdCkgew0KICAgICAgICBfcmVmMiA9IFt0aGlzLmluZGV4LCB0aGlzLm5hbWVdLCB0aGlzLm5hbWUgPSBfcmVmMlswXSwgdGhpcy5pbmRleCA9IF9yZWYyWzFdOw0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMuaW5kZXggaW5zdGFuY2VvZiBWYWx1ZSkgew0KICAgICAgICB0aHJvdyBTeW50YXhFcnJvcignaW5kZXggY2Fubm90IGJlIGEgcGF0dGVybiBtYXRjaGluZyBleHByZXNzaW9uJyk7DQogICAgICB9DQogICAgICB0aGlzLnJhbmdlID0gdGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBWYWx1ZSAmJiB0aGlzLnNvdXJjZS5iYXNlIGluc3RhbmNlb2YgUmFuZ2UgJiYgIXRoaXMuc291cmNlLnByb3BlcnRpZXMubGVuZ3RoOw0KICAgICAgdGhpcy5wYXR0ZXJuID0gdGhpcy5uYW1lIGluc3RhbmNlb2YgVmFsdWU7DQogICAgICBpZiAodGhpcy5yYW5nZSAmJiB0aGlzLmluZGV4KSB7DQogICAgICAgIHRocm93IFN5bnRheEVycm9yKCdpbmRleGVzIGRvIG5vdCBhcHBseSB0byByYW5nZSBsb29wcycpOw0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMucmFuZ2UgJiYgdGhpcy5wYXR0ZXJuKSB7DQogICAgICAgIHRocm93IFN5bnRheEVycm9yKCdjYW5ub3QgcGF0dGVybiBtYXRjaCBvdmVyIHJhbmdlIGxvb3BzJyk7DQogICAgICB9DQogICAgICB0aGlzLnJldHVybnMgPSBmYWxzZTsNCiAgICB9DQogICAgRm9yLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnYm9keScsICdzb3VyY2UnLCAnZ3VhcmQnLCAnc3RlcCddOw0KICAgIEZvci5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBZRVM7DQogICAgRm9yLnByb3RvdHlwZS5qdW1wcyA9IFdoaWxlLnByb3RvdHlwZS5qdW1wczsNCiAgICBGb3IucHJvdG90eXBlLm1ha2VSZXR1cm4gPSBmdW5jdGlvbigpIHsNCiAgICAgIHRoaXMucmV0dXJucyA9IHRydWU7DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIEZvci5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgYm9keSwgZGVmUGFydCwgZm9yUGFydCwgZm9yVmFyUGFydCwgZ3VhcmRQYXJ0LCBpZHQxLCBpbmRleCwgaXZhciwgbGFzdEp1bXBzLCBsdmFyLCBuYW1lLCBuYW1lUGFydCwgcmVmLCByZXN1bHRQYXJ0LCByZXR1cm5SZXN1bHQsIHJ2YXIsIHNjb3BlLCBzb3VyY2UsIHN0ZXBQYXJ0LCBzdGVwdmFyLCBzdmFyLCB2YXJQYXJ0LCBfcmVmMjsNCiAgICAgIGJvZHkgPSBCbG9jay53cmFwKFt0aGlzLmJvZHldKTsNCiAgICAgIGxhc3RKdW1wcyA9IChfcmVmMiA9IGxhc3QoYm9keS5leHByZXNzaW9ucykpICE9IG51bGwgPyBfcmVmMi5qdW1wcygpIDogdm9pZCAwOw0KICAgICAgaWYgKGxhc3RKdW1wcyAmJiBsYXN0SnVtcHMgaW5zdGFuY2VvZiBSZXR1cm4pIHsNCiAgICAgICAgdGhpcy5yZXR1cm5zID0gZmFsc2U7DQogICAgICB9DQogICAgICBzb3VyY2UgPSB0aGlzLnJhbmdlID8gdGhpcy5zb3VyY2UuYmFzZSA6IHRoaXMuc291cmNlOw0KICAgICAgc2NvcGUgPSBvLnNjb3BlOw0KICAgICAgbmFtZSA9IHRoaXMubmFtZSAmJiB0aGlzLm5hbWUuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsNCiAgICAgIGluZGV4ID0gdGhpcy5pbmRleCAmJiB0aGlzLmluZGV4LmNvbXBpbGUobywgTEVWRUxfTElTVCk7DQogICAgICBpZiAobmFtZSAmJiAhdGhpcy5wYXR0ZXJuKSB7DQogICAgICAgIHNjb3BlLmZpbmQobmFtZSwgew0KICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZQ0KICAgICAgICB9KTsNCiAgICAgIH0NCiAgICAgIGlmIChpbmRleCkgew0KICAgICAgICBzY29wZS5maW5kKGluZGV4LCB7DQogICAgICAgICAgaW1tZWRpYXRlOiB0cnVlDQogICAgICAgIH0pOw0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMucmV0dXJucykgew0KICAgICAgICBydmFyID0gc2NvcGUuZnJlZVZhcmlhYmxlKCdyZXN1bHRzJyk7DQogICAgICB9DQogICAgICBpdmFyID0gKHRoaXMucmFuZ2UgPyBuYW1lIDogaW5kZXgpIHx8IHNjb3BlLmZyZWVWYXJpYWJsZSgnaScpOw0KICAgICAgaWYgKHRoaXMuc3RlcCAmJiAhdGhpcy5yYW5nZSkgew0KICAgICAgICBzdGVwdmFyID0gc2NvcGUuZnJlZVZhcmlhYmxlKCJzdGVwIik7DQogICAgICB9DQogICAgICBpZiAodGhpcy5wYXR0ZXJuKSB7DQogICAgICAgIG5hbWUgPSBpdmFyOw0KICAgICAgfQ0KICAgICAgdmFyUGFydCA9ICcnOw0KICAgICAgZ3VhcmRQYXJ0ID0gJyc7DQogICAgICBkZWZQYXJ0ID0gJyc7DQogICAgICBpZHQxID0gdGhpcy50YWIgKyBUQUI7DQogICAgICBpZiAodGhpcy5yYW5nZSkgew0KICAgICAgICBmb3JQYXJ0ID0gc291cmNlLmNvbXBpbGUobWVyZ2Uobywgew0KICAgICAgICAgIGluZGV4OiBpdmFyLA0KICAgICAgICAgIHN0ZXA6IHRoaXMuc3RlcA0KICAgICAgICB9KSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBzdmFyID0gdGhpcy5zb3VyY2UuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsNCiAgICAgICAgaWYgKChuYW1lIHx8IHRoaXMub3duKSAmJiAhSURFTlRJRklFUi50ZXN0KHN2YXIpKSB7DQogICAgICAgICAgZGVmUGFydCA9ICIiICsgdGhpcy50YWIgKyAocmVmID0gc2NvcGUuZnJlZVZhcmlhYmxlKCdyZWYnKSkgKyAiID0gIiArIHN2YXIgKyAiO1xuIjsNCiAgICAgICAgICBzdmFyID0gcmVmOw0KICAgICAgICB9DQogICAgICAgIGlmIChuYW1lICYmICF0aGlzLnBhdHRlcm4pIHsNCiAgICAgICAgICBuYW1lUGFydCA9ICIiICsgbmFtZSArICIgPSAiICsgc3ZhciArICJbIiArIGl2YXIgKyAiXSI7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCF0aGlzLm9iamVjdCkgew0KICAgICAgICAgIGx2YXIgPSBzY29wZS5mcmVlVmFyaWFibGUoJ2xlbicpOw0KICAgICAgICAgIGZvclZhclBhcnQgPSAoIiIgKyBpdmFyICsgIiA9IDAsICIgKyBsdmFyICsgIiA9ICIgKyBzdmFyICsgIi5sZW5ndGgiKSArICh0aGlzLnN0ZXAgPyAiLCAiICsgc3RlcHZhciArICIgPSAiICsgKHRoaXMuc3RlcC5jb21waWxlKG8sIExFVkVMX09QKSkgOiAnJyk7DQogICAgICAgICAgc3RlcFBhcnQgPSB0aGlzLnN0ZXAgPyAiIiArIGl2YXIgKyAiICs9ICIgKyBzdGVwdmFyIDogIiIgKyBpdmFyICsgIisrIjsNCiAgICAgICAgICBmb3JQYXJ0ID0gIiIgKyBmb3JWYXJQYXJ0ICsgIjsgIiArIGl2YXIgKyAiIDwgIiArIGx2YXIgKyAiOyAiICsgc3RlcFBhcnQ7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLnJldHVybnMpIHsNCiAgICAgICAgcmVzdWx0UGFydCA9ICIiICsgdGhpcy50YWIgKyBydmFyICsgIiA9IFtdO1xuIjsNCiAgICAgICAgcmV0dXJuUmVzdWx0ID0gIlxuIiArIHRoaXMudGFiICsgInJldHVybiAiICsgcnZhciArICI7IjsNCiAgICAgICAgYm9keSA9IFB1c2gud3JhcChydmFyLCBib2R5KTsNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLmd1YXJkKSB7DQogICAgICAgIGJvZHkgPSBCbG9jay53cmFwKFtuZXcgSWYodGhpcy5ndWFyZCwgYm9keSldKTsNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLnBhdHRlcm4pIHsNCiAgICAgICAgYm9keS5leHByZXNzaW9ucy51bnNoaWZ0KG5ldyBBc3NpZ24odGhpcy5uYW1lLCBuZXcgTGl0ZXJhbCgiIiArIHN2YXIgKyAiWyIgKyBpdmFyICsgIl0iKSkpOw0KICAgICAgfQ0KICAgICAgZGVmUGFydCArPSB0aGlzLnBsdWNrRGlyZWN0Q2FsbChvLCBib2R5KTsNCiAgICAgIGlmIChuYW1lUGFydCkgew0KICAgICAgICB2YXJQYXJ0ID0gIlxuIiArIGlkdDEgKyBuYW1lUGFydCArICI7IjsNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLm9iamVjdCkgew0KICAgICAgICBmb3JQYXJ0ID0gIiIgKyBpdmFyICsgIiBpbiAiICsgc3ZhcjsNCiAgICAgICAgaWYgKHRoaXMub3duKSB7DQogICAgICAgICAgZ3VhcmRQYXJ0ID0gIlxuIiArIGlkdDEgKyAiaWYgKCEiICsgKHV0aWxpdHkoJ2hhc1Byb3AnKSkgKyAiLmNhbGwoIiArIHN2YXIgKyAiLCAiICsgaXZhciArICIpKSBjb250aW51ZTsiOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBib2R5ID0gYm9keS5jb21waWxlKG1lcmdlKG8sIHsNCiAgICAgICAgaW5kZW50OiBpZHQxDQogICAgICB9KSwgTEVWRUxfVE9QKTsNCiAgICAgIGlmIChib2R5KSB7DQogICAgICAgIGJvZHkgPSAnXG4nICsgYm9keSArICdcbic7DQogICAgICB9DQogICAgICByZXR1cm4gIiIgKyBkZWZQYXJ0ICsgKHJlc3VsdFBhcnQgfHwgJycpICsgdGhpcy50YWIgKyAiZm9yICgiICsgZm9yUGFydCArICIpIHsiICsgZ3VhcmRQYXJ0ICsgdmFyUGFydCArIGJvZHkgKyB0aGlzLnRhYiArICJ9IiArIChyZXR1cm5SZXN1bHQgfHwgJycpOw0KICAgIH07DQogICAgRm9yLnByb3RvdHlwZS5wbHVja0RpcmVjdENhbGwgPSBmdW5jdGlvbihvLCBib2R5KSB7DQogICAgICB2YXIgYmFzZSwgZGVmcywgZXhwciwgZm4sIGlkeCwgcmVmLCB2YWwsIF9sZW4sIF9yZWYyLCBfcmVmMywgX3JlZjQsIF9yZWY1LCBfcmVmNiwgX3JlZjc7DQogICAgICBkZWZzID0gJyc7DQogICAgICBfcmVmMiA9IGJvZHkuZXhwcmVzc2lvbnM7DQogICAgICBmb3IgKGlkeCA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IGlkeCA8IF9sZW47IGlkeCsrKSB7DQogICAgICAgIGV4cHIgPSBfcmVmMltpZHhdOw0KICAgICAgICBleHByID0gZXhwci51bndyYXBBbGwoKTsNCiAgICAgICAgaWYgKCEoZXhwciBpbnN0YW5jZW9mIENhbGwpKSB7DQogICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgdmFsID0gZXhwci52YXJpYWJsZS51bndyYXBBbGwoKTsNCiAgICAgICAgaWYgKCEoKHZhbCBpbnN0YW5jZW9mIENvZGUpIHx8ICh2YWwgaW5zdGFuY2VvZiBWYWx1ZSAmJiAoKF9yZWYzID0gdmFsLmJhc2UpICE9IG51bGwgPyBfcmVmMy51bndyYXBBbGwoKSA6IHZvaWQgMCkgaW5zdGFuY2VvZiBDb2RlICYmIHZhbC5wcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMSAmJiAoKF9yZWY0ID0gKF9yZWY1ID0gdmFsLnByb3BlcnRpZXNbMF0ubmFtZSkgIT0gbnVsbCA/IF9yZWY1LnZhbHVlIDogdm9pZCAwKSA9PT0gJ2NhbGwnIHx8IF9yZWY0ID09PSAnYXBwbHknKSkpKSB7DQogICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgZm4gPSAoKF9yZWY2ID0gdmFsLmJhc2UpICE9IG51bGwgPyBfcmVmNi51bndyYXBBbGwoKSA6IHZvaWQgMCkgfHwgdmFsOw0KICAgICAgICByZWYgPSBuZXcgTGl0ZXJhbChvLnNjb3BlLmZyZWVWYXJpYWJsZSgnZm4nKSk7DQogICAgICAgIGJhc2UgPSBuZXcgVmFsdWUocmVmKTsNCiAgICAgICAgaWYgKHZhbC5iYXNlKSB7DQogICAgICAgICAgX3JlZjcgPSBbYmFzZSwgdmFsXSwgdmFsLmJhc2UgPSBfcmVmN1swXSwgYmFzZSA9IF9yZWY3WzFdOw0KICAgICAgICAgIGFyZ3MudW5zaGlmdChuZXcgTGl0ZXJhbCgndGhpcycpKTsNCiAgICAgICAgfQ0KICAgICAgICBib2R5LmV4cHJlc3Npb25zW2lkeF0gPSBuZXcgQ2FsbChiYXNlLCBleHByLmFyZ3MpOw0KICAgICAgICBkZWZzICs9IHRoaXMudGFiICsgbmV3IEFzc2lnbihyZWYsIGZuKS5jb21waWxlKG8sIExFVkVMX1RPUCkgKyAnO1xuJzsNCiAgICAgIH0NCiAgICAgIHJldHVybiBkZWZzOw0KICAgIH07DQogICAgcmV0dXJuIEZvcjsNCiAgfSkoKTsNCiAgZXhwb3J0cy5Td2l0Y2ggPSBTd2l0Y2ggPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKFN3aXRjaCwgQmFzZSk7DQogICAgZnVuY3Rpb24gU3dpdGNoKHN1YmplY3QsIGNhc2VzLCBvdGhlcndpc2UpIHsNCiAgICAgIHRoaXMuc3ViamVjdCA9IHN1YmplY3Q7DQogICAgICB0aGlzLmNhc2VzID0gY2FzZXM7DQogICAgICB0aGlzLm90aGVyd2lzZSA9IG90aGVyd2lzZTsNCiAgICB9DQogICAgU3dpdGNoLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnc3ViamVjdCcsICdjYXNlcycsICdvdGhlcndpc2UnXTsNCiAgICBTd2l0Y2gucHJvdG90eXBlLmlzU3RhdGVtZW50ID0gWUVTOw0KICAgIFN3aXRjaC5wcm90b3R5cGUuanVtcHMgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgYmxvY2ssIGNvbmRzLCBfaSwgX2xlbiwgX3JlZjIsIF9yZWYzLCBfcmVmNDsNCiAgICAgIGlmIChvID09IG51bGwpIHsNCiAgICAgICAgbyA9IHsNCiAgICAgICAgICBibG9jazogdHJ1ZQ0KICAgICAgICB9Ow0KICAgICAgfQ0KICAgICAgX3JlZjIgPSB0aGlzLmNhc2VzOw0KICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgew0KICAgICAgICBfcmVmMyA9IF9yZWYyW19pXSwgY29uZHMgPSBfcmVmM1swXSwgYmxvY2sgPSBfcmVmM1sxXTsNCiAgICAgICAgaWYgKGJsb2NrLmp1bXBzKG8pKSB7DQogICAgICAgICAgcmV0dXJuIGJsb2NrOw0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gKF9yZWY0ID0gdGhpcy5vdGhlcndpc2UpICE9IG51bGwgPyBfcmVmNC5qdW1wcyhvKSA6IHZvaWQgMDsNCiAgICB9Ow0KICAgIFN3aXRjaC5wcm90b3R5cGUubWFrZVJldHVybiA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIHBhaXIsIF9pLCBfbGVuLCBfcmVmMiwgX3JlZjM7DQogICAgICBfcmVmMiA9IHRoaXMuY2FzZXM7DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIHBhaXIgPSBfcmVmMltfaV07DQogICAgICAgIHBhaXJbMV0ubWFrZVJldHVybigpOw0KICAgICAgfQ0KICAgICAgaWYgKChfcmVmMyA9IHRoaXMub3RoZXJ3aXNlKSAhPSBudWxsKSB7DQogICAgICAgIF9yZWYzLm1ha2VSZXR1cm4oKTsNCiAgICAgIH0NCiAgICAgIHJldHVybiB0aGlzOw0KICAgIH07DQogICAgU3dpdGNoLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBibG9jaywgYm9keSwgY29kZSwgY29uZCwgY29uZGl0aW9ucywgZXhwciwgaSwgaWR0MSwgaWR0MiwgX2ksIF9sZW4sIF9sZW4yLCBfcmVmMiwgX3JlZjMsIF9yZWY0LCBfcmVmNTsNCiAgICAgIGlkdDEgPSBvLmluZGVudCArIFRBQjsNCiAgICAgIGlkdDIgPSBvLmluZGVudCA9IGlkdDEgKyBUQUI7DQogICAgICBjb2RlID0gdGhpcy50YWIgKyAoInN3aXRjaCAoIiArICgoKF9yZWYyID0gdGhpcy5zdWJqZWN0KSAhPSBudWxsID8gX3JlZjIuY29tcGlsZShvLCBMRVZFTF9QQVJFTikgOiB2b2lkIDApIHx8IGZhbHNlKSArICIpIHtcbiIpOw0KICAgICAgX3JlZjMgPSB0aGlzLmNhc2VzOw0KICAgICAgZm9yIChpID0gMCwgX2xlbiA9IF9yZWYzLmxlbmd0aDsgaSA8IF9sZW47IGkrKykgew0KICAgICAgICBfcmVmNCA9IF9yZWYzW2ldLCBjb25kaXRpb25zID0gX3JlZjRbMF0sIGJsb2NrID0gX3JlZjRbMV07DQogICAgICAgIF9yZWY1ID0gZmxhdHRlbihbY29uZGl0aW9uc10pOw0KICAgICAgICBmb3IgKF9pID0gMCwgX2xlbjIgPSBfcmVmNS5sZW5ndGg7IF9pIDwgX2xlbjI7IF9pKyspIHsNCiAgICAgICAgICBjb25kID0gX3JlZjVbX2ldOw0KICAgICAgICAgIGlmICghdGhpcy5zdWJqZWN0KSB7DQogICAgICAgICAgICBjb25kID0gY29uZC5pbnZlcnQoKTsNCiAgICAgICAgICB9DQogICAgICAgICAgY29kZSArPSBpZHQxICsgKCJjYXNlICIgKyAoY29uZC5jb21waWxlKG8sIExFVkVMX1BBUkVOKSkgKyAiOlxuIik7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGJvZHkgPSBibG9jay5jb21waWxlKG8sIExFVkVMX1RPUCkpIHsNCiAgICAgICAgICBjb2RlICs9IGJvZHkgKyAnXG4nOw0KICAgICAgICB9DQogICAgICAgIGlmIChpID09PSB0aGlzLmNhc2VzLmxlbmd0aCAtIDEgJiYgIXRoaXMub3RoZXJ3aXNlKSB7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgZXhwciA9IHRoaXMubGFzdE5vbkNvbW1lbnQoYmxvY2suZXhwcmVzc2lvbnMpOw0KICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIFJldHVybiB8fCAoZXhwciBpbnN0YW5jZW9mIExpdGVyYWwgJiYgZXhwci5qdW1wcygpICYmIGV4cHIudmFsdWUgIT09ICdkZWJ1Z2dlcicpKSB7DQogICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgY29kZSArPSBpZHQyICsgJ2JyZWFrO1xuJzsNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLm90aGVyd2lzZSAmJiB0aGlzLm90aGVyd2lzZS5leHByZXNzaW9ucy5sZW5ndGgpIHsNCiAgICAgICAgY29kZSArPSBpZHQxICsgKCJkZWZhdWx0OlxuIiArICh0aGlzLm90aGVyd2lzZS5jb21waWxlKG8sIExFVkVMX1RPUCkpICsgIlxuIik7DQogICAgICB9DQogICAgICByZXR1cm4gY29kZSArIHRoaXMudGFiICsgJ30nOw0KICAgIH07DQogICAgcmV0dXJuIFN3aXRjaDsNCiAgfSkoKTsNCiAgZXhwb3J0cy5JZiA9IElmID0gKGZ1bmN0aW9uKCkgew0KICAgIF9fZXh0ZW5kcyhJZiwgQmFzZSk7DQogICAgZnVuY3Rpb24gSWYoY29uZGl0aW9uLCBib2R5LCBvcHRpb25zKSB7DQogICAgICB0aGlzLmJvZHkgPSBib2R5Ow0KICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgew0KICAgICAgICBvcHRpb25zID0ge307DQogICAgICB9DQogICAgICB0aGlzLmNvbmRpdGlvbiA9IG9wdGlvbnMudHlwZSA9PT0gJ3VubGVzcycgPyBjb25kaXRpb24uaW52ZXJ0KCkgOiBjb25kaXRpb247DQogICAgICB0aGlzLmVsc2VCb2R5ID0gbnVsbDsNCiAgICAgIHRoaXMuaXNDaGFpbiA9IGZhbHNlOw0KICAgICAgdGhpcy5zb2FrID0gb3B0aW9ucy5zb2FrOw0KICAgIH0NCiAgICBJZi5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ2NvbmRpdGlvbicsICdib2R5JywgJ2Vsc2VCb2R5J107DQogICAgSWYucHJvdG90eXBlLmJvZHlOb2RlID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgX3JlZjI7DQogICAgICByZXR1cm4gKF9yZWYyID0gdGhpcy5ib2R5KSAhPSBudWxsID8gX3JlZjIudW53cmFwKCkgOiB2b2lkIDA7DQogICAgfTsNCiAgICBJZi5wcm90b3R5cGUuZWxzZUJvZHlOb2RlID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgX3JlZjI7DQogICAgICByZXR1cm4gKF9yZWYyID0gdGhpcy5lbHNlQm9keSkgIT0gbnVsbCA/IF9yZWYyLnVud3JhcCgpIDogdm9pZCAwOw0KICAgIH07DQogICAgSWYucHJvdG90eXBlLmFkZEVsc2UgPSBmdW5jdGlvbihlbHNlQm9keSkgew0KICAgICAgaWYgKHRoaXMuaXNDaGFpbikgew0KICAgICAgICB0aGlzLmVsc2VCb2R5Tm9kZSgpLmFkZEVsc2UoZWxzZUJvZHkpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5pc0NoYWluID0gZWxzZUJvZHkgaW5zdGFuY2VvZiBJZjsNCiAgICAgICAgdGhpcy5lbHNlQm9keSA9IHRoaXMuZW5zdXJlQmxvY2soZWxzZUJvZHkpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRoaXM7DQogICAgfTsNCiAgICBJZi5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgX3JlZjI7DQogICAgICByZXR1cm4gKG8gIT0gbnVsbCA/IG8ubGV2ZWwgOiB2b2lkIDApID09PSBMRVZFTF9UT1AgfHwgdGhpcy5ib2R5Tm9kZSgpLmlzU3RhdGVtZW50KG8pIHx8ICgoX3JlZjIgPSB0aGlzLmVsc2VCb2R5Tm9kZSgpKSAhPSBudWxsID8gX3JlZjIuaXNTdGF0ZW1lbnQobykgOiB2b2lkIDApOw0KICAgIH07DQogICAgSWYucHJvdG90eXBlLmp1bXBzID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIF9yZWYyOw0KICAgICAgcmV0dXJuIHRoaXMuYm9keS5qdW1wcyhvKSB8fCAoKF9yZWYyID0gdGhpcy5lbHNlQm9keSkgIT0gbnVsbCA/IF9yZWYyLmp1bXBzKG8pIDogdm9pZCAwKTsNCiAgICB9Ow0KICAgIElmLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIGlmICh0aGlzLmlzU3RhdGVtZW50KG8pKSB7DQogICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVTdGF0ZW1lbnQobyk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlRXhwcmVzc2lvbihvKTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIElmLnByb3RvdHlwZS5tYWtlUmV0dXJuID0gZnVuY3Rpb24oKSB7DQogICAgICB0aGlzLmJvZHkgJiYgKHRoaXMuYm9keSA9IG5ldyBCbG9jayhbdGhpcy5ib2R5Lm1ha2VSZXR1cm4oKV0pKTsNCiAgICAgIHRoaXMuZWxzZUJvZHkgJiYgKHRoaXMuZWxzZUJvZHkgPSBuZXcgQmxvY2soW3RoaXMuZWxzZUJvZHkubWFrZVJldHVybigpXSkpOw0KICAgICAgcmV0dXJuIHRoaXM7DQogICAgfTsNCiAgICBJZi5wcm90b3R5cGUuZW5zdXJlQmxvY2sgPSBmdW5jdGlvbihub2RlKSB7DQogICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEJsb2NrKSB7DQogICAgICAgIHJldHVybiBub2RlOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuIG5ldyBCbG9jayhbbm9kZV0pOw0KICAgICAgfQ0KICAgIH07DQogICAgSWYucHJvdG90eXBlLmNvbXBpbGVTdGF0ZW1lbnQgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgYm9keSwgY2hpbGQsIGNvbmQsIGV4ZXEsIGlmUGFydDsNCiAgICAgIGNoaWxkID0gZGVsKG8sICdjaGFpbkNoaWxkJyk7DQogICAgICBleGVxID0gZGVsKG8sICdpc0V4aXN0ZW50aWFsRXF1YWxzJyk7DQogICAgICBpZiAoZXhlcSkgew0KICAgICAgICByZXR1cm4gbmV3IElmKHRoaXMuY29uZGl0aW9uLmludmVydCgpLCB0aGlzLmVsc2VCb2R5Tm9kZSgpLCB7DQogICAgICAgICAgdHlwZTogJ2lmJw0KICAgICAgICB9KS5jb21waWxlKG8pOw0KICAgICAgfQ0KICAgICAgY29uZCA9IHRoaXMuY29uZGl0aW9uLmNvbXBpbGUobywgTEVWRUxfUEFSRU4pOw0KICAgICAgby5pbmRlbnQgKz0gVEFCOw0KICAgICAgYm9keSA9IHRoaXMuZW5zdXJlQmxvY2sodGhpcy5ib2R5KS5jb21waWxlKG8pOw0KICAgICAgaWYgKGJvZHkpIHsNCiAgICAgICAgYm9keSA9ICJcbiIgKyBib2R5ICsgIlxuIiArIHRoaXMudGFiOw0KICAgICAgfQ0KICAgICAgaWZQYXJ0ID0gImlmICgiICsgY29uZCArICIpIHsiICsgYm9keSArICJ9IjsNCiAgICAgIGlmICghY2hpbGQpIHsNCiAgICAgICAgaWZQYXJ0ID0gdGhpcy50YWIgKyBpZlBhcnQ7DQogICAgICB9DQogICAgICBpZiAoIXRoaXMuZWxzZUJvZHkpIHsNCiAgICAgICAgcmV0dXJuIGlmUGFydDsNCiAgICAgIH0NCiAgICAgIHJldHVybiBpZlBhcnQgKyAnIGVsc2UgJyArICh0aGlzLmlzQ2hhaW4gPyAoby5pbmRlbnQgPSB0aGlzLnRhYiwgby5jaGFpbkNoaWxkID0gdHJ1ZSwgdGhpcy5lbHNlQm9keS51bndyYXAoKS5jb21waWxlKG8sIExFVkVMX1RPUCkpIDogIntcbiIgKyAodGhpcy5lbHNlQm9keS5jb21waWxlKG8sIExFVkVMX1RPUCkpICsgIlxuIiArIHRoaXMudGFiICsgIn0iKTsNCiAgICB9Ow0KICAgIElmLnByb3RvdHlwZS5jb21waWxlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBhbHQsIGJvZHksIGNvZGUsIGNvbmQ7DQogICAgICBjb25kID0gdGhpcy5jb25kaXRpb24uY29tcGlsZShvLCBMRVZFTF9DT05EKTsNCiAgICAgIGJvZHkgPSB0aGlzLmJvZHlOb2RlKCkuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsNCiAgICAgIGFsdCA9IHRoaXMuZWxzZUJvZHlOb2RlKCkgPyB0aGlzLmVsc2VCb2R5Tm9kZSgpLmNvbXBpbGUobywgTEVWRUxfTElTVCkgOiAndm9pZCAwJzsNCiAgICAgIGNvZGUgPSAiIiArIGNvbmQgKyAiID8gIiArIGJvZHkgKyAiIDogIiArIGFsdDsNCiAgICAgIGlmIChvLmxldmVsID49IExFVkVMX0NPTkQpIHsNCiAgICAgICAgcmV0dXJuICIoIiArIGNvZGUgKyAiKSI7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gY29kZTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIElmLnByb3RvdHlwZS51bmZvbGRTb2FrID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gdGhpcy5zb2FrICYmIHRoaXM7DQogICAgfTsNCiAgICByZXR1cm4gSWY7DQogIH0pKCk7DQogIFB1c2ggPSB7DQogICAgd3JhcDogZnVuY3Rpb24obmFtZSwgZXhwcykgew0KICAgICAgaWYgKGV4cHMuaXNFbXB0eSgpIHx8IGxhc3QoZXhwcy5leHByZXNzaW9ucykuanVtcHMoKSkgew0KICAgICAgICByZXR1cm4gZXhwczsNCiAgICAgIH0NCiAgICAgIHJldHVybiBleHBzLnB1c2gobmV3IENhbGwobmV3IFZhbHVlKG5ldyBMaXRlcmFsKG5hbWUpLCBbbmV3IEFjY2VzcyhuZXcgTGl0ZXJhbCgncHVzaCcpKV0pLCBbZXhwcy5wb3AoKV0pKTsNCiAgICB9DQogIH07DQogIENsb3N1cmUgPSB7DQogICAgd3JhcDogZnVuY3Rpb24oZXhwcmVzc2lvbnMsIHN0YXRlbWVudCwgbm9SZXR1cm4pIHsNCiAgICAgIHZhciBhcmdzLCBjYWxsLCBmdW5jLCBtZW50aW9uc0FyZ3MsIG1ldGg7DQogICAgICBpZiAoZXhwcmVzc2lvbnMuanVtcHMoKSkgew0KICAgICAgICByZXR1cm4gZXhwcmVzc2lvbnM7DQogICAgICB9DQogICAgICBmdW5jID0gbmV3IENvZGUoW10sIEJsb2NrLndyYXAoW2V4cHJlc3Npb25zXSkpOw0KICAgICAgYXJncyA9IFtdOw0KICAgICAgaWYgKChtZW50aW9uc0FyZ3MgPSBleHByZXNzaW9ucy5jb250YWlucyh0aGlzLmxpdGVyYWxBcmdzKSkgfHwgZXhwcmVzc2lvbnMuY29udGFpbnModGhpcy5saXRlcmFsVGhpcykpIHsNCiAgICAgICAgbWV0aCA9IG5ldyBMaXRlcmFsKG1lbnRpb25zQXJncyA/ICdhcHBseScgOiAnY2FsbCcpOw0KICAgICAgICBhcmdzID0gW25ldyBMaXRlcmFsKCd0aGlzJyldOw0KICAgICAgICBpZiAobWVudGlvbnNBcmdzKSB7DQogICAgICAgICAgYXJncy5wdXNoKG5ldyBMaXRlcmFsKCdhcmd1bWVudHMnKSk7DQogICAgICAgIH0NCiAgICAgICAgZnVuYyA9IG5ldyBWYWx1ZShmdW5jLCBbbmV3IEFjY2VzcyhtZXRoKV0pOw0KICAgICAgfQ0KICAgICAgZnVuYy5ub1JldHVybiA9IG5vUmV0dXJuOw0KICAgICAgY2FsbCA9IG5ldyBDYWxsKGZ1bmMsIGFyZ3MpOw0KICAgICAgaWYgKHN0YXRlbWVudCkgew0KICAgICAgICByZXR1cm4gQmxvY2sud3JhcChbY2FsbF0pOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuIGNhbGw7DQogICAgICB9DQogICAgfSwNCiAgICBsaXRlcmFsQXJnczogZnVuY3Rpb24obm9kZSkgew0KICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBMaXRlcmFsICYmIG5vZGUudmFsdWUgPT09ICdhcmd1bWVudHMnICYmICFub2RlLmFzS2V5Ow0KICAgIH0sDQogICAgbGl0ZXJhbFRoaXM6IGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgIHJldHVybiAobm9kZSBpbnN0YW5jZW9mIExpdGVyYWwgJiYgbm9kZS52YWx1ZSA9PT0gJ3RoaXMnICYmICFub2RlLmFzS2V5KSB8fCAobm9kZSBpbnN0YW5jZW9mIENvZGUgJiYgbm9kZS5ib3VuZCk7DQogICAgfQ0KICB9Ow0KICB1bmZvbGRTb2FrID0gZnVuY3Rpb24obywgcGFyZW50LCBuYW1lKSB7DQogICAgdmFyIGlmbjsNCiAgICBpZiAoIShpZm4gPSBwYXJlbnRbbmFtZV0udW5mb2xkU29hayhvKSkpIHsNCiAgICAgIHJldHVybjsNCiAgICB9DQogICAgcGFyZW50W25hbWVdID0gaWZuLmJvZHk7DQogICAgaWZuLmJvZHkgPSBuZXcgVmFsdWUocGFyZW50KTsNCiAgICByZXR1cm4gaWZuOw0KICB9Ow0KICBVVElMSVRJRVMgPSB7DQogICAgImV4dGVuZHMiOiAnZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkge1xuICBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChfX2hhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfVxuICBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH1cbiAgY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlO1xuICBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcjtcbiAgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuIGNoaWxkO1xufScsDQogICAgYmluZDogJ2Z1bmN0aW9uKGZuLCBtZSl7IHJldHVybiBmdW5jdGlvbigpeyByZXR1cm4gZm4uYXBwbHkobWUsIGFyZ3VtZW50cyk7IH07IH0nLA0KICAgIGluZGV4T2Y6ICdBcnJheS5wcm90b3R5cGUuaW5kZXhPZiB8fCBmdW5jdGlvbihpdGVtKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAodGhpc1tpXSA9PT0gaXRlbSkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufScsDQogICAgaGFzUHJvcDogJ09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHknLA0KICAgIHNsaWNlOiAnQXJyYXkucHJvdG90eXBlLnNsaWNlJw0KICB9Ow0KICBMRVZFTF9UT1AgPSAxOw0KICBMRVZFTF9QQVJFTiA9IDI7DQogIExFVkVMX0xJU1QgPSAzOw0KICBMRVZFTF9DT05EID0gNDsNCiAgTEVWRUxfT1AgPSA1Ow0KICBMRVZFTF9BQ0NFU1MgPSA2Ow0KICBUQUIgPSAnICAnOw0KICBJREVOVElGSUVSID0gL15bJEEtWmEtel9ceDdmLVx1ZmZmZl1bJFx3XHg3Zi1cdWZmZmZdKiQvOw0KICBTSU1QTEVOVU0gPSAvXlsrLV0/XGQrJC87DQogIE1FVEhPRF9ERUYgPSAvXig/OihbJEEtWmEtel9dWyRcd1x4N2YtXHVmZmZmXSopXC5wcm90b3R5cGVcLik/KFskQS1aYS16X11bJFx3XHg3Zi1cdWZmZmZdKikkLzsNCiAgSVNfU1RSSU5HID0gL15bJyJdLzsNCiAgdXRpbGl0eSA9IGZ1bmN0aW9uKG5hbWUpIHsNCiAgICB2YXIgcmVmOw0KICAgIHJlZiA9ICJfXyIgKyBuYW1lOw0KICAgIFNjb3BlLnJvb3QuYXNzaWduKHJlZiwgVVRJTElUSUVTW25hbWVdKTsNCiAgICByZXR1cm4gcmVmOw0KICB9Ow0KICBtdWx0aWRlbnQgPSBmdW5jdGlvbihjb2RlLCB0YWIpIHsNCiAgICByZXR1cm4gY29kZS5yZXBsYWNlKC9cbi9nLCAnJCYnICsgdGFiKTsNCiAgfTsNCn0pOw0KLyoqDQogKiBDb3B5cmlnaHQgKGMpIDIwMTEgSmVyZW15IEFzaGtlbmFzDQogKg0KICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24NCiAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uDQogKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0DQogKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwNCiAqIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUNCiAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nDQogKiBjb25kaXRpb25zOg0KICogDQogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQ0KICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQogKiANCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELA0KICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTDQogKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORA0KICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQNCiAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLA0KICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HDQogKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SDQogKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jb2ZmZWUvc2NvcGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9tb2RlL2NvZmZlZS9oZWxwZXJzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KICB2YXIgU2NvcGUsIGV4dGVuZCwgbGFzdCwgX3JlZjsNCiAgX3JlZiA9IHJlcXVpcmUoJy4vaGVscGVycycpLCBleHRlbmQgPSBfcmVmLmV4dGVuZCwgbGFzdCA9IF9yZWYubGFzdDsNCiAgZXhwb3J0cy5TY29wZSA9IFNjb3BlID0gKGZ1bmN0aW9uKCkgew0KICAgIFNjb3BlLnJvb3QgPSBudWxsOw0KICAgIGZ1bmN0aW9uIFNjb3BlKHBhcmVudCwgZXhwcmVzc2lvbnMsIG1ldGhvZCkgew0KICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7DQogICAgICB0aGlzLmV4cHJlc3Npb25zID0gZXhwcmVzc2lvbnM7DQogICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDsNCiAgICAgIHRoaXMudmFyaWFibGVzID0gWw0KICAgICAgICB7DQogICAgICAgICAgbmFtZTogJ2FyZ3VtZW50cycsDQogICAgICAgICAgdHlwZTogJ2FyZ3VtZW50cycNCiAgICAgICAgfQ0KICAgICAgXTsNCiAgICAgIHRoaXMucG9zaXRpb25zID0ge307DQogICAgICBpZiAoIXRoaXMucGFyZW50KSB7DQogICAgICAgIFNjb3BlLnJvb3QgPSB0aGlzOw0KICAgICAgfQ0KICAgIH0NCiAgICBTY29wZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgaW1tZWRpYXRlKSB7DQogICAgICB2YXIgcG9zOw0KICAgICAgaWYgKHRoaXMuc2hhcmVkICYmICFpbW1lZGlhdGUpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmFkZChuYW1lLCB0eXBlLCBpbW1lZGlhdGUpOw0KICAgICAgfQ0KICAgICAgaWYgKHR5cGVvZiAocG9zID0gdGhpcy5wb3NpdGlvbnNbbmFtZV0pID09PSAnbnVtYmVyJykgew0KICAgICAgICByZXR1cm4gdGhpcy52YXJpYWJsZXNbcG9zXS50eXBlID0gdHlwZTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uc1tuYW1lXSA9IHRoaXMudmFyaWFibGVzLnB1c2goew0KICAgICAgICAgIG5hbWU6IG5hbWUsDQogICAgICAgICAgdHlwZTogdHlwZQ0KICAgICAgICB9KSAtIDE7DQogICAgICB9DQogICAgfTsNCiAgICBTY29wZS5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uKG5hbWUsIG9wdGlvbnMpIHsNCiAgICAgIGlmICh0aGlzLmNoZWNrKG5hbWUsIG9wdGlvbnMpKSB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgfQ0KICAgICAgdGhpcy5hZGQobmFtZSwgJ3ZhcicpOw0KICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQogICAgU2NvcGUucHJvdG90eXBlLnBhcmFtZXRlciA9IGZ1bmN0aW9uKG5hbWUpIHsNCiAgICAgIGlmICh0aGlzLnNoYXJlZCAmJiB0aGlzLnBhcmVudC5jaGVjayhuYW1lLCB0cnVlKSkgew0KICAgICAgICByZXR1cm47DQogICAgICB9DQogICAgICByZXR1cm4gdGhpcy5hZGQobmFtZSwgJ3BhcmFtJyk7DQogICAgfTsNCiAgICBTY29wZS5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbihuYW1lLCBpbW1lZGlhdGUpIHsNCiAgICAgIHZhciBmb3VuZCwgX3JlZjI7DQogICAgICBmb3VuZCA9ICEhdGhpcy50eXBlKG5hbWUpOw0KICAgICAgaWYgKGZvdW5kIHx8IGltbWVkaWF0ZSkgew0KICAgICAgICByZXR1cm4gZm91bmQ7DQogICAgICB9DQogICAgICByZXR1cm4gISEoKF9yZWYyID0gdGhpcy5wYXJlbnQpICE9IG51bGwgPyBfcmVmMi5jaGVjayhuYW1lKSA6IHZvaWQgMCk7DQogICAgfTsNCiAgICBTY29wZS5wcm90b3R5cGUudGVtcG9yYXJ5ID0gZnVuY3Rpb24obmFtZSwgaW5kZXgpIHsNCiAgICAgIGlmIChuYW1lLmxlbmd0aCA+IDEpIHsNCiAgICAgICAgcmV0dXJuICdfJyArIG5hbWUgKyAoaW5kZXggPiAxID8gaW5kZXggOiAnJyk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gJ18nICsgKGluZGV4ICsgcGFyc2VJbnQobmFtZSwgMzYpKS50b1N0cmluZygzNikucmVwbGFjZSgvXGQvZywgJ2EnKTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIFNjb3BlLnByb3RvdHlwZS50eXBlID0gZnVuY3Rpb24obmFtZSkgew0KICAgICAgdmFyIHYsIF9pLCBfbGVuLCBfcmVmMjsNCiAgICAgIF9yZWYyID0gdGhpcy52YXJpYWJsZXM7DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIHYgPSBfcmVmMltfaV07DQogICAgICAgIGlmICh2Lm5hbWUgPT09IG5hbWUpIHsNCiAgICAgICAgICByZXR1cm4gdi50eXBlOw0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KICAgIFNjb3BlLnByb3RvdHlwZS5mcmVlVmFyaWFibGUgPSBmdW5jdGlvbih0eXBlKSB7DQogICAgICB2YXIgaW5kZXgsIHRlbXA7DQogICAgICBpbmRleCA9IDA7DQogICAgICB3aGlsZSAodGhpcy5jaGVjaygodGVtcCA9IHRoaXMudGVtcG9yYXJ5KHR5cGUsIGluZGV4KSkpKSB7DQogICAgICAgIGluZGV4Kys7DQogICAgICB9DQogICAgICB0aGlzLmFkZCh0ZW1wLCAndmFyJywgdHJ1ZSk7DQogICAgICByZXR1cm4gdGVtcDsNCiAgICB9Ow0KICAgIFNjb3BlLnByb3RvdHlwZS5hc3NpZ24gPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgew0KICAgICAgdGhpcy5hZGQobmFtZSwgew0KICAgICAgICB2YWx1ZTogdmFsdWUsDQogICAgICAgIGFzc2lnbmVkOiB0cnVlDQogICAgICB9KTsNCiAgICAgIHJldHVybiB0aGlzLmhhc0Fzc2lnbm1lbnRzID0gdHJ1ZTsNCiAgICB9Ow0KICAgIFNjb3BlLnByb3RvdHlwZS5oYXNEZWNsYXJhdGlvbnMgPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiAhIXRoaXMuZGVjbGFyZWRWYXJpYWJsZXMoKS5sZW5ndGg7DQogICAgfTsNCiAgICBTY29wZS5wcm90b3R5cGUuZGVjbGFyZWRWYXJpYWJsZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciByZWFsVmFycywgdGVtcFZhcnMsIHYsIF9pLCBfbGVuLCBfcmVmMjsNCiAgICAgIHJlYWxWYXJzID0gW107DQogICAgICB0ZW1wVmFycyA9IFtdOw0KICAgICAgX3JlZjIgPSB0aGlzLnZhcmlhYmxlczsNCiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsNCiAgICAgICAgdiA9IF9yZWYyW19pXTsNCiAgICAgICAgaWYgKHYudHlwZSA9PT0gJ3ZhcicpIHsNCiAgICAgICAgICAodi5uYW1lLmNoYXJBdCgwKSA9PT0gJ18nID8gdGVtcFZhcnMgOiByZWFsVmFycykucHVzaCh2Lm5hbWUpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gcmVhbFZhcnMuc29ydCgpLmNvbmNhdCh0ZW1wVmFycy5zb3J0KCkpOw0KICAgIH07DQogICAgU2NvcGUucHJvdG90eXBlLmFzc2lnbmVkVmFyaWFibGVzID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgdiwgX2ksIF9sZW4sIF9yZWYyLCBfcmVzdWx0czsNCiAgICAgIF9yZWYyID0gdGhpcy52YXJpYWJsZXM7DQogICAgICBfcmVzdWx0cyA9IFtdOw0KICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgew0KICAgICAgICB2ID0gX3JlZjJbX2ldOw0KICAgICAgICBpZiAodi50eXBlLmFzc2lnbmVkKSB7DQogICAgICAgICAgX3Jlc3VsdHMucHVzaCgiIiArIHYubmFtZSArICIgPSAiICsgdi50eXBlLnZhbHVlKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIF9yZXN1bHRzOw0KICAgIH07DQogICAgcmV0dXJuIFNjb3BlOw0KICB9KSgpOw0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/worker-css.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Im5vIHVzZSBzdHJpY3QiOw0KDQp2YXIgY29uc29sZSA9IHsNCiAgICBsb2c6IGZ1bmN0aW9uKG1zZykgew0KICAgICAgICBwb3N0TWVzc2FnZSh7dHlwZTogImxvZyIsIGRhdGE6IG1zZ30pOw0KICAgIH0NCn07DQp2YXIgd2luZG93ID0gew0KICAgIGNvbnNvbGU6IGNvbnNvbGUNCn07DQoNCnZhciBub3JtYWxpemVNb2R1bGUgPSBmdW5jdGlvbihwYXJlbnRJZCwgbW9kdWxlTmFtZSkgew0KICAgIC8vIG5vcm1hbGl6ZSBwbHVnaW4gcmVxdWlyZXMNCiAgICBpZiAobW9kdWxlTmFtZS5pbmRleE9mKCIhIikgIT09IC0xKSB7DQogICAgICAgIHZhciBjaHVua3MgPSBtb2R1bGVOYW1lLnNwbGl0KCIhIik7DQogICAgICAgIHJldHVybiBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1swXSkgKyAiISIgKyBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1sxXSk7DQogICAgfQ0KICAgIC8vIG5vcm1hbGl6ZSByZWxhdGl2ZSByZXF1aXJlcw0KICAgIGlmIChtb2R1bGVOYW1lLmNoYXJBdCgwKSA9PSAiLiIpIHsNCiAgICAgICAgdmFyIGJhc2UgPSBwYXJlbnRJZC5zcGxpdCgiLyIpLnNsaWNlKDAsIC0xKS5qb2luKCIvIik7DQogICAgICAgIHZhciBtb2R1bGVOYW1lID0gYmFzZSArICIvIiArIG1vZHVsZU5hbWU7DQogICAgICAgIA0KICAgICAgICB3aGlsZShtb2R1bGVOYW1lLmluZGV4T2YoIi4iKSAhPT0gLTEgJiYgcHJldmlvdXMgIT0gbW9kdWxlTmFtZSkgew0KICAgICAgICAgICAgdmFyIHByZXZpb3VzID0gbW9kdWxlTmFtZTsNCiAgICAgICAgICAgIHZhciBtb2R1bGVOYW1lID0gbW9kdWxlTmFtZS5yZXBsYWNlKC9cL1wuXC8vLCAiLyIpLnJlcGxhY2UoL1teXC9dK1wvXC5cLlwvLywgIiIpOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIHJldHVybiBtb2R1bGVOYW1lOw0KfTsNCg0KdmFyIHJlcXVpcmUgPSBmdW5jdGlvbihwYXJlbnRJZCwgaWQpIHsNCiAgICB2YXIgaWQgPSBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGlkKTsNCiAgICANCiAgICB2YXIgbW9kdWxlID0gcmVxdWlyZS5tb2R1bGVzW2lkXTsNCiAgICBpZiAobW9kdWxlKSB7DQogICAgICAgIGlmICghbW9kdWxlLmluaXRpYWxpemVkKSB7DQogICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG1vZHVsZS5mYWN0b3J5KCkuZXhwb3J0czsNCiAgICAgICAgICAgIG1vZHVsZS5pbml0aWFsaXplZCA9IHRydWU7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzOw0KICAgIH0NCiAgICANCiAgICB2YXIgY2h1bmtzID0gaWQuc3BsaXQoIi8iKTsNCiAgICBjaHVua3NbMF0gPSByZXF1aXJlLnRsbnNbY2h1bmtzWzBdXSB8fCBjaHVua3NbMF07DQogICAgdmFyIHBhdGggPSBjaHVua3Muam9pbigiLyIpICsgIi5qcyI7DQogICAgDQogICAgcmVxdWlyZS5pZCA9IGlkOw0KICAgIGltcG9ydFNjcmlwdHMocGF0aCk7DQogICAgcmV0dXJuIHJlcXVpcmUocGFyZW50SWQsIGlkKTsgICAgDQp9Ow0KDQpyZXF1aXJlLm1vZHVsZXMgPSB7fTsNCnJlcXVpcmUudGxucyA9IHt9Ow0KDQp2YXIgZGVmaW5lID0gZnVuY3Rpb24oaWQsIGRlcHMsIGZhY3RvcnkpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7DQogICAgICAgIGZhY3RvcnkgPSBkZXBzOw0KICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICAgIGZhY3RvcnkgPSBpZDsNCiAgICAgICAgaWQgPSByZXF1aXJlLmlkOw0KICAgIH0NCg0KICAgIGlmIChpZC5pbmRleE9mKCJ0ZXh0ISIpID09PSAwKSANCiAgICAgICAgcmV0dXJuOw0KICAgIA0KICAgIHZhciByZXEgPSBmdW5jdGlvbihkZXBzLCBmYWN0b3J5KSB7DQogICAgICAgIHJldHVybiByZXF1aXJlKGlkLCBkZXBzLCBmYWN0b3J5KTsNCiAgICB9Ow0KDQogICAgcmVxdWlyZS5tb2R1bGVzW2lkXSA9IHsNCiAgICAgICAgZmFjdG9yeTogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgbW9kdWxlID0gew0KICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdmFyIHJldHVybkV4cG9ydHMgPSBmYWN0b3J5KHJlcSwgbW9kdWxlLmV4cG9ydHMsIG1vZHVsZSk7DQogICAgICAgICAgICBpZiAocmV0dXJuRXhwb3J0cykNCiAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHJldHVybkV4cG9ydHM7DQogICAgICAgICAgICByZXR1cm4gbW9kdWxlOw0KICAgICAgICB9DQogICAgfTsNCn07DQoNCmZ1bmN0aW9uIGluaXRCYXNlVXJscyh0b3BMZXZlbE5hbWVzcGFjZXMpIHsNCiAgICByZXF1aXJlLnRsbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXM7DQp9DQoNCmZ1bmN0aW9uIGluaXRTZW5kZXIoKSB7DQoNCiAgICB2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZShudWxsLCAiYWNlL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KICAgIHZhciBvb3AgPSByZXF1aXJlKG51bGwsICJhY2UvbGliL29vcCIpOw0KICAgIA0KICAgIHZhciBTZW5kZXIgPSBmdW5jdGlvbigpIHt9Ow0KICAgIA0KICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgDQogICAgICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrSWQpIHsNCiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAiY2FsbCIsDQogICAgICAgICAgICAgICAgaWQ6IGNhbGxiYWNrSWQsDQogICAgICAgICAgICAgICAgZGF0YTogZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQogICAgDQogICAgICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uKG5hbWUsIGRhdGEpIHsNCiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAiZXZlbnQiLA0KICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsDQogICAgICAgICAgICAgICAgZGF0YTogZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQogICAgICAgIA0KICAgIH0pLmNhbGwoU2VuZGVyLnByb3RvdHlwZSk7DQogICAgDQogICAgcmV0dXJuIG5ldyBTZW5kZXIoKTsNCn0NCg0KdmFyIG1haW47DQp2YXIgc2VuZGVyOw0KDQpvbm1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7DQogICAgdmFyIG1zZyA9IGUuZGF0YTsNCiAgICBpZiAobXNnLmNvbW1hbmQpIHsNCiAgICAgICAgbWFpblttc2cuY29tbWFuZF0uYXBwbHkobWFpbiwgbXNnLmFyZ3MpOw0KICAgIH0NCiAgICBlbHNlIGlmIChtc2cuaW5pdCkgeyAgICAgICAgDQogICAgICAgIGluaXRCYXNlVXJscyhtc2cudGxucyk7DQogICAgICAgIHJlcXVpcmUobnVsbCwgImFjZS9saWIvZml4b2xkYnJvd3NlcnMiKTsNCiAgICAgICAgc2VuZGVyID0gaW5pdFNlbmRlcigpOw0KICAgICAgICB2YXIgY2xhenogPSByZXF1aXJlKG51bGwsIG1zZy5tb2R1bGUpW21zZy5jbGFzc25hbWVdOw0KICAgICAgICBtYWluID0gbmV3IGNsYXp6KHNlbmRlcik7DQogICAgfSANCiAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgc2VuZGVyKSB7DQogICAgICAgIHNlbmRlci5fZW1pdChtc2cuZXZlbnQsIG1zZy5kYXRhKTsNCiAgICB9DQp9Ow0KLy8gdmltOnNldCB0cz00IHN0cz00IHN3PTQgc3Q6DQovLyAtLSBrcmlza293YWwgS3JpcyBLb3dhbCBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBNSVQgTGljZW5zZQ0KLy8gLS0gdGxyb2JpbnNvbiBUb20gUm9iaW5zb24gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTUlUIExpY2Vuc2UgKE5hcndoYWwgUHJvamVjdCkNCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0KEMpIDIwMTAgWFhYIE5vIExpY2Vuc2UgU3BlY2lmaWVkDQovLyAtLSBmc2NoYWVmZXIgRmxvcmlhbiBTY2jDpGZlciBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIElyYWtsaSBHb3phbGlzaHZpbGkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQoNCi8qIQ0KICAgIENvcHlyaWdodCAoYykgMjAwOSwgMjgwIE5vcnRoIEluYy4gaHR0cDovLzI4MG5vcnRoLmNvbS8NCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQNCiovDQoNCmRlZmluZSgnYWNlL2xpYi9maXhvbGRicm93c2VycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9yZWdleHAnLCAnYWNlL2xpYi9lczUtc2hpbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KcmVxdWlyZSgiLi9yZWdleHAiKTsNCnJlcXVpcmUoIi4vZXM1LXNoaW0iKTsNCg0KfSk7LyoqDQogKiAgQmFzZWQgb24gY29kZSBmcm9tOg0KICoNCiAqIFhSZWdFeHAgMS41LjANCiAqIChjKSAyMDA3LTIwMTAgU3RldmVuIExldml0aGFuDQogKiBNSVQgTGljZW5zZQ0KICogPGh0dHA6Ly94cmVnZXhwLmNvbT4NCiAqIFByb3ZpZGVzIGFuIGF1Z21lbnRlZCwgZXh0ZW5zaWJsZSwgY3Jvc3MtYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiByZWd1bGFyIGV4cHJlc3Npb25zLA0KICogaW5jbHVkaW5nIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgc3ludGF4LCBmbGFncywgYW5kIG1ldGhvZHMNCiAqLw0KIA0KZGVmaW5lKCdhY2UvbGliL3JlZ2V4cCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vICBQcml2YXRlIHZhcmlhYmxlcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICB2YXIgcmVhbCA9IHsNCiAgICAgICAgICAgIGV4ZWM6IFJlZ0V4cC5wcm90b3R5cGUuZXhlYywNCiAgICAgICAgICAgIHRlc3Q6IFJlZ0V4cC5wcm90b3R5cGUudGVzdCwNCiAgICAgICAgICAgIG1hdGNoOiBTdHJpbmcucHJvdG90eXBlLm1hdGNoLA0KICAgICAgICAgICAgcmVwbGFjZTogU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlLA0KICAgICAgICAgICAgc3BsaXQ6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQNCiAgICAgICAgfSwNCiAgICAgICAgY29tcGxpYW50RXhlY05wY2cgPSByZWFsLmV4ZWMuY2FsbCgvKCk/Py8sICIiKVsxXSA9PT0gdW5kZWZpbmVkLCAvLyBjaGVjayBgZXhlY2AgaGFuZGxpbmcgb2Ygbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzDQogICAgICAgIGNvbXBsaWFudExhc3RJbmRleEluY3JlbWVudCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciB4ID0gL14vZzsNCiAgICAgICAgICAgIHJlYWwudGVzdC5jYWxsKHgsICIiKTsNCiAgICAgICAgICAgIHJldHVybiAheC5sYXN0SW5kZXg7DQogICAgICAgIH0oKTsNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gIE92ZXJyaWRlbiBuYXRpdmUgbWV0aG9kcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAvLyBBZGRzIG5hbWVkIGNhcHR1cmUgc3VwcG9ydCAod2l0aCBiYWNrcmVmZXJlbmNlcyByZXR1cm5lZCBhcyBgcmVzdWx0Lm5hbWVgKSwgYW5kIGZpeGVzIHR3bw0KICAgIC8vIGNyb3NzLWJyb3dzZXIgaXNzdWVzIHBlciBFUzM6DQogICAgLy8gLSBDYXB0dXJlZCB2YWx1ZXMgZm9yIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYHVuZGVmaW5lZGAsDQogICAgLy8gICByYXRoZXIgdGhhbiB0aGUgZW1wdHkgc3RyaW5nLg0KICAgIC8vIC0gYGxhc3RJbmRleGAgc2hvdWxkIG5vdCBiZSBpbmNyZW1lbnRlZCBhZnRlciB6ZXJvLWxlbmd0aCBtYXRjaGVzLg0KICAgIFJlZ0V4cC5wcm90b3R5cGUuZXhlYyA9IGZ1bmN0aW9uIChzdHIpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gcmVhbC5leGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksDQogICAgICAgICAgICBuYW1lLCByMjsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYCBmb3INCiAgICAgICAgICAgIC8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3Vwcw0KICAgICAgICAgICAgaWYgKCFjb21wbGlhbnRFeGVjTnBjZyAmJiBtYXRjaC5sZW5ndGggPiAxICYmIGluZGV4T2YobWF0Y2gsICIiKSA+IC0xKSB7DQogICAgICAgICAgICAgICAgcjIgPSBSZWdFeHAodGhpcy5zb3VyY2UsIHJlYWwucmVwbGFjZS5jYWxsKGdldE5hdGl2ZUZsYWdzKHRoaXMpLCAiZyIsICIiKSk7DQogICAgICAgICAgICAgICAgLy8gVXNpbmcgYHN0ci5zbGljZShtYXRjaC5pbmRleClgIHJhdGhlciB0aGFuIGBtYXRjaFswXWAgaW4gY2FzZSBsb29rYWhlYWQgYWxsb3dlZA0KICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIGR1ZSB0byBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIG1hdGNoDQogICAgICAgICAgICAgICAgcmVhbC5yZXBsYWNlLmNhbGwoc3RyLnNsaWNlKG1hdGNoLmluZGV4KSwgcjIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMjsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzW2ldID09PSB1bmRlZmluZWQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0gPSB1bmRlZmluZWQ7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIEF0dGFjaCBuYW1lZCBjYXB0dXJlIHByb3BlcnRpZXMNCiAgICAgICAgICAgIGlmICh0aGlzLl94cmVnZXhwICYmIHRoaXMuX3hyZWdleHAuY2FwdHVyZU5hbWVzKSB7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBtYXRjaC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gdGhpcy5feHJlZ2V4cC5jYXB0dXJlTmFtZXNbaSAtIDFdOw0KICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSkNCiAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbbmFtZV0gPSBtYXRjaFtpXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgdGhhdCBpbmNyZW1lbnQgYGxhc3RJbmRleGAgYWZ0ZXIgemVyby1sZW5ndGggbWF0Y2hlcw0KICAgICAgICAgICAgaWYgKCFjb21wbGlhbnRMYXN0SW5kZXhJbmNyZW1lbnQgJiYgdGhpcy5nbG9iYWwgJiYgIW1hdGNoWzBdLmxlbmd0aCAmJiAodGhpcy5sYXN0SW5kZXggPiBtYXRjaC5pbmRleCkpDQogICAgICAgICAgICAgICAgdGhpcy5sYXN0SW5kZXgtLTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbWF0Y2g7DQogICAgfTsNCg0KICAgIC8vIERvbid0IG92ZXJyaWRlIGB0ZXN0YCBpZiBpdCB3b24ndCBjaGFuZ2UgYW55dGhpbmcNCiAgICBpZiAoIWNvbXBsaWFudExhc3RJbmRleEluY3JlbWVudCkgew0KICAgICAgICAvLyBGaXggYnJvd3NlciBidWcgaW4gbmF0aXZlIG1ldGhvZA0KICAgICAgICBSZWdFeHAucHJvdG90eXBlLnRlc3QgPSBmdW5jdGlvbiAoc3RyKSB7DQogICAgICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBgZXhlY2AgdG8gc2tpcCBzb21lIHByb2Nlc3Npbmcgb3ZlcmhlYWQsIGV2ZW4gdGhvdWdoIHRoZSBvdmVycmlkZW4NCiAgICAgICAgICAgIC8vIGBleGVjYCB3b3VsZCB0YWtlIGNhcmUgb2YgdGhlIGBsYXN0SW5kZXhgIGZpeA0KICAgICAgICAgICAgdmFyIG1hdGNoID0gcmVhbC5leGVjLmNhbGwodGhpcywgc3RyKTsNCiAgICAgICAgICAgIC8vIEZpeCBicm93c2VycyB0aGF0IGluY3JlbWVudCBgbGFzdEluZGV4YCBhZnRlciB6ZXJvLWxlbmd0aCBtYXRjaGVzDQogICAgICAgICAgICBpZiAobWF0Y2ggJiYgdGhpcy5nbG9iYWwgJiYgIW1hdGNoWzBdLmxlbmd0aCAmJiAodGhpcy5sYXN0SW5kZXggPiBtYXRjaC5pbmRleCkpDQogICAgICAgICAgICAgICAgdGhpcy5sYXN0SW5kZXgtLTsNCiAgICAgICAgICAgIHJldHVybiAhIW1hdGNoOw0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9ucw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICBmdW5jdGlvbiBnZXROYXRpdmVGbGFncyAocmVnZXgpIHsNCiAgICAgICAgcmV0dXJuIChyZWdleC5nbG9iYWwgICAgID8gImciIDogIiIpICsNCiAgICAgICAgICAgICAgIChyZWdleC5pZ25vcmVDYXNlID8gImkiIDogIiIpICsNCiAgICAgICAgICAgICAgIChyZWdleC5tdWx0aWxpbmUgID8gIm0iIDogIiIpICsNCiAgICAgICAgICAgICAgIChyZWdleC5leHRlbmRlZCAgID8gIngiIDogIiIpICsgLy8gUHJvcG9zZWQgZm9yIEVTNDsgaW5jbHVkZWQgaW4gQVMzDQogICAgICAgICAgICAgICAocmVnZXguc3RpY2t5ICAgICA/ICJ5IiA6ICIiKTsNCiAgICB9Ow0KDQogICAgZnVuY3Rpb24gaW5kZXhPZiAoYXJyYXksIGl0ZW0sIGZyb20pIHsNCiAgICAgICAgaWYgKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKSAvLyBVc2UgdGhlIG5hdGl2ZSBhcnJheSBtZXRob2QgaWYgYXZhaWxhYmxlDQogICAgICAgICAgICByZXR1cm4gYXJyYXkuaW5kZXhPZihpdGVtLCBmcm9tKTsNCiAgICAgICAgZm9yICh2YXIgaSA9IGZyb20gfHwgMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoYXJyYXlbaV0gPT09IGl0ZW0pDQogICAgICAgICAgICAgICAgcmV0dXJuIGk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH07DQoNCn0pOy8vIHZpbTogdHM9NCBzdHM9NCBzdz00IGV4cGFuZHRhYg0KLy8gLS0ga3Jpc2tvd2FsIEtyaXMgS293YWwgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIHRscm9iaW5zb24gVG9tIFJvYmluc29uIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlIChOYXJ3aGFsIFByb2plY3QpDQovLyAtLSBkYW50bWFuIERhbmllbCBGcmllc2VuIENvcHlyaWdodCAoQykgMjAxMCBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQ0KLy8gLS0gZnNjaGFlZmVyIEZsb3JpYW4gU2Now6RmZXIgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQovLyAtLSBHb3phbGEgSXJha2xpIEdvemFsaXNodmlsaSBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIGtpdGNhbWJyaWRnZSBLaXQgQ2FtYnJpZGdlIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0ga29zc25vY29ycCBTYXNoYSBLb3NzIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBicnlhbmZvcmJlcyBCcnlhbiBGb3JiZXMgWFhYIFRPRE8gTGljZW5zZSBvciBDTEENCi8vIC0tIGtpbGxkcmVhbSBRdWlsZHJlZW4gTW90dGEgQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbmNlDQovLyAtLSBtaWNoYWVsZmljYXJyYSBNaWNoYWVsIEZpY2FycmEgQ29weXJpZ2h0IChDKSAyMDExIDMtY2xhdXNlIEJTRCBMaWNlbnNlDQovLyAtLSBzaGFya2JyYWluZ3V5IEdlcmFyZCBQYWFwdSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIGJicXNyYyBCcmVuZGFuIE1vbGxveSAoQykgMjAxMSBDcmVhdGl2ZSBDb21tb25zIFplcm8gKHB1YmxpYyBkb21haW4pDQovLyAtLSBpd3lnIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBEb21lbmljRGVuaWNvbGEgRG9tZW5pYyBEZW5pY29sYSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIHhhdmllcm0wMiBNb250aWxsZXQgWGF2aWVyIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBSYXlub3MgUmF5bm9zIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBzYW1zb25qcyBTYW1pIFNhbWh1cmkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQovLyAtLSByd2xkcm4gUmljayBXYWxkcm9uIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0gbGV4ZXIgQWxleGV5IFpha2hhcm92IFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQoNCi8qIQ0KICAgIENvcHlyaWdodCAoYykgMjAwOSwgMjgwIE5vcnRoIEluYy4gaHR0cDovLzI4MG5vcnRoLmNvbS8NCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQNCiovDQoNCmRlZmluZSgnYWNlL2xpYi9lczUtc2hpbScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCi8qKg0KICogQnJpbmdzIGFuIGVudmlyb25tZW50IGFzIGNsb3NlIHRvIEVDTUFTY3JpcHQgNSBjb21wbGlhbmNlDQogKiBhcyBpcyBwb3NzaWJsZSB3aXRoIHRoZSBmYWNpbGl0aWVzIG9mIGVyc3R3aGlsZSBlbmdpbmVzLg0KICoNCiAqIEFubm90YXRlZCBFUzU6IGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8gKHNwZWNpZmljIGxpbmtzIGJlbG93KQ0KICogRVM1IFNwZWM6IGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FY21hLTI2Mi5wZGYNCiAqDQogKiBAbW9kdWxlDQogKi8NCg0KLyp3aGF0c3VwZG9jKi8NCg0KLy8NCi8vIEZ1bmN0aW9uDQovLyA9PT09PT09PQ0KLy8NCg0KLy8gRVMtNSAxNS4zLjQuNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMy40LjUNCg0KaWYgKCFGdW5jdGlvbi5wcm90b3R5cGUuYmluZCkgew0KICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7IC8vIC5sZW5ndGggaXMgMQ0KICAgICAgICAvLyAxLiBMZXQgVGFyZ2V0IGJlIHRoZSB0aGlzIHZhbHVlLg0KICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpczsNCiAgICAgICAgLy8gMi4gSWYgSXNDYWxsYWJsZShUYXJnZXQpIGlzIGZhbHNlLCB0aHJvdyBhIFR5cGVFcnJvciBleGNlcHRpb24uDQogICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9ICJmdW5jdGlvbiIpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICAvLyAzLiBMZXQgQSBiZSBhIG5ldyAocG9zc2libHkgZW1wdHkpIGludGVybmFsIGxpc3Qgb2YgYWxsIG9mIHRoZQ0KICAgICAgICAvLyAgIGFyZ3VtZW50IHZhbHVlcyBwcm92aWRlZCBhZnRlciB0aGlzQXJnIChhcmcxLCBhcmcyIGV0YyksIGluIG9yZGVyLg0KICAgICAgICAvLyBYWFggc2xpY2VkQXJncyB3aWxsIHN0YW5kIGluIGZvciAiQSIgaWYgdXNlZA0KICAgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsgLy8gZm9yIG5vcm1hbCBjYWxsDQogICAgICAgIC8vIDQuIExldCBGIGJlIGEgbmV3IG5hdGl2ZSBFQ01BU2NyaXB0IG9iamVjdC4NCiAgICAgICAgLy8gMTEuIFNldCB0aGUgW1tQcm90b3R5cGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRoZSBzdGFuZGFyZA0KICAgICAgICAvLyAgIGJ1aWx0LWluIEZ1bmN0aW9uIHByb3RvdHlwZSBvYmplY3QgYXMgc3BlY2lmaWVkIGluIDE1LjMuMy4xLg0KICAgICAgICAvLyAxMi4gU2V0IHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbg0KICAgICAgICAvLyAgIDE1LjMuNC41LjEuDQogICAgICAgIC8vIDEzLiBTZXQgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW4NCiAgICAgICAgLy8gICAxNS4zLjQuNS4yLg0KICAgICAgICAvLyAxNC4gU2V0IHRoZSBbW0hhc0luc3RhbmNlXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW4NCiAgICAgICAgLy8gICAxNS4zLjQuNS4zLg0KICAgICAgICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHsNCiAgICAgICAgICAgICAgICAvLyAxNS4zLjQuNS4yIFtbQ29uc3RydWN0XV0NCiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwNCiAgICAgICAgICAgICAgICAvLyBGIHRoYXQgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIGJpbmQgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYQ0KICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYXJndW1lbnRzIEV4dHJhQXJncywgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46DQogICAgICAgICAgICAgICAgLy8gMS4gTGV0IHRhcmdldCBiZSB0aGUgdmFsdWUgb2YgRidzIFtbVGFyZ2V0RnVuY3Rpb25dXQ0KICAgICAgICAgICAgICAgIC8vICAgaW50ZXJuYWwgcHJvcGVydHkuDQogICAgICAgICAgICAgICAgLy8gMi4gSWYgdGFyZ2V0IGhhcyBubyBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCwgYQ0KICAgICAgICAgICAgICAgIC8vICAgVHlwZUVycm9yIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQogICAgICAgICAgICAgICAgLy8gMy4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDQuIExldCBhcmdzIGJlIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlDQogICAgICAgICAgICAgICAgLy8gICBsaXN0IGJvdW5kQXJncyBpbiB0aGUgc2FtZSBvcmRlciBmb2xsb3dlZCBieSB0aGUgc2FtZQ0KICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4NCiAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIA0KICAgICAgICAgICAgICAgIC8vICAgbWV0aG9kIG9mIHRhcmdldCBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLg0KDQogICAgICAgICAgICAgICAgdmFyIEYgPSBmdW5jdGlvbigpe307DQogICAgICAgICAgICAgICAgRi5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlOw0KICAgICAgICAgICAgICAgIHZhciBzZWxmID0gbmV3IEY7DQoNCiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGFyZ2V0LmFwcGx5KA0KICAgICAgICAgICAgICAgICAgICBzZWxmLA0KICAgICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY7DQoNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgLy8gMTUuMy40LjUuMSBbW0NhbGxdXQ0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwgRiwNCiAgICAgICAgICAgICAgICAvLyB3aGljaCB3YXMgY3JlYXRlZCB1c2luZyB0aGUgYmluZCBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhDQogICAgICAgICAgICAgICAgLy8gdGhpcyB2YWx1ZSBhbmQgYSBsaXN0IG9mIGFyZ3VtZW50cyBFeHRyYUFyZ3MsIHRoZSBmb2xsb3dpbmcNCiAgICAgICAgICAgICAgICAvLyBzdGVwcyBhcmUgdGFrZW46DQogICAgICAgICAgICAgICAgLy8gMS4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDIuIExldCBib3VuZFRoaXMgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kVGhpc11dIGludGVybmFsDQogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyAzLiBMZXQgdGFyZ2V0IGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tUYXJnZXRGdW5jdGlvbl1dIGludGVybmFsDQogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyA0LiBMZXQgYXJncyBiZSBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSANCiAgICAgICAgICAgICAgICAvLyAgIGxpc3QgYm91bmRBcmdzIGluIHRoZSBzYW1lIG9yZGVyIGZvbGxvd2VkIGJ5IHRoZSBzYW1lIA0KICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4NCiAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2QgDQogICAgICAgICAgICAgICAgLy8gICBvZiB0YXJnZXQgcHJvdmlkaW5nIGJvdW5kVGhpcyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgDQogICAgICAgICAgICAgICAgLy8gICBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLg0KDQogICAgICAgICAgICAgICAgLy8gZXF1aXY6IHRhcmdldC5jYWxsKHRoaXMsIC4uLmJvdW5kQXJncywgLi4uYXJncykNCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KA0KICAgICAgICAgICAgICAgICAgICB0aGF0LA0KICAgICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH07DQogICAgICAgIC8vIFhYWCBib3VuZC5sZW5ndGggaXMgbmV2ZXIgd3JpdGFibGUsIHNvIGRvbid0IGV2ZW4gdHJ5DQogICAgICAgIC8vDQogICAgICAgIC8vIDE1LiBJZiB0aGUgW1tDbGFzc11dIGludGVybmFsIHByb3BlcnR5IG9mIFRhcmdldCBpcyAiRnVuY3Rpb24iLCB0aGVuDQogICAgICAgIC8vICAgICBhLiBMZXQgTCBiZSB0aGUgbGVuZ3RoIHByb3BlcnR5IG9mIFRhcmdldCBtaW51cyB0aGUgbGVuZ3RoIG9mIEEuDQogICAgICAgIC8vICAgICBiLiBTZXQgdGhlIGxlbmd0aCBvd24gcHJvcGVydHkgb2YgRiB0byBlaXRoZXIgMCBvciBMLCB3aGljaGV2ZXIgaXMgDQogICAgICAgIC8vICAgICAgIGxhcmdlci4NCiAgICAgICAgLy8gMTYuIEVsc2Ugc2V0IHRoZSBsZW5ndGggb3duIHByb3BlcnR5IG9mIEYgdG8gMC4NCiAgICAgICAgLy8gMTcuIFNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIHRoZSB2YWx1ZXMNCiAgICAgICAgLy8gICBzcGVjaWZpZWQgaW4gMTUuMy41LjEuDQoNCiAgICAgICAgLy8gVE9ETw0KICAgICAgICAvLyAxOC4gU2V0IHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRydWUuDQogICAgICAgIA0KICAgICAgICAvLyBUT0RPDQogICAgICAgIC8vIDE5LiBMZXQgdGhyb3dlciBiZSB0aGUgW1tUaHJvd1R5cGVFcnJvcl1dIGZ1bmN0aW9uIE9iamVjdCAoMTMuMi4zKS4NCiAgICAgICAgLy8gMjAuIENhbGwgdGhlIFtbRGVmaW5lT3duUHJvcGVydHldXSBpbnRlcm5hbCBtZXRob2Qgb2YgRiB3aXRoIA0KICAgICAgICAvLyAgIGFyZ3VtZW50cyAiY2FsbGVyIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCBbW1NldF1dOg0KICAgICAgICAvLyAgIHRocm93ZXIsIFtbRW51bWVyYWJsZV1dOiBmYWxzZSwgW1tDb25maWd1cmFibGVdXTogZmFsc2V9LCBhbmQgDQogICAgICAgIC8vICAgZmFsc2UuDQogICAgICAgIC8vIDIxLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aCANCiAgICAgICAgLy8gICBhcmd1bWVudHMgImFyZ3VtZW50cyIsIFByb3BlcnR5RGVzY3JpcHRvciB7W1tHZXRdXTogdGhyb3dlciwgDQogICAgICAgIC8vICAgW1tTZXRdXTogdGhyb3dlciwgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiBmYWxzZX0sDQogICAgICAgIC8vICAgYW5kIGZhbHNlLg0KDQogICAgICAgIC8vIFRPRE8NCiAgICAgICAgLy8gTk9URSBGdW5jdGlvbiBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgZG8gbm90IA0KICAgICAgICAvLyBoYXZlIGEgcHJvdG90eXBlIHByb3BlcnR5IG9yIHRoZSBbW0NvZGVdXSwgW1tGb3JtYWxQYXJhbWV0ZXJzXV0sIGFuZA0KICAgICAgICAvLyBbW1Njb3BlXV0gaW50ZXJuYWwgcHJvcGVydGllcy4NCiAgICAgICAgLy8gWFhYIGNhbid0IGRlbGV0ZSBwcm90b3R5cGUgaW4gcHVyZS1qcy4NCg0KICAgICAgICAvLyAyMi4gUmV0dXJuIEYuDQogICAgICAgIHJldHVybiBib3VuZDsNCiAgICB9Ow0KfQ0KDQovLyBTaG9ydGN1dCB0byBhbiBvZnRlbiBhY2Nlc3NlZCBwcm9wZXJ0aWVzLCBpbiBvcmRlciB0byBhdm9pZCBtdWx0aXBsZQ0KLy8gZGVyZWZlcmVuY2UgdGhhdCBjb3N0cyB1bml2ZXJzYWxseS4NCi8vIF9QbGVhc2Ugbm90ZTogU2hvcnRjdXRzIGFyZSBkZWZpbmVkIGFmdGVyIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgYXMgd2UNCi8vIHVzIGl0IGluIGRlZmluaW5nIHNob3J0Y3V0cy4NCnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7DQp2YXIgcHJvdG90eXBlT2ZBcnJheSA9IEFycmF5LnByb3RvdHlwZTsNCnZhciBwcm90b3R5cGVPZk9iamVjdCA9IE9iamVjdC5wcm90b3R5cGU7DQp2YXIgc2xpY2UgPSBwcm90b3R5cGVPZkFycmF5LnNsaWNlOw0KdmFyIHRvU3RyaW5nID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0LnRvU3RyaW5nKTsNCnZhciBvd25zID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Lmhhc093blByb3BlcnR5KTsNCg0KLy8gSWYgSlMgZW5naW5lIHN1cHBvcnRzIGFjY2Vzc29ycyBjcmVhdGluZyBzaG9ydGN1dHMuDQp2YXIgZGVmaW5lR2V0dGVyOw0KdmFyIGRlZmluZVNldHRlcjsNCnZhciBsb29rdXBHZXR0ZXI7DQp2YXIgbG9va3VwU2V0dGVyOw0KdmFyIHN1cHBvcnRzQWNjZXNzb3JzOw0KaWYgKChzdXBwb3J0c0FjY2Vzc29ycyA9IG93bnMocHJvdG90eXBlT2ZPYmplY3QsICJfX2RlZmluZUdldHRlcl9fIikpKSB7DQogICAgZGVmaW5lR2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fZGVmaW5lR2V0dGVyX18pOw0KICAgIGRlZmluZVNldHRlciA9IGNhbGwuYmluZChwcm90b3R5cGVPZk9iamVjdC5fX2RlZmluZVNldHRlcl9fKTsNCiAgICBsb29rdXBHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBHZXR0ZXJfXyk7DQogICAgbG9va3VwU2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fbG9va3VwU2V0dGVyX18pOw0KfQ0KDQovLw0KLy8gQXJyYXkNCi8vID09PT09DQovLw0KDQovLyBFUzUgMTUuNC4zLjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuMy4yDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pc0FycmF5DQppZiAoIUFycmF5LmlzQXJyYXkpIHsNCiAgICBBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gaXNBcnJheShvYmopIHsNCiAgICAgICAgcmV0dXJuIHRvU3RyaW5nKG9iaikgPT0gIltvYmplY3QgQXJyYXldIjsNCiAgICB9Ow0KfQ0KDQovLyBUaGUgSXNDYWxsYWJsZSgpIGNoZWNrIGluIHRoZSBBcnJheSBmdW5jdGlvbnMNCi8vIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSBzdHJpY3QgY2hlY2sgb24gdGhlDQovLyBpbnRlcm5hbCBjbGFzcyBvZiB0aGUgb2JqZWN0IHRvIHRyYXAgY2FzZXMgd2hlcmUNCi8vIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB3YXMgYWN0dWFsbHkgYSByZWd1bGFyDQovLyBleHByZXNzaW9uIGxpdGVyYWwsIHdoaWNoIGluIFY4IGFuZA0KLy8gSmF2YVNjcmlwdENvcmUgaXMgYSB0eXBlb2YgImZ1bmN0aW9uIi4gIE9ubHkgaW4NCi8vIFY4IGFyZSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbHMgcGVybWl0dGVkIGFzDQovLyByZWR1Y2UgcGFyYW1ldGVycywgc28gaXQgaXMgZGVzaXJhYmxlIGluIHRoZQ0KLy8gZ2VuZXJhbCBjYXNlIGZvciB0aGUgc2hpbSB0byBtYXRjaCB0aGUgbW9yZQ0KLy8gc3RyaWN0IGFuZCBjb21tb24gYmVoYXZpb3Igb2YgcmVqZWN0aW5nIHJlZ3VsYXINCi8vIGV4cHJlc3Npb25zLg0KDQovLyBFUzUgMTUuNC40LjE4DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTgNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2FycmF5L2ZvckVhY2gNCmlmICghQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIGZvckVhY2goZnVuIC8qLCB0aGlzcCovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXSwNCiAgICAgICAgICAgIGkgPSAwLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmKSB7DQogICAgICAgICAgICAgICAgLy8gSW52b2tlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGNhbGwsIHBhc3NpbmcgYXJndW1lbnRzOg0KICAgICAgICAgICAgICAgIC8vIGNvbnRleHQsIHByb3BlcnR5IHZhbHVlLCBwcm9wZXJ0eSBrZXksIHRoaXNBcmcgb2JqZWN0IGNvbnRleHQNCiAgICAgICAgICAgICAgICBmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpKys7DQogICAgICAgIH0NCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjE5DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTkNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvbWFwDQppZiAoIUFycmF5LnByb3RvdHlwZS5tYXApIHsNCiAgICBBcnJheS5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gbWFwKGZ1biAvKiwgdGhpc3AqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDAsDQogICAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpDQogICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4yMA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIwDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L2ZpbHRlcg0KaWYgKCFBcnJheS5wcm90b3R5cGUuZmlsdGVyKSB7DQogICAgQXJyYXkucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlcihmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHJlc3VsdCA9IFtdLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpKQ0KICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNlbGZbaV0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE2DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9ldmVyeQ0KaWYgKCFBcnJheS5wcm90b3R5cGUuZXZlcnkpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZXZlcnkgPSBmdW5jdGlvbiBldmVyeShmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmICFmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZikpDQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS40LjQuMTcNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xNw0KLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29tZQ0KaWYgKCFBcnJheS5wcm90b3R5cGUuc29tZSkgew0KICAgIEFycmF5LnByb3RvdHlwZS5zb21lID0gZnVuY3Rpb24gc29tZShmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4yMQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIxDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L3JlZHVjZQ0KaWYgKCFBcnJheS5wcm90b3R5cGUucmVkdWNlKSB7DQogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uIHJlZHVjZShmdW4gLyosIGluaXRpYWwqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlIGFuZCBhbiBlbXB0eSBhcnJheQ0KICAgICAgICBpZiAoIWxlbmd0aCAmJiBhcmd1bWVudHMubGVuZ3RoID09IDEpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KDQogICAgICAgIHZhciBpID0gMDsNCiAgICAgICAgdmFyIHJlc3VsdDsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpKytdOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuDQogICAgICAgICAgICAgICAgaWYgKCsraSA+PSBsZW5ndGgpDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuLmNhbGwodm9pZCAwLCByZXN1bHQsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjIyDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMjINCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvcmVkdWNlUmlnaHQNCmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0KSB7DQogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gcmVkdWNlUmlnaHQoZnVuIC8qLCBpbml0aWFsKi8pIHsNCiAgICAgICAgdmFyIHNlbGYgPSB0b09iamVjdCh0aGlzKSwNCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICAvLyBubyB2YWx1ZSB0byByZXR1cm4gaWYgbm8gaW5pdGlhbCB2YWx1ZSwgZW1wdHkgYXJyYXkNCiAgICAgICAgaWYgKCFsZW5ndGggJiYgYXJndW1lbnRzLmxlbmd0aCA9PSAxKQ0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCg0KICAgICAgICB2YXIgcmVzdWx0LCBpID0gbGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpLS1dOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuDQogICAgICAgICAgICAgICAgaWYgKC0taSA8IDApDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIGlmIChpIGluIHRoaXMpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuLmNhbGwodm9pZCAwLCByZXN1bHQsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9IHdoaWxlIChpLS0pOw0KDQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE0DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pbmRleE9mDQppZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7DQogICAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKHNvdWdodCAvKiwgZnJvbUluZGV4ICovICkgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgaWYgKCFsZW5ndGgpDQogICAgICAgICAgICByZXR1cm4gLTE7DQoNCiAgICAgICAgdmFyIGkgPSAwOw0KICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpDQogICAgICAgICAgICBpID0gdG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSk7DQoNCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMNCiAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBNYXRoLm1heCgwLCBsZW5ndGggKyBpKTsNCiAgICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiBzZWxmW2ldID09PSBzb3VnaHQpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE1DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9sYXN0SW5kZXhPZg0KaWYgKCFBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YpIHsNCiAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZihzb3VnaHQgLyosIGZyb21JbmRleCAqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgaWYgKCFsZW5ndGgpDQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIHZhciBpID0gbGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKQ0KICAgICAgICAgICAgaSA9IE1hdGgubWluKGksIHRvSW50ZWdlcihhcmd1bWVudHNbMV0pKTsNCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMNCiAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBsZW5ndGggLSBNYXRoLmFicyhpKTsNCiAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIHNvdWdodCA9PT0gc2VsZltpXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCn0NCg0KLy8NCi8vIE9iamVjdA0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgMTUuMi4zLjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4yDQppZiAoIU9iamVjdC5nZXRQcm90b3R5cGVPZikgew0KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvZXM1LXNoaW0vaXNzdWVzI2lzc3VlLzINCiAgICAvLyBodHRwOi8vZWpvaG4ub3JnL2Jsb2cvb2JqZWN0Z2V0cHJvdG90eXBlb2YvDQogICAgLy8gcmVjb21tZW5kZWQgYnkgZnNjaGFlZmVyIG9uIGdpdGh1Yg0KICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gb2JqZWN0Ll9fcHJvdG9fXyB8fCAoDQogICAgICAgICAgICBvYmplY3QuY29uc3RydWN0b3IgPw0KICAgICAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSA6DQogICAgICAgICAgICBwcm90b3R5cGVPZk9iamVjdA0KICAgICAgICApOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMw0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjMNCmlmICghT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcikgew0KICAgIHZhciBFUlJfTk9OX09CSkVDVCA9ICJPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIGNhbGxlZCBvbiBhICIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICJub24tb2JqZWN0OiAiOw0KICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgew0KICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9OT05fT0JKRUNUICsgb2JqZWN0KTsNCiAgICAgICAgLy8gSWYgb2JqZWN0IGRvZXMgbm90IG93bnMgcHJvcGVydHkgcmV0dXJuIHVuZGVmaW5lZCBpbW1lZGlhdGVseS4NCiAgICAgICAgaWYgKCFvd25zKG9iamVjdCwgcHJvcGVydHkpKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBkZXNjcmlwdG9yLCBnZXR0ZXIsIHNldHRlcjsNCg0KICAgICAgICAvLyBJZiBvYmplY3QgaGFzIGEgcHJvcGVydHkgdGhlbiBpdCdzIGZvciBzdXJlIGJvdGggYGVudW1lcmFibGVgIGFuZA0KICAgICAgICAvLyBgY29uZmlndXJhYmxlYC4NCiAgICAgICAgZGVzY3JpcHRvciA9ICB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9Ow0KDQogICAgICAgIC8vIElmIEpTIGVuZ2luZSBzdXBwb3J0cyBhY2Nlc3NvciBwcm9wZXJ0aWVzIHRoZW4gcHJvcGVydHkgbWF5IGJlIGENCiAgICAgICAgLy8gZ2V0dGVyIG9yIHNldHRlci4NCiAgICAgICAgaWYgKHN1cHBvcnRzQWNjZXNzb3JzKSB7DQogICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBhIGdldHRlciBldmVuDQogICAgICAgICAgICAvLyBpZiBvYmplY3QgaGFzIG93biBub24gZ2V0dGVyIHByb3BlcnR5IGFsb25nIHdpdGggYSBzYW1lIG5hbWVkDQogICAgICAgICAgICAvLyBpbmhlcml0ZWQgZ2V0dGVyLiBUbyBhdm9pZCBtaXNiZWhhdmlvciB3ZSB0ZW1wb3JhcnkgcmVtb3ZlDQogICAgICAgICAgICAvLyBgX19wcm90b19fYCBzbyB0aGF0IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBnZXR0ZXIgb25seQ0KICAgICAgICAgICAgLy8gaWYgaXQncyBvd25lZCBieSBhbiBvYmplY3QuDQogICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gb2JqZWN0Ll9fcHJvdG9fXzsNCiAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGVPZk9iamVjdDsNCg0KICAgICAgICAgICAgdmFyIGdldHRlciA9IGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KTsNCiAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSk7DQoNCiAgICAgICAgICAgIC8vIE9uY2Ugd2UgaGF2ZSBnZXR0ZXIgYW5kIHNldHRlciB3ZSBjYW4gcHV0IHZhbHVlcyBiYWNrLg0KICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsNCg0KICAgICAgICAgICAgaWYgKGdldHRlciB8fCBzZXR0ZXIpIHsNCiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSBkZXNjcmlwdG9yLmdldCA9IGdldHRlcjsNCiAgICAgICAgICAgICAgICBpZiAoc2V0dGVyKSBkZXNjcmlwdG9yLnNldCA9IHNldHRlcjsNCg0KICAgICAgICAgICAgICAgIC8vIElmIGl0IHdhcyBhY2Nlc3NvciBwcm9wZXJ0eSB3ZSdyZSBkb25lIGFuZCByZXR1cm4gaGVyZQ0KICAgICAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGF2b2lkIGFkZGluZyBgdmFsdWVgIHRvIHRoZSBkZXNjcmlwdG9yLg0KICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyIHdlIGtub3cgdGhhdCBvYmplY3QgaGFzIGFuIG93biBwcm9wZXJ0eSB0aGF0IGlzDQogICAgICAgIC8vIG5vdCBhbiBhY2Nlc3NvciBzbyB3ZSBzZXQgaXQgYXMgYSB2YWx1ZSBhbmQgcmV0dXJuIGRlc2NyaXB0b3IuDQogICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBvYmplY3RbcHJvcGVydHldOw0KICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy40DQppZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7DQogICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjUNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy41DQppZiAoIU9iamVjdC5jcmVhdGUpIHsNCiAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgew0KICAgICAgICB2YXIgb2JqZWN0Ow0KICAgICAgICBpZiAocHJvdG90eXBlID09PSBudWxsKSB7DQogICAgICAgICAgICBvYmplY3QgPSB7ICJfX3Byb3RvX18iOiBudWxsIH07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAodHlwZW9mIHByb3RvdHlwZSAhPSAib2JqZWN0IikNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlb2YgcHJvdG90eXBlWyIrKHR5cGVvZiBwcm90b3R5cGUpKyJdICE9ICdvYmplY3QnIik7DQogICAgICAgICAgICB2YXIgVHlwZSA9IGZ1bmN0aW9uICgpIHt9Ow0KICAgICAgICAgICAgVHlwZS5wcm90b3R5cGUgPSBwcm90b3R5cGU7DQogICAgICAgICAgICBvYmplY3QgPSBuZXcgVHlwZSgpOw0KICAgICAgICAgICAgLy8gSUUgaGFzIG5vIGJ1aWx0LWluIGltcGxlbWVudGF0aW9uIG9mIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgDQogICAgICAgICAgICAvLyBuZWl0aGVyIGBfX3Byb3RvX19gLCBidXQgdGhpcyBtYW51YWxseSBzZXR0aW5nIGBfX3Byb3RvX19gIHdpbGwNCiAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIHdpbGwgd29yayBhcyBleHBlY3RlZCB3aXRoDQogICAgICAgICAgICAvLyBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgYE9iamVjdC5jcmVhdGVgDQogICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KICAgICAgICB9DQogICAgICAgIGlmIChwcm9wZXJ0aWVzICE9PSB2b2lkIDApDQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpOw0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuNg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjYNCg0KLy8gUGF0Y2ggZm9yIFdlYktpdCBhbmQgSUU4IHN0YW5kYXJkIG1vZGUNCi8vIERlc2lnbmVkIGJ5IGhheCA8aGF4LmdpdGh1Yi5jb20+DQovLyByZWxhdGVkIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL2VzNS1zaGltL2lzc3VlcyNpc3N1ZS81DQovLyBJRTggUmVmZXJlbmNlOg0KLy8gICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZDI4MjkwMC5hc3B4DQovLyAgICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMjI5OTE2LmFzcHgNCi8vIFdlYktpdCBCdWdzOg0KLy8gICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNjQyMw0KDQpmdW5jdGlvbiBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKG9iamVjdCkgew0KICAgIHRyeSB7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsICJzZW50aW5lbCIsIHt9KTsNCiAgICAgICAgcmV0dXJuICJzZW50aW5lbCIgaW4gb2JqZWN0Ow0KICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgew0KICAgICAgICAvLyByZXR1cm5zIGZhbHN5DQogICAgfQ0KfQ0KDQovLyBjaGVjayB3aGV0aGVyIGRlZmluZVByb3BlcnR5IHdvcmtzIGlmIGl0J3MgZ2l2ZW4uIE90aGVyd2lzZSwNCi8vIHNoaW0gcGFydGlhbGx5Lg0KaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgew0KICAgIHZhciBkZWZpbmVQcm9wZXJ0eVdvcmtzT25PYmplY3QgPSBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKHt9KTsNCiAgICB2YXIgZGVmaW5lUHJvcGVydHlXb3Jrc09uRG9tID0gdHlwZW9mIGRvY3VtZW50ID09ICJ1bmRlZmluZWQiIHx8DQogICAgICAgIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOw0KICAgIGlmICghZGVmaW5lUHJvcGVydHlXb3Jrc09uT2JqZWN0IHx8ICFkZWZpbmVQcm9wZXJ0eVdvcmtzT25Eb20pIHsNCiAgICAgICAgdmFyIGRlZmluZVByb3BlcnR5RmFsbGJhY2sgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7DQogICAgfQ0KfQ0KDQppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUX0RFU0NSSVBUT1IgPSAiUHJvcGVydHkgZGVzY3JpcHRpb24gbXVzdCBiZSBhbiBvYmplY3Q6ICI7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUX1RBUkdFVCA9ICJPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbGVkIG9uIG5vbi1vYmplY3Q6ICINCiAgICB2YXIgRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEID0gImdldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCAiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgamF2YXNjcmlwdCBlbmdpbmUiOw0KDQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcikgew0KICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9OT05fT0JKRUNUX1RBUkdFVCArIG9iamVjdCk7DQogICAgICAgIGlmICgodHlwZW9mIGRlc2NyaXB0b3IgIT0gIm9iamVjdCIgJiYgdHlwZW9mIGRlc2NyaXB0b3IgIT0gImZ1bmN0aW9uIikgfHwgZGVzY3JpcHRvciA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX05PTl9PQkpFQ1RfREVTQ1JJUFRPUiArIGRlc2NyaXB0b3IpOw0KDQogICAgICAgIC8vIG1ha2UgYSB2YWxpYW50IGF0dGVtcHQgdG8gdXNlIHRoZSByZWFsIGRlZmluZVByb3BlcnR5DQogICAgICAgIC8vIGZvciBJOCdzIERPTSBlbGVtZW50cy4NCiAgICAgICAgaWYgKGRlZmluZVByb3BlcnR5RmFsbGJhY2spIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5RmFsbGJhY2suY2FsbChPYmplY3QsIG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3IpOw0KICAgICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7DQogICAgICAgICAgICAgICAgLy8gdHJ5IHRoZSBzaGltIGlmIHRoZSByZWFsIG9uZSBkb2Vzbid0IHdvcmsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIElmIGl0J3MgYSBkYXRhIHByb3BlcnR5Lg0KICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAidmFsdWUiKSkgew0KICAgICAgICAgICAgLy8gZmFpbCBzaWxlbnRseSBpZiAid3JpdGFibGUiLCAiZW51bWVyYWJsZSIsIG9yICJjb25maWd1cmFibGUiDQogICAgICAgICAgICAvLyBhcmUgcmVxdWVzdGVkIGJ1dCBub3Qgc3VwcG9ydGVkDQogICAgICAgICAgICAvKg0KICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGFwcHJvYWNoOg0KICAgICAgICAgICAgaWYgKCAvLyBjYW4ndCBpbXBsZW1lbnQgdGhlc2UgZmVhdHVyZXM7IGFsbG93IGZhbHNlIGJ1dCBub3QgdHJ1ZQ0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAid3JpdGFibGUiKSA/IGRlc2NyaXB0b3Iud3JpdGFibGUgOiB0cnVlKSB8fA0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiZW51bWVyYWJsZSIpID8gZGVzY3JpcHRvci5lbnVtZXJhYmxlIDogdHJ1ZSkgfHwNCiAgICAgICAgICAgICAgICAhKG93bnMoZGVzY3JpcHRvciwgImNvbmZpZ3VyYWJsZSIpID8gZGVzY3JpcHRvci5jb25maWd1cmFibGUgOiB0cnVlKQ0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKA0KICAgICAgICAgICAgICAgICAgICAiVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgZG9lcyBub3QgIiArDQogICAgICAgICAgICAgICAgICAgICJzdXBwb3J0IGNvbmZpZ3VyYWJsZSwgZW51bWVyYWJsZSwgb3Igd3JpdGFibGUuIg0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAqLw0KDQogICAgICAgICAgICBpZiAoc3VwcG9ydHNBY2Nlc3NvcnMgJiYgKGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KSB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSkpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIEFzIGFjY2Vzc29ycyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gZW5naW5lcyBpbXBsZW1lbnRpbmcNCiAgICAgICAgICAgICAgICAvLyBgX19wcm90b19fYCB3ZSBjYW4gc2FmZWx5IG92ZXJyaWRlIGBfX3Byb3RvX19gIHdoaWxlIGRlZmluaW5nDQogICAgICAgICAgICAgICAgLy8gYSBwcm9wZXJ0eSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBoaXQgYW4gaW5oZXJpdGVkDQogICAgICAgICAgICAgICAgLy8gYWNjZXNzb3IuDQogICAgICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IG9iamVjdC5fX3Byb3RvX187DQogICAgICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZU9mT2JqZWN0Ow0KICAgICAgICAgICAgICAgIC8vIERlbGV0aW5nIGEgcHJvcGVydHkgYW55d2F5IHNpbmNlIGdldHRlciAvIHNldHRlciBtYXkgYmUNCiAgICAgICAgICAgICAgICAvLyBkZWZpbmVkIG9uIG9iamVjdCBpdHNlbGYuDQogICAgICAgICAgICAgICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV07DQogICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IGRlc2NyaXB0b3IudmFsdWU7DQogICAgICAgICAgICAgICAgLy8gU2V0dGluZyBvcmlnaW5hbCBgX19wcm90b19fYCBiYWNrIG5vdy4NCiAgICAgICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBvYmplY3RbcHJvcGVydHldID0gZGVzY3JpcHRvci52YWx1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICghc3VwcG9ydHNBY2Nlc3NvcnMpDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfQUNDRVNTT1JTX05PVF9TVVBQT1JURUQpOw0KICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoYXQgZmFyIHRoZW4gZ2V0dGVycyBhbmQgc2V0dGVycyBjYW4gYmUgZGVmaW5lZCAhIQ0KICAgICAgICAgICAgaWYgKG93bnMoZGVzY3JpcHRvciwgImdldCIpKQ0KICAgICAgICAgICAgICAgIGRlZmluZUdldHRlcihvYmplY3QsIHByb3BlcnR5LCBkZXNjcmlwdG9yLmdldCk7DQogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAic2V0IikpDQogICAgICAgICAgICAgICAgZGVmaW5lU2V0dGVyKG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3Iuc2V0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy43DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNw0KaWYgKCFPYmplY3QuZGVmaW5lUHJvcGVydGllcykgew0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpIHsNCiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllcykgew0KICAgICAgICAgICAgaWYgKG93bnMocHJvcGVydGllcywgcHJvcGVydHkpKQ0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBwcm9wZXJ0aWVzW3Byb3BlcnR5XSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG9iamVjdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjgNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy44DQppZiAoIU9iamVjdC5zZWFsKSB7DQogICAgT2JqZWN0LnNlYWwgPSBmdW5jdGlvbiBzZWFsKG9iamVjdCkgew0KICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0DQogICAgICAgIC8vIGFsbG93cyAic2VjdXJhYmxlIiBjb2RlIHRvICJncmFjZWZ1bGx5IiBkZWdyYWRlIHRvIHdvcmtpbmcNCiAgICAgICAgLy8gYnV0IGluc2VjdXJlIGNvZGUuDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy45DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuOQ0KaWYgKCFPYmplY3QuZnJlZXplKSB7DQogICAgT2JqZWN0LmZyZWV6ZSA9IGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHsNCiAgICAgICAgLy8gdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCBicmVha3MgZmVhdHVyZS1kZXRlY3Rpb24sIGJ1dA0KICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nDQogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLg0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIGRldGVjdCBhIFJoaW5vIGJ1ZyBhbmQgcGF0Y2ggaXQNCnRyeSB7DQogICAgT2JqZWN0LmZyZWV6ZShmdW5jdGlvbiAoKSB7fSk7DQp9IGNhdGNoIChleGNlcHRpb24pIHsNCiAgICBPYmplY3QuZnJlZXplID0gKGZ1bmN0aW9uIGZyZWV6ZShmcmVlemVPYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHsNCiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09ICJmdW5jdGlvbiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplT2JqZWN0KG9iamVjdCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgfSkoT2JqZWN0LmZyZWV6ZSk7DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTANCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMA0KaWYgKCFPYmplY3QucHJldmVudEV4dGVuc2lvbnMpIHsNCiAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPSBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhvYmplY3QpIHsNCiAgICAgICAgLy8gdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCBicmVha3MgZmVhdHVyZS1kZXRlY3Rpb24sIGJ1dA0KICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nDQogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLg0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTENCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMQ0KaWYgKCFPYmplY3QuaXNTZWFsZWQpIHsNCiAgICBPYmplY3QuaXNTZWFsZWQgPSBmdW5jdGlvbiBpc1NlYWxlZChvYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMg0KaWYgKCFPYmplY3QuaXNGcm96ZW4pIHsNCiAgICBPYmplY3QuaXNGcm96ZW4gPSBmdW5jdGlvbiBpc0Zyb3plbihvYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTMNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMw0KaWYgKCFPYmplY3QuaXNFeHRlbnNpYmxlKSB7DQogICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShvYmplY3QpIHsNCiAgICAgICAgLy8gMS4gSWYgVHlwZShPKSBpcyBub3QgT2JqZWN0IHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKE9iamVjdChvYmplY3QpID09PSBvYmplY3QpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCiAgICAgICAgLy8gMi4gUmV0dXJuIHRoZSBCb29sZWFuIHZhbHVlIG9mIHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBPLg0KICAgICAgICB2YXIgbmFtZSA9ICcnOw0KICAgICAgICB3aGlsZSAob3ducyhvYmplY3QsIG5hbWUpKSB7DQogICAgICAgICAgICBuYW1lICs9ICc/JzsNCiAgICAgICAgfQ0KICAgICAgICBvYmplY3RbbmFtZV0gPSB0cnVlOw0KICAgICAgICB2YXIgcmV0dXJuVmFsdWUgPSBvd25zKG9iamVjdCwgbmFtZSk7DQogICAgICAgIGRlbGV0ZSBvYmplY3RbbmFtZV07DQogICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjE0DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTQNCmlmICghT2JqZWN0LmtleXMpIHsNCiAgICAvLyBodHRwOi8vd2hhdHRoZWhlYWRzYWlkLmNvbS8yMDEwLzEwL2Etc2FmZXItb2JqZWN0LWtleXMtY29tcGF0aWJpbGl0eS1pbXBsZW1lbnRhdGlvbg0KICAgIHZhciBoYXNEb250RW51bUJ1ZyA9IHRydWUsDQogICAgICAgIGRvbnRFbnVtcyA9IFsNCiAgICAgICAgICAgICJ0b1N0cmluZyIsDQogICAgICAgICAgICAidG9Mb2NhbGVTdHJpbmciLA0KICAgICAgICAgICAgInZhbHVlT2YiLA0KICAgICAgICAgICAgImhhc093blByb3BlcnR5IiwNCiAgICAgICAgICAgICJpc1Byb3RvdHlwZU9mIiwNCiAgICAgICAgICAgICJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsDQogICAgICAgICAgICAiY29uc3RydWN0b3IiDQogICAgICAgIF0sDQogICAgICAgIGRvbnRFbnVtc0xlbmd0aCA9IGRvbnRFbnVtcy5sZW5ndGg7DQoNCiAgICBmb3IgKHZhciBrZXkgaW4geyJ0b1N0cmluZyI6IG51bGx9KQ0KICAgICAgICBoYXNEb250RW51bUJ1ZyA9IGZhbHNlOw0KDQogICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgew0KDQogICAgICAgIGlmICgodHlwZW9mIG9iamVjdCAhPSAib2JqZWN0IiAmJiB0eXBlb2Ygb2JqZWN0ICE9ICJmdW5jdGlvbiIpIHx8IG9iamVjdCA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTsNCg0KICAgICAgICB2YXIga2V5cyA9IFtdOw0KICAgICAgICBmb3IgKHZhciBuYW1lIGluIG9iamVjdCkgew0KICAgICAgICAgICAgaWYgKG93bnMob2JqZWN0LCBuYW1lKSkgew0KICAgICAgICAgICAgICAgIGtleXMucHVzaChuYW1lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChoYXNEb250RW51bUJ1Zykgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZG9udEVudW1zTGVuZ3RoOyBpIDwgaWk7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBkb250RW51bSA9IGRvbnRFbnVtc1tpXTsNCiAgICAgICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIGRvbnRFbnVtKSkgew0KICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goZG9udEVudW0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBrZXlzOw0KICAgIH07DQoNCn0NCg0KLy8NCi8vIERhdGUNCi8vID09PT0NCi8vDQoNCi8vIEVTNSAxNS45LjUuNDMNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40Mw0KLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHJlcHJlc2VudCB0aGUgaW5zdGFuY2UgaW4gdGltZSANCi8vIHJlcHJlc2VudGVkIGJ5IHRoaXMgRGF0ZSBvYmplY3QuIFRoZSBmb3JtYXQgb2YgdGhlIFN0cmluZyBpcyB0aGUgRGF0ZSBUaW1lIA0KLy8gc3RyaW5nIGZvcm1hdCBkZWZpbmVkIGluIDE1LjkuMS4xNS4gQWxsIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgU3RyaW5nLiANCi8vIFRoZSB0aW1lIHpvbmUgaXMgYWx3YXlzIFVUQywgZGVub3RlZCBieSB0aGUgc3VmZml4IFouIElmIHRoZSB0aW1lIHZhbHVlIG9mIA0KLy8gdGhpcyBvYmplY3QgaXMgbm90IGEgZmluaXRlIE51bWJlciBhIFJhbmdlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi4NCmlmICghRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgfHwgKG5ldyBEYXRlKC02MjE5ODc1NTIwMDAwMCkudG9JU09TdHJpbmcoKS5pbmRleE9mKCctMDAwMDAxJykgPT09IC0xKSkgew0KICAgIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7DQogICAgICAgIHZhciByZXN1bHQsIGxlbmd0aCwgdmFsdWUsIHllYXI7DQogICAgICAgIGlmICghaXNGaW5pdGUodGhpcykpDQogICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcjsNCg0KICAgICAgICAvLyB0aGUgZGF0ZSB0aW1lIHN0cmluZyBmb3JtYXQgaXMgc3BlY2lmaWVkIGluIDE1LjkuMS4xNS4NCiAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2V0VVRDTW9udGgoKSArIDEsIHRoaXMuZ2V0VVRDRGF0ZSgpLA0KICAgICAgICAgICAgdGhpcy5nZXRVVENIb3VycygpLCB0aGlzLmdldFVUQ01pbnV0ZXMoKSwgdGhpcy5nZXRVVENTZWNvbmRzKCldOw0KICAgICAgICB5ZWFyID0gdGhpcy5nZXRVVENGdWxsWWVhcigpOw0KICAgICAgICB5ZWFyID0gKHllYXIgPCAwID8gJy0nIDogKHllYXIgPiA5OTk5ID8gJysnIDogJycpKSArICgnMDAwMDAnICsgTWF0aC5hYnMoeWVhcikpLnNsaWNlKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5OTkgPyAtNCA6IC02KTsNCg0KICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoOw0KICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsNCiAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0W2xlbmd0aF07DQogICAgICAgICAgICAvLyBwYWQgbW9udGhzLCBkYXlzLCBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMgdG8gaGF2ZSB0d28gZGlnaXRzLg0KICAgICAgICAgICAgaWYgKHZhbHVlIDwgMTApDQogICAgICAgICAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSAiMCIgKyB2YWx1ZTsNCiAgICAgICAgfQ0KICAgICAgICAvLyBwYWQgbWlsbGlzZWNvbmRzIHRvIGhhdmUgdGhyZWUgZGlnaXRzLg0KICAgICAgICByZXR1cm4geWVhciArICItIiArIHJlc3VsdC5zbGljZSgwLCAyKS5qb2luKCItIikgKyAiVCIgKyByZXN1bHQuc2xpY2UoMikuam9pbigiOiIpICsgIi4iICsNCiAgICAgICAgICAgICgiMDAwIiArIHRoaXMuZ2V0VVRDTWlsbGlzZWNvbmRzKCkpLnNsaWNlKC0zKSArICJaIjsNCiAgICB9DQp9DQoNCi8vIEVTNSAxNS45LjQuNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuOS40LjQNCmlmICghRGF0ZS5ub3cpIHsNCiAgICBEYXRlLm5vdyA9IGZ1bmN0aW9uIG5vdygpIHsNCiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS45LjUuNDQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40NA0KLy8gVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIERhdGUgb2JqZWN0IGZvciB1c2UgYnkgDQovLyBKU09OLnN0cmluZ2lmeSAoMTUuMTIuMykuDQppZiAoIURhdGUucHJvdG90eXBlLnRvSlNPTikgew0KICAgIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHsNCiAgICAgICAgLy8gV2hlbiB0aGUgdG9KU09OIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhcmd1bWVudCBrZXksIHRoZSBmb2xsb3dpbmcgDQogICAgICAgIC8vIHN0ZXBzIGFyZSB0YWtlbjoNCg0KICAgICAgICAvLyAxLiAgTGV0IE8gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFRvT2JqZWN0LCBnaXZpbmcgaXQgdGhlIHRoaXMNCiAgICAgICAgLy8gdmFsdWUgYXMgaXRzIGFyZ3VtZW50Lg0KICAgICAgICAvLyAyLiBMZXQgdHYgYmUgVG9QcmltaXRpdmUoTywgaGludCBOdW1iZXIpLg0KICAgICAgICAvLyAzLiBJZiB0diBpcyBhIE51bWJlciBhbmQgaXMgbm90IGZpbml0ZSwgcmV0dXJuIG51bGwuDQogICAgICAgIC8vIFhYWA0KICAgICAgICAvLyA0LiBMZXQgdG9JU08gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0dldF1dIGludGVybmFsIG1ldGhvZCBvZg0KICAgICAgICAvLyBPIHdpdGggYXJndW1lbnQgInRvSVNPU3RyaW5nIi4NCiAgICAgICAgLy8gNS4gSWYgSXNDYWxsYWJsZSh0b0lTTykgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRvSVNPU3RyaW5nICE9ICJmdW5jdGlvbiIpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICAvLyA2LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2Qgb2YNCiAgICAgICAgLy8gIHRvSVNPIHdpdGggTyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgYW4gZW1wdHkgYXJndW1lbnQgbGlzdC4NCiAgICAgICAgcmV0dXJuIHRoaXMudG9JU09TdHJpbmcoKTsNCg0KICAgICAgICAvLyBOT1RFIDEgVGhlIGFyZ3VtZW50IGlzIGlnbm9yZWQuDQoNCiAgICAgICAgLy8gTk9URSAyIFRoZSB0b0pTT04gZnVuY3Rpb24gaXMgaW50ZW50aW9uYWxseSBnZW5lcmljOyBpdCBkb2VzIG5vdA0KICAgICAgICAvLyByZXF1aXJlIHRoYXQgaXRzIHRoaXMgdmFsdWUgYmUgYSBEYXRlIG9iamVjdC4gVGhlcmVmb3JlLCBpdCBjYW4gYmUNCiAgICAgICAgLy8gdHJhbnNmZXJyZWQgdG8gb3RoZXIga2luZHMgb2Ygb2JqZWN0cyBmb3IgdXNlIGFzIGEgbWV0aG9kLiBIb3dldmVyLA0KICAgICAgICAvLyBpdCBkb2VzIHJlcXVpcmUgdGhhdCBhbnkgc3VjaCBvYmplY3QgaGF2ZSBhIHRvSVNPU3RyaW5nIG1ldGhvZC4gQW4NCiAgICAgICAgLy8gb2JqZWN0IGlzIGZyZWUgdG8gdXNlIHRoZSBhcmd1bWVudCBrZXkgdG8gZmlsdGVyIGl0cw0KICAgICAgICAvLyBzdHJpbmdpZmljYXRpb24uDQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjkuNC4yDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjQuMg0KLy8gYmFzZWQgb24gd29yayBzaGFyZWQgYnkgRGFuaWVsIEZyaWVzZW4gKGRhbnRtYW4pDQovLyBodHRwOi8vZ2lzdC5naXRodWIuY29tLzMwMzI0OQ0KaWYgKERhdGUucGFyc2UoIisyNzU3NjAtMDktMTNUMDA6MDA6MDAuMDAwWiIpICE9PSA4LjY0ZTE1KSB7DQogICAgLy8gWFhYIGdsb2JhbCBhc3NpZ25tZW50IHdvbid0IHdvcmsgaW4gZW1iZWRkaW5ncyB0aGF0IHVzZQ0KICAgIC8vIGFuIGFsdGVybmF0ZSBvYmplY3QgZm9yIHRoZSBjb250ZXh0Lg0KICAgIERhdGUgPSAoZnVuY3Rpb24oTmF0aXZlRGF0ZSkgew0KDQogICAgICAgIC8vIERhdGUubGVuZ3RoID09PSA3DQogICAgICAgIHZhciBEYXRlID0gZnVuY3Rpb24gRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgew0KICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7DQogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE5hdGl2ZURhdGUpIHsNCiAgICAgICAgICAgICAgICB2YXIgZGF0ZSA9IGxlbmd0aCA9PSAxICYmIFN0cmluZyhZKSA9PT0gWSA/IC8vIGlzU3RyaW5nKFkpDQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGV4cGxpY2l0bHkgcGFzcyBpdCB0aHJvdWdoIHBhcnNlOg0KICAgICAgICAgICAgICAgICAgICBuZXcgTmF0aXZlRGF0ZShEYXRlLnBhcnNlKFkpKSA6DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gbWFudWFsbHkgbWFrZSBjYWxscyBkZXBlbmRpbmcgb24gYXJndW1lbnQNCiAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIGhlcmUNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDcgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gNiA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQsIGgsIG0sIHMpIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDUgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA0ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCkgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gMyA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQpIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDIgPyBuZXcgTmF0aXZlRGF0ZShZLCBNKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAxID8gbmV3IE5hdGl2ZURhdGUoWSkgOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOYXRpdmVEYXRlKCk7DQogICAgICAgICAgICAgICAgLy8gUHJldmVudCBtaXh1cHMgd2l0aCB1bmZpeGVkIERhdGUgb2JqZWN0DQogICAgICAgICAgICAgICAgZGF0ZS5jb25zdHJ1Y3RvciA9IERhdGU7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICB9Ow0KDQogICAgICAgIC8vIDE1LjkuMS4xNSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdC4NCiAgICAgICAgdmFyIGlzb0RhdGVFeHByZXNzaW9uID0gbmV3IFJlZ0V4cCgiXiIgKw0KICAgICAgICAgICAgIihcXGR7NH18W1wrXC1dXFxkezZ9KSIgKyAvLyBmb3VyLWRpZ2l0IHllYXIgY2FwdHVyZSBvciBzaWduICsgNi1kaWdpdCBleHRlbmRlZCB5ZWFyDQogICAgICAgICAgICAiKD86LShcXGR7Mn0pIiArIC8vIG9wdGlvbmFsIG1vbnRoIGNhcHR1cmUNCiAgICAgICAgICAgICIoPzotKFxcZHsyfSkiICsgLy8gb3B0aW9uYWwgZGF5IGNhcHR1cmUNCiAgICAgICAgICAgICIoPzoiICsgLy8gY2FwdHVyZSBob3VyczptaW51dGVzOnNlY29uZHMubWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgIlQoXFxkezJ9KSIgKyAvLyBob3VycyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIjooXFxkezJ9KSIgKyAvLyBtaW51dGVzIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAiKD86IiArIC8vIG9wdGlvbmFsIDpzZWNvbmRzLm1pbGxpc2Vjb25kcw0KICAgICAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIHNlY29uZHMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICAgICAiKD86XFwuKFxcZHszfSkpPyIgKyAvLyBtaWxsaXNlY29uZHMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIpPyIgKw0KICAgICAgICAgICAgIig/OiIgKyAvLyBjYXB0dXJlIFVUQyBvZmZzZXQgY29tcG9uZW50DQogICAgICAgICAgICAgICAgIlp8IiArIC8vIFVUQyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIig/OiIgKyAvLyBvZmZzZXQgc3BlY2lmaWVyICsvLWhvdXJzOm1pbnV0ZXMNCiAgICAgICAgICAgICAgICAgICAgIihbLStdKSIgKyAvLyBzaWduIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAgICAgIihcXGR7Mn0pIiArIC8vIGhvdXJzIG9mZnNldCBjYXB0dXJlDQogICAgICAgICAgICAgICAgICAgICI6KFxcZHsyfSkiICsgLy8gbWludXRlcyBvZmZzZXQgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIpIiArDQogICAgICAgICAgICAiKT8pPyk/KT8iICsNCiAgICAgICAgIiQiKTsNCg0KICAgICAgICAvLyBDb3B5IGFueSBjdXN0b20gbWV0aG9kcyBhIDNyZCBwYXJ0eSBsaWJyYXJ5IG1heSBoYXZlIGFkZGVkDQogICAgICAgIGZvciAodmFyIGtleSBpbiBOYXRpdmVEYXRlKQ0KICAgICAgICAgICAgRGF0ZVtrZXldID0gTmF0aXZlRGF0ZVtrZXldOw0KDQogICAgICAgIC8vIENvcHkgIm5hdGl2ZSIgbWV0aG9kcyBleHBsaWNpdGx5OyB0aGV5IG1heSBiZSBub24tZW51bWVyYWJsZQ0KICAgICAgICBEYXRlLm5vdyA9IE5hdGl2ZURhdGUubm93Ow0KICAgICAgICBEYXRlLlVUQyA9IE5hdGl2ZURhdGUuVVRDOw0KICAgICAgICBEYXRlLnByb3RvdHlwZSA9IE5hdGl2ZURhdGUucHJvdG90eXBlOw0KICAgICAgICBEYXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGU7DQoNCiAgICAgICAgLy8gVXBncmFkZSBEYXRlLnBhcnNlIHRvIGhhbmRsZSBzaW1wbGlmaWVkIElTTyA4NjAxIHN0cmluZ3MNCiAgICAgICAgRGF0ZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKHN0cmluZykgew0KICAgICAgICAgICAgdmFyIG1hdGNoID0gaXNvRGF0ZUV4cHJlc3Npb24uZXhlYyhzdHJpbmcpOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgbWF0Y2guc2hpZnQoKTsgLy8ga2lsbCBtYXRjaFswXSwgdGhlIGZ1bGwgbWF0Y2gNCiAgICAgICAgICAgICAgICAvLyBwYXJzZSBtb250aHMsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgbWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA3OyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBpZiBuZWNlc3NhcnkNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0gPSArKG1hdGNoW2ldIHx8IChpIDwgMyA/IDEgOiAwKSk7DQogICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoWzFdIGlzIHRoZSBtb250aC4gTW9udGhzIGFyZSAwLTExIGluIEphdmFTY3JpcHQNCiAgICAgICAgICAgICAgICAgICAgLy8gYERhdGVgIG9iamVjdHMsIGJ1dCAxLTEyIGluIElTTyBub3RhdGlvbiwgc28gd2UNCiAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50Lg0KICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0tLTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgVVRDIG9mZnNldCBjb21wb25lbnQNCiAgICAgICAgICAgICAgICB2YXIgbWludXRlT2Zmc2V0ID0gK21hdGNoLnBvcCgpLCBob3VyT2Zmc2V0ID0gK21hdGNoLnBvcCgpLCBzaWduID0gbWF0Y2gucG9wKCk7DQoNCiAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBleHBsaWNpdCB0aW1lIHpvbmUgb2Zmc2V0IGlmIHNwZWNpZmllZA0KICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwOw0KICAgICAgICAgICAgICAgIGlmIChzaWduKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIGRldGVjdCBpbnZhbGlkIG9mZnNldHMgYW5kIHJldHVybiBlYXJseQ0KICAgICAgICAgICAgICAgICAgICBpZiAoaG91ck9mZnNldCA+IDIzIHx8IG1pbnV0ZU9mZnNldCA+IDU5KQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hTjsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBleHByZXNzIHRoZSBwcm92aWRlZCB0aW1lIHpvbmUgb2Zmc2V0IGluIG1pbnV0ZXMuIFRoZSBvZmZzZXQgaXMNCiAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgZm9yIHRpbWUgem9uZXMgd2VzdCBvZiBVVEM7IHBvc2l0aXZlIG90aGVyd2lzZS4NCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGhvdXJPZmZzZXQgKiA2MCArIG1pbnV0ZU9mZnNldCkgKiA2ZTQgKiAoc2lnbiA9PSAiKyIgPyAtMSA6IDEpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIERhdGUuVVRDIGZvciB5ZWFycyBiZXR3ZWVuIDAgYW5kIDk5IGNvbnZlcnRzIHllYXIgdG8gMTkwMCArIHllYXINCiAgICAgICAgICAgICAgICAvLyBUaGUgR3JlZ29yaWFuIGNhbGVuZGFyIGhhcyBhIDQwMC15ZWFyIGN5Y2xlLCBzbyANCiAgICAgICAgICAgICAgICAvLyB0byBEYXRlLlVUQyh5ZWFyICsgNDAwLCAuLi4uICkgLSAxMjYyMjc4MDgwMDAwMCA9PSBEYXRlLlVUQyh5ZWFyLCAuLi4pLA0KICAgICAgICAgICAgICAgIC8vIHdoZXJlIDEyNjIyNzgwODAwMDAwIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBHcmVnb3JpYW4gY2FsZW5kYXIgNDAwIHllYXJzDQogICAgICAgICAgICAgICAgdmFyIHllYXIgPSArbWF0Y2hbMF07DQogICAgICAgICAgICAgICAgaWYgKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5KSB7DQogICAgICAgICAgICAgICAgICAgIG1hdGNoWzBdID0geWVhciArIDQwMDsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUuVVRDLmFwcGx5KHRoaXMsIG1hdGNoKSArIG9mZnNldCAtIDEyNjIyNzgwODAwMDAwOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgYSBuZXcgVVRDIGRhdGUgdmFsdWUsIGFjY291bnRpbmcgZm9yIHRoZSBvcHRpb25hbCBvZmZzZXQNCiAgICAgICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5VVEMuYXBwbHkodGhpcywgbWF0Y2gpICsgb2Zmc2V0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUucGFyc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICAgICAgfTsNCg0KICAgICAgICByZXR1cm4gRGF0ZTsNCiAgICB9KShEYXRlKTsNCn0NCg0KLy8NCi8vIFN0cmluZw0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgMTUuNS40LjIwDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS41LjQuMjANCnZhciB3cyA9ICJceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceEEwXHUxNjgwXHUxODBFXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzIiArDQogICAgIlx1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwQVx1MjAyRlx1MjA1Rlx1MzAwMFx1MjAyOCIgKw0KICAgICJcdTIwMjlcdUZFRkYiOw0KaWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW0gfHwgd3MudHJpbSgpKSB7DQogICAgLy8gaHR0cDovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL2Zhc3Rlci10cmltLWphdmFzY3JpcHQNCiAgICAvLyBodHRwOi8vcGVyZmVjdGlvbmtpbGxzLmNvbS93aGl0ZXNwYWNlLWRldmlhdGlvbnMvDQogICAgd3MgPSAiWyIgKyB3cyArICJdIjsNCiAgICB2YXIgdHJpbUJlZ2luUmVnZXhwID0gbmV3IFJlZ0V4cCgiXiIgKyB3cyArIHdzICsgIioiKSwNCiAgICAgICAgdHJpbUVuZFJlZ2V4cCA9IG5ldyBSZWdFeHAod3MgKyB3cyArICIqJCIpOw0KICAgIFN0cmluZy5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uIHRyaW0oKSB7DQogICAgICAgIHJldHVybiBTdHJpbmcodGhpcykucmVwbGFjZSh0cmltQmVnaW5SZWdleHAsICIiKS5yZXBsYWNlKHRyaW1FbmRSZWdleHAsICIiKTsNCiAgICB9Ow0KfQ0KDQovLw0KLy8gVXRpbA0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgOS40DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3g5LjQNCi8vIGh0dHA6Ly9qc3BlcmYuY29tL3RvLWludGVnZXINCnZhciB0b0ludGVnZXIgPSBmdW5jdGlvbiAobikgew0KICAgIG4gPSArbjsNCiAgICBpZiAobiAhPT0gbikgLy8gaXNOYU4NCiAgICAgICAgbiA9IDA7DQogICAgZWxzZSBpZiAobiAhPT0gMCAmJiBuICE9PSAoMS8wKSAmJiBuICE9PSAtKDEvMCkpDQogICAgICAgIG4gPSAobiA+IDAgfHwgLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7DQogICAgcmV0dXJuIG47DQp9Ow0KDQp2YXIgcHJlcGFyZVN0cmluZyA9ICJhIlswXSAhPSAiYSIsDQogICAgLy8gRVM1IDkuOQ0KICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuOQ0KICAgIHRvT2JqZWN0ID0gZnVuY3Rpb24gKG8pIHsNCiAgICAgICAgaWYgKG8gPT0gbnVsbCkgeyAvLyB0aGlzIG1hdGNoZXMgYm90aCBudWxsIGFuZCB1bmRlZmluZWQNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCiAgICAgICAgLy8gSWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBieS1pbmRleCBhY2Nlc3Mgb2YNCiAgICAgICAgLy8gc3RyaW5nIGNoYXJhY3RlcnMgKGV4LiBJRSA8IDcpLCBzcGxpdCB0aGUgc3RyaW5nDQogICAgICAgIGlmIChwcmVwYXJlU3RyaW5nICYmIHR5cGVvZiBvID09ICJzdHJpbmciICYmIG8pIHsNCiAgICAgICAgICAgIHJldHVybiBvLnNwbGl0KCIiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gT2JqZWN0KG8pOw0KICAgIH07DQp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPiAoaHR0cDovL2plZGl0b29sa2l0LmNvbSkNCiAqICAgICAgTWlrZSBkZSBCb2VyIDxtaWtlIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBFdmVudEVtaXR0ZXIgPSB7fTsNCg0KRXZlbnRFbWl0dGVyLl9lbWl0ID0NCkV2ZW50RW1pdHRlci5fZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgZSkgew0KICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5IHx8IHt9Ow0KICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVycyA9IHRoaXMuX2RlZmF1bHRIYW5kbGVycyB8fCB7fTsNCg0KICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV0gfHwgW107DQogICAgdmFyIGRlZmF1bHRIYW5kbGVyID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzW2V2ZW50TmFtZV07DQogICAgaWYgKCFsaXN0ZW5lcnMubGVuZ3RoICYmICFkZWZhdWx0SGFuZGxlcikNCiAgICAgICAgcmV0dXJuOw0KDQogICAgZSA9IGUgfHwge307DQogICAgZS50eXBlID0gZXZlbnROYW1lOw0KICAgIA0KICAgIGlmICghZS5zdG9wUHJvcGFnYXRpb24pIHsNCiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsNCiAgICAgICAgfTsNCiAgICB9DQogICAgDQogICAgaWYgKCFlLnByZXZlbnREZWZhdWx0KSB7DQogICAgICAgIGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7DQogICAgICAgIH07DQogICAgfQ0KDQogICAgZm9yICh2YXIgaT0wOyBpPGxpc3RlbmVycy5sZW5ndGg7IGkrKykgew0KICAgICAgICBsaXN0ZW5lcnNbaV0oZSk7DQogICAgICAgIGlmIChlLnByb3BhZ2F0aW9uU3RvcHBlZCkNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICANCiAgICBpZiAoZGVmYXVsdEhhbmRsZXIgJiYgIWUuZGVmYXVsdFByZXZlbnRlZCkNCiAgICAgICAgZGVmYXVsdEhhbmRsZXIoZSk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIuc2V0RGVmYXVsdEhhbmRsZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzIHx8IHt9Ow0KICAgIA0KICAgIGlmICh0aGlzLl9kZWZhdWx0SGFuZGxlcnNbZXZlbnROYW1lXSkNCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgZGVmYXVsdCBoYW5kbGVyIGZvciAnIiArIGV2ZW50TmFtZSArICInIGlzIGFscmVhZHkgc2V0Iik7DQogICAgICAgIA0KICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVyc1tldmVudE5hbWVdID0gY2FsbGJhY2s7DQp9Ow0KDQpFdmVudEVtaXR0ZXIub24gPQ0KRXZlbnRFbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307DQoNCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOw0KICAgIGlmICghbGlzdGVuZXJzKQ0KICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdID0gW107DQoNCiAgICBpZiAobGlzdGVuZXJzLmluZGV4T2YoY2FsbGJhY2spID09IC0xKQ0KICAgICAgICBsaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPQ0KRXZlbnRFbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307DQoNCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOw0KICAgIGlmICghbGlzdGVuZXJzKQ0KICAgICAgICByZXR1cm47DQoNCiAgICB2YXIgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihjYWxsYmFjayk7DQogICAgaWYgKGluZGV4ICE9PSAtMSkNCiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7DQogICAgaWYgKHRoaXMuX2V2ZW50UmVnaXN0cnkpIHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSA9IFtdOw0KfTsNCg0KZXhwb3J0cy5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvb29wJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KZXhwb3J0cy5pbmhlcml0cyA9IChmdW5jdGlvbigpIHsNCiAgICB2YXIgdGVtcEN0b3IgPSBmdW5jdGlvbigpIHt9Ow0KICAgIHJldHVybiBmdW5jdGlvbihjdG9yLCBzdXBlckN0b3IpIHsNCiAgICAgICAgdGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTsNCiAgICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3IucHJvdG90eXBlOw0KICAgICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOw0KICAgICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7DQogICAgfTsNCn0oKSk7DQoNCmV4cG9ydHMubWl4aW4gPSBmdW5jdGlvbihvYmosIG1peGluKSB7DQogICAgZm9yICh2YXIga2V5IGluIG1peGluKSB7DQogICAgICAgIG9ialtrZXldID0gbWl4aW5ba2V5XTsNCiAgICB9DQp9Ow0KDQpleHBvcnRzLmltcGxlbWVudCA9IGZ1bmN0aW9uKHByb3RvLCBtaXhpbikgew0KICAgIGV4cG9ydHMubWl4aW4ocHJvdG8sIG1peGluKTsNCn07DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQogDQpkZWZpbmUoJ2FjZS9tb2RlL2Nzc193b3JrZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS93b3JrZXIvbWlycm9yJywgJ2FjZS9tb2RlL2Nzcy9jc3NsaW50J10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIE1pcnJvciA9IHJlcXVpcmUoIi4uL3dvcmtlci9taXJyb3IiKS5NaXJyb3I7DQp2YXIgQ1NTTGludCA9IHJlcXVpcmUoIi4vY3NzL2Nzc2xpbnQiKS5DU1NMaW50Ow0KDQp2YXIgV29ya2VyID0gZXhwb3J0cy5Xb3JrZXIgPSBmdW5jdGlvbihzZW5kZXIpIHsNCiAgICBNaXJyb3IuY2FsbCh0aGlzLCBzZW5kZXIpOw0KICAgIHRoaXMuc2V0VGltZW91dCgyMDApOw0KfTsNCg0Kb29wLmluaGVyaXRzKFdvcmtlciwgTWlycm9yKTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHRoaXMub25VcGRhdGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5kb2MuZ2V0VmFsdWUoKTsNCiAgICAgICAgDQogICAgICAgIHZhciByZXN1bHQgPSBDU1NMaW50LnZlcmlmeSh2YWx1ZSk7DQogICAgICAgIHRoaXMuc2VuZGVyLmVtaXQoImNzc2xpbnQiLCByZXN1bHQubWVzc2FnZXMubWFwKGZ1bmN0aW9uKG1zZykgew0KICAgICAgICAgICAgZGVsZXRlIG1zZy5ydWxlOw0KICAgICAgICAgICAgcmV0dXJuIG1zZzsNCiAgICAgICAgfSkpOw0KICAgIH07DQogICAgDQp9KS5jYWxsKFdvcmtlci5wcm90b3R5cGUpOw0KDQp9KTtkZWZpbmUoJ2FjZS93b3JrZXIvbWlycm9yJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvZG9jdW1lbnQnLCAnYWNlL2xpYi9sYW5nJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgRG9jdW1lbnQgPSByZXF1aXJlKCIuLi9kb2N1bWVudCIpLkRvY3VtZW50Ow0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KICAgIA0KdmFyIE1pcnJvciA9IGV4cG9ydHMuTWlycm9yID0gZnVuY3Rpb24oc2VuZGVyKSB7DQogICAgdGhpcy5zZW5kZXIgPSBzZW5kZXI7DQogICAgdmFyIGRvYyA9IHRoaXMuZG9jID0gbmV3IERvY3VtZW50KCIiKTsNCiAgICANCiAgICB2YXIgZGVmZXJyZWRVcGRhdGUgPSB0aGlzLmRlZmVycmVkVXBkYXRlID0gbGFuZy5kZWZlcnJlZENhbGwodGhpcy5vblVwZGF0ZS5iaW5kKHRoaXMpKTsNCiAgICANCiAgICB2YXIgX3NlbGYgPSB0aGlzOw0KICAgIHNlbmRlci5vbigiY2hhbmdlIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICBkb2MuYXBwbHlEZWx0YXMoW2UuZGF0YV0pOyAgICAgICAgDQogICAgICAgIGRlZmVycmVkVXBkYXRlLnNjaGVkdWxlKF9zZWxmLiR0aW1lb3V0KTsNCiAgICB9KTsNCn07DQoNCihmdW5jdGlvbigpIHsNCiAgICANCiAgICB0aGlzLiR0aW1lb3V0ID0gNTAwOw0KICAgIA0KICAgIHRoaXMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHsNCiAgICAgICAgdGhpcy4kdGltZW91dCA9IHRpbWVvdXQ7DQogICAgfTsNCiAgICANCiAgICB0aGlzLnNldFZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgdGhpcy5kb2Muc2V0VmFsdWUodmFsdWUpOw0KICAgICAgICB0aGlzLmRlZmVycmVkVXBkYXRlLnNjaGVkdWxlKHRoaXMuJHRpbWVvdXQpOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRWYWx1ZSA9IGZ1bmN0aW9uKGNhbGxiYWNrSWQpIHsNCiAgICAgICAgdGhpcy5zZW5kZXIuY2FsbGJhY2sodGhpcy5kb2MuZ2V0VmFsdWUoKSwgY2FsbGJhY2tJZCk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLm9uVXBkYXRlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIC8vIGFic3RyYWN0IG1ldGhvZA0KICAgIH07DQogICAgDQp9KS5jYWxsKE1pcnJvci5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvZG9jdW1lbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsICdhY2UvcmFuZ2UnLCAnYWNlL2FuY2hvciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuL3JhbmdlIikuUmFuZ2U7DQp2YXIgQW5jaG9yID0gcmVxdWlyZSgiLi9hbmNob3IiKS5BbmNob3I7DQoNCnZhciBEb2N1bWVudCA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICB0aGlzLiRsaW5lcyA9IFtdOw0KDQogICAgaWYgKEFycmF5LmlzQXJyYXkodGV4dCkpIHsNCiAgICAgICAgdGhpcy5pbnNlcnRMaW5lcygwLCB0ZXh0KTsNCiAgICB9DQogICAgLy8gVGhlcmUgaGFzIHRvIGJlIG9uZSBsaW5lIGF0IGxlYXN0IGluIHRoZSBkb2N1bWVudC4gSWYgeW91IHBhc3MgYW4gZW1wdHkNCiAgICAvLyBzdHJpbmcgdG8gdGhlIGluc2VydCBmdW5jdGlvbiwgbm90aGluZyB3aWxsIGhhcHBlbi4gV29ya2Fyb3VuZC4NCiAgICBlbHNlIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSB7DQogICAgICAgIHRoaXMuJGxpbmVzID0gWyIiXTsNCiAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLmluc2VydCh7cm93OiAwLCBjb2x1bW46MH0sIHRleHQpOw0KICAgIH0NCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCg0KICAgIHRoaXMuc2V0VmFsdWUgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgIHZhciBsZW4gPSB0aGlzLmdldExlbmd0aCgpOw0KICAgICAgICB0aGlzLnJlbW92ZShuZXcgUmFuZ2UoMCwgMCwgbGVuLCB0aGlzLmdldExpbmUobGVuLTEpLmxlbmd0aCkpOw0KICAgICAgICB0aGlzLmluc2VydCh7cm93OiAwLCBjb2x1bW46MH0sIHRleHQpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmdldEFsbExpbmVzKCkuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSk7DQogICAgfTsNCg0KICAgIHRoaXMuY3JlYXRlQW5jaG9yID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIG5ldyBBbmNob3IodGhpcywgcm93LCBjb2x1bW4pOw0KICAgIH07DQoNCiAgICAvLyBjaGVjayBmb3IgSUUgc3BsaXQgYnVnDQogICAgaWYgKCJhYWEiLnNwbGl0KC9hLykubGVuZ3RoID09IDApDQogICAgICAgIHRoaXMuJHNwbGl0ID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXHJcbnxcci9nLCAiXG4iKS5zcGxpdCgiXG4iKTsNCiAgICAgICAgfQ0KICAgIGVsc2UNCiAgICAgICAgdGhpcy4kc3BsaXQgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgICAgICByZXR1cm4gdGV4dC5zcGxpdCgvXHJcbnxccnxcbi8pOw0KICAgICAgICB9Ow0KDQoNCiAgICB0aGlzLiRkZXRlY3ROZXdMaW5lID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICB2YXIgbWF0Y2ggPSB0ZXh0Lm1hdGNoKC9eLio/KFxyXG58XHJ8XG4pL20pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gbWF0Y2hbMV07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLiRhdXRvTmV3TGluZSA9ICJcbiI7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyID0gZnVuY3Rpb24oKSB7DQogICAgICBzd2l0Y2ggKHRoaXMuJG5ld0xpbmVNb2RlKSB7DQogICAgICAgICAgY2FzZSAid2luZG93cyI6DQogICAgICAgICAgICAgIHJldHVybiAiXHJcbiI7DQoNCiAgICAgICAgICBjYXNlICJ1bml4IjoNCiAgICAgICAgICAgICAgcmV0dXJuICJcbiI7DQoNCiAgICAgICAgICBjYXNlICJhdXRvIjoNCiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGF1dG9OZXdMaW5lOw0KICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLiRhdXRvTmV3TGluZSA9ICJcbiI7DQogICAgdGhpcy4kbmV3TGluZU1vZGUgPSAiYXV0byI7DQogICAgdGhpcy5zZXROZXdMaW5lTW9kZSA9IGZ1bmN0aW9uKG5ld0xpbmVNb2RlKSB7DQogICAgICAgIGlmICh0aGlzLiRuZXdMaW5lTW9kZSA9PT0gbmV3TGluZU1vZGUpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdGhpcy4kbmV3TGluZU1vZGUgPSBuZXdMaW5lTW9kZTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXdMaW5lTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kbmV3TGluZU1vZGU7DQogICAgfTsNCg0KICAgIHRoaXMuaXNOZXdMaW5lID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICByZXR1cm4gKHRleHQgPT0gIlxyXG4iIHx8IHRleHQgPT0gIlxyIiB8fCB0ZXh0ID09ICJcbiIpOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBHZXQgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBnaXZlbiBsaW5lIGFzIGl0IGlzIGluIHRoZSBkb2N1bWVudA0KICAgICAqLw0KICAgIHRoaXMuZ2V0TGluZSA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICByZXR1cm4gdGhpcy4kbGluZXNbcm93XSB8fCAiIjsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5zbGljZShmaXJzdFJvdywgbGFzdFJvdyArIDEpOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBSZXR1cm5zIGFsbCBsaW5lcyBpbiB0aGUgZG9jdW1lbnQgYXMgc3RyaW5nIGFycmF5LiBXYXJuaW5nOiBUaGUgY2FsbGVyDQogICAgICogc2hvdWxkIG5vdCBtb2RpZnkgdGhpcyBhcnJheSENCiAgICAgKi8NCiAgICB0aGlzLmdldEFsbExpbmVzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmdldExpbmVzKDAsIHRoaXMuZ2V0TGVuZ3RoKCkpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldExlbmd0aCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kbGluZXMubGVuZ3RoOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFRleHRSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcmFuZ2UuZW5kLnJvdykgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzW3JhbmdlLnN0YXJ0LnJvd10uc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4pOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdmFyIGxpbmVzID0gW107DQogICAgICAgICAgICBsaW5lcy5wdXNoKHRoaXMuJGxpbmVzW3JhbmdlLnN0YXJ0LnJvd10uc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbikpOw0KICAgICAgICAgICAgbGluZXMucHVzaC5hcHBseShsaW5lcywgdGhpcy5nZXRMaW5lcyhyYW5nZS5zdGFydC5yb3crMSwgcmFuZ2UuZW5kLnJvdy0xKSk7DQogICAgICAgICAgICBsaW5lcy5wdXNoKHRoaXMuJGxpbmVzW3JhbmdlLmVuZC5yb3ddLnN1YnN0cmluZygwLCByYW5nZS5lbmQuY29sdW1uKSk7DQogICAgICAgICAgICByZXR1cm4gbGluZXMuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy4kY2xpcFBvc2l0aW9uID0gZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuZ2V0TGVuZ3RoKCk7DQogICAgICAgIGlmIChwb3NpdGlvbi5yb3cgPj0gbGVuZ3RoKSB7DQogICAgICAgICAgICBwb3NpdGlvbi5yb3cgPSBNYXRoLm1heCgwLCBsZW5ndGggLSAxKTsNCiAgICAgICAgICAgIHBvc2l0aW9uLmNvbHVtbiA9IHRoaXMuZ2V0TGluZShsZW5ndGgtMSkubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBwb3NpdGlvbjsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnQgPSBmdW5jdGlvbihwb3NpdGlvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsNCg0KICAgICAgICBwb3NpdGlvbiA9IHRoaXMuJGNsaXBQb3NpdGlvbihwb3NpdGlvbik7DQoNCiAgICAgICAgaWYgKHRoaXMuZ2V0TGVuZ3RoKCkgPD0gMSkNCiAgICAgICAgICAgIHRoaXMuJGRldGVjdE5ld0xpbmUodGV4dCk7DQoNCiAgICAgICAgdmFyIGxpbmVzID0gdGhpcy4kc3BsaXQodGV4dCk7DQogICAgICAgIHZhciBmaXJzdExpbmUgPSBsaW5lcy5zcGxpY2UoMCwgMSlbMF07DQogICAgICAgIHZhciBsYXN0TGluZSA9IGxpbmVzLmxlbmd0aCA9PSAwID8gbnVsbCA6IGxpbmVzLnNwbGljZShsaW5lcy5sZW5ndGggLSAxLCAxKVswXTsNCg0KICAgICAgICBwb3NpdGlvbiA9IHRoaXMuaW5zZXJ0SW5MaW5lKHBvc2l0aW9uLCBmaXJzdExpbmUpOw0KICAgICAgICBpZiAobGFzdExpbmUgIT09IG51bGwpIHsNCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnROZXdMaW5lKHBvc2l0aW9uKTsgLy8gdGVybWluYXRlIGZpcnN0IGxpbmUNCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRMaW5lcyhwb3NpdGlvbi5yb3csIGxpbmVzKTsNCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRJbkxpbmUocG9zaXRpb24sIGxhc3RMaW5lIHx8ICIiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcG9zaXRpb247DQogICAgfTsNCg0KICAgIHRoaXMuaW5zZXJ0TGluZXMgPSBmdW5jdGlvbihyb3csIGxpbmVzKSB7DQogICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgIHJldHVybiB7cm93OiByb3csIGNvbHVtbjogMH07DQoNCiAgICAgICAgdmFyIGFyZ3MgPSBbcm93LCAwXTsNCiAgICAgICAgYXJncy5wdXNoLmFwcGx5KGFyZ3MsIGxpbmVzKTsNCiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlLmFwcGx5KHRoaXMuJGxpbmVzLCBhcmdzKTsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCAwLCByb3cgKyBsaW5lcy5sZW5ndGgsIDApOw0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJpbnNlcnRMaW5lcyIsDQogICAgICAgICAgICByYW5nZTogcmFuZ2UsDQogICAgICAgICAgICBsaW5lczogbGluZXMNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCiAgICAgICAgcmV0dXJuIHJhbmdlLmVuZDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnROZXdMaW5lID0gZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICAgICAgcG9zaXRpb24gPSB0aGlzLiRjbGlwUG9zaXRpb24ocG9zaXRpb24pOw0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuJGxpbmVzW3Bvc2l0aW9uLnJvd10gfHwgIiI7DQoNCiAgICAgICAgdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSA9IGxpbmUuc3Vic3RyaW5nKDAsIHBvc2l0aW9uLmNvbHVtbik7DQogICAgICAgIHRoaXMuJGxpbmVzLnNwbGljZShwb3NpdGlvbi5yb3cgKyAxLCAwLCBsaW5lLnN1YnN0cmluZyhwb3NpdGlvbi5jb2x1bW4sIGxpbmUubGVuZ3RoKSk7DQoNCiAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgIHJvdyA6IHBvc2l0aW9uLnJvdyArIDEsDQogICAgICAgICAgICBjb2x1bW4gOiAwDQogICAgICAgIH07DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0VGV4dCIsDQogICAgICAgICAgICByYW5nZTogUmFuZ2UuZnJvbVBvaW50cyhwb3NpdGlvbiwgZW5kKSwNCiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQoNCiAgICAgICAgcmV0dXJuIGVuZDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnRJbkxpbmUgPSBmdW5jdGlvbihwb3NpdGlvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsNCg0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuJGxpbmVzW3Bvc2l0aW9uLnJvd10gfHwgIiI7DQoNCiAgICAgICAgdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSA9IGxpbmUuc3Vic3RyaW5nKDAsIHBvc2l0aW9uLmNvbHVtbikgKyB0ZXh0DQogICAgICAgICAgICAgICAgKyBsaW5lLnN1YnN0cmluZyhwb3NpdGlvbi5jb2x1bW4pOw0KDQogICAgICAgIHZhciBlbmQgPSB7DQogICAgICAgICAgICByb3cgOiBwb3NpdGlvbi5yb3csDQogICAgICAgICAgICBjb2x1bW4gOiBwb3NpdGlvbi5jb2x1bW4gKyB0ZXh0Lmxlbmd0aA0KICAgICAgICB9Ow0KDQogICAgICAgIHZhciBkZWx0YSA9IHsNCiAgICAgICAgICAgIGFjdGlvbjogImluc2VydFRleHQiLA0KICAgICAgICAgICAgcmFuZ2U6IFJhbmdlLmZyb21Qb2ludHMocG9zaXRpb24sIGVuZCksDQogICAgICAgICAgICB0ZXh0OiB0ZXh0DQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQoNCiAgICAgICAgcmV0dXJuIGVuZDsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmUgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICAvLyBjbGlwIHRvIGRvY3VtZW50DQogICAgICAgIHJhbmdlLnN0YXJ0ID0gdGhpcy4kY2xpcFBvc2l0aW9uKHJhbmdlLnN0YXJ0KTsNCiAgICAgICAgcmFuZ2UuZW5kID0gdGhpcy4kY2xpcFBvc2l0aW9uKHJhbmdlLmVuZCk7DQoNCiAgICAgICAgaWYgKHJhbmdlLmlzRW1wdHkoKSkNCiAgICAgICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCg0KICAgICAgICB2YXIgZmlyc3RSb3cgPSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgIHZhciBsYXN0Um93ID0gcmFuZ2UuZW5kLnJvdzsNCg0KICAgICAgICBpZiAocmFuZ2UuaXNNdWx0aUxpbmUoKSkgew0KICAgICAgICAgICAgdmFyIGZpcnN0RnVsbFJvdyA9IHJhbmdlLnN0YXJ0LmNvbHVtbiA9PSAwID8gZmlyc3RSb3cgOiBmaXJzdFJvdyArIDE7DQogICAgICAgICAgICB2YXIgbGFzdEZ1bGxSb3cgPSBsYXN0Um93IC0gMTsNCg0KICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5jb2x1bW4gPiAwKQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSW5MaW5lKGxhc3RSb3csIDAsIHJhbmdlLmVuZC5jb2x1bW4pOw0KDQogICAgICAgICAgICBpZiAobGFzdEZ1bGxSb3cgPj0gZmlyc3RGdWxsUm93KQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGluZXMoZmlyc3RGdWxsUm93LCBsYXN0RnVsbFJvdyk7DQoNCiAgICAgICAgICAgIGlmIChmaXJzdEZ1bGxSb3cgIT0gZmlyc3RSb3cpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUluTGluZShmaXJzdFJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLCB0aGlzLmdldExpbmUoZmlyc3RSb3cpLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVOZXdMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB0aGlzLnJlbW92ZUluTGluZShmaXJzdFJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlSW5MaW5lID0gZnVuY3Rpb24ocm93LCBzdGFydENvbHVtbiwgZW5kQ29sdW1uKSB7DQogICAgICAgIGlmIChzdGFydENvbHVtbiA9PSBlbmRDb2x1bW4pDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKHJvdywgc3RhcnRDb2x1bW4sIHJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHJlbW92ZWQgPSBsaW5lLnN1YnN0cmluZyhzdGFydENvbHVtbiwgZW5kQ29sdW1uKTsNCiAgICAgICAgdmFyIG5ld0xpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBzdGFydENvbHVtbikgKyBsaW5lLnN1YnN0cmluZyhlbmRDb2x1bW4sIGxpbmUubGVuZ3RoKTsNCiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlKHJvdywgMSwgbmV3TGluZSk7DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAicmVtb3ZlVGV4dCIsDQogICAgICAgICAgICByYW5nZTogcmFuZ2UsDQogICAgICAgICAgICB0ZXh0OiByZW1vdmVkDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQogICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogUmVtb3ZlcyBhIHJhbmdlIG9mIGZ1bGwgbGluZXMNCiAgICAgKg0KICAgICAqIEBwYXJhbSBmaXJzdFJvdyB7SW50ZWdlcn0gVGhlIGZpcnN0IHJvdyB0byBiZSByZW1vdmVkDQogICAgICogQHBhcmFtIGxhc3RSb3cge0ludGVnZXJ9IFRoZSBsYXN0IHJvdyB0byBiZSByZW1vdmVkDQogICAgICogQHJldHVybiB7U3RyaW5nW119IFRoZSByZW1vdmVkIGxpbmVzDQogICAgICovDQogICAgdGhpcy5yZW1vdmVMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShmaXJzdFJvdywgMCwgbGFzdFJvdyArIDEsIDApOw0KICAgICAgICB2YXIgcmVtb3ZlZCA9IHRoaXMuJGxpbmVzLnNwbGljZShmaXJzdFJvdywgbGFzdFJvdyAtIGZpcnN0Um93ICsgMSk7DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAicmVtb3ZlTGluZXMiLA0KICAgICAgICAgICAgcmFuZ2U6IHJhbmdlLA0KICAgICAgICAgICAgbmw6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpLA0KICAgICAgICAgICAgbGluZXM6IHJlbW92ZWQNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCiAgICAgICAgcmV0dXJuIHJlbW92ZWQ7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlTmV3TGluZSA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICB2YXIgZmlyc3RMaW5lID0gdGhpcy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBzZWNvbmRMaW5lID0gdGhpcy5nZXRMaW5lKHJvdysxKTsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCBmaXJzdExpbmUubGVuZ3RoLCByb3crMSwgMCk7DQogICAgICAgIHZhciBsaW5lID0gZmlyc3RMaW5lICsgc2Vjb25kTGluZTsNCg0KICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2Uocm93LCAyLCBsaW5lKTsNCg0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVUZXh0IiwNCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwNCiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQogICAgfTsNCg0KICAgIHRoaXMucmVwbGFjZSA9IGZ1bmN0aW9uKHJhbmdlLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwICYmIHJhbmdlLmlzRW1wdHkoKSkNCiAgICAgICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCg0KICAgICAgICAvLyBTaG9ydGN1dDogSWYgdGhlIHRleHQgd2Ugd2FudCB0byBpbnNlcnQgaXMgdGhlIHNhbWUgYXMgaXQgaXMgYWxyZWFkeQ0KICAgICAgICAvLyBpbiB0aGUgZG9jdW1lbnQsIHdlIGRvbid0IGhhdmUgdG8gcmVwbGFjZSBhbnl0aGluZy4NCiAgICAgICAgaWYgKHRleHQgPT0gdGhpcy5nZXRUZXh0UmFuZ2UocmFuZ2UpKQ0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlLmVuZDsNCg0KICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7DQogICAgICAgIGlmICh0ZXh0KSB7DQogICAgICAgICAgICB2YXIgZW5kID0gdGhpcy5pbnNlcnQocmFuZ2Uuc3RhcnQsIHRleHQpOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZW5kID0gcmFuZ2Uuc3RhcnQ7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gZW5kOw0KICAgIH07DQoNCiAgICB0aGlzLmFwcGx5RGVsdGFzID0gZnVuY3Rpb24oZGVsdGFzKSB7DQogICAgICAgIGZvciAodmFyIGk9MDsgaTxkZWx0YXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBkZWx0YSA9IGRlbHRhc1tpXTsNCiAgICAgICAgICAgIHZhciByYW5nZSA9IFJhbmdlLmZyb21Qb2ludHMoZGVsdGEucmFuZ2Uuc3RhcnQsIGRlbHRhLnJhbmdlLmVuZCk7DQoNCiAgICAgICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydExpbmVzIikNCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydExpbmVzKHJhbmdlLnN0YXJ0LnJvdywgZGVsdGEubGluZXMpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRUZXh0IikNCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydChyYW5nZS5zdGFydCwgZGVsdGEudGV4dCk7DQogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyAtIDEpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVUZXh0IikNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5yZXZlcnREZWx0YXMgPSBmdW5jdGlvbihkZWx0YXMpIHsNCiAgICAgICAgZm9yICh2YXIgaT1kZWx0YXMubGVuZ3RoLTE7IGk+PTA7IGktLSkgew0KICAgICAgICAgICAgdmFyIGRlbHRhID0gZGVsdGFzW2ldOw0KDQogICAgICAgICAgICB2YXIgcmFuZ2UgPSBSYW5nZS5mcm9tUG9pbnRzKGRlbHRhLnJhbmdlLnN0YXJ0LCBkZWx0YS5yYW5nZS5lbmQpOw0KDQogICAgICAgICAgICBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRMaW5lcyIpDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMaW5lcyhyYW5nZS5zdGFydC5yb3csIHJhbmdlLmVuZC5yb3cgLSAxKTsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0VGV4dCIpDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUocmFuZ2UpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVMaW5lcyIpDQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRMaW5lcyhyYW5nZS5zdGFydC5yb3csIGRlbHRhLmxpbmVzKTsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlVGV4dCIpDQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQocmFuZ2Uuc3RhcnQsIGRlbHRhLnRleHQpOw0KICAgICAgICB9DQogICAgfTsNCg0KfSkuY2FsbChEb2N1bWVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkRvY3VtZW50ID0gRG9jdW1lbnQ7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9yYW5nZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pIHsNCiAgICB0aGlzLnN0YXJ0ID0gew0KICAgICAgICByb3c6IHN0YXJ0Um93LA0KICAgICAgICBjb2x1bW46IHN0YXJ0Q29sdW1uDQogICAgfTsNCg0KICAgIHRoaXMuZW5kID0gew0KICAgICAgICByb3c6IGVuZFJvdywNCiAgICAgICAgY29sdW1uOiBlbmRDb2x1bW4NCiAgICB9Ow0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuaXNFZXF1YWwgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT0gcmFuZ2Uuc3RhcnQucm93ICYmDQogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPT0gcmFuZ2UuZW5kLnJvdyAmJg0KICAgICAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gPT0gcmFuZ2Uuc3RhcnQuY29sdW1uICYmDQogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPT0gcmFuZ2UuZW5kLmNvbHVtbg0KICAgIH07DQoNCiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiAoIlJhbmdlOiBbIiArIHRoaXMuc3RhcnQucm93ICsgIi8iICsgdGhpcy5zdGFydC5jb2x1bW4gKw0KICAgICAgICAgICAgIl0gLT4gWyIgKyB0aGlzLmVuZC5yb3cgKyAiLyIgKyB0aGlzLmVuZC5jb2x1bW4gKyAiXSIpOw0KICAgIH07DQoNCiAgICB0aGlzLmNvbnRhaW5zID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMDsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogQ29tcGFyZXMgdGhpcyByYW5nZSAoQSkgd2l0aCBhbm90aGVyIHJhbmdlIChCKSwgd2hlcmUgQiBpcyB0aGUgcGFzc2VkIGluDQogICAgICogcmFuZ2UuDQogICAgICoNCiAgICAgKiBSZXR1cm4gdmFsdWVzOg0KICAgICAqICAtMjogKEIpIGlzIGluZnJvbnQgb2YgKEEpIGFuZCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIChBKQ0KICAgICAqICAtMTogKEIpIGJlZ2lucyBiZWZvcmUgKEEpIGJ1dCBlbmRzIGluc2lkZSBvZiAoQSkNCiAgICAgKiAgIDA6IChCKSBpcyBjb21wbGV0bHkgaW5zaWRlIG9mIChBKSBPUiAoQSkgaXMgY29tcGxldHkgaW5zaWRlIG9mIChCKQ0KICAgICAqICArMTogKEIpIGJlZ2lucyBpbnNpZGUgb2YgKEEpIGJ1dCBlbmRzIG91dHNpZGUgb2YgKEEpDQogICAgICogICsyOiAoQikgaXMgYWZ0ZXIgKEEpIGFuZCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIChBKQ0KICAgICAqDQogICAgICogIDQyOiBGVFcgc3RhdGU6IChCKSBlbmRzIGluIChBKSBidXQgc3RhcnRzIG91dHNpZGUgb2YgKEEpDQogICAgICovDQogICAgdGhpcy5jb21wYXJlUmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICB2YXIgY21wLA0KICAgICAgICAgICAgZW5kID0gcmFuZ2UuZW5kLA0KICAgICAgICAgICAgc3RhcnQgPSByYW5nZS5zdGFydDsNCg0KICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoZW5kLnJvdywgZW5kLmNvbHVtbik7DQogICAgICAgIGlmIChjbXAgPT0gMSkgew0KICAgICAgICAgICAgY21wID0gdGhpcy5jb21wYXJlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uKTsNCiAgICAgICAgICAgIGlmIChjbXAgPT0gMSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAyOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMCkgew0KICAgICAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gLTEpIHsNCiAgICAgICAgICAgIHJldHVybiAtMjsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbik7DQogICAgICAgICAgICBpZiAoY21wID09IC0xKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMSkgew0KICAgICAgICAgICAgICAgIHJldHVybiA0MjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmNvbXBhcmVQb2ludCA9IGZ1bmN0aW9uKHApIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShwLnJvdywgcC5jb2x1bW4pOw0KICAgIH0NCg0KICAgIHRoaXMuY29udGFpbnNSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVQb2ludChyYW5nZS5zdGFydCkgPT0gMCAmJiB0aGlzLmNvbXBhcmVQb2ludChyYW5nZS5lbmQpID09IDA7DQogICAgfQ0KDQogICAgdGhpcy5pc0VuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHJldHVybiB0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW47DQogICAgfQ0KDQogICAgdGhpcy5pc1N0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW47DQogICAgfQ0KDQogICAgdGhpcy5zZXRTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0eXBlb2Ygcm93ID09ICJvYmplY3QiKSB7DQogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IHJvdy5jb2x1bW47DQogICAgICAgICAgICB0aGlzLnN0YXJ0LnJvdyA9IHJvdy5yb3c7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLnN0YXJ0LnJvdyA9IHJvdzsNCiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID0gY29sdW1uOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5zZXRFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodHlwZW9mIHJvdyA9PSAib2JqZWN0Iikgew0KICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uID0gcm93LmNvbHVtbjsNCiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IHJvdy5yb3c7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPSByb3c7DQogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPSBjb2x1bW47DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmluc2lkZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmlzRW5kKHJvdywgY29sdW1uKSB8fCB0aGlzLmlzU3RhcnQocm93LCBjb2x1bW4pKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgdGhpcy5pbnNpZGVTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmlzRW5kKHJvdywgY29sdW1uKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIHRoaXMuaW5zaWRlRW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuaXNTdGFydChyb3csIGNvbHVtbikpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICB0aGlzLmNvbXBhcmUgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAoIXRoaXMuaXNNdWx0aUxpbmUoKSkgew0KICAgICAgICAgICAgaWYgKHJvdyA9PT0gdGhpcy5zdGFydC5yb3cpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uIDwgdGhpcy5zdGFydC5jb2x1bW4gPyAtMSA6IChjb2x1bW4gPiB0aGlzLmVuZC5jb2x1bW4gPyAxIDogMCk7DQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHJvdyA8IHRoaXMuc3RhcnQucm93KQ0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KDQogICAgICAgIGlmIChyb3cgPiB0aGlzLmVuZC5yb3cpDQogICAgICAgICAgICByZXR1cm4gMTsNCg0KICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPT09IHJvdykNCiAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPj0gdGhpcy5zdGFydC5jb2x1bW4gPyAwIDogLTE7DQoNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PT0gcm93KQ0KICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA8PSB0aGlzLmVuZC5jb2x1bW4gPyAwIDogMTsNCg0KICAgICAgICByZXR1cm4gMDsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogTGlrZSAuY29tcGFyZSgpLCBidXQgaWYgaXNTdGFydCBpcyB0cnVlLCByZXR1cm4gLTE7DQogICAgICovDQogICAgdGhpcy5jb21wYXJlU3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbikgew0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBMaWtlIC5jb21wYXJlKCksIGJ1dCBpZiBpc0VuZCBpcyB0cnVlLCByZXR1cm4gMTsNCiAgICAgKi8NCiAgICB0aGlzLmNvbXBhcmVFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5lbmQucm93ID09IHJvdyAmJiB0aGlzLmVuZC5jb2x1bW4gPT0gY29sdW1uKSB7DQogICAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5jb21wYXJlSW5zaWRlID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbikgew0KICAgICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbikgew0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmNsaXBSb3dzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA+IGxhc3RSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBsYXN0Um93KzEsDQogICAgICAgICAgICAgICAgY29sdW1uOiAwDQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID4gbGFzdFJvdykgew0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gew0KICAgICAgICAgICAgICAgIHJvdzogbGFzdFJvdysxLA0KICAgICAgICAgICAgICAgIGNvbHVtbjogMA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA8IGZpcnN0Um93KSB7DQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBmaXJzdFJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IDANCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy5lbmQucm93IDwgZmlyc3RSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBmaXJzdFJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IDANCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQgfHwgdGhpcy5zdGFydCwgZW5kIHx8IHRoaXMuZW5kKTsNCiAgICB9Ow0KDQogICAgdGhpcy5leHRlbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgY21wID0gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsNCg0KICAgICAgICBpZiAoY21wID09IDApDQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgZWxzZSBpZiAoY21wID09IC0xKQ0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn07DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1ufTsNCg0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCB8fCB0aGlzLnN0YXJ0LCBlbmQgfHwgdGhpcy5lbmQpOw0KICAgIH07DQoNCiAgICB0aGlzLmlzRW1wdHkgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuICh0aGlzLnN0YXJ0LnJvdyA9PSB0aGlzLmVuZC5yb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gdGhpcy5lbmQuY29sdW1uKTsNCiAgICB9Ow0KDQogICAgdGhpcy5pc011bHRpTGluZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gKHRoaXMuc3RhcnQucm93ICE9PSB0aGlzLmVuZC5yb3cpOw0KICAgIH07DQoNCiAgICB0aGlzLmNsb25lID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRoaXMuc3RhcnQsIHRoaXMuZW5kKTsNCiAgICB9Ow0KDQogICAgdGhpcy5jb2xsYXBzZVJvd3MgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuZW5kLmNvbHVtbiA9PSAwKQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0LnJvdywgMCwgTWF0aC5tYXgodGhpcy5zdGFydC5yb3csIHRoaXMuZW5kLnJvdy0xKSwgMCkNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0LnJvdywgMCwgdGhpcy5lbmQucm93LCAwKQ0KICAgIH07DQoNCiAgICB0aGlzLnRvU2NyZWVuUmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHZhciBzY3JlZW5Qb3NTdGFydCA9DQogICAgICAgICAgICBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLnN0YXJ0KTsNCiAgICAgICAgdmFyIHNjcmVlblBvc0VuZCA9DQogICAgICAgICAgICBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmVuZCk7DQoNCiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSgNCiAgICAgICAgICAgIHNjcmVlblBvc1N0YXJ0LnJvdywgc2NyZWVuUG9zU3RhcnQuY29sdW1uLA0KICAgICAgICAgICAgc2NyZWVuUG9zRW5kLnJvdywgc2NyZWVuUG9zRW5kLmNvbHVtbg0KICAgICAgICApOw0KICAgIH07DQoNCn0pLmNhbGwoUmFuZ2UucHJvdG90eXBlKTsNCg0KDQpSYW5nZS5mcm9tUG9pbnRzID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnQucm93LCBzdGFydC5jb2x1bW4sIGVuZC5yb3csIGVuZC5jb2x1bW4pOw0KfTsNCg0KZXhwb3J0cy5SYW5nZSA9IFJhbmdlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvYW5jaG9yJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuL2xpYi9vb3AiKTsNCnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KDQovKioNCiAqIEFuIEFuY2hvciBpcyBhIGZsb2F0aW5nIHBvaW50ZXIgaW4gdGhlIGRvY3VtZW50LiBXaGVuZXZlciB0ZXh0IGlzIGluc2VydGVkIG9yDQogKiBkZWxldGVkIGJlZm9yZSB0aGUgY3Vyc29yLCB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnNvciBpcyB1cGRhdGVkDQogKi8NCnZhciBBbmNob3IgPSBleHBvcnRzLkFuY2hvciA9IGZ1bmN0aW9uKGRvYywgcm93LCBjb2x1bW4pIHsNCiAgICB0aGlzLmRvY3VtZW50ID0gZG9jOw0KICAgIA0KICAgIGlmICh0eXBlb2YgY29sdW1uID09ICJ1bmRlZmluZWQiKQ0KICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdy5yb3csIHJvdy5jb2x1bW4pOw0KICAgIGVsc2UNCiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihyb3csIGNvbHVtbik7DQoNCiAgICB0aGlzLiRvbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTsNCiAgICBkb2Mub24oImNoYW5nZSIsIHRoaXMuJG9uQ2hhbmdlKTsNCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCiAgICANCiAgICB0aGlzLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KHRoaXMucm93LCB0aGlzLmNvbHVtbik7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldERvY3VtZW50ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5vbkNoYW5nZSA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIGRlbHRhID0gZS5kYXRhOw0KICAgICAgICB2YXIgcmFuZ2UgPSBkZWx0YS5yYW5nZTsNCiAgICAgICAgICAgIA0KICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHJhbmdlLmVuZC5yb3cgJiYgcmFuZ2Uuc3RhcnQucm93ICE9IHRoaXMucm93KQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPiB0aGlzLnJvdykNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHRoaXMucm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA+IHRoaXMuY29sdW1uKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgIA0KICAgICAgICB2YXIgcm93ID0gdGhpcy5yb3c7DQogICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmNvbHVtbjsNCiAgICAgICAgDQogICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT09ICJpbnNlcnRUZXh0Iikgew0KICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PT0gcm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA8PSBjb2x1bW4pIHsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09PSByYW5nZS5lbmQucm93KSB7DQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiArPSByYW5nZS5lbmQuY29sdW1uIC0gcmFuZ2Uuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uIC09IHJhbmdlLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgICAgICAgICAgcm93ICs9IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2Uuc3RhcnQucm93ICE9PSByYW5nZS5lbmQucm93ICYmIHJhbmdlLnN0YXJ0LnJvdyA8IHJvdykgew0KICAgICAgICAgICAgICAgIHJvdyArPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PT0gImluc2VydExpbmVzIikgew0KICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA8PSByb3cpIHsNCiAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZVRleHQiKSB7DQogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHJvdyAmJiByYW5nZS5zdGFydC5jb2x1bW4gPCBjb2x1bW4pIHsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZW5kLmNvbHVtbiA+PSBjb2x1bW4pDQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IHJhbmdlLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IE1hdGgubWF4KDAsIGNvbHVtbiAtIChyYW5nZS5lbmQuY29sdW1uIC0gcmFuZ2Uuc3RhcnQuY29sdW1uKSk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9IGVsc2UgaWYgKHJhbmdlLnN0YXJ0LnJvdyAhPT0gcmFuZ2UuZW5kLnJvdyAmJiByYW5nZS5zdGFydC5yb3cgPCByb3cpIHsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZW5kLnJvdyA9PSByb3cpIHsNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gTWF0aC5tYXgoMCwgY29sdW1uIC0gcmFuZ2UuZW5kLmNvbHVtbikgKyByYW5nZS5zdGFydC5jb2x1bW47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJvdyAtPSAocmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChyYW5nZS5lbmQucm93ID09IHJvdykgew0KICAgICAgICAgICAgICAgIHJvdyAtPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgICAgIGNvbHVtbiA9IE1hdGgubWF4KDAsIGNvbHVtbiAtIHJhbmdlLmVuZC5jb2x1bW4pICsgcmFuZ2Uuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlTGluZXMiKSB7DQogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93IDw9IHJvdykgew0KICAgICAgICAgICAgICAgIGlmIChyYW5nZS5lbmQucm93IDw9IHJvdykNCiAgICAgICAgICAgICAgICAgICAgcm93IC09IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJvdyA9IHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gMDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdywgY29sdW1uLCB0cnVlKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKHJvdywgY29sdW1uLCBub0NsaXApIHsNCiAgICAgICAgdmFyIHBvczsNCiAgICAgICAgaWYgKG5vQ2xpcCkgew0KICAgICAgICAgICAgcG9zID0gew0KICAgICAgICAgICAgICAgIHJvdzogcm93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uDQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgcG9zID0gdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICh0aGlzLnJvdyA9PSBwb3Mucm93ICYmIHRoaXMuY29sdW1uID09IHBvcy5jb2x1bW4pDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG9sZCA9IHsNCiAgICAgICAgICAgIHJvdzogdGhpcy5yb3csDQogICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uDQogICAgICAgIH07DQogICAgICAgIA0KICAgICAgICB0aGlzLnJvdyA9IHBvcy5yb3c7DQogICAgICAgIHRoaXMuY29sdW1uID0gcG9zLmNvbHVtbjsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgew0KICAgICAgICAgICAgb2xkOiBvbGQsDQogICAgICAgICAgICB2YWx1ZTogcG9zDQogICAgICAgIH0pOw0KICAgIH07DQogICAgDQogICAgdGhpcy5kZXRhY2ggPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLiRvbkNoYW5nZSk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHBvcyA9IHt9Ow0KICAgIA0KICAgICAgICBpZiAocm93ID49IHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsNCiAgICAgICAgICAgIHBvcy5yb3cgPSBNYXRoLm1heCgwLCB0aGlzLmRvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7DQogICAgICAgICAgICBwb3MuY29sdW1uID0gdGhpcy5kb2N1bWVudC5nZXRMaW5lKHBvcy5yb3cpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChyb3cgPCAwKSB7DQogICAgICAgICAgICBwb3Mucm93ID0gMDsNCiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSAwOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgcG9zLnJvdyA9IHJvdzsNCiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSBNYXRoLm1pbih0aGlzLmRvY3VtZW50LmdldExpbmUocG9zLnJvdykubGVuZ3RoLCBNYXRoLm1heCgwLCBjb2x1bW4pKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKGNvbHVtbiA8IDApDQogICAgICAgICAgICBwb3MuY29sdW1uID0gMDsNCiAgICAgICAgICAgIA0KICAgICAgICByZXR1cm4gcG9zOw0KICAgIH07DQogICAgDQp9KS5jYWxsKEFuY2hvci5wcm90b3R5cGUpOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvbGFuZycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCmV4cG9ydHMuc3RyaW5nUmV2ZXJzZSA9IGZ1bmN0aW9uKHN0cmluZykgew0KICAgIHJldHVybiBzdHJpbmcuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTsNCn07DQoNCmV4cG9ydHMuc3RyaW5nUmVwZWF0ID0gZnVuY3Rpb24gKHN0cmluZywgY291bnQpIHsNCiAgICAgcmV0dXJuIG5ldyBBcnJheShjb3VudCArIDEpLmpvaW4oc3RyaW5nKTsNCn07DQoNCnZhciB0cmltQmVnaW5SZWdleHAgPSAvXlxzXHMqLzsNCnZhciB0cmltRW5kUmVnZXhwID0gL1xzXHMqJC87DQoNCmV4cG9ydHMuc3RyaW5nVHJpbUxlZnQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7DQogICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHRyaW1CZWdpblJlZ2V4cCwgJycpOw0KfTsNCg0KZXhwb3J0cy5zdHJpbmdUcmltUmlnaHQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7DQogICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHRyaW1FbmRSZWdleHAsICcnKTsNCn07DQoNCmV4cG9ydHMuY29weU9iamVjdCA9IGZ1bmN0aW9uKG9iaikgew0KICAgIHZhciBjb3B5ID0ge307DQogICAgZm9yICh2YXIga2V5IGluIG9iaikgew0KICAgICAgICBjb3B5W2tleV0gPSBvYmpba2V5XTsNCiAgICB9DQogICAgcmV0dXJuIGNvcHk7DQp9Ow0KDQpleHBvcnRzLmNvcHlBcnJheSA9IGZ1bmN0aW9uKGFycmF5KXsNCiAgICB2YXIgY29weSA9IFtdOw0KICAgIGZvciAodmFyIGk9MCwgbD1hcnJheS5sZW5ndGg7IGk8bDsgaSsrKSB7DQogICAgICAgIGlmIChhcnJheVtpXSAmJiB0eXBlb2YgYXJyYXlbaV0gPT0gIm9iamVjdCIpDQogICAgICAgICAgICBjb3B5W2ldID0gdGhpcy5jb3B5T2JqZWN0KCBhcnJheVtpXSApOw0KICAgICAgICBlbHNlIA0KICAgICAgICAgICAgY29weVtpXSA9IGFycmF5W2ldOw0KICAgIH0NCiAgICByZXR1cm4gY29weTsNCn07DQoNCmV4cG9ydHMuZGVlcENvcHkgPSBmdW5jdGlvbiAob2JqKSB7DQogICAgaWYgKHR5cGVvZiBvYmogIT0gIm9iamVjdCIpIHsNCiAgICAgICAgcmV0dXJuIG9iajsNCiAgICB9DQogICAgDQogICAgdmFyIGNvcHkgPSBvYmouY29uc3RydWN0b3IoKTsNCiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7DQogICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0gPT0gIm9iamVjdCIpIHsNCiAgICAgICAgICAgIGNvcHlba2V5XSA9IHRoaXMuZGVlcENvcHkob2JqW2tleV0pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgY29weVtrZXldID0gb2JqW2tleV07DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGNvcHk7DQp9Ow0KDQpleHBvcnRzLmFycmF5VG9NYXAgPSBmdW5jdGlvbihhcnIpIHsNCiAgICB2YXIgbWFwID0ge307DQogICAgZm9yICh2YXIgaT0wOyBpPGFyci5sZW5ndGg7IGkrKykgew0KICAgICAgICBtYXBbYXJyW2ldXSA9IDE7DQogICAgfQ0KICAgIHJldHVybiBtYXA7DQoNCn07DQoNCi8qKg0KICogc3BsaWNlIG91dCBvZiAnYXJyYXknIGFueXRoaW5nIHRoYXQgPT09ICd2YWx1ZScNCiAqLw0KZXhwb3J0cy5hcnJheVJlbW92ZSA9IGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSkgew0KICBmb3IgKHZhciBpID0gMDsgaSA8PSBhcnJheS5sZW5ndGg7IGkrKykgew0KICAgIGlmICh2YWx1ZSA9PT0gYXJyYXlbaV0pIHsNCiAgICAgIGFycmF5LnNwbGljZShpLCAxKTsNCiAgICB9DQogIH0NCn07DQoNCmV4cG9ydHMuZXNjYXBlUmVnRXhwID0gZnVuY3Rpb24oc3RyKSB7DQogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oWy4qKz9eJHt9KCl8W1xdXC9cXF0pL2csICdcXCQxJyk7DQp9Ow0KDQpleHBvcnRzLmRlZmVycmVkQ2FsbCA9IGZ1bmN0aW9uKGZjbikgew0KDQogICAgdmFyIHRpbWVyID0gbnVsbDsNCiAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGltZXIgPSBudWxsOw0KICAgICAgICBmY24oKTsNCiAgICB9Ow0KDQogICAgdmFyIGRlZmVycmVkID0gZnVuY3Rpb24odGltZW91dCkgew0KICAgICAgICBkZWZlcnJlZC5jYW5jZWwoKTsNCiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGNhbGxiYWNrLCB0aW1lb3V0IHx8IDApOw0KICAgICAgICByZXR1cm4gZGVmZXJyZWQ7DQogICAgfTsNCg0KICAgIGRlZmVycmVkLnNjaGVkdWxlID0gZGVmZXJyZWQ7DQoNCiAgICBkZWZlcnJlZC5jYWxsID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuY2FuY2VsKCk7DQogICAgICAgIGZjbigpOw0KICAgICAgICByZXR1cm4gZGVmZXJyZWQ7DQogICAgfTsNCg0KICAgIGRlZmVycmVkLmNhbmNlbCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpOw0KICAgICAgICB0aW1lciA9IG51bGw7DQogICAgICAgIHJldHVybiBkZWZlcnJlZDsNCiAgICB9Ow0KDQogICAgcmV0dXJuIGRlZmVycmVkOw0KfTsNCg0KfSk7DQovKiANCkNTU0xpbnQNCkNvcHlyaWdodCAoYykgMjAxMSBOaWNvbGUgU3VsbGl2YW4gYW5kIE5pY2hvbGFzIEMuIFpha2FzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KDQpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5DQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbA0KaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbA0KY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzDQpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KDQpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0KYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQoNClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQ0KQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwNCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4NClRIRSBTT0ZUV0FSRS4NCg0KKi8NCmRlZmluZSgnYWNlL21vZGUvY3NzL2Nzc2xpbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KLyohDQpQYXJzZXItTGliDQpDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSBOaWNob2xhcyBDLiBaYWthcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCg0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0Kb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwNCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMNCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4NCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KDQpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQpGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sDQpPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElODQpUSEUgU09GVFdBUkUuDQoNCiovDQovKiBCdWlsZCB0aW1lOiAxMy1KdWx5LTIwMTEgMDQ6MzU6MjggKi8NCnZhciBwYXJzZXJsaWIgPSB7fTsNCihmdW5jdGlvbigpew0KDQovKioNCiAqIEEgZ2VuZXJpYyBiYXNlIHRvIGluaGVyaXQgZnJvbSBmb3IgYW55IG9iamVjdA0KICogdGhhdCBuZWVkcyBldmVudCBoYW5kbGluZy4NCiAqIEBjbGFzcyBFdmVudFRhcmdldA0KICogQGNvbnN0cnVjdG9yDQogKi8NCmZ1bmN0aW9uIEV2ZW50VGFyZ2V0KCl7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgYXJyYXkgb2YgbGlzdGVuZXJzIGZvciB2YXJpb3VzIGV2ZW50cy4NCiAgICAgKiBAdHlwZSBPYmplY3QNCiAgICAgKiBAcHJvcGVydHkgX2xpc3RlbmVycw0KICAgICAqIEBwcml2YXRlDQogICAgICovDQogICAgdGhpcy5fbGlzdGVuZXJzID0ge307ICAgIA0KfQ0KDQpFdmVudFRhcmdldC5wcm90b3R5cGUgPSB7DQoNCiAgICAvL3Jlc3RvcmUgY29uc3RydWN0b3INCiAgICBjb25zdHJ1Y3RvcjogRXZlbnRUYXJnZXQsDQoNCiAgICAvKioNCiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQgdHlwZS4NCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgdHlwZSBvZiBldmVudCB0byBhZGQgYSBsaXN0ZW5lciBmb3IuDQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgb2NjdXJzLg0KICAgICAqIEByZXR1cm4ge3ZvaWR9DQogICAgICogQG1ldGhvZCBhZGRMaXN0ZW5lcg0KICAgICAqLw0KICAgIGFkZExpc3RlbmVyOiBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcil7DQogICAgICAgIGlmICghdGhpcy5fbGlzdGVuZXJzW3R5cGVdKXsNCiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyc1t0eXBlXSA9IFtdOw0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5fbGlzdGVuZXJzW3R5cGVdLnB1c2gobGlzdGVuZXIpOw0KICAgIH0sDQogICAgDQogICAgLyoqDQogICAgICogRmlyZXMgYW4gZXZlbnQgYmFzZWQgb24gdGhlIHBhc3NlZC1pbiBvYmplY3QuDQogICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBldmVudCBBbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBhICd0eXBlJyBhdHRyaWJ1dGUNCiAgICAgKiAgICAgIG9yIGEgc3RyaW5nIGluZGljYXRpbmcgdGhlIGV2ZW50IG5hbWUuDQogICAgICogQHJldHVybiB7dm9pZH0NCiAgICAgKiBAbWV0aG9kIGZpcmUNCiAgICAgKi8gICAgDQogICAgZmlyZTogZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICBpZiAodHlwZW9mIGV2ZW50ID09ICJzdHJpbmciKXsNCiAgICAgICAgICAgIGV2ZW50ID0geyB0eXBlOiBldmVudCB9Ow0KICAgICAgICB9DQogICAgICAgIGlmICghZXZlbnQudGFyZ2V0KXsNCiAgICAgICAgICAgIGV2ZW50LnRhcmdldCA9IHRoaXM7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICghZXZlbnQudHlwZSl7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkV2ZW50IG9iamVjdCBtaXNzaW5nICd0eXBlJyBwcm9wZXJ0eS4iKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVyc1tldmVudC50eXBlXSl7DQogICAgICAgIA0KICAgICAgICAgICAgLy9jcmVhdGUgYSBjb3B5IG9mIHRoZSBhcnJheSBhbmQgdXNlIHRoYXQgc28gbGlzdGVuZXJzIGNhbid0IGNoYW5lDQogICAgICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzW2V2ZW50LnR5cGVdLmNvbmNhdCgpOw0KICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBsZW49bGlzdGVuZXJzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICBsaXN0ZW5lcnNbaV0uY2FsbCh0aGlzLCBldmVudCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gICAgICAgICAgICANCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50IHR5cGUuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgZXZlbnQgdG8gcmVtb3ZlIGEgbGlzdGVuZXIgZnJvbS4NCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gdG8gcmVtb3ZlIGZyb20gdGhlIGV2ZW50Lg0KICAgICAqIEByZXR1cm4ge3ZvaWR9DQogICAgICogQG1ldGhvZCByZW1vdmVMaXN0ZW5lcg0KICAgICAqLw0KICAgIHJlbW92ZUxpc3RlbmVyOiBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcil7DQogICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbdHlwZV0pew0KICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1t0eXBlXTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbGVuPWxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXSA9PT0gbGlzdGVuZXIpew0KICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIA0KICAgICAgICB9ICAgICAgICAgICAgDQogICAgfQ0KfTsNCi8qKg0KICogQ29udmVuaWVudCB3YXkgdG8gcmVhZCB0aHJvdWdoIHN0cmluZ3MuDQogKiBAbmFtZXNwYWNlIHBhcnNlcmxpYi51dGlsDQogKiBAY2xhc3MgU3RyaW5nUmVhZGVyDQogKiBAY29uc3RydWN0b3INCiAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHRvIHJlYWQuDQogKi8NCmZ1bmN0aW9uIFN0cmluZ1JlYWRlcih0ZXh0KXsNCg0KICAgIC8qKg0KICAgICAqIFRoZSBpbnB1dCB0ZXh0IHdpdGggbGluZSBlbmRpbmdzIG5vcm1hbGl6ZWQuDQogICAgICogQHByb3BlcnR5IF9pbnB1dA0KICAgICAqIEB0eXBlIFN0cmluZw0KICAgICAqIEBwcml2YXRlDQogICAgICovDQogICAgdGhpcy5faW5wdXQgPSB0ZXh0LnJlcGxhY2UoL1xuXHI/L2csICJcbiIpOw0KDQoNCiAgICAvKioNCiAgICAgKiBUaGUgcm93IGZvciB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlYWQgbmV4dC4NCiAgICAgKiBAcHJvcGVydHkgX2xpbmUNCiAgICAgKiBAdHlwZSBpbnQNCiAgICAgKiBAcHJpdmF0ZQ0KICAgICAqLw0KICAgIHRoaXMuX2xpbmUgPSAxOw0KDQoNCiAgICAvKioNCiAgICAgKiBUaGUgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlYWQgbmV4dC4NCiAgICAgKiBAcHJvcGVydHkgX2NvbA0KICAgICAqIEB0eXBlIGludA0KICAgICAqIEBwcml2YXRlDQogICAgICovDQogICAgdGhpcy5fY29sID0gMTsNCg0KICAgIC8qKg0KICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGluIHRoZSBpbnB1dCB0byBiZSByZWFkIG5leHQuDQogICAgICogQHByb3BlcnR5IF9jdXJzb3INCiAgICAgKiBAdHlwZSBpbnQNCiAgICAgKiBAcHJpdmF0ZQ0KICAgICAqLw0KICAgIHRoaXMuX2N1cnNvciA9IDA7DQp9DQoNClN0cmluZ1JlYWRlci5wcm90b3R5cGUgPSB7DQoNCiAgICAvL3Jlc3RvcmUgY29uc3RydWN0b3INCiAgICBjb25zdHJ1Y3RvcjogU3RyaW5nUmVhZGVyLA0KDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gUG9zaXRpb24gaW5mbw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgLyoqDQogICAgICogUmV0dXJucyB0aGUgY29sdW1uIG9mIHRoZSBjaGFyYWN0ZXIgdG8gYmUgcmVhZCBuZXh0Lg0KICAgICAqIEByZXR1cm4ge2ludH0gVGhlIGNvbHVtbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlYWQgbmV4dC4NCiAgICAgKiBAbWV0aG9kIGdldENvbA0KICAgICAqLw0KICAgIGdldENvbDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbDsNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUmV0dXJucyB0aGUgcm93IG9mIHRoZSBjaGFyYWN0ZXIgdG8gYmUgcmVhZCBuZXh0Lg0KICAgICAqIEByZXR1cm4ge2ludH0gVGhlIHJvdyBvZiB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlYWQgbmV4dC4NCiAgICAgKiBAbWV0aG9kIGdldExpbmUNCiAgICAgKi8NCiAgICBnZXRMaW5lOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5fbGluZSA7DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIERldGVybWluZXMgaWYgeW91J3JlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0Lg0KICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhlcmUncyBubyBtb3JlIGlucHV0LCBmYWxzZSBvdGhlcndpc2UuDQogICAgICogQG1ldGhvZCBlb2YNCiAgICAgKi8NCiAgICBlb2Y6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiAodGhpcy5fY3Vyc29yID09IHRoaXMuX2lucHV0Lmxlbmd0aCk7DQogICAgfSwNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vIEJhc2ljIHJlYWRpbmcNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgIC8qKg0KICAgICAqIFJlYWRzIHRoZSBuZXh0IGNoYXJhY3RlciB3aXRob3V0IGFkdmFuY2luZyB0aGUgY3Vyc29yLg0KICAgICAqIEBwYXJhbSB7aW50fSBjb3VudCBIb3cgbWFueSBjaGFyYWN0ZXJzIHRvIGxvb2sgYWhlYWQgKGRlZmF1bHQgaXMgMSkuDQogICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgbmV4dCBjaGFyYWN0ZXIgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBuZXh0IGNoYXJhY3Rlci4NCiAgICAgKiBAbWV0aG9kIHBlZWsNCiAgICAgKi8NCiAgICBwZWVrOiBmdW5jdGlvbihjb3VudCl7DQogICAgICAgIHZhciBjID0gbnVsbDsNCiAgICAgICAgY291bnQgPSAodHlwZW9mIGNvdW50ID09ICJ1bmRlZmluZWQiID8gMSA6IGNvdW50KTsNCg0KICAgICAgICAvL2lmIHdlJ3JlIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4uLg0KICAgICAgICBpZiAodGhpcy5fY3Vyc29yIDwgdGhpcy5faW5wdXQubGVuZ3RoKXsNCg0KICAgICAgICAgICAgLy9nZXQgY2hhcmFjdGVyIGFuZCBpbmNyZW1lbnQgY3Vyc29yIGFuZCBjb2x1bW4NCiAgICAgICAgICAgIGMgPSB0aGlzLl9pbnB1dC5jaGFyQXQodGhpcy5fY3Vyc29yICsgY291bnQgLSAxKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBjOw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBSZWFkcyB0aGUgbmV4dCBjaGFyYWN0ZXIgZnJvbSB0aGUgaW5wdXQgYW5kIGFkanVzdHMgdGhlIHJvdyBhbmQgY29sdW1uDQogICAgICogYWNjb3JkaW5nbHkuDQogICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgbmV4dCBjaGFyYWN0ZXIgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBuZXh0IGNoYXJhY3Rlci4NCiAgICAgKiBAbWV0aG9kIHJlYWQNCiAgICAgKi8NCiAgICByZWFkOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgYyA9IG51bGw7DQoNCiAgICAgICAgLy9pZiB3ZSdyZSBub3QgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuLi4NCiAgICAgICAgaWYgKHRoaXMuX2N1cnNvciA8IHRoaXMuX2lucHV0Lmxlbmd0aCl7DQoNCiAgICAgICAgICAgIC8vaWYgdGhlIGxhc3QgY2hhcmFjdGVyIHdhcyBhIG5ld2xpbmUsIGluY3JlbWVudCByb3cgY291bnQNCiAgICAgICAgICAgIC8vYW5kIHJlc2V0IGNvbHVtbiBjb3VudA0KICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0LmNoYXJBdCh0aGlzLl9jdXJzb3IpID09ICJcbiIpew0KICAgICAgICAgICAgICAgIHRoaXMuX2xpbmUrKzsNCiAgICAgICAgICAgICAgICB0aGlzLl9jb2w9MTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdGhpcy5fY29sKys7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vZ2V0IGNoYXJhY3RlciBhbmQgaW5jcmVtZW50IGN1cnNvciBhbmQgY29sdW1uDQogICAgICAgICAgICBjID0gdGhpcy5faW5wdXQuY2hhckF0KHRoaXMuX2N1cnNvcisrKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBjOw0KICAgIH0sDQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAvLyBNaXNjDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAvKioNCiAgICAgKiBTYXZlcyB0aGUgY3VycmVudCBsb2NhdGlvbiBzbyBpdCBjYW4gYmUgcmV0dXJuZWQgdG8gbGF0ZXIuDQogICAgICogQG1ldGhvZCBtYXJrDQogICAgICogQHJldHVybiB7dm9pZH0NCiAgICAgKi8NCiAgICBtYXJrOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLl9ib29rbWFyayA9IHsNCiAgICAgICAgICAgIGN1cnNvcjogdGhpcy5fY3Vyc29yLA0KICAgICAgICAgICAgbGluZTogICB0aGlzLl9saW5lLA0KICAgICAgICAgICAgY29sOiAgICB0aGlzLl9jb2wNCiAgICAgICAgfTsNCiAgICB9LA0KDQogICAgcmVzZXQ6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmICh0aGlzLl9ib29rbWFyayl7DQogICAgICAgICAgICB0aGlzLl9jdXJzb3IgPSB0aGlzLl9ib29rbWFyay5jdXJzb3I7DQogICAgICAgICAgICB0aGlzLl9saW5lID0gdGhpcy5fYm9va21hcmsubGluZTsNCiAgICAgICAgICAgIHRoaXMuX2NvbCA9IHRoaXMuX2Jvb2ttYXJrLmNvbDsNCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9ib29rbWFyazsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAvLyBBZHZhbmNlZCByZWFkaW5nDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAvKioNCiAgICAgKiBSZWFkcyB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBnaXZlbiBzdHJpbmcuIFRocm93cyBhbiBlcnJvciBpZiB0aGF0DQogICAgICogc3RyaW5nIGlzIG5vdCBmb3VuZC4NCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0dGVybiBUaGUgc3RyaW5nIHRvIHJlYWQuDQogICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgc3RyaW5nIHdoZW4gaXQgaXMgZm91bmQuDQogICAgICogQHRocm93cyBFcnJvciB3aGVuIHRoZSBzdHJpbmcgcGF0dGVybiBpcyBub3QgZm91bmQuDQogICAgICogQG1ldGhvZCByZWFkVG8NCiAgICAgKi8NCiAgICByZWFkVG86IGZ1bmN0aW9uKHBhdHRlcm4pew0KDQogICAgICAgIHZhciBidWZmZXIgPSAiIiwNCiAgICAgICAgICAgIGM7DQoNCiAgICAgICAgLyoNCiAgICAgICAgICogRmlyc3QsIGJ1ZmZlciBtdXN0IGJlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgcGF0dGVybi4NCiAgICAgICAgICogVGhlbiwgYnVmZmVyIG11c3QgZW5kIHdpdGggdGhlIHBhdHRlcm4gb3IgZWxzZSByZWFjaCB0aGUNCiAgICAgICAgICogZW5kIG9mIHRoZSBpbnB1dC4NCiAgICAgICAgICovDQogICAgICAgIHdoaWxlIChidWZmZXIubGVuZ3RoIDwgcGF0dGVybi5sZW5ndGggfHwgYnVmZmVyLmxhc3RJbmRleE9mKHBhdHRlcm4pICE9IGJ1ZmZlci5sZW5ndGggLSBwYXR0ZXJuLmxlbmd0aCl7DQogICAgICAgICAgICBjID0gdGhpcy5yZWFkKCk7DQogICAgICAgICAgICBpZiAoYyl7DQogICAgICAgICAgICAgICAgYnVmZmVyICs9IGM7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgXCIiICsgcGF0dGVybiArICJcIiBhdCBsaW5lICIgKyB0aGlzLl9saW5lICArICIsIGNvbCAiICsgdGhpcy5fY29sICsgIi4iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBidWZmZXI7DQoNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUmVhZHMgY2hhcmFjdGVycyB3aGlsZSBlYWNoIGNoYXJhY3RlciBjYXVzZXMgdGhlIGdpdmVuDQogICAgICogZmlsdGVyIGZ1bmN0aW9uIHRvIHJldHVybiB0cnVlLiBUaGUgZnVuY3Rpb24gaXMgcGFzc2VkDQogICAgICogaW4gZWFjaCBjaGFyYWN0ZXIgYW5kIGVpdGhlciByZXR1cm5zIHRydWUgdG8gY29udGludWUNCiAgICAgKiByZWFkaW5nIG9yIGZhbHNlIHRvIHN0b3AuDQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsdGVyIFRoZSBmdW5jdGlvbiB0byByZWFkIG9uIGVhY2ggY2hhcmFjdGVyLg0KICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHN0cmluZyBtYWRlIHVwIG9mIGFsbCBjaGFyYWN0ZXJzIHRoYXQgcGFzc2VkIHRoZQ0KICAgICAqICAgICAgZmlsdGVyIGNoZWNrLg0KICAgICAqIEBtZXRob2QgcmVhZFdoaWxlDQogICAgICovDQogICAgcmVhZFdoaWxlOiBmdW5jdGlvbihmaWx0ZXIpew0KDQogICAgICAgIHZhciBidWZmZXIgPSAiIiwNCiAgICAgICAgICAgIGMgPSB0aGlzLnJlYWQoKTsNCg0KICAgICAgICB3aGlsZShjICE9PSBudWxsICYmIGZpbHRlcihjKSl7DQogICAgICAgICAgICBidWZmZXIgKz0gYzsNCiAgICAgICAgICAgIGMgPSB0aGlzLnJlYWQoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBidWZmZXI7DQoNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUmVhZHMgY2hhcmFjdGVycyB0aGF0IG1hdGNoIGVpdGhlciB0ZXh0IG9yIGEgcmVndWxhciBleHByZXNzaW9uIGFuZA0KICAgICAqIHJldHVybnMgdGhvc2UgY2hhcmFjdGVycy4gSWYgYSBtYXRjaCBpcyBmb3VuZCwgdGhlIHJvdyBhbmQgY29sdW1uDQogICAgICogYXJlIGFkanVzdGVkOyBpZiBubyBtYXRjaCBpcyBmb3VuZCwgdGhlIHJlYWRlcidzIHN0YXRlIGlzIHVuY2hhbmdlZC4NCiAgICAgKiByZWFkaW5nIG9yIGZhbHNlIHRvIHN0b3AuDQogICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBtYXRjaHRlciBJZiBhIHN0cmluZywgdGhlbiB0aGUgbGl0ZXJhbCBzdHJpbmcNCiAgICAgKiAgICAgIHZhbHVlIGlzIHNlYXJjaGVkIGZvci4gSWYgYSByZWd1bGFyIGV4cHJlc3Npb24sIHRoZW4gYW55IHN0cmluZw0KICAgICAqICAgICAgbWF0Y2hpbmcgdGhlIHBhdHRlcm4gaXMgc2VhcmNoIGZvci4NCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBzdHJpbmcgbWFkZSB1cCBvZiBhbGwgY2hhcmFjdGVycyB0aGF0IG1hdGNoZWQgb3INCiAgICAgKiAgICAgIG51bGwgaWYgdGhlcmUgd2FzIG5vIG1hdGNoLg0KICAgICAqIEBtZXRob2QgcmVhZE1hdGNoDQogICAgICovDQogICAgcmVhZE1hdGNoOiBmdW5jdGlvbihtYXRjaGVyKXsNCg0KICAgICAgICB2YXIgc291cmNlID0gdGhpcy5faW5wdXQuc3Vic3RyaW5nKHRoaXMuX2N1cnNvciksDQogICAgICAgICAgICB2YWx1ZSA9IG51bGw7DQoNCiAgICAgICAgLy9pZiBpdCdzIGEgc3RyaW5nLCBqdXN0IGRvIGEgc3RyYWlnaHQgbWF0Y2gNCiAgICAgICAgaWYgKHR5cGVvZiBtYXRjaGVyID09ICJzdHJpbmciKXsNCiAgICAgICAgICAgIGlmIChzb3VyY2UuaW5kZXhPZihtYXRjaGVyKSA9PT0gMCl7DQogICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnJlYWRDb3VudChtYXRjaGVyLmxlbmd0aCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAobWF0Y2hlciBpbnN0YW5jZW9mIFJlZ0V4cCl7DQogICAgICAgICAgICBpZiAobWF0Y2hlci50ZXN0KHNvdXJjZSkpew0KICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5yZWFkQ291bnQoUmVnRXhwLmxhc3RNYXRjaC5sZW5ndGgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHZhbHVlOw0KICAgIH0sDQoNCg0KICAgIC8qKg0KICAgICAqIFJlYWRzIGEgZ2l2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMuIElmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGlzIHJlYWNoZWQsDQogICAgICogaXQgcmVhZHMgb25seSB0aGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYW5kIGRvZXMgbm90IHRocm93IGFuIGVycm9yLg0KICAgICAqIEBwYXJhbSB7aW50fSBjb3VudCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZC4NCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBzdHJpbmcgbWFkZSB1cCB0aGUgcmVhZCBjaGFyYWN0ZXJzLg0KICAgICAqIEBtZXRob2QgcmVhZENvdW50DQogICAgICovDQogICAgcmVhZENvdW50OiBmdW5jdGlvbihjb3VudCl7DQogICAgICAgIHZhciBidWZmZXIgPSAiIjsNCg0KICAgICAgICB3aGlsZShjb3VudC0tKXsNCiAgICAgICAgICAgIGJ1ZmZlciArPSB0aGlzLnJlYWQoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBidWZmZXI7DQogICAgfQ0KDQp9Ow0KLyoqDQogKiBUeXBlIHRvIHVzZSB3aGVuIGEgc3ludGF4IGVycm9yIG9jY3Vycy4NCiAqIEBjbGFzcyBTeW50YXhFcnJvcg0KICogQG5hbWVzcGFjZSBwYXJzZXJsaWIudXRpbA0KICogQGNvbnN0cnVjdG9yDQogKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS4NCiAqIEBwYXJhbSB7aW50fSBsaW5lIFRoZSBsaW5lIGF0IHdoaWNoIHRoZSBlcnJvciBvY2N1cnJlZC4NCiAqIEBwYXJhbSB7aW50fSBjb2wgVGhlIGNvbHVtbiBhdCB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQuDQogKi8NCmZ1bmN0aW9uIFN5bnRheEVycm9yKG1lc3NhZ2UsIGxpbmUsIGNvbCl7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgY29sdW1uIGF0IHdoaWNoIHRoZSBlcnJvciBvY2N1cnJlZC4NCiAgICAgKiBAdHlwZSBpbnQNCiAgICAgKiBAcHJvcGVydHkgY29sDQogICAgICovDQogICAgdGhpcy5jb2wgPSBjb2w7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgbGluZSBhdCB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQuDQogICAgICogQHR5cGUgaW50DQogICAgICogQHByb3BlcnR5IGxpbmUNCiAgICAgKi8NCiAgICB0aGlzLmxpbmUgPSBsaW5lOw0KDQogICAgLyoqDQogICAgICogVGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuaXQuDQogICAgICogQHR5cGUgU3RyaW5nDQogICAgICogQHByb3BlcnR5IHRleHQNCiAgICAgKi8NCiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOw0KDQp9DQoNCi8vaW5oZXJpdCBmcm9tIEVycm9yDQpTeW50YXhFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsNCi8qKg0KICogQmFzZSB0eXBlIHRvIHJlcHJlc2VudCBhIHNpbmdsZSBzeW50YWN0aWMgdW5pdC4NCiAqIEBjbGFzcyBTeW50YXhVbml0DQogKiBAbmFtZXNwYWNlIHBhcnNlcmxpYi51dGlsDQogKiBAY29uc3RydWN0b3INCiAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IG9mIHRoZSB1bml0Lg0KICogQHBhcmFtIHtpbnR9IGxpbmUgVGhlIGxpbmUgb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLg0KICogQHBhcmFtIHtpbnR9IGNvbCBUaGUgY29sdW1uIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4NCiAqLw0KZnVuY3Rpb24gU3ludGF4VW5pdCh0ZXh0LCBsaW5lLCBjb2wpew0KDQoNCiAgICAvKioNCiAgICAgKiBUaGUgY29sdW1uIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4NCiAgICAgKiBAdHlwZSBpbnQNCiAgICAgKiBAcHJvcGVydHkgY29sDQogICAgICovDQogICAgdGhpcy5jb2wgPSBjb2w7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgbGluZSBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuDQogICAgICogQHR5cGUgaW50DQogICAgICogQHByb3BlcnR5IGxpbmUNCiAgICAgKi8NCiAgICB0aGlzLmxpbmUgPSBsaW5lOw0KDQogICAgLyoqDQogICAgICogVGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuaXQuDQogICAgICogQHR5cGUgU3RyaW5nDQogICAgICogQHByb3BlcnR5IHRleHQNCiAgICAgKi8NCiAgICB0aGlzLnRleHQgPSB0ZXh0Ow0KDQp9DQoNCi8qKg0KICogQ3JlYXRlIGEgbmV3IHN5bnRheCB1bml0IGJhc2VkIHNvbGVseSBvbiB0aGUgZ2l2ZW4gdG9rZW4uDQogKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgbmV3IHN5bnRheCB1bml0IHdoZW4NCiAqIGl0IHJlcHJlc2VudHMgYSBzaW5nbGUgdG9rZW4gaW5zdGVhZCBvZiBtdWx0aXBsZS4NCiAqIEBwYXJhbSB7T2JqZWN0fSB0b2tlbiBUaGUgdG9rZW4gb2JqZWN0IHRvIHJlcHJlc2VudC4NCiAqIEByZXR1cm4ge3BhcnNlcmxpYi51dGlsLlN5bnRheFVuaXR9IFRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0b2tlbi4NCiAqIEBzdGF0aWMNCiAqIEBtZXRob2QgZnJvbVRva2VuDQogKi8NClN5bnRheFVuaXQuZnJvbVRva2VuID0gZnVuY3Rpb24odG9rZW4pew0KICAgIHJldHVybiBuZXcgU3ludGF4VW5pdCh0b2tlbi52YWx1ZSwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7DQp9Ow0KDQpTeW50YXhVbml0LnByb3RvdHlwZSA9IHsNCg0KICAgIC8vcmVzdG9yZSBjb25zdHJ1Y3Rvcg0KICAgIGNvbnN0cnVjdG9yOiBTeW50YXhVbml0LA0KICAgIA0KICAgIC8qKg0KICAgICAqIFJldHVybnMgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuaXQuDQogICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5pdC4NCiAgICAgKiBAbWV0aG9kIHZhbHVlT2YNCiAgICAgKi8NCiAgICB2YWx1ZU9mOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpOw0KICAgIH0sDQogICAgDQogICAgLyoqDQogICAgICogUmV0dXJucyB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5pdC4NCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1bml0Lg0KICAgICAqIEBtZXRob2QgdG9TdHJpbmcNCiAgICAgKi8NCiAgICB0b1N0cmluZzogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMudGV4dDsNCiAgICB9DQoNCn07DQovKioNCiAqIEdlbmVyaWMgVG9rZW5TdHJlYW0gcHJvdmlkaW5nIGJhc2UgZnVuY3Rpb25hbGl0eS4NCiAqIEBjbGFzcyBUb2tlblN0cmVhbUJhc2UNCiAqIEBuYW1lc3BhY2UgcGFyc2VybGliLnV0aWwNCiAqIEBjb25zdHJ1Y3Rvcg0KICogQHBhcmFtIHtTdHJpbmd8U3RyaW5nUmVhZGVyfSBpbnB1dCBUaGUgdGV4dCB0byB0b2tlbml6ZSBvciBhIHJlYWRlciBmcm9tIA0KICogICAgICB3aGljaCB0byByZWFkIHRoZSBpbnB1dC4NCiAqLw0KZnVuY3Rpb24gVG9rZW5TdHJlYW1CYXNlKGlucHV0LCB0b2tlbkRhdGEpew0KDQogICAgLyoqDQogICAgICogVGhlIHN0cmluZyByZWFkZXIgZm9yIGVhc3kgYWNjZXNzIHRvIHRoZSB0ZXh0Lg0KICAgICAqIEB0eXBlIFN0cmluZ1JlYWRlcg0KICAgICAqIEBwcm9wZXJ0eSBfcmVhZGVyDQogICAgICogQHByaXZhdGUNCiAgICAgKi8NCiAgICAvL3RoaXMuX3JlYWRlciA9ICh0eXBlb2YgaW5wdXQgPT0gInN0cmluZyIpID8gbmV3IFN0cmluZ1JlYWRlcihpbnB1dCkgOiBpbnB1dDsNCiAgICB0aGlzLl9yZWFkZXIgPSBpbnB1dCA/IG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQudG9TdHJpbmcoKSkgOiBudWxsOw0KICAgIA0KICAgIC8qKg0KICAgICAqIFRva2VuIG9iamVjdCBmb3IgdGhlIGxhc3QgY29uc3VtZWQgdG9rZW4uDQogICAgICogQHR5cGUgVG9rZW4NCiAgICAgKiBAcHJvcGVydHkgX3Rva2VuDQogICAgICogQHByaXZhdGUNCiAgICAgKi8NCiAgICB0aGlzLl90b2tlbiA9IG51bGw7ICAgIA0KICAgIA0KICAgIC8qKg0KICAgICAqIFRoZSBhcnJheSBvZiB0b2tlbiBpbmZvcm1hdGlvbi4NCiAgICAgKiBAdHlwZSBBcnJheQ0KICAgICAqIEBwcm9wZXJ0eSBfdG9rZW5EYXRhDQogICAgICogQHByaXZhdGUNCiAgICAgKi8NCiAgICB0aGlzLl90b2tlbkRhdGEgPSB0b2tlbkRhdGE7DQogICAgDQogICAgLyoqDQogICAgICogTG9va2FoZWFkIHRva2VuIGJ1ZmZlci4NCiAgICAgKiBAdHlwZSBBcnJheQ0KICAgICAqIEBwcm9wZXJ0eSBfbHQNCiAgICAgKiBAcHJpdmF0ZQ0KICAgICAqLw0KICAgIHRoaXMuX2x0ID0gW107DQogICAgDQogICAgLyoqDQogICAgICogTG9va2FoZWFkIHRva2VuIGJ1ZmZlciBpbmRleC4NCiAgICAgKiBAdHlwZSBpbnQNCiAgICAgKiBAcHJvcGVydHkgX2x0SW5kZXgNCiAgICAgKiBAcHJpdmF0ZQ0KICAgICAqLw0KICAgIHRoaXMuX2x0SW5kZXggPSAwOw0KICAgIA0KICAgIHRoaXMuX2x0SW5kZXhDYWNoZSA9IFtdOw0KfQ0KDQovKioNCiAqIEFjY2VwdHMgYW4gYXJyYXkgb2YgdG9rZW4gaW5mb3JtYXRpb24gYW5kIG91dHB1dHMNCiAqIGFuIGFycmF5IG9mIHRva2VuIGRhdGEgY29udGFpbmluZyBrZXktdmFsdWUgbWFwcGluZ3MNCiAqIGFuZCBtYXRjaGluZyBmdW5jdGlvbnMgdGhhdCB0aGUgVG9rZW5TdHJlYW0gbmVlZHMuDQogKiBAcGFyYW0ge0FycmF5fSB0b2tlbnMgQW4gYXJyYXkgb2YgdG9rZW4gZGVzY3JpcHRvcnMuDQogKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgcHJvY2Vzc2VkIHRva2VuIGRhdGEuDQogKiBAbWV0aG9kIGNyZWF0ZVRva2VuRGF0YQ0KICogQHN0YXRpYw0KICovDQpUb2tlblN0cmVhbUJhc2UuY3JlYXRlVG9rZW5EYXRhID0gZnVuY3Rpb24odG9rZW5zKXsNCg0KICAgIHZhciBuYW1lTWFwIAk9IFtdLA0KICAgICAgICB0eXBlTWFwIAk9IHt9LA0KCQl0b2tlbkRhdGEgCT0gdG9rZW5zLmNvbmNhdChbXSksDQoJCWkJCQk9IDAsDQoJCWxlbgkJCT0gdG9rZW5EYXRhLmxlbmd0aCsxOw0KICAgIA0KICAgIHRva2VuRGF0YS5VTktOT1dOID0gLTE7DQoJdG9rZW5EYXRhLnVuc2hpZnQoe25hbWU6IkVPRiJ9KTsNCg0KICAgIGZvciAoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICBuYW1lTWFwLnB1c2godG9rZW5EYXRhW2ldLm5hbWUpOw0KICAgICAgICB0b2tlbkRhdGFbdG9rZW5EYXRhW2ldLm5hbWVdID0gaTsNCiAgICAgICAgaWYgKHRva2VuRGF0YVtpXS50ZXh0KXsNCiAgICAgICAgICAgIHR5cGVNYXBbdG9rZW5EYXRhW2ldLnRleHRdID0gaTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICB0b2tlbkRhdGEubmFtZSA9IGZ1bmN0aW9uKHR0KXsNCiAgICAgICAgcmV0dXJuIG5hbWVNYXBbdHRdOw0KICAgIH07DQogICAgDQogICAgdG9rZW5EYXRhLnR5cGUgPSBmdW5jdGlvbihjKXsNCiAgICAgICAgcmV0dXJuIHR5cGVNYXBbY107DQogICAgfTsNCgkNCglyZXR1cm4gdG9rZW5EYXRhOw0KfTsNCg0KVG9rZW5TdHJlYW1CYXNlLnByb3RvdHlwZSA9IHsNCg0KICAgIC8vcmVzdG9yZSBjb25zdHJ1Y3Rvcg0KICAgIGNvbnN0cnVjdG9yOiBUb2tlblN0cmVhbUJhc2UsICAgIA0KICAgIA0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vIE1hdGNoaW5nIG1ldGhvZHMNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICANCiAgICAvKioNCiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhlIGdpdmVuIHRva2VuIHR5cGUuDQogICAgICogSWYgc28sIHRoYXQgdG9rZW4gaXMgY29uc3VtZWQ7IGlmIG5vdCwgdGhlIHRva2VuIGlzIHBsYWNlZA0KICAgICAqIGJhY2sgb250byB0aGUgdG9rZW4gc3RyZWFtLiBZb3UgY2FuIHBhc3MgaW4gYW55IG51bWJlciBvZg0KICAgICAqIHRva2VuIHR5cGVzIGFuZCB0aGlzIHdpbGwgcmV0dXJuIHRydWUgaWYgYW55IG9mIHRoZSB0b2tlbg0KICAgICAqIHR5cGVzIGlzIGZvdW5kLg0KICAgICAqIEBwYXJhbSB7aW50fGludFtdfSB0b2tlblR5cGVzIEVpdGhlciBhIHNpbmdsZSB0b2tlbiB0eXBlIG9yIGFuIGFycmF5IG9mDQogICAgICogICAgICB0b2tlbiB0eXBlcyB0aGF0IHRoZSBuZXh0IHRva2VuIG1pZ2h0IGJlLiBJZiBhbiBhcnJheSBpcyBwYXNzZWQsDQogICAgICogICAgICBpdCdzIGFzc3VtZWQgdGhhdCB0aGUgdG9rZW4gY2FuIGJlIGFueSBvZiB0aGVzZS4NCiAgICAgKiBAcGFyYW0ge3ZhcmlhbnR9IGNoYW5uZWwgKE9wdGlvbmFsKSBUaGUgY2hhbm5lbCB0byByZWFkIGZyb20uIElmIG5vdA0KICAgICAqICAgICAgcHJvdmlkZWQsIHJlYWRzIGZyb20gdGhlIGRlZmF1bHQgKHVubmFtZWQpIGNoYW5uZWwuDQogICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdG9rZW4gdHlwZSBtYXRjaGVzLCBmYWxzZSBpZiBub3QuDQogICAgICogQG1ldGhvZCBtYXRjaA0KICAgICAqLw0KICAgIG1hdGNoOiBmdW5jdGlvbih0b2tlblR5cGVzLCBjaGFubmVsKXsNCiAgICANCiAgICAgICAgLy9hbHdheXMgY29udmVydCB0byBhbiBhcnJheSwgbWFrZXMgdGhpbmdzIGVhc2llcg0KICAgICAgICBpZiAoISh0b2tlblR5cGVzIGluc3RhbmNlb2YgQXJyYXkpKXsNCiAgICAgICAgICAgIHRva2VuVHlwZXMgPSBbdG9rZW5UeXBlc107DQogICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgdmFyIHR0ICA9IHRoaXMuZ2V0KGNoYW5uZWwpLA0KICAgICAgICAgICAgaSAgID0gMCwNCiAgICAgICAgICAgIGxlbiA9IHRva2VuVHlwZXMubGVuZ3RoOw0KICAgICAgICAgICAgDQogICAgICAgIHdoaWxlKGkgPCBsZW4pew0KICAgICAgICAgICAgaWYgKHR0ID09IHRva2VuVHlwZXNbaSsrXSl7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vbm8gbWF0Y2ggZm91bmQsIHB1dCB0aGUgdG9rZW4gYmFjaw0KICAgICAgICB0aGlzLnVuZ2V0KCk7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9LCAgICANCiAgICANCiAgICAvKioNCiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhlIGdpdmVuIHRva2VuIHR5cGUuDQogICAgICogSWYgc28sIHRoYXQgdG9rZW4gaXMgY29uc3VtZWQ7IGlmIG5vdCwgYW4gZXJyb3IgaXMgdGhyb3duLg0KICAgICAqIEBwYXJhbSB7aW50fGludFtdfSB0b2tlblR5cGVzIEVpdGhlciBhIHNpbmdsZSB0b2tlbiB0eXBlIG9yIGFuIGFycmF5IG9mDQogICAgICogICAgICB0b2tlbiB0eXBlcyB0aGF0IHRoZSBuZXh0IHRva2VuIHNob3VsZCBiZS4gSWYgYW4gYXJyYXkgaXMgcGFzc2VkLA0KICAgICAqICAgICAgaXQncyBhc3N1bWVkIHRoYXQgdGhlIHRva2VuIG11c3QgYmUgb25lIG9mIHRoZXNlLg0KICAgICAqIEBwYXJhbSB7dmFyaWFudH0gY2hhbm5lbCAoT3B0aW9uYWwpIFRoZSBjaGFubmVsIHRvIHJlYWQgZnJvbS4gSWYgbm90DQogICAgICogICAgICBwcm92aWRlZCwgcmVhZHMgZnJvbSB0aGUgZGVmYXVsdCAodW5uYW1lZCkgY2hhbm5lbC4NCiAgICAgKiBAcmV0dXJuIHt2b2lkfQ0KICAgICAqIEBtZXRob2QgbXVzdE1hdGNoDQogICAgICovICAgIA0KICAgIG11c3RNYXRjaDogZnVuY3Rpb24odG9rZW5UeXBlcywgY2hhbm5lbCl7DQoNCiAgICAgICAgLy9hbHdheXMgY29udmVydCB0byBhbiBhcnJheSwgbWFrZXMgdGhpbmdzIGVhc2llcg0KICAgICAgICBpZiAoISh0b2tlblR5cGVzIGluc3RhbmNlb2YgQXJyYXkpKXsNCiAgICAgICAgICAgIHRva2VuVHlwZXMgPSBbdG9rZW5UeXBlc107DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoIXRoaXMubWF0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKSl7ICAgIA0KICAgICAgICAgICAgdG9rZW4gPSB0aGlzLkxUKDEpOw0KICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJFeHBlY3RlZCAiICsgdGhpcy5fdG9rZW5EYXRhW3Rva2VuVHlwZXNbMF1dLm5hbWUgKyANCiAgICAgICAgICAgICAgICAiIGF0IGxpbmUgIiArIHRva2VuLnN0YXJ0TGluZSArICIsIGNvbCAiICsgdG9rZW4uc3RhcnRDb2wgKyAiLiIsIHRva2VuLnN0YXJ0TGluZSwgdG9rZW4uc3RhcnRDb2wpOw0KICAgICAgICB9DQogICAgfSwNCiAgICANCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAvLyBDb25zdW1pbmcgbWV0aG9kcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIA0KICAgIC8qKg0KICAgICAqIEtlZXBzIHJlYWRpbmcgZnJvbSB0aGUgdG9rZW4gc3RyZWFtIHVudGlsIGVpdGhlciBvbmUgb2YgdGhlIHNwZWNpZmllZA0KICAgICAqIHRva2VuIHR5cGVzIGlzIGZvdW5kIG9yIHVudGlsIHRoZSBlbmQgb2YgdGhlIGlucHV0IGlzIHJlYWNoZWQuDQogICAgICogQHBhcmFtIHtpbnR8aW50W119IHRva2VuVHlwZXMgRWl0aGVyIGEgc2luZ2xlIHRva2VuIHR5cGUgb3IgYW4gYXJyYXkgb2YNCiAgICAgKiAgICAgIHRva2VuIHR5cGVzIHRoYXQgdGhlIG5leHQgdG9rZW4gc2hvdWxkIGJlLiBJZiBhbiBhcnJheSBpcyBwYXNzZWQsDQogICAgICogICAgICBpdCdzIGFzc3VtZWQgdGhhdCB0aGUgdG9rZW4gbXVzdCBiZSBvbmUgb2YgdGhlc2UuDQogICAgICogQHBhcmFtIHt2YXJpYW50fSBjaGFubmVsIChPcHRpb25hbCkgVGhlIGNoYW5uZWwgdG8gcmVhZCBmcm9tLiBJZiBub3QNCiAgICAgKiAgICAgIHByb3ZpZGVkLCByZWFkcyBmcm9tIHRoZSBkZWZhdWx0ICh1bm5hbWVkKSBjaGFubmVsLg0KICAgICAqIEByZXR1cm4ge3ZvaWR9DQogICAgICogQG1ldGhvZCBhZHZhbmNlDQogICAgICovDQogICAgYWR2YW5jZTogZnVuY3Rpb24odG9rZW5UeXBlcywgY2hhbm5lbCl7DQogICAgICAgIA0KICAgICAgICB3aGlsZSh0aGlzLkxBKDApICE9IDAgJiYgIXRoaXMubWF0Y2godG9rZW5UeXBlcywgY2hhbm5lbCkpew0KICAgICAgICAgICAgdGhpcy5nZXQoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB0aGlzLkxBKDApOyAgICANCiAgICB9LA0KICAgIA0KICAgIC8qKg0KICAgICAqIENvbnN1bWVzIHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIHRva2VuIHN0cmVhbS4gDQogICAgICogQHJldHVybiB7aW50fSBUaGUgdG9rZW4gdHlwZSBvZiB0aGUgdG9rZW4gdGhhdCB3YXMganVzdCBjb25zdW1lZC4NCiAgICAgKiBAbWV0aG9kIGdldA0KICAgICAqLyAgICAgIA0KICAgIGdldDogZnVuY3Rpb24oY2hhbm5lbCl7DQogICAgDQogICAgICAgIHZhciB0b2tlbkluZm8gICA9IHRoaXMuX3Rva2VuRGF0YSwNCiAgICAgICAgICAgIHJlYWRlciAgICAgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgdmFsdWUsDQogICAgICAgICAgICBpICAgICAgICAgICA9MCwNCiAgICAgICAgICAgIGxlbiAgICAgICAgID0gdG9rZW5JbmZvLmxlbmd0aCwNCiAgICAgICAgICAgIGZvdW5kICAgICAgID0gZmFsc2UsDQogICAgICAgICAgICB0b2tlbiwNCiAgICAgICAgICAgIGluZm87DQogICAgICAgICAgICANCiAgICAgICAgLy9jaGVjayB0aGUgbG9va2FoZWFkIGJ1ZmZlciBmaXJzdA0KICAgICAgICBpZiAodGhpcy5fbHQubGVuZ3RoICYmIHRoaXMuX2x0SW5kZXggPj0gMCAmJiB0aGlzLl9sdEluZGV4IDwgdGhpcy5fbHQubGVuZ3RoKXsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICBpKys7DQogICAgICAgICAgICB0aGlzLl90b2tlbiA9IHRoaXMuX2x0W3RoaXMuX2x0SW5kZXgrK107DQogICAgICAgICAgICBpbmZvID0gdG9rZW5JbmZvW3RoaXMuX3Rva2VuLnR5cGVdOw0KICAgICAgICAgICAgDQogICAgICAgICAgICAvL29iZXkgY2hhbm5lbHMgbG9naWMNCiAgICAgICAgICAgIHdoaWxlKChpbmZvLmNoYW5uZWwgIT09IHVuZGVmaW5lZCAmJiBjaGFubmVsICE9PSBpbmZvLmNoYW5uZWwpICYmDQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2x0SW5kZXggPCB0aGlzLl9sdC5sZW5ndGgpew0KICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gdGhpcy5fbHRbdGhpcy5fbHRJbmRleCsrXTsNCiAgICAgICAgICAgICAgICBpbmZvID0gdG9rZW5JbmZvW3RoaXMuX3Rva2VuLnR5cGVdOw0KICAgICAgICAgICAgICAgIGkrKzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy9oZXJlIGJlIGRyYWdvbnMNCiAgICAgICAgICAgIGlmICgoaW5mby5jaGFubmVsID09PSB1bmRlZmluZWQgfHwgY2hhbm5lbCA9PT0gaW5mby5jaGFubmVsKSAmJg0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9sdEluZGV4IDw9IHRoaXMuX2x0Lmxlbmd0aCl7DQogICAgICAgICAgICAgICAgdGhpcy5fbHRJbmRleENhY2hlLnB1c2goaSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Rva2VuLnR5cGU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vY2FsbCB0b2tlbiByZXRyaWV2ZXIgbWV0aG9kDQoJCXRva2VuID0gdGhpcy5fZ2V0VG9rZW4oKTsNCg0KICAgICAgICAvL2lmIGl0IHNob3VsZCBiZSBoaWRkZW4sIGRvbid0IHNhdmUgYSB0b2tlbg0KICAgICAgICBpZiAodG9rZW4udHlwZSA+IC0xICYmICF0b2tlbkluZm9bdG9rZW4udHlwZV0uaGlkZSl7DQogICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIC8vYXBwbHkgdG9rZW4gY2hhbm5lbA0KICAgICAgICAgICAgdG9rZW4uY2hhbm5lbCA9IHRva2VuSW5mb1t0b2tlbi50eXBlXS5jaGFubmVsOw0KICAgICAgICAgDQogICAgICAgICAgICAvL3NhdmUgZm9yIGxhdGVyDQogICAgICAgICAgICB0aGlzLl90b2tlbiA9IHRva2VuOw0KICAgICAgICAgICAgdGhpcy5fbHQucHVzaCh0b2tlbik7DQoNCiAgICAgICAgICAgIC8vc2F2ZSBzcGFjZSB0aGF0IHdpbGwgYmUgbW92ZWQgKG11c3QgYmUgZG9uZSBiZWZvcmUgYXJyYXkgaXMgdHJ1bmNhdGVkKQ0KICAgICAgICAgICAgdGhpcy5fbHRJbmRleENhY2hlLnB1c2godGhpcy5fbHQubGVuZ3RoIC0gdGhpcy5fbHRJbmRleCArIGkpOyAgDQogICAgICAgIA0KICAgICAgICAgICAgLy9rZWVwIHRoZSBidWZmZXIgdW5kZXIgNSBpdGVtcw0KICAgICAgICAgICAgaWYgKHRoaXMuX2x0Lmxlbmd0aCA+IDUpew0KICAgICAgICAgICAgICAgIHRoaXMuX2x0LnNoaWZ0KCk7ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAvL2Fsc28ga2VlcCB0aGUgc2hpZnQgYnVmZmVyIHVuZGVyIDUgaXRlbXMNCiAgICAgICAgICAgIGlmICh0aGlzLl9sdEluZGV4Q2FjaGUubGVuZ3RoID4gNSl7DQogICAgICAgICAgICAgICAgdGhpcy5fbHRJbmRleENhY2hlLnNoaWZ0KCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAvL3VwZGF0ZSBsb29rYWhlYWQgaW5kZXgNCiAgICAgICAgICAgIHRoaXMuX2x0SW5kZXggPSB0aGlzLl9sdC5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAvKg0KICAgICAgICAgKiBTa2lwIHRvIHRoZSBuZXh0IHRva2VuIGlmOg0KICAgICAgICAgKiAxLiBUaGUgdG9rZW4gdHlwZSBpcyBtYXJrZWQgYXMgaGlkZGVuLg0KICAgICAgICAgKiAyLiBUaGUgdG9rZW4gdHlwZSBoYXMgYSBjaGFubmVsIHNwZWNpZmllZCBhbmQgaXQgaXNuJ3QgdGhlIGN1cnJlbnQgY2hhbm5lbC4NCiAgICAgICAgICovDQogICAgICAgIGluZm8gPSB0b2tlbkluZm9bdG9rZW4udHlwZV07DQogICAgICAgIGlmIChpbmZvICYmIA0KICAgICAgICAgICAgICAgIChpbmZvLmhpZGUgfHwgDQogICAgICAgICAgICAgICAgKGluZm8uY2hhbm5lbCAhPT0gdW5kZWZpbmVkICYmIGNoYW5uZWwgIT09IGluZm8uY2hhbm5lbCkpKXsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChjaGFubmVsKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIC8vcmV0dXJuIGp1c3QgdGhlIHR5cGUNCiAgICAgICAgICAgIHJldHVybiB0b2tlbi50eXBlOw0KICAgICAgICB9DQogICAgfSwNCiAgICANCiAgICAvKioNCiAgICAgKiBMb29rcyBhaGVhZCBhIGNlcnRhaW4gbnVtYmVyIG9mIHRva2VucyBhbmQgcmV0dXJucyB0aGUgdG9rZW4gdHlwZSBhdA0KICAgICAqIHRoYXQgcG9zaXRpb24uIFRoaXMgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB5b3UgbG9va2FoZWFkIHBhc3QgdGhlDQogICAgICogZW5kIG9mIGlucHV0LCBwYXN0IHRoZSBzaXplIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyLCBvciBiYWNrIHBhc3QNCiAgICAgKiB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIGxvb2thaGVhZCBidWZmZXIuDQogICAgICogQHBhcmFtIHtpbnR9IFRoZSBpbmRleCBvZiB0aGUgdG9rZW4gdHlwZSB0byByZXRyaWV2ZS4gMCBmb3IgdGhlDQogICAgICogICAgICBjdXJyZW50IHRva2VuLCAxIGZvciB0aGUgbmV4dCwgLTEgZm9yIHRoZSBwcmV2aW91cywgZXRjLg0KICAgICAqIEByZXR1cm4ge2ludH0gVGhlIHRva2VuIHR5cGUgb2YgdGhlIHRva2VuIGluIHRoZSBnaXZlbiBwb3NpdGlvbi4NCiAgICAgKiBAbWV0aG9kIExBDQogICAgICovDQogICAgTEE6IGZ1bmN0aW9uKGluZGV4KXsNCiAgICAgICAgdmFyIHRvdGFsID0gaW5kZXgsDQogICAgICAgICAgICB0dDsNCiAgICAgICAgaWYgKGluZGV4ID4gMCl7DQogICAgICAgICAgICAvL1RPRE86IFN0b3JlIDUgc29tZXdoZXJlDQogICAgICAgICAgICBpZiAoaW5kZXggPiA1KXsNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRvbyBtdWNoIGxvb2thaGVhZC4iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICAgICAvL2dldCBhbGwgdGhvc2UgdG9rZW5zDQogICAgICAgICAgICB3aGlsZSh0b3RhbCl7DQogICAgICAgICAgICAgICAgdHQgPSB0aGlzLmdldCgpOyAgIA0KICAgICAgICAgICAgICAgIHRvdGFsLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAvL3VuZ2V0IGFsbCB0aG9zZSB0b2tlbnMNCiAgICAgICAgICAgIHdoaWxlKHRvdGFsIDwgaW5kZXgpew0KICAgICAgICAgICAgICAgIHRoaXMudW5nZXQoKTsNCiAgICAgICAgICAgICAgICB0b3RhbCsrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGluZGV4IDwgMCl7DQogICAgICAgIA0KICAgICAgICAgICAgaWYodGhpcy5fbHRbdGhpcy5fbHRJbmRleCtpbmRleF0pew0KICAgICAgICAgICAgICAgIHR0ID0gdGhpcy5fbHRbdGhpcy5fbHRJbmRleCtpbmRleF0udHlwZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUb28gbXVjaCBsb29rYmVoaW5kLiIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHR0ID0gdGhpcy5fdG9rZW4udHlwZTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHR0Ow0KICAgIA0KICAgIH0sDQogICAgDQogICAgLyoqDQogICAgICogTG9va3MgYWhlYWQgYSBjZXJ0YWluIG51bWJlciBvZiB0b2tlbnMgYW5kIHJldHVybnMgdGhlIHRva2VuIGF0DQogICAgICogdGhhdCBwb3NpdGlvbi4gVGhpcyB3aWxsIHRocm93IGFuIGVycm9yIGlmIHlvdSBsb29rYWhlYWQgcGFzdCB0aGUNCiAgICAgKiBlbmQgb2YgaW5wdXQsIHBhc3QgdGhlIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIsIG9yIGJhY2sgcGFzdA0KICAgICAqIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgbG9va2FoZWFkIGJ1ZmZlci4NCiAgICAgKiBAcGFyYW0ge2ludH0gVGhlIGluZGV4IG9mIHRoZSB0b2tlbiB0eXBlIHRvIHJldHJpZXZlLiAwIGZvciB0aGUNCiAgICAgKiAgICAgIGN1cnJlbnQgdG9rZW4sIDEgZm9yIHRoZSBuZXh0LCAtMSBmb3IgdGhlIHByZXZpb3VzLCBldGMuDQogICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgdG9rZW4gb2YgdGhlIHRva2VuIGluIHRoZSBnaXZlbiBwb3NpdGlvbi4NCiAgICAgKiBAbWV0aG9kIExBDQogICAgICovICAgIA0KICAgIExUOiBmdW5jdGlvbihpbmRleCl7DQogICAgDQogICAgICAgIC8vbG9va2FoZWFkIGZpcnN0IHRvIHByaW1lIHRoZSB0b2tlbiBidWZmZXINCiAgICAgICAgdGhpcy5MQShpbmRleCk7DQogICAgICAgIA0KICAgICAgICAvL25vdyBmaW5kIHRoZSB0b2tlbiwgc3VidHJhY3Qgb25lIGJlY2F1c2UgX2x0SW5kZXggaXMgYWxyZWFkeSBhdCB0aGUgbmV4dCBpbmRleA0KICAgICAgICByZXR1cm4gdGhpcy5fbHRbdGhpcy5fbHRJbmRleCtpbmRleC0xXTsgICAgDQogICAgfSwNCiAgICANCiAgICAvKioNCiAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbiB0eXBlIGZvciB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgc3RyZWFtIHdpdGhvdXQgDQogICAgICogY29uc3VtaW5nIGl0Lg0KICAgICAqIEByZXR1cm4ge2ludH0gVGhlIHRva2VuIHR5cGUgb2YgdGhlIG5leHQgdG9rZW4gaW4gdGhlIHN0cmVhbS4NCiAgICAgKiBAbWV0aG9kIHBlZWsNCiAgICAgKi8NCiAgICBwZWVrOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5MQSgxKTsNCiAgICB9LA0KICAgIA0KICAgIC8qKg0KICAgICAqIFJldHVybnMgdGhlIGFjdHVhbCB0b2tlbiBvYmplY3QgZm9yIHRoZSBsYXN0IGNvbnN1bWVkIHRva2VuLg0KICAgICAqIEByZXR1cm4ge1Rva2VufSBUaGUgdG9rZW4gb2JqZWN0IGZvciB0aGUgbGFzdCBjb25zdW1lZCB0b2tlbi4NCiAgICAgKiBAbWV0aG9kIHRva2VuDQogICAgICovDQogICAgdG9rZW46IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLl90b2tlbjsNCiAgICB9LA0KICAgIA0KICAgIC8qKg0KICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHRva2VuIGZvciB0aGUgZ2l2ZW4gdG9rZW4gdHlwZS4NCiAgICAgKiBAcGFyYW0ge2ludH0gdG9rZW5UeXBlIFRoZSB0eXBlIG9mIHRva2VuIHRvIGdldCB0aGUgbmFtZSBvZi4NCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSB0b2tlbiBvciAiVU5LTk9XTl9UT0tFTiIgZm9yIGFueQ0KICAgICAqICAgICAgaW52YWxpZCB0b2tlbiB0eXBlLg0KICAgICAqIEBtZXRob2QgdG9rZW5OYW1lDQogICAgICovDQogICAgdG9rZW5OYW1lOiBmdW5jdGlvbih0b2tlblR5cGUpew0KICAgICAgICBpZiAodG9rZW5UeXBlIDwgMCB8fCB0b2tlblR5cGUgPiB0aGlzLl90b2tlbkRhdGEubGVuZ3RoKXsNCiAgICAgICAgICAgIHJldHVybiAiVU5LTk9XTl9UT0tFTiI7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW5EYXRhW3Rva2VuVHlwZV0ubmFtZTsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgDQogICAgLyoqDQogICAgICogUmV0dXJucyB0aGUgdG9rZW4gdHlwZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHRva2VuIG5hbWUuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IHRva2VuTmFtZSBUaGUgbmFtZSBvZiB0aGUgdG9rZW4gd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkLg0KICAgICAqIEByZXR1cm4ge2ludH0gVGhlIHRva2VuIHR5cGUgdmFsdWUgZm9yIHRoZSBnaXZlbiB0b2tlbiBuYW1lIG9yIC0xDQogICAgICogICAgICBmb3IgYW4gdW5rbm93biB0b2tlbi4NCiAgICAgKiBAbWV0aG9kIHRva2VuTmFtZQ0KICAgICAqLyAgICANCiAgICB0b2tlblR5cGU6IGZ1bmN0aW9uKHRva2VuTmFtZSl7DQogICAgICAgIHJldHVybiB0aGlzLl90b2tlbkRhdGFbdG9rZW5OYW1lXSB8fCAtMTsNCiAgICB9LA0KICAgIA0KICAgIC8qKg0KICAgICAqIFJldHVybnMgdGhlIGxhc3QgY29uc3VtZWQgdG9rZW4gdG8gdGhlIHRva2VuIHN0cmVhbS4NCiAgICAgKiBAbWV0aG9kIHVuZ2V0DQogICAgICovICAgICAgDQogICAgdW5nZXQ6IGZ1bmN0aW9uKCl7DQogICAgICAgIC8vaWYgKHRoaXMuX2x0SW5kZXggPiAtMSl7DQogICAgICAgIGlmICh0aGlzLl9sdEluZGV4Q2FjaGUubGVuZ3RoKXsNCiAgICAgICAgICAgIHRoaXMuX2x0SW5kZXggLT0gdGhpcy5fbHRJbmRleENhY2hlLnBvcCgpOy8vLS07DQogICAgICAgICAgICB0aGlzLl90b2tlbiA9IHRoaXMuX2x0W3RoaXMuX2x0SW5kZXggLSAxXTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVG9vIG11Y2ggbG9va2FoZWFkLiIpOw0KICAgICAgICB9DQogICAgfQ0KDQp9Ow0KDQoNCg0KcGFyc2VybGliLnV0aWwgPSB7DQpTdHJpbmdSZWFkZXI6IFN0cmluZ1JlYWRlciwNClN5bnRheEVycm9yIDogU3ludGF4RXJyb3IsDQpTeW50YXhVbml0ICA6IFN5bnRheFVuaXQsDQpFdmVudFRhcmdldCA6IEV2ZW50VGFyZ2V0LA0KVG9rZW5TdHJlYW1CYXNlIDogVG9rZW5TdHJlYW1CYXNlDQp9Ow0KfSkoKTsNCg0KLyogDQpQYXJzZXItTGliDQpDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSBOaWNob2xhcyBDLiBaYWthcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCg0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0Kb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwNCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMNCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4NCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KDQpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQpGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sDQpPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElODQpUSEUgU09GVFdBUkUuDQoNCiovDQovKiBCdWlsZCB0aW1lOiAxMy1KdWx5LTIwMTEgMDQ6MzU6MjggKi8NCihmdW5jdGlvbigpew0KdmFyIEV2ZW50VGFyZ2V0ID0gcGFyc2VybGliLnV0aWwuRXZlbnRUYXJnZXQsDQpUb2tlblN0cmVhbUJhc2UgPSBwYXJzZXJsaWIudXRpbC5Ub2tlblN0cmVhbUJhc2UsDQpTdHJpbmdSZWFkZXIgPSBwYXJzZXJsaWIudXRpbC5TdHJpbmdSZWFkZXIsDQpTeW50YXhFcnJvciA9IHBhcnNlcmxpYi51dGlsLlN5bnRheEVycm9yLA0KU3ludGF4VW5pdCAgPSBwYXJzZXJsaWIudXRpbC5TeW50YXhVbml0Ow0KDQp2YXIgQ29sb3JzID0gew0KICAgIGFsaWNlYmx1ZSAgICAgICA6IiNmMGY4ZmYiLA0KICAgIGFudGlxdWV3aGl0ZSAgICA6IiNmYWViZDciLA0KICAgIGFxdWEgICAgICAgICAgICA6IiMwMGZmZmYiLA0KICAgIGFxdWFtYXJpbmUgICAgICA6IiM3ZmZmZDQiLA0KICAgIGF6dXJlICAgICAgICAgICA6IiNmMGZmZmYiLA0KICAgIGJlaWdlICAgICAgICAgICA6IiNmNWY1ZGMiLA0KICAgIGJpc3F1ZSAgICAgICAgICA6IiNmZmU0YzQiLA0KICAgIGJsYWNrICAgICAgICAgICA6IiMwMDAwMDAiLA0KICAgIGJsYW5jaGVkYWxtb25kICA6IiNmZmViY2QiLA0KICAgIGJsdWUgICAgICAgICAgICA6IiMwMDAwZmYiLA0KICAgIGJsdWV2aW9sZXQgICAgICA6IiM4YTJiZTIiLA0KICAgIGJyb3duICAgICAgICAgICA6IiNhNTJhMmEiLA0KICAgIGJ1cmx5d29vZCAgICAgICA6IiNkZWI4ODciLA0KICAgIGNhZGV0Ymx1ZSAgICAgICA6IiM1ZjllYTAiLA0KICAgIGNoYXJ0cmV1c2UgICAgICA6IiM3ZmZmMDAiLA0KICAgIGNob2NvbGF0ZSAgICAgICA6IiNkMjY5MWUiLA0KICAgIGNvcmFsICAgICAgICAgICA6IiNmZjdmNTAiLA0KICAgIGNvcm5mbG93ZXJibHVlICA6IiM2NDk1ZWQiLA0KICAgIGNvcm5zaWxrICAgICAgICA6IiNmZmY4ZGMiLA0KICAgIGNyaW1zb24gICAgICAgICA6IiNkYzE0M2MiLA0KICAgIGN5YW4gICAgICAgICAgICA6IiMwMGZmZmYiLA0KICAgIGRhcmtibHVlICAgICAgICA6IiMwMDAwOGIiLA0KICAgIGRhcmtjeWFuICAgICAgICA6IiMwMDhiOGIiLA0KICAgIGRhcmtnb2xkZW5yb2QgICA6IiNiODg2MGIiLA0KICAgIGRhcmtncmF5ICAgICAgICA6IiNhOWE5YTkiLA0KICAgIGRhcmtncmVlbiAgICAgICA6IiMwMDY0MDAiLA0KICAgIGRhcmtraGFraSAgICAgICA6IiNiZGI3NmIiLA0KICAgIGRhcmttYWdlbnRhICAgICA6IiM4YjAwOGIiLA0KICAgIGRhcmtvbGl2ZWdyZWVuICA6IiM1NTZiMmYiLA0KICAgIGRhcmtvcmFuZ2UgICAgICA6IiNmZjhjMDAiLA0KICAgIGRhcmtvcmNoaWQgICAgICA6IiM5OTMyY2MiLA0KICAgIGRhcmtyZWQgICAgICAgICA6IiM4YjAwMDAiLA0KICAgIGRhcmtzYWxtb24gICAgICA6IiNlOTk2N2EiLA0KICAgIGRhcmtzZWFncmVlbiAgICA6IiM4ZmJjOGYiLA0KICAgIGRhcmtzbGF0ZWJsdWUgICA6IiM0ODNkOGIiLA0KICAgIGRhcmtzbGF0ZWdyYXkgICA6IiMyZjRmNGYiLA0KICAgIGRhcmt0dXJxdW9pc2UgICA6IiMwMGNlZDEiLA0KICAgIGRhcmt2aW9sZXQgICAgICA6IiM5NDAwZDMiLA0KICAgIGRlZXBwaW5rICAgICAgICA6IiNmZjE0OTMiLA0KICAgIGRlZXBza3libHVlICAgICA6IiMwMGJmZmYiLA0KICAgIGRpbWdyYXkgICAgICAgICA6IiM2OTY5NjkiLA0KICAgIGRvZGdlcmJsdWUgICAgICA6IiMxZTkwZmYiLA0KICAgIGZpcmVicmljayAgICAgICA6IiNiMjIyMjIiLA0KICAgIGZsb3JhbHdoaXRlICAgICA6IiNmZmZhZjAiLA0KICAgIGZvcmVzdGdyZWVuICAgICA6IiMyMjhiMjIiLA0KICAgIGZ1Y2hzaWEgICAgICAgICA6IiNmZjAwZmYiLA0KICAgIGdhaW5zYm9ybyAgICAgICA6IiNkY2RjZGMiLA0KICAgIGdob3N0d2hpdGUgICAgICA6IiNmOGY4ZmYiLA0KICAgIGdvbGQgICAgICAgICAgICA6IiNmZmQ3MDAiLA0KICAgIGdvbGRlbnJvZCAgICAgICA6IiNkYWE1MjAiLA0KICAgIGdyYXkgICAgICAgICAgICA6IiM4MDgwODAiLA0KICAgIGdyZWVuICAgICAgICAgICA6IiMwMDgwMDAiLA0KICAgIGdyZWVueWVsbG93ICAgICA6IiNhZGZmMmYiLA0KICAgIGhvbmV5ZGV3ICAgICAgICA6IiNmMGZmZjAiLA0KICAgIGhvdHBpbmsgICAgICAgICA6IiNmZjY5YjQiLA0KICAgIGluZGlhbnJlZCAgICAgICA6IiNjZDVjNWMiLA0KICAgIGluZGlnbyAgICAgICAgICA6IiM0YjAwODIiLA0KICAgIGl2b3J5ICAgICAgICAgICA6IiNmZmZmZjAiLA0KICAgIGtoYWtpICAgICAgICAgICA6IiNmMGU2OGMiLA0KICAgIGxhdmVuZGVyICAgICAgICA6IiNlNmU2ZmEiLA0KICAgIGxhdmVuZGVyYmx1c2ggICA6IiNmZmYwZjUiLA0KICAgIGxhd25ncmVlbiAgICAgICA6IiM3Y2ZjMDAiLA0KICAgIGxlbW9uY2hpZmZvbiAgICA6IiNmZmZhY2QiLA0KICAgIGxpZ2h0Ymx1ZSAgICAgICA6IiNhZGQ4ZTYiLA0KICAgIGxpZ2h0Y29yYWwgICAgICA6IiNmMDgwODAiLA0KICAgIGxpZ2h0Y3lhbiAgICAgICA6IiNlMGZmZmYiLA0KICAgIGxpZ2h0Z29sZGVucm9keWVsbG93ICA6IiNmYWZhZDIiLA0KICAgIGxpZ2h0Z3JleSAgICAgICA6IiNkM2QzZDMiLA0KICAgIGxpZ2h0Z3JlZW4gICAgICA6IiM5MGVlOTAiLA0KICAgIGxpZ2h0cGluayAgICAgICA6IiNmZmI2YzEiLA0KICAgIGxpZ2h0c2FsbW9uICAgICA6IiNmZmEwN2EiLA0KICAgIGxpZ2h0c2VhZ3JlZW4gICA6IiMyMGIyYWEiLA0KICAgIGxpZ2h0c2t5Ymx1ZSAgICA6IiM4N2NlZmEiLA0KICAgIGxpZ2h0c2xhdGVncmF5ICA6IiM3Nzg4OTkiLA0KICAgIGxpZ2h0c3RlZWxibHVlICA6IiNiMGM0ZGUiLA0KICAgIGxpZ2h0eWVsbG93ICAgICA6IiNmZmZmZTAiLA0KICAgIGxpbWUgICAgICAgICAgICA6IiMwMGZmMDAiLA0KICAgIGxpbWVncmVlbiAgICAgICA6IiMzMmNkMzIiLA0KICAgIGxpbmVuICAgICAgICAgICA6IiNmYWYwZTYiLA0KICAgIG1hZ2VudGEgICAgICAgICA6IiNmZjAwZmYiLA0KICAgIG1hcm9vbiAgICAgICAgICA6IiM4MDAwMDAiLA0KICAgIG1lZGl1bWFxdWFtYXJpbmU6IiM2NmNkYWEiLA0KICAgIG1lZGl1bWJsdWUgICAgICA6IiMwMDAwY2QiLA0KICAgIG1lZGl1bW9yY2hpZCAgICA6IiNiYTU1ZDMiLA0KICAgIG1lZGl1bXB1cnBsZSAgICA6IiM5MzcwZDgiLA0KICAgIG1lZGl1bXNlYWdyZWVuICA6IiMzY2IzNzEiLA0KICAgIG1lZGl1bXNsYXRlYmx1ZSA6IiM3YjY4ZWUiLA0KICAgIG1lZGl1bXNwcmluZ2dyZWVuICAgOiIjMDBmYTlhIiwNCiAgICBtZWRpdW10dXJxdW9pc2UgOiIjNDhkMWNjIiwNCiAgICBtZWRpdW12aW9sZXRyZWQgOiIjYzcxNTg1IiwNCiAgICBtaWRuaWdodGJsdWUgICAgOiIjMTkxOTcwIiwNCiAgICBtaW50Y3JlYW0gICAgICAgOiIjZjVmZmZhIiwNCiAgICBtaXN0eXJvc2UgICAgICAgOiIjZmZlNGUxIiwNCiAgICBtb2NjYXNpbiAgICAgICAgOiIjZmZlNGI1IiwNCiAgICBuYXZham93aGl0ZSAgICAgOiIjZmZkZWFkIiwNCiAgICBuYXZ5ICAgICAgICAgICAgOiIjMDAwMDgwIiwNCiAgICBvbGRsYWNlICAgICAgICAgOiIjZmRmNWU2IiwNCiAgICBvbGl2ZSAgICAgICAgICAgOiIjODA4MDAwIiwNCiAgICBvbGl2ZWRyYWIgICAgICAgOiIjNmI4ZTIzIiwNCiAgICBvcmFuZ2UgICAgICAgICAgOiIjZmZhNTAwIiwNCiAgICBvcmFuZ2VyZWQgICAgICAgOiIjZmY0NTAwIiwNCiAgICBvcmNoaWQgICAgICAgICAgOiIjZGE3MGQ2IiwNCiAgICBwYWxlZ29sZGVucm9kICAgOiIjZWVlOGFhIiwNCiAgICBwYWxlZ3JlZW4gICAgICAgOiIjOThmYjk4IiwNCiAgICBwYWxldHVycXVvaXNlICAgOiIjYWZlZWVlIiwNCiAgICBwYWxldmlvbGV0cmVkICAgOiIjZDg3MDkzIiwNCiAgICBwYXBheWF3aGlwICAgICAgOiIjZmZlZmQ1IiwNCiAgICBwZWFjaHB1ZmYgICAgICAgOiIjZmZkYWI5IiwNCiAgICBwZXJ1ICAgICAgICAgICAgOiIjY2Q4NTNmIiwNCiAgICBwaW5rICAgICAgICAgICAgOiIjZmZjMGNiIiwNCiAgICBwbHVtICAgICAgICAgICAgOiIjZGRhMGRkIiwNCiAgICBwb3dkZXJibHVlICAgICAgOiIjYjBlMGU2IiwNCiAgICBwdXJwbGUgICAgICAgICAgOiIjODAwMDgwIiwNCiAgICByZWQgICAgICAgICAgICAgOiIjZmYwMDAwIiwNCiAgICByb3N5YnJvd24gICAgICAgOiIjYmM4ZjhmIiwNCiAgICByb3lhbGJsdWUgICAgICAgOiIjNDE2OWUxIiwNCiAgICBzYWRkbGVicm93biAgICAgOiIjOGI0NTEzIiwNCiAgICBzYWxtb24gICAgICAgICAgOiIjZmE4MDcyIiwNCiAgICBzYW5keWJyb3duICAgICAgOiIjZjRhNDYwIiwNCiAgICBzZWFncmVlbiAgICAgICAgOiIjMmU4YjU3IiwNCiAgICBzZWFzaGVsbCAgICAgICAgOiIjZmZmNWVlIiwNCiAgICBzaWVubmEgICAgICAgICAgOiIjYTA1MjJkIiwNCiAgICBzaWx2ZXIgICAgICAgICAgOiIjYzBjMGMwIiwNCiAgICBza3libHVlICAgICAgICAgOiIjODdjZWViIiwNCiAgICBzbGF0ZWJsdWUgICAgICAgOiIjNmE1YWNkIiwNCiAgICBzbGF0ZWdyYXkgICAgICAgOiIjNzA4MDkwIiwNCiAgICBzbm93ICAgICAgICAgICAgOiIjZmZmYWZhIiwNCiAgICBzcHJpbmdncmVlbiAgICAgOiIjMDBmZjdmIiwNCiAgICBzdGVlbGJsdWUgICAgICAgOiIjNDY4MmI0IiwNCiAgICB0YW4gICAgICAgICAgICAgOiIjZDJiNDhjIiwNCiAgICB0ZWFsICAgICAgICAgICAgOiIjMDA4MDgwIiwNCiAgICB0aGlzdGxlICAgICAgICAgOiIjZDhiZmQ4IiwNCiAgICB0b21hdG8gICAgICAgICAgOiIjZmY2MzQ3IiwNCiAgICB0dXJxdW9pc2UgICAgICAgOiIjNDBlMGQwIiwNCiAgICB2aW9sZXQgICAgICAgICAgOiIjZWU4MmVlIiwNCiAgICB3aGVhdCAgICAgICAgICAgOiIjZjVkZWIzIiwNCiAgICB3aGl0ZSAgICAgICAgICAgOiIjZmZmZmZmIiwNCiAgICB3aGl0ZXNtb2tlICAgICAgOiIjZjVmNWY1IiwNCiAgICB5ZWxsb3cgICAgICAgICAgOiIjZmZmZjAwIiwNCiAgICB5ZWxsb3dncmVlbiAgICAgOiIjOWFjZDMyIg0KfTsNCi8qKg0KICogUmVwcmVzZW50cyBhIHNlbGVjdG9yIGNvbWJpbmF0b3IgKHdoaXRlc3BhY2UsICssID4pLg0KICogQG5hbWVzcGFjZSBwYXJzZXJsaWIuY3NzDQogKiBAY2xhc3MgQ29tYmluYXRvcg0KICogQGV4dGVuZHMgcGFyc2VybGliLnV0aWwuU3ludGF4VW5pdA0KICogQGNvbnN0cnVjdG9yDQogKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5pdC4gDQogKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuDQogKiBAcGFyYW0ge2ludH0gY29sIFRoZSBjb2x1bW4gb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLg0KICovDQpmdW5jdGlvbiBDb21iaW5hdG9yKHRleHQsIGxpbmUsIGNvbCl7DQogICAgDQogICAgU3ludGF4VW5pdC5jYWxsKHRoaXMsIHRleHQsIGxpbmUsIGNvbCk7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgdHlwZSBvZiBtb2RpZmllci4NCiAgICAgKiBAdHlwZSBTdHJpbmcNCiAgICAgKiBAcHJvcGVydHkgdHlwZQ0KICAgICAqLw0KICAgIHRoaXMudHlwZSA9ICJ1bmtub3duIjsNCiAgICANCiAgICAvL3ByZXR0eSBzaW1wbGUNCiAgICBpZiAoL15ccyskLy50ZXN0KHRleHQpKXsNCiAgICAgICAgdGhpcy50eXBlID0gImRlc2NlbmRhbnQiOw0KICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiPiIpew0KICAgICAgICB0aGlzLnR5cGUgPSAiY2hpbGQiOw0KICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiKyIpew0KICAgICAgICB0aGlzLnR5cGUgPSAiYWRqYWNlbnQtc2libGluZyI7DQogICAgfSBlbHNlIGlmICh0ZXh0ID09ICJ+Iil7DQogICAgICAgIHRoaXMudHlwZSA9ICJzaWJsaW5nIjsNCiAgICB9DQoNCn0NCg0KQ29tYmluYXRvci5wcm90b3R5cGUgPSBuZXcgU3ludGF4VW5pdCgpOw0KQ29tYmluYXRvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb21iaW5hdG9yOw0KDQoNCg0KdmFyIExldmVsMVByb3BlcnRpZXMgPSB7DQoNCiAgICAiYmFja2dyb3VuZCI6IDEsDQogICAgImJhY2tncm91bmQtYXR0YWNobWVudCI6IDEsDQogICAgImJhY2tncm91bmQtY29sb3IiOiAxLA0KICAgICJiYWNrZ3JvdW5kLWltYWdlIjogMSwNCiAgICAiYmFja2dyb3VuZC1wb3NpdGlvbiI6IDEsDQogICAgImJhY2tncm91bmQtcmVwZWF0IjogMSwNCiANCiAgICAiYm9yZGVyIjogMSwNCiAgICAiYm9yZGVyLWJvdHRvbSI6IDEsDQogICAgImJvcmRlci1ib3R0b20td2lkdGgiOiAxLA0KICAgICJib3JkZXItY29sb3IiOiAxLA0KICAgICJib3JkZXItbGVmdCI6IDEsDQogICAgImJvcmRlci1sZWZ0LXdpZHRoIjogMSwNCiAgICAiYm9yZGVyLXJpZ2h0IjogMSwNCiAgICAiYm9yZGVyLXJpZ2h0LXdpZHRoIjogMSwNCiAgICAiYm9yZGVyLXN0eWxlIjogMSwNCiAgICAiYm9yZGVyLXRvcCI6IDEsDQogICAgImJvcmRlci10b3Atd2lkdGgiOiAxLA0KICAgICJib3JkZXItd2lkdGgiOiAxLA0KIA0KICAgICJjbGVhciI6IDEsDQogICAgImNvbG9yIjogMSwNCiAgICAiZGlzcGxheSI6IDEsDQogICAgImZsb2F0IjogMSwNCiANCiAgICAiZm9udCI6IDEsDQogICAgImZvbnQtZmFtaWx5IjogMSwNCiAgICAiZm9udC1zaXplIjogMSwNCiAgICAiZm9udC1zdHlsZSI6IDEsDQogICAgImZvbnQtdmFyaWFudCI6IDEsDQogICAgImZvbnQtd2VpZ2h0IjogMSwNCiANCiAgICAiaGVpZ2h0IjogMSwNCiAgICAibGV0dGVyLXNwYWNpbmciOiAxLA0KICAgICJsaW5lLWhlaWdodCI6IDEsDQogDQogICAgImxpc3Qtc3R5bGUiOiAxLA0KICAgICJsaXN0LXN0eWxlLWltYWdlIjogMSwNCiAgICAibGlzdC1zdHlsZS1wb3NpdGlvbiI6IDEsDQogICAgImxpc3Qtc3R5bGUtdHlwZSI6IDEsDQogDQogICAgIm1hcmdpbiI6IDEsDQogICAgIm1hcmdpbi1ib3R0b20iOiAxLA0KICAgICJtYXJnaW4tbGVmdCI6IDEsDQogICAgIm1hcmdpbi1yaWdodCI6IDEsDQogICAgIm1hcmdpbi10b3AiOiAxLA0KIA0KICAgICJwYWRkaW5nIjogMSwNCiAgICAicGFkZGluZy1ib3R0b20iOiAxLA0KICAgICJwYWRkaW5nLWxlZnQiOiAxLA0KICAgICJwYWRkaW5nLXJpZ2h0IjogMSwNCiAgICAicGFkZGluZy10b3AiOiAxLA0KIA0KICAgICJ0ZXh0LWFsaWduIjogMSwNCiAgICAidGV4dC1kZWNvcmF0aW9uIjogMSwNCiAgICAidGV4dC1pbmRlbnQiOiAxLA0KICAgICJ0ZXh0LXRyYW5zZm9ybSI6IDEsDQogDQogICAgInZlcnRpY2FsLWFsaWduIjogMSwNCiAgICAid2hpdGUtc3BhY2UiOiAxLA0KICAgICJ3aWR0aCI6IDEsDQogICAgIndvcmQtc3BhY2luZyI6IDENCiAgICANCn07DQoNCnZhciBMZXZlbDJQcm9wZXJ0aWVzID0gew0KDQogICAgLy9BdXJhbA0KICAgICJhemltdXRoIjogMSwNCiAgICAiY3VlLWFmdGVyIjogMSwNCiAgICAiY3VlLWJlZm9yZSI6IDEsDQogICAgImN1ZSI6IDEsDQogICAgImVsZXZhdGlvbiI6IDEsDQogICAgInBhdXNlLWFmdGVyIjogMSwNCiAgICAicGF1c2UtYmVmb3JlIjogMSwNCiAgICAicGF1c2UiOiAxLA0KICAgICJwaXRjaC1yYW5nZSI6IDEsDQogICAgInBpdGNoIjogMSwNCiAgICAicGxheS1kdXJpbmciOiAxLA0KICAgICJyaWNobmVzcyI6IDEsDQogICAgInNwZWFrLWhlYWRlciI6IDEsDQogICAgInNwZWFrLW51bWVyYWwiOiAxLA0KICAgICJzcGVhay1wdW5jdHVhdGlvbiI6IDEsDQogICAgInNwZWFrIjogMSwNCiAgICAic3BlZWNoLXJhdGUiOiAxLA0KICAgICJzdHJlc3MiOiAxLA0KICAgICJ2b2ljZS1mYW1pbHkiOiAxLA0KICAgICJ2b2x1bWUiOiAxLA0KICAgIA0KICAgIC8vUGFnZWQNCiAgICAib3JwaGFucyI6IDEsDQogICAgInBhZ2UtYnJlYWstYWZ0ZXIiOiAxLA0KICAgICJwYWdlLWJyZWFrLWJlZm9yZSI6IDEsDQogICAgInBhZ2UtYnJlYWstaW5zaWRlIjogMSwNCiAgICAid2lkb3dzIjogMSwNCg0KICAgIC8vSW50ZXJhY3RpdmUNCiAgICAiY3Vyc29yIjogMSwNCiAgICAib3V0bGluZS1jb2xvciI6IDEsDQogICAgIm91dGxpbmUtc3R5bGUiOiAxLA0KICAgICJvdXRsaW5lLXdpZHRoIjogMSwNCiAgICAib3V0bGluZSI6IDEsICAgIA0KICAgIA0KICAgIC8vVmlzdWFsDQogICAgImJhY2tncm91bmQtYXR0YWNobWVudCI6IDEsDQogICAgImJhY2tncm91bmQtY29sb3IiOiAxLA0KICAgICJiYWNrZ3JvdW5kLWltYWdlIjogMSwNCiAgICAiYmFja2dyb3VuZC1wb3NpdGlvbiI6IDEsDQogICAgImJhY2tncm91bmQtcmVwZWF0IjogMSwNCiAgICAiYmFja2dyb3VuZCI6IDEsICAgIA0KICAgICJib3JkZXItY29sbGFwc2UiOiAxLA0KICAgICJib3JkZXItY29sb3IiOiAxLA0KICAgICJib3JkZXItc3BhY2luZyI6IDEsDQogICAgImJvcmRlci1zdHlsZSI6IDEsDQogICAgImJvcmRlci10b3AiOiAxLA0KICAgICJib3JkZXItdG9wLWNvbG9yIjogMSwNCiAgICAiYm9yZGVyLXRvcC1zdHlsZSI6IDEsDQogICAgImJvcmRlci10b3Atd2lkdGgiOiAxLA0KICAgICJib3JkZXItd2lkdGgiOiAxLA0KICAgICJib3JkZXIiOiAxLA0KICAgICJib3R0b20iOiAxLCAgICANCiAgICAiY2FwdGlvbi1zaWRlIjogMSwNCiAgICAiY2xlYXIiOiAxLA0KICAgICJjbGlwIjogMSwNCiAgICAiY29sb3IiOiAxLA0KICAgICJjb250ZW50IjogMSwNCiAgICAiY291bnRlci1pbmNyZW1lbnQiOiAxLA0KICAgICJjb3VudGVyLXJlc2V0IjogMSwNCiAgICAiZGlyZWN0aW9uIjogMSwNCiAgICAiZGlzcGxheSI6IDEsDQogICAgImVtcHR5LWNlbGxzIjogMSwNCiAgICAiZmxvYXQiOiAxLA0KICAgICJmb250LWZhbWlseSI6IDEsDQogICAgImZvbnQtc2l6ZSI6IDEsDQogICAgImZvbnQtc3R5bGUiOiAxLA0KICAgICJmb250LXZhcmlhbnQiOiAxLA0KICAgICJmb250LXdlaWdodCI6IDEsDQogICAgImZvbnQiOiAxLA0KICAgICJoZWlnaHQiOiAxLA0KICAgICJsZWZ0IjogMSwNCiAgICAibGV0dGVyLXNwYWNpbmciOiAxLA0KICAgICJsaW5lLWhlaWdodCI6IDEsDQogICAgImxpc3Qtc3R5bGUtaW1hZ2UiOiAxLA0KICAgICJsaXN0LXN0eWxlLXBvc2l0aW9uIjogMSwNCiAgICAibGlzdC1zdHlsZS10eXBlIjogMSwNCiAgICAibGlzdC1zdHlsZSI6IDEsDQogICAgIm1hcmdpbi1yaWdodCI6IDEsDQogICAgIm1hcmdpbi10b3AiOiAxLA0KICAgICJtYXJnaW4iOiAxLA0KICAgICJtYXgtaGVpZ2h0IjogMSwNCiAgICAibWF4LXdpZHRoIjogMSwNCiAgICAibWluLWhlaWdodCI6IDEsDQogICAgIm1pbi13aWR0aCI6IDEsDQogICAgIm92ZXJmbG93IjogMSwNCiAgICAicGFkZGluZy10b3AiOiAxLA0KICAgICJwYWRkaW5nIjogMSwNCiAgICAicG9zaXRpb24iOiAxLA0KICAgICJxdW90ZXMiOiAxLA0KICAgICJyaWdodCI6IDEsDQogICAgInRhYmxlLWxheW91dCI6IDEsDQogICAgInRleHQtYWxpZ24iOiAxLA0KICAgICJ0ZXh0LWRlY29yYXRpb24iOiAxLA0KICAgICJ0ZXh0LWluZGVudCI6IDEsDQogICAgInRleHQtdHJhbnNmb3JtIjogMSwNCiAgICAidG9wIjogMSwNCiAgICAidW5pY29kZS1iaWRpIjogMSwNCiAgICAidmVydGljYWwtYWxpZ24iOiAxLA0KICAgICJ2aXNpYmlsaXR5IjogMSwNCiAgICAid2hpdGUtc3BhY2UiOiAxLA0KICAgICJ3aWR0aCI6IDEsDQogICAgIndvcmQtc3BhY2luZyI6IDEsDQogICAgInotaW5kZXgiOiAxDQp9Ow0KLyoqDQogKiBSZXByZXNlbnRzIGEgbWVkaWEgZmVhdHVyZSwgc3VjaCBhcyBtYXgtd2lkdGg6NTAwLg0KICogQG5hbWVzcGFjZSBwYXJzZXJsaWIuY3NzDQogKiBAY2xhc3MgTWVkaWFGZWF0dXJlDQogKiBAZXh0ZW5kcyBwYXJzZXJsaWIudXRpbC5TeW50YXhVbml0DQogKiBAY29uc3RydWN0b3INCiAqIEBwYXJhbSB7U3ludGF4VW5pdH0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmVhdHVyZS4NCiAqIEBwYXJhbSB7U3ludGF4VW5pdH0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmZWF0dXJlIG9yIG51bGwgaWYgbm9uZS4NCiAqLw0KZnVuY3Rpb24gTWVkaWFGZWF0dXJlKG5hbWUsIHZhbHVlKXsNCiAgICANCiAgICBTeW50YXhVbml0LmNhbGwodGhpcywgIigiICsgbmFtZSArICh2YWx1ZSAhPT0gbnVsbCA/ICI6IiArIHZhbHVlIDogIiIpICsgIikiLCBuYW1lLnN0YXJ0TGluZSwgbmFtZS5zdGFydENvbCk7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgbWVkaWEgZmVhdHVyZQ0KICAgICAqIEB0eXBlIFN0cmluZw0KICAgICAqIEBwcm9wZXJ0eSBuYW1lDQogICAgICovDQogICAgdGhpcy5uYW1lID0gbmFtZTsNCg0KICAgIC8qKg0KICAgICAqIFRoZSB2YWx1ZSBmb3IgdGhlIGZlYXR1cmUgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lLg0KICAgICAqIEB0eXBlIFN5bnRheFVuaXQNCiAgICAgKiBAcHJvcGVydHkgdmFsdWUNCiAgICAgKi8NCiAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQp9DQoNCk1lZGlhRmVhdHVyZS5wcm90b3R5cGUgPSBuZXcgU3ludGF4VW5pdCgpOw0KTWVkaWFGZWF0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lZGlhRmVhdHVyZTsNCg0KDQovKioNCiAqIFJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCBtZWRpYSBxdWVyeS4NCiAqIEBuYW1lc3BhY2UgcGFyc2VybGliLmNzcw0KICogQGNsYXNzIE1lZGlhUXVlcnkNCiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLlN5bnRheFVuaXQNCiAqIEBjb25zdHJ1Y3Rvcg0KICogQHBhcmFtIHtTdHJpbmd9IG1vZGlmaWVyIFRoZSBtb2RpZmllciAibm90IiBvciAib25seSIgKG9yIG51bGwpLg0KICogQHBhcmFtIHtTdHJpbmd9IG1lZGlhVHlwZSBUaGUgdHlwZSBvZiBtZWRpYSAoaS5lLiwgInByaW50IikuDQogKiBAcGFyYW0ge0FycmF5fSBwYXJ0cyBBcnJheSBvZiBzZWxlY3RvcnMgcGFydHMgbWFraW5nIHVwIHRoaXMgc2VsZWN0b3IuDQogKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuDQogKiBAcGFyYW0ge2ludH0gY29sIFRoZSBjb2x1bW4gb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLg0KICovDQpmdW5jdGlvbiBNZWRpYVF1ZXJ5KG1vZGlmaWVyLCBtZWRpYVR5cGUsIGZlYXR1cmVzLCBsaW5lLCBjb2wpew0KICAgIA0KICAgIFN5bnRheFVuaXQuY2FsbCh0aGlzLCAobW9kaWZpZXIgPyBtb2RpZmllciArICIgIjogIiIpICsgKG1lZGlhVHlwZSA/IG1lZGlhVHlwZSArICIgIiA6ICIiKSArIGZlYXR1cmVzLmpvaW4oIiBhbmQgIiksIGxpbmUsIGNvbCk7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgbWVkaWEgbW9kaWZpZXIgKCJub3QiIG9yICJvbmx5IikNCiAgICAgKiBAdHlwZSBTdHJpbmcNCiAgICAgKiBAcHJvcGVydHkgbW9kaWZpZXINCiAgICAgKi8NCiAgICB0aGlzLm1vZGlmaWVyID0gbW9kaWZpZXI7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgbWVkaWFUeXBlIChpLmUuLCAicHJpbnQiKQ0KICAgICAqIEB0eXBlIFN0cmluZw0KICAgICAqIEBwcm9wZXJ0eSBtZWRpYVR5cGUNCiAgICAgKi8NCiAgICB0aGlzLm1lZGlhVHlwZSA9IG1lZGlhVHlwZTsgICAgDQogICAgDQogICAgLyoqDQogICAgICogVGhlIHBhcnRzIHRoYXQgbWFrZSB1cCB0aGUgc2VsZWN0b3IuDQogICAgICogQHR5cGUgQXJyYXkNCiAgICAgKiBAcHJvcGVydHkgZmVhdHVyZXMNCiAgICAgKi8NCiAgICB0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7DQoNCn0NCg0KTWVkaWFRdWVyeS5wcm90b3R5cGUgPSBuZXcgU3ludGF4VW5pdCgpOw0KTWVkaWFRdWVyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZWRpYVF1ZXJ5Ow0KDQoNCi8qKg0KICogQSBDU1MzIHBhcnNlci4NCiAqIEBuYW1lc3BhY2UgcGFyc2VybGliLmNzcw0KICogQGNsYXNzIFBhcnNlcg0KICogQGNvbnN0cnVjdG9yDQogKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAoT3B0aW9uYWwpIFZhcmlvdXMgb3B0aW9ucyBmb3IgdGhlIHBhcnNlcjoNCiAqICAgICAgc3RhckhhY2sgKHRydWV8ZmFsc2UpIHRvIGFsbG93IElFNiBzdGFyIGhhY2sgYXMgdmFsaWQsDQogKiAgICAgIHVuZGVyc2NvcmVIYWNrICh0cnVlfGZhbHNlKSB0byBpbnRlcnByZXQgbGVhZGluZyB1bmRlcnNjb3Jlcw0KICogICAgICBhcyBJRTYtNyB0YXJnZXRpbmcgZm9yIGtub3duIHByb3BlcnRpZXMsIGllRmlsdGVycyAodHJ1ZXxmYWxzZSkNCiAqICAgICAgdG8gaW5kaWNhdGUgdGhhdCBJRSA8IDggZmlsdGVycyBzaG91bGQgYmUgYWNjZXB0ZWQgYW5kIG5vdCB0aHJvdw0KICogICAgICBzeW50YXggZXJyb3JzLg0KICovDQpmdW5jdGlvbiBQYXJzZXIob3B0aW9ucyl7DQoNCiAgICAvL2luaGVyaXQgZXZlbnQgZnVuY3Rpb25hbGl0eQ0KICAgIEV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7DQoNCg0KICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307DQoNCiAgICB0aGlzLl90b2tlblN0cmVhbSA9IG51bGw7DQp9DQoNClBhcnNlci5wcm90b3R5cGUgPSBmdW5jdGlvbigpew0KDQogICAgdmFyIHByb3RvID0gbmV3IEV2ZW50VGFyZ2V0KCksICAvL25ldyBwcm90b3R5cGUNCiAgICAgICAgcHJvcCwNCiAgICAgICAgYWRkaXRpb25zID0gIHsNCiAgICAgICAgDQogICAgICAgICAgICAvL3Jlc3RvcmUgY29uc3RydWN0b3INCiAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBQYXJzZXIsDQogICAgICAgIA0KICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICAgICAgLy8gR3JhbW1hcg0KICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICANCiAgICAgICAgICAgIF9zdHlsZXNoZWV0OiBmdW5jdGlvbigpew0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBzdHlsZXNoZWV0DQogICAgICAgICAgICAgICAgICogIDogWyBDSEFSU0VUX1NZTSBTKiBTVFJJTkcgUyogJzsnIF0/DQogICAgICAgICAgICAgICAgICogICAgW1N8Q0RPfENEQ10qIFsgaW1wb3J0IFtTfENET3xDRENdKiBdKg0KICAgICAgICAgICAgICAgICAqICAgIFsgbmFtZXNwYWNlIFtTfENET3xDRENdKiBdKg0KICAgICAgICAgICAgICAgICAqICAgIFsgWyBydWxlc2V0IHwgbWVkaWEgfCBwYWdlIHwgZm9udF9mYWNlIHwga2V5ZnJhbWVzIF0gW1N8Q0RPfENEQ10qIF0qDQogICAgICAgICAgICAgICAgICogIDsNCiAgICAgICAgICAgICAgICAgKi8gDQogICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCAgICAgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICB0b2tlbiwNCiAgICAgICAgICAgICAgICAgICAgdHQ7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgic3RhcnRzdHlsZXNoZWV0Iik7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL3RyeSB0byByZWFkIGNoYXJhY3RlciBzZXQNCiAgICAgICAgICAgICAgICB0aGlzLl9jaGFyc2V0KCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5fc2tpcENydWZ0KCk7DQoNCiAgICAgICAgICAgICAgICAvL3RyeSB0byByZWFkIGltcG9ydHMgLSBtYXkgYmUgbW9yZSB0aGFuIG9uZQ0KICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLklNUE9SVF9TWU0pew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbXBvcnQoKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2tpcENydWZ0KCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vdHJ5IHRvIHJlYWQgbmFtZXNwYWNlcyAtIG1heSBiZSBtb3JlIHRoYW4gb25lDQogICAgICAgICAgICAgICAgd2hpbGUgKHRva2VuU3RyZWFtLnBlZWsoKSA9PSBUb2tlbnMuTkFNRVNQQUNFX1NZTSl7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX25hbWVzcGFjZSgpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9za2lwQ3J1ZnQoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9nZXQgdGhlIG5leHQgdG9rZW4NCiAgICAgICAgICAgICAgICB0dCA9IHRva2VuU3RyZWFtLnBlZWsoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL3RyeSB0byByZWFkIHRoZSByZXN0DQogICAgICAgICAgICAgICAgd2hpbGUodHQgPiBUb2tlbnMuRU9GKXsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCh0dCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbnMuTUVESUFfU1lNOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9za2lwQ3J1ZnQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbnMuUEFHRV9TWU06DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhZ2UoKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NraXBDcnVmdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbnMuRk9OVF9GQUNFX1NZTToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9udF9mYWNlKCk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9za2lwQ3J1ZnQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2Vucy5LRVlGUkFNRVNfU1lNOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlmcmFtZXMoKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NraXBDcnVmdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5zLlM6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5fcnVsZXNldCgpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Vycm9yIGhhbmRsaW5nIGZvciBrbm93biBpc3N1ZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCh0dCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbnMuQ0hBUlNFVF9TWU06DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0uTFQoMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJzZXQoZmFsc2UpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkBjaGFyc2V0IG5vdCBhbGxvd2VkIGhlcmUuIiwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbnMuSU1QT1JUX1NZTToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlblN0cmVhbS5MVCgxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW1wb3J0KGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJAaW1wb3J0IG5vdCBhbGxvd2VkIGhlcmUuIiwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbnMuTkFNRVNQQUNFX1NZTToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlblN0cmVhbS5MVCgxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmFtZXNwYWNlKGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJAbmFtZXNwYWNlIG5vdCBhbGxvd2VkIGhlcmUuIiwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0uZ2V0KCk7ICAvL2dldCB0aGUgbGFzdCB0b2tlbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91bmV4cGVjdGVkVG9rZW4odG9rZW5TdHJlYW0udG9rZW4oKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goZXgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFN5bnRheEVycm9yICYmICF0aGlzLm9wdGlvbnMuc3RyaWN0KXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICAgICAiZXJyb3IiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogICAgICBleCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogICAgZXgubWVzc2FnZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogICAgICAgZXgubGluZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sOiAgICAgICAgZXguY29sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB0dCA9IHRva2VuU3RyZWFtLnBlZWsoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHR0ICE9IFRva2Vucy5FT0Ypew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl91bmV4cGVjdGVkVG9rZW4odG9rZW5TdHJlYW0udG9rZW4oKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5maXJlKCJlbmRzdHlsZXNoZWV0Iik7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICBfY2hhcnNldDogZnVuY3Rpb24oZW1pdCl7DQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIGNoYXJzZXQsDQogICAgICAgICAgICAgICAgICAgIHRva2VuLA0KICAgICAgICAgICAgICAgICAgICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2w7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuQ0hBUlNFVF9TWU0pKXsNCiAgICAgICAgICAgICAgICAgICAgbGluZSA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lOw0KICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLlNUUklORyk7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuU3RyZWFtLnRva2VuKCk7DQogICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSB0b2tlbi52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuU0VNSUNPTE9OKTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmIChlbWl0ICE9PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoeyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICJjaGFyc2V0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0OmNoYXJzZXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbDogICAgY29sDQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gICAgICAgICAgICANCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIF9pbXBvcnQ6IGZ1bmN0aW9uKGVtaXQpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogaW1wb3J0DQogICAgICAgICAgICAgICAgICogICA6IElNUE9SVF9TWU0gUyoNCiAgICAgICAgICAgICAgICAgKiAgICBbU1RSSU5HfFVSSV0gUyogbWVkaWFfcXVlcnlfbGlzdD8gJzsnIFMqDQogICAgICAgICAgICAgICAgICovICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHR0LA0KICAgICAgICAgICAgICAgICAgICB1cmksDQogICAgICAgICAgICAgICAgICAgIGltcG9ydFRva2VuLA0KICAgICAgICAgICAgICAgICAgICBtZWRpYUxpc3QgICA9IFtdOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vcmVhZCBpbXBvcnQgc3ltYm9sDQogICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5JTVBPUlRfU1lNKTsNCiAgICAgICAgICAgICAgICBpbXBvcnRUb2tlbiA9IHRva2VuU3RyZWFtLnRva2VuKCk7DQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goW1Rva2Vucy5TVFJJTkcsIFRva2Vucy5VUkldKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL2dyYWIgdGhlIFVSSSB2YWx1ZQ0KICAgICAgICAgICAgICAgIHVyaSA9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWUucmVwbGFjZSgvKD86dXJsXCgpP1siJ10oW14iJ10rKVsiJ11cKT8vLCAiJDEiKTsgICAgICAgICAgICAgICAgDQoNCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIG1lZGlhTGlzdCA9IHRoaXMuX21lZGlhX3F1ZXJ5X2xpc3QoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL211c3QgZW5kIHdpdGggYSBzZW1pY29sb24NCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLlNFTUlDT0xPTik7DQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoZW1pdCAhPT0gZmFsc2Upew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoew0KICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogICAiaW1wb3J0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHVyaTogICAgdXJpLA0KICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6ICBtZWRpYUxpc3QsDQogICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiAgIGltcG9ydFRva2VuLnN0YXJ0TGluZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbDogICAgaW1wb3J0VG9rZW4uc3RhcnRDb2wNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIF9uYW1lc3BhY2U6IGZ1bmN0aW9uKGVtaXQpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogbmFtZXNwYWNlDQogICAgICAgICAgICAgICAgICogICA6IE5BTUVTUEFDRV9TWU0gUyogW25hbWVzcGFjZV9wcmVmaXggUypdPyBbU1RSSU5HfFVSSV0gUyogJzsnIFMqDQogICAgICAgICAgICAgICAgICovICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbCwNCiAgICAgICAgICAgICAgICAgICAgcHJlZml4LA0KICAgICAgICAgICAgICAgICAgICB1cmk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9yZWFkIGltcG9ydCBzeW1ib2wNCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLk5BTUVTUEFDRV9TWU0pOw0KICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsNCiAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sOw0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9pdCdzIGEgbmFtZXNwYWNlIHByZWZpeCAtIG5vIF9uYW1lc3BhY2VfcHJlZml4KCkgbWV0aG9kIGJlY2F1c2UgaXQncyBqdXN0IGFuIElERU5UDQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5JREVOVCkpew0KICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goW1Rva2Vucy5TVFJJTkcsIFRva2Vucy5VUkldKTsNCiAgICAgICAgICAgICAgICAvKmlmICghdG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLlNUUklORykpew0KICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLlVSSSk7DQogICAgICAgICAgICAgICAgfSovDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9ncmFiIHRoZSBVUkkgdmFsdWUNCiAgICAgICAgICAgICAgICB1cmkgPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlLnJlcGxhY2UoLyg/OnVybFwoKT9bIiddKFteIiddKylbIiddXCk/LywgIiQxIik7ICAgICAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCg0KICAgICAgICAgICAgICAgIC8vbXVzdCBlbmQgd2l0aCBhIHNlbWljb2xvbg0KICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuU0VNSUNPTE9OKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmIChlbWl0ICE9PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICJuYW1lc3BhY2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4OiBwcmVmaXgsDQogICAgICAgICAgICAgICAgICAgICAgICB1cmk6ICAgIHVyaSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgbGluZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbDogICAgY29sDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICAgICB9LCAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIF9tZWRpYTogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIG1lZGlhDQogICAgICAgICAgICAgICAgICogICA6IE1FRElBX1NZTSBTKiBtZWRpYV9xdWVyeV9saXN0IFMqICd7JyBTKiBydWxlc2V0KiAnfScgUyoNCiAgICAgICAgICAgICAgICAgKiAgIDsNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gICAgID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbCwNCiAgICAgICAgICAgICAgICAgICAgbWVkaWFMaXN0Oy8vICAgICAgID0gW107DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9sb29rIGZvciBAbWVkaWENCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLk1FRElBX1NZTSk7DQogICAgICAgICAgICAgICAgbGluZSA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lOw0KICAgICAgICAgICAgICAgIGNvbCA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRDb2w7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsgICAgICAgICAgICAgICANCg0KICAgICAgICAgICAgICAgIG1lZGlhTGlzdCA9IHRoaXMuX21lZGlhX3F1ZXJ5X2xpc3QoKTsNCg0KICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuTEJSQUNFKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgInN0YXJ0bWVkaWEiLA0KICAgICAgICAgICAgICAgICAgICBtZWRpYTogIG1lZGlhTGlzdCwNCiAgICAgICAgICAgICAgICAgICAgbGluZTogICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2w6ICAgIGNvbA0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHdoaWxlKHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLnBlZWsoKSA9PSBUb2tlbnMuUEFHRV9TWU0pew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFnZSgpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9ydWxlc2V0KCkpew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuUkJSQUNFKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoew0KICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICJlbmRtZWRpYSIsDQogICAgICAgICAgICAgICAgICAgIG1lZGlhOiAgbWVkaWFMaXN0LA0KICAgICAgICAgICAgICAgICAgICBsaW5lOiAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbDogICAgY29sDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICANCg0KICAgICAgICAgICAgLy9DU1MzIE1lZGlhIFF1ZXJpZXMNCiAgICAgICAgICAgIF9tZWRpYV9xdWVyeV9saXN0OiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogbWVkaWFfcXVlcnlfbGlzdA0KICAgICAgICAgICAgICAgICAqICAgOiBTKiBbbWVkaWFfcXVlcnkgWyAnLCcgUyogbWVkaWFfcXVlcnkgXSogXT8NCiAgICAgICAgICAgICAgICAgKiAgIDsNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgbWVkaWFMaXN0ICAgPSBbXTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLklERU5UIHx8IHRva2VuU3RyZWFtLnBlZWsoKSA9PSBUb2tlbnMuTFBBUkVOKXsNCiAgICAgICAgICAgICAgICAgICAgbWVkaWFMaXN0LnB1c2godGhpcy5fbWVkaWFfcXVlcnkoKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHdoaWxlKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5DT01NQSkpew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgICAgICBtZWRpYUxpc3QucHVzaCh0aGlzLl9tZWRpYV9xdWVyeSgpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIG1lZGlhTGlzdDsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgKiBOb3RlOiAiZXhwcmVzc2lvbiIgaW4gdGhlIGdyYW1tYXIgbWFwcyB0byB0aGUgX21lZGlhX2V4cHJlc3Npb24NCiAgICAgICAgICAgICAqIG1ldGhvZC4NCiAgICAgICAgICAgICANCiAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgX21lZGlhX3F1ZXJ5OiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogbWVkaWFfcXVlcnkNCiAgICAgICAgICAgICAgICAgKiAgIDogW09OTFkgfCBOT1RdPyBTKiBtZWRpYV90eXBlIFMqIFsgQU5EIFMqIGV4cHJlc3Npb24gXSoNCiAgICAgICAgICAgICAgICAgKiAgIHwgZXhwcmVzc2lvbiBbIEFORCBTKiBleHByZXNzaW9uIF0qDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHR5cGUgICAgICAgID0gbnVsbCwNCiAgICAgICAgICAgICAgICAgICAgaWRlbnQgICAgICAgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICB0b2tlbiAgICAgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zID0gW107DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuSURFTlQpKXsNCiAgICAgICAgICAgICAgICAgICAgaWRlbnQgPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlLnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAvL3NpbmNlIHRoZXJlJ3Mgbm8gY3VzdG9tIHRva2VucyBmb3IgdGhlc2UsIG5lZWQgdG8gbWFudWFsbHkgY2hlY2sNCiAgICAgICAgICAgICAgICAgICAgaWYgKGlkZW50ICE9ICJvbmx5IiAmJiBpZGVudCAhPSAibm90Iil7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS51bmdldCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQgPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlblN0cmVhbS50b2tlbigpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLklERU5UKXsNCiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHRoaXMuX21lZGlhX3R5cGUoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuID09PSBudWxsKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0udG9rZW4oKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW5TdHJlYW0ucGVlaygpID09IFRva2Vucy5MUEFSRU4pew0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT09IG51bGwpew0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlblN0cmVhbS5MVCgxKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKHRoaXMuX21lZGlhX2V4cHJlc3Npb24oKSk7DQogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gbnVsbCAmJiBleHByZXNzaW9ucy5sZW5ndGggPT09IDApew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5JREVOVCkpew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWUudG9Mb3dlckNhc2UoKSAhPSAiYW5kIil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5leHBlY3RlZFRva2VuKHRva2VuU3RyZWFtLnRva2VuKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaCh0aGlzLl9tZWRpYV9leHByZXNzaW9uKCkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVF1ZXJ5KGlkZW50LCB0eXBlLCBleHByZXNzaW9ucywgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7DQogICAgICAgICAgICB9LA0KDQogICAgICAgICAgICAvL0NTUzMgTWVkaWEgUXVlcmllcw0KICAgICAgICAgICAgX21lZGlhX3R5cGU6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBtZWRpYV90eXBlDQogICAgICAgICAgICAgICAgICogICA6IElERU5UDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21lZGlhX2ZlYXR1cmUoKTsgICAgICAgICAgIA0KICAgICAgICAgICAgfSwNCg0KICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgKiBOb3RlOiBpbiBDU1MzIE1lZGlhIFF1ZXJpZXMsIHRoaXMgaXMgY2FsbGVkICJleHByZXNzaW9uIi4NCiAgICAgICAgICAgICAqIFJlbmFtZWQgaGVyZSB0byBhdm9pZCBjb25mbGljdCB3aXRoIENTUzMgU2VsZWN0b3JzDQogICAgICAgICAgICAgKiBkZWZpbml0aW9uIG9mICJleHByZXNzaW9uIi4gQWxzbyBub3RlIHRoYXQgImV4cHIiIGluIHRoZQ0KICAgICAgICAgICAgICogZ3JhbW1hciBub3cgbWFwcyB0byAiZXhwcmVzc2lvbiIgZnJvbSBDU1MzIHNlbGVjdG9ycy4NCiAgICAgICAgICAgICAqIEBtZXRob2QgX21lZGlhX2V4cHJlc3Npb24NCiAgICAgICAgICAgICAqIEBwcml2YXRlDQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIF9tZWRpYV9leHByZXNzaW9uOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogZXhwcmVzc2lvbg0KICAgICAgICAgICAgICAgICAqICA6ICcoJyBTKiBtZWRpYV9mZWF0dXJlIFMqIFsgJzonIFMqIGV4cHIgXT8gJyknIFMqDQogICAgICAgICAgICAgICAgICogIDsNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZSAgICAgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICB0b2tlbiwNCiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiAgPSBudWxsOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuTFBBUkVOKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBmZWF0dXJlID0gdGhpcy5fbWVkaWFfZmVhdHVyZSgpOw0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5DT0xPTikpew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuU3RyZWFtLkxUKDEpOw0KICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gdGhpcy5fZXhwcmVzc2lvbigpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLlJQQVJFTik7DQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFGZWF0dXJlKGZlYXR1cmUsIChleHByZXNzaW9uID8gbmV3IFN5bnRheFVuaXQoZXhwcmVzc2lvbiwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCkgOiBudWxsKSk7ICAgICAgICAgICAgDQogICAgICAgICAgICB9LA0KDQogICAgICAgICAgICAvL0NTUzMgTWVkaWEgUXVlcmllcw0KICAgICAgICAgICAgX21lZGlhX2ZlYXR1cmU6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBtZWRpYV9mZWF0dXJlDQogICAgICAgICAgICAgICAgICogICA6IElERU5UDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW07DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuSURFTlQpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJldHVybiBTeW50YXhVbml0LmZyb21Ub2tlbih0b2tlblN0cmVhbS50b2tlbigpKTsgICAgICAgICAgICANCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vQ1NTMyBQYWdlZCBNZWRpYQ0KICAgICAgICAgICAgX3BhZ2U6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBwYWdlOg0KICAgICAgICAgICAgICAgICAqICAgIFBBR0VfU1lNIFMqIElERU5UPyBwc2V1ZG9fcGFnZT8gUyogDQogICAgICAgICAgICAgICAgICogICAgJ3snIFMqIFsgZGVjbGFyYXRpb24gfCBtYXJnaW4gXT8gWyAnOycgUyogWyBkZWNsYXJhdGlvbiB8IG1hcmdpbiBdPyBdKiAnfScgUyoNCiAgICAgICAgICAgICAgICAgKiAgICA7DQogICAgICAgICAgICAgICAgICovICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbCwNCiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciAgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICBwc2V1ZG9QYWdlICA9IG51bGw7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9sb29rIGZvciBAcGFnZQ0KICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuUEFHRV9TWU0pOw0KICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsNCiAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5JREVOVCkpew0KICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyID0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCg0KICAgICAgICAgICAgICAgICAgICAvL1RoZSB2YWx1ZSAnYXV0bycgbWF5IG5vdCBiZSB1c2VkIGFzIGEgcGFnZSBuYW1lIGFuZCBNVVNUIGJlIHRyZWF0ZWQgYXMgYSBzeW50YXggZXJyb3IuDQogICAgICAgICAgICAgICAgICAgIGlmIChpZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkgPT09ICJhdXRvIil7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91bmV4cGVjdGVkVG9rZW4odG9rZW5TdHJlYW0udG9rZW4oKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vc2VlIGlmIHRoZXJlJ3MgYSBjb2xvbiB1cGNvbWluZw0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLkNPTE9OKXsNCiAgICAgICAgICAgICAgICAgICAgcHNldWRvUGFnZSA9IHRoaXMuX3BzZXVkb19wYWdlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoew0KICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICJzdGFydHBhZ2UiLA0KICAgICAgICAgICAgICAgICAgICBpZDogICAgIGlkZW50aWZpZXIsDQogICAgICAgICAgICAgICAgICAgIHBzZXVkbzogcHNldWRvUGFnZSwNCiAgICAgICAgICAgICAgICAgICAgbGluZTogICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2w6ICAgIGNvbA0KICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICANCg0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWREZWNsYXJhdGlvbnModHJ1ZSwgdHJ1ZSk7ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgImVuZHBhZ2UiLA0KICAgICAgICAgICAgICAgICAgICBpZDogICAgIGlkZW50aWZpZXIsDQogICAgICAgICAgICAgICAgICAgIHBzZXVkbzogcHNldWRvUGFnZSwNCiAgICAgICAgICAgICAgICAgICAgbGluZTogICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2w6ICAgIGNvbA0KICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICANCiAgICAgICAgICAgIA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy9DU1MzIFBhZ2VkIE1lZGlhDQogICAgICAgICAgICBfbWFyZ2luOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogbWFyZ2luIDoNCiAgICAgICAgICAgICAgICAgKiAgICBtYXJnaW5fc3ltIFMqICd7JyBkZWNsYXJhdGlvbiBbICc7JyBTKiBkZWNsYXJhdGlvbj8gXSogJ30nIFMqDQogICAgICAgICAgICAgICAgICogICAgOw0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2wsDQogICAgICAgICAgICAgICAgICAgIG1hcmdpblN5bSAgID0gdGhpcy5fbWFyZ2luX3N5bSgpOw0KDQogICAgICAgICAgICAgICAgaWYgKG1hcmdpblN5bSl7DQogICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsNCiAgICAgICAgICAgICAgICAgICAgY29sID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydENvbDsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJzdGFydHBhZ2VtYXJnaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBtYXJnaW5TeW0sDQogICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgICAgICBjb2w6ICAgIGNvbA0KICAgICAgICAgICAgICAgICAgICB9KTsgICAgDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkRGVjbGFyYXRpb25zKHRydWUpOw0KDQogICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiZW5kcGFnZW1hcmdpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG1hcmdpblN5bSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgbGluZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbDogICAgY29sDQogICAgICAgICAgICAgICAgICAgIH0pOyAgICANCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgIC8vQ1NTMyBQYWdlZCBNZWRpYQ0KICAgICAgICAgICAgX21hcmdpbl9zeW06IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIG1hcmdpbl9zeW0gOg0KICAgICAgICAgICAgICAgICAqICAgIFRPUExFRlRDT1JORVJfU1lNIHwgDQogICAgICAgICAgICAgICAgICogICAgVE9QTEVGVF9TWU0gfCANCiAgICAgICAgICAgICAgICAgKiAgICBUT1BDRU5URVJfU1lNIHwgDQogICAgICAgICAgICAgICAgICogICAgVE9QUklHSFRfU1lNIHwgDQogICAgICAgICAgICAgICAgICogICAgVE9QUklHSFRDT1JORVJfU1lNIHwNCiAgICAgICAgICAgICAgICAgKiAgICBCT1RUT01MRUZUQ09STkVSX1NZTSB8IA0KICAgICAgICAgICAgICAgICAqICAgIEJPVFRPTUxFRlRfU1lNIHwgDQogICAgICAgICAgICAgICAgICogICAgQk9UVE9NQ0VOVEVSX1NZTSB8IA0KICAgICAgICAgICAgICAgICAqICAgIEJPVFRPTVJJR0hUX1NZTSB8DQogICAgICAgICAgICAgICAgICogICAgQk9UVE9NUklHSFRDT1JORVJfU1lNIHwNCiAgICAgICAgICAgICAgICAgKiAgICBMRUZUVE9QX1NZTSB8DQogICAgICAgICAgICAgICAgICogICAgTEVGVE1JRERMRV9TWU0gfA0KICAgICAgICAgICAgICAgICAqICAgIExFRlRCT1RUT01fU1lNIHwNCiAgICAgICAgICAgICAgICAgKiAgICBSSUdIVFRPUF9TWU0gfA0KICAgICAgICAgICAgICAgICAqICAgIFJJR0hUTUlERExFX1NZTSB8DQogICAgICAgICAgICAgICAgICogICAgUklHSFRCT1RUT01fU1lNIA0KICAgICAgICAgICAgICAgICAqICAgIDsNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtOw0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYodG9rZW5TdHJlYW0ubWF0Y2goW1Rva2Vucy5UT1BMRUZUQ09STkVSX1NZTSwgVG9rZW5zLlRPUExFRlRfU1lNLA0KICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5zLlRPUENFTlRFUl9TWU0sIFRva2Vucy5UT1BSSUdIVF9TWU0sIFRva2Vucy5UT1BSSUdIVENPUk5FUl9TWU0sDQogICAgICAgICAgICAgICAgICAgICAgICBUb2tlbnMuQk9UVE9NTEVGVENPUk5FUl9TWU0sIFRva2Vucy5CT1RUT01MRUZUX1NZTSwgDQogICAgICAgICAgICAgICAgICAgICAgICBUb2tlbnMuQk9UVE9NQ0VOVEVSX1NZTSwgVG9rZW5zLkJPVFRPTVJJR0hUX1NZTSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRva2Vucy5CT1RUT01SSUdIVENPUk5FUl9TWU0sIFRva2Vucy5MRUZUVE9QX1NZTSwgDQogICAgICAgICAgICAgICAgICAgICAgICBUb2tlbnMuTEVGVE1JRERMRV9TWU0sIFRva2Vucy5MRUZUQk9UVE9NX1NZTSwgVG9rZW5zLlJJR0hUVE9QX1NZTSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRva2Vucy5SSUdIVE1JRERMRV9TWU0sIFRva2Vucy5SSUdIVEJPVFRPTV9TWU1dKSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBTeW50YXhVbml0LmZyb21Ub2tlbih0b2tlblN0cmVhbS50b2tlbigpKTsgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICBfcHNldWRvX3BhZ2U6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBwc2V1ZG9fcGFnZQ0KICAgICAgICAgICAgICAgICAqICAgOiAnOicgSURFTlQNCiAgICAgICAgICAgICAgICAgKiAgIDsgICAgDQogICAgICAgICAgICAgICAgICovDQogICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuQ09MT04pOw0KICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuSURFTlQpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vVE9ETzogQ1NTMyBQYWdlZCBNZWRpYSBzYXlzIG9ubHkgImxlZnQiLCAiY2VudGVyIiwgYW5kICJyaWdodCIgYXJlIGFsbG93ZWQNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIF9mb250X2ZhY2U6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBmb250X2ZhY2UNCiAgICAgICAgICAgICAgICAgKiAgIDogRk9OVF9GQUNFX1NZTSBTKiANCiAgICAgICAgICAgICAgICAgKiAgICAgJ3snIFMqIGRlY2xhcmF0aW9uIFsgJzsnIFMqIGRlY2xhcmF0aW9uIF0qICd9JyBTKg0KICAgICAgICAgICAgICAgICAqICAgOw0KICAgICAgICAgICAgICAgICAqLyAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbDsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL2xvb2sgZm9yIEBwYWdlDQogICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5GT05UX0ZBQ0VfU1lNKTsNCiAgICAgICAgICAgICAgICBsaW5lID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydExpbmU7DQogICAgICAgICAgICAgICAgY29sID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydENvbDsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KDQogICAgICAgICAgICAgICAgdGhpcy5maXJlKHsNCiAgICAgICAgICAgICAgICAgICAgdHlwZTogICAic3RhcnRmb250ZmFjZSIsDQogICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgbGluZSwNCiAgICAgICAgICAgICAgICAgICAgY29sOiAgICBjb2wNCiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWREZWNsYXJhdGlvbnModHJ1ZSk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5maXJlKHsNCiAgICAgICAgICAgICAgICAgICAgdHlwZTogICAiZW5kZm9udGZhY2UiLA0KICAgICAgICAgICAgICAgICAgICBsaW5lOiAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbDogICAgY29sDQogICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgIF9vcGVyYXRvcjogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogb3BlcmF0b3INCiAgICAgICAgICAgICAgICAgKiAgOiAnLycgUyogfCAnLCcgUyogfCAvKCBlbXB0eSApLw0KICAgICAgICAgICAgICAgICAqICA7DQogICAgICAgICAgICAgICAgICovICAgIA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gICAgICAgPSBudWxsOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChbVG9rZW5zLlNMQVNILCBUb2tlbnMuQ09NTUFdKSl7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gIHRva2VuU3RyZWFtLnRva2VuKCk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPyBQcm9wZXJ0eVZhbHVlUGFydC5mcm9tVG9rZW4odG9rZW4pIDogbnVsbDsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIF9jb21iaW5hdG9yOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBjb21iaW5hdG9yDQogICAgICAgICAgICAgICAgICogIDogUExVUyBTKiB8IEdSRUFURVIgUyogfCBUSUxERSBTKiB8IFMrDQogICAgICAgICAgICAgICAgICogIDsNCiAgICAgICAgICAgICAgICAgKi8gICAgDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIHRva2VuOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmKHRva2VuU3RyZWFtLm1hdGNoKFtUb2tlbnMuUExVUywgVG9rZW5zLkdSRUFURVIsIFRva2Vucy5USUxERV0pKXsgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0udG9rZW4oKTsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgQ29tYmluYXRvcih0b2tlbi52YWx1ZSwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIF91bmFyeV9vcGVyYXRvcjogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogdW5hcnlfb3BlcmF0b3INCiAgICAgICAgICAgICAgICAgKiAgOiAnLScgfCAnKycNCiAgICAgICAgICAgICAgICAgKiAgOw0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAodG9rZW5TdHJlYW0ubWF0Y2goW1Rva2Vucy5NSU5VUywgVG9rZW5zLlBMVVNdKSl7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0gICAgICAgICANCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIF9wcm9wZXJ0eTogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogcHJvcGVydHkNCiAgICAgICAgICAgICAgICAgKiAgIDogSURFTlQgUyoNCiAgICAgICAgICAgICAgICAgKiAgIDsgICAgICAgIA0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgICAgICAgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICBoYWNrICAgICAgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIHRva2VuVmFsdWUsDQogICAgICAgICAgICAgICAgICAgIHRva2VuLA0KICAgICAgICAgICAgICAgICAgICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2w7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vY2hlY2sgZm9yIHN0YXIgaGFjayAtIHRocm93cyBlcnJvciBpZiBub3QgYWxsb3dlZA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLlNUQVIgJiYgdGhpcy5vcHRpb25zLnN0YXJIYWNrKXsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0uZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0udG9rZW4oKTsNCiAgICAgICAgICAgICAgICAgICAgaGFjayA9IHRva2VuLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICBsaW5lID0gdG9rZW4uc3RhcnRMaW5lOw0KICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlbi5zdGFydENvbDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYodG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLklERU5UKSl7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0udG9rZW4oKTsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5WYWx1ZSA9IHRva2VuLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBmb3IgdW5kZXJzY29yZSBoYWNrIC0gbm8gZXJyb3IgaWYgbm90IGFsbG93ZWQgYmVjYXVzZSBpdCdzIHZhbGlkIENTUyBzeW50YXgNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuVmFsdWUuY2hhckF0KDApID09ICJfIiAmJiB0aGlzLm9wdGlvbnMudW5kZXJzY29yZUhhY2spew0KICAgICAgICAgICAgICAgICAgICAgICAgaGFjayA9ICJfIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuVmFsdWUgPSB0b2tlblZhbHVlLnN1YnN0cmluZygxKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgUHJvcGVydHlOYW1lKHRva2VuVmFsdWUsIGhhY2ssIChsaW5lfHx0b2tlbi5zdGFydExpbmUpLCAoY29sfHx0b2tlbi5zdGFydENvbCkpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQogICAgICAgICAgICB9LA0KICAgICAgICANCiAgICAgICAgICAgIC8vQXVnbWVudGVkIHdpdGggQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF9ydWxlc2V0OiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogcnVsZXNldA0KICAgICAgICAgICAgICAgICAqICAgOiBzZWxlY3RvcnNfZ3JvdXANCiAgICAgICAgICAgICAgICAgKiAgICAgJ3snIFMqIGRlY2xhcmF0aW9uPyBbICc7JyBTKiBkZWNsYXJhdGlvbj8gXSogJ30nIFMqDQogICAgICAgICAgICAgICAgICogICA7ICAgIA0KICAgICAgICAgICAgICAgICAqLyAgICANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHR0LA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcnM7DQoNCg0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogRXJyb3IgUmVjb3Zlcnk6IElmIGV2ZW4gYSBzaW5nbGUgc2VsZWN0b3IgZmFpbHMgdG8gcGFyc2UsDQogICAgICAgICAgICAgICAgICogdGhlbiB0aGUgZW50aXJlIHJ1bGVzZXQgc2hvdWxkIGJlIHRocm93biBhd2F5Lg0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9ycyA9IHRoaXMuX3NlbGVjdG9yc19ncm91cCgpOw0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4KXsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgU3ludGF4RXJyb3IgJiYgIXRoaXMub3B0aW9ucy5zdHJpY3Qpew0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZmlyZSBlcnJvciBldmVudA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICAgICAiZXJyb3IiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAgICAgIGV4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICAgIGV4Lm1lc3NhZ2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogICAgICAgZXgubGluZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2w6ICAgICAgICBleC5jb2wNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2tpcCBvdmVyIGV2ZXJ5dGhpbmcgdW50aWwgY2xvc2luZyBicmFjZQ0KICAgICAgICAgICAgICAgICAgICAgICAgdHQgPSB0b2tlblN0cmVhbS5hZHZhbmNlKFtUb2tlbnMuUkJSQUNFXSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHQgPT0gVG9rZW5zLlJCUkFDRSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIGEgcmlnaHQgYnJhY2UsIHRoZSBydWxlIGlzIGZpbmlzaGVkIHNvIGRvbid0IGRvIGFueXRoaW5nDQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb3RoZXJ3aXNlLCByZXRocm93IHRoZSBlcnJvciBiZWNhdXNlIGl0IHdhc24ndCBoYW5kbGVkIHByb3Blcmx5DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7DQogICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vbm90IGEgc3ludGF4IGVycm9yLCByZXRocm93IGl0DQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsNCiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgLy90cmlnZ2VyIHBhcnNlciB0byBjb250aW51ZQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9pZiBpdCBnb3QgaGVyZSwgYWxsIHNlbGVjdG9ycyBwYXJzZWQNCiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JzKXsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgICAgICJzdGFydHJ1bGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzOiAgc2VsZWN0b3JzLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogICAgICAgc2VsZWN0b3JzWzBdLmxpbmUsDQogICAgICAgICAgICAgICAgICAgICAgICBjb2w6ICAgICAgICBzZWxlY3RvcnNbMF0uY29sDQogICAgICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWREZWNsYXJhdGlvbnModHJ1ZSk7ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgICAgICJlbmRydWxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yczogIHNlbGVjdG9ycywNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgICAgIHNlbGVjdG9yc1swXS5saW5lLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sOiAgICAgICAgc2VsZWN0b3JzWzBdLmNvbA0KICAgICAgICAgICAgICAgICAgICB9KTsgIA0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yczsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF9zZWxlY3RvcnNfZ3JvdXA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAqIHNlbGVjdG9yc19ncm91cA0KICAgICAgICAgICAgICAgICAqICAgOiBzZWxlY3RvciBbIENPTU1BIFMqIHNlbGVjdG9yIF0qDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzICAgPSBbXSwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gdGhpcy5fc2VsZWN0b3IoKTsNCiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT09IG51bGwpew0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcnMucHVzaChzZWxlY3Rvcik7DQogICAgICAgICAgICAgICAgICAgIHdoaWxlKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5DT01NQSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gdGhpcy5fc2VsZWN0b3IoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvciAhPT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzLnB1c2goc2VsZWN0b3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91bmV4cGVjdGVkVG9rZW4odG9rZW5TdHJlYW0uTFQoMSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9ycy5sZW5ndGggPyBzZWxlY3RvcnMgOiBudWxsOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF9zZWxlY3RvcjogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIHNlbGVjdG9yDQogICAgICAgICAgICAgICAgICogICA6IHNpbXBsZV9zZWxlY3Rvcl9zZXF1ZW5jZSBbIGNvbWJpbmF0b3Igc2ltcGxlX3NlbGVjdG9yX3NlcXVlbmNlIF0qDQogICAgICAgICAgICAgICAgICogICA7ICAgIA0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgICAgPSBbXSwNCiAgICAgICAgICAgICAgICAgICAgbmV4dFNlbGVjdG9yID0gbnVsbCwNCiAgICAgICAgICAgICAgICAgICAgY29tYmluYXRvciAgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICB3cyAgICAgICAgICA9IG51bGw7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIG5vIHNpbXBsZSBzZWxlY3RvciwgdGhlbiB0aGVyZSdzIG5vIHNlbGVjdG9yDQogICAgICAgICAgICAgICAgbmV4dFNlbGVjdG9yID0gdGhpcy5fc2ltcGxlX3NlbGVjdG9yX3NlcXVlbmNlKCk7DQogICAgICAgICAgICAgICAgaWYgKG5leHRTZWxlY3RvciA9PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBzZWxlY3Rvci5wdXNoKG5leHRTZWxlY3Rvcik7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgLy9sb29rIGZvciBhIGNvbWJpbmF0b3INCiAgICAgICAgICAgICAgICAgICAgY29tYmluYXRvciA9IHRoaXMuX2NvbWJpbmF0b3IoKTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmIChjb21iaW5hdG9yICE9PSBudWxsKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnB1c2goY29tYmluYXRvcik7DQogICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2VsZWN0b3IgPSB0aGlzLl9zaW1wbGVfc2VsZWN0b3Jfc2VxdWVuY2UoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgLy90aGVyZSBtdXN0IGJlIGEgbmV4dCBzZWxlY3Rvcg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRTZWxlY3RvciA9PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5leHBlY3RlZFRva2VuKHRoaXMuTFQoMSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbmV4dFNlbGVjdG9yIGlzIGFuIGluc3RhbmNlIG9mIFNlbGVjdG9yUGFydA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnB1c2gobmV4dFNlbGVjdG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIG5vdCB3aGl0ZXNwYWNlLCB3ZSdyZSBkb25lDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmVhZFdoaXRlc3BhY2UoKSl7ICAgICAgICAgICANCiAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hZGQgd2hpdGVzcGFjZSBzZXBhcmF0b3INCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cyA9IG5ldyBDb21iaW5hdG9yKHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWUsIHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lLCB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbWJpbmF0b3IgaXMgbm90IHJlcXVpcmVkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluYXRvciA9IHRoaXMuX2NvbWJpbmF0b3IoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3NlbGVjdG9yIGlzIHJlcXVpcmVkIGlmIHRoZXJlJ3MgYSBjb21iaW5hdG9yDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFNlbGVjdG9yID0gdGhpcy5fc2ltcGxlX3NlbGVjdG9yX3NlcXVlbmNlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRTZWxlY3RvciA9PT0gbnVsbCl7ICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21iaW5hdG9yICE9PSBudWxsKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuZXhwZWN0ZWRUb2tlbih0b2tlblN0cmVhbS5MVCgxKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbWJpbmF0b3IgIT09IG51bGwpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IucHVzaChjb21iaW5hdG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnB1c2god3MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5wdXNoKG5leHRTZWxlY3Rvcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gd2hpbGUodHJ1ZSk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RvcihzZWxlY3Rvciwgc2VsZWN0b3JbMF0ubGluZSwgc2VsZWN0b3JbMF0uY29sKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF9zaW1wbGVfc2VsZWN0b3Jfc2VxdWVuY2U6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBzaW1wbGVfc2VsZWN0b3Jfc2VxdWVuY2UNCiAgICAgICAgICAgICAgICAgKiAgIDogWyB0eXBlX3NlbGVjdG9yIHwgdW5pdmVyc2FsIF0NCiAgICAgICAgICAgICAgICAgKiAgICAgWyBIQVNIIHwgY2xhc3MgfCBhdHRyaWIgfCBwc2V1ZG8gfCBuZWdhdGlvbiBdKg0KICAgICAgICAgICAgICAgICAqICAgfCBbIEhBU0ggfCBjbGFzcyB8IGF0dHJpYiB8IHBzZXVkbyB8IG5lZ2F0aW9uIF0rDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAvL3BhcnRzIG9mIGEgc2ltcGxlIHNlbGVjdG9yDQogICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gbnVsbCwNCiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzICAgPSBbXSwNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIC8vY29tcGxldGUgc2VsZWN0b3IgdGV4dA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RvclRleHQ9ICIiLA0KDQogICAgICAgICAgICAgICAgICAgIC8vdGhlIGRpZmZlcmVudCBwYXJ0cyBhZnRlciB0aGUgZWxlbWVudCBuYW1lIHRvIHNlYXJjaCBmb3INCiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cyAgPSBbDQogICAgICAgICAgICAgICAgICAgICAgICAvL0hBU0gNCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5IQVNIKSA/DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VsZWN0b3JTdWJQYXJ0KHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWUsICJpZCIsIHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lLCB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sKSA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NsYXNzLA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXR0cmliLA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHNldWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmVnYXRpb24NCiAgICAgICAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgICAgICAgaSAgICAgICAgICAgPSAwLA0KICAgICAgICAgICAgICAgICAgICBsZW4gICAgICAgICA9IGNvbXBvbmVudHMubGVuZ3RoLA0KICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIGZvdW5kICAgICAgID0gZmFsc2UsDQogICAgICAgICAgICAgICAgICAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbDsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vZ2V0IHN0YXJ0aW5nIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhlIHNlbGVjdG9yDQogICAgICAgICAgICAgICAgbGluZSA9IHRva2VuU3RyZWFtLkxUKDEpLnN0YXJ0TGluZTsNCiAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS5MVCgxKS5zdGFydENvbDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9IHRoaXMuX3R5cGVfc2VsZWN0b3IoKTsNCiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnROYW1lKXsNCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSB0aGlzLl91bml2ZXJzYWwoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lICE9PSBudWxsKXsNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JUZXh0ICs9IGVsZW1lbnROYW1lOw0KICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgd2hpbGUodHJ1ZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgLy93aGl0ZXNwYWNlIG1lYW5zIHdlJ3JlIGRvbmUNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLnBlZWsoKSA9PT0gVG9rZW5zLlMpew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBmb3IgZWFjaCBjb21wb25lbnQNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUoaSA8IGxlbiAmJiBjb21wb25lbnQgPT09IG51bGwpew0KICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50c1tpKytdLmNhbGwodGhpcyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgPT09IG51bGwpew0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC8vd2UgZG9uJ3QgaGF2ZSBhIHNlbGVjdG9yDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JUZXh0ID09PSAiIil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMucHVzaChjb21wb25lbnQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JUZXh0ICs9IGNvbXBvbmVudC50b1N0cmluZygpOyANCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yVGV4dCAhPT0gIiIgPw0KICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlbGVjdG9yUGFydChlbGVtZW50TmFtZSwgbW9kaWZpZXJzLCBzZWxlY3RvclRleHQsIGxpbmUsIGNvbCkgOg0KICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDsNCiAgICAgICAgICAgIH0sICAgICAgICAgICAgDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF90eXBlX3NlbGVjdG9yOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogdHlwZV9zZWxlY3Rvcg0KICAgICAgICAgICAgICAgICAqICAgOiBbIG5hbWVzcGFjZV9wcmVmaXggXT8gZWxlbWVudF9uYW1lDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICBucyAgICAgICAgICA9IHRoaXMuX25hbWVzcGFjZV9wcmVmaXgoKSwNCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSB0aGlzLl9lbGVtZW50X25hbWUoKTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50TmFtZSl7ICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgICAgICogTmVlZCB0byBiYWNrIG91dCB0aGUgbmFtZXNwYWNlIHRoYXQgd2FzIHJlYWQgZHVlIHRvIGJvdGgNCiAgICAgICAgICAgICAgICAgICAgICogdHlwZV9zZWxlY3RvciBhbmQgdW5pdmVyc2FsIHJlYWRpbmcgbmFtZXNwYWNlX3ByZWZpeA0KICAgICAgICAgICAgICAgICAgICAgKiBmaXJzdC4gS2luZCBvZiBoYWNreSwgYnV0IG9ubHkgd2F5IEkgY2FuIGZpZ3VyZSBvdXQNCiAgICAgICAgICAgICAgICAgICAgICogcmlnaHQgbm93IGhvdyB0byBub3QgY2hhbmdlIHRoZSBncmFtbWFyLg0KICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgICAgaWYgKG5zKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLnVuZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnMubGVuZ3RoID4gMSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0udW5nZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmIChucyl7DQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZS50ZXh0ID0gbnMgKyBlbGVtZW50TmFtZS50ZXh0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUuY29sIC09IG5zLmxlbmd0aDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudE5hbWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy9DU1MzIFNlbGVjdG9ycw0KICAgICAgICAgICAgX2NsYXNzOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogY2xhc3MNCiAgICAgICAgICAgICAgICAgKiAgIDogJy4nIElERU5UDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovICAgIA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdG9rZW47DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5ET1QpKXsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5JREVOVCk7ICAgIA0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuU3RyZWFtLnRva2VuKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0b3JTdWJQYXJ0KCIuIiArIHRva2VuLnZhbHVlLCAiY2xhc3MiLCB0b2tlbi5zdGFydExpbmUsIHRva2VuLnN0YXJ0Q29sIC0gMSk7ICAgICAgICANCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy9DU1MzIFNlbGVjdG9ycw0KICAgICAgICAgICAgX2VsZW1lbnRfbmFtZTogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIGVsZW1lbnRfbmFtZQ0KICAgICAgICAgICAgICAgICAqICAgOiBJREVOVA0KICAgICAgICAgICAgICAgICAqICAgOw0KICAgICAgICAgICAgICAgICAqLyAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdG9rZW47DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5JREVOVCkpew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuU3RyZWFtLnRva2VuKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0b3JTdWJQYXJ0KHRva2VuLnZhbHVlLCAiZWxlbWVudE5hbWUiLCB0b2tlbi5zdGFydExpbmUsIHRva2VuLnN0YXJ0Q29sKTsgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF9uYW1lc3BhY2VfcHJlZml4OiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICogbmFtZXNwYWNlX3ByZWZpeA0KICAgICAgICAgICAgICAgICAqICAgOiBbIElERU5UIHwgJyonIF0/ICd8Jw0KICAgICAgICAgICAgICAgICAqICAgOw0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICA9ICIiOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL3ZlcmlmeSB0aGF0IHRoaXMgaXMgYSBuYW1lc3BhY2UgcHJlZml4DQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLkxBKDEpID09PSBUb2tlbnMuUElQRSB8fCB0b2tlblN0cmVhbS5MQSgyKSA9PT0gVG9rZW5zLlBJUEUpew0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmKHRva2VuU3RyZWFtLm1hdGNoKFtUb2tlbnMuSURFTlQsIFRva2Vucy5TVEFSXSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5QSVBFKTsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gInwiOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA/IHZhbHVlIDogbnVsbDsgICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICAvL0NTUzMgU2VsZWN0b3JzDQogICAgICAgICAgICBfdW5pdmVyc2FsOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogdW5pdmVyc2FsDQogICAgICAgICAgICAgICAgICogICA6IFsgbmFtZXNwYWNlX3ByZWZpeCBdPyAnKicNCiAgICAgICAgICAgICAgICAgKiAgIDsgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgICAgICAgPSAiIiwNCiAgICAgICAgICAgICAgICAgICAgbnM7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIG5zID0gdGhpcy5fbmFtZXNwYWNlX3ByZWZpeCgpOw0KICAgICAgICAgICAgICAgIGlmKG5zKXsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gbnM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5TVEFSKSl7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9ICIqIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA/IHZhbHVlIDogbnVsbDsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy9DU1MzIFNlbGVjdG9ycw0KICAgICAgICAgICAgX2F0dHJpYjogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIGF0dHJpYg0KICAgICAgICAgICAgICAgICAqICAgOiAnWycgUyogWyBuYW1lc3BhY2VfcHJlZml4IF0/IElERU5UIFMqDQogICAgICAgICAgICAgICAgICogICAgICAgICBbIFsgUFJFRklYTUFUQ0ggfA0KICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFNVRkZJWE1BVENIIHwNCiAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBTVUJTVFJJTkdNQVRDSCB8DQogICAgICAgICAgICAgICAgICogICAgICAgICAgICAgJz0nIHwNCiAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBJTkNMVURFUyB8DQogICAgICAgICAgICAgICAgICogICAgICAgICAgICAgREFTSE1BVENIIF0gUyogWyBJREVOVCB8IFNUUklORyBdIFMqDQogICAgICAgICAgICAgICAgICogICAgICAgICBdPyAnXScNCiAgICAgICAgICAgICAgICAgKiAgIDsgICAgDQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIG5zLA0KICAgICAgICAgICAgICAgICAgICB0b2tlbjsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAodG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLkxCUkFDS0VUKSl7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0udG9rZW4oKTsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b2tlbi52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIG5zID0gdGhpcy5fbmFtZXNwYWNlX3ByZWZpeCgpOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgaWYgKG5zKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IG5zOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuSURFTlQpOw0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOyAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBpZih0b2tlblN0cmVhbS5tYXRjaChbVG9rZW5zLlBSRUZJWE1BVENILCBUb2tlbnMuU1VGRklYTUFUQ0gsIFRva2Vucy5TVUJTVFJJTkdNQVRDSCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbnMuRVFVQUxTLCBUb2tlbnMuSU5DTFVERVMsIFRva2Vucy5EQVNITUFUQ0hdKSl7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFtUb2tlbnMuSURFTlQsIFRva2Vucy5TVFJJTkddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7ICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuUkJSQUNLRVQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdG9yU3ViUGFydCh2YWx1ZSArICJdIiwgImF0dHJpYnV0ZSIsIHRva2VuLnN0YXJ0TGluZSwgdG9rZW4uc3RhcnRDb2wpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF9wc2V1ZG86IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIHBzZXVkbw0KICAgICAgICAgICAgICAgICAqICAgOiAnOicgJzonPyBbIElERU5UIHwgZnVuY3Rpb25hbF9wc2V1ZG8gXQ0KICAgICAgICAgICAgICAgICAqICAgOyAgICANCiAgICAgICAgICAgICAgICAgKi8gICANCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICBwc2V1ZG8gICAgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIGNvbG9ucyAgICAgID0gIjoiLA0KICAgICAgICAgICAgICAgICAgICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2w7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5DT0xPTikpew0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLkNPTE9OKSl7DQogICAgICAgICAgICAgICAgICAgICAgICBjb2xvbnMgKz0gIjoiOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuSURFTlQpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBzZXVkbyA9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7DQogICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydExpbmU7DQogICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sIC0gY29sb25zLmxlbmd0aDsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLkZVTkNUSU9OKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS5MVCgxKS5zdGFydExpbmU7DQogICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS5MVCgxKS5zdGFydENvbCAtIGNvbG9ucy5sZW5ndGg7DQogICAgICAgICAgICAgICAgICAgICAgICBwc2V1ZG8gPSB0aGlzLl9mdW5jdGlvbmFsX3BzZXVkbygpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBpZiAocHNldWRvKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBzZXVkbyA9IG5ldyBTZWxlY3RvclN1YlBhcnQoY29sb25zICsgcHNldWRvLCAicHNldWRvIiwgbGluZSwgY29sKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIHBzZXVkbzsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF9mdW5jdGlvbmFsX3BzZXVkbzogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIGZ1bmN0aW9uYWxfcHNldWRvDQogICAgICAgICAgICAgICAgICogICA6IEZVTkNUSU9OIFMqIGV4cHJlc3Npb24gJyknDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgKi8gICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5GVU5DVElPTikpew0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX2V4cHJlc3Npb24oKTsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5SUEFSRU4pOw0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSAiKSI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF9leHByZXNzaW9uOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogZXhwcmVzc2lvbg0KICAgICAgICAgICAgICAgICAqICAgOiBbIFsgUExVUyB8ICctJyB8IERJTUVOU0lPTiB8IE5VTUJFUiB8IFNUUklORyB8IElERU5UIF0gUyogXSsNCiAgICAgICAgICAgICAgICAgKiAgIDsNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHZhbHVlICAgICAgID0gIiI7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHdoaWxlKHRva2VuU3RyZWFtLm1hdGNoKFtUb2tlbnMuUExVUywgVG9rZW5zLk1JTlVTLCBUb2tlbnMuRElNRU5TSU9OLA0KICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5zLk5VTUJFUiwgVG9rZW5zLlNUUklORywgVG9rZW5zLklERU5ULCBUb2tlbnMuTEVOR1RILA0KICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5zLkZSRVEsIFRva2Vucy5BTkdMRSwgVG9rZW5zLlRJTUUsDQogICAgICAgICAgICAgICAgICAgICAgICBUb2tlbnMuUkVTT0xVVElPTl0pKXsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPyB2YWx1ZSA6IG51bGw7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9LA0KDQogICAgICAgICAgICAvL0NTUzMgU2VsZWN0b3JzDQogICAgICAgICAgICBfbmVnYXRpb246IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgLyogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgKiBuZWdhdGlvbg0KICAgICAgICAgICAgICAgICAqICAgOiBOT1QgUyogbmVnYXRpb25fYXJnIFMqICcpJw0KICAgICAgICAgICAgICAgICAqICAgOw0KICAgICAgICAgICAgICAgICAqLw0KDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbCwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgICAgICAgPSAiIiwNCiAgICAgICAgICAgICAgICAgICAgYXJnLA0KICAgICAgICAgICAgICAgICAgICBzdWJwYXJ0ICAgICA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuTk9UKSl7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgbGluZSA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lOw0KICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sOw0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgICAgICBhcmcgPSB0aGlzLl9uZWdhdGlvbl9hcmcoKTsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gYXJnOw0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuUlBBUkVOKTsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHN1YnBhcnQgPSBuZXcgU2VsZWN0b3JTdWJQYXJ0KHZhbHVlLCAibm90IiwgbGluZSwgY29sKTsNCiAgICAgICAgICAgICAgICAgICAgc3VicGFydC5hcmdzLnB1c2goYXJnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIHN1YnBhcnQ7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICAvL0NTUzMgU2VsZWN0b3JzDQogICAgICAgICAgICBfbmVnYXRpb25fYXJnOiBmdW5jdGlvbigpeyAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogbmVnYXRpb25fYXJnDQogICAgICAgICAgICAgICAgICogICA6IHR5cGVfc2VsZWN0b3IgfCB1bml2ZXJzYWwgfCBIQVNIIHwgY2xhc3MgfCBhdHRyaWIgfCBwc2V1ZG8NCiAgICAgICAgICAgICAgICAgKiAgIDsgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgKi8gICAgICAgICAgIA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgYXJncyAgICAgICAgPSBbDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90eXBlX3NlbGVjdG9yLA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5pdmVyc2FsLA0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLkhBU0gpID8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZWxlY3RvclN1YlBhcnQodG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZSwgImlkIiwgdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydExpbmUsIHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRDb2wpIDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xhc3MsDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hdHRyaWIsDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wc2V1ZG8gICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgICAgICBhcmcgICAgICAgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIGkgICAgICAgICAgID0gMCwNCiAgICAgICAgICAgICAgICAgICAgbGVuICAgICAgICAgPSBhcmdzLmxlbmd0aCwNCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUsDQogICAgICAgICAgICAgICAgICAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbCwNCiAgICAgICAgICAgICAgICAgICAgcGFydDsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgbGluZSA9IHRva2VuU3RyZWFtLkxUKDEpLnN0YXJ0TGluZTsNCiAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS5MVCgxKS5zdGFydENvbDsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB3aGlsZShpIDwgbGVuICYmIGFyZyA9PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmdzW2ldLmNhbGwodGhpcyk7DQogICAgICAgICAgICAgICAgICAgIGkrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9tdXN0IGJlIGEgbmVnYXRpb24gYXJnDQogICAgICAgICAgICAgICAgaWYgKGFyZyA9PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuZXhwZWN0ZWRUb2tlbih0b2tlblN0cmVhbS5MVCgxKSk7DQogICAgICAgICAgICAgICAgfQ0KIA0KICAgICAgICAgICAgICAgIC8vaXQncyBhbiBlbGVtZW50IG5hbWUNCiAgICAgICAgICAgICAgICBpZiAoYXJnLnR5cGUgPT0gImVsZW1lbnROYW1lIil7DQogICAgICAgICAgICAgICAgICAgIHBhcnQgPSBuZXcgU2VsZWN0b3JQYXJ0KGFyZywgW10sIGFyZy50b1N0cmluZygpLCBsaW5lLCBjb2wpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHBhcnQgPSBuZXcgU2VsZWN0b3JQYXJ0KG51bGwsIFthcmddLCBhcmcudG9TdHJpbmcoKSwgbGluZSwgY29sKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIHBhcnQ7ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgX2RlY2xhcmF0aW9uOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBkZWNsYXJhdGlvbg0KICAgICAgICAgICAgICAgICAqICAgOiBwcm9wZXJ0eSAnOicgUyogZXhwciBwcmlvPw0KICAgICAgICAgICAgICAgICAqICAgfCAvKCBlbXB0eSApLw0KICAgICAgICAgICAgICAgICAqICAgOyAgICAgDQogICAgICAgICAgICAgICAgICovICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ICAgID0gbnVsbCwNCiAgICAgICAgICAgICAgICAgICAgZXhwciAgICAgICAgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICBwcmlvICAgICAgICA9IG51bGw7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcHJvcGVydHkgPSB0aGlzLl9wcm9wZXJ0eSgpOw0KICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPT0gbnVsbCl7DQoNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5DT0xPTik7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5fZXhwcigpOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIG5vIHBhcnRzIGZvciB0aGUgdmFsdWUsIGl0J3MgYW4gZXJyb3INCiAgICAgICAgICAgICAgICAgICAgaWYgKCFleHByIHx8IGV4cHIubGVuZ3RoID09PSAwKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuZXhwZWN0ZWRUb2tlbih0b2tlblN0cmVhbS5MVCgxKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHByaW8gPSB0aGlzLl9wcmlvKCk7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoew0KICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogICAgICAgInByb3BlcnR5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiAgIHByb3BlcnR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICAgICAgZXhwciwNCiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGFudDogIHByaW8sDQogICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiAgICAgICBwcm9wZXJ0eS5saW5lLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sOiAgICAgICAgcHJvcGVydHkuY29sDQogICAgICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICBfcHJpbzogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIHByaW8NCiAgICAgICAgICAgICAgICAgKiAgIDogSU1QT1JUQU5UX1NZTSBTKg0KICAgICAgICAgICAgICAgICAqICAgOyAgICANCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCAgICAgID0gdG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLklNUE9SVEFOVF9TWU0pOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICBfZXhwcjogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIGV4cHINCiAgICAgICAgICAgICAgICAgKiAgIDogdGVybSBbIG9wZXJhdG9yIHRlcm0gXSoNCiAgICAgICAgICAgICAgICAgKiAgIDsNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHZhbHVlcyAgICAgID0gW10sDQoJCQkJCS8vdmFsdWVQYXJ0cwk9IFtdLA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yICAgID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl90ZXJtKCk7DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKXsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPSB0aGlzLl9vcGVyYXRvcigpOw0KICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUncyBhbiBvcGVyYXRvciwga2VlcCBidWlsZGluZyB1cCB0aGUgdmFsdWUgcGFydHMNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGVyYXRvcil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2gob3BlcmF0b3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSAvKmVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUncyBub3QgYW4gb3BlcmF0b3IsIHlvdSBoYXZlIGEgZnVsbCB2YWx1ZQ0KCQkJCQkJCXZhbHVlcy5wdXNoKG5ldyBQcm9wZXJ0eVZhbHVlKHZhbHVlUGFydHMsIHZhbHVlUGFydHNbMF0ubGluZSwgdmFsdWVQYXJ0c1swXS5jb2wpKTsNCgkJCQkJCQl2YWx1ZVBhcnRzID0gW107DQoJCQkJCQl9Ki8NCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl90ZXJtKCk7DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSh0cnVlKTsNCiAgICAgICAgICAgICAgICB9DQoJCQkJDQoJCQkJLy9jbGVhbnVwDQogICAgICAgICAgICAgICAgLyppZiAodmFsdWVQYXJ0cy5sZW5ndGgpew0KICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChuZXcgUHJvcGVydHlWYWx1ZSh2YWx1ZVBhcnRzLCB2YWx1ZVBhcnRzWzBdLmxpbmUsIHZhbHVlUGFydHNbMF0uY29sKSk7DQogICAgICAgICAgICAgICAgfSovDQogICAgICAgIA0KICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IG5ldyBQcm9wZXJ0eVZhbHVlKHZhbHVlcywgdmFsdWVzWzBdLnN0YXJ0TGluZSwgdmFsdWVzWzBdLnN0YXJ0Q29sKSA6IG51bGw7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICBfdGVybTogZnVuY3Rpb24oKXsgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiB0ZXJtDQogICAgICAgICAgICAgICAgICogICA6IHVuYXJ5X29wZXJhdG9yPw0KICAgICAgICAgICAgICAgICAqICAgICBbIE5VTUJFUiBTKiB8IFBFUkNFTlRBR0UgUyogfCBMRU5HVEggUyogfCBBTkdMRSBTKiB8DQogICAgICAgICAgICAgICAgICogICAgICAgVElNRSBTKiB8IEZSRVEgUyogfCBmdW5jdGlvbiB8IGllX2Z1bmN0aW9uIF0NCiAgICAgICAgICAgICAgICAgKiAgIHwgU1RSSU5HIFMqIHwgSURFTlQgUyogfCBVUkkgUyogfCBVTklDT0RFUkFOR0UgUyogfCBoZXhjb2xvcg0KICAgICAgICAgICAgICAgICAqICAgOw0KICAgICAgICAgICAgICAgICAqLyAgICANCiAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHVuYXJ5ICAgICAgID0gbnVsbCwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgICAgICAgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2w7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vcmV0dXJucyB0aGUgb3BlcmF0b3Igb3IgbnVsbA0KICAgICAgICAgICAgICAgIHVuYXJ5ID0gdGhpcy5fdW5hcnlfb3BlcmF0b3IoKTsNCiAgICAgICAgICAgICAgICBpZiAodW5hcnkgIT09IG51bGwpew0KICAgICAgICAgICAgICAgICAgICBsaW5lID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydExpbmU7DQogICAgICAgICAgICAgICAgICAgIGNvbCA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRDb2w7DQogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vZXhjZXB0aW9uIGZvciBJRSBmaWx0ZXJzDQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLnBlZWsoKSA9PSBUb2tlbnMuSUVfRlVOQ1RJT04gJiYgdGhpcy5vcHRpb25zLmllRmlsdGVycyl7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5faWVfZnVuY3Rpb24oKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHVuYXJ5ID09PSBudWxsKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRDb2w7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL3NlZSBpZiB0aGVyZSdzIGEgc2ltcGxlIG1hdGNoDQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlblN0cmVhbS5tYXRjaChbVG9rZW5zLk5VTUJFUiwgVG9rZW5zLlBFUkNFTlRBR0UsIFRva2Vucy5MRU5HVEgsDQogICAgICAgICAgICAgICAgICAgICAgICBUb2tlbnMuQU5HTEUsIFRva2Vucy5USU1FLA0KICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5zLkZSRVEsIFRva2Vucy5TVFJJTkcsIFRva2Vucy5JREVOVCwgVG9rZW5zLlVSSSwgVG9rZW5zLlVOSUNPREVfUkFOR0VdKSl7DQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7DQogICAgICAgICAgICAgICAgICAgIGlmICh1bmFyeSA9PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydExpbmU7DQogICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgLy9zZWUgaWYgaXQncyBhIGNvbG9yDQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5faGV4Y29sb3IoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKXsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAvL2lmIHRoZXJlJ3Mgbm8gdW5hcnksIGdldCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgdG9rZW4gZm9yIGxpbmUvY29sIGluZm8NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmFyeSA9PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHRva2VuU3RyZWFtLkxUKDEpLnN0YXJ0TGluZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS5MVCgxKS5zdGFydENvbDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaGFzIHRvIGJlIGEgZnVuY3Rpb24NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGNoZWNrcyBmb3IgYWxwaGEob3BhY2l0eT0wKSBzdHlsZSBvZiBJRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZ1bmN0aW9ucy4gSUVfRlVOQ1RJT04gb25seSBwcmVzZW50cyBwcm9naWQ6IHN0eWxlLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5MQSgzKSA9PSBUb2tlbnMuRVFVQUxTICYmIHRoaXMub3B0aW9ucy5pZUZpbHRlcnMpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX2llX2Z1bmN0aW9uKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9mdW5jdGlvbigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgLyppZiAodmFsdWUgPT09IG51bGwpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBpZGVudGlmaWVyIGF0IGxpbmUgIiArIHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lICsgIiwgY2hhcmFjdGVyICIgKyAgdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydENvbCArICIuIik7DQogICAgICAgICAgICAgICAgICAgICAgICB9Ki8NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5hcnkgPT09IG51bGwpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCA/DQogICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZVBhcnQodW5hcnkgIT09IG51bGwgPyB1bmFyeSArIHZhbHVlIDogdmFsdWUsIGxpbmUsIGNvbCkgOg0KICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDsNCiAgICAgICAgDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICBfZnVuY3Rpb246IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIGZ1bmN0aW9uDQogICAgICAgICAgICAgICAgICogICA6IEZVTkNUSU9OIFMqIGV4cHIgJyknIFMqDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblRleHQgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICBleHByICAgICAgICA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuRlVOQ1RJT04pKXsNCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UZXh0ID0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuX2V4cHIoKTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5SUEFSRU4pOyAgICANCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UZXh0ICs9IGV4cHIgKyAiKSI7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25UZXh0Ow0KICAgICAgICAgICAgfSwgDQogICAgICAgICAgICANCiAgICAgICAgICAgIF9pZV9mdW5jdGlvbjogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qIChNeSBvd24gZXh0ZW5zaW9uKQ0KICAgICAgICAgICAgICAgICAqIGllX2Z1bmN0aW9uDQogICAgICAgICAgICAgICAgICogICA6IElFX0ZVTkNUSU9OIFMqIElERU5UICc9JyB0ZXJtIFtTKiAnLCc/IElERU5UICc9JyB0ZXJtXSsgJyknIFMqDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblRleHQgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICBleHByICAgICAgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIGx0Ow0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL0lFIGZ1bmN0aW9uIGNhbiBiZWdpbiBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgdG9vDQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFtUb2tlbnMuSUVfRlVOQ1RJT04sIFRva2Vucy5GVU5DVElPTl0pKXsNCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UZXh0ID0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmVhZFdoaXRlc3BhY2UoKSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UZXh0ICs9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC8vbWlnaHQgYmUgc2Vjb25kIHRpbWUgaW4gdGhlIGxvb3ANCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5MQSgwKSA9PSBUb2tlbnMuQ09NTUEpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uVGV4dCArPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5JREVOVCk7DQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblRleHQgKz0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLkVRVUFMUyk7DQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblRleHQgKz0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgLy9mdW5jdGlvblRleHQgKz0gdGhpcy5fdGVybSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgbHQgPSB0b2tlblN0cmVhbS5wZWVrKCk7DQogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShsdCAhPSBUb2tlbnMuQ09NTUEgJiYgbHQgIT0gVG9rZW5zLlMgJiYgbHQgIT0gVG9rZW5zLlJQQVJFTil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0uZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UZXh0ICs9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHQgPSB0b2tlblN0cmVhbS5wZWVrKCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUodG9rZW5TdHJlYW0ubWF0Y2goW1Rva2Vucy5DT01NQSwgVG9rZW5zLlNdKSk7ICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5SUEFSRU4pOyAgICANCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UZXh0ICs9ICIpIjsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvblRleHQ7DQogICAgICAgICAgICB9LCANCiAgICAgICAgICAgIA0KICAgICAgICAgICAgX2hleGNvbG9yOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogVGhlcmUgaXMgYSBjb25zdHJhaW50IG9uIHRoZSBjb2xvciB0aGF0IGl0IG11c3QNCiAgICAgICAgICAgICAgICAgKiBoYXZlIGVpdGhlciAzIG9yIDYgaGV4LWRpZ2l0cyAoaS5lLiwgWzAtOWEtZkEtRl0pDQogICAgICAgICAgICAgICAgICogYWZ0ZXIgdGhlICIjIjsgZS5nLiwgIiMwMDAiIGlzIE9LLCBidXQgIiNhYmNkIiBpcyBub3QuDQogICAgICAgICAgICAgICAgICoNCiAgICAgICAgICAgICAgICAgKiBoZXhjb2xvcg0KICAgICAgICAgICAgICAgICAqICAgOiBIQVNIIFMqDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICB0b2tlbiwNCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBudWxsOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5IQVNIKSl7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIC8vbmVlZCB0byBkbyBzb21lIHZhbGlkYXRpb24gaGVyZQ0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlblN0cmVhbS50b2tlbigpOw0KICAgICAgICAgICAgICAgICAgICBjb2xvciA9IHRva2VuLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICBpZiAoIS8jW2EtZjAtOV17Myw2fS9pLnRlc3QoY29sb3IpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigiRXhwZWN0ZWQgYSBoZXggY29sb3IgYnV0IGZvdW5kICciICsgY29sb3IgKyAiJyBhdCBsaW5lICIgKyB0b2tlbi5zdGFydExpbmUgKyAiLCBjb2wgIiArIHRva2VuLnN0YXJ0Q29sICsgIi4iLCB0b2tlbi5zdGFydExpbmUsIHRva2VuLnN0YXJ0Q29sKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByZXR1cm4gY29sb3I7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgICAgICAvLyBBbmltYXRpb25zIG1ldGhvZHMNCiAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgX2tleWZyYW1lczogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICoga2V5ZnJhbWVzOg0KICAgICAgICAgICAgICAgICAqICAgOiBLRVlGUkFNRVNfU1lNIFMqIGtleWZyYW1lX25hbWUgUyogJ3snIFMqIGtleWZyYW1lX3J1bGUqICd9JyB7DQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHRva2VuLA0KICAgICAgICAgICAgICAgICAgICB0dCwNCiAgICAgICAgICAgICAgICAgICAgbmFtZTsgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5LRVlGUkFNRVNfU1lNKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIG5hbWUgPSB0aGlzLl9rZXlmcmFtZV9uYW1lKCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLkxCUkFDRSk7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgInN0YXJ0a2V5ZnJhbWVzIiwNCiAgICAgICAgICAgICAgICAgICAgbmFtZTogICBuYW1lLA0KICAgICAgICAgICAgICAgICAgICBsaW5lOiAgIG5hbWUubGluZSwNCiAgICAgICAgICAgICAgICAgICAgY29sOiAgICBuYW1lLmNvbA0KICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIHR0ID0gdG9rZW5TdHJlYW0ucGVlaygpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vY2hlY2sgZm9yIGtleQ0KICAgICAgICAgICAgICAgIHdoaWxlKHR0ID09IFRva2Vucy5JREVOVCB8fCB0dCA9PSBUb2tlbnMuUEVSQ0VOVEFHRSkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlmcmFtZV9ydWxlKCk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgICAgIHR0ID0gdG9rZW5TdHJlYW0ucGVlaygpOw0KICAgICAgICAgICAgICAgIH0gICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgImVuZGtleWZyYW1lcyIsDQogICAgICAgICAgICAgICAgICAgIG5hbWU6ICAgbmFtZSwNCiAgICAgICAgICAgICAgICAgICAgbGluZTogICBuYW1lLmxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbDogICAgbmFtZS5jb2wNCiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5SQlJBQ0UpOyAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICBfa2V5ZnJhbWVfbmFtZTogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICoga2V5ZnJhbWVfbmFtZToNCiAgICAgICAgICAgICAgICAgKiAgIDogSURFTlQNCiAgICAgICAgICAgICAgICAgKiAgIHwgU1RSSU5HDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHRva2VuOw0KDQogICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFtUb2tlbnMuSURFTlQsIFRva2Vucy5TVFJJTkddKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gU3ludGF4VW5pdC5mcm9tVG9rZW4odG9rZW5TdHJlYW0udG9rZW4oKSk7ICAgICAgICAgICAgDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICBfa2V5ZnJhbWVfcnVsZTogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICoga2V5ZnJhbWVfcnVsZToNCiAgICAgICAgICAgICAgICAgKiAgIDoga2V5X2xpc3QgUyogDQogICAgICAgICAgICAgICAgICogICAgICd7JyBTKiBkZWNsYXJhdGlvbiBbICc7JyBTKiBkZWNsYXJhdGlvbiBdKiAnfScgUyoNCiAgICAgICAgICAgICAgICAgKiAgIDsNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4sDQogICAgICAgICAgICAgICAgICAgIGtleUxpc3QgPSB0aGlzLl9rZXlfbGlzdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5maXJlKHsNCiAgICAgICAgICAgICAgICAgICAgdHlwZTogICAic3RhcnRrZXlmcmFtZXJ1bGUiLA0KICAgICAgICAgICAgICAgICAgICBrZXlzOiAgIGtleUxpc3QsDQogICAgICAgICAgICAgICAgICAgIGxpbmU6ICAga2V5TGlzdFswXS5saW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2w6ICAgIGtleUxpc3RbMF0uY29sDQogICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWREZWNsYXJhdGlvbnModHJ1ZSk7ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgImVuZGtleWZyYW1lcnVsZSIsDQogICAgICAgICAgICAgICAgICAgIGtleXM6ICAga2V5TGlzdCwNCiAgICAgICAgICAgICAgICAgICAgbGluZTogICBrZXlMaXN0WzBdLmxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbDogICAga2V5TGlzdFswXS5jb2wNCiAgICAgICAgICAgICAgICB9KTsgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgX2tleV9saXN0OiBmdW5jdGlvbigpew0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBrZXlfbGlzdDoNCiAgICAgICAgICAgICAgICAgKiAgIDoga2V5IFsgUyogJywnIFMqIGtleV0qDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHRva2VuLA0KICAgICAgICAgICAgICAgICAgICBrZXksDQogICAgICAgICAgICAgICAgICAgIGtleUxpc3QgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9tdXN0IGJlIGxlYXN0IG9uZSBrZXkNCiAgICAgICAgICAgICAgICBrZXlMaXN0LnB1c2godGhpcy5fa2V5KCkpOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB3aGlsZSh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuQ09NTUEpKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICAgICAga2V5TGlzdC5wdXNoKHRoaXMuX2tleSgpKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICByZXR1cm4ga2V5TGlzdDsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIF9rZXk6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBUaGVyZSBpcyBhIHJlc3RyaWN0aW9uIHRoYXQgSURFTlQgY2FuIGJlIG9ubHkgImZyb20iIG9yICJ0byIuDQogICAgICAgICAgICAgICAgICoNCiAgICAgICAgICAgICAgICAgKiBrZXkNCiAgICAgICAgICAgICAgICAgKiAgIDogUEVSQ0VOVEFHRQ0KICAgICAgICAgICAgICAgICAqICAgfCBJREVOVA0KICAgICAgICAgICAgICAgICAqICAgOw0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdG9rZW47DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuUEVSQ0VOVEFHRSkpew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3ludGF4VW5pdC5mcm9tVG9rZW4odG9rZW5TdHJlYW0udG9rZW4oKSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuSURFTlQpKXsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlblN0cmVhbS50b2tlbigpOyAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBpZiAoL2Zyb218dG8vaS50ZXN0KHRva2VuLnZhbHVlKSl7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3ludGF4VW5pdC5mcm9tVG9rZW4odG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS51bmdldCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL2lmIGl0IGdldHMgaGVyZSwgdGhlcmUgd2Fzbid0IGEgdmFsaWQgdG9rZW4sIHNvIHRpbWUgdG8gZXhwbG9kZQ0KICAgICAgICAgICAgICAgIHRoaXMuX3VuZXhwZWN0ZWRUb2tlbih0b2tlblN0cmVhbS5MVCgxKSk7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgICAgICAvLyBIZWxwZXIgbWV0aG9kcw0KICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAqIE5vdCBwYXJ0IG9mIENTUyBncmFtbWFyLCBidXQgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyDQogICAgICAgICAgICAgKiBjb21iaW5hdGlvbiBvZiB3aGl0ZSBzcGFjZSBhbmQgSFRNTC1zdHlsZSBjb21tZW50cy4NCiAgICAgICAgICAgICAqIEByZXR1cm4ge3ZvaWR9DQogICAgICAgICAgICAgKiBAbWV0aG9kIF9za2lwQ3J1ZnQNCiAgICAgICAgICAgICAqIEBwcml2YXRlDQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIF9za2lwQ3J1ZnQ6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgd2hpbGUodGhpcy5fdG9rZW5TdHJlYW0ubWF0Y2goW1Rva2Vucy5TLCBUb2tlbnMuQ0RPLCBUb2tlbnMuQ0RDXSkpew0KICAgICAgICAgICAgICAgICAgICAvL25vb3ANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LA0KDQogICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAqIE5vdCBwYXJ0IG9mIENTUyBncmFtbWFyLCBidXQgdGhpcyBwYXR0ZXJuIG9jY3VycyBmcmVxdWVudGx5DQogICAgICAgICAgICAgKiBpbiB0aGUgb2ZmaWNpYWwgQ1NTIGdyYW1tYXIuIFNwbGl0IG91dCBoZXJlIHRvIGVsaW1pbmF0ZQ0KICAgICAgICAgICAgICogZHVwbGljYXRlIGNvZGUuDQogICAgICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNoZWNrU3RhcnQgSW5kaWNhdGVzIGlmIHRoZSBydWxlIHNob3VsZCBjaGVjaw0KICAgICAgICAgICAgICogICAgICBmb3IgdGhlIGxlZnQgYnJhY2UgYXQgdGhlIGJlZ2lubmluZy4NCiAgICAgICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVhZE1hcmdpbnMgSW5kaWNhdGVzIGlmIHRoZSBydWxlIHNob3VsZCBjaGVjaw0KICAgICAgICAgICAgICogICAgICBmb3IgbWFyZ2luIHBhdHRlcm5zLg0KICAgICAgICAgICAgICogQHJldHVybiB7dm9pZH0NCiAgICAgICAgICAgICAqIEBtZXRob2QgX3JlYWREZWNsYXJhdGlvbnMNCiAgICAgICAgICAgICAqIEBwcml2YXRlDQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIF9yZWFkRGVjbGFyYXRpb25zOiBmdW5jdGlvbihjaGVja1N0YXJ0LCByZWFkTWFyZ2lucyl7DQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBSZWFkcyB0aGUgcGF0dGVybg0KICAgICAgICAgICAgICAgICAqIFMqICd7JyBTKiBkZWNsYXJhdGlvbiBbICc7JyBTKiBkZWNsYXJhdGlvbiBdKiAnfScgUyoNCiAgICAgICAgICAgICAgICAgKiBvcg0KICAgICAgICAgICAgICAgICAqIFMqICd7JyBTKiBbIGRlY2xhcmF0aW9uIHwgbWFyZ2luIF0/IFsgJzsnIFMqIFsgZGVjbGFyYXRpb24gfCBtYXJnaW4gXT8gXSogJ30nIFMqDQogICAgICAgICAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgaXMgaG93IGl0IGlzIGRlc2NyaWJlZCBpbiBDU1MzIFBhZ2VkIE1lZGlhLCBidXQgaXMgYWN0dWFsbHkgaW5jb3JyZWN0Lg0KICAgICAgICAgICAgICAgICAqIEEgc2VtaWNvbG9uIGlzIG9ubHkgbmVjZXNzYXJ5IGZvbGxvd2luZyBhIGRlbGNhcmF0aW9uIGlzIHRoZXJlJ3MgYW5vdGhlciBkZWNsYXJhdGlvbg0KICAgICAgICAgICAgICAgICAqIG9yIG1hcmdpbiBhZnRlcndhcmRzLiANCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdHQ7DQogICAgICAgICAgICAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoY2hlY2tTdGFydCl7DQogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuTEJSQUNFKTsgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCg0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB3aGlsZSh0cnVlKXsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZE1hcmdpbnMgJiYgdGhpcy5fbWFyZ2luKCkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbm9vcA0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9kZWNsYXJhdGlvbigpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5TRU1JQ09MT04pKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAvL2lmICgoIXRoaXMuX21hcmdpbigpICYmICF0aGlzLl9kZWNsYXJhdGlvbigpKSB8fCAhdG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLlNFTUlDT0xPTikpew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAvL30NCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuUkJSQUNFKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgU3ludGF4RXJyb3IgJiYgIXRoaXMub3B0aW9ucy5zdHJpY3Qpew0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZmlyZSBlcnJvciBldmVudA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICAgICAiZXJyb3IiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAgICAgIGV4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICAgIGV4Lm1lc3NhZ2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogICAgICAgZXgubGluZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2w6ICAgICAgICBleC5jb2wNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2VlIGlmIHRoZXJlJ3MgYW5vdGhlciBkZWNsYXJhdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgdHQgPSB0b2tlblN0cmVhbS5hZHZhbmNlKFtUb2tlbnMuU0VNSUNPTE9OLCBUb2tlbnMuUkJSQUNFXSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHQgPT0gVG9rZW5zLlNFTUlDT0xPTil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIGEgc2VtaWNvbG9uLCB0aGVuIHRoZXJlIG1pZ2h0IGJlIGFub3RoZXIgZGVjbGFyYXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkRGVjbGFyYXRpb25zKGZhbHNlLCByZWFkTWFyZ2lucyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR0ID09IFRva2Vucy5SQlJBQ0Upew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUncyBhIHJpZ2h0IGJyYWNlLCB0aGUgcnVsZSBpcyBmaW5pc2hlZCBzbyBkb24ndCBkbyBhbnl0aGluZw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL290aGVyd2lzZSwgcmV0aHJvdyB0aGUgZXJyb3IgYmVjYXVzZSBpdCB3YXNuJ3QgaGFuZGxlZCBwcm9wZXJseQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvL25vdCBhIHN5bnRheCBlcnJvciwgcmV0aHJvdyBpdA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9ICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAgICB9LCAgICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAqIEluIHNvbWUgY2FzZXMsIHlvdSBjYW4gZW5kIHVwIHdpdGggdHdvIHdoaXRlIHNwYWNlIHRva2VucyBpbiBhDQogICAgICAgICAgICAgKiByb3cuIEluc3RlYWQgb2YgbWFraW5nIGEgY2hhbmdlIGluIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgbG9va3MgZm9yDQogICAgICAgICAgICAgKiB3aGl0ZSBzcGFjZSwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG1hdGNoIGFzIG11Y2ggd2hpdGUgc3BhY2UNCiAgICAgICAgICAgICAqIGFzIG5lY2Vzc2FyeS4NCiAgICAgICAgICAgICAqIEBtZXRob2QgX3JlYWRXaGl0ZXNwYWNlDQogICAgICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSB3aGl0ZSBzcGFjZSBpZiBmb3VuZCwgZW1wdHkgc3RyaW5nIGlmIG5vdC4NCiAgICAgICAgICAgICAqIEBwcml2YXRlDQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIF9yZWFkV2hpdGVzcGFjZTogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICB3cyA9ICIiOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB3aGlsZSh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuUykpew0KICAgICAgICAgICAgICAgICAgICB3cyArPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByZXR1cm4gd3M7DQogICAgICAgICAgICB9LA0KICAgICAgICAgIA0KDQogICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAqIFRocm93cyBhbiBlcnJvciB3aGVuIGFuIHVuZXhwZWN0ZWQgdG9rZW4gaXMgZm91bmQuDQogICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9rZW4gVGhlIHRva2VuIHRoYXQgd2FzIGZvdW5kLg0KICAgICAgICAgICAgICogQG1ldGhvZCBfdW5leHBlY3RlZFRva2VuDQogICAgICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQ0KICAgICAgICAgICAgICogQHByaXZhdGUNCiAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgX3VuZXhwZWN0ZWRUb2tlbjogZnVuY3Rpb24odG9rZW4pew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiAnIiArIHRva2VuLnZhbHVlICsgIicgYXQgbGluZSAiICsgdG9rZW4uc3RhcnRMaW5lICsgIiwgY29sICIgKyB0b2tlbi5zdGFydENvbCArICIuIiwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAqIEhlbHBlciBtZXRob2QgdXNlZCBmb3IgcGFyc2luZyBzdWJwYXJ0cyBvZiBhIHN0eWxlIHNoZWV0Lg0KICAgICAgICAgICAgICogQHJldHVybiB7dm9pZH0NCiAgICAgICAgICAgICAqIEBtZXRob2QgX3ZlcmlmeUVuZA0KICAgICAgICAgICAgICogQHByaXZhdGUNCiAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgX3ZlcmlmeUVuZDogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdG9rZW5TdHJlYW0uTEEoMSkgIT0gVG9rZW5zLkVPRil7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuZXhwZWN0ZWRUb2tlbih0aGlzLl90b2tlblN0cmVhbS5MVCgxKSk7DQogICAgICAgICAgICAgICAgfSAgICAgICAgICAgIA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICAgICAgLy8gUGFyc2luZyBtZXRob2RzDQogICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgICAgICANCiAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbihpbnB1dCl7ICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuU3RyZWFtID0gbmV3IFRva2VuU3RyZWFtKGlucHV0LCBUb2tlbnMpOw0KICAgICAgICAgICAgICAgIHRoaXMuX3N0eWxlc2hlZXQoKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIHBhcnNlU3R5bGVTaGVldDogZnVuY3Rpb24oaW5wdXQpew0KICAgICAgICAgICAgICAgIC8vanVzdCBwYXNzdGhyb3VnaA0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlKGlucHV0KTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIHBhcnNlTWVkaWFRdWVyeTogZnVuY3Rpb24oaW5wdXQpew0KICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuU3RyZWFtID0gbmV3IFRva2VuU3RyZWFtKGlucHV0LCBUb2tlbnMpOw0KICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9tZWRpYV9xdWVyeSgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUncyBhbnl0aGluZyBtb3JlLCB0aGVuIGl0J3MgYW4gaW52YWxpZCBzZWxlY3Rvcg0KICAgICAgICAgICAgICAgIHRoaXMuX3ZlcmlmeUVuZCgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vb3RoZXJ3aXNlIHJldHVybiByZXN1bHQNCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OyAgICAgICAgICAgIA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgKiBQYXJzZXMgYSBwcm9wZXJ0eSB2YWx1ZSAoZXZlcnl0aGluZyBhZnRlciB0aGUgc2VtaWNvbG9uKS4NCiAgICAgICAgICAgICAqIEByZXR1cm4ge3BhcnNlcmxpYi5jc3MuUHJvcGVydHlWYWx1ZX0gVGhlIHByb3BlcnR5IHZhbHVlLg0KICAgICAgICAgICAgICogQHRocm93cyBwYXJzZXJsaWIudXRpbC5TeW50YXhFcnJvciBJZiBhbiB1bmV4cGVjdGVkIHRva2VuIGlzIGZvdW5kLg0KICAgICAgICAgICAgICogQG1ldGhvZCBwYXJzZXJQcm9wZXJ0eVZhbHVlDQogICAgICAgICAgICAgKi8gICAgICAgICAgICAgDQogICAgICAgICAgICBwYXJzZVByb3BlcnR5VmFsdWU6IGZ1bmN0aW9uKGlucHV0KXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuU3RyZWFtID0gbmV3IFRva2VuU3RyZWFtKGlucHV0LCBUb2tlbnMpOw0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2V4cHIoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL29rYXkgdG8gaGF2ZSBhIHRyYWlsaW5nIHdoaXRlIHNwYWNlDQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL2lmIHRoZXJlJ3MgYW55dGhpbmcgbW9yZSwgdGhlbiBpdCdzIGFuIGludmFsaWQgc2VsZWN0b3INCiAgICAgICAgICAgICAgICB0aGlzLl92ZXJpZnlFbmQoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL290aGVyd2lzZSByZXR1cm4gcmVzdWx0DQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICogUGFyc2VzIGEgY29tcGxldGUgQ1NTIHJ1bGUsIGluY2x1ZGluZyBzZWxlY3RvcnMgYW5kDQogICAgICAgICAgICAgKiBwcm9wZXJ0aWVzLg0KICAgICAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSB0ZXh0IHRvIHBhcnNlci4NCiAgICAgICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhlIHBhcnNlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIGZhbHNlIGlmIG5vdC4NCiAgICAgICAgICAgICAqIEBtZXRob2QgcGFyc2VSdWxlDQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIHBhcnNlUnVsZTogZnVuY3Rpb24oaW5wdXQpew0KICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuU3RyZWFtID0gbmV3IFRva2VuU3RyZWFtKGlucHV0LCBUb2tlbnMpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vc2tpcCBhbnkgbGVhZGluZyB3aGl0ZSBzcGFjZQ0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX3J1bGVzZXQoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL3NraXAgYW55IHRyYWlsaW5nIHdoaXRlIHNwYWNlDQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCg0KICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUncyBhbnl0aGluZyBtb3JlLCB0aGVuIGl0J3MgYW4gaW52YWxpZCBzZWxlY3Rvcg0KICAgICAgICAgICAgICAgIHRoaXMuX3ZlcmlmeUVuZCgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vb3RoZXJ3aXNlIHJldHVybiByZXN1bHQNCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OyAgICAgICAgICAgIA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgKiBQYXJzZXMgYSBzaW5nbGUgQ1NTIHNlbGVjdG9yIChubyBjb21tYSkNCiAgICAgICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgdGV4dCB0byBwYXJzZSBhcyBhIENTUyBzZWxlY3Rvci4NCiAgICAgICAgICAgICAqIEByZXR1cm4ge1NlbGVjdG9yfSBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZWxlY3Rvci4NCiAgICAgICAgICAgICAqIEB0aHJvd3MgcGFyc2VybGliLnV0aWwuU3ludGF4RXJyb3IgSWYgYW4gdW5leHBlY3RlZCB0b2tlbiBpcyBmb3VuZC4NCiAgICAgICAgICAgICAqIEBtZXRob2QgcGFyc2VTZWxlY3Rvcg0KICAgICAgICAgICAgICovDQogICAgICAgICAgICBwYXJzZVNlbGVjdG9yOiBmdW5jdGlvbihpbnB1dCl7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLl90b2tlblN0cmVhbSA9IG5ldyBUb2tlblN0cmVhbShpbnB1dCwgVG9rZW5zKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL3NraXAgYW55IGxlYWRpbmcgd2hpdGUgc3BhY2UNCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9zZWxlY3RvcigpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vc2tpcCBhbnkgdHJhaWxpbmcgd2hpdGUgc3BhY2UNCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KDQogICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIGFueXRoaW5nIG1vcmUsIHRoZW4gaXQncyBhbiBpbnZhbGlkIHNlbGVjdG9yDQogICAgICAgICAgICAgICAgdGhpcy5fdmVyaWZ5RW5kKCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9vdGhlcndpc2UgcmV0dXJuIHJlc3VsdA0KICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgfTsNCiAgICAgICAgDQogICAgLy9jb3B5IG92ZXIgb250byBwcm90b3R5cGUNCiAgICBmb3IgKHByb3AgaW4gYWRkaXRpb25zKXsNCiAgICAgICAgcHJvdG9bcHJvcF0gPSBhZGRpdGlvbnNbcHJvcF07DQogICAgfSAgIA0KICAgIA0KICAgIHJldHVybiBwcm90bzsNCn0oKTsNCg0KDQovKg0KbnRoDQogIDogUyogWyBbJy0nfCcrJ10/IElOVEVHRVI/IHtOfSBbIFMqIFsnLSd8JysnXSBTKiBJTlRFR0VSIF0/IHwNCiAgICAgICAgIFsnLSd8JysnXT8gSU5URUdFUiB8IHtPfXtEfXtEfSB8IHtFfXtWfXtFfXtOfSBdIFMqDQogIDsNCiovDQovKioNCiAqIFJlcHJlc2VudHMgYSBzZWxlY3RvciBjb21iaW5hdG9yICh3aGl0ZXNwYWNlLCArLCA+KS4NCiAqIEBuYW1lc3BhY2UgcGFyc2VybGliLmNzcw0KICogQGNsYXNzIFByb3BlcnR5TmFtZQ0KICogQGV4dGVuZHMgcGFyc2VybGliLnV0aWwuU3ludGF4VW5pdA0KICogQGNvbnN0cnVjdG9yDQogKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5pdC4gDQogKiBAcGFyYW0ge1N0cmluZ30gaGFjayBUaGUgdHlwZSBvZiBJRSBoYWNrIGFwcGxpZWQgKCIqIiwgIl8iLCBvciBudWxsKS4NCiAqIEBwYXJhbSB7aW50fSBsaW5lIFRoZSBsaW5lIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4NCiAqIEBwYXJhbSB7aW50fSBjb2wgVGhlIGNvbHVtbiBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuDQogKi8NCmZ1bmN0aW9uIFByb3BlcnR5TmFtZSh0ZXh0LCBoYWNrLCBsaW5lLCBjb2wpew0KICAgIA0KICAgIFN5bnRheFVuaXQuY2FsbCh0aGlzLCAoaGFja3x8IiIpICsgdGV4dCwgbGluZSwgY29sKTsNCg0KICAgIC8qKg0KICAgICAqIFRoZSB0eXBlIG9mIElFIGhhY2sgYXBwbGllZCAoIioiLCAiXyIsIG9yIG51bGwpLg0KICAgICAqIEB0eXBlIFN0cmluZw0KICAgICAqIEBwcm9wZXJ0eSBoYWNrDQogICAgICovDQogICAgdGhpcy5oYWNrID0gaGFjazsNCg0KfQ0KDQpQcm9wZXJ0eU5hbWUucHJvdG90eXBlID0gbmV3IFN5bnRheFVuaXQoKTsNClByb3BlcnR5TmFtZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQcm9wZXJ0eU5hbWU7DQoNCg0KLyoqDQogKiBSZXByZXNlbnRzIGEgc2luZ2xlIHBhcnQgb2YgYSBDU1MgcHJvcGVydHkgdmFsdWUsIG1lYW5pbmcgdGhhdCBpdCByZXByZXNlbnRzDQogKiBqdXN0IGV2ZXJ5dGhpbmcgc2luZ2xlIHBhcnQgYmV0d2VlbiAiOiIgYW5kICI7Ii4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIHZhbHVlcw0KICogc2VwYXJhdGVkIGJ5IGNvbW1hcywgdGhpcyB0eXBlIHJlcHJlc2VudHMganVzdCBvbmUgb2YgdGhlIHZhbHVlcy4NCiAqIEBwYXJhbSB7U3RyaW5nW119IHBhcnRzIEFuIGFycmF5IG9mIHZhbHVlIHBhcnRzIG1ha2luZyB1cCB0aGlzIHZhbHVlLg0KICogQHBhcmFtIHtpbnR9IGxpbmUgVGhlIGxpbmUgb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLg0KICogQHBhcmFtIHtpbnR9IGNvbCBUaGUgY29sdW1uIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4NCiAqIEBuYW1lc3BhY2UgcGFyc2VybGliLmNzcw0KICogQGNsYXNzIFByb3BlcnR5VmFsdWUNCiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLlN5bnRheFVuaXQNCiAqIEBjb25zdHJ1Y3Rvcg0KICovDQpmdW5jdGlvbiBQcm9wZXJ0eVZhbHVlKHBhcnRzLCBsaW5lLCBjb2wpew0KDQogICAgU3ludGF4VW5pdC5jYWxsKHRoaXMsIHBhcnRzLmpvaW4oIiAiKSwgbGluZSwgY29sKTsNCiAgICANCiAgICAvKioNCiAgICAgKiBUaGUgcGFydHMgdGhhdCBtYWtlIHVwIHRoZSBzZWxlY3Rvci4NCiAgICAgKiBAdHlwZSBBcnJheQ0KICAgICAqIEBwcm9wZXJ0eSBwYXJ0cw0KICAgICAqLw0KICAgIHRoaXMucGFydHMgPSBwYXJ0czsNCiAgICANCn0NCg0KUHJvcGVydHlWYWx1ZS5wcm90b3R5cGUgPSBuZXcgU3ludGF4VW5pdCgpOw0KUHJvcGVydHlWYWx1ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQcm9wZXJ0eVZhbHVlOw0KDQoNCi8qKg0KICogUmVwcmVzZW50cyBhIHNpbmdsZSBwYXJ0IG9mIGEgQ1NTIHByb3BlcnR5IHZhbHVlLCBtZWFuaW5nIHRoYXQgaXQgcmVwcmVzZW50cw0KICoganVzdCBvbmUgcGFydCBvZiB0aGUgZGF0YSBiZXR3ZWVuICI6IiBhbmQgIjsiLg0KICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuaXQuDQogKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuDQogKiBAcGFyYW0ge2ludH0gY29sIFRoZSBjb2x1bW4gb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLg0KICogQG5hbWVzcGFjZSBwYXJzZXJsaWIuY3NzDQogKiBAY2xhc3MgUHJvcGVydHlWYWx1ZVBhcnQNCiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLlN5bnRheFVuaXQNCiAqIEBjb25zdHJ1Y3Rvcg0KICovDQpmdW5jdGlvbiBQcm9wZXJ0eVZhbHVlUGFydCh0ZXh0LCBsaW5lLCBjb2wpew0KDQogICAgU3ludGF4VW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7DQogICAgDQogICAgLyoqDQogICAgICogSW5kaWNhdGVzIHRoZSB0eXBlIG9mIHZhbHVlIHVuaXQuDQogICAgICogQHR5cGUgU3RyaW5nDQogICAgICogQHByb3BlcnR5IHR5cGUNCiAgICAgKi8NCiAgICB0aGlzLnR5cGUgPSAidW5rbm93biI7DQoNCiAgICAvL2ZpZ3VyZSBvdXQgd2hhdCB0eXBlIG9mIGRhdGEgaXQgaXMNCiAgICANCiAgICB2YXIgdGVtcDsNCiAgICANCiAgICAvL2l0IGlzIGEgbWVhc3VyZW1lbnQ/DQogICAgaWYgKC9eKFsrXC1dP1tcZFwuXSspKFthLXpdKykkL2kudGVzdCh0ZXh0KSl7ICAvL2RpbWVuc2lvbg0KICAgICAgICB0aGlzLnR5cGUgPSAiZGltZW5zaW9uIjsNCiAgICAgICAgdGhpcy52YWx1ZSA9ICtSZWdFeHAuJDE7DQogICAgICAgIHRoaXMudW5pdHMgPSBSZWdFeHAuJDI7DQogICAgICAgIA0KICAgICAgICAvL3RyeSB0byBuYXJyb3cgZG93bg0KICAgICAgICBzd2l0Y2godGhpcy51bml0cy50b0xvd2VyQ2FzZSgpKXsNCiAgICAgICAgDQogICAgICAgICAgICBjYXNlICJlbSI6DQogICAgICAgICAgICBjYXNlICJyZW0iOg0KICAgICAgICAgICAgY2FzZSAiZXgiOg0KICAgICAgICAgICAgY2FzZSAicHgiOg0KICAgICAgICAgICAgY2FzZSAiY20iOg0KICAgICAgICAgICAgY2FzZSAibW0iOg0KICAgICAgICAgICAgY2FzZSAiaW4iOg0KICAgICAgICAgICAgY2FzZSAicHQiOg0KICAgICAgICAgICAgY2FzZSAicGMiOg0KICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9ICJsZW5ndGgiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgY2FzZSAiZGVnIjoNCiAgICAgICAgICAgIGNhc2UgInJhZCI6DQogICAgICAgICAgICBjYXNlICJncmFkIjoNCiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSAiYW5nbGUiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBjYXNlICJtcyI6DQogICAgICAgICAgICBjYXNlICJzIjoNCiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSAidGltZSI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGNhc2UgImh6IjoNCiAgICAgICAgICAgIGNhc2UgImtoeiI6DQogICAgICAgICAgICAgICAgdGhpcy50eXBlID0gImZyZXF1ZW5jeSI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGNhc2UgImRwaSI6DQogICAgICAgICAgICBjYXNlICJkcGNtIjoNCiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSAicmVzb2x1dGlvbiI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAvL2RlZmF1bHQNCiAgICAgICAgICAgICAgICANCiAgICAgICAgfQ0KICAgICAgICANCiAgICB9IGVsc2UgaWYgKC9eKFsrXC1dP1tcZFwuXSspJSQvaS50ZXN0KHRleHQpKXsgIC8vcGVyY2VudGFnZQ0KICAgICAgICB0aGlzLnR5cGUgPSAicGVyY2VudGFnZSI7DQogICAgICAgIHRoaXMudmFsdWUgPSArUmVnRXhwLiQxOw0KICAgIH0gZWxzZSBpZiAoL14oWytcLV0/W1xkXC5dKyklJC9pLnRlc3QodGV4dCkpeyAgLy9wZXJjZW50YWdlDQogICAgICAgIHRoaXMudHlwZSA9ICJwZXJjZW50YWdlIjsNCiAgICAgICAgdGhpcy52YWx1ZSA9ICtSZWdFeHAuJDE7DQogICAgfSBlbHNlIGlmICgvXihbK1wtXT9cZCspJC9pLnRlc3QodGV4dCkpeyAgLy9pbnRlZ2VyDQogICAgICAgIHRoaXMudHlwZSA9ICJpbnRlZ2VyIjsNCiAgICAgICAgdGhpcy52YWx1ZSA9ICtSZWdFeHAuJDE7DQogICAgfSBlbHNlIGlmICgvXihbK1wtXT9bXGRcLl0rKSQvaS50ZXN0KHRleHQpKXsgIC8vbnVtYmVyDQogICAgICAgIHRoaXMudHlwZSA9ICJudW1iZXIiOw0KICAgICAgICB0aGlzLnZhbHVlID0gK1JlZ0V4cC4kMTsNCiAgICANCiAgICB9IGVsc2UgaWYgKC9eIyhbYS1mMC05XXszLDZ9KS9pLnRlc3QodGV4dCkpeyAgLy9oZXhjb2xvcg0KICAgICAgICB0aGlzLnR5cGUgPSAiY29sb3IiOw0KICAgICAgICB0ZW1wID0gUmVnRXhwLiQxOw0KICAgICAgICBpZiAodGVtcC5sZW5ndGggPT0gMyl7DQogICAgICAgICAgICB0aGlzLnJlZCAgICA9IHBhcnNlSW50KHRlbXAuY2hhckF0KDApK3RlbXAuY2hhckF0KDApLDE2KTsNCiAgICAgICAgICAgIHRoaXMuZ3JlZW4gID0gcGFyc2VJbnQodGVtcC5jaGFyQXQoMSkrdGVtcC5jaGFyQXQoMSksMTYpOw0KICAgICAgICAgICAgdGhpcy5ibHVlICAgPSBwYXJzZUludCh0ZW1wLmNoYXJBdCgyKSt0ZW1wLmNoYXJBdCgyKSwxNik7ICAgICAgICAgICAgDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLnJlZCAgICA9IHBhcnNlSW50KHRlbXAuc3Vic3RyaW5nKDAsMiksMTYpOw0KICAgICAgICAgICAgdGhpcy5ncmVlbiAgPSBwYXJzZUludCh0ZW1wLnN1YnN0cmluZygyLDQpLDE2KTsNCiAgICAgICAgICAgIHRoaXMuYmx1ZSAgID0gcGFyc2VJbnQodGVtcC5zdWJzdHJpbmcoNCw2KSwxNik7ICAgICAgICAgICAgDQogICAgICAgIH0NCiAgICB9IGVsc2UgaWYgKC9ecmdiXChccyooXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKlwpL2kudGVzdCh0ZXh0KSl7IC8vcmdiKCkgY29sb3Igd2l0aCBhYnNvbHV0ZSBudW1iZXJzDQogICAgICAgIHRoaXMudHlwZSAgID0gImNvbG9yIjsNCiAgICAgICAgdGhpcy5yZWQgICAgPSArUmVnRXhwLiQxOw0KICAgICAgICB0aGlzLmdyZWVuICA9ICtSZWdFeHAuJDI7DQogICAgICAgIHRoaXMuYmx1ZSAgID0gK1JlZ0V4cC4kMzsNCiAgICB9IGVsc2UgaWYgKC9ecmdiXChccyooXGQrKSVccyosXHMqKFxkKyklXHMqLFxzKihcZCspJVxzKlwpL2kudGVzdCh0ZXh0KSl7IC8vcmdiKCkgY29sb3Igd2l0aCBwZXJjZW50YWdlcw0KICAgICAgICB0aGlzLnR5cGUgICA9ICJjb2xvciI7DQogICAgICAgIHRoaXMucmVkICAgID0gK1JlZ0V4cC4kMSAqIDI1NSAvIDEwMDsNCiAgICAgICAgdGhpcy5ncmVlbiAgPSArUmVnRXhwLiQyICogMjU1IC8gMTAwOw0KICAgICAgICB0aGlzLmJsdWUgICA9ICtSZWdFeHAuJDMgKiAyNTUgLyAxMDA7DQogICAgfSBlbHNlIGlmICgvXnVybFwoWyInXT8oW15cKSInXSspWyInXT9cKS9pLnRlc3QodGV4dCkpeyAvL1VSSQ0KICAgICAgICB0aGlzLnR5cGUgICA9ICJ1cmkiOw0KICAgICAgICB0aGlzLnVyaSAgICA9IFJlZ0V4cC4kMTsNCiAgICB9IGVsc2UgaWYgKC9eWyInXVteIiddKlsiJ10vLnRlc3QodGV4dCkpeyAgICAvL3N0cmluZw0KICAgICAgICB0aGlzLnR5cGUgICA9ICJzdHJpbmciOw0KICAgICAgICB0aGlzLnZhbHVlICA9IGV2YWwodGV4dCk7DQogICAgfSBlbHNlIGlmIChDb2xvcnNbdGV4dC50b0xvd2VyQ2FzZSgpXSl7ICAvL25hbWVkIGNvbG9yDQogICAgICAgIHRoaXMudHlwZSAgID0gImNvbG9yIjsNCiAgICAgICAgdGVtcCAgICAgICAgPSBDb2xvcnNbdGV4dC50b0xvd2VyQ2FzZSgpXS5zdWJzdHJpbmcoMSk7DQogICAgICAgIHRoaXMucmVkICAgID0gcGFyc2VJbnQodGVtcC5zdWJzdHJpbmcoMCwyKSwxNik7DQogICAgICAgIHRoaXMuZ3JlZW4gID0gcGFyc2VJbnQodGVtcC5zdWJzdHJpbmcoMiw0KSwxNik7DQogICAgICAgIHRoaXMuYmx1ZSAgID0gcGFyc2VJbnQodGVtcC5zdWJzdHJpbmcoNCw2KSwxNik7ICAgICAgICAgDQogICAgfSBlbHNlIGlmICgvXltcLFwvXSQvLnRlc3QodGV4dCkpew0KICAgICAgICB0aGlzLnR5cGUgICA9ICJvcGVyYXRvciI7DQogICAgICAgIHRoaXMudmFsdWUgID0gdGV4dDsNCiAgICB9IGVsc2UgaWYgKC9eW2EtelwtXHUwMDgwLVx1RkZGRl1bYS16MC05XC1cdTAwODAtXHVGRkZGXSokL2kudGVzdCh0ZXh0KSl7DQogICAgICAgIHRoaXMudHlwZSAgID0gImlkZW50aWZpZXIiOw0KICAgICAgICB0aGlzLnZhbHVlICA9IHRleHQ7DQogICAgfQ0KDQp9DQoNClByb3BlcnR5VmFsdWVQYXJ0LnByb3RvdHlwZSA9IG5ldyBTeW50YXhVbml0KCk7DQpQcm9wZXJ0eVZhbHVlUGFydC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQcm9wZXJ0eVZhbHVlOw0KDQovKioNCiAqIENyZWF0ZSBhIG5ldyBzeW50YXggdW5pdCBiYXNlZCBzb2xlbHkgb24gdGhlIGdpdmVuIHRva2VuLg0KICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBhIG5ldyBzeW50YXggdW5pdCB3aGVuDQogKiBpdCByZXByZXNlbnRzIGEgc2luZ2xlIHRva2VuIGluc3RlYWQgb2YgbXVsdGlwbGUuDQogKiBAcGFyYW0ge09iamVjdH0gdG9rZW4gVGhlIHRva2VuIG9iamVjdCB0byByZXByZXNlbnQuDQogKiBAcmV0dXJuIHtwYXJzZXJsaWIuY3NzLlByb3BlcnR5VmFsdWVQYXJ0fSBUaGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgdG9rZW4uDQogKiBAc3RhdGljDQogKiBAbWV0aG9kIGZyb21Ub2tlbg0KICovDQpQcm9wZXJ0eVZhbHVlUGFydC5mcm9tVG9rZW4gPSBmdW5jdGlvbih0b2tlbil7DQogICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVZhbHVlUGFydCh0b2tlbi52YWx1ZSwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7DQp9Ow0KLyoqDQogKiBSZXByZXNlbnRzIGFuIGVudGlyZSBzaW5nbGUgc2VsZWN0b3IsIGluY2x1ZGluZyBhbGwgcGFydHMgYnV0IG5vdA0KICogaW5jbHVkaW5nIG11bHRpcGxlIHNlbGVjdG9ycyAodGhvc2Ugc2VwYXJhdGVkIGJ5IGNvbW1hcykuDQogKiBAbmFtZXNwYWNlIHBhcnNlcmxpYi5jc3MNCiAqIEBjbGFzcyBTZWxlY3Rvcg0KICogQGV4dGVuZHMgcGFyc2VybGliLnV0aWwuU3ludGF4VW5pdA0KICogQGNvbnN0cnVjdG9yDQogKiBAcGFyYW0ge0FycmF5fSBwYXJ0cyBBcnJheSBvZiBzZWxlY3RvcnMgcGFydHMgbWFraW5nIHVwIHRoaXMgc2VsZWN0b3IuDQogKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuDQogKiBAcGFyYW0ge2ludH0gY29sIFRoZSBjb2x1bW4gb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLg0KICovDQpmdW5jdGlvbiBTZWxlY3RvcihwYXJ0cywgbGluZSwgY29sKXsNCiAgICANCiAgICBTeW50YXhVbml0LmNhbGwodGhpcywgcGFydHMuam9pbigiICIpLCBsaW5lLCBjb2wpOw0KICAgIA0KICAgIC8qKg0KICAgICAqIFRoZSBwYXJ0cyB0aGF0IG1ha2UgdXAgdGhlIHNlbGVjdG9yLg0KICAgICAqIEB0eXBlIEFycmF5DQogICAgICogQHByb3BlcnR5IHBhcnRzDQogICAgICovDQogICAgdGhpcy5wYXJ0cyA9IHBhcnRzOw0KDQp9DQoNClNlbGVjdG9yLnByb3RvdHlwZSA9IG5ldyBTeW50YXhVbml0KCk7DQpTZWxlY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTZWxlY3RvcjsNCg0KDQovKioNCiAqIFJlcHJlc2VudHMgYSBzaW5nbGUgcGFydCBvZiBhIHNlbGVjdG9yIHN0cmluZywgbWVhbmluZyBhIHNpbmdsZSBzZXQgb2YNCiAqIGVsZW1lbnQgbmFtZSBhbmQgbW9kaWZpZXJzLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgY29tYmluYXRvcnMgc3VjaCBhcw0KICogc3BhY2VzLCArLCA+LCBldGMuDQogKiBAbmFtZXNwYWNlIHBhcnNlcmxpYi5jc3MNCiAqIEBjbGFzcyBTZWxlY3RvclBhcnQNCiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLlN5bnRheFVuaXQNCiAqIEBjb25zdHJ1Y3Rvcg0KICogQHBhcmFtIHtTdHJpbmd9IGVsZW1lbnROYW1lIFRoZSBlbGVtZW50IG5hbWUgaW4gdGhlIHNlbGVjdG9yIG9yIG51bGwNCiAqICAgICAgaWYgdGhlcmUgaXMgbm8gZWxlbWVudCBuYW1lLg0KICogQHBhcmFtIHtBcnJheX0gbW9kaWZpZXJzIEFycmF5IG9mIGluZGl2aWR1YWwgbW9kaWZpZXJzIGZvciB0aGUgZWxlbWVudC4NCiAqICAgICAgTWF5IGJlIGVtcHR5IGlmIHRoZXJlIGFyZSBub25lLg0KICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuaXQuIA0KICogQHBhcmFtIHtpbnR9IGxpbmUgVGhlIGxpbmUgb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLg0KICogQHBhcmFtIHtpbnR9IGNvbCBUaGUgY29sdW1uIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4NCiAqLw0KZnVuY3Rpb24gU2VsZWN0b3JQYXJ0KGVsZW1lbnROYW1lLCBtb2RpZmllcnMsIHRleHQsIGxpbmUsIGNvbCl7DQogICAgDQogICAgU3ludGF4VW5pdC5jYWxsKHRoaXMsIHRleHQsIGxpbmUsIGNvbCk7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgdGFnIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhpcyBwYXJ0DQogICAgICogb2YgdGhlIHNlbGVjdG9yIGFmZmVjdHMuDQogICAgICogQHR5cGUgU3RyaW5nDQogICAgICogQHByb3BlcnR5IGVsZW1lbnROYW1lDQogICAgICovDQogICAgdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOw0KICAgIA0KICAgIC8qKg0KICAgICAqIFRoZSBwYXJ0cyB0aGF0IGNvbWUgYWZ0ZXIgdGhlIGVsZW1lbnQgbmFtZSwgc3VjaCBhcyBjbGFzcyBuYW1lcywgSURzLA0KICAgICAqIHBzZXVkbyBjbGFzc2VzL2VsZW1lbnRzLCBldGMuDQogICAgICogQHR5cGUgQXJyYXkNCiAgICAgKiBAcHJvcGVydHkgbW9kaWZpZXJzDQogICAgICovDQogICAgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7DQoNCn0NCg0KU2VsZWN0b3JQYXJ0LnByb3RvdHlwZSA9IG5ldyBTeW50YXhVbml0KCk7DQpTZWxlY3RvclBhcnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2VsZWN0b3JQYXJ0Ow0KDQoNCi8qKg0KICogUmVwcmVzZW50cyBhIHNlbGVjdG9yIG1vZGlmaWVyIHN0cmluZywgbWVhbmluZyBhIGNsYXNzIG5hbWUsIGVsZW1lbnQgbmFtZSwNCiAqIGVsZW1lbnQgSUQsIHBzZXVkbyBydWxlLCBldGMuDQogKiBAbmFtZXNwYWNlIHBhcnNlcmxpYi5jc3MNCiAqIEBjbGFzcyBTZWxlY3RvclN1YlBhcnQNCiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLlN5bnRheFVuaXQNCiAqIEBjb25zdHJ1Y3Rvcg0KICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuaXQuIA0KICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2Ygc2VsZWN0b3IgbW9kaWZpZXIuDQogKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuDQogKiBAcGFyYW0ge2ludH0gY29sIFRoZSBjb2x1bW4gb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLg0KICovDQpmdW5jdGlvbiBTZWxlY3RvclN1YlBhcnQodGV4dCwgdHlwZSwgbGluZSwgY29sKXsNCiAgICANCiAgICBTeW50YXhVbml0LmNhbGwodGhpcywgdGV4dCwgbGluZSwgY29sKTsNCg0KICAgIC8qKg0KICAgICAqIFRoZSB0eXBlIG9mIG1vZGlmaWVyLg0KICAgICAqIEB0eXBlIFN0cmluZw0KICAgICAqIEBwcm9wZXJ0eSB0eXBlDQogICAgICovDQogICAgdGhpcy50eXBlID0gdHlwZTsNCiAgICANCiAgICAvKioNCiAgICAgKiBTb21lIHN1YnBhcnRzIGhhdmUgYXJndW1lbnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlbS4NCiAgICAgKiBAdHlwZSBBcnJheQ0KICAgICAqIEBwcm9wZXJ0eSBhcmdzDQogICAgICovDQogICAgdGhpcy5hcmdzID0gW107DQoNCn0NCg0KU2VsZWN0b3JTdWJQYXJ0LnByb3RvdHlwZSA9IG5ldyBTeW50YXhVbml0KCk7DQpTZWxlY3RvclN1YlBhcnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2VsZWN0b3JTdWJQYXJ0Ow0KDQoNCg0KDQp2YXIgaCA9IC9eWzAtOWEtZkEtRl0kLywNCiAgICBub25hc2NpaSA9IC9eW1x1MDA4MC1cdUZGRkZdJC8sDQogICAgbmwgPSAvXG58XHJcbnxccnxcZi87DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIEhlbHBlciBmdW5jdGlvbnMNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQpmdW5jdGlvbiBpc0hleERpZ2l0KGMpew0KICAgIHJldHVybiBjICE9IG51bGwgJiYgaC50ZXN0KGMpOw0KfQ0KDQpmdW5jdGlvbiBpc0RpZ2l0KGMpew0KICAgIHJldHVybiBjICE9IG51bGwgJiYgL1xkLy50ZXN0KGMpOw0KfQ0KDQpmdW5jdGlvbiBpc1doaXRlc3BhY2UoYyl7DQogICAgcmV0dXJuIGMgIT0gbnVsbCAmJiAvXHMvLnRlc3QoYyk7DQp9DQoNCmZ1bmN0aW9uIGlzTmV3TGluZShjKXsNCiAgICByZXR1cm4gYyAhPSBudWxsICYmIG5sLnRlc3QoYyk7DQp9DQoNCmZ1bmN0aW9uIGlzTmFtZVN0YXJ0KGMpew0KICAgIHJldHVybiBjICE9IG51bGwgJiYgKC9bYS16X1x1MDA4MC1cdUZGRkZcXF0vaS50ZXN0KGMpKTsNCn0NCg0KZnVuY3Rpb24gaXNOYW1lQ2hhcihjKXsNCiAgICByZXR1cm4gYyAhPSBudWxsICYmIChpc05hbWVTdGFydChjKSB8fCAvWzAtOVwtXFxdLy50ZXN0KGMpKTsNCn0NCg0KZnVuY3Rpb24gaXNJZGVudFN0YXJ0KGMpew0KICAgIHJldHVybiBjICE9IG51bGwgJiYgKGlzTmFtZVN0YXJ0KGMpIHx8IC9cLVxcLy50ZXN0KGMpKTsNCn0NCg0KZnVuY3Rpb24gbWl4KHJlY2VpdmVyLCBzdXBwbGllcil7DQoJZm9yICh2YXIgcHJvcCBpbiBzdXBwbGllcil7DQoJCWlmIChzdXBwbGllci5oYXNPd25Qcm9wZXJ0eShwcm9wKSl7DQoJCQlyZWNlaXZlcltwcm9wXSA9IHN1cHBsaWVyW3Byb3BdOw0KCQl9DQoJfQ0KCXJldHVybiByZWNlaXZlcjsNCn0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gQ1NTIFRva2VuIFN0cmVhbQ0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCi8qKg0KICogQSB0b2tlbiBzdHJlYW0gdGhhdCBwcm9kdWNlcyBDU1MgdG9rZW5zLg0KICogQHBhcmFtIHtTdHJpbmd8UmVhZGVyfSBpbnB1dCBUaGUgc291cmNlIG9mIHRleHQgdG8gdG9rZW5pemUuDQogKiBAY29uc3RydWN0b3INCiAqIEBjbGFzcyBUb2tlblN0cmVhbQ0KICogQG5hbWVzcGFjZSBwYXJzZXJsaWIuY3NzDQogKi8NCmZ1bmN0aW9uIFRva2VuU3RyZWFtKGlucHV0KXsNCglUb2tlblN0cmVhbUJhc2UuY2FsbCh0aGlzLCBpbnB1dCwgVG9rZW5zKTsNCn0NCg0KVG9rZW5TdHJlYW0ucHJvdG90eXBlID0gbWl4KG5ldyBUb2tlblN0cmVhbUJhc2UoKSwgew0KDQogICAgLyoqDQogICAgICogT3ZlcnJpZGVzIHRoZSBUb2tlblN0cmVhbUJhc2UgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUNCiAgICAgKiB0byBwcm9kdWNlIENTUyB0b2tlbnMuDQogICAgICogQHBhcmFtIHt2YXJpYW50fSBjaGFubmVsIFRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIHRvIHVzZQ0KICAgICAqICAgICAgZm9yIHRoZSBuZXh0IHRva2VuLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBuZXh0IHRva2VuLg0KICAgICAqIEBtZXRob2QgX2dldFRva2VuDQogICAgICogQHByaXZhdGUNCiAgICAgKi8NCiAgICBfZ2V0VG9rZW46IGZ1bmN0aW9uKGNoYW5uZWwpew0KDQogICAgICAgIHZhciBjLA0KICAgICAgICAgICAgcmVhZGVyID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgdG9rZW4gICA9IG51bGwsDQogICAgICAgICAgICBzdGFydExpbmUgICA9IHJlYWRlci5nZXRMaW5lKCksDQogICAgICAgICAgICBzdGFydENvbCAgICA9IHJlYWRlci5nZXRDb2woKTsNCg0KICAgICAgICBjID0gcmVhZGVyLnJlYWQoKTsNCg0KDQogICAgICAgIHdoaWxlKGMpew0KICAgICAgICAgICAgc3dpdGNoKGMpew0KDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOg0KICAgICAgICAgICAgICAgICAqIC0gQ09NTUVOVA0KICAgICAgICAgICAgICAgICAqIC0gU0xBU0gNCiAgICAgICAgICAgICAgICAgKiAtIENIQVINCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICBjYXNlICIvIjoNCg0KICAgICAgICAgICAgICAgICAgICBpZihyZWFkZXIucGVlaygpID09ICIqIil7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuY29tbWVudFRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmNoYXJUb2tlbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogUG90ZW50aWFsIHRva2VuczoNCiAgICAgICAgICAgICAgICAgKiAtIERBU0hNQVRDSA0KICAgICAgICAgICAgICAgICAqIC0gSU5DTFVERVMNCiAgICAgICAgICAgICAgICAgKiAtIFBSRUZJWE1BVENIDQogICAgICAgICAgICAgICAgICogLSBTVUZGSVhNQVRDSA0KICAgICAgICAgICAgICAgICAqIC0gU1VCU1RSSU5HTUFUQ0gNCiAgICAgICAgICAgICAgICAgKiAtIENIQVINCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICBjYXNlICJ8IjoNCiAgICAgICAgICAgICAgICBjYXNlICJ+IjoNCiAgICAgICAgICAgICAgICBjYXNlICJeIjoNCiAgICAgICAgICAgICAgICBjYXNlICIkIjoNCiAgICAgICAgICAgICAgICBjYXNlICIqIjoNCiAgICAgICAgICAgICAgICAgICAgaWYocmVhZGVyLnBlZWsoKSA9PSAiPSIpew0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmNvbXBhcmlzb25Ub2tlbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5jaGFyVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIFBvdGVudGlhbCB0b2tlbnM6DQogICAgICAgICAgICAgICAgICogLSBTVFJJTkcNCiAgICAgICAgICAgICAgICAgKiAtIElOVkFMSUQNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICBjYXNlICJcIiI6DQogICAgICAgICAgICAgICAgY2FzZSAiJyI6DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5zdHJpbmdUb2tlbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIFBvdGVudGlhbCB0b2tlbnM6DQogICAgICAgICAgICAgICAgICogLSBIQVNIDQogICAgICAgICAgICAgICAgICogLSBDSEFSDQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgY2FzZSAiIyI6DQogICAgICAgICAgICAgICAgICAgIGlmIChpc05hbWVDaGFyKHJlYWRlci5wZWVrKCkpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5oYXNoVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuY2hhclRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOg0KICAgICAgICAgICAgICAgICAqIC0gRE9UDQogICAgICAgICAgICAgICAgICogLSBOVU1CRVINCiAgICAgICAgICAgICAgICAgKiAtIERJTUVOU0lPTg0KICAgICAgICAgICAgICAgICAqIC0gUEVSQ0VOVEFHRQ0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgIGNhc2UgIi4iOg0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNEaWdpdChyZWFkZXIucGVlaygpKSl7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubnVtYmVyVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuY2hhclRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOg0KICAgICAgICAgICAgICAgICAqIC0gQ0RDDQogICAgICAgICAgICAgICAgICogLSBNSU5VUw0KICAgICAgICAgICAgICAgICAqIC0gTlVNQkVSDQogICAgICAgICAgICAgICAgICogLSBESU1FTlNJT04NCiAgICAgICAgICAgICAgICAgKiAtIFBFUkNFTlRBR0UNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICBjYXNlICItIjoNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5wZWVrKCkgPT0gIi0iKXsgIC8vY291bGQgYmUgY2xvc2luZyBIVE1MLXN0eWxlIGNvbW1lbnQNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5odG1sQ29tbWVudEVuZFRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTmFtZVN0YXJ0KHJlYWRlci5wZWVrKCkpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5pZGVudE9yRnVuY3Rpb25Ub2tlbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5jaGFyVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIFBvdGVudGlhbCB0b2tlbnM6DQogICAgICAgICAgICAgICAgICogLSBJTVBPUlRBTlRfU1lNDQogICAgICAgICAgICAgICAgICogLSBDSEFSDQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgY2FzZSAiISI6DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5pbXBvcnRhbnRUb2tlbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIEFueSBhdC1rZXl3b3JkIG9yIENIQVINCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICBjYXNlICJAIjoNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmF0UnVsZVRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogUG90ZW50aWFsIHRva2VuczoNCiAgICAgICAgICAgICAgICAgKiAtIE5PVA0KICAgICAgICAgICAgICAgICAqIC0gQ0hBUg0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgIGNhc2UgIjoiOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubm90VG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOg0KICAgICAgICAgICAgICAgICAqIC0gQ0RPDQogICAgICAgICAgICAgICAgICogLSBDSEFSDQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgY2FzZSAiPCI6DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5odG1sQ29tbWVudFN0YXJ0VG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOg0KICAgICAgICAgICAgICAgICAqIC0gVU5JQ09ERV9SQU5HRQ0KICAgICAgICAgICAgICAgICAqIC0gVVJMDQogICAgICAgICAgICAgICAgICogLSBDSEFSDQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgY2FzZSAiVSI6DQogICAgICAgICAgICAgICAgY2FzZSAidSI6DQogICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIucGVlaygpID09ICIrIil7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMudW5pY29kZVJhbmdlVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAvKmZhbGxzIHRocm91Z2gqLw0KDQogICAgICAgICAgICAgICAgZGVmYXVsdDoNCg0KICAgICAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOg0KICAgICAgICAgICAgICAgICAgICAgKiAtIE5VTUJFUg0KICAgICAgICAgICAgICAgICAgICAgKiAtIERJTUVOU0lPTg0KICAgICAgICAgICAgICAgICAgICAgKiAtIExFTkdUSA0KICAgICAgICAgICAgICAgICAgICAgKiAtIEZSRVENCiAgICAgICAgICAgICAgICAgICAgICogLSBUSU1FDQogICAgICAgICAgICAgICAgICAgICAqIC0gRU1TDQogICAgICAgICAgICAgICAgICAgICAqIC0gRVhTDQogICAgICAgICAgICAgICAgICAgICAqIC0gQU5HTEUNCiAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgICAgIGlmIChpc0RpZ2l0KGMpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5udW1iZXJUb2tlbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQoNCiAgICAgICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgICAgICogUG90ZW50aWFsIHRva2VuczoNCiAgICAgICAgICAgICAgICAgICAgICogLSBTDQogICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGMpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy53aGl0ZXNwYWNlVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZQ0KDQogICAgICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICAgICAqIFBvdGVudGlhbCB0b2tlbnM6DQogICAgICAgICAgICAgICAgICAgICAqIC0gSURFTlQNCiAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgICAgIGlmIChpc0lkZW50U3RhcnQoYykpew0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmlkZW50T3JGdW5jdGlvblRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UNCg0KICAgICAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOg0KICAgICAgICAgICAgICAgICAgICAgKiAtIENIQVINCiAgICAgICAgICAgICAgICAgICAgICogLSBQTFVTDQogICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuY2hhclRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCg0KDQoNCg0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vbWFrZSBzdXJlIHRoaXMgdG9rZW4gaXMgd2FudGVkDQogICAgICAgICAgICAvL1RPRE86IGNoZWNrIGNoYW5uZWwNCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjID0gcmVhZGVyLnJlYWQoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghdG9rZW4gJiYgYyA9PSBudWxsKXsNCiAgICAgICAgICAgIHRva2VuID0gdGhpcy5jcmVhdGVUb2tlbihUb2tlbnMuRU9GLG51bGwsc3RhcnRMaW5lLHN0YXJ0Q29sKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB0b2tlbjsNCiAgICB9LA0KDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gTWV0aG9kcyB0byBjcmVhdGUgdG9rZW5zDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAvKioNCiAgICAgKiBQcm9kdWNlcyBhIHRva2VuIGJhc2VkIG9uIGF2YWlsYWJsZSBkYXRhIGFuZCB0aGUgY3VycmVudA0KICAgICAqIHJlYWRlciBwb3NpdGlvbiBpbmZvcm1hdGlvbi4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IG90aGVyDQogICAgICogcHJpdmF0ZSBtZXRob2RzIHRvIGNyZWF0ZSB0b2tlbnMgYW5kIGlzIG5ldmVyIGNhbGxlZCBkaXJlY3RseS4NCiAgICAgKiBAcGFyYW0ge2ludH0gdHQgVGhlIHRva2VuIHR5cGUuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIFRoZSB0ZXh0IHZhbHVlIG9mIHRoZSB0b2tlbi4NCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRMaW5lIFRoZSBiZWdpbm5pbmcgbGluZSBmb3IgdGhlIGNoYXJhY3Rlci4NCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRDb2wgVGhlIGJlZ2lubmluZyBjb2x1bW4gZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgKE9wdGlvbmFsKSBTcGVjaWZpZXMgYSBjaGFubmVsIHByb3BlcnR5DQogICAgICogICAgICB0byBpbmRpY2F0ZSB0aGF0IGEgZGlmZmVyZW50IGNoYW5uZWwgc2hvdWxkIGJlIHNjYW5uZWQNCiAgICAgKiAgICAgIGFuZC9vciBhIGhpZGUgcHJvcGVydHkgaW5kaWNhdGluZyB0aGF0IHRoZSB0b2tlbiBzaG91bGQNCiAgICAgKiAgICAgIGJlIGhpZGRlbi4NCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0Lg0KICAgICAqIEBtZXRob2QgY3JlYXRlVG9rZW4NCiAgICAgKi8NCiAgICBjcmVhdGVUb2tlbjogZnVuY3Rpb24odHQsIHZhbHVlLCBzdGFydExpbmUsIHN0YXJ0Q29sLCBvcHRpb25zKXsNCiAgICAgICAgdmFyIHJlYWRlciA9IHRoaXMuX3JlYWRlcjsNCiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHZhbHVlOiAgICAgIHZhbHVlLA0KICAgICAgICAgICAgdHlwZTogICAgICAgdHQsDQogICAgICAgICAgICBjaGFubmVsOiAgICBvcHRpb25zLmNoYW5uZWwsDQogICAgICAgICAgICBoaWRlOiAgICAgICBvcHRpb25zLmhpZGUgfHwgZmFsc2UsDQogICAgICAgICAgICBzdGFydExpbmU6ICBzdGFydExpbmUsDQogICAgICAgICAgICBzdGFydENvbDogICBzdGFydENvbCwNCiAgICAgICAgICAgIGVuZExpbmU6ICAgIHJlYWRlci5nZXRMaW5lKCksDQogICAgICAgICAgICBlbmRDb2w6ICAgICByZWFkZXIuZ2V0Q29sKCkNCiAgICAgICAgfTsNCiAgICB9LA0KDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gTWV0aG9kcyB0byBjcmVhdGUgc3BlY2lmaWMgdG9rZW5zDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAvKioNCiAgICAgKiBQcm9kdWNlcyBhIHRva2VuIGZvciBhbnkgYXQtcnVsZS4gSWYgdGhlIGF0LXJ1bGUgaXMgdW5rbm93biwgdGhlbg0KICAgICAqIHRoZSB0b2tlbiBpcyBmb3IgYSBzaW5nbGUgIkAiIGNoYXJhY3Rlci4NCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmlyc3QgVGhlIGZpcnN0IGNoYXJhY3RlciBmb3IgdGhlIHRva2VuLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydExpbmUgVGhlIGJlZ2lubmluZyBsaW5lIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydENvbCBUaGUgYmVnaW5uaW5nIGNvbHVtbiBmb3IgdGhlIGNoYXJhY3Rlci4NCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0Lg0KICAgICAqIEBtZXRob2QgYXRSdWxlVG9rZW4NCiAgICAgKi8NCiAgICBhdFJ1bGVUb2tlbjogZnVuY3Rpb24oZmlyc3QsIHN0YXJ0TGluZSwgc3RhcnRDb2wpew0KICAgICAgICB2YXIgcnVsZSAgICA9IGZpcnN0LA0KICAgICAgICAgICAgcmVhZGVyICA9IHRoaXMuX3JlYWRlciwNCiAgICAgICAgICAgIHR0ICAgICAgPSBUb2tlbnMuQ0hBUiwNCiAgICAgICAgICAgIHZhbGlkICAgPSBmYWxzZSwNCiAgICAgICAgICAgIGlkZW50LA0KICAgICAgICAgICAgYzsNCg0KICAgICAgICAvKg0KICAgICAgICAgKiBGaXJzdCwgbWFyayB3aGVyZSB3ZSBhcmUuIFRoZXJlIGFyZSBvbmx5IGZvdXIgQCBydWxlcywNCiAgICAgICAgICogc28gYW55dGhpbmcgZWxzZSBpcyByZWFsbHkganVzdCBhbiBpbnZhbGlkIHRva2VuLg0KICAgICAgICAgKiBCYXNpY2FsbHksIGlmIHRoaXMgZG9lc24ndCBtYXRjaCBvbmUgb2YgdGhlIGtub3duIEANCiAgICAgICAgICogcnVsZXMsIGp1c3QgcmV0dXJuICdAJyBhcyBhbiB1bmtub3duIHRva2VuIGFuZCBhbGxvdw0KICAgICAgICAgKiBwYXJzaW5nIHRvIGNvbnRpbnVlIGFmdGVyIHRoYXQgcG9pbnQuDQogICAgICAgICAqLw0KICAgICAgICByZWFkZXIubWFyaygpOw0KDQogICAgICAgIC8vdHJ5IHRvIGZpbmQgdGhlIGF0LWtleXdvcmQNCiAgICAgICAgaWRlbnQgPSB0aGlzLnJlYWROYW1lKCk7DQogICAgICAgIHJ1bGUgPSBmaXJzdCArIGlkZW50Ow0KICAgICAgICB0dCA9IFRva2Vucy50eXBlKHJ1bGUudG9Mb3dlckNhc2UoKSk7DQoNCiAgICAgICAgLy9pZiBpdCdzIG5vdCB2YWxpZCwgdXNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb25seSBhbmQgcmVzZXQgdGhlIHJlYWRlcg0KICAgICAgICBpZiAodHQgPT0gVG9rZW5zLkNIQVIgfHwgdHQgPT0gVG9rZW5zLlVOS05PV04pew0KICAgICAgICAgICAgdHQgPSBUb2tlbnMuQ0hBUjsNCiAgICAgICAgICAgIHJ1bGUgPSBmaXJzdDsNCiAgICAgICAgICAgIHJlYWRlci5yZXNldCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4odHQsIHJ1bGUsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBQcm9kdWNlcyBhIGNoYXJhY3RlciB0b2tlbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gY2hhcmFjdGVyDQogICAgICogYW5kIGxvY2F0aW9uIGluIHRoZSBzdHJlYW0uIElmIHRoZXJlJ3MgYSBzcGVjaWFsIChub24tc3RhbmRhcmQpDQogICAgICogdG9rZW4gbmFtZSwgdGhpcyBpcyB1c2VkOyBvdGhlcndpc2UgQ0hBUiBpcyB1c2VkLg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjIFRoZSBjaGFyYWN0ZXIgZm9yIHRoZSB0b2tlbi4NCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRMaW5lIFRoZSBiZWdpbm5pbmcgbGluZSBmb3IgdGhlIGNoYXJhY3Rlci4NCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRDb2wgVGhlIGJlZ2lubmluZyBjb2x1bW4gZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHJldHVybiB7T2JqZWN0fSBBIHRva2VuIG9iamVjdC4NCiAgICAgKiBAbWV0aG9kIGNoYXJUb2tlbg0KICAgICAqLw0KICAgIGNoYXJUb2tlbjogZnVuY3Rpb24oYywgc3RhcnRMaW5lLCBzdGFydENvbCl7DQogICAgICAgIHZhciB0dCA9IFRva2Vucy50eXBlKGMpOw0KDQogICAgICAgIGlmICh0dCA9PSAtMSl7DQogICAgICAgICAgICB0dCA9IFRva2Vucy5DSEFSOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4odHQsIGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBQcm9kdWNlcyBhIGNoYXJhY3RlciB0b2tlbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gY2hhcmFjdGVyDQogICAgICogYW5kIGxvY2F0aW9uIGluIHRoZSBzdHJlYW0uIElmIHRoZXJlJ3MgYSBzcGVjaWFsIChub24tc3RhbmRhcmQpDQogICAgICogdG9rZW4gbmFtZSwgdGhpcyBpcyB1c2VkOyBvdGhlcndpc2UgQ0hBUiBpcyB1c2VkLg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaXJzdCBUaGUgZmlyc3QgY2hhcmFjdGVyIGZvciB0aGUgdG9rZW4uDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuDQogICAgICogQG1ldGhvZCBjb21tZW50VG9rZW4NCiAgICAgKi8NCiAgICBjb21tZW50VG9rZW46IGZ1bmN0aW9uKGZpcnN0LCBzdGFydExpbmUsIHN0YXJ0Q29sKXsNCiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsDQogICAgICAgICAgICBjb21tZW50ID0gdGhpcy5yZWFkQ29tbWVudChmaXJzdCk7DQoNCiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4oVG9rZW5zLkNPTU1FTlQsIGNvbW1lbnQsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBQcm9kdWNlcyBhIGNvbXBhcmlzb24gdG9rZW4gYmFzZWQgb24gdGhlIGdpdmVuIGNoYXJhY3Rlcg0KICAgICAqIGFuZCBsb2NhdGlvbiBpbiB0aGUgc3RyZWFtLiBUaGUgbmV4dCBjaGFyYWN0ZXIgbXVzdCBiZQ0KICAgICAqIHJlYWQgYW5kIGlzIGFscmVhZHkga25vd24gdG8gYmUgYW4gZXF1YWxzIHNpZ24uDQogICAgICogQHBhcmFtIHtTdHJpbmd9IGMgVGhlIGNoYXJhY3RlciBmb3IgdGhlIHRva2VuLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydExpbmUgVGhlIGJlZ2lubmluZyBsaW5lIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydENvbCBUaGUgYmVnaW5uaW5nIGNvbHVtbiBmb3IgdGhlIGNoYXJhY3Rlci4NCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0Lg0KICAgICAqIEBtZXRob2QgY29tcGFyaXNvblRva2VuDQogICAgICovDQogICAgY29tcGFyaXNvblRva2VuOiBmdW5jdGlvbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKXsNCiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsDQogICAgICAgICAgICBjb21wYXJpc29uICA9IGMgKyByZWFkZXIucmVhZCgpLA0KICAgICAgICAgICAgdHQgICAgICA9IFRva2Vucy50eXBlKGNvbXBhcmlzb24pIHx8IFRva2Vucy5DSEFSOw0KDQogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHR0LCBjb21wYXJpc29uLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUHJvZHVjZXMgYSBoYXNoIHRva2VuIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgaW5mb3JtYXRpb24uIFRoZQ0KICAgICAqIGZpcnN0IGNoYXJhY3RlciBwcm92aWRlZCBpcyB0aGUgcG91bmQgc2lnbiAoIykgYW5kIHRoZW4gdGhpcw0KICAgICAqIG1ldGhvZCByZWFkcyBhIG5hbWUgYWZ0ZXJ3YXJkLg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaXJzdCBUaGUgZmlyc3QgY2hhcmFjdGVyICgjKSBpbiB0aGUgaGFzaCBuYW1lLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydExpbmUgVGhlIGJlZ2lubmluZyBsaW5lIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydENvbCBUaGUgYmVnaW5uaW5nIGNvbHVtbiBmb3IgdGhlIGNoYXJhY3Rlci4NCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0Lg0KICAgICAqIEBtZXRob2QgaGFzaFRva2VuDQogICAgICovDQogICAgaGFzaFRva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgbmFtZSAgICA9IHRoaXMucmVhZE5hbWUoZmlyc3QpOw0KDQogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKFRva2Vucy5IQVNILCBuYW1lLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUHJvZHVjZXMgYSBDRE8gb3IgQ0hBUiB0b2tlbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGluZm9ybWF0aW9uLiBUaGUNCiAgICAgKiBmaXJzdCBjaGFyYWN0ZXIgaXMgcHJvdmlkZWQgYW5kIHRoZSByZXN0IGlzIHJlYWQgYnkgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZQ0KICAgICAqIHRoZSBjb3JyZWN0IHRva2VuIHRvIGNyZWF0ZS4NCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmlyc3QgVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgdG9rZW4uDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuDQogICAgICogQG1ldGhvZCBodG1sQ29tbWVudFN0YXJ0VG9rZW4NCiAgICAgKi8NCiAgICBodG1sQ29tbWVudFN0YXJ0VG9rZW46IGZ1bmN0aW9uKGZpcnN0LCBzdGFydExpbmUsIHN0YXJ0Q29sKXsNCiAgICAgICAgdmFyIHJlYWRlciAgICAgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgdGV4dCAgICAgICAgPSBmaXJzdDsNCg0KICAgICAgICByZWFkZXIubWFyaygpOw0KICAgICAgICB0ZXh0ICs9IHJlYWRlci5yZWFkQ291bnQoMyk7DQoNCiAgICAgICAgaWYgKHRleHQgPT0gIjwhLS0iKXsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKFRva2Vucy5DRE8sIHRleHQsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyVG9rZW4oZmlyc3QsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIFByb2R1Y2VzIGEgQ0RDIG9yIENIQVIgdG9rZW4gYmFzZWQgb24gdGhlIHNwZWNpZmllZCBpbmZvcm1hdGlvbi4gVGhlDQogICAgICogZmlyc3QgY2hhcmFjdGVyIGlzIHByb3ZpZGVkIGFuZCB0aGUgcmVzdCBpcyByZWFkIGJ5IHRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUNCiAgICAgKiB0aGUgY29ycmVjdCB0b2tlbiB0byBjcmVhdGUuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IGZpcnN0IFRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHRva2VuLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydExpbmUgVGhlIGJlZ2lubmluZyBsaW5lIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydENvbCBUaGUgYmVnaW5uaW5nIGNvbHVtbiBmb3IgdGhlIGNoYXJhY3Rlci4NCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0Lg0KICAgICAqIEBtZXRob2QgaHRtbENvbW1lbnRFbmRUb2tlbg0KICAgICAqLw0KICAgIGh0bWxDb21tZW50RW5kVG9rZW46IGZ1bmN0aW9uKGZpcnN0LCBzdGFydExpbmUsIHN0YXJ0Q29sKXsNCiAgICAgICAgdmFyIHJlYWRlciAgICAgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgdGV4dCAgICAgICAgPSBmaXJzdDsNCg0KICAgICAgICByZWFkZXIubWFyaygpOw0KICAgICAgICB0ZXh0ICs9IHJlYWRlci5yZWFkQ291bnQoMik7DQoNCiAgICAgICAgaWYgKHRleHQgPT0gIi0tPiIpew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4oVG9rZW5zLkNEQywgdGV4dCwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZWFkZXIucmVzZXQoKTsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJUb2tlbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUHJvZHVjZXMgYW4gSURFTlQgb3IgRlVOQ1RJT04gdG9rZW4gYmFzZWQgb24gdGhlIHNwZWNpZmllZCBpbmZvcm1hdGlvbi4gVGhlDQogICAgICogZmlyc3QgY2hhcmFjdGVyIGlzIHByb3ZpZGVkIGFuZCB0aGUgcmVzdCBpcyByZWFkIGJ5IHRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUNCiAgICAgKiB0aGUgY29ycmVjdCB0b2tlbiB0byBjcmVhdGUuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IGZpcnN0IFRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGlkZW50aWZpZXIuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuDQogICAgICogQG1ldGhvZCBpZGVudE9yRnVuY3Rpb25Ub2tlbg0KICAgICAqLw0KICAgIGlkZW50T3JGdW5jdGlvblRva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgaWRlbnQgICA9IHRoaXMucmVhZE5hbWUoZmlyc3QpLA0KICAgICAgICAgICAgdHQgICAgICA9IFRva2Vucy5JREVOVDsNCg0KICAgICAgICAvL2lmIHRoZXJlJ3MgYSBsZWZ0IHBhcmVuIGltbWVkaWF0ZWx5IGFmdGVyLCBpdCdzIGEgVVJJIG9yIGZ1bmN0aW9uDQogICAgICAgIGlmIChyZWFkZXIucGVlaygpID09ICIoIil7DQogICAgICAgICAgICBpZGVudCArPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgaWYgKGlkZW50LnRvTG93ZXJDYXNlKCkgPT0gInVybCgiKXsNCiAgICAgICAgICAgICAgICB0dCA9IFRva2Vucy5VUkk7DQogICAgICAgICAgICAgICAgaWRlbnQgPSB0aGlzLnJlYWRVUkkoaWRlbnQpOw0KDQogICAgICAgICAgICAgICAgLy9kaWRuJ3QgZmluZCBhIHZhbGlkIFVSTCBvciB0aGVyZSdzIG5vIGNsb3NpbmcgcGFyZW4NCiAgICAgICAgICAgICAgICBpZiAoaWRlbnQudG9Mb3dlckNhc2UoKSA9PSAidXJsKCIpew0KICAgICAgICAgICAgICAgICAgICB0dCA9IFRva2Vucy5GVU5DVElPTjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHR0ID0gVG9rZW5zLkZVTkNUSU9OOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5wZWVrKCkgPT0gIjoiKXsgIC8vbWlnaHQgYmUgYW4gSUUgZnVuY3Rpb24NCg0KICAgICAgICAgICAgLy9JRS1zcGVjaWZpYyBmdW5jdGlvbnMgYWx3YXlzIGJlaW5nIHdpdGggcHJvZ2lkOg0KICAgICAgICAgICAgaWYgKGlkZW50LnRvTG93ZXJDYXNlKCkgPT0gInByb2dpZCIpew0KICAgICAgICAgICAgICAgIGlkZW50ICs9IHJlYWRlci5yZWFkVG8oIigiKTsNCiAgICAgICAgICAgICAgICB0dCA9IFRva2Vucy5JRV9GVU5DVElPTjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHR0LCBpZGVudCwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIFByb2R1Y2VzIGFuIElNUE9SVEFOVF9TWU0gb3IgQ0hBUiB0b2tlbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGluZm9ybWF0aW9uLiBUaGUNCiAgICAgKiBmaXJzdCBjaGFyYWN0ZXIgaXMgcHJvdmlkZWQgYW5kIHRoZSByZXN0IGlzIHJlYWQgYnkgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZQ0KICAgICAqIHRoZSBjb3JyZWN0IHRva2VuIHRvIGNyZWF0ZS4NCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmlyc3QgVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgdG9rZW4uDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuDQogICAgICogQG1ldGhvZCBpbXBvcnRhbnRUb2tlbg0KICAgICAqLw0KICAgIGltcG9ydGFudFRva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7DQogICAgICAgIHZhciByZWFkZXIgICAgICA9IHRoaXMuX3JlYWRlciwNCiAgICAgICAgICAgIGltcG9ydGFudCAgID0gZmlyc3QsDQogICAgICAgICAgICB0dCAgICAgICAgICA9IFRva2Vucy5DSEFSLA0KICAgICAgICAgICAgdGVtcCwNCiAgICAgICAgICAgIGM7DQoNCiAgICAgICAgcmVhZGVyLm1hcmsoKTsNCiAgICAgICAgYyA9IHJlYWRlci5yZWFkKCk7DQoNCiAgICAgICAgd2hpbGUoYyl7DQoNCiAgICAgICAgICAgIC8vdGhlcmUgY2FuIGJlIGEgY29tbWVudCBpbiBoZXJlDQogICAgICAgICAgICBpZiAoYyA9PSAiLyIpew0KDQogICAgICAgICAgICAgICAgLy9pZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXNuJ3QgYSBzdGFyLCB0aGVuIHRoaXMgaXNuJ3QgYSB2YWxpZCAhaW1wb3J0YW50IHRva2VuDQogICAgICAgICAgICAgICAgaWYgKHJlYWRlci5wZWVrKCkgIT0gIioiKXsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRoaXMucmVhZENvbW1lbnQoYyk7DQogICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wID09ICIiKXsgICAgLy9icm9rZW4hDQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaGl0ZXNwYWNlKGMpKXsNCiAgICAgICAgICAgICAgICBpbXBvcnRhbnQgKz0gYyArIHRoaXMucmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoL2kvaS50ZXN0KGMpKXsNCiAgICAgICAgICAgICAgICB0ZW1wID0gcmVhZGVyLnJlYWRDb3VudCg4KTsNCiAgICAgICAgICAgICAgICBpZiAoL21wb3J0YW50L2kudGVzdCh0ZW1wKSl7DQogICAgICAgICAgICAgICAgICAgIGltcG9ydGFudCArPSBjICsgdGVtcDsNCiAgICAgICAgICAgICAgICAgICAgdHQgPSBUb2tlbnMuSU1QT1JUQU5UX1NZTTsNCg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBicmVhazsgIC8vd2UncmUgZG9uZQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgYyA9IHJlYWRlci5yZWFkKCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodHQgPT0gVG9rZW5zLkNIQVIpew0KICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyVG9rZW4oZmlyc3QsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4odHQsIGltcG9ydGFudCwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgIH0NCg0KDQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIFByb2R1Y2VzIGEgTk9UIG9yIENIQVIgdG9rZW4gYmFzZWQgb24gdGhlIHNwZWNpZmllZCBpbmZvcm1hdGlvbi4gVGhlDQogICAgICogZmlyc3QgY2hhcmFjdGVyIGlzIHByb3ZpZGVkIGFuZCB0aGUgcmVzdCBpcyByZWFkIGJ5IHRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUNCiAgICAgKiB0aGUgY29ycmVjdCB0b2tlbiB0byBjcmVhdGUuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IGZpcnN0IFRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHRva2VuLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydExpbmUgVGhlIGJlZ2lubmluZyBsaW5lIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydENvbCBUaGUgYmVnaW5uaW5nIGNvbHVtbiBmb3IgdGhlIGNoYXJhY3Rlci4NCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0Lg0KICAgICAqIEBtZXRob2Qgbm90VG9rZW4NCiAgICAgKi8NCiAgICBub3RUb2tlbjogZnVuY3Rpb24oZmlyc3QsIHN0YXJ0TGluZSwgc3RhcnRDb2wpew0KICAgICAgICB2YXIgcmVhZGVyICAgICAgPSB0aGlzLl9yZWFkZXIsDQogICAgICAgICAgICB0ZXh0ICAgICAgICA9IGZpcnN0Ow0KDQogICAgICAgIHJlYWRlci5tYXJrKCk7DQogICAgICAgIHRleHQgKz0gcmVhZGVyLnJlYWRDb3VudCg0KTsNCg0KICAgICAgICBpZiAodGV4dC50b0xvd2VyQ2FzZSgpID09ICI6bm90KCIpew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4oVG9rZW5zLk5PVCwgdGV4dCwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZWFkZXIucmVzZXQoKTsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJUb2tlbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUHJvZHVjZXMgYSBudW1iZXIgdG9rZW4gYmFzZWQgb24gdGhlIGdpdmVuIGNoYXJhY3Rlcg0KICAgICAqIGFuZCBsb2NhdGlvbiBpbiB0aGUgc3RyZWFtLiBUaGlzIG1heSByZXR1cm4gYSB0b2tlbiBvZg0KICAgICAqIE5VTUJFUiwgRU1TLCBFWFMsIExFTkdUSCwgQU5HTEUsIFRJTUUsIEZSRVEsIERJTUVOU0lPTiwNCiAgICAgKiBvciBQRVJDRU5UQUdFLg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaXJzdCBUaGUgZmlyc3QgY2hhcmFjdGVyIGZvciB0aGUgdG9rZW4uDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuDQogICAgICogQG1ldGhvZCBudW1iZXJUb2tlbg0KICAgICAqLw0KICAgIG51bWJlclRva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgdmFsdWUgICA9IHRoaXMucmVhZE51bWJlcihmaXJzdCksDQogICAgICAgICAgICBpZGVudCwNCiAgICAgICAgICAgIHR0ICAgICAgPSBUb2tlbnMuTlVNQkVSLA0KICAgICAgICAgICAgYyAgICAgICA9IHJlYWRlci5wZWVrKCk7DQoNCiAgICAgICAgaWYgKGlzSWRlbnRTdGFydChjKSl7DQogICAgICAgICAgICBpZGVudCA9IHRoaXMucmVhZE5hbWUocmVhZGVyLnJlYWQoKSk7DQogICAgICAgICAgICB2YWx1ZSArPSBpZGVudDsNCg0KICAgICAgICAgICAgaWYgKC9eZW0kfF5leCR8XnB4JHxeZ2QkfF5yZW0kfF52dyR8XnZoJHxedm0kfF5jaCR8XmNtJHxebW0kfF5pbiR8XnB0JHxecGMkL2kudGVzdChpZGVudCkpew0KICAgICAgICAgICAgICAgIHR0ID0gVG9rZW5zLkxFTkdUSDsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoL15kZWd8XnJhZCR8XmdyYWQkL2kudGVzdChpZGVudCkpew0KICAgICAgICAgICAgICAgIHR0ID0gVG9rZW5zLkFOR0xFOw0KICAgICAgICAgICAgfSBlbHNlIGlmICgvXm1zJHxecyQvaS50ZXN0KGlkZW50KSl7DQogICAgICAgICAgICAgICAgdHQgPSBUb2tlbnMuVElNRTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoL15oeiR8XmtoeiQvaS50ZXN0KGlkZW50KSl7DQogICAgICAgICAgICAgICAgdHQgPSBUb2tlbnMuRlJFUTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoL15kcGkkfF5kcGNtJC9pLnRlc3QoaWRlbnQpKXsNCiAgICAgICAgICAgICAgICB0dCA9IFRva2Vucy5SRVNPTFVUSU9OOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0dCA9IFRva2Vucy5ESU1FTlNJT047DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSBlbHNlIGlmIChjID09ICIlIil7DQogICAgICAgICAgICB2YWx1ZSArPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgdHQgPSBUb2tlbnMuUEVSQ0VOVEFHRTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHR0LCB2YWx1ZSwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIFByb2R1Y2VzIGEgc3RyaW5nIHRva2VuIGJhc2VkIG9uIHRoZSBnaXZlbiBjaGFyYWN0ZXINCiAgICAgKiBhbmQgbG9jYXRpb24gaW4gdGhlIHN0cmVhbS4gU2luY2Ugc3RyaW5ncyBtYXkgYmUgaW5kaWNhdGVkDQogICAgICogYnkgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMsIGEgZmFpbHVyZSB0byBtYXRjaCBzdGFydGluZw0KICAgICAqIGFuZCBlbmRpbmcgcXVvdGVzIHJlc3VsdHMgaW4gYW4gSU5WQUxJRCB0b2tlbiBiZWluZyBnZW5lcmF0ZWQuDQogICAgICogVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIGlzIHBhc3NlZCBpbiBhbmQgdGhlbg0KICAgICAqIHRoZSByZXN0IGFyZSByZWFkIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGZpbmFsIHF1b3RhdGlvbiBtYXJrLg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaXJzdCBUaGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuDQogICAgICogQG1ldGhvZCBzdHJpbmdUb2tlbg0KICAgICAqLw0KICAgIHN0cmluZ1Rva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7DQogICAgICAgIHZhciBkZWxpbSAgID0gZmlyc3QsDQogICAgICAgICAgICBzdHJpbmcgID0gZmlyc3QsDQogICAgICAgICAgICByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgcHJldiAgICA9IGZpcnN0LA0KICAgICAgICAgICAgdHQgICAgICA9IFRva2Vucy5TVFJJTkcsDQogICAgICAgICAgICBjICAgICAgID0gcmVhZGVyLnJlYWQoKTsNCg0KICAgICAgICB3aGlsZShjKXsNCiAgICAgICAgICAgIHN0cmluZyArPSBjOw0KDQogICAgICAgICAgICAvL2lmIHRoZSBkZWxpbWl0ZXIgaXMgZm91bmQgd2l0aCBhbiBlc2NhcGVtZW50LCB3ZSdyZSBkb25lLg0KICAgICAgICAgICAgaWYgKGMgPT0gZGVsaW0gJiYgcHJldiAhPSAiXFwiKXsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy9pZiB0aGVyZSdzIGEgbmV3bGluZSB3aXRob3V0IGFuIGVzY2FwZW1lbnQsIGl0J3MgYW4gaW52YWxpZCBzdHJpbmcNCiAgICAgICAgICAgIGlmIChpc05ld0xpbmUocmVhZGVyLnBlZWsoKSkgJiYgYyAhPSAiXFwiKXsNCiAgICAgICAgICAgICAgICB0dCA9IFRva2Vucy5JTlZBTElEOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL3NhdmUgcHJldmlvdXMgYW5kIGdldCBuZXh0DQogICAgICAgICAgICBwcmV2ID0gYzsNCiAgICAgICAgICAgIGMgPSByZWFkZXIucmVhZCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy9pZiBjIGlzIG51bGwsIHRoYXQgbWVhbnMgd2UncmUgb3V0IG9mIGlucHV0IGFuZCB0aGUgc3RyaW5nIHdhcyBuZXZlciBjbG9zZWQNCiAgICAgICAgaWYgKGMgPT0gbnVsbCl7DQogICAgICAgICAgICB0dCA9IFRva2Vucy5JTlZBTElEOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4odHQsIHN0cmluZywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgfSwNCg0KICAgIHVuaWNvZGVSYW5nZVRva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgdmFsdWUgICA9IGZpcnN0LA0KICAgICAgICAgICAgdGVtcCwNCiAgICAgICAgICAgIHR0ICAgICAgPSBUb2tlbnMuQ0hBUjsNCg0KICAgICAgICAvL3RoZW4gaXQgc2hvdWxkIGJlIGEgdW5pY29kZSByYW5nZQ0KICAgICAgICBpZiAocmVhZGVyLnBlZWsoKSA9PSAiKyIpew0KICAgICAgICAgICAgcmVhZGVyLm1hcmsoKTsNCiAgICAgICAgICAgIHZhbHVlICs9IHJlYWRlci5yZWFkKCk7DQogICAgICAgICAgICB2YWx1ZSArPSB0aGlzLnJlYWRVbmljb2RlUmFuZ2VQYXJ0KHRydWUpOw0KDQogICAgICAgICAgICAvL2Vuc3VyZSB0aGVyZSdzIGFuIGFjdHVhbCB1bmljb2RlIHJhbmdlIGhlcmUNCiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMil7DQogICAgICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KDQogICAgICAgICAgICAgICAgdHQgPSBUb2tlbnMuVU5JQ09ERV9SQU5HRTsNCg0KICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUncyBhID8gaW4gdGhlIGZpcnN0IHBhcnQsIHRoZXJlIGNhbid0IGJlIGEgc2Vjb25kIHBhcnQNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiPyIpID09IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLnBlZWsoKSA9PSAiLSIpew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm1hcmsoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCArPSB0aGlzLnJlYWRVbmljb2RlUmFuZ2VQYXJ0KGZhbHNlKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIG5vdCBhbm90aGVyIHZhbHVlLCBiYWNrIHVwIGFuZCBqdXN0IHRha2UgdGhlIGZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcC5sZW5ndGggPT0gMSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRlbXA7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHR0LCB2YWx1ZSwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIFByb2R1Y2VzIGEgUyB0b2tlbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGluZm9ybWF0aW9uLiBTaW5jZSB3aGl0ZXNwYWNlDQogICAgICogbWF5IGhhdmUgbXVsdGlwbGUgY2hhcmFjdGVycywgdGhpcyBjb25zdW1lcyBhbGwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzDQogICAgICogaW50byBhIHNpbmdsZSB0b2tlbi4NCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmlyc3QgVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgdG9rZW4uDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuDQogICAgICogQG1ldGhvZCB3aGl0ZXNwYWNlVG9rZW4NCiAgICAgKi8NCiAgICB3aGl0ZXNwYWNlVG9rZW46IGZ1bmN0aW9uKGZpcnN0LCBzdGFydExpbmUsIHN0YXJ0Q29sKXsNCiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsDQogICAgICAgICAgICB2YWx1ZSAgID0gZmlyc3QgKyB0aGlzLnJlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKFRva2Vucy5TLCB2YWx1ZSwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgfSwNCg0KDQoNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vIE1ldGhvZHMgdG8gcmVhZCB2YWx1ZXMgZnJvbSB0aGUgc3RyaW5nIHN0cmVhbQ0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgcmVhZFVuaWNvZGVSYW5nZVBhcnQ6IGZ1bmN0aW9uKGFsbG93UXVlc3Rpb25NYXJrKXsNCiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsDQogICAgICAgICAgICBwYXJ0ID0gIiIsDQogICAgICAgICAgICBjICAgICAgID0gcmVhZGVyLnBlZWsoKTsNCg0KICAgICAgICAvL2ZpcnN0IHJlYWQgaGV4IGRpZ2l0cw0KICAgICAgICB3aGlsZShpc0hleERpZ2l0KGMpICYmIHBhcnQubGVuZ3RoIDwgNil7DQogICAgICAgICAgICByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgcGFydCArPSBjOw0KICAgICAgICAgICAgYyA9IHJlYWRlci5wZWVrKCk7DQogICAgICAgIH0NCg0KICAgICAgICAvL3RoZW4gcmVhZCBxdWVzdGlvbiBtYXJrcyBpZiBhbGxvd2VkDQogICAgICAgIGlmIChhbGxvd1F1ZXN0aW9uTWFyayl7DQogICAgICAgICAgICB3aGlsZShjID09ICI/IiAmJiBwYXJ0Lmxlbmd0aCA8IDYpew0KICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkKCk7DQogICAgICAgICAgICAgICAgcGFydCArPSBjOw0KICAgICAgICAgICAgICAgIGMgPSByZWFkZXIucGVlaygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy90aGVyZSBjYW4ndCBiZSBhbnkgb3RoZXIgY2hhcmFjdGVycyBhZnRlciB0aGlzIHBvaW50DQoNCiAgICAgICAgcmV0dXJuIHBhcnQ7DQogICAgfSwNCg0KICAgIHJlYWRXaGl0ZXNwYWNlOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgcmVhZGVyICA9IHRoaXMuX3JlYWRlciwNCiAgICAgICAgICAgIHdoaXRlc3BhY2UgPSAiIiwNCiAgICAgICAgICAgIGMgICAgICAgPSByZWFkZXIucGVlaygpOw0KDQogICAgICAgIHdoaWxlKGlzV2hpdGVzcGFjZShjKSl7DQogICAgICAgICAgICByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgd2hpdGVzcGFjZSArPSBjOw0KICAgICAgICAgICAgYyA9IHJlYWRlci5wZWVrKCk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gd2hpdGVzcGFjZTsNCiAgICB9LA0KICAgIHJlYWROdW1iZXI6IGZ1bmN0aW9uKGZpcnN0KXsNCiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsDQogICAgICAgICAgICBudW1iZXIgID0gZmlyc3QsDQogICAgICAgICAgICBoYXNEb3QgID0gKGZpcnN0ID09ICIuIiksDQogICAgICAgICAgICBjICAgICAgID0gcmVhZGVyLnBlZWsoKTsNCg0KDQogICAgICAgIHdoaWxlKGMpew0KICAgICAgICAgICAgaWYgKGlzRGlnaXQoYykpew0KICAgICAgICAgICAgICAgIG51bWJlciArPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICIuIil7DQogICAgICAgICAgICAgICAgaWYgKGhhc0RvdCl7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGhhc0RvdCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIG51bWJlciArPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGMgPSByZWFkZXIucGVlaygpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIG51bWJlcjsNCiAgICB9LA0KICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgZGVsaW0gICA9IHJlYWRlci5yZWFkKCksDQogICAgICAgICAgICBzdHJpbmcgID0gZGVsaW0sDQogICAgICAgICAgICBwcmV2ICAgID0gZGVsaW0sDQogICAgICAgICAgICBjICAgICAgID0gcmVhZGVyLnBlZWsoKTsNCg0KICAgICAgICB3aGlsZShjKXsNCiAgICAgICAgICAgIGMgPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgc3RyaW5nICs9IGM7DQoNCiAgICAgICAgICAgIC8vaWYgdGhlIGRlbGltaXRlciBpcyBmb3VuZCB3aXRoIGFuIGVzY2FwZW1lbnQsIHdlJ3JlIGRvbmUuDQogICAgICAgICAgICBpZiAoYyA9PSBkZWxpbSAmJiBwcmV2ICE9ICJcXCIpew0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL2lmIHRoZXJlJ3MgYSBuZXdsaW5lIHdpdGhvdXQgYW4gZXNjYXBlbWVudCwgaXQncyBhbiBpbnZhbGlkIHN0cmluZw0KICAgICAgICAgICAgaWYgKGlzTmV3TGluZShyZWFkZXIucGVlaygpKSAmJiBjICE9ICJcXCIpew0KICAgICAgICAgICAgICAgIHN0cmluZyA9ICIiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL3NhdmUgcHJldmlvdXMgYW5kIGdldCBuZXh0DQogICAgICAgICAgICBwcmV2ID0gYzsNCiAgICAgICAgICAgIGMgPSByZWFkZXIucGVlaygpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy9pZiBjIGlzIG51bGwsIHRoYXQgbWVhbnMgd2UncmUgb3V0IG9mIGlucHV0IGFuZCB0aGUgc3RyaW5nIHdhcyBuZXZlciBjbG9zZWQNCiAgICAgICAgaWYgKGMgPT0gbnVsbCl7DQogICAgICAgICAgICBzdHJpbmcgPSAiIjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBzdHJpbmc7DQogICAgfSwNCiAgICByZWFkVVJJOiBmdW5jdGlvbihmaXJzdCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgdXJpICAgICA9IGZpcnN0LA0KICAgICAgICAgICAgaW5uZXIgICA9ICIiLA0KICAgICAgICAgICAgYyAgICAgICA9IHJlYWRlci5wZWVrKCk7DQoNCiAgICAgICAgcmVhZGVyLm1hcmsoKTsNCg0KICAgICAgICAvL3NraXAgd2hpdGVzcGFjZSBiZWZvcmUNCiAgICAgICAgd2hpbGUoYyAmJiBpc1doaXRlc3BhY2UoYykpew0KICAgICAgICAgICAgcmVhZGVyLnJlYWQoKTsNCiAgICAgICAgICAgIGMgPSByZWFkZXIucGVlaygpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy9pdCdzIGEgc3RyaW5nDQogICAgICAgIGlmIChjID09ICInIiB8fCBjID09ICJcIiIpew0KICAgICAgICAgICAgaW5uZXIgPSB0aGlzLnJlYWRTdHJpbmcoKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlubmVyID0gdGhpcy5yZWFkVVJMKCk7DQogICAgICAgIH0NCg0KICAgICAgICBjID0gcmVhZGVyLnBlZWsoKTsNCg0KICAgICAgICAvL3NraXAgd2hpdGVzcGFjZSBhZnRlcg0KICAgICAgICB3aGlsZShjICYmIGlzV2hpdGVzcGFjZShjKSl7DQogICAgICAgICAgICByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgYyA9IHJlYWRlci5wZWVrKCk7DQogICAgICAgIH0NCg0KICAgICAgICAvL2lmIHRoZXJlIHdhcyBubyBpbm5lciB2YWx1ZSBvciB0aGUgbmV4dCBjaGFyYWN0ZXIgaXNuJ3QgY2xvc2luZyBwYXJlbiwgaXQncyBub3QgYSBVUkkNCiAgICAgICAgaWYgKGlubmVyID09ICIiIHx8IGMgIT0gIikiKXsNCiAgICAgICAgICAgIHVyaSA9IGZpcnN0Ow0KICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB1cmkgKz0gaW5uZXIgKyByZWFkZXIucmVhZCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHVyaTsNCiAgICB9LA0KICAgIHJlYWRVUkw6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgdXJsICAgICA9ICIiLA0KICAgICAgICAgICAgYyAgICAgICA9IHJlYWRlci5wZWVrKCk7DQoNCiAgICAgICAgLy9UT0RPOiBDaGVjayBmb3IgZXNjYXBlIGFuZCBub25hc2NpaQ0KICAgICAgICB3aGlsZSAoL15bISMkJSZcXCotfl0kLy50ZXN0KGMpKXsNCiAgICAgICAgICAgIHVybCArPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgYyA9IHJlYWRlci5wZWVrKCk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gdXJsOw0KDQogICAgfSwNCiAgICByZWFkTmFtZTogZnVuY3Rpb24oZmlyc3Qpew0KICAgICAgICB2YXIgcmVhZGVyICA9IHRoaXMuX3JlYWRlciwNCiAgICAgICAgICAgIGlkZW50ICAgPSBmaXJzdCB8fCAiIiwNCiAgICAgICAgICAgIGMgICAgICAgPSByZWFkZXIucGVlaygpOw0KDQogICAgICAgIHdoaWxlKHRydWUpew0KICAgICAgICAgICAgaWYgKGMgPT0gIlxcIil7DQogICAgICAgICAgICAgICAgaWRlbnQgKz0gdGhpcy5yZWFkRXNjYXBlKHJlYWRlci5yZWFkKCkpOw0KICAgICAgICAgICAgICAgIGMgPSByZWFkZXIucGVlaygpOw0KICAgICAgICAgICAgfSBlbHNlIGlmKGMgJiYgaXNOYW1lQ2hhcihjKSl7DQogICAgICAgICAgICAgICAgaWRlbnQgKz0gcmVhZGVyLnJlYWQoKTsNCiAgICAgICAgICAgICAgICBjID0gcmVhZGVyLnBlZWsoKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gaWRlbnQ7DQogICAgfSwNCiAgICANCiAgICByZWFkRXNjYXBlOiBmdW5jdGlvbihmaXJzdCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgY3NzRXNjYXBlID0gZmlyc3QgfHwgIiIsDQogICAgICAgICAgICBpICAgICAgID0gMCwNCiAgICAgICAgICAgIGMgICAgICAgPSByZWFkZXIucGVlaygpOyAgICANCiAgICANCiAgICAgICAgaWYgKGlzSGV4RGlnaXQoYykpew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGNzc0VzY2FwZSArPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgICAgIGMgPSByZWFkZXIucGVlaygpOw0KICAgICAgICAgICAgfSB3aGlsZShjICYmIGlzSGV4RGlnaXQoYykgJiYgKytpIDwgNik7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmIChjc3NFc2NhcGUubGVuZ3RoID09IDMgJiYgL1xzLy50ZXN0KGMpIHx8DQogICAgICAgICAgICBjc3NFc2NhcGUubGVuZ3RoID09IDcgfHwgY3NzRXNjYXBlLmxlbmd0aCA9PSAxKXsNCiAgICAgICAgICAgICAgICByZWFkZXIucmVhZCgpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgYyA9ICIiOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gY3NzRXNjYXBlICsgYzsNCiAgICB9LA0KICAgIA0KICAgIHJlYWRDb21tZW50OiBmdW5jdGlvbihmaXJzdCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgY29tbWVudCA9IGZpcnN0IHx8ICIiLA0KICAgICAgICAgICAgYyAgICAgICA9IHJlYWRlci5yZWFkKCk7DQoNCiAgICAgICAgaWYgKGMgPT0gIioiKXsNCiAgICAgICAgICAgIHdoaWxlKGMpew0KICAgICAgICAgICAgICAgIGNvbW1lbnQgKz0gYzsNCg0KICAgICAgICAgICAgICAgIC8vbG9vayBmb3IgZW5kIG9mIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBpZiAoYyA9PSAiKiIgJiYgcmVhZGVyLnBlZWsoKSA9PSAiLyIpew0KICAgICAgICAgICAgICAgICAgICBjb21tZW50ICs9IHJlYWRlci5yZWFkKCk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGMgPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXR1cm4gY29tbWVudDsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiAiIjsNCiAgICAgICAgfQ0KDQogICAgfQ0KfSk7DQoNCg0KdmFyIFRva2VucyAgPSBbDQoNCiAgICAvKg0KICAgICAqIFRoZSBmb2xsb3dpbmcgdG9rZW4gbmFtZXMgYXJlIGRlZmluZWQgaW4gQ1NTMyBHcmFtbWFyOiBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXN5bnRheC8jbGV4aWNhbA0KICAgICAqLw0KICAgICANCiAgICAvL0hUTUwtc3R5bGUgY29tbWVudHMNCiAgICB7IG5hbWU6ICJDRE8ifSwNCiAgICB7IG5hbWU6ICJDREMifSwNCg0KICAgIC8vaWdub3JhYmxlcw0KICAgIHsgbmFtZTogIlMiLCB3aGl0ZXNwYWNlOiB0cnVlLyosIGNoYW5uZWw6ICJ3cyIqL30sDQogICAgeyBuYW1lOiAiQ09NTUVOVCIsIGNvbW1lbnQ6IHRydWUsIGhpZGU6IHRydWUsIGNoYW5uZWw6ICJjb21tZW50IiB9LA0KICAgICAgICANCiAgICAvL2F0dHJpYnV0ZSBlcXVhbGl0eQ0KICAgIHsgbmFtZTogIklOQ0xVREVTIiwgdGV4dDogIn49In0sDQogICAgeyBuYW1lOiAiREFTSE1BVENIIiwgdGV4dDogInw9In0sDQogICAgeyBuYW1lOiAiUFJFRklYTUFUQ0giLCB0ZXh0OiAiXj0ifSwNCiAgICB7IG5hbWU6ICJTVUZGSVhNQVRDSCIsIHRleHQ6ICIkPSJ9LA0KICAgIHsgbmFtZTogIlNVQlNUUklOR01BVENIIiwgdGV4dDogIio9In0sDQogICAgICAgIA0KICAgIC8vaWRlbnRpZmllciB0eXBlcw0KICAgIHsgbmFtZTogIlNUUklORyJ9LCAgICAgDQogICAgeyBuYW1lOiAiSURFTlQifSwNCiAgICB7IG5hbWU6ICJIQVNIIn0sDQoNCiAgICAvL2F0LWtleXdvcmRzDQogICAgeyBuYW1lOiAiSU1QT1JUX1NZTSIsIHRleHQ6ICJAaW1wb3J0In0sDQogICAgeyBuYW1lOiAiUEFHRV9TWU0iLCB0ZXh0OiAiQHBhZ2UifSwNCiAgICB7IG5hbWU6ICJNRURJQV9TWU0iLCB0ZXh0OiAiQG1lZGlhIn0sDQogICAgeyBuYW1lOiAiRk9OVF9GQUNFX1NZTSIsIHRleHQ6ICJAZm9udC1mYWNlIn0sDQogICAgeyBuYW1lOiAiQ0hBUlNFVF9TWU0iLCB0ZXh0OiAiQGNoYXJzZXQifSwNCiAgICB7IG5hbWU6ICJOQU1FU1BBQ0VfU1lNIiwgdGV4dDogIkBuYW1lc3BhY2UifSwNCiAgICAvL3sgbmFtZTogIkFUS0VZV09SRCJ9LA0KICAgIA0KICAgIC8vQ1NTMyBhbmltYXRpb25zDQogICAgeyBuYW1lOiAiS0VZRlJBTUVTX1NZTSIsIHRleHQ6IFsgIkBrZXlmcmFtZXMiLCAiQC13ZWJraXQta2V5ZnJhbWVzIiwgIkAtbW96LWtleWZyYW1lcyIgXSB9LA0KDQogICAgLy9pbXBvcnRhbnQgc3ltYm9sDQogICAgeyBuYW1lOiAiSU1QT1JUQU5UX1NZTSJ9LA0KDQogICAgLy9tZWFzdXJlbWVudHMNCiAgICB7IG5hbWU6ICJMRU5HVEgifSwNCiAgICB7IG5hbWU6ICJBTkdMRSJ9LA0KICAgIHsgbmFtZTogIlRJTUUifSwNCiAgICB7IG5hbWU6ICJGUkVRIn0sDQogICAgeyBuYW1lOiAiRElNRU5TSU9OIn0sDQogICAgeyBuYW1lOiAiUEVSQ0VOVEFHRSJ9LA0KICAgIHsgbmFtZTogIk5VTUJFUiJ9LA0KICAgIA0KICAgIC8vZnVuY3Rpb25zDQogICAgeyBuYW1lOiAiVVJJIn0sDQogICAgeyBuYW1lOiAiRlVOQ1RJT04ifSwNCiAgICANCiAgICAvL1VuaWNvZGUgcmFuZ2VzDQogICAgeyBuYW1lOiAiVU5JQ09ERV9SQU5HRSJ9LA0KICAgIA0KICAgIC8qDQogICAgICogVGhlIGZvbGxvd2luZyB0b2tlbiBuYW1lcyBhcmUgZGVmaW5lZCBpbiBDU1MzIFNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI3NlbGVjdG9yLXN5bnRheA0KICAgICAqLyAgICANCiAgICANCiAgICAvL2ludmFsaWQgc3RyaW5nDQogICAgeyBuYW1lOiAiSU5WQUxJRCJ9LA0KICAgIA0KICAgIC8vY29tYmluYXRvcnMNCiAgICB7IG5hbWU6ICJQTFVTIiwgdGV4dDogIisiIH0sDQogICAgeyBuYW1lOiAiR1JFQVRFUiIsIHRleHQ6ICI+In0sDQogICAgeyBuYW1lOiAiQ09NTUEiLCB0ZXh0OiAiLCJ9LA0KICAgIHsgbmFtZTogIlRJTERFIiwgdGV4dDogIn4ifSwNCiAgICANCiAgICAvL21vZGlmaWVyDQogICAgeyBuYW1lOiAiTk9UIn0sICAgICAgICANCiAgICANCiAgICAvKg0KICAgICAqIERlZmluZWQgaW4gQ1NTMyBQYWdlZCBNZWRpYQ0KICAgICAqLw0KICAgIHsgbmFtZTogIlRPUExFRlRDT1JORVJfU1lNIiwgdGV4dDogIkB0b3AtbGVmdC1jb3JuZXIifSwNCiAgICB7IG5hbWU6ICJUT1BMRUZUX1NZTSIsIHRleHQ6ICJAdG9wLWxlZnQifSwNCiAgICB7IG5hbWU6ICJUT1BDRU5URVJfU1lNIiwgdGV4dDogIkB0b3AtY2VudGVyIn0sDQogICAgeyBuYW1lOiAiVE9QUklHSFRfU1lNIiwgdGV4dDogIkB0b3AtcmlnaHQifSwNCiAgICB7IG5hbWU6ICJUT1BSSUdIVENPUk5FUl9TWU0iLCB0ZXh0OiAiQHRvcC1yaWdodC1jb3JuZXIifSwNCiAgICB7IG5hbWU6ICJCT1RUT01MRUZUQ09STkVSX1NZTSIsIHRleHQ6ICJAYm90dG9tLWxlZnQtY29ybmVyIn0sDQogICAgeyBuYW1lOiAiQk9UVE9NTEVGVF9TWU0iLCB0ZXh0OiAiQGJvdHRvbS1sZWZ0In0sDQogICAgeyBuYW1lOiAiQk9UVE9NQ0VOVEVSX1NZTSIsIHRleHQ6ICJAYm90dG9tLWNlbnRlciJ9LA0KICAgIHsgbmFtZTogIkJPVFRPTVJJR0hUX1NZTSIsIHRleHQ6ICJAYm90dG9tLXJpZ2h0In0sDQogICAgeyBuYW1lOiAiQk9UVE9NUklHSFRDT1JORVJfU1lNIiwgdGV4dDogIkBib3R0b20tcmlnaHQtY29ybmVyIn0sDQogICAgeyBuYW1lOiAiTEVGVFRPUF9TWU0iLCB0ZXh0OiAiQGxlZnQtdG9wIn0sDQogICAgeyBuYW1lOiAiTEVGVE1JRERMRV9TWU0iLCB0ZXh0OiAiQGxlZnQtbWlkZGxlIn0sDQogICAgeyBuYW1lOiAiTEVGVEJPVFRPTV9TWU0iLCB0ZXh0OiAiQGxlZnQtYm90dG9tIn0sDQogICAgeyBuYW1lOiAiUklHSFRUT1BfU1lNIiwgdGV4dDogIkByaWdodC10b3AifSwNCiAgICB7IG5hbWU6ICJSSUdIVE1JRERMRV9TWU0iLCB0ZXh0OiAiQHJpZ2h0LW1pZGRsZSJ9LA0KICAgIHsgbmFtZTogIlJJR0hUQk9UVE9NX1NZTSIsIHRleHQ6ICJAcmlnaHQtYm90dG9tIn0sDQoNCiAgICAvKg0KICAgICAqIFRoZSBmb2xsb3dpbmcgdG9rZW4gbmFtZXMgYXJlIGRlZmluZWQgaW4gQ1NTMyBNZWRpYSBRdWVyaWVzOiBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLW1lZGlhcXVlcmllcy8jc3ludGF4DQogICAgICovDQogICAgLyp7IG5hbWU6ICJNRURJQV9PTkxZIiwgc3RhdGU6ICJtZWRpYSJ9LA0KICAgIHsgbmFtZTogIk1FRElBX05PVCIsIHN0YXRlOiAibWVkaWEifSwNCiAgICB7IG5hbWU6ICJNRURJQV9BTkQiLCBzdGF0ZTogIm1lZGlhIn0sKi8NCiAgICB7IG5hbWU6ICJSRVNPTFVUSU9OIiwgc3RhdGU6ICJtZWRpYSJ9LA0KDQogICAgLyoNCiAgICAgKiBUaGUgZm9sbG93aW5nIHRva2VuIG5hbWVzIGFyZSBub3QgZGVmaW5lZCBpbiBhbnkgQ1NTIHNwZWNpZmljYXRpb24gYnV0IGFyZSB1c2VkIGJ5IHRoZSBsZXhlci4NCiAgICAgKi8NCiAgICANCiAgICAvL25vdCBhIHJlYWwgdG9rZW4sIGJ1dCB1c2VmdWwgZm9yIHN0dXBpZCBJRSBmaWx0ZXJzDQogICAgeyBuYW1lOiAiSUVfRlVOQ1RJT04iIH0sDQoNCiAgICAvL3BhcnQgb2YgQ1NTMyBncmFtbWFyIGJ1dCBub3QgdGhlIEZsZXggY29kZQ0KICAgIHsgbmFtZTogIkNIQVIiIH0sDQogICAgDQogICAgLy9UT0RPOiBOZWVkZWQ/DQogICAgLy9Ob3QgZGVmaW5lZCBhcyB0b2tlbnMsIGJ1dCBtaWdodCBhcyB3ZWxsIGJlDQogICAgew0KICAgICAgICBuYW1lOiAiUElQRSIsDQogICAgICAgIHRleHQ6ICJ8Ig0KICAgIH0sDQogICAgew0KICAgICAgICBuYW1lOiAiU0xBU0giLA0KICAgICAgICB0ZXh0OiAiLyINCiAgICB9LA0KICAgIHsNCiAgICAgICAgbmFtZTogIk1JTlVTIiwNCiAgICAgICAgdGV4dDogIi0iDQogICAgfSwNCiAgICB7DQogICAgICAgIG5hbWU6ICJTVEFSIiwNCiAgICAgICAgdGV4dDogIioiDQogICAgfSwNCg0KICAgIHsNCiAgICAgICAgbmFtZTogIkxCUkFDRSIsDQogICAgICAgIHRleHQ6ICJ7Ig0KICAgIH0sICAgDQogICAgew0KICAgICAgICBuYW1lOiAiUkJSQUNFIiwNCiAgICAgICAgdGV4dDogIn0iDQogICAgfSwgICAgICANCiAgICB7DQogICAgICAgIG5hbWU6ICJMQlJBQ0tFVCIsDQogICAgICAgIHRleHQ6ICJbIg0KICAgIH0sICAgDQogICAgew0KICAgICAgICBuYW1lOiAiUkJSQUNLRVQiLA0KICAgICAgICB0ZXh0OiAiXSINCiAgICB9LCAgICANCiAgICB7DQogICAgICAgIG5hbWU6ICJFUVVBTFMiLA0KICAgICAgICB0ZXh0OiAiPSINCiAgICB9LA0KICAgIHsNCiAgICAgICAgbmFtZTogIkNPTE9OIiwNCiAgICAgICAgdGV4dDogIjoiDQogICAgfSwgICAgDQogICAgew0KICAgICAgICBuYW1lOiAiU0VNSUNPTE9OIiwNCiAgICAgICAgdGV4dDogIjsiDQogICAgfSwgICAgDQogDQogICAgew0KICAgICAgICBuYW1lOiAiTFBBUkVOIiwNCiAgICAgICAgdGV4dDogIigiDQogICAgfSwgICANCiAgICB7DQogICAgICAgIG5hbWU6ICJSUEFSRU4iLA0KICAgICAgICB0ZXh0OiAiKSINCiAgICB9LCAgICAgDQogICAgew0KICAgICAgICBuYW1lOiAiRE9UIiwNCiAgICAgICAgdGV4dDogIi4iDQogICAgfQ0KXTsNCg0KKGZ1bmN0aW9uKCl7DQoNCiAgICB2YXIgbmFtZU1hcCA9IFtdLA0KICAgICAgICB0eXBlTWFwID0ge307DQogICAgDQogICAgVG9rZW5zLlVOS05PV04gPSAtMTsNCiAgICBUb2tlbnMudW5zaGlmdCh7bmFtZToiRU9GIn0pOw0KICAgIGZvciAodmFyIGk9MCwgbGVuID0gVG9rZW5zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgbmFtZU1hcC5wdXNoKFRva2Vuc1tpXS5uYW1lKTsNCiAgICAgICAgVG9rZW5zW1Rva2Vuc1tpXS5uYW1lXSA9IGk7DQogICAgICAgIGlmIChUb2tlbnNbaV0udGV4dCl7DQogICAgICAgICAgICBpZiAoVG9rZW5zW2ldLnRleHQgaW5zdGFuY2VvZiBBcnJheSl7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqIDwgVG9rZW5zW2ldLnRleHQubGVuZ3RoOyBqKyspew0KICAgICAgICAgICAgICAgICAgICB0eXBlTWFwW1Rva2Vuc1tpXS50ZXh0W2pdXSA9IGk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0eXBlTWFwW1Rva2Vuc1tpXS50ZXh0XSA9IGk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgVG9rZW5zLm5hbWUgPSBmdW5jdGlvbih0dCl7DQogICAgICAgIHJldHVybiBuYW1lTWFwW3R0XTsNCiAgICB9Ow0KICAgIA0KICAgIFRva2Vucy50eXBlID0gZnVuY3Rpb24oYyl7DQogICAgICAgIHJldHVybiB0eXBlTWFwW2NdIHx8IC0xOw0KICAgIH07DQoNCn0pKCk7DQoNCg0KDQoNCg0KcGFyc2VybGliLmNzcyA9IHsNCkNvbG9ycyAgICAgICAgICAgICAgOkNvbG9ycywgICAgDQpDb21iaW5hdG9yICAgICAgICAgIDpDb21iaW5hdG9yLCAgICAgICAgICAgICAgICANClBhcnNlciAgICAgICAgICAgICAgOlBhcnNlciwNClByb3BlcnR5TmFtZSAgICAgICAgOlByb3BlcnR5TmFtZSwNClByb3BlcnR5VmFsdWUgICAgICAgOlByb3BlcnR5VmFsdWUsDQpQcm9wZXJ0eVZhbHVlUGFydCAgIDpQcm9wZXJ0eVZhbHVlUGFydCwNCk1lZGlhRmVhdHVyZSAgICAgICAgOk1lZGlhRmVhdHVyZSwNCk1lZGlhUXVlcnkgICAgICAgICAgOk1lZGlhUXVlcnksDQpTZWxlY3RvciAgICAgICAgICAgIDpTZWxlY3RvciwNClNlbGVjdG9yUGFydCAgICAgICAgOlNlbGVjdG9yUGFydCwNClNlbGVjdG9yU3ViUGFydCAgICAgOlNlbGVjdG9yU3ViUGFydCwNClRva2VuU3RyZWFtICAgICAgICAgOlRva2VuU3RyZWFtLA0KVG9rZW5zICAgICAgICAgICAgICA6VG9rZW5zDQp9Ow0KfSkoKTsNCg0KLyoqDQogKiBNYWluIENTU0xpbnQgb2JqZWN0Lg0KICogQGNsYXNzIENTU0xpbnQNCiAqIEBzdGF0aWMNCiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLkV2ZW50VGFyZ2V0DQogKi8NCnZhciBDU1NMaW50ID0gKGZ1bmN0aW9uKCl7DQoNCiAgICB2YXIgcnVsZXMgICAgICA9IFtdLA0KICAgICAgICBmb3JtYXR0ZXJzID0gW10sDQogICAgICAgIGFwaSAgICAgICAgPSBuZXcgcGFyc2VybGliLnV0aWwuRXZlbnRUYXJnZXQoKTsNCiAgICAgICAgDQogICAgYXBpLnZlcnNpb24gPSAiQFZFUlNJT05AIjsNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vIFJ1bGUgTWFuYWdlbWVudA0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgLyoqDQogICAgICogQWRkcyBhIG5ldyBydWxlIHRvIHRoZSBlbmdpbmUuDQogICAgICogQHBhcmFtIHtPYmplY3R9IHJ1bGUgVGhlIHJ1bGUgdG8gYWRkLg0KICAgICAqIEBtZXRob2QgYWRkUnVsZQ0KICAgICAqLw0KICAgIGFwaS5hZGRSdWxlID0gZnVuY3Rpb24ocnVsZSl7DQogICAgICAgIHJ1bGVzLnB1c2gocnVsZSk7DQogICAgICAgIHJ1bGVzW3J1bGUuaWRdID0gcnVsZTsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogQ2xlYXJzIGFsbCBydWxlIGZyb20gdGhlIGVuZ2luZS4NCiAgICAgKiBAbWV0aG9kIGNsZWFyUnVsZXMNCiAgICAgKi8NCiAgICBhcGkuY2xlYXJSdWxlcyA9IGZ1bmN0aW9uKCl7DQogICAgICAgIHJ1bGVzID0gW107DQogICAgfTsNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vIEZvcm1hdHRlcnMNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgIC8qKg0KICAgICAqIEFkZHMgYSBuZXcgZm9ybWF0dGVyIHRvIHRoZSBlbmdpbmUuDQogICAgICogQHBhcmFtIHtPYmplY3R9IGZvcm1hdHRlciBUaGUgZm9ybWF0dGVyIHRvIGFkZC4NCiAgICAgKiBAbWV0aG9kIGFkZEZvcm1hdHRlcg0KICAgICAqLw0KICAgIGFwaS5hZGRGb3JtYXR0ZXIgPSBmdW5jdGlvbihmb3JtYXR0ZXIpIHsNCiAgICAgICAgLy8gZm9ybWF0dGVycy5wdXNoKGZvcm1hdHRlcik7DQogICAgICAgIGZvcm1hdHRlcnNbZm9ybWF0dGVyLmlkXSA9IGZvcm1hdHRlcjsNCiAgICB9Ow0KICAgIA0KICAgIC8qKg0KICAgICAqIFJldHJpZXZlcyBhIGZvcm1hdHRlciBmb3IgdXNlLg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmb3JtYXRJZCBUaGUgbmFtZSBvZiB0aGUgZm9ybWF0IHRvIHJldHJpZXZlLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGZvcm1hdHRlciBvciB1bmRlZmluZWQuDQogICAgICogQG1ldGhvZCBnZXRGb3JtYXR0ZXINCiAgICAgKi8NCiAgICBhcGkuZ2V0Rm9ybWF0dGVyID0gZnVuY3Rpb24oZm9ybWF0SWQpew0KICAgICAgICByZXR1cm4gZm9ybWF0dGVyc1tmb3JtYXRJZF07DQogICAgfTsNCiAgICANCiAgICAvKioNCiAgICAgKiBGb3JtYXRzIHRoZSByZXN1bHRzIGluIGEgcGFydGljdWxhciBmb3JtYXQgZm9yIGEgc2luZ2xlIGZpbGUuDQogICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3VsdCBUaGUgcmVzdWx0cyByZXR1cm5lZCBmcm9tIENTU0xpbnQudmVyaWZ5KCkuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lIFRoZSBmaWxlbmFtZSBmb3Igd2hpY2ggdGhlIHJlc3VsdHMgYXBwbHkuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IGZvcm1hdElkIFRoZSBuYW1lIG9mIHRoZSBmb3JtYXR0ZXIgdG8gdXNlLg0KICAgICAqIEByZXR1cm4ge1N0cmluZ30gQSBmb3JtYXR0ZWQgc3RyaW5nIGZvciB0aGUgcmVzdWx0cy4NCiAgICAgKiBAbWV0aG9kIGZvcm1hdA0KICAgICAqLw0KICAgIGFwaS5mb3JtYXQgPSBmdW5jdGlvbihyZXN1bHRzLCBmaWxlbmFtZSwgZm9ybWF0SWQpIHsNCiAgICAgICAgdmFyIGZvcm1hdHRlciA9IHRoaXMuZ2V0Rm9ybWF0dGVyKGZvcm1hdElkKSwNCiAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7DQogICAgICAgICAgICANCiAgICAgICAgaWYgKGZvcm1hdHRlcil7DQogICAgICAgICAgICByZXN1bHQgPSBmb3JtYXR0ZXIuc3RhcnRGb3JtYXQoKTsNCiAgICAgICAgICAgIHJlc3VsdCArPSBmb3JtYXR0ZXIuZm9ybWF0UmVzdWx0cyhyZXN1bHRzLCBmaWxlbmFtZSk7DQogICAgICAgICAgICByZXN1bHQgKz0gZm9ybWF0dGVyLmVuZEZvcm1hdCgpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgIH0gICAgDQogICAgDQogICAgLyoqDQogICAgICogSW5kaWNhdGVzIGlmIHRoZSBnaXZlbiBmb3JtYXQgaXMgc3VwcG9ydGVkLg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmb3JtYXRJZCBUaGUgSUQgb2YgdGhlIGZvcm1hdCB0byBjaGVjay4NCiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmb3JtYXQgZXhpc3RzLCBmYWxzZSBpZiBub3QuDQogICAgICogQG1ldGhvZCBoYXNGb3JtYXQNCiAgICAgKi8NCiAgICBhcGkuaGFzRm9ybWF0ID0gZnVuY3Rpb24oZm9ybWF0SWQpew0KICAgICAgICByZXR1cm4gZm9ybWF0dGVycy5oYXNPd25Qcm9wZXJ0eShmb3JtYXRJZCk7DQogICAgfTsNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vIFZlcmlmaWNhdGlvbg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgLyoqDQogICAgICogU3RhcnRzIHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBmb3IgdGhlIGdpdmVuIENTUyB0ZXh0Lg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBDU1MgdGV4dCB0byB2ZXJpZnkuDQogICAgICogQHBhcmFtIHtPYmplY3R9IHJ1bGVzZXQgKE9wdGlvbmFsKSBMaXN0IG9mIHJ1bGVzIHRvIGFwcGx5LiBJZiBudWxsLCB0aGVuDQogICAgICogICAgICBhbGwgcnVsZXMgYXJlIHVzZWQuDQogICAgICogQHJldHVybiB7T2JqZWN0fSBSZXN1bHRzIG9mIHRoZSB2ZXJpZmljYXRpb24uDQogICAgICogQG1ldGhvZCB2ZXJpZnkNCiAgICAgKi8NCiAgICBhcGkudmVyaWZ5ID0gZnVuY3Rpb24odGV4dCwgcnVsZXNldCl7DQoNCiAgICAgICAgdmFyIGkgICAgICAgPSAwLA0KICAgICAgICAgICAgbGVuICAgICA9IHJ1bGVzLmxlbmd0aCwNCiAgICAgICAgICAgIHJlcG9ydGVyLA0KICAgICAgICAgICAgbGluZXMsDQogICAgICAgICAgICBwYXJzZXIgPSBuZXcgcGFyc2VybGliLmNzcy5QYXJzZXIoeyBzdGFySGFjazogdHJ1ZSwgaWVGaWx0ZXJzOiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJzY29yZUhhY2s6IHRydWUsIHN0cmljdDogZmFsc2UgfSk7DQoNCiAgICAgICAgbGluZXMgPSB0ZXh0LnNwbGl0KC9cblxyPy9nKTsNCiAgICAgICAgcmVwb3J0ZXIgPSBuZXcgUmVwb3J0ZXIobGluZXMpOw0KDQogICAgICAgIGlmICghcnVsZXNldCl7DQogICAgICAgICAgICB3aGlsZSAoaSA8IGxlbil7DQogICAgICAgICAgICAgICAgcnVsZXNbaSsrXS5pbml0KHBhcnNlciwgcmVwb3J0ZXIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcnVsZXNldC5lcnJvcnMgPSAxOyAgICAgICAvL2Fsd2F5cyByZXBvcnQgcGFyc2luZyBlcnJvcnMNCiAgICAgICAgICAgIGZvciAoaSBpbiBydWxlc2V0KXsNCiAgICAgICAgICAgICAgICBpZihydWxlc2V0Lmhhc093blByb3BlcnR5KGkpKXsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzW2ldKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLmluaXQocGFyc2VyLCByZXBvcnRlcik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvL2NhcHR1cmUgbW9zdCBob3JyaWJsZSBlcnJvciB0eXBlDQogICAgICAgIHRyeSB7DQogICAgICAgICAgICBwYXJzZXIucGFyc2UodGV4dCk7DQogICAgICAgIH0gY2F0Y2ggKGV4KSB7DQogICAgICAgICAgICByZXBvcnRlci5lcnJvcigiRmF0YWwgZXJyb3IsIGNhbm5vdCBjb250aW51ZTogIiArIGV4Lm1lc3NhZ2UsIGV4LmxpbmUsIGV4LmNvbCk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgbWVzc2FnZXMgICAgOiByZXBvcnRlci5tZXNzYWdlcywNCiAgICAgICAgICAgIHN0YXRzICAgICAgIDogcmVwb3J0ZXIuc3RhdHMNCiAgICAgICAgfTsNCiAgICB9Ow0KDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gUHVibGlzaCB0aGUgQVBJDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICByZXR1cm4gYXBpOw0KDQp9KSgpOw0KLyoqDQogKiBBbiBpbnN0YW5jZSBvZiBSZXBvcnQgaXMgdXNlZCB0byByZXBvcnQgcmVzdWx0cyBvZiB0aGUNCiAqIHZlcmlmaWNhdGlvbiBiYWNrIHRvIHRoZSBtYWluIEFQSS4NCiAqIEBjbGFzcyBSZXBvcnRlcg0KICogQGNvbnN0cnVjdG9yDQogKiBAcGFyYW0ge1N0cmluZ1tdfSBsaW5lcyBUaGUgdGV4dCBsaW5lcyBvZiB0aGUgc291cmNlLg0KICovDQpmdW5jdGlvbiBSZXBvcnRlcihsaW5lcyl7DQoNCiAgICAvKioNCiAgICAgKiBMaXN0IG9mIG1lc3NhZ2VzIGJlaW5nIHJlcG9ydGVkLg0KICAgICAqIEBwcm9wZXJ0eSBtZXNzYWdlcw0KICAgICAqIEB0eXBlIFN0cmluZ1tdDQogICAgICovDQogICAgdGhpcy5tZXNzYWdlcyA9IFtdOw0KDQogICAgLyoqDQogICAgICogTGlzdCBvZiBzdGF0aXN0aWNzIGJlaW5nIHJlcG9ydGVkLg0KICAgICAqIEBwcm9wZXJ0eSBzdGF0cw0KICAgICAqIEB0eXBlIFN0cmluZ1tdDQogICAgICovDQogICAgdGhpcy5zdGF0cyA9IFtdOw0KDQogICAgLyoqDQogICAgICogTGluZXMgb2YgY29kZSBiZWluZyByZXBvcnRlZCBvbi4gVXNlZCB0byBwcm92aWRlIGNvbnRleHR1YWwgaW5mb3JtYXRpb24NCiAgICAgKiBmb3IgbWVzc2FnZXMuDQogICAgICogQHByb3BlcnR5IGxpbmVzDQogICAgICogQHR5cGUgU3RyaW5nW10NCiAgICAgKi8NCiAgICB0aGlzLmxpbmVzID0gbGluZXM7DQp9DQoNClJlcG9ydGVyLnByb3RvdHlwZSA9IHsNCg0KICAgIC8vcmVzdG9yZSBjb25zdHJ1Y3Rvcg0KICAgIGNvbnN0cnVjdG9yOiBSZXBvcnRlciwNCg0KICAgIC8qKg0KICAgICAqIFJlcG9ydCBhbiBlcnJvci4NCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzdG9yZS4NCiAgICAgKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBudW1iZXIuDQogICAgICogQHBhcmFtIHtpbnR9IGNvbCBUaGUgY29sdW1uIG51bWJlci4NCiAgICAgKiBAcGFyYW0ge09iamVjdH0gcnVsZSBUaGUgcnVsZSB0aGlzIG1lc3NhZ2UgcmVsYXRlcyB0by4NCiAgICAgKiBAbWV0aG9kIGVycm9yDQogICAgICovDQogICAgZXJyb3I6IGZ1bmN0aW9uKG1lc3NhZ2UsIGxpbmUsIGNvbCwgcnVsZSl7DQogICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7DQogICAgICAgICAgICB0eXBlICAgIDogImVycm9yIiwNCiAgICAgICAgICAgIGxpbmUgICAgOiBsaW5lLA0KICAgICAgICAgICAgY29sICAgICA6IGNvbCwNCiAgICAgICAgICAgIG1lc3NhZ2UgOiBtZXNzYWdlLA0KICAgICAgICAgICAgZXZpZGVuY2U6IHRoaXMubGluZXNbbGluZS0xXSwNCiAgICAgICAgICAgIHJ1bGUgICAgOiBydWxlDQogICAgICAgIH0pOw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBSZXBvcnQgYW4gd2FybmluZy4NCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzdG9yZS4NCiAgICAgKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBudW1iZXIuDQogICAgICogQHBhcmFtIHtpbnR9IGNvbCBUaGUgY29sdW1uIG51bWJlci4NCiAgICAgKiBAcGFyYW0ge09iamVjdH0gcnVsZSBUaGUgcnVsZSB0aGlzIG1lc3NhZ2UgcmVsYXRlcyB0by4NCiAgICAgKiBAbWV0aG9kIHdhcm4NCiAgICAgKi8NCiAgICB3YXJuOiBmdW5jdGlvbihtZXNzYWdlLCBsaW5lLCBjb2wsIHJ1bGUpew0KICAgICAgICB0aGlzLm1lc3NhZ2VzLnB1c2goew0KICAgICAgICAgICAgdHlwZSAgICA6ICJ3YXJuaW5nIiwNCiAgICAgICAgICAgIGxpbmUgICAgOiBsaW5lLA0KICAgICAgICAgICAgY29sICAgICA6IGNvbCwNCiAgICAgICAgICAgIG1lc3NhZ2UgOiBtZXNzYWdlLA0KICAgICAgICAgICAgZXZpZGVuY2U6IHRoaXMubGluZXNbbGluZS0xXSwNCiAgICAgICAgICAgIHJ1bGUgICAgOiBydWxlDQogICAgICAgIH0pOw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBSZXBvcnQgc29tZSBpbmZvcm1hdGlvbmFsIHRleHQuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gc3RvcmUuDQogICAgICogQHBhcmFtIHtpbnR9IGxpbmUgVGhlIGxpbmUgbnVtYmVyLg0KICAgICAqIEBwYXJhbSB7aW50fSBjb2wgVGhlIGNvbHVtbiBudW1iZXIuDQogICAgICogQHBhcmFtIHtPYmplY3R9IHJ1bGUgVGhlIHJ1bGUgdGhpcyBtZXNzYWdlIHJlbGF0ZXMgdG8uDQogICAgICogQG1ldGhvZCBpbmZvDQogICAgICovDQogICAgaW5mbzogZnVuY3Rpb24obWVzc2FnZSwgbGluZSwgY29sLCBydWxlKXsNCiAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKHsNCiAgICAgICAgICAgIHR5cGUgICAgOiAiaW5mbyIsDQogICAgICAgICAgICBsaW5lICAgIDogbGluZSwNCiAgICAgICAgICAgIGNvbCAgICAgOiBjb2wsDQogICAgICAgICAgICBtZXNzYWdlIDogbWVzc2FnZSwNCiAgICAgICAgICAgIGV2aWRlbmNlOiB0aGlzLmxpbmVzW2xpbmUtMV0sDQogICAgICAgICAgICBydWxlICAgIDogcnVsZQ0KICAgICAgICB9KTsNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUmVwb3J0IHNvbWUgcm9sbHVwIGVycm9yIGluZm9ybWF0aW9uLg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHN0b3JlLg0KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBydWxlIFRoZSBydWxlIHRoaXMgbWVzc2FnZSByZWxhdGVzIHRvLg0KICAgICAqIEBtZXRob2Qgcm9sbHVwRXJyb3INCiAgICAgKi8NCiAgICByb2xsdXBFcnJvcjogZnVuY3Rpb24obWVzc2FnZSwgcnVsZSl7DQogICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7DQogICAgICAgICAgICB0eXBlICAgIDogImVycm9yIiwNCiAgICAgICAgICAgIHJvbGx1cCAgOiB0cnVlLA0KICAgICAgICAgICAgbWVzc2FnZSA6IG1lc3NhZ2UsDQogICAgICAgICAgICBydWxlICAgIDogcnVsZQ0KICAgICAgICB9KTsNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUmVwb3J0IHNvbWUgcm9sbHVwIHdhcm5pbmcgaW5mb3JtYXRpb24uDQogICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gc3RvcmUuDQogICAgICogQHBhcmFtIHtPYmplY3R9IHJ1bGUgVGhlIHJ1bGUgdGhpcyBtZXNzYWdlIHJlbGF0ZXMgdG8uDQogICAgICogQG1ldGhvZCByb2xsdXBXYXJuDQogICAgICovDQogICAgcm9sbHVwV2FybjogZnVuY3Rpb24obWVzc2FnZSwgcnVsZSl7DQogICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7DQogICAgICAgICAgICB0eXBlICAgIDogIndhcm5pbmciLA0KICAgICAgICAgICAgcm9sbHVwICA6IHRydWUsDQogICAgICAgICAgICBtZXNzYWdlIDogbWVzc2FnZSwNCiAgICAgICAgICAgIHJ1bGUgICAgOiBydWxlDQogICAgICAgIH0pOw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBSZXBvcnQgYSBzdGF0aXN0aWMuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN0YXQgdG8gc3RvcmUuDQogICAgICogQHBhcmFtIHtWYXJpYW50fSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHN0YXQuDQogICAgICogQG1ldGhvZCBzdGF0DQogICAgICovDQogICAgc3RhdDogZnVuY3Rpb24obmFtZSwgdmFsdWUpew0KICAgICAgICB0aGlzLnN0YXRzW25hbWVdID0gdmFsdWU7DQogICAgfQ0KfTsNCi8qDQogKiBVdGlsaXR5IGZ1bmN0aW9ucyB0aGF0IG1ha2UgbGlmZSBlYXNpZXIuDQogKi8NCg0KLyoNCiAqIEFkZHMgYWxsIHByb3BlcnRpZXMgZnJvbSBzdXBwbGllciBvbnRvIHJlY2VpdmVyLA0KICogb3ZlcndyaXRpbmcgaWYgdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBvbg0KICogcmVjaWV2ZXIuDQogKiBAcGFyYW0ge09iamVjdH0gVGhlIG9iamVjdCB0byByZWNlaXZlIHRoZSBwcm9wZXJ0aWVzLg0KICogQHBhcmFtIHtPYmplY3R9IFRoZSBvYmplY3QgdG8gcHJvdmlkZSB0aGUgcHJvcGVydGllcy4NCiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHJlY2VpdmVyDQogKi8NCmZ1bmN0aW9uIG1peChyZWNpZXZlciwgc3VwcGxpZXIpew0KICAgIHZhciBwcm9wOw0KDQogICAgZm9yIChwcm9wIGluIHN1cHBsaWVyKXsNCiAgICAgICAgaWYgKHN1cHBsaWVyLmhhc093blByb3BlcnR5KHByb3ApKXsNCiAgICAgICAgICAgIHJlY2VpdmVyW3Byb3BdID0gc3VwcGxpZXJbcHJvcF07DQogICAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4gcHJvcDsNCn0NCg0KLyoNCiAqIFBvbHlmaWxsIGZvciBhcnJheSBpbmRleE9mKCkgbWV0aG9kLg0KICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBhcnJheSB0byBzZWFyY2guDQogKiBAcGFyYW0ge1ZhcmlhbnR9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLg0KICogQHJldHVybiB7aW50fSBUaGUgaW5kZXggb2YgdGhlIHZhbHVlIGlmIGZvdW5kLCAtMSBpZiBub3QuDQogKi8NCmZ1bmN0aW9uIGluZGV4T2YodmFsdWVzLCB2YWx1ZSl7DQogICAgaWYgKHZhbHVlcy5pbmRleE9mKXsNCiAgICAgICAgcmV0dXJuIHZhbHVlcy5pbmRleE9mKHZhbHVlKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICBmb3IgKHZhciBpPTAsIGxlbj12YWx1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgaWYgKHZhbHVlc1tpXSA9PT0gdmFsdWUpew0KICAgICAgICAgICAgICAgIHJldHVybiBpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQp9DQovKg0KICogUnVsZTogRG9uJ3QgdXNlIGFkam9pbmluZyBjbGFzc2VzICguZm9vLmJhcikuDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogImFkam9pbmluZy1jbGFzc2VzIiwNCiAgICBuYW1lOiAiQWRqb2luaW5nIENsYXNzZXMiLA0KICAgIGRlc2M6ICJEb24ndCB1c2UgYWRqb2luaW5nIGNsYXNzZXMuIiwNCiAgICBicm93c2VyczogIklFNiIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpczsNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXZlbnQuc2VsZWN0b3JzLA0KICAgICAgICAgICAgICAgIHNlbGVjdG9yLA0KICAgICAgICAgICAgICAgIHBhcnQsDQogICAgICAgICAgICAgICAgbW9kaWZpZXIsDQogICAgICAgICAgICAgICAgY2xhc3NDb3VudCwNCiAgICAgICAgICAgICAgICBpLCBqLCBrOw0KDQogICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHNlbGVjdG9ycy5sZW5ndGg7IGkrKyl7DQogICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvcnNbaV07DQogICAgICAgICAgICAgICAgZm9yIChqPTA7IGogPCBzZWxlY3Rvci5wYXJ0cy5sZW5ndGg7IGorKyl7DQogICAgICAgICAgICAgICAgICAgIHBhcnQgPSBzZWxlY3Rvci5wYXJ0c1tqXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBwYXJzZXJsaWIuY3NzLlNlbGVjdG9yUGFydCl7DQogICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0NvdW50ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrIDwgcGFydC5tb2RpZmllcnMubGVuZ3RoOyBrKyspew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyID0gcGFydC5tb2RpZmllcnNba107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVyLnR5cGUgPT0gImNsYXNzIil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzQ291bnQrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzQ291bnQgPiAxKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiRG9uJ3QgdXNlIGFkam9pbmluZyBjbGFzc2VzLiIsIHBhcnQubGluZSwgcGFydC5jb2wsIHJ1bGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBEb24ndCB1c2Ugd2lkdGggb3IgaGVpZ2h0IHdoZW4gdXNpbmcgcGFkZGluZyBvciBib3JkZXIuIA0KICovDQpDU1NMaW50LmFkZFJ1bGUoew0KDQogICAgLy9ydWxlIGluZm9ybWF0aW9uDQogICAgaWQ6ICJib3gtbW9kZWwiLA0KICAgIG5hbWU6ICJCb3ggTW9kZWwiLA0KICAgIGRlc2M6ICJEb24ndCB1c2Ugd2lkdGggb3IgaGVpZ2h0IHdoZW4gdXNpbmcgcGFkZGluZyBvciBib3JkZXIuIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpcywNCiAgICAgICAgICAgIHdpZHRoUHJvcGVydGllcyA9IHsNCiAgICAgICAgICAgICAgICBib3JkZXI6IDEsDQogICAgICAgICAgICAgICAgImJvcmRlci1sZWZ0IjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXJpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICBwYWRkaW5nOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nLWxlZnQiOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nLXJpZ2h0IjogMQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGhlaWdodFByb3BlcnRpZXMgPSB7DQogICAgICAgICAgICAgICAgYm9yZGVyOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItYm90dG9tIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXRvcCI6IDEsDQogICAgICAgICAgICAgICAgcGFkZGluZzogMSwNCiAgICAgICAgICAgICAgICAicGFkZGluZy1ib3R0b20iOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nLXRvcCI6IDENCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBwcm9wZXJ0aWVzOw0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRydWxlIiwgZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIHByb3BlcnRpZXMgPSB7DQogICAgICAgICAgICB9Ow0KICAgICAgICB9KTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgdmFyIG5hbWUgPSBldmVudC5wcm9wZXJ0eS50ZXh0LnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmIChoZWlnaHRQcm9wZXJ0aWVzW25hbWVdIHx8IHdpZHRoUHJvcGVydGllc1tuYW1lXSl7DQogICAgICAgICAgICAgICAgaWYgKCEvXjBcUyokLy50ZXN0KGV2ZW50LnZhbHVlKSAmJiAhKG5hbWUgPT0gImJvcmRlciIgJiYgZXZlbnQudmFsdWUgPT0gIm5vbmUiKSl7DQogICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbbmFtZV0gPSB7IGxpbmU6IGV2ZW50LnByb3BlcnR5LmxpbmUsIGNvbDogZXZlbnQucHJvcGVydHkuY29sLCB2YWx1ZTogZXZlbnQudmFsdWUgfTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGlmIChuYW1lID09ICJ3aWR0aCIgfHwgbmFtZSA9PSAiaGVpZ2h0Iil7DQogICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbbmFtZV0gPSAxOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICB9KTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoImVuZHJ1bGUiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgdmFyIHByb3A7DQogICAgICAgICAgICBpZiAocHJvcGVydGllc1siaGVpZ2h0Il0pew0KICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBoZWlnaHRQcm9wZXJ0aWVzKXsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGhlaWdodFByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgcHJvcGVydGllc1twcm9wXSl7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgLy9zcGVjaWFsIGNhc2UgZm9yIHBhZGRpbmcNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09ICJwYWRkaW5nIiAmJiBwcm9wZXJ0aWVzW3Byb3BdLnZhbHVlLnBhcnRzLmxlbmd0aCA9PSAyICYmIHByb3BlcnRpZXNbcHJvcF0udmFsdWUucGFydHNbMF0udmFsdWUgPT0gMCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ub29wDQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIkJyb2tlbiBib3ggbW9kZWw6IHVzaW5nIGhlaWdodCB3aXRoICIgKyBwcm9wICsgIi4iLCBwcm9wZXJ0aWVzW3Byb3BdLmxpbmUsIHByb3BlcnRpZXNbcHJvcF0uY29sLCBydWxlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNbIndpZHRoIl0pew0KICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiB3aWR0aFByb3BlcnRpZXMpew0KICAgICAgICAgICAgICAgICAgICBpZiAod2lkdGhQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHByb3ApICYmIHByb3BlcnRpZXNbcHJvcF0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PSAicGFkZGluZyIgJiYgcHJvcGVydGllc1twcm9wXS52YWx1ZS5wYXJ0cy5sZW5ndGggPT0gMiAmJiBwcm9wZXJ0aWVzW3Byb3BdLnZhbHVlLnBhcnRzWzFdLnZhbHVlID09IDApew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbm9vcA0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlci53YXJuKCJCcm9rZW4gYm94IG1vZGVsOiB1c2luZyB3aWR0aCB3aXRoICIgKyBwcm9wICsgIi4iLCBwcm9wZXJ0aWVzW3Byb3BdLmxpbmUsIHByb3BlcnRpZXNbcHJvcF0uY29sLCBydWxlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9KTsNCiAgICB9DQoNCn0pOw0KLyoNCiAqIFJ1bGU6IEluY2x1ZGUgYWxsIGNvbXBhdGlibGUgdmVuZG9yIHByZWZpeGVzIHRvIHJlYWNoIGEgd2lkZXINCiAqIHJhbmdlIG9mIHVzZXJzLg0KICovDQovKmdsb2JhbCBDU1NMaW50Ki8gDQpDU1NMaW50LmFkZFJ1bGUoew0KDQogICAgLy9ydWxlIGluZm9ybWF0aW9uDQogICAgaWQ6ICJjb21wYXRpYmxlLXZlbmRvci1wcmVmaXhlcyIsDQogICAgbmFtZTogIkNvbXBhdGlibGUgVmVuZG9yIFByZWZpeGVzIiwNCiAgICBkZXNjOiAiSW5jbHVkZSBhbGwgY29tcGF0aWJsZSB2ZW5kb3IgcHJlZml4ZXMgdG8gcmVhY2ggYSB3aWRlciByYW5nZSBvZiB1c2Vycy4iLA0KICAgIGJyb3dzZXJzOiAiQWxsIiwNCg0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbiAocGFyc2VyLCByZXBvcnRlcikgew0KICAgICAgICB2YXIgcnVsZSA9IHRoaXMsDQogICAgICAgICAgICBjb21wYXRpYmxlUHJlZml4ZXMsDQogICAgICAgICAgICBwcm9wZXJ0aWVzLA0KICAgICAgICAgICAgcHJvcCwNCiAgICAgICAgICAgIHZhcmlhdGlvbnMsDQogICAgICAgICAgICBwcmVmaXhlZCwNCiAgICAgICAgICAgIGksDQogICAgICAgICAgICBsZW4sDQogICAgICAgICAgICBhcnJheVB1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaCwNCiAgICAgICAgICAgIGFwcGx5VG8gPSBbXTsNCg0KICAgICAgICAvLyBTZWUgaHR0cDovL3BldGVyLnNoL2V4cGVyaW1lbnRzL3ZlbmRvci1wcmVmaXhlZC1jc3MtcHJvcGVydHktb3ZlcnZpZXcvIGZvciBkZXRhaWxzDQogICAgICAgIGNvbXBhdGlibGVQcmVmaXhlcyA9IHsNCiAgICAgICAgICAgICJhbmltYXRpb24iICAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiYW5pbWF0aW9uLWRlbGF5IiAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImFuaW1hdGlvbi1kaXJlY3Rpb24iICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJhbmltYXRpb24tZHVyYXRpb24iICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiYW5pbWF0aW9uLWZpbGwtbW9kZSIgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQiICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJhbmltYXRpb24tbmFtZSIgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiYW5pbWF0aW9uLXBsYXktc3RhdGUiICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb24iICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJhcHBlYXJhbmNlIiAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiYm9yZGVyLWVuZCIgICAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImJvcmRlci1lbmQtY29sb3IiICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJib3JkZXItZW5kLXN0eWxlIiAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiYm9yZGVyLWVuZC13aWR0aCIgICAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImJvcmRlci1pbWFnZSIgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG8iLA0KICAgICAgICAgICAgImJvcmRlci1yYWRpdXMiICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJib3JkZXItc3RhcnQiICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiYm9yZGVyLXN0YXJ0LWNvbG9yIiAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImJvcmRlci1zdGFydC1zdHlsZSIgICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJib3JkZXItc3RhcnQtd2lkdGgiICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiYm94LWFsaWduIiAgICAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3ogbXMiLA0KICAgICAgICAgICAgImJveC1kaXJlY3Rpb24iICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG1zIiwNCiAgICAgICAgICAgICJib3gtZmxleCIgICAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiBtcyIsDQogICAgICAgICAgICAiYm94LWxpbmVzIiAgICAgICAgICAgICAgICAgIDogIndlYmtpdCBtcyIsDQogICAgICAgICAgICAiYm94LW9yZGluYWwtZ3JvdXAiICAgICAgICAgIDogIndlYmtpdCBtb3ogbXMiLA0KICAgICAgICAgICAgImJveC1vcmllbnQiICAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG1zIiwNCiAgICAgICAgICAgICJib3gtcGFjayIgICAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiBtcyIsDQogICAgICAgICAgICAiYm94LXNpemluZyIgICAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImJveC1zaGFkb3ciICAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJjb2x1bW4tY291bnQiICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiY29sdW1uLWdhcCIgICAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImNvbHVtbi1ydWxlIiAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJjb2x1bW4tcnVsZS1jb2xvciIgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiY29sdW1uLXJ1bGUtc3R5bGUiICAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImNvbHVtbi1ydWxlLXdpZHRoIiAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJjb2x1bW4td2lkdGgiICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiaHlwaGVucyIgICAgICAgICAgICAgICAgICAgIDogImVwdWIgbW96IiwNCiAgICAgICAgICAgICJsaW5lLWJyZWFrIiAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1zIiwNCiAgICAgICAgICAgICJtYXJnaW4tZW5kIiAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAibWFyZ2luLXN0YXJ0IiAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgIm1hcnF1ZWUtc3BlZWQiICAgICAgICAgICAgICA6ICJ3ZWJraXQgd2FwIiwNCiAgICAgICAgICAgICJtYXJxdWVlLXN0eWxlIiAgICAgICAgICAgICAgOiAid2Via2l0IHdhcCIsDQogICAgICAgICAgICAicGFkZGluZy1lbmQiICAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgInBhZGRpbmctc3RhcnQiICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJ0YWItc2l6ZSIgICAgICAgICAgICAgICAgICAgOiAibW96IG8iLA0KICAgICAgICAgICAgInRleHQtc2l6ZS1hZGp1c3QiICAgICAgICAgICA6ICJ3ZWJraXQgbXMiLA0KICAgICAgICAgICAgInRyYW5zZm9ybSIgICAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG1zIG8iLA0KICAgICAgICAgICAgInRyYW5zZm9ybS1vcmlnaW4iICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG1zIG8iLA0KICAgICAgICAgICAgInRyYW5zaXRpb24iICAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG8iLA0KICAgICAgICAgICAgInRyYW5zaXRpb24tZGVsYXkiICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG8iLA0KICAgICAgICAgICAgInRyYW5zaXRpb24tZHVyYXRpb24iICAgICAgICA6ICJ3ZWJraXQgbW96IG8iLA0KICAgICAgICAgICAgInRyYW5zaXRpb24tcHJvcGVydHkiICAgICAgICA6ICJ3ZWJraXQgbW96IG8iLA0KICAgICAgICAgICAgInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIiA6ICJ3ZWJraXQgbW96IG8iLA0KICAgICAgICAgICAgInVzZXItbW9kaWZ5IiAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJ1c2VyLXNlbGVjdCIgICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAid29yZC1icmVhayIgICAgICAgICAgICAgICAgIDogImVwdWIgbXMiLA0KICAgICAgICAgICAgIndyaXRpbmctbW9kZSIgICAgICAgICAgICAgICA6ICJlcHViIG1zIg0KICAgICAgICB9Ow0KDQogICAgICAgIGZvciAocHJvcCBpbiBjb21wYXRpYmxlUHJlZml4ZXMpIHsNCiAgICAgICAgICAgIGlmIChjb21wYXRpYmxlUHJlZml4ZXMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsNCiAgICAgICAgICAgICAgICB2YXJpYXRpb25zID0gW107DQogICAgICAgICAgICAgICAgcHJlZml4ZWQgPSBjb21wYXRpYmxlUHJlZml4ZXNbcHJvcF0uc3BsaXQoJyAnKTsNCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBwcmVmaXhlZC5sZW5ndGg7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAgICAgICAgICAgICB2YXJpYXRpb25zLnB1c2goJy0nICsgcHJlZml4ZWRbaV0gKyAnLScgKyBwcm9wKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY29tcGF0aWJsZVByZWZpeGVzW3Byb3BdID0gdmFyaWF0aW9uczsNCiAgICAgICAgICAgICAgICBhcnJheVB1c2guYXBwbHkoYXBwbHlUbywgdmFyaWF0aW9ucyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBwcm9wZXJ0aWVzID0gW107DQogICAgICAgIH0pOw0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigicHJvcGVydHkiLCBmdW5jdGlvbiAoZXZlbnQpIHsNCiAgICAgICAgICAgIHZhciBuYW1lID0gZXZlbnQucHJvcGVydHkudGV4dDsNCiAgICAgICAgICAgIGlmIChhcHBseVRvLmluZGV4T2YobmFtZSkgPiAtMSkgew0KICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaChuYW1lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQoNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJlbmRydWxlIiwgZnVuY3Rpb24gKGV2ZW50KSB7DQogICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgcHJvcGVydHlHcm91cHMgPSB7fSwNCiAgICAgICAgICAgICAgICBpLA0KICAgICAgICAgICAgICAgIGxlbiwNCiAgICAgICAgICAgICAgICBuYW1lLA0KICAgICAgICAgICAgICAgIHByb3AsDQogICAgICAgICAgICAgICAgdmFyaWF0aW9ucywNCiAgICAgICAgICAgICAgICB2YWx1ZSwNCiAgICAgICAgICAgICAgICBmdWxsLA0KICAgICAgICAgICAgICAgIGFjdHVhbCwNCiAgICAgICAgICAgICAgICBpdGVtLA0KICAgICAgICAgICAgICAgIHByb3BlcnRpZXNTcGVjaWZpZWQ7DQoNCiAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHByb3BlcnRpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsNCiAgICAgICAgICAgICAgICBuYW1lID0gcHJvcGVydGllc1tpXTsNCg0KICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBjb21wYXRpYmxlUHJlZml4ZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhdGlibGVQcmVmaXhlcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWF0aW9ucyA9IGNvbXBhdGlibGVQcmVmaXhlc1twcm9wXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYXRpb25zLmluZGV4T2YobmFtZSkgPiAtMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUdyb3Vwc1twcm9wXSA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5R3JvdXBzW3Byb3BdID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbCA6IHZhcmlhdGlvbnMuc2xpY2UoMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwgOiBbXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlHcm91cHNbcHJvcF0uYWN0dWFsLmluZGV4T2YobmFtZSkgPT09IC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5R3JvdXBzW3Byb3BdLmFjdHVhbC5wdXNoKG5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZm9yIChwcm9wIGluIHByb3BlcnR5R3JvdXBzKSB7DQogICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5R3JvdXBzLmhhc093blByb3BlcnR5KHByb3ApKSB7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlHcm91cHNbcHJvcF07DQogICAgICAgICAgICAgICAgICAgIGZ1bGwgPSB2YWx1ZS5mdWxsOw0KICAgICAgICAgICAgICAgICAgICBhY3R1YWwgPSB2YWx1ZS5hY3R1YWw7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGwubGVuZ3RoID4gYWN0dWFsLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gZnVsbC5sZW5ndGg7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBmdWxsW2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWwuaW5kZXhPZihpdGVtKSA9PT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc1NwZWNpZmllZCA9IChhY3R1YWwubGVuZ3RoID09PSAxKSA/IGFjdHVhbFswXSA6IChhY3R1YWwubGVuZ3RoID09IDIpID8gYWN0dWFsLmpvaW4oIiBhbmQgIikgOiBhY3R1YWwuam9pbigiLCAiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiVGhlIHByb3BlcnR5ICIgKyBpdGVtICsgIiBpcyBjb21wYXRpYmxlIHdpdGggIiArIHByb3BlcnRpZXNTcGVjaWZpZWQgKyAiIGFuZCBzaG91bGQgYmUgaW5jbHVkZWQgYXMgd2VsbC4iLCBldmVudC5zZWxlY3RvcnNbMF0ubGluZSwgZXZlbnQuc2VsZWN0b3JzWzBdLmNvbCwgcnVsZSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQp9KTsNCi8qDQogKiBSdWxlOiBDZXJ0YWluIHByb3BlcnRpZXMgZG9uJ3QgcGxheSB3ZWxsIHdpdGggY2VydGFpbiBkaXNwbGF5IHZhbHVlcy4gDQogKiAtIGZsb2F0IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGlubGluZS1ibG9jaw0KICogLSBoZWlnaHQsIHdpZHRoLCBtYXJnaW4tdG9wLCBtYXJnaW4tYm90dG9tLCBmbG9hdCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBpbmxpbmUNCiAqIC0gdmVydGljYWwtYWxpZ24gc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggYmxvY2sNCiAqIC0gbWFyZ2luLCBmbG9hdCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCB0YWJsZS0qDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogImRpc3BsYXktcHJvcGVydHktZ3JvdXBpbmciLA0KICAgIG5hbWU6ICJEaXNwbGF5IFByb3BlcnR5IEdyb3VwaW5nIiwNCiAgICBkZXNjOiAiQ2VydGFpbiBwcm9wZXJ0aWVzIHNob3VsZG4ndCBiZSB1c2VkIHdpdGggY2VydGFpbiBkaXNwbGF5IHByb3BlcnR5IHZhbHVlcy4iLA0KICAgIGJyb3dzZXJzOiAiQWxsIiwNCg0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsNCiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzOw0KDQogICAgICAgIHZhciBwcm9wZXJ0aWVzVG9DaGVjayA9IHsNCiAgICAgICAgICAgICAgICBkaXNwbGF5OiAxLA0KICAgICAgICAgICAgICAgICJmbG9hdCI6ICJub25lIiwNCiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEsDQogICAgICAgICAgICAgICAgd2lkdGg6IDEsDQogICAgICAgICAgICAgICAgbWFyZ2luOiAxLA0KICAgICAgICAgICAgICAgICJtYXJnaW4tbGVmdCI6IDEsDQogICAgICAgICAgICAgICAgIm1hcmdpbi1yaWdodCI6IDEsDQogICAgICAgICAgICAgICAgIm1hcmdpbi1ib3R0b20iOiAxLA0KICAgICAgICAgICAgICAgICJtYXJnaW4tdG9wIjogMSwNCiAgICAgICAgICAgICAgICBwYWRkaW5nOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nLWxlZnQiOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nLXJpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICAicGFkZGluZy1ib3R0b20iOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nLXRvcCI6IDEsDQogICAgICAgICAgICAgICAgInZlcnRpY2FsLWFsaWduIjogMQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHByb3BlcnRpZXM7DQoNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgcHJvcGVydGllcyA9IHt9Ow0KICAgICAgICB9KTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgdmFyIG5hbWUgPSBldmVudC5wcm9wZXJ0eS50ZXh0LnRvTG93ZXJDYXNlKCk7DQoNCiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzVG9DaGVja1tuYW1lXSl7DQogICAgICAgICAgICAgICAgcHJvcGVydGllc1tuYW1lXSA9IHsgdmFsdWU6IGV2ZW50LnZhbHVlLnRleHQsIGxpbmU6IGV2ZW50LnByb3BlcnR5LmxpbmUsIGNvbDogZXZlbnQucHJvcGVydHkuY29sIH07ICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQoNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJlbmRydWxlIiwgZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgdmFyIGRpc3BsYXkgPSBwcm9wZXJ0aWVzLmRpc3BsYXkgPyBwcm9wZXJ0aWVzLmRpc3BsYXkudmFsdWUgOiBudWxsOw0KICAgICAgICAgICAgaWYgKGRpc3BsYXkpew0KICAgICAgICAgICAgICAgIHN3aXRjaChkaXNwbGF5KXsNCg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJpbmxpbmUiOg0KICAgICAgICAgICAgICAgICAgICAgICAgLy9oZWlnaHQsIHdpZHRoLCBtYXJnaW4tdG9wLCBtYXJnaW4tYm90dG9tLCBmbG9hdCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBpbmxpbmUNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb3BlcnR5KCJoZWlnaHQiLCBkaXNwbGF5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb3BlcnR5KCJ3aWR0aCIsIGRpc3BsYXkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvcGVydHkoIm1hcmdpbiIsIGRpc3BsYXkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvcGVydHkoIm1hcmdpbi10b3AiLCBkaXNwbGF5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb3BlcnR5KCJtYXJnaW4tYm90dG9tIiwgZGlzcGxheSk7ICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb3BlcnR5KCJmbG9hdCIsIGRpc3BsYXksICJkaXNwbGF5OmlubGluZSBoYXMgbm8gZWZmZWN0IG9uIGZsb2F0ZWQgZWxlbWVudHMgKGJ1dCBtYXkgYmUgdXNlZCB0byBmaXggdGhlIElFNiBkb3VibGUtbWFyZ2luIGJ1ZykuIik7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJibG9jayI6DQogICAgICAgICAgICAgICAgICAgICAgICAvL3ZlcnRpY2FsLWFsaWduIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGJsb2NrDQogICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRQcm9wZXJ0eSgidmVydGljYWwtYWxpZ24iLCBkaXNwbGF5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgICAgIGNhc2UgImlubGluZS1ibG9jayI6DQogICAgICAgICAgICAgICAgICAgICAgICAvL2Zsb2F0IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGlubGluZS1ibG9jaw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvcGVydHkoImZsb2F0IiwgZGlzcGxheSk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgLy9tYXJnaW4sIGZsb2F0IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIHRhYmxlDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcGxheS5pbmRleE9mKCJ0YWJsZS0iKSA9PSAwKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRQcm9wZXJ0eSgibWFyZ2luIiwgZGlzcGxheSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvcGVydHkoIm1hcmdpbi1sZWZ0IiwgZGlzcGxheSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvcGVydHkoIm1hcmdpbi1yaWdodCIsIGRpc3BsYXkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb3BlcnR5KCJtYXJnaW4tdG9wIiwgZGlzcGxheSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvcGVydHkoIm1hcmdpbi1ib3R0b20iLCBkaXNwbGF5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRQcm9wZXJ0eSgiZmxvYXQiLCBkaXNwbGF5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgLy9vdGhlcndpc2UgZG8gbm90aGluZw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICANCiAgICAgICAgfSk7DQoNCg0KICAgICAgICBmdW5jdGlvbiByZXBvcnRQcm9wZXJ0eShuYW1lLCBkaXNwbGF5LCBtc2cpew0KICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNbbmFtZV0pew0KICAgICAgICAgICAgICAgIGlmICghKHR5cGVvZiBwcm9wZXJ0aWVzVG9DaGVja1tuYW1lXSA9PSAic3RyaW5nIikgfHwgcHJvcGVydGllc1tuYW1lXS52YWx1ZS50b0xvd2VyQ2FzZSgpICE9IHByb3BlcnRpZXNUb0NoZWNrW25hbWVdKXsNCiAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2Fybihtc2cgfHwgbmFtZSArICIgY2FuJ3QgYmUgdXNlZCB3aXRoIGRpc3BsYXk6ICIgKyBkaXNwbGF5ICsgIi4iLCBwcm9wZXJ0aWVzW25hbWVdLmxpbmUsIHByb3BlcnRpZXNbbmFtZV0uY29sLCBydWxlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCn0pOw0KLyoNCiAqIFJ1bGU6IER1cGxpY2F0ZSBwcm9wZXJ0aWVzIG11c3QgYXBwZWFyIG9uZSBhZnRlciB0aGUgb3RoZXIuIElmIGFuIGFscmVhZHktZGVmaW5lZA0KICogcHJvcGVydHkgYXBwZWFycyBzb21ld2hlcmUgZWxzZSBpbiB0aGUgcnVsZSwgdGhlbiBpdCdzIGxpa2VseSBhbiBlcnJvci4NCiAqLw0KQ1NTTGludC5hZGRSdWxlKHsNCg0KICAgIC8vcnVsZSBpbmZvcm1hdGlvbg0KICAgIGlkOiAiZHVwbGljYXRlLXByb3BlcnRpZXMiLA0KICAgIG5hbWU6ICJEdXBsaWNhdGUgUHJvcGVydGllcyIsDQogICAgZGVzYzogIkR1cGxpY2F0ZSBwcm9wZXJ0aWVzIG11c3QgYXBwZWFyIG9uZSBhZnRlciB0aGUgb3RoZXIuIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpcywNCiAgICAgICAgICAgIHByb3BlcnRpZXMsDQogICAgICAgICAgICBsYXN0UHJvcGVydHk7ICAgICAgICAgICAgDQogICAgICAgICAgICANCiAgICAgICAgZnVuY3Rpb24gc3RhcnRSdWxlKGV2ZW50KXsNCiAgICAgICAgICAgIHByb3BlcnRpZXMgPSB7fTsgICAgICAgIA0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInN0YXJ0cnVsZSIsIHN0YXJ0UnVsZSk7DQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRmb250ZmFjZSIsIHN0YXJ0UnVsZSk7DQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRwYWdlIiwgc3RhcnRSdWxlKTsNCiAgICAgICAgDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigicHJvcGVydHkiLCBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBldmVudC5wcm9wZXJ0eSwNCiAgICAgICAgICAgICAgICBuYW1lID0gcHJvcGVydHkudGV4dC50b0xvd2VyQ2FzZSgpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAocHJvcGVydGllc1tuYW1lXSAmJiAobGFzdFByb3BlcnR5ICE9IG5hbWUgfHwgcHJvcGVydGllc1tuYW1lXSA9PSBldmVudC52YWx1ZS50ZXh0KSl7DQogICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiRHVwbGljYXRlIHByb3BlcnR5ICciICsgZXZlbnQucHJvcGVydHkgKyAiJyBmb3VuZC4iLCBldmVudC5saW5lLCBldmVudC5jb2wsIHJ1bGUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcm9wZXJ0aWVzW25hbWVdID0gZXZlbnQudmFsdWUudGV4dDsNCiAgICAgICAgICAgIGxhc3RQcm9wZXJ0eSA9IG5hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgfSk7DQogICAgICAgICAgICANCiAgICAgICAgDQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBTdHlsZSBydWxlcyB3aXRob3V0IGFueSBwcm9wZXJ0aWVzIGRlZmluZWQgc2hvdWxkIGJlIHJlbW92ZWQuDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogImVtcHR5LXJ1bGVzIiwNCiAgICBuYW1lOiAiRW1wdHkgUnVsZXMiLA0KICAgIGRlc2M6ICJSdWxlcyB3aXRob3V0IGFueSBwcm9wZXJ0aWVzIHNwZWNpZmllZCBzaG91bGQgYmUgcmVtb3ZlZC4iLA0KICAgIGJyb3dzZXJzOiAiQWxsIiwNCg0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsNCiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzLA0KICAgICAgICAgICAgY291bnQgPSAwOw0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRydWxlIiwgZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIGNvdW50PTA7DQogICAgICAgIH0pOw0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigicHJvcGVydHkiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgY291bnQrKzsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJlbmRydWxlIiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV2ZW50LnNlbGVjdG9yczsNCiAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKXsNCiAgICAgICAgICAgICAgICByZXBvcnRlci53YXJuKCJSdWxlIGlzIGVtcHR5LiIsIHNlbGVjdG9yc1swXS5saW5lLCBzZWxlY3RvcnNbMF0uY29sLCBydWxlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBUaGVyZSBzaG91bGQgYmUgbm8gc3ludGF4IGVycm9ycy4gKER1aC4pDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogImVycm9ycyIsDQogICAgbmFtZTogIlBhcnNpbmcgRXJyb3JzIiwNCiAgICBkZXNjOiAiVGhpcyBydWxlIGxvb2tzIGZvciByZWNvdmVyYWJsZSBzeW50YXggZXJyb3JzLiIsDQogICAgYnJvd3NlcnM6ICJBbGwiLA0KDQogICAgLy9pbml0aWFsaXphdGlvbg0KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpew0KICAgICAgICB2YXIgcnVsZSA9IHRoaXM7DQoNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJlcnJvciIsIGZ1bmN0aW9uKGV2ZW50KXsNCiAgICAgICAgICAgIHJlcG9ydGVyLmVycm9yKGV2ZW50Lm1lc3NhZ2UsIGV2ZW50LmxpbmUsIGV2ZW50LmNvbCwgcnVsZSk7DQogICAgICAgIH0pOw0KDQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBZb3Ugc2hvdWxkbid0IHVzZSBtb3JlIHRoYW4gMTAgZmxvYXRzLiBJZiB5b3UgZG8sIHRoZXJlJ3MgcHJvYmFibHkNCiAqIHJvb20gZm9yIHNvbWUgYWJzdHJhY3Rpb24uDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogImZsb2F0cyIsDQogICAgbmFtZTogIkZsb2F0cyIsDQogICAgZGVzYzogIlRoaXMgcnVsZSB0ZXN0cyBpZiB0aGUgZmxvYXQgcHJvcGVydHkgaXMgdXNlZCB0b28gbWFueSB0aW1lcyIsDQogICAgYnJvd3NlcnM6ICJBbGwiLA0KDQogICAgLy9pbml0aWFsaXphdGlvbg0KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpew0KICAgICAgICB2YXIgcnVsZSA9IHRoaXM7DQogICAgICAgIHZhciBjb3VudCA9IDA7DQoNCiAgICAgICAgLy9jb3VudCBob3cgbWFueSB0aW1lcyAiZmxvYXQiIGlzIHVzZWQNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJwcm9wZXJ0eSIsIGZ1bmN0aW9uKGV2ZW50KXsNCiAgICAgICAgICAgIGlmIChldmVudC5wcm9wZXJ0eS50ZXh0LnRvTG93ZXJDYXNlKCkgPT0gImZsb2F0IiAmJg0KICAgICAgICAgICAgICAgICAgICBldmVudC52YWx1ZS50ZXh0LnRvTG93ZXJDYXNlKCkgIT0gIm5vbmUiKXsNCiAgICAgICAgICAgICAgICBjb3VudCsrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICAvL3JlcG9ydCB0aGUgcmVzdWx0cw0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoImVuZHN0eWxlc2hlZXQiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgcmVwb3J0ZXIuc3RhdCgiZmxvYXRzIiwgY291bnQpOw0KICAgICAgICAgICAgaWYgKGNvdW50ID49IDEwKXsNCiAgICAgICAgICAgICAgICByZXBvcnRlci5yb2xsdXBXYXJuKCJUb28gbWFueSBmbG9hdHMgKCIgKyBjb3VudCArICIpLCB5b3UncmUgcHJvYmFibHkgdXNpbmcgdGhlbSBmb3IgbGF5b3V0LiBDb25zaWRlciB1c2luZyBhIGdyaWQgc3lzdGVtIGluc3RlYWQuIiwgcnVsZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCg0KfSk7DQovKg0KICogUnVsZTogQXZvaWQgdG9vIG1hbnkgQGZvbnQtZmFjZSBkZWNsYXJhdGlvbnMgaW4gdGhlIHNhbWUgc3R5bGVzaGVldC4NCiAqLw0KQ1NTTGludC5hZGRSdWxlKHsNCg0KICAgIC8vcnVsZSBpbmZvcm1hdGlvbg0KICAgIGlkOiAiZm9udC1mYWNlcyIsDQogICAgbmFtZTogIkZvbnQgRmFjZXMiLA0KICAgIGRlc2M6ICJUb28gbWFueSBkaWZmZXJlbnQgd2ViIGZvbnRzIGluIHRoZSBzYW1lIHN0eWxlc2hlZXQuIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpcywNCiAgICAgICAgICAgIGNvdW50ID0gMDsNCg0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRmb250ZmFjZSIsIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICBjb3VudCsrOw0KICAgICAgICB9KTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoImVuZHN0eWxlc2hlZXQiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgaWYgKGNvdW50ID4gNSl7DQogICAgICAgICAgICAgICAgcmVwb3J0ZXIucm9sbHVwV2FybigiVG9vIG1hbnkgQGZvbnQtZmFjZSBkZWNsYXJhdGlvbnMgKCIgKyBjb3VudCArICIpLiIsIHJ1bGUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQoNCn0pOw0KLyoNCiAqIFJ1bGU6IFlvdSBzaG91bGRuJ3QgbmVlZCBtb3JlIHRoYW4gOSBmb250LXNpemUgZGVjbGFyYXRpb25zLg0KICovDQoNCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogImZvbnQtc2l6ZXMiLA0KICAgIG5hbWU6ICJGb250IFNpemVzIiwNCiAgICBkZXNjOiAiQ2hlY2tzIHRoZSBudW1iZXIgb2YgZm9udC1zaXplIGRlY2xhcmF0aW9ucy4iLA0KICAgIGJyb3dzZXJzOiAiQWxsIiwNCg0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsNCiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzLA0KICAgICAgICAgICAgY291bnQgPSAwOw0KDQogICAgICAgIC8vY2hlY2sgZm9yIHVzZSBvZiAiZm9udC1zaXplIg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgaWYgKGV2ZW50LnByb3BlcnR5ID09ICJmb250LXNpemUiKXsNCiAgICAgICAgICAgICAgICBjb3VudCsrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICAvL3JlcG9ydCB0aGUgcmVzdWx0cw0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoImVuZHN0eWxlc2hlZXQiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgcmVwb3J0ZXIuc3RhdCgiZm9udC1zaXplcyIsIGNvdW50KTsNCiAgICAgICAgICAgIGlmIChjb3VudCA+PSAxMCl7DQogICAgICAgICAgICAgICAgcmVwb3J0ZXIucm9sbHVwV2FybigiVG9vIG1hbnkgZm9udC1zaXplIGRlY2xhcmF0aW9ucyAoIiArIGNvdW50ICsgIiksIGFic3RyYWN0aW9uIG5lZWRlZC4iLCBydWxlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBXaGVuIHVzaW5nIGEgdmVuZG9yLXByZWZpeGVkIGdyYWRpZW50LCBtYWtlIHN1cmUgdG8gdXNlIHRoZW0gYWxsLg0KICovDQpDU1NMaW50LmFkZFJ1bGUoew0KDQogICAgLy9ydWxlIGluZm9ybWF0aW9uDQogICAgaWQ6ICJncmFkaWVudHMiLA0KICAgIG5hbWU6ICJHcmFkaWVudHMiLA0KICAgIGRlc2M6ICJXaGVuIHVzaW5nIGEgdmVuZG9yLXByZWZpeGVkIGdyYWRpZW50LCBtYWtlIHN1cmUgdG8gdXNlIHRoZW0gYWxsLiIsDQogICAgYnJvd3NlcnM6ICJBbGwiLA0KDQogICAgLy9pbml0aWFsaXphdGlvbg0KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpew0KICAgICAgICB2YXIgcnVsZSA9IHRoaXMsDQogICAgICAgICAgICBncmFkaWVudHM7DQoNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgZ3JhZGllbnRzID0gew0KICAgICAgICAgICAgICAgIG1vejogMCwNCiAgICAgICAgICAgICAgICB3ZWJraXQ6IDAsDQogICAgICAgICAgICAgICAgbXM6IDAsDQogICAgICAgICAgICAgICAgbzogMA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJwcm9wZXJ0eSIsIGZ1bmN0aW9uKGV2ZW50KXsNCg0KICAgICAgICAgICAgaWYgKC9cLShtb3p8bXN8b3x3ZWJraXQpKD86XC0oPzpsaW5lYXJ8cmFkaWFsKSlcLWdyYWRpZW50Ly50ZXN0KGV2ZW50LnZhbHVlKSl7DQogICAgICAgICAgICAgICAgZ3JhZGllbnRzW1JlZ0V4cC4kMV0gPSAxOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH0pOw0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigiZW5kcnVsZSIsIGZ1bmN0aW9uKGV2ZW50KXsNCiAgICAgICAgICAgIHZhciBtaXNzaW5nID0gW107DQoNCiAgICAgICAgICAgIGlmICghZ3JhZGllbnRzLm1veil7DQogICAgICAgICAgICAgICAgbWlzc2luZy5wdXNoKCJGaXJlZm94IDMuNisiKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKCFncmFkaWVudHMud2Via2l0KXsNCiAgICAgICAgICAgICAgICBtaXNzaW5nLnB1c2goIldlYmtpdCAoU2FmYXJpLCBDaHJvbWUpIik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICghZ3JhZGllbnRzLm1zKXsNCiAgICAgICAgICAgICAgICBtaXNzaW5nLnB1c2goIkludGVybmV0IEV4cGxvcmVyIDEwKyIpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoIWdyYWRpZW50cy5vKXsNCiAgICAgICAgICAgICAgICBtaXNzaW5nLnB1c2goIk9wZXJhIDExLjErIik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCAmJiBtaXNzaW5nLmxlbmd0aCA8IDQpeyAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIk1pc3NpbmcgdmVuZG9yLXByZWZpeGVkIENTUyBncmFkaWVudHMgZm9yICIgKyBtaXNzaW5nLmpvaW4oIiwgIikgKyAiLiIsIGV2ZW50LnNlbGVjdG9yc1swXS5saW5lLCBldmVudC5zZWxlY3RvcnNbMF0uY29sLCBydWxlKTsgDQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSk7DQoNCiAgICB9DQoNCn0pOw0KLyoNCiAqIFJ1bGU6IERvbid0IHVzZSBJRHMgZm9yIHNlbGVjdG9ycy4NCiAqLw0KQ1NTTGludC5hZGRSdWxlKHsNCg0KICAgIC8vcnVsZSBpbmZvcm1hdGlvbg0KICAgIGlkOiAiaWRzIiwNCiAgICBuYW1lOiAiSURzIiwNCiAgICBkZXNjOiAiU2VsZWN0b3JzIHNob3VsZCBub3QgY29udGFpbiBJRHMuIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpczsNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXZlbnQuc2VsZWN0b3JzLA0KICAgICAgICAgICAgICAgIHNlbGVjdG9yLA0KICAgICAgICAgICAgICAgIHBhcnQsDQogICAgICAgICAgICAgICAgbW9kaWZpZXIsDQogICAgICAgICAgICAgICAgaWRDb3VudCwNCiAgICAgICAgICAgICAgICBpLCBqLCBrOw0KDQogICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHNlbGVjdG9ycy5sZW5ndGg7IGkrKyl7DQogICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvcnNbaV07DQogICAgICAgICAgICAgICAgaWRDb3VudCA9IDA7DQoNCiAgICAgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IHNlbGVjdG9yLnBhcnRzLmxlbmd0aDsgaisrKXsNCiAgICAgICAgICAgICAgICAgICAgcGFydCA9IHNlbGVjdG9yLnBhcnRzW2pdOw0KICAgICAgICAgICAgICAgICAgICBpZiAocGFydCBpbnN0YW5jZW9mIHBhcnNlcmxpYi5jc3MuU2VsZWN0b3JQYXJ0KXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrIDwgcGFydC5tb2RpZmllcnMubGVuZ3RoOyBrKyspew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyID0gcGFydC5tb2RpZmllcnNba107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVyLnR5cGUgPT0gImlkIil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkQ291bnQrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoaWRDb3VudCA9PSAxKXsNCiAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiRG9uJ3QgdXNlIElEcyBpbiBzZWxlY3RvcnMuIiwgc2VsZWN0b3IubGluZSwgc2VsZWN0b3IuY29sLCBydWxlKTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlkQ291bnQgPiAxKXsNCiAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybihpZENvdW50ICsgIiBJRHMgaW4gdGhlIHNlbGVjdG9yLCByZWFsbHk/Iiwgc2VsZWN0b3IubGluZSwgc2VsZWN0b3IuY29sLCBydWxlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSk7DQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBEb24ndCB1c2UgQGltcG9ydCwgdXNlIDxsaW5rPiBpbnN0ZWFkLg0KICovDQpDU1NMaW50LmFkZFJ1bGUoew0KDQogICAgLy9ydWxlIGluZm9ybWF0aW9uDQogICAgaWQ6ICJpbXBvcnQiLA0KICAgIG5hbWU6ICJAaW1wb3J0IiwNCiAgICBkZXNjOiAiRG9uJ3QgdXNlIEBpbXBvcnQsIHVzZSA8bGluaz4gaW5zdGVhZC4iLA0KICAgIGJyb3dzZXJzOiAiQWxsIiwNCg0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsNCiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzOw0KICAgICAgICANCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJpbXBvcnQiLCBmdW5jdGlvbihldmVudCl7ICAgICAgICANCiAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIkBpbXBvcnQgcHJldmVudHMgcGFyYWxsZWwgZG93bmxvYWRzLCB1c2UgPGxpbms+IGluc3RlYWQuIiwgZXZlbnQubGluZSwgZXZlbnQuY29sLCBydWxlKTsNCiAgICAgICAgfSk7DQoNCiAgICB9DQoNCn0pOw0KLyoNCiAqIFJ1bGU6IE1ha2Ugc3VyZSAhaW1wb3J0YW50IGlzIG5vdCBvdmVydXNlZCwgdGhpcyBjb3VsZCBsZWFkIHRvIHNwZWNpZmljaXR5DQogKiB3YXIuIERpc3BsYXkgYSB3YXJuaW5nIG9uICFpbXBvcnRhbnQgZGVjbGFyYXRpb25zLCBhbiBlcnJvciBpZiBpdCdzDQogKiB1c2VkIG1vcmUgYXQgbGVhc3QgMTAgdGltZXMuDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogImltcG9ydGFudCIsDQogICAgbmFtZTogIkltcG9ydGFudCIsDQogICAgZGVzYzogIkJlIGNhcmVmdWwgd2hlbiB1c2luZyAhaW1wb3J0YW50IGRlY2xhcmF0aW9uIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpcywNCiAgICAgICAgICAgIGNvdW50ID0gMDsNCg0KICAgICAgICAvL3dhcm4gdGhhdCBpbXBvcnRhbnQgaXMgdXNlZCBhbmQgaW5jcmVtZW50IHRoZSBkZWNsYXJhdGlvbiBjb3VudGVyDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigicHJvcGVydHkiLCBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICBpZiAoZXZlbnQuaW1wb3J0YW50ID09PSB0cnVlKXsNCiAgICAgICAgICAgICAgICBjb3VudCsrOw0KICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIlVzZSBvZiAhaW1wb3J0YW50IiwgZXZlbnQubGluZSwgZXZlbnQuY29sLCBydWxlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQoNCiAgICAgICAgLy9pZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDEwLCBzaG93IGFuIGVycm9yDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigiZW5kc3R5bGVzaGVldCIsIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICByZXBvcnRlci5zdGF0KCJpbXBvcnRhbnQiLCBjb3VudCk7DQogICAgICAgICAgICBpZiAoY291bnQgPj0gMTApew0KICAgICAgICAgICAgICAgIHJlcG9ydGVyLnJvbGx1cFdhcm4oIlRvbyBtYW55ICFpbXBvcnRhbnQgZGVjbGFyYXRpb25zICgiICsgY291bnQgKyAiKSwgdHJ5IHRvIHVzZSBsZXNzIHRoYW4gMTAgdG8gYXZvaWQgc3BlY2lmaXR5IGlzc3Vlcy4iLCBydWxlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBQcm9wZXJ0aWVzIHNob3VsZCBiZSBrbm93biAobGlzdGVkIGluIENTUzMgc3BlY2lmaWNhdGlvbikgb3INCiAqIGJlIGEgdmVuZG9yLXByZWZpeGVkIHByb3BlcnR5Lg0KICovDQpDU1NMaW50LmFkZFJ1bGUoew0KDQogICAgLy9ydWxlIGluZm9ybWF0aW9uDQogICAgaWQ6ICJrbm93bi1wcm9wZXJ0aWVzIiwNCiAgICBuYW1lOiAiS25vd24gUHJvcGVydGllcyIsDQogICAgZGVzYzogIlByb3BlcnRpZXMgc2hvdWxkIGJlIGtub3duIChsaXN0ZWQgaW4gQ1NTIHNwZWNpZmljYXRpb24pIG9yIGJlIGEgdmVuZG9yLXByZWZpeGVkIHByb3BlcnR5LiIsDQogICAgYnJvd3NlcnM6ICJBbGwiLA0KDQogICAgLy9pbml0aWFsaXphdGlvbg0KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpew0KICAgICAgICB2YXIgcnVsZSA9IHRoaXMsDQogICAgICAgICAgICBwcm9wZXJ0aWVzID0gew0KDQogICAgICAgICAgICAgICAgImFsaWdubWVudC1hZGp1c3QiOiAxLA0KICAgICAgICAgICAgICAgICJhbGlnbm1lbnQtYmFzZWxpbmUiOiAxLA0KICAgICAgICAgICAgICAgICJhbmltYXRpb24iOiAxLA0KICAgICAgICAgICAgICAgICJhbmltYXRpb24tZGVsYXkiOiAxLA0KICAgICAgICAgICAgICAgICJhbmltYXRpb24tZGlyZWN0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAiYW5pbWF0aW9uLWR1cmF0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAiYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCI6IDEsDQogICAgICAgICAgICAgICAgImFuaW1hdGlvbi1uYW1lIjogMSwNCiAgICAgICAgICAgICAgICAiYW5pbWF0aW9uLXBsYXktc3RhdGUiOiAxLA0KICAgICAgICAgICAgICAgICJhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAiYXBwZWFyYW5jZSI6IDEsDQogICAgICAgICAgICAgICAgImF6aW11dGgiOiAxLA0KICAgICAgICAgICAgICAgICJiYWNrZmFjZS12aXNpYmlsaXR5IjogMSwNCiAgICAgICAgICAgICAgICAiYmFja2dyb3VuZCI6IDEsDQogICAgICAgICAgICAgICAgImJhY2tncm91bmQtYXR0YWNobWVudCI6IDEsDQogICAgICAgICAgICAgICAgImJhY2tncm91bmQtYnJlYWsiOiAxLA0KICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kLWNsaXAiOiAxLA0KICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kLWNvbG9yIjogMSwNCiAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1pbWFnZSI6IDEsDQogICAgICAgICAgICAgICAgImJhY2tncm91bmQtb3JpZ2luIjogMSwNCiAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1wb3NpdGlvbiI6IDEsDQogICAgICAgICAgICAgICAgImJhY2tncm91bmQtcmVwZWF0IjogMSwNCiAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1zaXplIjogMSwNCiAgICAgICAgICAgICAgICAiYmFzZWxpbmUtc2hpZnQiOiAxLA0KICAgICAgICAgICAgICAgICJiaW5kaW5nIjogMSwNCiAgICAgICAgICAgICAgICAiYmxlZWQiOiAxLA0KICAgICAgICAgICAgICAgICJib29rbWFyay1sYWJlbCI6IDEsDQogICAgICAgICAgICAgICAgImJvb2ttYXJrLWxldmVsIjogMSwNCiAgICAgICAgICAgICAgICAiYm9va21hcmstc3RhdGUiOiAxLA0KICAgICAgICAgICAgICAgICJib29rbWFyay10YXJnZXQiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXIiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItYm90dG9tIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLWJvdHRvbS1jb2xvciI6IDEsDQogICAgICAgICAgICAgICAgImJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cyI6IDEsDQogICAgICAgICAgICAgICAgImJvcmRlci1ib3R0b20tc3R5bGUiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItYm90dG9tLXdpZHRoIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLWNvbGxhcHNlIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLWNvbG9yIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLWltYWdlIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLWltYWdlLW91dHNldCI6IDEsDQogICAgICAgICAgICAgICAgImJvcmRlci1pbWFnZS1yZXBlYXQiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItaW1hZ2Utc2xpY2UiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItaW1hZ2Utc291cmNlIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLWltYWdlLXdpZHRoIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLWxlZnQiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItbGVmdC1jb2xvciI6IDEsDQogICAgICAgICAgICAgICAgImJvcmRlci1sZWZ0LXN0eWxlIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLWxlZnQtd2lkdGgiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItcmFkaXVzIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXJpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXJpZ2h0LWNvbG9yIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXJpZ2h0LXN0eWxlIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXJpZ2h0LXdpZHRoIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXNwYWNpbmciOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItc3R5bGUiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItdG9wIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXRvcC1jb2xvciI6IDEsDQogICAgICAgICAgICAgICAgImJvcmRlci10b3AtbGVmdC1yYWRpdXMiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItdG9wLXJpZ2h0LXJhZGl1cyI6IDEsDQogICAgICAgICAgICAgICAgImJvcmRlci10b3Atc3R5bGUiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItdG9wLXdpZHRoIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXdpZHRoIjogMSwNCiAgICAgICAgICAgICAgICAiYm90dG9tIjogMSwgDQogICAgICAgICAgICAgICAgImJveC1hbGlnbiI6IDEsDQogICAgICAgICAgICAgICAgImJveC1kZWNvcmF0aW9uLWJyZWFrIjogMSwNCiAgICAgICAgICAgICAgICAiYm94LWRpcmVjdGlvbiI6IDEsDQogICAgICAgICAgICAgICAgImJveC1mbGV4IjogMSwNCiAgICAgICAgICAgICAgICAiYm94LWZsZXgtZ3JvdXAiOiAxLA0KICAgICAgICAgICAgICAgICJib3gtbGluZXMiOiAxLA0KICAgICAgICAgICAgICAgICJib3gtb3JkaW5hbC1ncm91cCI6IDEsDQogICAgICAgICAgICAgICAgImJveC1vcmllbnQiOiAxLA0KICAgICAgICAgICAgICAgICJib3gtcGFjayI6IDEsDQogICAgICAgICAgICAgICAgImJveC1zaGFkb3ciOiAxLA0KICAgICAgICAgICAgICAgICJib3gtc2l6aW5nIjogMSwNCiAgICAgICAgICAgICAgICAiYnJlYWstYWZ0ZXIiOiAxLA0KICAgICAgICAgICAgICAgICJicmVhay1iZWZvcmUiOiAxLA0KICAgICAgICAgICAgICAgICJicmVhay1pbnNpZGUiOiAxLA0KICAgICAgICAgICAgICAgICJjYXB0aW9uLXNpZGUiOiAxLA0KICAgICAgICAgICAgICAgICJjbGVhciI6IDEsDQogICAgICAgICAgICAgICAgImNsaXAiOiAxLA0KICAgICAgICAgICAgICAgICJjb2xvciI6IDEsDQogICAgICAgICAgICAgICAgImNvbG9yLXByb2ZpbGUiOiAxLA0KICAgICAgICAgICAgICAgICJjb2x1bW4tY291bnQiOiAxLA0KICAgICAgICAgICAgICAgICJjb2x1bW4tZmlsbCI6IDEsDQogICAgICAgICAgICAgICAgImNvbHVtbi1nYXAiOiAxLA0KICAgICAgICAgICAgICAgICJjb2x1bW4tcnVsZSI6IDEsDQogICAgICAgICAgICAgICAgImNvbHVtbi1ydWxlLWNvbG9yIjogMSwNCiAgICAgICAgICAgICAgICAiY29sdW1uLXJ1bGUtc3R5bGUiOiAxLA0KICAgICAgICAgICAgICAgICJjb2x1bW4tcnVsZS13aWR0aCI6IDEsDQogICAgICAgICAgICAgICAgImNvbHVtbi1zcGFuIjogMSwNCiAgICAgICAgICAgICAgICAiY29sdW1uLXdpZHRoIjogMSwNCiAgICAgICAgICAgICAgICAiY29sdW1ucyI6IDEsDQogICAgICAgICAgICAgICAgImNvbnRlbnQiOiAxLA0KICAgICAgICAgICAgICAgICJjb3VudGVyLWluY3JlbWVudCI6IDEsDQogICAgICAgICAgICAgICAgImNvdW50ZXItcmVzZXQiOiAxLA0KICAgICAgICAgICAgICAgICJjcm9wIjogMSwNCiAgICAgICAgICAgICAgICAiY3VlIjogMSwNCiAgICAgICAgICAgICAgICAiY3VlLWFmdGVyIjogMSwNCiAgICAgICAgICAgICAgICAiY3VlLWJlZm9yZSI6IDEsDQogICAgICAgICAgICAgICAgImN1cnNvciI6IDEsDQogICAgICAgICAgICAgICAgImRpcmVjdGlvbiI6IDEsDQogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAxLA0KICAgICAgICAgICAgICAgICJkb21pbmFudC1iYXNlbGluZSI6IDEsDQogICAgICAgICAgICAgICAgImRyb3AtaW5pdGlhbC1hZnRlci1hZGp1c3QiOiAxLA0KICAgICAgICAgICAgICAgICJkcm9wLWluaXRpYWwtYWZ0ZXItYWxpZ24iOiAxLA0KICAgICAgICAgICAgICAgICJkcm9wLWluaXRpYWwtYmVmb3JlLWFkanVzdCI6IDEsDQogICAgICAgICAgICAgICAgImRyb3AtaW5pdGlhbC1iZWZvcmUtYWxpZ24iOiAxLA0KICAgICAgICAgICAgICAgICJkcm9wLWluaXRpYWwtc2l6ZSI6IDEsDQogICAgICAgICAgICAgICAgImRyb3AtaW5pdGlhbC12YWx1ZSI6IDEsDQogICAgICAgICAgICAgICAgImVsZXZhdGlvbiI6IDEsDQogICAgICAgICAgICAgICAgImVtcHR5LWNlbGxzIjogMSwNCiAgICAgICAgICAgICAgICAiZml0IjogMSwNCiAgICAgICAgICAgICAgICAiZml0LXBvc2l0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAiZmxvYXQiOiAxLCAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiZmxvYXQtb2Zmc2V0IjogMSwNCiAgICAgICAgICAgICAgICAiZm9udCI6IDEsDQogICAgICAgICAgICAgICAgImZvbnQtZmFtaWx5IjogMSwNCiAgICAgICAgICAgICAgICAiZm9udC1zaXplIjogMSwNCiAgICAgICAgICAgICAgICAiZm9udC1zaXplLWFkanVzdCI6IDEsDQogICAgICAgICAgICAgICAgImZvbnQtc3RyZXRjaCI6IDEsDQogICAgICAgICAgICAgICAgImZvbnQtc3R5bGUiOiAxLA0KICAgICAgICAgICAgICAgICJmb250LXZhcmlhbnQiOiAxLA0KICAgICAgICAgICAgICAgICJmb250LXdlaWdodCI6IDEsDQogICAgICAgICAgICAgICAgImdyaWQtY29sdW1ucyI6IDEsDQogICAgICAgICAgICAgICAgImdyaWQtcm93cyI6IDEsDQogICAgICAgICAgICAgICAgImhhbmdpbmctcHVuY3R1YXRpb24iOiAxLA0KICAgICAgICAgICAgICAgICJoZWlnaHQiOiAxLA0KICAgICAgICAgICAgICAgICJoeXBoZW5hdGUtYWZ0ZXIiOiAxLA0KICAgICAgICAgICAgICAgICJoeXBoZW5hdGUtYmVmb3JlIjogMSwNCiAgICAgICAgICAgICAgICAiaHlwaGVuYXRlLWNoYXJhY3RlciI6IDEsDQogICAgICAgICAgICAgICAgImh5cGhlbmF0ZS1saW5lcyI6IDEsDQogICAgICAgICAgICAgICAgImh5cGhlbmF0ZS1yZXNvdXJjZSI6IDEsDQogICAgICAgICAgICAgICAgImh5cGhlbnMiOiAxLA0KICAgICAgICAgICAgICAgICJpY29uIjogMSwNCiAgICAgICAgICAgICAgICAiaW1hZ2Utb3JpZW50YXRpb24iOiAxLA0KICAgICAgICAgICAgICAgICJpbWFnZS1yZW5kZXJpbmciOiAxLA0KICAgICAgICAgICAgICAgICJpbWFnZS1yZXNvbHV0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAiaW5saW5lLWJveC1hbGlnbiI6IDEsDQogICAgICAgICAgICAgICAgImxlZnQiOiAxLA0KICAgICAgICAgICAgICAgICJsZXR0ZXItc3BhY2luZyI6IDEsDQogICAgICAgICAgICAgICAgImxpbmUtaGVpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICAibGluZS1zdGFja2luZyI6IDEsDQogICAgICAgICAgICAgICAgImxpbmUtc3RhY2tpbmctcnVieSI6IDEsDQogICAgICAgICAgICAgICAgImxpbmUtc3RhY2tpbmctc2hpZnQiOiAxLA0KICAgICAgICAgICAgICAgICJsaW5lLXN0YWNraW5nLXN0cmF0ZWd5IjogMSwNCiAgICAgICAgICAgICAgICAibGlzdC1zdHlsZSI6IDEsDQogICAgICAgICAgICAgICAgImxpc3Qtc3R5bGUtaW1hZ2UiOiAxLA0KICAgICAgICAgICAgICAgICJsaXN0LXN0eWxlLXBvc2l0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAibGlzdC1zdHlsZS10eXBlIjogMSwNCiAgICAgICAgICAgICAgICAibWFyZ2luIjogMSwNCiAgICAgICAgICAgICAgICAibWFyZ2luLWJvdHRvbSI6IDEsDQogICAgICAgICAgICAgICAgIm1hcmdpbi1sZWZ0IjogMSwNCiAgICAgICAgICAgICAgICAibWFyZ2luLXJpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICAibWFyZ2luLXRvcCI6IDEsDQogICAgICAgICAgICAgICAgIm1hcmsiOiAxLA0KICAgICAgICAgICAgICAgICJtYXJrLWFmdGVyIjogMSwNCiAgICAgICAgICAgICAgICAibWFyay1iZWZvcmUiOiAxLA0KICAgICAgICAgICAgICAgICJtYXJrcyI6IDEsDQogICAgICAgICAgICAgICAgIm1hcnF1ZWUtZGlyZWN0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAibWFycXVlZS1wbGF5LWNvdW50IjogMSwNCiAgICAgICAgICAgICAgICAibWFycXVlZS1zcGVlZCI6IDEsDQogICAgICAgICAgICAgICAgIm1hcnF1ZWUtc3R5bGUiOiAxLA0KICAgICAgICAgICAgICAgICJtYXgtaGVpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICAibWF4LXdpZHRoIjogMSwNCiAgICAgICAgICAgICAgICAibWluLWhlaWdodCI6IDEsDQogICAgICAgICAgICAgICAgIm1pbi13aWR0aCI6IDEsDQogICAgICAgICAgICAgICAgIm1vdmUtdG8iOiAxLA0KICAgICAgICAgICAgICAgICJuYXYtZG93biI6IDEsDQogICAgICAgICAgICAgICAgIm5hdi1pbmRleCI6IDEsDQogICAgICAgICAgICAgICAgIm5hdi1sZWZ0IjogMSwNCiAgICAgICAgICAgICAgICAibmF2LXJpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICAibmF2LXVwIjogMSwNCiAgICAgICAgICAgICAgICAib3BhY2l0eSI6IDEsDQogICAgICAgICAgICAgICAgIm9ycGhhbnMiOiAxLA0KICAgICAgICAgICAgICAgICJvdXRsaW5lIjogMSwNCiAgICAgICAgICAgICAgICAib3V0bGluZS1jb2xvciI6IDEsDQogICAgICAgICAgICAgICAgIm91dGxpbmUtb2Zmc2V0IjogMSwNCiAgICAgICAgICAgICAgICAib3V0bGluZS1zdHlsZSI6IDEsDQogICAgICAgICAgICAgICAgIm91dGxpbmUtd2lkdGgiOiAxLA0KICAgICAgICAgICAgICAgICJvdmVyZmxvdyI6IDEsDQogICAgICAgICAgICAgICAgIm92ZXJmbG93LXN0eWxlIjogMSwNCiAgICAgICAgICAgICAgICAib3ZlcmZsb3cteCI6IDEsDQogICAgICAgICAgICAgICAgIm92ZXJmbG93LXkiOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nIjogMSwNCiAgICAgICAgICAgICAgICAicGFkZGluZy1ib3R0b20iOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nLWxlZnQiOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nLXJpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICAicGFkZGluZy10b3AiOiAxLA0KICAgICAgICAgICAgICAgICJwYWdlIjogMSwNCiAgICAgICAgICAgICAgICAicGFnZS1icmVhay1hZnRlciI6IDEsDQogICAgICAgICAgICAgICAgInBhZ2UtYnJlYWstYmVmb3JlIjogMSwNCiAgICAgICAgICAgICAgICAicGFnZS1icmVhay1pbnNpZGUiOiAxLA0KICAgICAgICAgICAgICAgICJwYWdlLXBvbGljeSI6IDEsDQogICAgICAgICAgICAgICAgInBhdXNlIjogMSwNCiAgICAgICAgICAgICAgICAicGF1c2UtYWZ0ZXIiOiAxLA0KICAgICAgICAgICAgICAgICJwYXVzZS1iZWZvcmUiOiAxLA0KICAgICAgICAgICAgICAgICJwZXJzcGVjdGl2ZSI6IDEsDQogICAgICAgICAgICAgICAgInBlcnNwZWN0aXZlLW9yaWdpbiI6IDEsDQogICAgICAgICAgICAgICAgInBob25lbWVzIjogMSwNCiAgICAgICAgICAgICAgICAicGl0Y2giOiAxLA0KICAgICAgICAgICAgICAgICJwaXRjaC1yYW5nZSI6IDEsDQogICAgICAgICAgICAgICAgInBsYXktZHVyaW5nIjogMSwNCiAgICAgICAgICAgICAgICAicG9zaXRpb24iOiAxLA0KICAgICAgICAgICAgICAgICJwcmVzZW50YXRpb24tbGV2ZWwiOiAxLA0KICAgICAgICAgICAgICAgICJwdW5jdHVhdGlvbi10cmltIjogMSwNCiAgICAgICAgICAgICAgICAicXVvdGVzIjogMSwNCiAgICAgICAgICAgICAgICAicmVuZGVyaW5nLWludGVudCI6IDEsDQogICAgICAgICAgICAgICAgInJlc2l6ZSI6IDEsDQogICAgICAgICAgICAgICAgInJlc3QiOiAxLA0KICAgICAgICAgICAgICAgICJyZXN0LWFmdGVyIjogMSwNCiAgICAgICAgICAgICAgICAicmVzdC1iZWZvcmUiOiAxLA0KICAgICAgICAgICAgICAgICJyaWNobmVzcyI6IDEsDQogICAgICAgICAgICAgICAgInJpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICAicm90YXRpb24iOiAxLA0KICAgICAgICAgICAgICAgICJyb3RhdGlvbi1wb2ludCI6IDEsDQogICAgICAgICAgICAgICAgInJ1YnktYWxpZ24iOiAxLA0KICAgICAgICAgICAgICAgICJydWJ5LW92ZXJoYW5nIjogMSwNCiAgICAgICAgICAgICAgICAicnVieS1wb3NpdGlvbiI6IDEsDQogICAgICAgICAgICAgICAgInJ1Ynktc3BhbiI6IDEsDQogICAgICAgICAgICAgICAgInNpemUiOiAxLA0KICAgICAgICAgICAgICAgICJzcGVhayI6IDEsDQogICAgICAgICAgICAgICAgInNwZWFrLWhlYWRlciI6IDEsDQogICAgICAgICAgICAgICAgInNwZWFrLW51bWVyYWwiOiAxLA0KICAgICAgICAgICAgICAgICJzcGVhay1wdW5jdHVhdGlvbiI6IDEsDQogICAgICAgICAgICAgICAgInNwZWVjaC1yYXRlIjogMSwNCiAgICAgICAgICAgICAgICAic3RyZXNzIjogMSwNCiAgICAgICAgICAgICAgICAic3RyaW5nLXNldCI6IDEsDQogICAgICAgICAgICAgICAgInRhYmxlLWxheW91dCI6IDEsDQogICAgICAgICAgICAgICAgInRhcmdldCI6IDEsDQogICAgICAgICAgICAgICAgInRhcmdldC1uYW1lIjogMSwNCiAgICAgICAgICAgICAgICAidGFyZ2V0LW5ldyI6IDEsDQogICAgICAgICAgICAgICAgInRhcmdldC1wb3NpdGlvbiI6IDEsDQogICAgICAgICAgICAgICAgInRleHQtYWxpZ24iOiAxLA0KICAgICAgICAgICAgICAgICJ0ZXh0LWFsaWduLWxhc3QiOiAxLA0KICAgICAgICAgICAgICAgICJ0ZXh0LWRlY29yYXRpb24iOiAxLA0KICAgICAgICAgICAgICAgICJ0ZXh0LWVtcGhhc2lzIjogMSwNCiAgICAgICAgICAgICAgICAidGV4dC1oZWlnaHQiOiAxLA0KICAgICAgICAgICAgICAgICJ0ZXh0LWluZGVudCI6IDEsDQogICAgICAgICAgICAgICAgInRleHQtanVzdGlmeSI6IDEsDQogICAgICAgICAgICAgICAgInRleHQtb3V0bGluZSI6IDEsDQogICAgICAgICAgICAgICAgInRleHQtc2hhZG93IjogMSwNCiAgICAgICAgICAgICAgICAidGV4dC10cmFuc2Zvcm0iOiAxLA0KICAgICAgICAgICAgICAgICJ0ZXh0LXdyYXAiOiAxLA0KICAgICAgICAgICAgICAgICJ0b3AiOiAxLA0KICAgICAgICAgICAgICAgICJ0cmFuc2Zvcm0iOiAxLA0KICAgICAgICAgICAgICAgICJ0cmFuc2Zvcm0tb3JpZ2luIjogMSwNCiAgICAgICAgICAgICAgICAidHJhbnNmb3JtLXN0eWxlIjogMSwNCiAgICAgICAgICAgICAgICAidHJhbnNpdGlvbiI6IDEsDQogICAgICAgICAgICAgICAgInRyYW5zaXRpb24tZGVsYXkiOiAxLA0KICAgICAgICAgICAgICAgICJ0cmFuc2l0aW9uLWR1cmF0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAidHJhbnNpdGlvbi1wcm9wZXJ0eSI6IDEsDQogICAgICAgICAgICAgICAgInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAidW5pY29kZS1iaWRpIjogMSwNCiAgICAgICAgICAgICAgICAidmVydGljYWwtYWxpZ24iOiAxLA0KICAgICAgICAgICAgICAgICJ2aXNpYmlsaXR5IjogMSwNCiAgICAgICAgICAgICAgICAidm9pY2UtYmFsYW5jZSI6IDEsDQogICAgICAgICAgICAgICAgInZvaWNlLWR1cmF0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAidm9pY2UtZmFtaWx5IjogMSwNCiAgICAgICAgICAgICAgICAidm9pY2UtcGl0Y2giOiAxLA0KICAgICAgICAgICAgICAgICJ2b2ljZS1waXRjaC1yYW5nZSI6IDEsDQogICAgICAgICAgICAgICAgInZvaWNlLXJhdGUiOiAxLA0KICAgICAgICAgICAgICAgICJ2b2ljZS1zdHJlc3MiOiAxLA0KICAgICAgICAgICAgICAgICJ2b2ljZS12b2x1bWUiOiAxLA0KICAgICAgICAgICAgICAgICJ2b2x1bWUiOiAxLA0KICAgICAgICAgICAgICAgICJ3aGl0ZS1zcGFjZSI6IDEsDQogICAgICAgICAgICAgICAgIndoaXRlLXNwYWNlLWNvbGxhcHNlIjogMSwNCiAgICAgICAgICAgICAgICAid2lkb3dzIjogMSwNCiAgICAgICAgICAgICAgICAid2lkdGgiOiAxLA0KICAgICAgICAgICAgICAgICJ3b3JkLWJyZWFrIjogMSwNCiAgICAgICAgICAgICAgICAid29yZC1zcGFjaW5nIjogMSwNCiAgICAgICAgICAgICAgICAid29yZC13cmFwIjogMSwNCiAgICAgICAgICAgICAgICAiei1pbmRleCI6IDEsDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9JRQ0KICAgICAgICAgICAgICAgICJmaWx0ZXIiOiAxLA0KICAgICAgICAgICAgICAgICJ6b29tIjogMQ0KICAgICAgICAgICAgfTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgdmFyIG5hbWUgPSBldmVudC5wcm9wZXJ0eS50ZXh0LnRvTG93ZXJDYXNlKCk7DQoNCiAgICAgICAgICAgIGlmICghcHJvcGVydGllc1tuYW1lXSAmJiBuYW1lLmNoYXJBdCgwKSAhPSAiLSIpew0KICAgICAgICAgICAgICAgIHJlcG9ydGVyLmVycm9yKCJVbmtub3duIHByb3BlcnR5ICciICsgZXZlbnQucHJvcGVydHkgKyAiJy4iLCBldmVudC5saW5lLCBldmVudC5jb2wsIHJ1bGUpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH0pOw0KICAgIH0NCg0KfSk7DQovKg0KICogUnVsZTogRG9uJ3QgdXNlIGNsYXNzZXMgb3IgSURzIHdpdGggZWxlbWVudHMgKGEuZm9vIG9yIGEjZm9vKS4NCiAqLw0KQ1NTTGludC5hZGRSdWxlKHsNCg0KICAgIC8vcnVsZSBpbmZvcm1hdGlvbg0KICAgIGlkOiAib3ZlcnF1YWxpZmllZC1lbGVtZW50cyIsDQogICAgbmFtZTogIk92ZXJxdWFsaWZpZWQgRWxlbWVudHMiLA0KICAgIGRlc2M6ICJEb24ndCB1c2UgY2xhc3NlcyBvciBJRHMgd2l0aCBlbGVtZW50cyAoYS5mb28gb3IgYSNmb28pLiIsDQogICAgYnJvd3NlcnM6ICJBbGwiLA0KDQogICAgLy9pbml0aWFsaXphdGlvbg0KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpew0KICAgICAgICB2YXIgcnVsZSA9IHRoaXMsDQogICAgICAgICAgICBjbGFzc2VzID0ge307DQogICAgICAgICAgICANCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXZlbnQuc2VsZWN0b3JzLA0KICAgICAgICAgICAgICAgIHNlbGVjdG9yLA0KICAgICAgICAgICAgICAgIHBhcnQsDQogICAgICAgICAgICAgICAgbW9kaWZpZXIsDQogICAgICAgICAgICAgICAgaSwgaiwgazsNCg0KICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBzZWxlY3RvcnMubGVuZ3RoOyBpKyspew0KICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3JzW2ldOw0KDQogICAgICAgICAgICAgICAgZm9yIChqPTA7IGogPCBzZWxlY3Rvci5wYXJ0cy5sZW5ndGg7IGorKyl7DQogICAgICAgICAgICAgICAgICAgIHBhcnQgPSBzZWxlY3Rvci5wYXJ0c1tqXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBwYXJzZXJsaWIuY3NzLlNlbGVjdG9yUGFydCl7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDsgayA8IHBhcnQubW9kaWZpZXJzLmxlbmd0aDsgaysrKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllciA9IHBhcnQubW9kaWZpZXJzW2tdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LmVsZW1lbnROYW1lICYmIG1vZGlmaWVyLnR5cGUgPT0gImlkIil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIkVsZW1lbnQgKCIgKyBwYXJ0ICsgIikgaXMgb3ZlcnF1YWxpZmllZCwganVzdCB1c2UgIiArIG1vZGlmaWVyICsgIiB3aXRob3V0IGVsZW1lbnQgbmFtZS4iLCBwYXJ0LmxpbmUsIHBhcnQuY29sLCBydWxlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGlmaWVyLnR5cGUgPT0gImNsYXNzIil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsYXNzZXNbbW9kaWZpZXJdKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXNbbW9kaWZpZXJdID0gW107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlc1ttb2RpZmllcl0ucHVzaCh7IG1vZGlmaWVyOiBtb2RpZmllciwgcGFydDogcGFydCB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICANCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJlbmRzdHlsZXNoZWV0IiwgZnVuY3Rpb24oKXsNCiAgICAgICAgDQogICAgICAgICAgICB2YXIgcHJvcDsNCiAgICAgICAgICAgIGZvciAocHJvcCBpbiBjbGFzc2VzKXsNCiAgICAgICAgICAgICAgICBpZiAoY2xhc3Nlcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSl7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIC8vb25lIHVzZSBtZWFucyB0aGF0IHRoaXMgaXMgb3ZlcnF1YWxpZmllZA0KICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3Nlc1twcm9wXS5sZW5ndGggPT0gMSAmJiBjbGFzc2VzW3Byb3BdWzBdLnBhcnQuZWxlbWVudE5hbWUpew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiRWxlbWVudCAoIiArIGNsYXNzZXNbcHJvcF1bMF0ucGFydCArICIpIGlzIG92ZXJxdWFsaWZpZWQsIGp1c3QgdXNlICIgKyBjbGFzc2VzW3Byb3BdWzBdLm1vZGlmaWVyICsgIiB3aXRob3V0IGVsZW1lbnQgbmFtZS4iLCBjbGFzc2VzW3Byb3BdWzBdLnBhcnQubGluZSwgY2xhc3Nlc1twcm9wXVswXS5wYXJ0LmNvbCwgcnVsZSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9ICAgICAgICANCiAgICAgICAgfSk7DQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBIZWFkaW5ncyAoaDEtaDYpIHNob3VsZCBub3QgYmUgcXVhbGlmaWVkIChuYW1lc3BhY2VkKS4NCiAqLw0KQ1NTTGludC5hZGRSdWxlKHsNCg0KICAgIC8vcnVsZSBpbmZvcm1hdGlvbg0KICAgIGlkOiAicXVhbGlmaWVkLWhlYWRpbmdzIiwNCiAgICBuYW1lOiAiUXVhbGlmaWVkIEhlYWRpbmdzIiwNCiAgICBkZXNjOiAiSGVhZGluZ3Mgc2hvdWxkIG5vdCBiZSBxdWFsaWZpZWQgKG5hbWVzcGFjZWQpLiIsDQogICAgYnJvd3NlcnM6ICJBbGwiLA0KDQogICAgLy9pbml0aWFsaXphdGlvbg0KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpew0KICAgICAgICB2YXIgcnVsZSA9IHRoaXM7DQoNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXZlbnQuc2VsZWN0b3JzLA0KICAgICAgICAgICAgICAgIHNlbGVjdG9yLA0KICAgICAgICAgICAgICAgIHBhcnQsDQogICAgICAgICAgICAgICAgaSwgajsNCg0KICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBzZWxlY3RvcnMubGVuZ3RoOyBpKyspew0KICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3JzW2ldOw0KDQogICAgICAgICAgICAgICAgZm9yIChqPTA7IGogPCBzZWxlY3Rvci5wYXJ0cy5sZW5ndGg7IGorKyl7DQogICAgICAgICAgICAgICAgICAgIHBhcnQgPSBzZWxlY3Rvci5wYXJ0c1tqXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBwYXJzZXJsaWIuY3NzLlNlbGVjdG9yUGFydCl7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydC5lbGVtZW50TmFtZSAmJiAvaFsxLTZdLy50ZXN0KHBhcnQuZWxlbWVudE5hbWUudG9TdHJpbmcoKSkgJiYgaiA+IDApew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIkhlYWRpbmcgKCIgKyBwYXJ0LmVsZW1lbnROYW1lICsgIikgc2hvdWxkIG5vdCBiZSBxdWFsaWZpZWQuIiwgcGFydC5saW5lLCBwYXJ0LmNvbCwgcnVsZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCg0KfSk7DQovKg0KICogUnVsZTogU2VsZWN0b3JzIHRoYXQgbG9vayBsaWtlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIHNsb3cgYW5kIHNob3VsZCBiZSBhdm9pZGVkLg0KICovDQpDU1NMaW50LmFkZFJ1bGUoew0KDQogICAgLy9ydWxlIGluZm9ybWF0aW9uDQogICAgaWQ6ICJyZWdleC1zZWxlY3RvcnMiLA0KICAgIG5hbWU6ICJSZWdleCBTZWxlY3RvcnMiLA0KICAgIGRlc2M6ICJTZWxlY3RvcnMgdGhhdCBsb29rIGxpa2UgcmVndWxhciBleHByZXNzaW9ucyBhcmUgc2xvdyBhbmQgc2hvdWxkIGJlIGF2b2lkZWQuIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpczsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInN0YXJ0cnVsZSIsIGZ1bmN0aW9uKGV2ZW50KXsNCiAgICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBldmVudC5zZWxlY3RvcnMsDQogICAgICAgICAgICAgICAgc2VsZWN0b3IsDQogICAgICAgICAgICAgICAgcGFydCwNCiAgICAgICAgICAgICAgICBtb2RpZmllciwNCiAgICAgICAgICAgICAgICBpLCBqLCBrOw0KDQogICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHNlbGVjdG9ycy5sZW5ndGg7IGkrKyl7DQogICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvcnNbaV07DQogICAgICAgICAgICAgICAgZm9yIChqPTA7IGogPCBzZWxlY3Rvci5wYXJ0cy5sZW5ndGg7IGorKyl7DQogICAgICAgICAgICAgICAgICAgIHBhcnQgPSBzZWxlY3Rvci5wYXJ0c1tqXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBwYXJzZXJsaWIuY3NzLlNlbGVjdG9yUGFydCl7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDsgayA8IHBhcnQubW9kaWZpZXJzLmxlbmd0aDsgaysrKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllciA9IHBhcnQubW9kaWZpZXJzW2tdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllci50eXBlID09ICJhdHRyaWJ1dGUiKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC8oW1x+XHxcXlwkXCpdPSkvLnRlc3QobW9kaWZpZXIpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIkF0dHJpYnV0ZSBzZWxlY3RvcnMgd2l0aCAiICsgUmVnRXhwLiQxICsgIiBhcmUgc2xvdyEiLCBtb2RpZmllci5saW5lLCBtb2RpZmllci5jb2wsIHJ1bGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCg0KfSk7DQovKg0KICogUnVsZTogVG90YWwgbnVtYmVyIG9mIHJ1bGVzIHNob3VsZCBub3QgZXhjZWVkIHguDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogInJ1bGVzLWNvdW50IiwNCiAgICBuYW1lOiAiUnVsZXMgQ291bnQiLA0KICAgIGRlc2M6ICJUcmFjayBob3cgbWFueSBydWxlcyB0aGVyZSBhcmUuIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpcywNCiAgICAgICAgICAgIGNvdW50ID0gMDsNCg0KICAgICAgICAvL2NvdW50IGVhY2ggcnVsZQ0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInN0YXJ0cnVsZSIsIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICBjb3VudCsrOw0KICAgICAgICB9KTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoImVuZHN0eWxlc2hlZXQiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgcmVwb3J0ZXIuc3RhdCgicnVsZS1jb3VudCIsIGNvdW50KTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBEb24ndCB1c2UgdGV4dC1pbmRlbnQgZm9yIGltYWdlIHJlcGxhY2VtZW50IGlmIHlvdSBuZWVkIHRvIHN1cHBvcnQgcnRsLiANCiAqIA0KICovDQovKg0KICogU2hvdWxkIHdlIGJlIGNoZWNraW5nIGZvciBydGwvbHRyPw0KICovDQovL0NvbW1lbnRlZCBvdXQgZHVlIHRvIGxhY2sgb2YgdGVzdHMNCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogInRleHQtaW5kZW50IiwNCiAgICBuYW1lOiAiVGV4dCBJbmRlbnQiLA0KICAgIGRlc2M6ICJDaGVja3MgZm9yIHRleHQgaW5kZW50IGxlc3MgdGhhbiAtOTlweCIsDQogICAgYnJvd3NlcnM6ICJBbGwiLA0KICAgIA0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsNCiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzOw0KICAgIA0KICAgICAgICAvL2NoZWNrIGZvciB1c2Ugb2YgImZvbnQtc2l6ZSINCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJwcm9wZXJ0eSIsIGZ1bmN0aW9uKGV2ZW50KXsNCiAgICAgICAgICAgIHZhciBuYW1lID0gZXZlbnQucHJvcGVydHksDQogICAgICAgICAgICAgICAgdmFsdWUgPSBldmVudC52YWx1ZS5wYXJ0c1swXS52YWx1ZTsNCg0KICAgICAgICAgICAgaWYgKG5hbWUgPT0gInRleHQtaW5kZW50IiAmJiB2YWx1ZSA8IC05OSl7DQogICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiTmVnYXRpdmUgdGV4dC1pbmRlbnQgZG9lc24ndCB3b3JrIHdlbGwgd2l0aCBSVEwuIElmIHlvdSB1c2UgdGV4dC1pbmRlbnQgZm9yIGltYWdlIHJlcGxhY2VtZW50IGV4cGxpY2l0bHkgc2V0IHRleHQtZGlyZWN0aW9uIGZvciB0aGF0IGl0ZW0gdG8gbHRyLiIsIG5hbWUubGluZSwgbmFtZS5jb2wsIHJ1bGUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQoNCn0pOw0KLyoNCiAqIFJ1bGU6IEhlYWRpbmdzIChoMS1oNikgc2hvdWxkIGJlIGRlZmluZWQgb25seSBvbmNlLg0KICovDQpDU1NMaW50LmFkZFJ1bGUoew0KDQogICAgLy9ydWxlIGluZm9ybWF0aW9uDQogICAgaWQ6ICJ1bmlxdWUtaGVhZGluZ3MiLA0KICAgIG5hbWU6ICJVbmlxdWUgSGVhZGluZ3MiLA0KICAgIGRlc2M6ICJIZWFkaW5ncyBzaG91bGQgYmUgZGVmaW5lZCBvbmx5IG9uY2UuIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpczsNCg0KICAgICAgICB2YXIgaGVhZGluZ3MgPSAgew0KICAgICAgICAgICAgICAgIGgxOiAwLA0KICAgICAgICAgICAgICAgIGgyOiAwLA0KICAgICAgICAgICAgICAgIGgzOiAwLA0KICAgICAgICAgICAgICAgIGg0OiAwLA0KICAgICAgICAgICAgICAgIGg1OiAwLA0KICAgICAgICAgICAgICAgIGg2OiAwDQogICAgICAgICAgICB9Ow0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRydWxlIiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV2ZW50LnNlbGVjdG9ycywNCiAgICAgICAgICAgICAgICBzZWxlY3RvciwNCiAgICAgICAgICAgICAgICBwYXJ0LA0KICAgICAgICAgICAgICAgIGk7DQoNCiAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgc2VsZWN0b3JzLmxlbmd0aDsgaSsrKXsNCiAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTsNCiAgICAgICAgICAgICAgICBwYXJ0ID0gc2VsZWN0b3IucGFydHNbc2VsZWN0b3IucGFydHMubGVuZ3RoLTFdOw0KDQogICAgICAgICAgICAgICAgaWYgKHBhcnQuZWxlbWVudE5hbWUgJiYgLyhoWzEtNl0pLy50ZXN0KHBhcnQuZWxlbWVudE5hbWUudG9TdHJpbmcoKSkpew0KICAgICAgICAgICAgICAgICAgICBoZWFkaW5nc1tSZWdFeHAuJDFdKys7DQogICAgICAgICAgICAgICAgICAgIGlmIChoZWFkaW5nc1tSZWdFeHAuJDFdID4gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiSGVhZGluZyAoIiArIHBhcnQuZWxlbWVudE5hbWUgKyAiKSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIiwgcGFydC5saW5lLCBwYXJ0LmNvbCwgcnVsZSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCg0KfSk7DQovKg0KICogUnVsZTogRG9uJ3QgdXNlIHVuaXZlcnNhbCBzZWxlY3RvciBiZWNhdXNlIGl0J3Mgc2xvdy4NCiAqLw0KQ1NTTGludC5hZGRSdWxlKHsNCg0KICAgIC8vcnVsZSBpbmZvcm1hdGlvbg0KICAgIGlkOiAidW5pdmVyc2FsLXNlbGVjdG9yIiwNCiAgICBuYW1lOiAiVW5pdmVyc2FsIFNlbGVjdG9yIiwNCiAgICBkZXNjOiAiVGhlIHVuaXZlcnNhbCBzZWxlY3RvciAoKikgaXMga25vd24gdG8gYmUgc2xvdy4iLA0KICAgIGJyb3dzZXJzOiAiQWxsIiwNCg0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsNCiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzOw0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRydWxlIiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV2ZW50LnNlbGVjdG9ycywNCiAgICAgICAgICAgICAgICBzZWxlY3RvciwNCiAgICAgICAgICAgICAgICBwYXJ0LA0KICAgICAgICAgICAgICAgIG1vZGlmaWVyLA0KICAgICAgICAgICAgICAgIGksIGosIGs7DQoNCiAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgc2VsZWN0b3JzLmxlbmd0aDsgaSsrKXsNCiAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBwYXJ0ID0gc2VsZWN0b3IucGFydHNbc2VsZWN0b3IucGFydHMubGVuZ3RoLTFdOw0KICAgICAgICAgICAgICAgIGlmIChwYXJ0LmVsZW1lbnROYW1lID09ICIqIil7DQogICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4ocnVsZS5kZXNjLCBwYXJ0LmxpbmUsIHBhcnQuY29sLCBydWxlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCg0KfSk7DQovKg0KICogUnVsZTogV2hlbiB1c2luZyBhIHZlbmRvci1wcmVmaXhlZCBwcm9wZXJ0eSwgbWFrZSBzdXJlIHRvDQogKiBpbmNsdWRlIHRoZSBzdGFuZGFyZCBvbmUuDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogInZlbmRvci1wcmVmaXgiLA0KICAgIG5hbWU6ICJWZW5kb3IgUHJlZml4IiwNCiAgICBkZXNjOiAiV2hlbiB1c2luZyBhIHZlbmRvci1wcmVmaXhlZCBwcm9wZXJ0eSwgbWFrZSBzdXJlIHRvIGluY2x1ZGUgdGhlIHN0YW5kYXJkIG9uZS4iLA0KICAgIGJyb3dzZXJzOiAiQWxsIiwNCg0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsNCiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzLA0KICAgICAgICAgICAgcHJvcGVydGllcywNCiAgICAgICAgICAgIG51bSwNCiAgICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrID0gew0KICAgICAgICAgICAgICAgICItbW96LWJvcmRlci1yYWRpdXMiOiAiYm9yZGVyLXJhZGl1cyIsDQogICAgICAgICAgICAgICAgIi13ZWJraXQtYm9yZGVyLXJhZGl1cyI6ICJib3JkZXItcmFkaXVzIiwNCiAgICAgICAgICAgICAgICAiLXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzIjogImJvcmRlci10b3AtbGVmdC1yYWRpdXMiLA0KICAgICAgICAgICAgICAgICItd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzIjogImJvcmRlci10b3AtcmlnaHQtcmFkaXVzIiwNCiAgICAgICAgICAgICAgICAiLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzIjogImJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMiLA0KICAgICAgICAgICAgICAgICItd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzIjogImJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzIiwNCiAgICAgICAgICAgICAgICAiLW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQiOiAiYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyIsDQogICAgICAgICAgICAgICAgIi1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodCI6ICJib3JkZXItdG9wLXJpZ2h0LXJhZGl1cyIsDQogICAgICAgICAgICAgICAgIi1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0IjogImJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMiLA0KICAgICAgICAgICAgICAgICItbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQiOiAiYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMiLA0KICAgICAgICAgICAgICAgICItbW96LWJveC1zaGFkb3ciOiAiYm94LXNoYWRvdyIsDQogICAgICAgICAgICAgICAgIi13ZWJraXQtYm94LXNoYWRvdyI6ICJib3gtc2hhZG93IiwNCiAgICAgICAgICAgICAgICAiLW1vei10cmFuc2Zvcm0iIDogInRyYW5zZm9ybSIsDQogICAgICAgICAgICAgICAgIi13ZWJraXQtdHJhbnNmb3JtIiA6ICJ0cmFuc2Zvcm0iLA0KICAgICAgICAgICAgICAgICItby10cmFuc2Zvcm0iIDogInRyYW5zZm9ybSIsDQogICAgICAgICAgICAgICAgIi1tcy10cmFuc2Zvcm0iIDogInRyYW5zZm9ybSIsDQogICAgICAgICAgICAgICAgIi1tb3otYm94LXNpemluZyIgOiAiYm94LXNpemluZyIsDQogICAgICAgICAgICAgICAgIi13ZWJraXQtYm94LXNpemluZyIgOiAiYm94LXNpemluZyIsDQogICAgICAgICAgICAgICAgIi1tb3otdXNlci1zZWxlY3QiIDogInVzZXItc2VsZWN0IiwNCiAgICAgICAgICAgICAgICAiLWtodG1sLXVzZXItc2VsZWN0IiA6ICJ1c2VyLXNlbGVjdCIsDQogICAgICAgICAgICAgICAgIi13ZWJraXQtdXNlci1zZWxlY3QiIDogInVzZXItc2VsZWN0IiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgLy9ldmVudCBoYW5kbGVyIGZvciBiZWdpbm5pbmcgb2YgcnVsZXMNCiAgICAgICAgZnVuY3Rpb24gc3RhcnRSdWxlKCl7DQogICAgICAgICAgICBwcm9wZXJ0aWVzID0ge307DQogICAgICAgICAgICBudW09MTsgICAgICAgIA0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvL2V2ZW50IGhhbmRsZXIgZm9yIGVuZCBvZiBydWxlcw0KICAgICAgICBmdW5jdGlvbiBlbmRSdWxlKGV2ZW50KXsNCiAgICAgICAgICAgIHZhciBwcm9wLA0KICAgICAgICAgICAgICAgIGksIGxlbiwNCiAgICAgICAgICAgICAgICBzdGFuZGFyZCwNCiAgICAgICAgICAgICAgICBuZWVkZWQsDQogICAgICAgICAgICAgICAgYWN0dWFsLA0KICAgICAgICAgICAgICAgIG5lZWRzU3RhbmRhcmQgPSBbXTsNCg0KICAgICAgICAgICAgZm9yIChwcm9wIGluIHByb3BlcnRpZXMpew0KICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzVG9DaGVja1twcm9wXSl7DQogICAgICAgICAgICAgICAgICAgIG5lZWRzU3RhbmRhcmQucHVzaCh7IGFjdHVhbDogcHJvcCwgbmVlZGVkOiBwcm9wZXJ0aWVzVG9DaGVja1twcm9wXX0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZm9yIChpPTAsIGxlbj1uZWVkc1N0YW5kYXJkLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICBuZWVkZWQgPSBuZWVkc1N0YW5kYXJkW2ldLm5lZWRlZDsNCiAgICAgICAgICAgICAgICBhY3R1YWwgPSBuZWVkc1N0YW5kYXJkW2ldLmFjdHVhbDsNCg0KICAgICAgICAgICAgICAgIGlmICghcHJvcGVydGllc1tuZWVkZWRdKXsgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiTWlzc2luZyBzdGFuZGFyZCBwcm9wZXJ0eSAnIiArIG5lZWRlZCArICInIHRvIGdvIGFsb25nIHdpdGggJyIgKyBhY3R1YWwgKyAiJy4iLCBldmVudC5saW5lLCBldmVudC5jb2wsIHJ1bGUpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIC8vbWFrZSBzdXJlIHN0YW5kYXJkIHByb3BlcnR5IGlzIGxhc3QNCiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNbbmVlZGVkXVswXS5wb3MgPCBwcm9wZXJ0aWVzW2FjdHVhbF1bMF0ucG9zKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIlN0YW5kYXJkIHByb3BlcnR5ICciICsgbmVlZGVkICsgIicgc2hvdWxkIGNvbWUgYWZ0ZXIgdmVuZG9yLXByZWZpeGVkIHByb3BlcnR5ICciICsgYWN0dWFsICsgIicuIiwgZXZlbnQubGluZSwgZXZlbnQuY29sLCBydWxlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9ICAgICAgICANCiAgICAgICAgDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRydWxlIiwgc3RhcnRSdWxlKTsNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydGZvbnRmYWNlIiwgc3RhcnRSdWxlKTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgdmFyIG5hbWUgPSBldmVudC5wcm9wZXJ0eS50ZXh0LnRvTG93ZXJDYXNlKCk7DQoNCiAgICAgICAgICAgIGlmICghcHJvcGVydGllc1tuYW1lXSl7DQogICAgICAgICAgICAgICAgcHJvcGVydGllc1tuYW1lXSA9IFtdOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBwcm9wZXJ0aWVzW25hbWVdLnB1c2goeyBuYW1lOiBldmVudC5wcm9wZXJ0eSwgdmFsdWUgOiBldmVudC52YWx1ZSwgcG9zOm51bSsrIH0pOw0KICAgICAgICB9KTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoImVuZHJ1bGUiLCBlbmRSdWxlKTsNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJlbmRmb250ZmFjZSIsIGVuZFJ1bGUpOw0KICAgIH0NCg0KfSk7DQovKg0KICogUnVsZTogSWYgYW4gZWxlbWVudCBoYXMgYSB3aWR0aCBvZiAxMDAlLCBiZSBjYXJlZnVsIHdoZW4gcGxhY2luZyB3aXRoaW4NCiAqIGFuIGVsZW1lbnQgdGhhdCBoYXMgcGFkZGluZy4gSXQgbWF5IGxvb2sgc3RyYW5nZS4NCiAqLw0KLy9Db21tZW50ZWQgb3V0IHBlbmRpbmcgZnVydGhlciByZXZpZXcuDQovKkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogIndpZHRoLTEwMCIsDQogICAgbmFtZTogIldpZHRoIDEwMCUiLA0KICAgIGRlc2M6ICJCZSBjYXJlZnVsIHdoZW4gdXNpbmcgd2lkdGg6IDEwMCUgb24gZWxlbWVudHMuIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpcywNCiAgICAgICAgICAgIHdpZHRoMTAwLA0KICAgICAgICAgICAgYm94c2l6aW5nOw0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRydWxlIiwgZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIHdpZHRoMTAwID0gbnVsbDsNCiAgICAgICAgICAgIGJveHNpemluZyA9IGZhbHNlOw0KICAgICAgICB9KTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgdmFyIG5hbWUgPSBldmVudC5wcm9wZXJ0eS50ZXh0LnRvTG93ZXJDYXNlKCksDQogICAgICAgICAgICAgICAgdmFsdWUgPSBldmVudC52YWx1ZTsNCg0KICAgICAgICAgICAgaWYgKG5hbWUgPT0gIndpZHRoIiAmJiB2YWx1ZSA9PSAiMTAwJSIpew0KICAgICAgICAgICAgICAgIHdpZHRoMTAwID0gZXZlbnQucHJvcGVydHk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gImJveC1zaXppbmciIHx8IC9cLSg/OndlYmtpdHxtc3xtb3opXC1ib3gtc2l6aW5nLy50ZXN0KG5hbWUpKXsgIC8vbWVhbnMgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcNCiAgICAgICAgICAgICAgICBib3hzaXppbmcgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigiZW5kcnVsZSIsIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICBpZiAod2lkdGgxMDAgJiYgIWJveHNpemluZyl7DQogICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiRWxlbWVudHMgd2l0aCBhIHdpZHRoIG9mIDEwMCUgbWF5IG5vdCBhcHBlYXIgYXMgeW91IGV4cGVjdCBpbnNpZGUgb2Ygb3RoZXIgZWxlbWVudHMuIiwgd2lkdGgxMDAubGluZSwgd2lkdGgxMDAuY29sLCBydWxlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfQ0KDQp9KTsqLw0KLyoNCiAqIFJ1bGU6IFlvdSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgdW5pdHMgd2hlbiBhIHZhbHVlIGlzIDAuDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogInplcm8tdW5pdHMiLA0KICAgIG5hbWU6ICJaZXJvIFVuaXRzIiwNCiAgICBkZXNjOiAiWW91IGRvbid0IG5lZWQgdG8gc3BlY2lmeSB1bml0cyB3aGVuIGEgdmFsdWUgaXMgMC4iLA0KICAgIGJyb3dzZXJzOiAiQWxsIiwNCg0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsNCiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzOw0KDQogICAgICAgIC8vY291bnQgaG93IG1hbnkgdGltZXMgImZsb2F0IiBpcyB1c2VkDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigicHJvcGVydHkiLCBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICB2YXIgcGFydHMgPSBldmVudC52YWx1ZS5wYXJ0cywNCiAgICAgICAgICAgICAgICBpID0gMCwgDQogICAgICAgICAgICAgICAgbGVuID0gcGFydHMubGVuZ3RoOw0KDQogICAgICAgICAgICB3aGlsZShpIDwgbGVuKXsNCiAgICAgICAgICAgICAgICBpZiAoKHBhcnRzW2ldLnVuaXRzIHx8IHBhcnRzW2ldLnR5cGUgPT0gInBlcmNlbnRhZ2UiKSAmJiBwYXJ0c1tpXS52YWx1ZSA9PT0gMCl7DQogICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIlZhbHVlcyBvZiAwIHNob3VsZG4ndCBoYXZlIHVuaXRzIHNwZWNpZmllZC4iLCBwYXJ0c1tpXS5saW5lLCBwYXJ0c1tpXS5jb2wsIHJ1bGUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpKys7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSk7DQoNCiAgICB9DQoNCn0pOw0KDQpleHBvcnRzLkNTU0xpbnQgPSBDU1NMaW50Ow0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/worker-javascript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Im5vIHVzZSBzdHJpY3QiOw0KDQp2YXIgY29uc29sZSA9IHsNCiAgICBsb2c6IGZ1bmN0aW9uKG1zZykgew0KICAgICAgICBwb3N0TWVzc2FnZSh7dHlwZTogImxvZyIsIGRhdGE6IG1zZ30pOw0KICAgIH0NCn07DQp2YXIgd2luZG93ID0gew0KICAgIGNvbnNvbGU6IGNvbnNvbGUNCn07DQoNCnZhciBub3JtYWxpemVNb2R1bGUgPSBmdW5jdGlvbihwYXJlbnRJZCwgbW9kdWxlTmFtZSkgew0KICAgIC8vIG5vcm1hbGl6ZSBwbHVnaW4gcmVxdWlyZXMNCiAgICBpZiAobW9kdWxlTmFtZS5pbmRleE9mKCIhIikgIT09IC0xKSB7DQogICAgICAgIHZhciBjaHVua3MgPSBtb2R1bGVOYW1lLnNwbGl0KCIhIik7DQogICAgICAgIHJldHVybiBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1swXSkgKyAiISIgKyBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1sxXSk7DQogICAgfQ0KICAgIC8vIG5vcm1hbGl6ZSByZWxhdGl2ZSByZXF1aXJlcw0KICAgIGlmIChtb2R1bGVOYW1lLmNoYXJBdCgwKSA9PSAiLiIpIHsNCiAgICAgICAgdmFyIGJhc2UgPSBwYXJlbnRJZC5zcGxpdCgiLyIpLnNsaWNlKDAsIC0xKS5qb2luKCIvIik7DQogICAgICAgIHZhciBtb2R1bGVOYW1lID0gYmFzZSArICIvIiArIG1vZHVsZU5hbWU7DQogICAgICAgIA0KICAgICAgICB3aGlsZShtb2R1bGVOYW1lLmluZGV4T2YoIi4iKSAhPT0gLTEgJiYgcHJldmlvdXMgIT0gbW9kdWxlTmFtZSkgew0KICAgICAgICAgICAgdmFyIHByZXZpb3VzID0gbW9kdWxlTmFtZTsNCiAgICAgICAgICAgIHZhciBtb2R1bGVOYW1lID0gbW9kdWxlTmFtZS5yZXBsYWNlKC9cL1wuXC8vLCAiLyIpLnJlcGxhY2UoL1teXC9dK1wvXC5cLlwvLywgIiIpOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIHJldHVybiBtb2R1bGVOYW1lOw0KfTsNCg0KdmFyIHJlcXVpcmUgPSBmdW5jdGlvbihwYXJlbnRJZCwgaWQpIHsNCiAgICB2YXIgaWQgPSBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGlkKTsNCiAgICANCiAgICB2YXIgbW9kdWxlID0gcmVxdWlyZS5tb2R1bGVzW2lkXTsNCiAgICBpZiAobW9kdWxlKSB7DQogICAgICAgIGlmICghbW9kdWxlLmluaXRpYWxpemVkKSB7DQogICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG1vZHVsZS5mYWN0b3J5KCkuZXhwb3J0czsNCiAgICAgICAgICAgIG1vZHVsZS5pbml0aWFsaXplZCA9IHRydWU7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzOw0KICAgIH0NCiAgICANCiAgICB2YXIgY2h1bmtzID0gaWQuc3BsaXQoIi8iKTsNCiAgICBjaHVua3NbMF0gPSByZXF1aXJlLnRsbnNbY2h1bmtzWzBdXSB8fCBjaHVua3NbMF07DQogICAgdmFyIHBhdGggPSBjaHVua3Muam9pbigiLyIpICsgIi5qcyI7DQogICAgDQogICAgcmVxdWlyZS5pZCA9IGlkOw0KICAgIGltcG9ydFNjcmlwdHMocGF0aCk7DQogICAgcmV0dXJuIHJlcXVpcmUocGFyZW50SWQsIGlkKTsgICAgDQp9Ow0KDQpyZXF1aXJlLm1vZHVsZXMgPSB7fTsNCnJlcXVpcmUudGxucyA9IHt9Ow0KDQp2YXIgZGVmaW5lID0gZnVuY3Rpb24oaWQsIGRlcHMsIGZhY3RvcnkpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7DQogICAgICAgIGZhY3RvcnkgPSBkZXBzOw0KICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICAgIGZhY3RvcnkgPSBpZDsNCiAgICAgICAgaWQgPSByZXF1aXJlLmlkOw0KICAgIH0NCg0KICAgIGlmIChpZC5pbmRleE9mKCJ0ZXh0ISIpID09PSAwKSANCiAgICAgICAgcmV0dXJuOw0KICAgIA0KICAgIHZhciByZXEgPSBmdW5jdGlvbihkZXBzLCBmYWN0b3J5KSB7DQogICAgICAgIHJldHVybiByZXF1aXJlKGlkLCBkZXBzLCBmYWN0b3J5KTsNCiAgICB9Ow0KDQogICAgcmVxdWlyZS5tb2R1bGVzW2lkXSA9IHsNCiAgICAgICAgZmFjdG9yeTogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgbW9kdWxlID0gew0KICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdmFyIHJldHVybkV4cG9ydHMgPSBmYWN0b3J5KHJlcSwgbW9kdWxlLmV4cG9ydHMsIG1vZHVsZSk7DQogICAgICAgICAgICBpZiAocmV0dXJuRXhwb3J0cykNCiAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHJldHVybkV4cG9ydHM7DQogICAgICAgICAgICByZXR1cm4gbW9kdWxlOw0KICAgICAgICB9DQogICAgfTsNCn07DQoNCmZ1bmN0aW9uIGluaXRCYXNlVXJscyh0b3BMZXZlbE5hbWVzcGFjZXMpIHsNCiAgICByZXF1aXJlLnRsbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXM7DQp9DQoNCmZ1bmN0aW9uIGluaXRTZW5kZXIoKSB7DQoNCiAgICB2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZShudWxsLCAiYWNlL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KICAgIHZhciBvb3AgPSByZXF1aXJlKG51bGwsICJhY2UvbGliL29vcCIpOw0KICAgIA0KICAgIHZhciBTZW5kZXIgPSBmdW5jdGlvbigpIHt9Ow0KICAgIA0KICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgDQogICAgICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrSWQpIHsNCiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAiY2FsbCIsDQogICAgICAgICAgICAgICAgaWQ6IGNhbGxiYWNrSWQsDQogICAgICAgICAgICAgICAgZGF0YTogZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQogICAgDQogICAgICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uKG5hbWUsIGRhdGEpIHsNCiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAiZXZlbnQiLA0KICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsDQogICAgICAgICAgICAgICAgZGF0YTogZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQogICAgICAgIA0KICAgIH0pLmNhbGwoU2VuZGVyLnByb3RvdHlwZSk7DQogICAgDQogICAgcmV0dXJuIG5ldyBTZW5kZXIoKTsNCn0NCg0KdmFyIG1haW47DQp2YXIgc2VuZGVyOw0KDQpvbm1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7DQogICAgdmFyIG1zZyA9IGUuZGF0YTsNCiAgICBpZiAobXNnLmNvbW1hbmQpIHsNCiAgICAgICAgbWFpblttc2cuY29tbWFuZF0uYXBwbHkobWFpbiwgbXNnLmFyZ3MpOw0KICAgIH0NCiAgICBlbHNlIGlmIChtc2cuaW5pdCkgeyAgICAgICAgDQogICAgICAgIGluaXRCYXNlVXJscyhtc2cudGxucyk7DQogICAgICAgIHJlcXVpcmUobnVsbCwgImFjZS9saWIvZml4b2xkYnJvd3NlcnMiKTsNCiAgICAgICAgc2VuZGVyID0gaW5pdFNlbmRlcigpOw0KICAgICAgICB2YXIgY2xhenogPSByZXF1aXJlKG51bGwsIG1zZy5tb2R1bGUpW21zZy5jbGFzc25hbWVdOw0KICAgICAgICBtYWluID0gbmV3IGNsYXp6KHNlbmRlcik7DQogICAgfSANCiAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgc2VuZGVyKSB7DQogICAgICAgIHNlbmRlci5fZW1pdChtc2cuZXZlbnQsIG1zZy5kYXRhKTsNCiAgICB9DQp9Ow0KLy8gdmltOnNldCB0cz00IHN0cz00IHN3PTQgc3Q6DQovLyAtLSBrcmlza293YWwgS3JpcyBLb3dhbCBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBNSVQgTGljZW5zZQ0KLy8gLS0gdGxyb2JpbnNvbiBUb20gUm9iaW5zb24gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTUlUIExpY2Vuc2UgKE5hcndoYWwgUHJvamVjdCkNCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0KEMpIDIwMTAgWFhYIE5vIExpY2Vuc2UgU3BlY2lmaWVkDQovLyAtLSBmc2NoYWVmZXIgRmxvcmlhbiBTY2jDpGZlciBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIElyYWtsaSBHb3phbGlzaHZpbGkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQoNCi8qIQ0KICAgIENvcHlyaWdodCAoYykgMjAwOSwgMjgwIE5vcnRoIEluYy4gaHR0cDovLzI4MG5vcnRoLmNvbS8NCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQNCiovDQoNCmRlZmluZSgnYWNlL2xpYi9maXhvbGRicm93c2VycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9yZWdleHAnLCAnYWNlL2xpYi9lczUtc2hpbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KcmVxdWlyZSgiLi9yZWdleHAiKTsNCnJlcXVpcmUoIi4vZXM1LXNoaW0iKTsNCg0KfSk7LyoqDQogKiAgQmFzZWQgb24gY29kZSBmcm9tOg0KICoNCiAqIFhSZWdFeHAgMS41LjANCiAqIChjKSAyMDA3LTIwMTAgU3RldmVuIExldml0aGFuDQogKiBNSVQgTGljZW5zZQ0KICogPGh0dHA6Ly94cmVnZXhwLmNvbT4NCiAqIFByb3ZpZGVzIGFuIGF1Z21lbnRlZCwgZXh0ZW5zaWJsZSwgY3Jvc3MtYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiByZWd1bGFyIGV4cHJlc3Npb25zLA0KICogaW5jbHVkaW5nIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgc3ludGF4LCBmbGFncywgYW5kIG1ldGhvZHMNCiAqLw0KIA0KZGVmaW5lKCdhY2UvbGliL3JlZ2V4cCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vICBQcml2YXRlIHZhcmlhYmxlcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICB2YXIgcmVhbCA9IHsNCiAgICAgICAgICAgIGV4ZWM6IFJlZ0V4cC5wcm90b3R5cGUuZXhlYywNCiAgICAgICAgICAgIHRlc3Q6IFJlZ0V4cC5wcm90b3R5cGUudGVzdCwNCiAgICAgICAgICAgIG1hdGNoOiBTdHJpbmcucHJvdG90eXBlLm1hdGNoLA0KICAgICAgICAgICAgcmVwbGFjZTogU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlLA0KICAgICAgICAgICAgc3BsaXQ6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQNCiAgICAgICAgfSwNCiAgICAgICAgY29tcGxpYW50RXhlY05wY2cgPSByZWFsLmV4ZWMuY2FsbCgvKCk/Py8sICIiKVsxXSA9PT0gdW5kZWZpbmVkLCAvLyBjaGVjayBgZXhlY2AgaGFuZGxpbmcgb2Ygbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzDQogICAgICAgIGNvbXBsaWFudExhc3RJbmRleEluY3JlbWVudCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciB4ID0gL14vZzsNCiAgICAgICAgICAgIHJlYWwudGVzdC5jYWxsKHgsICIiKTsNCiAgICAgICAgICAgIHJldHVybiAheC5sYXN0SW5kZXg7DQogICAgICAgIH0oKTsNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gIE92ZXJyaWRlbiBuYXRpdmUgbWV0aG9kcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAvLyBBZGRzIG5hbWVkIGNhcHR1cmUgc3VwcG9ydCAod2l0aCBiYWNrcmVmZXJlbmNlcyByZXR1cm5lZCBhcyBgcmVzdWx0Lm5hbWVgKSwgYW5kIGZpeGVzIHR3bw0KICAgIC8vIGNyb3NzLWJyb3dzZXIgaXNzdWVzIHBlciBFUzM6DQogICAgLy8gLSBDYXB0dXJlZCB2YWx1ZXMgZm9yIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYHVuZGVmaW5lZGAsDQogICAgLy8gICByYXRoZXIgdGhhbiB0aGUgZW1wdHkgc3RyaW5nLg0KICAgIC8vIC0gYGxhc3RJbmRleGAgc2hvdWxkIG5vdCBiZSBpbmNyZW1lbnRlZCBhZnRlciB6ZXJvLWxlbmd0aCBtYXRjaGVzLg0KICAgIFJlZ0V4cC5wcm90b3R5cGUuZXhlYyA9IGZ1bmN0aW9uIChzdHIpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gcmVhbC5leGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksDQogICAgICAgICAgICBuYW1lLCByMjsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYCBmb3INCiAgICAgICAgICAgIC8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3Vwcw0KICAgICAgICAgICAgaWYgKCFjb21wbGlhbnRFeGVjTnBjZyAmJiBtYXRjaC5sZW5ndGggPiAxICYmIGluZGV4T2YobWF0Y2gsICIiKSA+IC0xKSB7DQogICAgICAgICAgICAgICAgcjIgPSBSZWdFeHAodGhpcy5zb3VyY2UsIHJlYWwucmVwbGFjZS5jYWxsKGdldE5hdGl2ZUZsYWdzKHRoaXMpLCAiZyIsICIiKSk7DQogICAgICAgICAgICAgICAgLy8gVXNpbmcgYHN0ci5zbGljZShtYXRjaC5pbmRleClgIHJhdGhlciB0aGFuIGBtYXRjaFswXWAgaW4gY2FzZSBsb29rYWhlYWQgYWxsb3dlZA0KICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIGR1ZSB0byBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIG1hdGNoDQogICAgICAgICAgICAgICAgcmVhbC5yZXBsYWNlLmNhbGwoc3RyLnNsaWNlKG1hdGNoLmluZGV4KSwgcjIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMjsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzW2ldID09PSB1bmRlZmluZWQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0gPSB1bmRlZmluZWQ7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIEF0dGFjaCBuYW1lZCBjYXB0dXJlIHByb3BlcnRpZXMNCiAgICAgICAgICAgIGlmICh0aGlzLl94cmVnZXhwICYmIHRoaXMuX3hyZWdleHAuY2FwdHVyZU5hbWVzKSB7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBtYXRjaC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gdGhpcy5feHJlZ2V4cC5jYXB0dXJlTmFtZXNbaSAtIDFdOw0KICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSkNCiAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbbmFtZV0gPSBtYXRjaFtpXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgdGhhdCBpbmNyZW1lbnQgYGxhc3RJbmRleGAgYWZ0ZXIgemVyby1sZW5ndGggbWF0Y2hlcw0KICAgICAgICAgICAgaWYgKCFjb21wbGlhbnRMYXN0SW5kZXhJbmNyZW1lbnQgJiYgdGhpcy5nbG9iYWwgJiYgIW1hdGNoWzBdLmxlbmd0aCAmJiAodGhpcy5sYXN0SW5kZXggPiBtYXRjaC5pbmRleCkpDQogICAgICAgICAgICAgICAgdGhpcy5sYXN0SW5kZXgtLTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbWF0Y2g7DQogICAgfTsNCg0KICAgIC8vIERvbid0IG92ZXJyaWRlIGB0ZXN0YCBpZiBpdCB3b24ndCBjaGFuZ2UgYW55dGhpbmcNCiAgICBpZiAoIWNvbXBsaWFudExhc3RJbmRleEluY3JlbWVudCkgew0KICAgICAgICAvLyBGaXggYnJvd3NlciBidWcgaW4gbmF0aXZlIG1ldGhvZA0KICAgICAgICBSZWdFeHAucHJvdG90eXBlLnRlc3QgPSBmdW5jdGlvbiAoc3RyKSB7DQogICAgICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBgZXhlY2AgdG8gc2tpcCBzb21lIHByb2Nlc3Npbmcgb3ZlcmhlYWQsIGV2ZW4gdGhvdWdoIHRoZSBvdmVycmlkZW4NCiAgICAgICAgICAgIC8vIGBleGVjYCB3b3VsZCB0YWtlIGNhcmUgb2YgdGhlIGBsYXN0SW5kZXhgIGZpeA0KICAgICAgICAgICAgdmFyIG1hdGNoID0gcmVhbC5leGVjLmNhbGwodGhpcywgc3RyKTsNCiAgICAgICAgICAgIC8vIEZpeCBicm93c2VycyB0aGF0IGluY3JlbWVudCBgbGFzdEluZGV4YCBhZnRlciB6ZXJvLWxlbmd0aCBtYXRjaGVzDQogICAgICAgICAgICBpZiAobWF0Y2ggJiYgdGhpcy5nbG9iYWwgJiYgIW1hdGNoWzBdLmxlbmd0aCAmJiAodGhpcy5sYXN0SW5kZXggPiBtYXRjaC5pbmRleCkpDQogICAgICAgICAgICAgICAgdGhpcy5sYXN0SW5kZXgtLTsNCiAgICAgICAgICAgIHJldHVybiAhIW1hdGNoOw0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9ucw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICBmdW5jdGlvbiBnZXROYXRpdmVGbGFncyAocmVnZXgpIHsNCiAgICAgICAgcmV0dXJuIChyZWdleC5nbG9iYWwgICAgID8gImciIDogIiIpICsNCiAgICAgICAgICAgICAgIChyZWdleC5pZ25vcmVDYXNlID8gImkiIDogIiIpICsNCiAgICAgICAgICAgICAgIChyZWdleC5tdWx0aWxpbmUgID8gIm0iIDogIiIpICsNCiAgICAgICAgICAgICAgIChyZWdleC5leHRlbmRlZCAgID8gIngiIDogIiIpICsgLy8gUHJvcG9zZWQgZm9yIEVTNDsgaW5jbHVkZWQgaW4gQVMzDQogICAgICAgICAgICAgICAocmVnZXguc3RpY2t5ICAgICA/ICJ5IiA6ICIiKTsNCiAgICB9Ow0KDQogICAgZnVuY3Rpb24gaW5kZXhPZiAoYXJyYXksIGl0ZW0sIGZyb20pIHsNCiAgICAgICAgaWYgKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKSAvLyBVc2UgdGhlIG5hdGl2ZSBhcnJheSBtZXRob2QgaWYgYXZhaWxhYmxlDQogICAgICAgICAgICByZXR1cm4gYXJyYXkuaW5kZXhPZihpdGVtLCBmcm9tKTsNCiAgICAgICAgZm9yICh2YXIgaSA9IGZyb20gfHwgMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoYXJyYXlbaV0gPT09IGl0ZW0pDQogICAgICAgICAgICAgICAgcmV0dXJuIGk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH07DQoNCn0pOy8vIHZpbTogdHM9NCBzdHM9NCBzdz00IGV4cGFuZHRhYg0KLy8gLS0ga3Jpc2tvd2FsIEtyaXMgS293YWwgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIHRscm9iaW5zb24gVG9tIFJvYmluc29uIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlIChOYXJ3aGFsIFByb2plY3QpDQovLyAtLSBkYW50bWFuIERhbmllbCBGcmllc2VuIENvcHlyaWdodCAoQykgMjAxMCBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQ0KLy8gLS0gZnNjaGFlZmVyIEZsb3JpYW4gU2Now6RmZXIgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQovLyAtLSBHb3phbGEgSXJha2xpIEdvemFsaXNodmlsaSBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIGtpdGNhbWJyaWRnZSBLaXQgQ2FtYnJpZGdlIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0ga29zc25vY29ycCBTYXNoYSBLb3NzIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBicnlhbmZvcmJlcyBCcnlhbiBGb3JiZXMgWFhYIFRPRE8gTGljZW5zZSBvciBDTEENCi8vIC0tIGtpbGxkcmVhbSBRdWlsZHJlZW4gTW90dGEgQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbmNlDQovLyAtLSBtaWNoYWVsZmljYXJyYSBNaWNoYWVsIEZpY2FycmEgQ29weXJpZ2h0IChDKSAyMDExIDMtY2xhdXNlIEJTRCBMaWNlbnNlDQovLyAtLSBzaGFya2JyYWluZ3V5IEdlcmFyZCBQYWFwdSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIGJicXNyYyBCcmVuZGFuIE1vbGxveSAoQykgMjAxMSBDcmVhdGl2ZSBDb21tb25zIFplcm8gKHB1YmxpYyBkb21haW4pDQovLyAtLSBpd3lnIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBEb21lbmljRGVuaWNvbGEgRG9tZW5pYyBEZW5pY29sYSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIHhhdmllcm0wMiBNb250aWxsZXQgWGF2aWVyIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBSYXlub3MgUmF5bm9zIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBzYW1zb25qcyBTYW1pIFNhbWh1cmkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQovLyAtLSByd2xkcm4gUmljayBXYWxkcm9uIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0gbGV4ZXIgQWxleGV5IFpha2hhcm92IFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQoNCi8qIQ0KICAgIENvcHlyaWdodCAoYykgMjAwOSwgMjgwIE5vcnRoIEluYy4gaHR0cDovLzI4MG5vcnRoLmNvbS8NCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQNCiovDQoNCmRlZmluZSgnYWNlL2xpYi9lczUtc2hpbScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCi8qKg0KICogQnJpbmdzIGFuIGVudmlyb25tZW50IGFzIGNsb3NlIHRvIEVDTUFTY3JpcHQgNSBjb21wbGlhbmNlDQogKiBhcyBpcyBwb3NzaWJsZSB3aXRoIHRoZSBmYWNpbGl0aWVzIG9mIGVyc3R3aGlsZSBlbmdpbmVzLg0KICoNCiAqIEFubm90YXRlZCBFUzU6IGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8gKHNwZWNpZmljIGxpbmtzIGJlbG93KQ0KICogRVM1IFNwZWM6IGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FY21hLTI2Mi5wZGYNCiAqDQogKiBAbW9kdWxlDQogKi8NCg0KLyp3aGF0c3VwZG9jKi8NCg0KLy8NCi8vIEZ1bmN0aW9uDQovLyA9PT09PT09PQ0KLy8NCg0KLy8gRVMtNSAxNS4zLjQuNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMy40LjUNCg0KaWYgKCFGdW5jdGlvbi5wcm90b3R5cGUuYmluZCkgew0KICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7IC8vIC5sZW5ndGggaXMgMQ0KICAgICAgICAvLyAxLiBMZXQgVGFyZ2V0IGJlIHRoZSB0aGlzIHZhbHVlLg0KICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpczsNCiAgICAgICAgLy8gMi4gSWYgSXNDYWxsYWJsZShUYXJnZXQpIGlzIGZhbHNlLCB0aHJvdyBhIFR5cGVFcnJvciBleGNlcHRpb24uDQogICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9ICJmdW5jdGlvbiIpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICAvLyAzLiBMZXQgQSBiZSBhIG5ldyAocG9zc2libHkgZW1wdHkpIGludGVybmFsIGxpc3Qgb2YgYWxsIG9mIHRoZQ0KICAgICAgICAvLyAgIGFyZ3VtZW50IHZhbHVlcyBwcm92aWRlZCBhZnRlciB0aGlzQXJnIChhcmcxLCBhcmcyIGV0YyksIGluIG9yZGVyLg0KICAgICAgICAvLyBYWFggc2xpY2VkQXJncyB3aWxsIHN0YW5kIGluIGZvciAiQSIgaWYgdXNlZA0KICAgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsgLy8gZm9yIG5vcm1hbCBjYWxsDQogICAgICAgIC8vIDQuIExldCBGIGJlIGEgbmV3IG5hdGl2ZSBFQ01BU2NyaXB0IG9iamVjdC4NCiAgICAgICAgLy8gMTEuIFNldCB0aGUgW1tQcm90b3R5cGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRoZSBzdGFuZGFyZA0KICAgICAgICAvLyAgIGJ1aWx0LWluIEZ1bmN0aW9uIHByb3RvdHlwZSBvYmplY3QgYXMgc3BlY2lmaWVkIGluIDE1LjMuMy4xLg0KICAgICAgICAvLyAxMi4gU2V0IHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbg0KICAgICAgICAvLyAgIDE1LjMuNC41LjEuDQogICAgICAgIC8vIDEzLiBTZXQgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW4NCiAgICAgICAgLy8gICAxNS4zLjQuNS4yLg0KICAgICAgICAvLyAxNC4gU2V0IHRoZSBbW0hhc0luc3RhbmNlXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW4NCiAgICAgICAgLy8gICAxNS4zLjQuNS4zLg0KICAgICAgICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHsNCiAgICAgICAgICAgICAgICAvLyAxNS4zLjQuNS4yIFtbQ29uc3RydWN0XV0NCiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwNCiAgICAgICAgICAgICAgICAvLyBGIHRoYXQgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIGJpbmQgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYQ0KICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYXJndW1lbnRzIEV4dHJhQXJncywgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46DQogICAgICAgICAgICAgICAgLy8gMS4gTGV0IHRhcmdldCBiZSB0aGUgdmFsdWUgb2YgRidzIFtbVGFyZ2V0RnVuY3Rpb25dXQ0KICAgICAgICAgICAgICAgIC8vICAgaW50ZXJuYWwgcHJvcGVydHkuDQogICAgICAgICAgICAgICAgLy8gMi4gSWYgdGFyZ2V0IGhhcyBubyBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCwgYQ0KICAgICAgICAgICAgICAgIC8vICAgVHlwZUVycm9yIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQogICAgICAgICAgICAgICAgLy8gMy4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDQuIExldCBhcmdzIGJlIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlDQogICAgICAgICAgICAgICAgLy8gICBsaXN0IGJvdW5kQXJncyBpbiB0aGUgc2FtZSBvcmRlciBmb2xsb3dlZCBieSB0aGUgc2FtZQ0KICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4NCiAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIA0KICAgICAgICAgICAgICAgIC8vICAgbWV0aG9kIG9mIHRhcmdldCBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLg0KDQogICAgICAgICAgICAgICAgdmFyIEYgPSBmdW5jdGlvbigpe307DQogICAgICAgICAgICAgICAgRi5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlOw0KICAgICAgICAgICAgICAgIHZhciBzZWxmID0gbmV3IEY7DQoNCiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGFyZ2V0LmFwcGx5KA0KICAgICAgICAgICAgICAgICAgICBzZWxmLA0KICAgICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY7DQoNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgLy8gMTUuMy40LjUuMSBbW0NhbGxdXQ0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwgRiwNCiAgICAgICAgICAgICAgICAvLyB3aGljaCB3YXMgY3JlYXRlZCB1c2luZyB0aGUgYmluZCBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhDQogICAgICAgICAgICAgICAgLy8gdGhpcyB2YWx1ZSBhbmQgYSBsaXN0IG9mIGFyZ3VtZW50cyBFeHRyYUFyZ3MsIHRoZSBmb2xsb3dpbmcNCiAgICAgICAgICAgICAgICAvLyBzdGVwcyBhcmUgdGFrZW46DQogICAgICAgICAgICAgICAgLy8gMS4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDIuIExldCBib3VuZFRoaXMgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kVGhpc11dIGludGVybmFsDQogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyAzLiBMZXQgdGFyZ2V0IGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tUYXJnZXRGdW5jdGlvbl1dIGludGVybmFsDQogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyA0LiBMZXQgYXJncyBiZSBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSANCiAgICAgICAgICAgICAgICAvLyAgIGxpc3QgYm91bmRBcmdzIGluIHRoZSBzYW1lIG9yZGVyIGZvbGxvd2VkIGJ5IHRoZSBzYW1lIA0KICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4NCiAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2QgDQogICAgICAgICAgICAgICAgLy8gICBvZiB0YXJnZXQgcHJvdmlkaW5nIGJvdW5kVGhpcyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgDQogICAgICAgICAgICAgICAgLy8gICBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLg0KDQogICAgICAgICAgICAgICAgLy8gZXF1aXY6IHRhcmdldC5jYWxsKHRoaXMsIC4uLmJvdW5kQXJncywgLi4uYXJncykNCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KA0KICAgICAgICAgICAgICAgICAgICB0aGF0LA0KICAgICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH07DQogICAgICAgIC8vIFhYWCBib3VuZC5sZW5ndGggaXMgbmV2ZXIgd3JpdGFibGUsIHNvIGRvbid0IGV2ZW4gdHJ5DQogICAgICAgIC8vDQogICAgICAgIC8vIDE1LiBJZiB0aGUgW1tDbGFzc11dIGludGVybmFsIHByb3BlcnR5IG9mIFRhcmdldCBpcyAiRnVuY3Rpb24iLCB0aGVuDQogICAgICAgIC8vICAgICBhLiBMZXQgTCBiZSB0aGUgbGVuZ3RoIHByb3BlcnR5IG9mIFRhcmdldCBtaW51cyB0aGUgbGVuZ3RoIG9mIEEuDQogICAgICAgIC8vICAgICBiLiBTZXQgdGhlIGxlbmd0aCBvd24gcHJvcGVydHkgb2YgRiB0byBlaXRoZXIgMCBvciBMLCB3aGljaGV2ZXIgaXMgDQogICAgICAgIC8vICAgICAgIGxhcmdlci4NCiAgICAgICAgLy8gMTYuIEVsc2Ugc2V0IHRoZSBsZW5ndGggb3duIHByb3BlcnR5IG9mIEYgdG8gMC4NCiAgICAgICAgLy8gMTcuIFNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIHRoZSB2YWx1ZXMNCiAgICAgICAgLy8gICBzcGVjaWZpZWQgaW4gMTUuMy41LjEuDQoNCiAgICAgICAgLy8gVE9ETw0KICAgICAgICAvLyAxOC4gU2V0IHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRydWUuDQogICAgICAgIA0KICAgICAgICAvLyBUT0RPDQogICAgICAgIC8vIDE5LiBMZXQgdGhyb3dlciBiZSB0aGUgW1tUaHJvd1R5cGVFcnJvcl1dIGZ1bmN0aW9uIE9iamVjdCAoMTMuMi4zKS4NCiAgICAgICAgLy8gMjAuIENhbGwgdGhlIFtbRGVmaW5lT3duUHJvcGVydHldXSBpbnRlcm5hbCBtZXRob2Qgb2YgRiB3aXRoIA0KICAgICAgICAvLyAgIGFyZ3VtZW50cyAiY2FsbGVyIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCBbW1NldF1dOg0KICAgICAgICAvLyAgIHRocm93ZXIsIFtbRW51bWVyYWJsZV1dOiBmYWxzZSwgW1tDb25maWd1cmFibGVdXTogZmFsc2V9LCBhbmQgDQogICAgICAgIC8vICAgZmFsc2UuDQogICAgICAgIC8vIDIxLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aCANCiAgICAgICAgLy8gICBhcmd1bWVudHMgImFyZ3VtZW50cyIsIFByb3BlcnR5RGVzY3JpcHRvciB7W1tHZXRdXTogdGhyb3dlciwgDQogICAgICAgIC8vICAgW1tTZXRdXTogdGhyb3dlciwgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiBmYWxzZX0sDQogICAgICAgIC8vICAgYW5kIGZhbHNlLg0KDQogICAgICAgIC8vIFRPRE8NCiAgICAgICAgLy8gTk9URSBGdW5jdGlvbiBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgZG8gbm90IA0KICAgICAgICAvLyBoYXZlIGEgcHJvdG90eXBlIHByb3BlcnR5IG9yIHRoZSBbW0NvZGVdXSwgW1tGb3JtYWxQYXJhbWV0ZXJzXV0sIGFuZA0KICAgICAgICAvLyBbW1Njb3BlXV0gaW50ZXJuYWwgcHJvcGVydGllcy4NCiAgICAgICAgLy8gWFhYIGNhbid0IGRlbGV0ZSBwcm90b3R5cGUgaW4gcHVyZS1qcy4NCg0KICAgICAgICAvLyAyMi4gUmV0dXJuIEYuDQogICAgICAgIHJldHVybiBib3VuZDsNCiAgICB9Ow0KfQ0KDQovLyBTaG9ydGN1dCB0byBhbiBvZnRlbiBhY2Nlc3NlZCBwcm9wZXJ0aWVzLCBpbiBvcmRlciB0byBhdm9pZCBtdWx0aXBsZQ0KLy8gZGVyZWZlcmVuY2UgdGhhdCBjb3N0cyB1bml2ZXJzYWxseS4NCi8vIF9QbGVhc2Ugbm90ZTogU2hvcnRjdXRzIGFyZSBkZWZpbmVkIGFmdGVyIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgYXMgd2UNCi8vIHVzIGl0IGluIGRlZmluaW5nIHNob3J0Y3V0cy4NCnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7DQp2YXIgcHJvdG90eXBlT2ZBcnJheSA9IEFycmF5LnByb3RvdHlwZTsNCnZhciBwcm90b3R5cGVPZk9iamVjdCA9IE9iamVjdC5wcm90b3R5cGU7DQp2YXIgc2xpY2UgPSBwcm90b3R5cGVPZkFycmF5LnNsaWNlOw0KdmFyIHRvU3RyaW5nID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0LnRvU3RyaW5nKTsNCnZhciBvd25zID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Lmhhc093blByb3BlcnR5KTsNCg0KLy8gSWYgSlMgZW5naW5lIHN1cHBvcnRzIGFjY2Vzc29ycyBjcmVhdGluZyBzaG9ydGN1dHMuDQp2YXIgZGVmaW5lR2V0dGVyOw0KdmFyIGRlZmluZVNldHRlcjsNCnZhciBsb29rdXBHZXR0ZXI7DQp2YXIgbG9va3VwU2V0dGVyOw0KdmFyIHN1cHBvcnRzQWNjZXNzb3JzOw0KaWYgKChzdXBwb3J0c0FjY2Vzc29ycyA9IG93bnMocHJvdG90eXBlT2ZPYmplY3QsICJfX2RlZmluZUdldHRlcl9fIikpKSB7DQogICAgZGVmaW5lR2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fZGVmaW5lR2V0dGVyX18pOw0KICAgIGRlZmluZVNldHRlciA9IGNhbGwuYmluZChwcm90b3R5cGVPZk9iamVjdC5fX2RlZmluZVNldHRlcl9fKTsNCiAgICBsb29rdXBHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBHZXR0ZXJfXyk7DQogICAgbG9va3VwU2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fbG9va3VwU2V0dGVyX18pOw0KfQ0KDQovLw0KLy8gQXJyYXkNCi8vID09PT09DQovLw0KDQovLyBFUzUgMTUuNC4zLjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuMy4yDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pc0FycmF5DQppZiAoIUFycmF5LmlzQXJyYXkpIHsNCiAgICBBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gaXNBcnJheShvYmopIHsNCiAgICAgICAgcmV0dXJuIHRvU3RyaW5nKG9iaikgPT0gIltvYmplY3QgQXJyYXldIjsNCiAgICB9Ow0KfQ0KDQovLyBUaGUgSXNDYWxsYWJsZSgpIGNoZWNrIGluIHRoZSBBcnJheSBmdW5jdGlvbnMNCi8vIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSBzdHJpY3QgY2hlY2sgb24gdGhlDQovLyBpbnRlcm5hbCBjbGFzcyBvZiB0aGUgb2JqZWN0IHRvIHRyYXAgY2FzZXMgd2hlcmUNCi8vIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB3YXMgYWN0dWFsbHkgYSByZWd1bGFyDQovLyBleHByZXNzaW9uIGxpdGVyYWwsIHdoaWNoIGluIFY4IGFuZA0KLy8gSmF2YVNjcmlwdENvcmUgaXMgYSB0eXBlb2YgImZ1bmN0aW9uIi4gIE9ubHkgaW4NCi8vIFY4IGFyZSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbHMgcGVybWl0dGVkIGFzDQovLyByZWR1Y2UgcGFyYW1ldGVycywgc28gaXQgaXMgZGVzaXJhYmxlIGluIHRoZQ0KLy8gZ2VuZXJhbCBjYXNlIGZvciB0aGUgc2hpbSB0byBtYXRjaCB0aGUgbW9yZQ0KLy8gc3RyaWN0IGFuZCBjb21tb24gYmVoYXZpb3Igb2YgcmVqZWN0aW5nIHJlZ3VsYXINCi8vIGV4cHJlc3Npb25zLg0KDQovLyBFUzUgMTUuNC40LjE4DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTgNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2FycmF5L2ZvckVhY2gNCmlmICghQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIGZvckVhY2goZnVuIC8qLCB0aGlzcCovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXSwNCiAgICAgICAgICAgIGkgPSAwLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmKSB7DQogICAgICAgICAgICAgICAgLy8gSW52b2tlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGNhbGwsIHBhc3NpbmcgYXJndW1lbnRzOg0KICAgICAgICAgICAgICAgIC8vIGNvbnRleHQsIHByb3BlcnR5IHZhbHVlLCBwcm9wZXJ0eSBrZXksIHRoaXNBcmcgb2JqZWN0IGNvbnRleHQNCiAgICAgICAgICAgICAgICBmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpKys7DQogICAgICAgIH0NCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjE5DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTkNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvbWFwDQppZiAoIUFycmF5LnByb3RvdHlwZS5tYXApIHsNCiAgICBBcnJheS5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gbWFwKGZ1biAvKiwgdGhpc3AqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDAsDQogICAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpDQogICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4yMA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIwDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L2ZpbHRlcg0KaWYgKCFBcnJheS5wcm90b3R5cGUuZmlsdGVyKSB7DQogICAgQXJyYXkucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlcihmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHJlc3VsdCA9IFtdLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpKQ0KICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNlbGZbaV0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE2DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9ldmVyeQ0KaWYgKCFBcnJheS5wcm90b3R5cGUuZXZlcnkpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZXZlcnkgPSBmdW5jdGlvbiBldmVyeShmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmICFmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZikpDQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS40LjQuMTcNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xNw0KLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29tZQ0KaWYgKCFBcnJheS5wcm90b3R5cGUuc29tZSkgew0KICAgIEFycmF5LnByb3RvdHlwZS5zb21lID0gZnVuY3Rpb24gc29tZShmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4yMQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIxDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L3JlZHVjZQ0KaWYgKCFBcnJheS5wcm90b3R5cGUucmVkdWNlKSB7DQogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uIHJlZHVjZShmdW4gLyosIGluaXRpYWwqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlIGFuZCBhbiBlbXB0eSBhcnJheQ0KICAgICAgICBpZiAoIWxlbmd0aCAmJiBhcmd1bWVudHMubGVuZ3RoID09IDEpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KDQogICAgICAgIHZhciBpID0gMDsNCiAgICAgICAgdmFyIHJlc3VsdDsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpKytdOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuDQogICAgICAgICAgICAgICAgaWYgKCsraSA+PSBsZW5ndGgpDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuLmNhbGwodm9pZCAwLCByZXN1bHQsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjIyDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMjINCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvcmVkdWNlUmlnaHQNCmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0KSB7DQogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gcmVkdWNlUmlnaHQoZnVuIC8qLCBpbml0aWFsKi8pIHsNCiAgICAgICAgdmFyIHNlbGYgPSB0b09iamVjdCh0aGlzKSwNCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICAvLyBubyB2YWx1ZSB0byByZXR1cm4gaWYgbm8gaW5pdGlhbCB2YWx1ZSwgZW1wdHkgYXJyYXkNCiAgICAgICAgaWYgKCFsZW5ndGggJiYgYXJndW1lbnRzLmxlbmd0aCA9PSAxKQ0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCg0KICAgICAgICB2YXIgcmVzdWx0LCBpID0gbGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpLS1dOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuDQogICAgICAgICAgICAgICAgaWYgKC0taSA8IDApDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIGlmIChpIGluIHRoaXMpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuLmNhbGwodm9pZCAwLCByZXN1bHQsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9IHdoaWxlIChpLS0pOw0KDQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE0DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pbmRleE9mDQppZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7DQogICAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKHNvdWdodCAvKiwgZnJvbUluZGV4ICovICkgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgaWYgKCFsZW5ndGgpDQogICAgICAgICAgICByZXR1cm4gLTE7DQoNCiAgICAgICAgdmFyIGkgPSAwOw0KICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpDQogICAgICAgICAgICBpID0gdG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSk7DQoNCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMNCiAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBNYXRoLm1heCgwLCBsZW5ndGggKyBpKTsNCiAgICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiBzZWxmW2ldID09PSBzb3VnaHQpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE1DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9sYXN0SW5kZXhPZg0KaWYgKCFBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YpIHsNCiAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZihzb3VnaHQgLyosIGZyb21JbmRleCAqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgaWYgKCFsZW5ndGgpDQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIHZhciBpID0gbGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKQ0KICAgICAgICAgICAgaSA9IE1hdGgubWluKGksIHRvSW50ZWdlcihhcmd1bWVudHNbMV0pKTsNCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMNCiAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBsZW5ndGggLSBNYXRoLmFicyhpKTsNCiAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIHNvdWdodCA9PT0gc2VsZltpXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCn0NCg0KLy8NCi8vIE9iamVjdA0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgMTUuMi4zLjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4yDQppZiAoIU9iamVjdC5nZXRQcm90b3R5cGVPZikgew0KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvZXM1LXNoaW0vaXNzdWVzI2lzc3VlLzINCiAgICAvLyBodHRwOi8vZWpvaG4ub3JnL2Jsb2cvb2JqZWN0Z2V0cHJvdG90eXBlb2YvDQogICAgLy8gcmVjb21tZW5kZWQgYnkgZnNjaGFlZmVyIG9uIGdpdGh1Yg0KICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gb2JqZWN0Ll9fcHJvdG9fXyB8fCAoDQogICAgICAgICAgICBvYmplY3QuY29uc3RydWN0b3IgPw0KICAgICAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSA6DQogICAgICAgICAgICBwcm90b3R5cGVPZk9iamVjdA0KICAgICAgICApOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMw0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjMNCmlmICghT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcikgew0KICAgIHZhciBFUlJfTk9OX09CSkVDVCA9ICJPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIGNhbGxlZCBvbiBhICIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICJub24tb2JqZWN0OiAiOw0KICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgew0KICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9OT05fT0JKRUNUICsgb2JqZWN0KTsNCiAgICAgICAgLy8gSWYgb2JqZWN0IGRvZXMgbm90IG93bnMgcHJvcGVydHkgcmV0dXJuIHVuZGVmaW5lZCBpbW1lZGlhdGVseS4NCiAgICAgICAgaWYgKCFvd25zKG9iamVjdCwgcHJvcGVydHkpKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBkZXNjcmlwdG9yLCBnZXR0ZXIsIHNldHRlcjsNCg0KICAgICAgICAvLyBJZiBvYmplY3QgaGFzIGEgcHJvcGVydHkgdGhlbiBpdCdzIGZvciBzdXJlIGJvdGggYGVudW1lcmFibGVgIGFuZA0KICAgICAgICAvLyBgY29uZmlndXJhYmxlYC4NCiAgICAgICAgZGVzY3JpcHRvciA9ICB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9Ow0KDQogICAgICAgIC8vIElmIEpTIGVuZ2luZSBzdXBwb3J0cyBhY2Nlc3NvciBwcm9wZXJ0aWVzIHRoZW4gcHJvcGVydHkgbWF5IGJlIGENCiAgICAgICAgLy8gZ2V0dGVyIG9yIHNldHRlci4NCiAgICAgICAgaWYgKHN1cHBvcnRzQWNjZXNzb3JzKSB7DQogICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBhIGdldHRlciBldmVuDQogICAgICAgICAgICAvLyBpZiBvYmplY3QgaGFzIG93biBub24gZ2V0dGVyIHByb3BlcnR5IGFsb25nIHdpdGggYSBzYW1lIG5hbWVkDQogICAgICAgICAgICAvLyBpbmhlcml0ZWQgZ2V0dGVyLiBUbyBhdm9pZCBtaXNiZWhhdmlvciB3ZSB0ZW1wb3JhcnkgcmVtb3ZlDQogICAgICAgICAgICAvLyBgX19wcm90b19fYCBzbyB0aGF0IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBnZXR0ZXIgb25seQ0KICAgICAgICAgICAgLy8gaWYgaXQncyBvd25lZCBieSBhbiBvYmplY3QuDQogICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gb2JqZWN0Ll9fcHJvdG9fXzsNCiAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGVPZk9iamVjdDsNCg0KICAgICAgICAgICAgdmFyIGdldHRlciA9IGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KTsNCiAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSk7DQoNCiAgICAgICAgICAgIC8vIE9uY2Ugd2UgaGF2ZSBnZXR0ZXIgYW5kIHNldHRlciB3ZSBjYW4gcHV0IHZhbHVlcyBiYWNrLg0KICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsNCg0KICAgICAgICAgICAgaWYgKGdldHRlciB8fCBzZXR0ZXIpIHsNCiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSBkZXNjcmlwdG9yLmdldCA9IGdldHRlcjsNCiAgICAgICAgICAgICAgICBpZiAoc2V0dGVyKSBkZXNjcmlwdG9yLnNldCA9IHNldHRlcjsNCg0KICAgICAgICAgICAgICAgIC8vIElmIGl0IHdhcyBhY2Nlc3NvciBwcm9wZXJ0eSB3ZSdyZSBkb25lIGFuZCByZXR1cm4gaGVyZQ0KICAgICAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGF2b2lkIGFkZGluZyBgdmFsdWVgIHRvIHRoZSBkZXNjcmlwdG9yLg0KICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyIHdlIGtub3cgdGhhdCBvYmplY3QgaGFzIGFuIG93biBwcm9wZXJ0eSB0aGF0IGlzDQogICAgICAgIC8vIG5vdCBhbiBhY2Nlc3NvciBzbyB3ZSBzZXQgaXQgYXMgYSB2YWx1ZSBhbmQgcmV0dXJuIGRlc2NyaXB0b3IuDQogICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBvYmplY3RbcHJvcGVydHldOw0KICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy40DQppZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7DQogICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjUNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy41DQppZiAoIU9iamVjdC5jcmVhdGUpIHsNCiAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgew0KICAgICAgICB2YXIgb2JqZWN0Ow0KICAgICAgICBpZiAocHJvdG90eXBlID09PSBudWxsKSB7DQogICAgICAgICAgICBvYmplY3QgPSB7ICJfX3Byb3RvX18iOiBudWxsIH07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAodHlwZW9mIHByb3RvdHlwZSAhPSAib2JqZWN0IikNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlb2YgcHJvdG90eXBlWyIrKHR5cGVvZiBwcm90b3R5cGUpKyJdICE9ICdvYmplY3QnIik7DQogICAgICAgICAgICB2YXIgVHlwZSA9IGZ1bmN0aW9uICgpIHt9Ow0KICAgICAgICAgICAgVHlwZS5wcm90b3R5cGUgPSBwcm90b3R5cGU7DQogICAgICAgICAgICBvYmplY3QgPSBuZXcgVHlwZSgpOw0KICAgICAgICAgICAgLy8gSUUgaGFzIG5vIGJ1aWx0LWluIGltcGxlbWVudGF0aW9uIG9mIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgDQogICAgICAgICAgICAvLyBuZWl0aGVyIGBfX3Byb3RvX19gLCBidXQgdGhpcyBtYW51YWxseSBzZXR0aW5nIGBfX3Byb3RvX19gIHdpbGwNCiAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIHdpbGwgd29yayBhcyBleHBlY3RlZCB3aXRoDQogICAgICAgICAgICAvLyBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgYE9iamVjdC5jcmVhdGVgDQogICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KICAgICAgICB9DQogICAgICAgIGlmIChwcm9wZXJ0aWVzICE9PSB2b2lkIDApDQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpOw0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuNg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjYNCg0KLy8gUGF0Y2ggZm9yIFdlYktpdCBhbmQgSUU4IHN0YW5kYXJkIG1vZGUNCi8vIERlc2lnbmVkIGJ5IGhheCA8aGF4LmdpdGh1Yi5jb20+DQovLyByZWxhdGVkIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL2VzNS1zaGltL2lzc3VlcyNpc3N1ZS81DQovLyBJRTggUmVmZXJlbmNlOg0KLy8gICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZDI4MjkwMC5hc3B4DQovLyAgICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMjI5OTE2LmFzcHgNCi8vIFdlYktpdCBCdWdzOg0KLy8gICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNjQyMw0KDQpmdW5jdGlvbiBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKG9iamVjdCkgew0KICAgIHRyeSB7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsICJzZW50aW5lbCIsIHt9KTsNCiAgICAgICAgcmV0dXJuICJzZW50aW5lbCIgaW4gb2JqZWN0Ow0KICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgew0KICAgICAgICAvLyByZXR1cm5zIGZhbHN5DQogICAgfQ0KfQ0KDQovLyBjaGVjayB3aGV0aGVyIGRlZmluZVByb3BlcnR5IHdvcmtzIGlmIGl0J3MgZ2l2ZW4uIE90aGVyd2lzZSwNCi8vIHNoaW0gcGFydGlhbGx5Lg0KaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgew0KICAgIHZhciBkZWZpbmVQcm9wZXJ0eVdvcmtzT25PYmplY3QgPSBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKHt9KTsNCiAgICB2YXIgZGVmaW5lUHJvcGVydHlXb3Jrc09uRG9tID0gdHlwZW9mIGRvY3VtZW50ID09ICJ1bmRlZmluZWQiIHx8DQogICAgICAgIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOw0KICAgIGlmICghZGVmaW5lUHJvcGVydHlXb3Jrc09uT2JqZWN0IHx8ICFkZWZpbmVQcm9wZXJ0eVdvcmtzT25Eb20pIHsNCiAgICAgICAgdmFyIGRlZmluZVByb3BlcnR5RmFsbGJhY2sgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7DQogICAgfQ0KfQ0KDQppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUX0RFU0NSSVBUT1IgPSAiUHJvcGVydHkgZGVzY3JpcHRpb24gbXVzdCBiZSBhbiBvYmplY3Q6ICI7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUX1RBUkdFVCA9ICJPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbGVkIG9uIG5vbi1vYmplY3Q6ICINCiAgICB2YXIgRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEID0gImdldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCAiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgamF2YXNjcmlwdCBlbmdpbmUiOw0KDQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcikgew0KICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9OT05fT0JKRUNUX1RBUkdFVCArIG9iamVjdCk7DQogICAgICAgIGlmICgodHlwZW9mIGRlc2NyaXB0b3IgIT0gIm9iamVjdCIgJiYgdHlwZW9mIGRlc2NyaXB0b3IgIT0gImZ1bmN0aW9uIikgfHwgZGVzY3JpcHRvciA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX05PTl9PQkpFQ1RfREVTQ1JJUFRPUiArIGRlc2NyaXB0b3IpOw0KDQogICAgICAgIC8vIG1ha2UgYSB2YWxpYW50IGF0dGVtcHQgdG8gdXNlIHRoZSByZWFsIGRlZmluZVByb3BlcnR5DQogICAgICAgIC8vIGZvciBJOCdzIERPTSBlbGVtZW50cy4NCiAgICAgICAgaWYgKGRlZmluZVByb3BlcnR5RmFsbGJhY2spIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5RmFsbGJhY2suY2FsbChPYmplY3QsIG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3IpOw0KICAgICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7DQogICAgICAgICAgICAgICAgLy8gdHJ5IHRoZSBzaGltIGlmIHRoZSByZWFsIG9uZSBkb2Vzbid0IHdvcmsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIElmIGl0J3MgYSBkYXRhIHByb3BlcnR5Lg0KICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAidmFsdWUiKSkgew0KICAgICAgICAgICAgLy8gZmFpbCBzaWxlbnRseSBpZiAid3JpdGFibGUiLCAiZW51bWVyYWJsZSIsIG9yICJjb25maWd1cmFibGUiDQogICAgICAgICAgICAvLyBhcmUgcmVxdWVzdGVkIGJ1dCBub3Qgc3VwcG9ydGVkDQogICAgICAgICAgICAvKg0KICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGFwcHJvYWNoOg0KICAgICAgICAgICAgaWYgKCAvLyBjYW4ndCBpbXBsZW1lbnQgdGhlc2UgZmVhdHVyZXM7IGFsbG93IGZhbHNlIGJ1dCBub3QgdHJ1ZQ0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAid3JpdGFibGUiKSA/IGRlc2NyaXB0b3Iud3JpdGFibGUgOiB0cnVlKSB8fA0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiZW51bWVyYWJsZSIpID8gZGVzY3JpcHRvci5lbnVtZXJhYmxlIDogdHJ1ZSkgfHwNCiAgICAgICAgICAgICAgICAhKG93bnMoZGVzY3JpcHRvciwgImNvbmZpZ3VyYWJsZSIpID8gZGVzY3JpcHRvci5jb25maWd1cmFibGUgOiB0cnVlKQ0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKA0KICAgICAgICAgICAgICAgICAgICAiVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgZG9lcyBub3QgIiArDQogICAgICAgICAgICAgICAgICAgICJzdXBwb3J0IGNvbmZpZ3VyYWJsZSwgZW51bWVyYWJsZSwgb3Igd3JpdGFibGUuIg0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAqLw0KDQogICAgICAgICAgICBpZiAoc3VwcG9ydHNBY2Nlc3NvcnMgJiYgKGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KSB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSkpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIEFzIGFjY2Vzc29ycyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gZW5naW5lcyBpbXBsZW1lbnRpbmcNCiAgICAgICAgICAgICAgICAvLyBgX19wcm90b19fYCB3ZSBjYW4gc2FmZWx5IG92ZXJyaWRlIGBfX3Byb3RvX19gIHdoaWxlIGRlZmluaW5nDQogICAgICAgICAgICAgICAgLy8gYSBwcm9wZXJ0eSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBoaXQgYW4gaW5oZXJpdGVkDQogICAgICAgICAgICAgICAgLy8gYWNjZXNzb3IuDQogICAgICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IG9iamVjdC5fX3Byb3RvX187DQogICAgICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZU9mT2JqZWN0Ow0KICAgICAgICAgICAgICAgIC8vIERlbGV0aW5nIGEgcHJvcGVydHkgYW55d2F5IHNpbmNlIGdldHRlciAvIHNldHRlciBtYXkgYmUNCiAgICAgICAgICAgICAgICAvLyBkZWZpbmVkIG9uIG9iamVjdCBpdHNlbGYuDQogICAgICAgICAgICAgICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV07DQogICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IGRlc2NyaXB0b3IudmFsdWU7DQogICAgICAgICAgICAgICAgLy8gU2V0dGluZyBvcmlnaW5hbCBgX19wcm90b19fYCBiYWNrIG5vdy4NCiAgICAgICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBvYmplY3RbcHJvcGVydHldID0gZGVzY3JpcHRvci52YWx1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICghc3VwcG9ydHNBY2Nlc3NvcnMpDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfQUNDRVNTT1JTX05PVF9TVVBQT1JURUQpOw0KICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoYXQgZmFyIHRoZW4gZ2V0dGVycyBhbmQgc2V0dGVycyBjYW4gYmUgZGVmaW5lZCAhIQ0KICAgICAgICAgICAgaWYgKG93bnMoZGVzY3JpcHRvciwgImdldCIpKQ0KICAgICAgICAgICAgICAgIGRlZmluZUdldHRlcihvYmplY3QsIHByb3BlcnR5LCBkZXNjcmlwdG9yLmdldCk7DQogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAic2V0IikpDQogICAgICAgICAgICAgICAgZGVmaW5lU2V0dGVyKG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3Iuc2V0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy43DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNw0KaWYgKCFPYmplY3QuZGVmaW5lUHJvcGVydGllcykgew0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpIHsNCiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllcykgew0KICAgICAgICAgICAgaWYgKG93bnMocHJvcGVydGllcywgcHJvcGVydHkpKQ0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBwcm9wZXJ0aWVzW3Byb3BlcnR5XSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG9iamVjdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjgNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy44DQppZiAoIU9iamVjdC5zZWFsKSB7DQogICAgT2JqZWN0LnNlYWwgPSBmdW5jdGlvbiBzZWFsKG9iamVjdCkgew0KICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0DQogICAgICAgIC8vIGFsbG93cyAic2VjdXJhYmxlIiBjb2RlIHRvICJncmFjZWZ1bGx5IiBkZWdyYWRlIHRvIHdvcmtpbmcNCiAgICAgICAgLy8gYnV0IGluc2VjdXJlIGNvZGUuDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy45DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuOQ0KaWYgKCFPYmplY3QuZnJlZXplKSB7DQogICAgT2JqZWN0LmZyZWV6ZSA9IGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHsNCiAgICAgICAgLy8gdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCBicmVha3MgZmVhdHVyZS1kZXRlY3Rpb24sIGJ1dA0KICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nDQogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLg0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIGRldGVjdCBhIFJoaW5vIGJ1ZyBhbmQgcGF0Y2ggaXQNCnRyeSB7DQogICAgT2JqZWN0LmZyZWV6ZShmdW5jdGlvbiAoKSB7fSk7DQp9IGNhdGNoIChleGNlcHRpb24pIHsNCiAgICBPYmplY3QuZnJlZXplID0gKGZ1bmN0aW9uIGZyZWV6ZShmcmVlemVPYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHsNCiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09ICJmdW5jdGlvbiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplT2JqZWN0KG9iamVjdCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgfSkoT2JqZWN0LmZyZWV6ZSk7DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTANCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMA0KaWYgKCFPYmplY3QucHJldmVudEV4dGVuc2lvbnMpIHsNCiAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPSBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhvYmplY3QpIHsNCiAgICAgICAgLy8gdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCBicmVha3MgZmVhdHVyZS1kZXRlY3Rpb24sIGJ1dA0KICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nDQogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLg0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTENCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMQ0KaWYgKCFPYmplY3QuaXNTZWFsZWQpIHsNCiAgICBPYmplY3QuaXNTZWFsZWQgPSBmdW5jdGlvbiBpc1NlYWxlZChvYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMg0KaWYgKCFPYmplY3QuaXNGcm96ZW4pIHsNCiAgICBPYmplY3QuaXNGcm96ZW4gPSBmdW5jdGlvbiBpc0Zyb3plbihvYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTMNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMw0KaWYgKCFPYmplY3QuaXNFeHRlbnNpYmxlKSB7DQogICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShvYmplY3QpIHsNCiAgICAgICAgLy8gMS4gSWYgVHlwZShPKSBpcyBub3QgT2JqZWN0IHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKE9iamVjdChvYmplY3QpID09PSBvYmplY3QpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCiAgICAgICAgLy8gMi4gUmV0dXJuIHRoZSBCb29sZWFuIHZhbHVlIG9mIHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBPLg0KICAgICAgICB2YXIgbmFtZSA9ICcnOw0KICAgICAgICB3aGlsZSAob3ducyhvYmplY3QsIG5hbWUpKSB7DQogICAgICAgICAgICBuYW1lICs9ICc/JzsNCiAgICAgICAgfQ0KICAgICAgICBvYmplY3RbbmFtZV0gPSB0cnVlOw0KICAgICAgICB2YXIgcmV0dXJuVmFsdWUgPSBvd25zKG9iamVjdCwgbmFtZSk7DQogICAgICAgIGRlbGV0ZSBvYmplY3RbbmFtZV07DQogICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjE0DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTQNCmlmICghT2JqZWN0LmtleXMpIHsNCiAgICAvLyBodHRwOi8vd2hhdHRoZWhlYWRzYWlkLmNvbS8yMDEwLzEwL2Etc2FmZXItb2JqZWN0LWtleXMtY29tcGF0aWJpbGl0eS1pbXBsZW1lbnRhdGlvbg0KICAgIHZhciBoYXNEb250RW51bUJ1ZyA9IHRydWUsDQogICAgICAgIGRvbnRFbnVtcyA9IFsNCiAgICAgICAgICAgICJ0b1N0cmluZyIsDQogICAgICAgICAgICAidG9Mb2NhbGVTdHJpbmciLA0KICAgICAgICAgICAgInZhbHVlT2YiLA0KICAgICAgICAgICAgImhhc093blByb3BlcnR5IiwNCiAgICAgICAgICAgICJpc1Byb3RvdHlwZU9mIiwNCiAgICAgICAgICAgICJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsDQogICAgICAgICAgICAiY29uc3RydWN0b3IiDQogICAgICAgIF0sDQogICAgICAgIGRvbnRFbnVtc0xlbmd0aCA9IGRvbnRFbnVtcy5sZW5ndGg7DQoNCiAgICBmb3IgKHZhciBrZXkgaW4geyJ0b1N0cmluZyI6IG51bGx9KQ0KICAgICAgICBoYXNEb250RW51bUJ1ZyA9IGZhbHNlOw0KDQogICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgew0KDQogICAgICAgIGlmICgodHlwZW9mIG9iamVjdCAhPSAib2JqZWN0IiAmJiB0eXBlb2Ygb2JqZWN0ICE9ICJmdW5jdGlvbiIpIHx8IG9iamVjdCA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTsNCg0KICAgICAgICB2YXIga2V5cyA9IFtdOw0KICAgICAgICBmb3IgKHZhciBuYW1lIGluIG9iamVjdCkgew0KICAgICAgICAgICAgaWYgKG93bnMob2JqZWN0LCBuYW1lKSkgew0KICAgICAgICAgICAgICAgIGtleXMucHVzaChuYW1lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChoYXNEb250RW51bUJ1Zykgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZG9udEVudW1zTGVuZ3RoOyBpIDwgaWk7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBkb250RW51bSA9IGRvbnRFbnVtc1tpXTsNCiAgICAgICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIGRvbnRFbnVtKSkgew0KICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goZG9udEVudW0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBrZXlzOw0KICAgIH07DQoNCn0NCg0KLy8NCi8vIERhdGUNCi8vID09PT0NCi8vDQoNCi8vIEVTNSAxNS45LjUuNDMNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40Mw0KLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHJlcHJlc2VudCB0aGUgaW5zdGFuY2UgaW4gdGltZSANCi8vIHJlcHJlc2VudGVkIGJ5IHRoaXMgRGF0ZSBvYmplY3QuIFRoZSBmb3JtYXQgb2YgdGhlIFN0cmluZyBpcyB0aGUgRGF0ZSBUaW1lIA0KLy8gc3RyaW5nIGZvcm1hdCBkZWZpbmVkIGluIDE1LjkuMS4xNS4gQWxsIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgU3RyaW5nLiANCi8vIFRoZSB0aW1lIHpvbmUgaXMgYWx3YXlzIFVUQywgZGVub3RlZCBieSB0aGUgc3VmZml4IFouIElmIHRoZSB0aW1lIHZhbHVlIG9mIA0KLy8gdGhpcyBvYmplY3QgaXMgbm90IGEgZmluaXRlIE51bWJlciBhIFJhbmdlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi4NCmlmICghRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgfHwgKG5ldyBEYXRlKC02MjE5ODc1NTIwMDAwMCkudG9JU09TdHJpbmcoKS5pbmRleE9mKCctMDAwMDAxJykgPT09IC0xKSkgew0KICAgIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7DQogICAgICAgIHZhciByZXN1bHQsIGxlbmd0aCwgdmFsdWUsIHllYXI7DQogICAgICAgIGlmICghaXNGaW5pdGUodGhpcykpDQogICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcjsNCg0KICAgICAgICAvLyB0aGUgZGF0ZSB0aW1lIHN0cmluZyBmb3JtYXQgaXMgc3BlY2lmaWVkIGluIDE1LjkuMS4xNS4NCiAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2V0VVRDTW9udGgoKSArIDEsIHRoaXMuZ2V0VVRDRGF0ZSgpLA0KICAgICAgICAgICAgdGhpcy5nZXRVVENIb3VycygpLCB0aGlzLmdldFVUQ01pbnV0ZXMoKSwgdGhpcy5nZXRVVENTZWNvbmRzKCldOw0KICAgICAgICB5ZWFyID0gdGhpcy5nZXRVVENGdWxsWWVhcigpOw0KICAgICAgICB5ZWFyID0gKHllYXIgPCAwID8gJy0nIDogKHllYXIgPiA5OTk5ID8gJysnIDogJycpKSArICgnMDAwMDAnICsgTWF0aC5hYnMoeWVhcikpLnNsaWNlKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5OTkgPyAtNCA6IC02KTsNCg0KICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoOw0KICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsNCiAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0W2xlbmd0aF07DQogICAgICAgICAgICAvLyBwYWQgbW9udGhzLCBkYXlzLCBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMgdG8gaGF2ZSB0d28gZGlnaXRzLg0KICAgICAgICAgICAgaWYgKHZhbHVlIDwgMTApDQogICAgICAgICAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSAiMCIgKyB2YWx1ZTsNCiAgICAgICAgfQ0KICAgICAgICAvLyBwYWQgbWlsbGlzZWNvbmRzIHRvIGhhdmUgdGhyZWUgZGlnaXRzLg0KICAgICAgICByZXR1cm4geWVhciArICItIiArIHJlc3VsdC5zbGljZSgwLCAyKS5qb2luKCItIikgKyAiVCIgKyByZXN1bHQuc2xpY2UoMikuam9pbigiOiIpICsgIi4iICsNCiAgICAgICAgICAgICgiMDAwIiArIHRoaXMuZ2V0VVRDTWlsbGlzZWNvbmRzKCkpLnNsaWNlKC0zKSArICJaIjsNCiAgICB9DQp9DQoNCi8vIEVTNSAxNS45LjQuNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuOS40LjQNCmlmICghRGF0ZS5ub3cpIHsNCiAgICBEYXRlLm5vdyA9IGZ1bmN0aW9uIG5vdygpIHsNCiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS45LjUuNDQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40NA0KLy8gVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIERhdGUgb2JqZWN0IGZvciB1c2UgYnkgDQovLyBKU09OLnN0cmluZ2lmeSAoMTUuMTIuMykuDQppZiAoIURhdGUucHJvdG90eXBlLnRvSlNPTikgew0KICAgIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHsNCiAgICAgICAgLy8gV2hlbiB0aGUgdG9KU09OIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhcmd1bWVudCBrZXksIHRoZSBmb2xsb3dpbmcgDQogICAgICAgIC8vIHN0ZXBzIGFyZSB0YWtlbjoNCg0KICAgICAgICAvLyAxLiAgTGV0IE8gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFRvT2JqZWN0LCBnaXZpbmcgaXQgdGhlIHRoaXMNCiAgICAgICAgLy8gdmFsdWUgYXMgaXRzIGFyZ3VtZW50Lg0KICAgICAgICAvLyAyLiBMZXQgdHYgYmUgVG9QcmltaXRpdmUoTywgaGludCBOdW1iZXIpLg0KICAgICAgICAvLyAzLiBJZiB0diBpcyBhIE51bWJlciBhbmQgaXMgbm90IGZpbml0ZSwgcmV0dXJuIG51bGwuDQogICAgICAgIC8vIFhYWA0KICAgICAgICAvLyA0LiBMZXQgdG9JU08gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0dldF1dIGludGVybmFsIG1ldGhvZCBvZg0KICAgICAgICAvLyBPIHdpdGggYXJndW1lbnQgInRvSVNPU3RyaW5nIi4NCiAgICAgICAgLy8gNS4gSWYgSXNDYWxsYWJsZSh0b0lTTykgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRvSVNPU3RyaW5nICE9ICJmdW5jdGlvbiIpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICAvLyA2LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2Qgb2YNCiAgICAgICAgLy8gIHRvSVNPIHdpdGggTyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgYW4gZW1wdHkgYXJndW1lbnQgbGlzdC4NCiAgICAgICAgcmV0dXJuIHRoaXMudG9JU09TdHJpbmcoKTsNCg0KICAgICAgICAvLyBOT1RFIDEgVGhlIGFyZ3VtZW50IGlzIGlnbm9yZWQuDQoNCiAgICAgICAgLy8gTk9URSAyIFRoZSB0b0pTT04gZnVuY3Rpb24gaXMgaW50ZW50aW9uYWxseSBnZW5lcmljOyBpdCBkb2VzIG5vdA0KICAgICAgICAvLyByZXF1aXJlIHRoYXQgaXRzIHRoaXMgdmFsdWUgYmUgYSBEYXRlIG9iamVjdC4gVGhlcmVmb3JlLCBpdCBjYW4gYmUNCiAgICAgICAgLy8gdHJhbnNmZXJyZWQgdG8gb3RoZXIga2luZHMgb2Ygb2JqZWN0cyBmb3IgdXNlIGFzIGEgbWV0aG9kLiBIb3dldmVyLA0KICAgICAgICAvLyBpdCBkb2VzIHJlcXVpcmUgdGhhdCBhbnkgc3VjaCBvYmplY3QgaGF2ZSBhIHRvSVNPU3RyaW5nIG1ldGhvZC4gQW4NCiAgICAgICAgLy8gb2JqZWN0IGlzIGZyZWUgdG8gdXNlIHRoZSBhcmd1bWVudCBrZXkgdG8gZmlsdGVyIGl0cw0KICAgICAgICAvLyBzdHJpbmdpZmljYXRpb24uDQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjkuNC4yDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjQuMg0KLy8gYmFzZWQgb24gd29yayBzaGFyZWQgYnkgRGFuaWVsIEZyaWVzZW4gKGRhbnRtYW4pDQovLyBodHRwOi8vZ2lzdC5naXRodWIuY29tLzMwMzI0OQ0KaWYgKERhdGUucGFyc2UoIisyNzU3NjAtMDktMTNUMDA6MDA6MDAuMDAwWiIpICE9PSA4LjY0ZTE1KSB7DQogICAgLy8gWFhYIGdsb2JhbCBhc3NpZ25tZW50IHdvbid0IHdvcmsgaW4gZW1iZWRkaW5ncyB0aGF0IHVzZQ0KICAgIC8vIGFuIGFsdGVybmF0ZSBvYmplY3QgZm9yIHRoZSBjb250ZXh0Lg0KICAgIERhdGUgPSAoZnVuY3Rpb24oTmF0aXZlRGF0ZSkgew0KDQogICAgICAgIC8vIERhdGUubGVuZ3RoID09PSA3DQogICAgICAgIHZhciBEYXRlID0gZnVuY3Rpb24gRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgew0KICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7DQogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE5hdGl2ZURhdGUpIHsNCiAgICAgICAgICAgICAgICB2YXIgZGF0ZSA9IGxlbmd0aCA9PSAxICYmIFN0cmluZyhZKSA9PT0gWSA/IC8vIGlzU3RyaW5nKFkpDQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGV4cGxpY2l0bHkgcGFzcyBpdCB0aHJvdWdoIHBhcnNlOg0KICAgICAgICAgICAgICAgICAgICBuZXcgTmF0aXZlRGF0ZShEYXRlLnBhcnNlKFkpKSA6DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gbWFudWFsbHkgbWFrZSBjYWxscyBkZXBlbmRpbmcgb24gYXJndW1lbnQNCiAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIGhlcmUNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDcgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gNiA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQsIGgsIG0sIHMpIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDUgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA0ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCkgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gMyA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQpIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDIgPyBuZXcgTmF0aXZlRGF0ZShZLCBNKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAxID8gbmV3IE5hdGl2ZURhdGUoWSkgOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOYXRpdmVEYXRlKCk7DQogICAgICAgICAgICAgICAgLy8gUHJldmVudCBtaXh1cHMgd2l0aCB1bmZpeGVkIERhdGUgb2JqZWN0DQogICAgICAgICAgICAgICAgZGF0ZS5jb25zdHJ1Y3RvciA9IERhdGU7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICB9Ow0KDQogICAgICAgIC8vIDE1LjkuMS4xNSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdC4NCiAgICAgICAgdmFyIGlzb0RhdGVFeHByZXNzaW9uID0gbmV3IFJlZ0V4cCgiXiIgKw0KICAgICAgICAgICAgIihcXGR7NH18W1wrXC1dXFxkezZ9KSIgKyAvLyBmb3VyLWRpZ2l0IHllYXIgY2FwdHVyZSBvciBzaWduICsgNi1kaWdpdCBleHRlbmRlZCB5ZWFyDQogICAgICAgICAgICAiKD86LShcXGR7Mn0pIiArIC8vIG9wdGlvbmFsIG1vbnRoIGNhcHR1cmUNCiAgICAgICAgICAgICIoPzotKFxcZHsyfSkiICsgLy8gb3B0aW9uYWwgZGF5IGNhcHR1cmUNCiAgICAgICAgICAgICIoPzoiICsgLy8gY2FwdHVyZSBob3VyczptaW51dGVzOnNlY29uZHMubWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgIlQoXFxkezJ9KSIgKyAvLyBob3VycyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIjooXFxkezJ9KSIgKyAvLyBtaW51dGVzIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAiKD86IiArIC8vIG9wdGlvbmFsIDpzZWNvbmRzLm1pbGxpc2Vjb25kcw0KICAgICAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIHNlY29uZHMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICAgICAiKD86XFwuKFxcZHszfSkpPyIgKyAvLyBtaWxsaXNlY29uZHMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIpPyIgKw0KICAgICAgICAgICAgIig/OiIgKyAvLyBjYXB0dXJlIFVUQyBvZmZzZXQgY29tcG9uZW50DQogICAgICAgICAgICAgICAgIlp8IiArIC8vIFVUQyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIig/OiIgKyAvLyBvZmZzZXQgc3BlY2lmaWVyICsvLWhvdXJzOm1pbnV0ZXMNCiAgICAgICAgICAgICAgICAgICAgIihbLStdKSIgKyAvLyBzaWduIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAgICAgIihcXGR7Mn0pIiArIC8vIGhvdXJzIG9mZnNldCBjYXB0dXJlDQogICAgICAgICAgICAgICAgICAgICI6KFxcZHsyfSkiICsgLy8gbWludXRlcyBvZmZzZXQgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIpIiArDQogICAgICAgICAgICAiKT8pPyk/KT8iICsNCiAgICAgICAgIiQiKTsNCg0KICAgICAgICAvLyBDb3B5IGFueSBjdXN0b20gbWV0aG9kcyBhIDNyZCBwYXJ0eSBsaWJyYXJ5IG1heSBoYXZlIGFkZGVkDQogICAgICAgIGZvciAodmFyIGtleSBpbiBOYXRpdmVEYXRlKQ0KICAgICAgICAgICAgRGF0ZVtrZXldID0gTmF0aXZlRGF0ZVtrZXldOw0KDQogICAgICAgIC8vIENvcHkgIm5hdGl2ZSIgbWV0aG9kcyBleHBsaWNpdGx5OyB0aGV5IG1heSBiZSBub24tZW51bWVyYWJsZQ0KICAgICAgICBEYXRlLm5vdyA9IE5hdGl2ZURhdGUubm93Ow0KICAgICAgICBEYXRlLlVUQyA9IE5hdGl2ZURhdGUuVVRDOw0KICAgICAgICBEYXRlLnByb3RvdHlwZSA9IE5hdGl2ZURhdGUucHJvdG90eXBlOw0KICAgICAgICBEYXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGU7DQoNCiAgICAgICAgLy8gVXBncmFkZSBEYXRlLnBhcnNlIHRvIGhhbmRsZSBzaW1wbGlmaWVkIElTTyA4NjAxIHN0cmluZ3MNCiAgICAgICAgRGF0ZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKHN0cmluZykgew0KICAgICAgICAgICAgdmFyIG1hdGNoID0gaXNvRGF0ZUV4cHJlc3Npb24uZXhlYyhzdHJpbmcpOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgbWF0Y2guc2hpZnQoKTsgLy8ga2lsbCBtYXRjaFswXSwgdGhlIGZ1bGwgbWF0Y2gNCiAgICAgICAgICAgICAgICAvLyBwYXJzZSBtb250aHMsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgbWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA3OyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBpZiBuZWNlc3NhcnkNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0gPSArKG1hdGNoW2ldIHx8IChpIDwgMyA/IDEgOiAwKSk7DQogICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoWzFdIGlzIHRoZSBtb250aC4gTW9udGhzIGFyZSAwLTExIGluIEphdmFTY3JpcHQNCiAgICAgICAgICAgICAgICAgICAgLy8gYERhdGVgIG9iamVjdHMsIGJ1dCAxLTEyIGluIElTTyBub3RhdGlvbiwgc28gd2UNCiAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50Lg0KICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0tLTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgVVRDIG9mZnNldCBjb21wb25lbnQNCiAgICAgICAgICAgICAgICB2YXIgbWludXRlT2Zmc2V0ID0gK21hdGNoLnBvcCgpLCBob3VyT2Zmc2V0ID0gK21hdGNoLnBvcCgpLCBzaWduID0gbWF0Y2gucG9wKCk7DQoNCiAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBleHBsaWNpdCB0aW1lIHpvbmUgb2Zmc2V0IGlmIHNwZWNpZmllZA0KICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwOw0KICAgICAgICAgICAgICAgIGlmIChzaWduKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIGRldGVjdCBpbnZhbGlkIG9mZnNldHMgYW5kIHJldHVybiBlYXJseQ0KICAgICAgICAgICAgICAgICAgICBpZiAoaG91ck9mZnNldCA+IDIzIHx8IG1pbnV0ZU9mZnNldCA+IDU5KQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hTjsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBleHByZXNzIHRoZSBwcm92aWRlZCB0aW1lIHpvbmUgb2Zmc2V0IGluIG1pbnV0ZXMuIFRoZSBvZmZzZXQgaXMNCiAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgZm9yIHRpbWUgem9uZXMgd2VzdCBvZiBVVEM7IHBvc2l0aXZlIG90aGVyd2lzZS4NCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGhvdXJPZmZzZXQgKiA2MCArIG1pbnV0ZU9mZnNldCkgKiA2ZTQgKiAoc2lnbiA9PSAiKyIgPyAtMSA6IDEpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIERhdGUuVVRDIGZvciB5ZWFycyBiZXR3ZWVuIDAgYW5kIDk5IGNvbnZlcnRzIHllYXIgdG8gMTkwMCArIHllYXINCiAgICAgICAgICAgICAgICAvLyBUaGUgR3JlZ29yaWFuIGNhbGVuZGFyIGhhcyBhIDQwMC15ZWFyIGN5Y2xlLCBzbyANCiAgICAgICAgICAgICAgICAvLyB0byBEYXRlLlVUQyh5ZWFyICsgNDAwLCAuLi4uICkgLSAxMjYyMjc4MDgwMDAwMCA9PSBEYXRlLlVUQyh5ZWFyLCAuLi4pLA0KICAgICAgICAgICAgICAgIC8vIHdoZXJlIDEyNjIyNzgwODAwMDAwIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBHcmVnb3JpYW4gY2FsZW5kYXIgNDAwIHllYXJzDQogICAgICAgICAgICAgICAgdmFyIHllYXIgPSArbWF0Y2hbMF07DQogICAgICAgICAgICAgICAgaWYgKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5KSB7DQogICAgICAgICAgICAgICAgICAgIG1hdGNoWzBdID0geWVhciArIDQwMDsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUuVVRDLmFwcGx5KHRoaXMsIG1hdGNoKSArIG9mZnNldCAtIDEyNjIyNzgwODAwMDAwOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgYSBuZXcgVVRDIGRhdGUgdmFsdWUsIGFjY291bnRpbmcgZm9yIHRoZSBvcHRpb25hbCBvZmZzZXQNCiAgICAgICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5VVEMuYXBwbHkodGhpcywgbWF0Y2gpICsgb2Zmc2V0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUucGFyc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICAgICAgfTsNCg0KICAgICAgICByZXR1cm4gRGF0ZTsNCiAgICB9KShEYXRlKTsNCn0NCg0KLy8NCi8vIFN0cmluZw0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgMTUuNS40LjIwDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS41LjQuMjANCnZhciB3cyA9ICJceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceEEwXHUxNjgwXHUxODBFXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzIiArDQogICAgIlx1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwQVx1MjAyRlx1MjA1Rlx1MzAwMFx1MjAyOCIgKw0KICAgICJcdTIwMjlcdUZFRkYiOw0KaWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW0gfHwgd3MudHJpbSgpKSB7DQogICAgLy8gaHR0cDovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL2Zhc3Rlci10cmltLWphdmFzY3JpcHQNCiAgICAvLyBodHRwOi8vcGVyZmVjdGlvbmtpbGxzLmNvbS93aGl0ZXNwYWNlLWRldmlhdGlvbnMvDQogICAgd3MgPSAiWyIgKyB3cyArICJdIjsNCiAgICB2YXIgdHJpbUJlZ2luUmVnZXhwID0gbmV3IFJlZ0V4cCgiXiIgKyB3cyArIHdzICsgIioiKSwNCiAgICAgICAgdHJpbUVuZFJlZ2V4cCA9IG5ldyBSZWdFeHAod3MgKyB3cyArICIqJCIpOw0KICAgIFN0cmluZy5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uIHRyaW0oKSB7DQogICAgICAgIHJldHVybiBTdHJpbmcodGhpcykucmVwbGFjZSh0cmltQmVnaW5SZWdleHAsICIiKS5yZXBsYWNlKHRyaW1FbmRSZWdleHAsICIiKTsNCiAgICB9Ow0KfQ0KDQovLw0KLy8gVXRpbA0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgOS40DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3g5LjQNCi8vIGh0dHA6Ly9qc3BlcmYuY29tL3RvLWludGVnZXINCnZhciB0b0ludGVnZXIgPSBmdW5jdGlvbiAobikgew0KICAgIG4gPSArbjsNCiAgICBpZiAobiAhPT0gbikgLy8gaXNOYU4NCiAgICAgICAgbiA9IDA7DQogICAgZWxzZSBpZiAobiAhPT0gMCAmJiBuICE9PSAoMS8wKSAmJiBuICE9PSAtKDEvMCkpDQogICAgICAgIG4gPSAobiA+IDAgfHwgLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7DQogICAgcmV0dXJuIG47DQp9Ow0KDQp2YXIgcHJlcGFyZVN0cmluZyA9ICJhIlswXSAhPSAiYSIsDQogICAgLy8gRVM1IDkuOQ0KICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuOQ0KICAgIHRvT2JqZWN0ID0gZnVuY3Rpb24gKG8pIHsNCiAgICAgICAgaWYgKG8gPT0gbnVsbCkgeyAvLyB0aGlzIG1hdGNoZXMgYm90aCBudWxsIGFuZCB1bmRlZmluZWQNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCiAgICAgICAgLy8gSWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBieS1pbmRleCBhY2Nlc3Mgb2YNCiAgICAgICAgLy8gc3RyaW5nIGNoYXJhY3RlcnMgKGV4LiBJRSA8IDcpLCBzcGxpdCB0aGUgc3RyaW5nDQogICAgICAgIGlmIChwcmVwYXJlU3RyaW5nICYmIHR5cGVvZiBvID09ICJzdHJpbmciICYmIG8pIHsNCiAgICAgICAgICAgIHJldHVybiBvLnNwbGl0KCIiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gT2JqZWN0KG8pOw0KICAgIH07DQp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPiAoaHR0cDovL2plZGl0b29sa2l0LmNvbSkNCiAqICAgICAgTWlrZSBkZSBCb2VyIDxtaWtlIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBFdmVudEVtaXR0ZXIgPSB7fTsNCg0KRXZlbnRFbWl0dGVyLl9lbWl0ID0NCkV2ZW50RW1pdHRlci5fZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgZSkgew0KICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5IHx8IHt9Ow0KICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVycyA9IHRoaXMuX2RlZmF1bHRIYW5kbGVycyB8fCB7fTsNCg0KICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV0gfHwgW107DQogICAgdmFyIGRlZmF1bHRIYW5kbGVyID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzW2V2ZW50TmFtZV07DQogICAgaWYgKCFsaXN0ZW5lcnMubGVuZ3RoICYmICFkZWZhdWx0SGFuZGxlcikNCiAgICAgICAgcmV0dXJuOw0KDQogICAgZSA9IGUgfHwge307DQogICAgZS50eXBlID0gZXZlbnROYW1lOw0KICAgIA0KICAgIGlmICghZS5zdG9wUHJvcGFnYXRpb24pIHsNCiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsNCiAgICAgICAgfTsNCiAgICB9DQogICAgDQogICAgaWYgKCFlLnByZXZlbnREZWZhdWx0KSB7DQogICAgICAgIGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7DQogICAgICAgIH07DQogICAgfQ0KDQogICAgZm9yICh2YXIgaT0wOyBpPGxpc3RlbmVycy5sZW5ndGg7IGkrKykgew0KICAgICAgICBsaXN0ZW5lcnNbaV0oZSk7DQogICAgICAgIGlmIChlLnByb3BhZ2F0aW9uU3RvcHBlZCkNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICANCiAgICBpZiAoZGVmYXVsdEhhbmRsZXIgJiYgIWUuZGVmYXVsdFByZXZlbnRlZCkNCiAgICAgICAgZGVmYXVsdEhhbmRsZXIoZSk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIuc2V0RGVmYXVsdEhhbmRsZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzIHx8IHt9Ow0KICAgIA0KICAgIGlmICh0aGlzLl9kZWZhdWx0SGFuZGxlcnNbZXZlbnROYW1lXSkNCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgZGVmYXVsdCBoYW5kbGVyIGZvciAnIiArIGV2ZW50TmFtZSArICInIGlzIGFscmVhZHkgc2V0Iik7DQogICAgICAgIA0KICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVyc1tldmVudE5hbWVdID0gY2FsbGJhY2s7DQp9Ow0KDQpFdmVudEVtaXR0ZXIub24gPQ0KRXZlbnRFbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307DQoNCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOw0KICAgIGlmICghbGlzdGVuZXJzKQ0KICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdID0gW107DQoNCiAgICBpZiAobGlzdGVuZXJzLmluZGV4T2YoY2FsbGJhY2spID09IC0xKQ0KICAgICAgICBsaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPQ0KRXZlbnRFbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307DQoNCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOw0KICAgIGlmICghbGlzdGVuZXJzKQ0KICAgICAgICByZXR1cm47DQoNCiAgICB2YXIgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihjYWxsYmFjayk7DQogICAgaWYgKGluZGV4ICE9PSAtMSkNCiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7DQogICAgaWYgKHRoaXMuX2V2ZW50UmVnaXN0cnkpIHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSA9IFtdOw0KfTsNCg0KZXhwb3J0cy5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvb29wJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KZXhwb3J0cy5pbmhlcml0cyA9IChmdW5jdGlvbigpIHsNCiAgICB2YXIgdGVtcEN0b3IgPSBmdW5jdGlvbigpIHt9Ow0KICAgIHJldHVybiBmdW5jdGlvbihjdG9yLCBzdXBlckN0b3IpIHsNCiAgICAgICAgdGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTsNCiAgICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3IucHJvdG90eXBlOw0KICAgICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOw0KICAgICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7DQogICAgfTsNCn0oKSk7DQoNCmV4cG9ydHMubWl4aW4gPSBmdW5jdGlvbihvYmosIG1peGluKSB7DQogICAgZm9yICh2YXIga2V5IGluIG1peGluKSB7DQogICAgICAgIG9ialtrZXldID0gbWl4aW5ba2V5XTsNCiAgICB9DQp9Ow0KDQpleHBvcnRzLmltcGxlbWVudCA9IGZ1bmN0aW9uKHByb3RvLCBtaXhpbikgew0KICAgIGV4cG9ydHMubWl4aW4ocHJvdG8sIG1peGluKTsNCn07DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQogDQpkZWZpbmUoJ2FjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2Uvd29ya2VyL21pcnJvcicsICdhY2Uvd29ya2VyL2pzaGludCcsICdhY2UvbmFyY2lzc3VzL2pzcGFyc2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQogICAgDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIE1pcnJvciA9IHJlcXVpcmUoIi4uL3dvcmtlci9taXJyb3IiKS5NaXJyb3I7DQp2YXIgbGludCA9IHJlcXVpcmUoIi4uL3dvcmtlci9qc2hpbnQiKS5KU0hJTlQ7DQogICAgDQp2YXIgSmF2YVNjcmlwdFdvcmtlciA9IGV4cG9ydHMuSmF2YVNjcmlwdFdvcmtlciA9IGZ1bmN0aW9uKHNlbmRlcikgew0KICAgIE1pcnJvci5jYWxsKHRoaXMsIHNlbmRlcik7DQogICAgdGhpcy5zZXRUaW1lb3V0KDUwMCk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoSmF2YVNjcmlwdFdvcmtlciwgTWlycm9yKTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHRoaXMub25VcGRhdGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5kb2MuZ2V0VmFsdWUoKTsNCiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eIyEuKlxuLywgIlxuIik7DQogICAgICAgIA0KLy8gICAgICAgIHZhciBzdGFydCA9IG5ldyBEYXRlKCk7DQogICAgICAgIHZhciBwYXJzZXIgPSByZXF1aXJlKCIuLi9uYXJjaXNzdXMvanNwYXJzZSIpOw0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgcGFyc2VyLnBhcnNlKHZhbHVlKTsNCiAgICAgICAgfSBjYXRjaChlKSB7DQovLyAgICAgICAgICAgIGNvbnNvbGUubG9nKCJuYXJjaXNzdXMiKQ0KLy8gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTsNCiAgICAgICAgICAgIHZhciBjaHVua3MgPSBlLm1lc3NhZ2Uuc3BsaXQoIjoiKQ0KICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBjaHVua3MucG9wKCkudHJpbSgpOw0KICAgICAgICAgICAgdmFyIGxpbmVOdW1iZXIgPSBwYXJzZUludChjaHVua3MucG9wKCkudHJpbSgpKSAtIDE7DQogICAgICAgICAgICB0aGlzLnNlbmRlci5lbWl0KCJuYXJjaXNzdXMiLCB7DQogICAgICAgICAgICAgICAgcm93OiBsaW5lTnVtYmVyLA0KICAgICAgICAgICAgICAgIGNvbHVtbjogbnVsbCwgLy8gVE9ETyBjb252ZXJ0IGUuY3Vyc29yDQogICAgICAgICAgICAgICAgdGV4dDogbWVzc2FnZSwNCiAgICAgICAgICAgICAgICB0eXBlOiAiZXJyb3IiDQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfSBmaW5hbGx5IHsNCi8vICAgICAgICAgICAgY29uc29sZS5sb2coInBhcnNlIHRpbWU6ICIgKyAobmV3IERhdGUoKSAtIHN0YXJ0KSk7DQogICAgICAgIH0NCiAgICAgICAgDQovLyAgICAgICAgdmFyIHN0YXJ0ID0gbmV3IERhdGUoKTsNCi8vICAgICAgICBjb25zb2xlLmxvZygianNsaW50IikNCiAgICAgICAgbGludCh2YWx1ZSwge3VuZGVmOiBmYWxzZSwgb25ldmFyOiBmYWxzZSwgcGFzc2ZhaWw6IGZhbHNlfSk7DQogICAgICAgIHRoaXMuc2VuZGVyLmVtaXQoImpzbGludCIsIGxpbnQuZXJyb3JzKTsgICAgICAgIA0KLy8gICAgICAgIGNvbnNvbGUubG9nKCJsaW50IHRpbWU6ICIgKyAobmV3IERhdGUoKSAtIHN0YXJ0KSk7DQogICAgfQ0KICAgIA0KfSkuY2FsbChKYXZhU2NyaXB0V29ya2VyLnByb3RvdHlwZSk7DQoNCn0pO2RlZmluZSgnYWNlL3dvcmtlci9taXJyb3InLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9kb2N1bWVudCcsICdhY2UvbGliL2xhbmcnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBEb2N1bWVudCA9IHJlcXVpcmUoIi4uL2RvY3VtZW50IikuRG9jdW1lbnQ7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQogICAgDQp2YXIgTWlycm9yID0gZXhwb3J0cy5NaXJyb3IgPSBmdW5jdGlvbihzZW5kZXIpIHsNCiAgICB0aGlzLnNlbmRlciA9IHNlbmRlcjsNCiAgICB2YXIgZG9jID0gdGhpcy5kb2MgPSBuZXcgRG9jdW1lbnQoIiIpOw0KICAgIA0KICAgIHZhciBkZWZlcnJlZFVwZGF0ZSA9IHRoaXMuZGVmZXJyZWRVcGRhdGUgPSBsYW5nLmRlZmVycmVkQ2FsbCh0aGlzLm9uVXBkYXRlLmJpbmQodGhpcykpOw0KICAgIA0KICAgIHZhciBfc2VsZiA9IHRoaXM7DQogICAgc2VuZGVyLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7DQogICAgICAgIGRvYy5hcHBseURlbHRhcyhbZS5kYXRhXSk7ICAgICAgICANCiAgICAgICAgZGVmZXJyZWRVcGRhdGUuc2NoZWR1bGUoX3NlbGYuJHRpbWVvdXQpOw0KICAgIH0pOw0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHRoaXMuJHRpbWVvdXQgPSA1MDA7DQogICAgDQogICAgdGhpcy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24odGltZW91dCkgew0KICAgICAgICB0aGlzLiR0aW1lb3V0ID0gdGltZW91dDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuc2V0VmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICB0aGlzLmRvYy5zZXRWYWx1ZSh2YWx1ZSk7DQogICAgICAgIHRoaXMuZGVmZXJyZWRVcGRhdGUuc2NoZWR1bGUodGhpcy4kdGltZW91dCk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oY2FsbGJhY2tJZCkgew0KICAgICAgICB0aGlzLnNlbmRlci5jYWxsYmFjayh0aGlzLmRvYy5nZXRWYWx1ZSgpLCBjYWxsYmFja0lkKTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMub25VcGRhdGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgLy8gYWJzdHJhY3QgbWV0aG9kDQogICAgfTsNCiAgICANCn0pLmNhbGwoTWlycm9yLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9kb2N1bWVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJywgJ2FjZS9yYW5nZScsICdhY2UvYW5jaG9yJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi9saWIvb29wIik7DQp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBBbmNob3IgPSByZXF1aXJlKCIuL2FuY2hvciIpLkFuY2hvcjsNCg0KdmFyIERvY3VtZW50ID0gZnVuY3Rpb24odGV4dCkgew0KICAgIHRoaXMuJGxpbmVzID0gW107DQoNCiAgICBpZiAoQXJyYXkuaXNBcnJheSh0ZXh0KSkgew0KICAgICAgICB0aGlzLmluc2VydExpbmVzKDAsIHRleHQpOw0KICAgIH0NCiAgICAvLyBUaGVyZSBoYXMgdG8gYmUgb25lIGxpbmUgYXQgbGVhc3QgaW4gdGhlIGRvY3VtZW50LiBJZiB5b3UgcGFzcyBhbiBlbXB0eQ0KICAgIC8vIHN0cmluZyB0byB0aGUgaW5zZXJ0IGZ1bmN0aW9uLCBub3RoaW5nIHdpbGwgaGFwcGVuLiBXb3JrYXJvdW5kLg0KICAgIGVsc2UgaWYgKHRleHQubGVuZ3RoID09IDApIHsNCiAgICAgICAgdGhpcy4kbGluZXMgPSBbIiJdOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuaW5zZXJ0KHtyb3c6IDAsIGNvbHVtbjowfSwgdGV4dCk7DQogICAgfQ0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KDQogICAgdGhpcy5zZXRWYWx1ZSA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICAgICAgdmFyIGxlbiA9IHRoaXMuZ2V0TGVuZ3RoKCk7DQogICAgICAgIHRoaXMucmVtb3ZlKG5ldyBSYW5nZSgwLCAwLCBsZW4sIHRoaXMuZ2V0TGluZShsZW4tMSkubGVuZ3RoKSk7DQogICAgICAgIHRoaXMuaW5zZXJ0KHtyb3c6IDAsIGNvbHVtbjowfSwgdGV4dCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0VmFsdWUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsTGluZXMoKS5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKTsNCiAgICB9Ow0KDQogICAgdGhpcy5jcmVhdGVBbmNob3IgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICByZXR1cm4gbmV3IEFuY2hvcih0aGlzLCByb3csIGNvbHVtbik7DQogICAgfTsNCg0KICAgIC8vIGNoZWNrIGZvciBJRSBzcGxpdCBidWcNCiAgICBpZiAoImFhYSIuc3BsaXQoL2EvKS5sZW5ndGggPT0gMCkNCiAgICAgICAgdGhpcy4kc3BsaXQgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cclxufFxyL2csICJcbiIpLnNwbGl0KCJcbiIpOw0KICAgICAgICB9DQogICAgZWxzZQ0KICAgICAgICB0aGlzLiRzcGxpdCA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICAgICAgICAgIHJldHVybiB0ZXh0LnNwbGl0KC9cclxufFxyfFxuLyk7DQogICAgICAgIH07DQoNCg0KICAgIHRoaXMuJGRldGVjdE5ld0xpbmUgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgIHZhciBtYXRjaCA9IHRleHQubWF0Y2goL14uKj8oXHJcbnxccnxcbikvbSk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdGhpcy4kYXV0b05ld0xpbmUgPSBtYXRjaFsxXTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gIlxuIjsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIgPSBmdW5jdGlvbigpIHsNCiAgICAgIHN3aXRjaCAodGhpcy4kbmV3TGluZU1vZGUpIHsNCiAgICAgICAgICBjYXNlICJ3aW5kb3dzIjoNCiAgICAgICAgICAgICAgcmV0dXJuICJcclxuIjsNCg0KICAgICAgICAgIGNhc2UgInVuaXgiOg0KICAgICAgICAgICAgICByZXR1cm4gIlxuIjsNCg0KICAgICAgICAgIGNhc2UgImF1dG8iOg0KICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kYXV0b05ld0xpbmU7DQogICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gIlxuIjsNCiAgICB0aGlzLiRuZXdMaW5lTW9kZSA9ICJhdXRvIjsNCiAgICB0aGlzLnNldE5ld0xpbmVNb2RlID0gZnVuY3Rpb24obmV3TGluZU1vZGUpIHsNCiAgICAgICAgaWYgKHRoaXMuJG5ld0xpbmVNb2RlID09PSBuZXdMaW5lTW9kZSkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB0aGlzLiRuZXdMaW5lTW9kZSA9IG5ld0xpbmVNb2RlOw0KICAgIH07DQoNCiAgICB0aGlzLmdldE5ld0xpbmVNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRuZXdMaW5lTW9kZTsNCiAgICB9Ow0KDQogICAgdGhpcy5pc05ld0xpbmUgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgIHJldHVybiAodGV4dCA9PSAiXHJcbiIgfHwgdGV4dCA9PSAiXHIiIHx8IHRleHQgPT0gIlxuIik7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIEdldCBhIHZlcmJhdGltIGNvcHkgb2YgdGhlIGdpdmVuIGxpbmUgYXMgaXQgaXMgaW4gdGhlIGRvY3VtZW50DQogICAgICovDQogICAgdGhpcy5nZXRMaW5lID0gZnVuY3Rpb24ocm93KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRsaW5lc1tyb3ddIHx8ICIiOw0KICAgIH07DQoNCiAgICB0aGlzLmdldExpbmVzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzLnNsaWNlKGZpcnN0Um93LCBsYXN0Um93ICsgMSk7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIFJldHVybnMgYWxsIGxpbmVzIGluIHRoZSBkb2N1bWVudCBhcyBzdHJpbmcgYXJyYXkuIFdhcm5pbmc6IFRoZSBjYWxsZXINCiAgICAgKiBzaG91bGQgbm90IG1vZGlmeSB0aGlzIGFycmF5IQ0KICAgICAqLw0KICAgIHRoaXMuZ2V0QWxsTGluZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZXMoMCwgdGhpcy5nZXRMZW5ndGgoKSk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TGVuZ3RoID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5sZW5ndGg7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0VGV4dFJhbmdlID0gZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PSByYW5nZS5lbmQucm93KSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy4kbGluZXNbcmFuZ2Uuc3RhcnQucm93XS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB2YXIgbGluZXMgPSBbXTsNCiAgICAgICAgICAgIGxpbmVzLnB1c2godGhpcy4kbGluZXNbcmFuZ2Uuc3RhcnQucm93XS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uKSk7DQogICAgICAgICAgICBsaW5lcy5wdXNoLmFwcGx5KGxpbmVzLCB0aGlzLmdldExpbmVzKHJhbmdlLnN0YXJ0LnJvdysxLCByYW5nZS5lbmQucm93LTEpKTsNCiAgICAgICAgICAgIGxpbmVzLnB1c2godGhpcy4kbGluZXNbcmFuZ2UuZW5kLnJvd10uc3Vic3RyaW5nKDAsIHJhbmdlLmVuZC5jb2x1bW4pKTsNCiAgICAgICAgICAgIHJldHVybiBsaW5lcy5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLiRjbGlwUG9zaXRpb24gPSBmdW5jdGlvbihwb3NpdGlvbikgew0KICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5nZXRMZW5ndGgoKTsNCiAgICAgICAgaWYgKHBvc2l0aW9uLnJvdyA+PSBsZW5ndGgpIHsNCiAgICAgICAgICAgIHBvc2l0aW9uLnJvdyA9IE1hdGgubWF4KDAsIGxlbmd0aCAtIDEpOw0KICAgICAgICAgICAgcG9zaXRpb24uY29sdW1uID0gdGhpcy5nZXRMaW5lKGxlbmd0aC0xKS5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHBvc2l0aW9uOw0KICAgIH07DQoNCiAgICB0aGlzLmluc2VydCA9IGZ1bmN0aW9uKHBvc2l0aW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOw0KDQogICAgICAgIHBvc2l0aW9uID0gdGhpcy4kY2xpcFBvc2l0aW9uKHBvc2l0aW9uKTsNCg0KICAgICAgICBpZiAodGhpcy5nZXRMZW5ndGgoKSA8PSAxKQ0KICAgICAgICAgICAgdGhpcy4kZGV0ZWN0TmV3TGluZSh0ZXh0KTsNCg0KICAgICAgICB2YXIgbGluZXMgPSB0aGlzLiRzcGxpdCh0ZXh0KTsNCiAgICAgICAgdmFyIGZpcnN0TGluZSA9IGxpbmVzLnNwbGljZSgwLCAxKVswXTsNCiAgICAgICAgdmFyIGxhc3RMaW5lID0gbGluZXMubGVuZ3RoID09IDAgPyBudWxsIDogbGluZXMuc3BsaWNlKGxpbmVzLmxlbmd0aCAtIDEsIDEpWzBdOw0KDQogICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRJbkxpbmUocG9zaXRpb24sIGZpcnN0TGluZSk7DQogICAgICAgIGlmIChsYXN0TGluZSAhPT0gbnVsbCkgew0KICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmluc2VydE5ld0xpbmUocG9zaXRpb24pOyAvLyB0ZXJtaW5hdGUgZmlyc3QgbGluZQ0KICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmluc2VydExpbmVzKHBvc2l0aW9uLnJvdywgbGluZXMpOw0KICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmluc2VydEluTGluZShwb3NpdGlvbiwgbGFzdExpbmUgfHwgIiIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBwb3NpdGlvbjsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnRMaW5lcyA9IGZ1bmN0aW9uKHJvdywgbGluZXMpIHsNCiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgcmV0dXJuIHtyb3c6IHJvdywgY29sdW1uOiAwfTsNCg0KICAgICAgICB2YXIgYXJncyA9IFtyb3csIDBdOw0KICAgICAgICBhcmdzLnB1c2guYXBwbHkoYXJncywgbGluZXMpOw0KICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2UuYXBwbHkodGhpcy4kbGluZXMsIGFyZ3MpOw0KDQogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShyb3csIDAsIHJvdyArIGxpbmVzLmxlbmd0aCwgMCk7DQogICAgICAgIHZhciBkZWx0YSA9IHsNCiAgICAgICAgICAgIGFjdGlvbjogImluc2VydExpbmVzIiwNCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwNCiAgICAgICAgICAgIGxpbmVzOiBsaW5lcw0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOw0KICAgICAgICByZXR1cm4gcmFuZ2UuZW5kOw0KICAgIH07DQoNCiAgICB0aGlzLmluc2VydE5ld0xpbmUgPSBmdW5jdGlvbihwb3NpdGlvbikgew0KICAgICAgICBwb3NpdGlvbiA9IHRoaXMuJGNsaXBQb3NpdGlvbihwb3NpdGlvbik7DQogICAgICAgIHZhciBsaW5lID0gdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSB8fCAiIjsNCg0KICAgICAgICB0aGlzLiRsaW5lc1twb3NpdGlvbi5yb3ddID0gbGluZS5zdWJzdHJpbmcoMCwgcG9zaXRpb24uY29sdW1uKTsNCiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlKHBvc2l0aW9uLnJvdyArIDEsIDAsIGxpbmUuc3Vic3RyaW5nKHBvc2l0aW9uLmNvbHVtbiwgbGluZS5sZW5ndGgpKTsNCg0KICAgICAgICB2YXIgZW5kID0gew0KICAgICAgICAgICAgcm93IDogcG9zaXRpb24ucm93ICsgMSwNCiAgICAgICAgICAgIGNvbHVtbiA6IDANCiAgICAgICAgfTsNCg0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJpbnNlcnRUZXh0IiwNCiAgICAgICAgICAgIHJhbmdlOiBSYW5nZS5mcm9tUG9pbnRzKHBvc2l0aW9uLCBlbmQpLA0KICAgICAgICAgICAgdGV4dDogdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCg0KICAgICAgICByZXR1cm4gZW5kOw0KICAgIH07DQoNCiAgICB0aGlzLmluc2VydEluTGluZSA9IGZ1bmN0aW9uKHBvc2l0aW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOw0KDQogICAgICAgIHZhciBsaW5lID0gdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSB8fCAiIjsNCg0KICAgICAgICB0aGlzLiRsaW5lc1twb3NpdGlvbi5yb3ddID0gbGluZS5zdWJzdHJpbmcoMCwgcG9zaXRpb24uY29sdW1uKSArIHRleHQNCiAgICAgICAgICAgICAgICArIGxpbmUuc3Vic3RyaW5nKHBvc2l0aW9uLmNvbHVtbik7DQoNCiAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgIHJvdyA6IHBvc2l0aW9uLnJvdywNCiAgICAgICAgICAgIGNvbHVtbiA6IHBvc2l0aW9uLmNvbHVtbiArIHRleHQubGVuZ3RoDQogICAgICAgIH07DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0VGV4dCIsDQogICAgICAgICAgICByYW5nZTogUmFuZ2UuZnJvbVBvaW50cyhwb3NpdGlvbiwgZW5kKSwNCiAgICAgICAgICAgIHRleHQ6IHRleHQNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCg0KICAgICAgICByZXR1cm4gZW5kOw0KICAgIH07DQoNCiAgICB0aGlzLnJlbW92ZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIC8vIGNsaXAgdG8gZG9jdW1lbnQNCiAgICAgICAgcmFuZ2Uuc3RhcnQgPSB0aGlzLiRjbGlwUG9zaXRpb24ocmFuZ2Uuc3RhcnQpOw0KICAgICAgICByYW5nZS5lbmQgPSB0aGlzLiRjbGlwUG9zaXRpb24ocmFuZ2UuZW5kKTsNCg0KICAgICAgICBpZiAocmFuZ2UuaXNFbXB0eSgpKQ0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0Ow0KDQogICAgICAgIHZhciBmaXJzdFJvdyA9IHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgdmFyIGxhc3RSb3cgPSByYW5nZS5lbmQucm93Ow0KDQogICAgICAgIGlmIChyYW5nZS5pc011bHRpTGluZSgpKSB7DQogICAgICAgICAgICB2YXIgZmlyc3RGdWxsUm93ID0gcmFuZ2Uuc3RhcnQuY29sdW1uID09IDAgPyBmaXJzdFJvdyA6IGZpcnN0Um93ICsgMTsNCiAgICAgICAgICAgIHZhciBsYXN0RnVsbFJvdyA9IGxhc3RSb3cgLSAxOw0KDQogICAgICAgICAgICBpZiAocmFuZ2UuZW5kLmNvbHVtbiA+IDApDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJbkxpbmUobGFzdFJvdywgMCwgcmFuZ2UuZW5kLmNvbHVtbik7DQoNCiAgICAgICAgICAgIGlmIChsYXN0RnVsbFJvdyA+PSBmaXJzdEZ1bGxSb3cpDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMaW5lcyhmaXJzdEZ1bGxSb3csIGxhc3RGdWxsUm93KTsNCg0KICAgICAgICAgICAgaWYgKGZpcnN0RnVsbFJvdyAhPSBmaXJzdFJvdykgew0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSW5MaW5lKGZpcnN0Um93LCByYW5nZS5zdGFydC5jb2x1bW4sIHRoaXMuZ2V0TGluZShmaXJzdFJvdykubGVuZ3RoKTsNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZU5ld0xpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMucmVtb3ZlSW5MaW5lKGZpcnN0Um93LCByYW5nZS5zdGFydC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmVJbkxpbmUgPSBmdW5jdGlvbihyb3csIHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pIHsNCiAgICAgICAgaWYgKHN0YXJ0Q29sdW1uID09IGVuZENvbHVtbikNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCBzdGFydENvbHVtbiwgcm93LCBlbmRDb2x1bW4pOw0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgcmVtb3ZlZCA9IGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pOw0KICAgICAgICB2YXIgbmV3TGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIHN0YXJ0Q29sdW1uKSArIGxpbmUuc3Vic3RyaW5nKGVuZENvbHVtbiwgbGluZS5sZW5ndGgpOw0KICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2Uocm93LCAxLCBuZXdMaW5lKTsNCg0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVUZXh0IiwNCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwNCiAgICAgICAgICAgIHRleHQ6IHJlbW92ZWQNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCiAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0Ow0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBSZW1vdmVzIGEgcmFuZ2Ugb2YgZnVsbCBsaW5lcw0KICAgICAqDQogICAgICogQHBhcmFtIGZpcnN0Um93IHtJbnRlZ2VyfSBUaGUgZmlyc3Qgcm93IHRvIGJlIHJlbW92ZWQNCiAgICAgKiBAcGFyYW0gbGFzdFJvdyB7SW50ZWdlcn0gVGhlIGxhc3Qgcm93IHRvIGJlIHJlbW92ZWQNCiAgICAgKiBAcmV0dXJuIHtTdHJpbmdbXX0gVGhlIHJlbW92ZWQgbGluZXMNCiAgICAgKi8NCiAgICB0aGlzLnJlbW92ZUxpbmVzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKGZpcnN0Um93LCAwLCBsYXN0Um93ICsgMSwgMCk7DQogICAgICAgIHZhciByZW1vdmVkID0gdGhpcy4kbGluZXMuc3BsaWNlKGZpcnN0Um93LCBsYXN0Um93IC0gZmlyc3RSb3cgKyAxKTsNCg0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVMaW5lcyIsDQogICAgICAgICAgICByYW5nZTogcmFuZ2UsDQogICAgICAgICAgICBubDogdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCksDQogICAgICAgICAgICBsaW5lczogcmVtb3ZlZA0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOw0KICAgICAgICByZXR1cm4gcmVtb3ZlZDsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmVOZXdMaW5lID0gZnVuY3Rpb24ocm93KSB7DQogICAgICAgIHZhciBmaXJzdExpbmUgPSB0aGlzLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHNlY29uZExpbmUgPSB0aGlzLmdldExpbmUocm93KzEpOw0KDQogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShyb3csIGZpcnN0TGluZS5sZW5ndGgsIHJvdysxLCAwKTsNCiAgICAgICAgdmFyIGxpbmUgPSBmaXJzdExpbmUgKyBzZWNvbmRMaW5lOw0KDQogICAgICAgIHRoaXMuJGxpbmVzLnNwbGljZShyb3csIDIsIGxpbmUpOw0KDQogICAgICAgIHZhciBkZWx0YSA9IHsNCiAgICAgICAgICAgIGFjdGlvbjogInJlbW92ZVRleHQiLA0KICAgICAgICAgICAgcmFuZ2U6IHJhbmdlLA0KICAgICAgICAgICAgdGV4dDogdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5yZXBsYWNlID0gZnVuY3Rpb24ocmFuZ2UsIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09IDAgJiYgcmFuZ2UuaXNFbXB0eSgpKQ0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0Ow0KDQogICAgICAgIC8vIFNob3J0Y3V0OiBJZiB0aGUgdGV4dCB3ZSB3YW50IHRvIGluc2VydCBpcyB0aGUgc2FtZSBhcyBpdCBpcyBhbHJlYWR5DQogICAgICAgIC8vIGluIHRoZSBkb2N1bWVudCwgd2UgZG9uJ3QgaGF2ZSB0byByZXBsYWNlIGFueXRoaW5nLg0KICAgICAgICBpZiAodGV4dCA9PSB0aGlzLmdldFRleHRSYW5nZShyYW5nZSkpDQogICAgICAgICAgICByZXR1cm4gcmFuZ2UuZW5kOw0KDQogICAgICAgIHRoaXMucmVtb3ZlKHJhbmdlKTsNCiAgICAgICAgaWYgKHRleHQpIHsNCiAgICAgICAgICAgIHZhciBlbmQgPSB0aGlzLmluc2VydChyYW5nZS5zdGFydCwgdGV4dCk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBlbmQgPSByYW5nZS5zdGFydDsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBlbmQ7DQogICAgfTsNCg0KICAgIHRoaXMuYXBwbHlEZWx0YXMgPSBmdW5jdGlvbihkZWx0YXMpIHsNCiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGRlbHRhcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGRlbHRhID0gZGVsdGFzW2ldOw0KICAgICAgICAgICAgdmFyIHJhbmdlID0gUmFuZ2UuZnJvbVBvaW50cyhkZWx0YS5yYW5nZS5zdGFydCwgZGVsdGEucmFuZ2UuZW5kKTsNCg0KICAgICAgICAgICAgaWYgKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0TGluZXMiKQ0KICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0TGluZXMocmFuZ2Uuc3RhcnQucm93LCBkZWx0YS5saW5lcyk7DQogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydFRleHQiKQ0KICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0KHJhbmdlLnN0YXJ0LCBkZWx0YS50ZXh0KTsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlTGluZXMiKQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGluZXMocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5lbmQucm93IC0gMSk7DQogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZVRleHQiKQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHJhbmdlKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLnJldmVydERlbHRhcyA9IGZ1bmN0aW9uKGRlbHRhcykgew0KICAgICAgICBmb3IgKHZhciBpPWRlbHRhcy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7DQogICAgICAgICAgICB2YXIgZGVsdGEgPSBkZWx0YXNbaV07DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IFJhbmdlLmZyb21Qb2ludHMoZGVsdGEucmFuZ2Uuc3RhcnQsIGRlbHRhLnJhbmdlLmVuZCk7DQoNCiAgICAgICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydExpbmVzIikNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyAtIDEpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRUZXh0IikNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7DQogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikNCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydExpbmVzKHJhbmdlLnN0YXJ0LnJvdywgZGVsdGEubGluZXMpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVUZXh0IikNCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydChyYW5nZS5zdGFydCwgZGVsdGEudGV4dCk7DQogICAgICAgIH0NCiAgICB9Ow0KDQp9KS5jYWxsKERvY3VtZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuRG9jdW1lbnQgPSBEb2N1bWVudDsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3JhbmdlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gZnVuY3Rpb24oc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbikgew0KICAgIHRoaXMuc3RhcnQgPSB7DQogICAgICAgIHJvdzogc3RhcnRSb3csDQogICAgICAgIGNvbHVtbjogc3RhcnRDb2x1bW4NCiAgICB9Ow0KDQogICAgdGhpcy5lbmQgPSB7DQogICAgICAgIHJvdzogZW5kUm93LA0KICAgICAgICBjb2x1bW46IGVuZENvbHVtbg0KICAgIH07DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQogICAgdGhpcy5pc0VlcXVhbCA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIHJldHVybiB0aGlzLnN0YXJ0LnJvdyA9PSByYW5nZS5zdGFydC5yb3cgJiYNCiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9PSByYW5nZS5lbmQucm93ICYmDQogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9PSByYW5nZS5zdGFydC5jb2x1bW4gJiYNCiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9PSByYW5nZS5lbmQuY29sdW1uDQogICAgfTsNCg0KICAgIHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuICgiUmFuZ2U6IFsiICsgdGhpcy5zdGFydC5yb3cgKyAiLyIgKyB0aGlzLnN0YXJ0LmNvbHVtbiArDQogICAgICAgICAgICAiXSAtPiBbIiArIHRoaXMuZW5kLnJvdyArICIvIiArIHRoaXMuZW5kLmNvbHVtbiArICJdIik7DQogICAgfTsNCg0KICAgIHRoaXMuY29udGFpbnMgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBDb21wYXJlcyB0aGlzIHJhbmdlIChBKSB3aXRoIGFub3RoZXIgcmFuZ2UgKEIpLCB3aGVyZSBCIGlzIHRoZSBwYXNzZWQgaW4NCiAgICAgKiByYW5nZS4NCiAgICAgKg0KICAgICAqIFJldHVybiB2YWx1ZXM6DQogICAgICogIC0yOiAoQikgaXMgaW5mcm9udCBvZiAoQSkgYW5kIGRvZXNuJ3QgaW50ZXJzZWN0IHdpdGggKEEpDQogICAgICogIC0xOiAoQikgYmVnaW5zIGJlZm9yZSAoQSkgYnV0IGVuZHMgaW5zaWRlIG9mIChBKQ0KICAgICAqICAgMDogKEIpIGlzIGNvbXBsZXRseSBpbnNpZGUgb2YgKEEpIE9SIChBKSBpcyBjb21wbGV0eSBpbnNpZGUgb2YgKEIpDQogICAgICogICsxOiAoQikgYmVnaW5zIGluc2lkZSBvZiAoQSkgYnV0IGVuZHMgb3V0c2lkZSBvZiAoQSkNCiAgICAgKiAgKzI6IChCKSBpcyBhZnRlciAoQSkgYW5kIGRvZXNuJ3QgaW50ZXJzZWN0IHdpdGggKEEpDQogICAgICoNCiAgICAgKiAgNDI6IEZUVyBzdGF0ZTogKEIpIGVuZHMgaW4gKEEpIGJ1dCBzdGFydHMgb3V0c2lkZSBvZiAoQSkNCiAgICAgKi8NCiAgICB0aGlzLmNvbXBhcmVSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIHZhciBjbXAsDQogICAgICAgICAgICBlbmQgPSByYW5nZS5lbmQsDQogICAgICAgICAgICBzdGFydCA9IHJhbmdlLnN0YXJ0Ow0KDQogICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShlbmQucm93LCBlbmQuY29sdW1uKTsNCiAgICAgICAgaWYgKGNtcCA9PSAxKSB7DQogICAgICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoc3RhcnQucm93LCBzdGFydC5jb2x1bW4pOw0KICAgICAgICAgICAgaWYgKGNtcCA9PSAxKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIDI7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAwKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAtMSkgew0KICAgICAgICAgICAgcmV0dXJuIC0yOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgY21wID0gdGhpcy5jb21wYXJlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uKTsNCiAgICAgICAgICAgIGlmIChjbXAgPT0gLTEpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAxKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIDQyOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuY29tcGFyZVBvaW50ID0gZnVuY3Rpb24ocCkgew0KICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHAucm93LCBwLmNvbHVtbik7DQogICAgfQ0KDQogICAgdGhpcy5jb250YWluc1JhbmdlID0gZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZVBvaW50KHJhbmdlLnN0YXJ0KSA9PSAwICYmIHRoaXMuY29tcGFyZVBvaW50KHJhbmdlLmVuZCkgPT0gMDsNCiAgICB9DQoNCiAgICB0aGlzLmlzRW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbjsNCiAgICB9DQoNCiAgICB0aGlzLmlzU3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbjsNCiAgICB9DQoNCiAgICB0aGlzLnNldFN0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHR5cGVvZiByb3cgPT0gIm9iamVjdCIpIHsNCiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID0gcm93LmNvbHVtbjsNCiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93LnJvdzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93Ow0KICAgICAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gPSBjb2x1bW47DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLnNldEVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0eXBlb2Ygcm93ID09ICJvYmplY3QiKSB7DQogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPSByb3cuY29sdW1uOw0KICAgICAgICAgICAgdGhpcy5lbmQucm93ID0gcm93LnJvdzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IHJvdzsNCiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9IGNvbHVtbjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuaW5zaWRlID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuaXNFbmQocm93LCBjb2x1bW4pIHx8IHRoaXMuaXNTdGFydChyb3csIGNvbHVtbikpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICB0aGlzLmluc2lkZVN0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuaXNFbmQocm93LCBjb2x1bW4pKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgdGhpcy5pbnNpZGVFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwKSB7DQogICAgICAgICAgICBpZiAodGhpcy5pc1N0YXJ0KHJvdywgY29sdW1uKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIHRoaXMuY29tcGFyZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICghdGhpcy5pc011bHRpTGluZSgpKSB7DQogICAgICAgICAgICBpZiAocm93ID09PSB0aGlzLnN0YXJ0LnJvdykgew0KICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPCB0aGlzLnN0YXJ0LmNvbHVtbiA/IC0xIDogKGNvbHVtbiA+IHRoaXMuZW5kLmNvbHVtbiA/IDEgOiAwKTsNCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAocm93IDwgdGhpcy5zdGFydC5yb3cpDQogICAgICAgICAgICByZXR1cm4gLTE7DQoNCiAgICAgICAgaWYgKHJvdyA+IHRoaXMuZW5kLnJvdykNCiAgICAgICAgICAgIHJldHVybiAxOw0KDQogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA9PT0gcm93KQ0KICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA+PSB0aGlzLnN0YXJ0LmNvbHVtbiA/IDAgOiAtMTsNCg0KICAgICAgICBpZiAodGhpcy5lbmQucm93ID09PSByb3cpDQogICAgICAgICAgICByZXR1cm4gY29sdW1uIDw9IHRoaXMuZW5kLmNvbHVtbiA/IDAgOiAxOw0KDQogICAgICAgIHJldHVybiAwOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBMaWtlIC5jb21wYXJlKCksIGJ1dCBpZiBpc1N0YXJ0IGlzIHRydWUsIHJldHVybiAtMTsNCiAgICAgKi8NCiAgICB0aGlzLmNvbXBhcmVTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA9PSByb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gY29sdW1uKSB7DQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIExpa2UgLmNvbXBhcmUoKSwgYnV0IGlmIGlzRW5kIGlzIHRydWUsIHJldHVybiAxOw0KICAgICAqLw0KICAgIHRoaXMuY29tcGFyZUVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW4pIHsNCiAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmNvbXBhcmVJbnNpZGUgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5lbmQucm93ID09IHJvdyAmJiB0aGlzLmVuZC5jb2x1bW4gPT0gY29sdW1uKSB7DQogICAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXJ0LnJvdyA9PSByb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gY29sdW1uKSB7DQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuY2xpcFJvd3MgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgew0KICAgICAgICBpZiAodGhpcy5lbmQucm93ID4gbGFzdFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IGxhc3RSb3crMSwNCiAgICAgICAgICAgICAgICBjb2x1bW46IDANCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPiBsYXN0Um93KSB7DQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBsYXN0Um93KzEsDQogICAgICAgICAgICAgICAgY29sdW1uOiAwDQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93IDwgZmlyc3RSb3cpIHsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IGZpcnN0Um93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogMA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPCBmaXJzdFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IGZpcnN0Um93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogMA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCB8fCB0aGlzLnN0YXJ0LCBlbmQgfHwgdGhpcy5lbmQpOw0KICAgIH07DQoNCiAgICB0aGlzLmV4dGVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBjbXAgPSB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOw0KDQogICAgICAgIGlmIChjbXAgPT0gMCkNCiAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICBlbHNlIGlmIChjbXAgPT0gLTEpDQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1ufTsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59Ow0KDQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0IHx8IHRoaXMuc3RhcnQsIGVuZCB8fCB0aGlzLmVuZCk7DQogICAgfTsNCg0KICAgIHRoaXMuaXNFbXB0eSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gKHRoaXMuc3RhcnQucm93ID09IHRoaXMuZW5kLnJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSB0aGlzLmVuZC5jb2x1bW4pOw0KICAgIH07DQoNCiAgICB0aGlzLmlzTXVsdGlMaW5lID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiAodGhpcy5zdGFydC5yb3cgIT09IHRoaXMuZW5kLnJvdyk7DQogICAgfTsNCg0KICAgIHRoaXMuY2xvbmUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGhpcy5zdGFydCwgdGhpcy5lbmQpOw0KICAgIH07DQoNCiAgICB0aGlzLmNvbGxhcHNlUm93cyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAodGhpcy5lbmQuY29sdW1uID09IDApDQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHRoaXMuc3RhcnQucm93LCAwLCBNYXRoLm1heCh0aGlzLnN0YXJ0LnJvdywgdGhpcy5lbmQucm93LTEpLCAwKQ0KICAgICAgICBlbHNlDQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHRoaXMuc3RhcnQucm93LCAwLCB0aGlzLmVuZC5yb3csIDApDQogICAgfTsNCg0KICAgIHRoaXMudG9TY3JlZW5SYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHNjcmVlblBvc1N0YXJ0ID0NCiAgICAgICAgICAgIHNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuc3RhcnQpOw0KICAgICAgICB2YXIgc2NyZWVuUG9zRW5kID0NCiAgICAgICAgICAgIHNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuZW5kKTsNCg0KICAgICAgICByZXR1cm4gbmV3IFJhbmdlKA0KICAgICAgICAgICAgc2NyZWVuUG9zU3RhcnQucm93LCBzY3JlZW5Qb3NTdGFydC5jb2x1bW4sDQogICAgICAgICAgICBzY3JlZW5Qb3NFbmQucm93LCBzY3JlZW5Qb3NFbmQuY29sdW1uDQogICAgICAgICk7DQogICAgfTsNCg0KfSkuY2FsbChSYW5nZS5wcm90b3R5cGUpOw0KDQoNClJhbmdlLmZyb21Qb2ludHMgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbiwgZW5kLnJvdywgZW5kLmNvbHVtbik7DQp9Ow0KDQpleHBvcnRzLlJhbmdlID0gUmFuZ2U7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9hbmNob3InLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQoNCi8qKg0KICogQW4gQW5jaG9yIGlzIGEgZmxvYXRpbmcgcG9pbnRlciBpbiB0aGUgZG9jdW1lbnQuIFdoZW5ldmVyIHRleHQgaXMgaW5zZXJ0ZWQgb3INCiAqIGRlbGV0ZWQgYmVmb3JlIHRoZSBjdXJzb3IsIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yIGlzIHVwZGF0ZWQNCiAqLw0KdmFyIEFuY2hvciA9IGV4cG9ydHMuQW5jaG9yID0gZnVuY3Rpb24oZG9jLCByb3csIGNvbHVtbikgew0KICAgIHRoaXMuZG9jdW1lbnQgPSBkb2M7DQogICAgDQogICAgaWYgKHR5cGVvZiBjb2x1bW4gPT0gInVuZGVmaW5lZCIpDQogICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LnJvdywgcm93LmNvbHVtbik7DQogICAgZWxzZQ0KICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdywgY29sdW1uKTsNCg0KICAgIHRoaXMuJG9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpOw0KICAgIGRvYy5vbigiY2hhbmdlIiwgdGhpcy4kb25DaGFuZ2UpOw0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KICAgIA0KICAgIHRoaXMuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQodGhpcy5yb3csIHRoaXMuY29sdW1uKTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0RG9jdW1lbnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQ7DQogICAgfTsNCiAgICANCiAgICB0aGlzLm9uQ2hhbmdlID0gZnVuY3Rpb24oZSkgew0KICAgICAgICB2YXIgZGVsdGEgPSBlLmRhdGE7DQogICAgICAgIHZhciByYW5nZSA9IGRlbHRhLnJhbmdlOw0KICAgICAgICAgICAgDQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcmFuZ2UuZW5kLnJvdyAmJiByYW5nZS5zdGFydC5yb3cgIT0gdGhpcy5yb3cpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA+IHRoaXMucm93KQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gdGhpcy5yb3cgJiYgcmFuZ2Uuc3RhcnQuY29sdW1uID4gdGhpcy5jb2x1bW4pDQogICAgICAgICAgICByZXR1cm47DQogICAgDQogICAgICAgIHZhciByb3cgPSB0aGlzLnJvdzsNCiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uOw0KICAgICAgICANCiAgICAgICAgaWYgKGRlbHRhLmFjdGlvbiA9PT0gImluc2VydFRleHQiKSB7DQogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09PSByb3cgJiYgcmFuZ2Uuc3RhcnQuY29sdW1uIDw9IGNvbHVtbikgew0KICAgICAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT09IHJhbmdlLmVuZC5yb3cpIHsNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uICs9IHJhbmdlLmVuZC5jb2x1bW4gLSByYW5nZS5zdGFydC5jb2x1bW47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4gLT0gcmFuZ2Uuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChyYW5nZS5zdGFydC5yb3cgIT09IHJhbmdlLmVuZC5yb3cgJiYgcmFuZ2Uuc3RhcnQucm93IDwgcm93KSB7DQogICAgICAgICAgICAgICAgcm93ICs9IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09PSAiaW5zZXJ0TGluZXMiKSB7DQogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93IDw9IHJvdykgew0KICAgICAgICAgICAgICAgIHJvdyArPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlVGV4dCIpIHsNCiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA8IGNvbHVtbikgew0KICAgICAgICAgICAgICAgIGlmIChyYW5nZS5lbmQuY29sdW1uID49IGNvbHVtbikNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gcmFuZ2Uuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gTWF0aC5tYXgoMCwgY29sdW1uIC0gKHJhbmdlLmVuZC5jb2x1bW4gLSByYW5nZS5zdGFydC5jb2x1bW4pKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0gZWxzZSBpZiAocmFuZ2Uuc3RhcnQucm93ICE9PSByYW5nZS5lbmQucm93ICYmIHJhbmdlLnN0YXJ0LnJvdyA8IHJvdykgew0KICAgICAgICAgICAgICAgIGlmIChyYW5nZS5lbmQucm93ID09IHJvdykgew0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBNYXRoLm1heCgwLCBjb2x1bW4gLSByYW5nZS5lbmQuY29sdW1uKSArIHJhbmdlLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcm93IC09IChyYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKHJhbmdlLmVuZC5yb3cgPT0gcm93KSB7DQogICAgICAgICAgICAgICAgcm93IC09IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICAgICAgY29sdW1uID0gTWF0aC5tYXgoMCwgY29sdW1uIC0gcmFuZ2UuZW5kLmNvbHVtbikgKyByYW5nZS5zdGFydC5jb2x1bW47DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVMaW5lcyIpIHsNCiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPD0gcm93KSB7DQogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5yb3cgPD0gcm93KQ0KICAgICAgICAgICAgICAgICAgICByb3cgLT0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcm93ID0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSAwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LCBjb2x1bW4sIHRydWUpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldFBvc2l0aW9uID0gZnVuY3Rpb24ocm93LCBjb2x1bW4sIG5vQ2xpcCkgew0KICAgICAgICB2YXIgcG9zOw0KICAgICAgICBpZiAobm9DbGlwKSB7DQogICAgICAgICAgICBwb3MgPSB7DQogICAgICAgICAgICAgICAgcm93OiByb3csDQogICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4NCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBwb3MgPSB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KHJvdywgY29sdW1uKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHRoaXMucm93ID09IHBvcy5yb3cgJiYgdGhpcy5jb2x1bW4gPT0gcG9zLmNvbHVtbikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgb2xkID0gew0KICAgICAgICAgICAgcm93OiB0aGlzLnJvdywNCiAgICAgICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4NCiAgICAgICAgfTsNCiAgICAgICAgDQogICAgICAgIHRoaXMucm93ID0gcG9zLnJvdzsNCiAgICAgICAgdGhpcy5jb2x1bW4gPSBwb3MuY29sdW1uOw0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7DQogICAgICAgICAgICBvbGQ6IG9sZCwNCiAgICAgICAgICAgIHZhbHVlOiBwb3MNCiAgICAgICAgfSk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmRldGFjaCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIHRoaXMuJG9uQ2hhbmdlKTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgcG9zID0ge307DQogICAgDQogICAgICAgIGlmIChyb3cgPj0gdGhpcy5kb2N1bWVudC5nZXRMZW5ndGgoKSkgew0KICAgICAgICAgICAgcG9zLnJvdyA9IE1hdGgubWF4KDAsIHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsNCiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSB0aGlzLmRvY3VtZW50LmdldExpbmUocG9zLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKHJvdyA8IDApIHsNCiAgICAgICAgICAgIHBvcy5yb3cgPSAwOw0KICAgICAgICAgICAgcG9zLmNvbHVtbiA9IDA7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBwb3Mucm93ID0gcm93Ow0KICAgICAgICAgICAgcG9zLmNvbHVtbiA9IE1hdGgubWluKHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGgsIE1hdGgubWF4KDAsIGNvbHVtbikpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoY29sdW1uIDwgMCkNCiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSAwOw0KICAgICAgICAgICAgDQogICAgICAgIHJldHVybiBwb3M7DQogICAgfTsNCiAgICANCn0pLmNhbGwoQW5jaG9yLnByb3RvdHlwZSk7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2xpYi9sYW5nJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KZXhwb3J0cy5zdHJpbmdSZXZlcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7DQogICAgcmV0dXJuIHN0cmluZy5zcGxpdCgiIikucmV2ZXJzZSgpLmpvaW4oIiIpOw0KfTsNCg0KZXhwb3J0cy5zdHJpbmdSZXBlYXQgPSBmdW5jdGlvbiAoc3RyaW5nLCBjb3VudCkgew0KICAgICByZXR1cm4gbmV3IEFycmF5KGNvdW50ICsgMSkuam9pbihzdHJpbmcpOw0KfTsNCg0KdmFyIHRyaW1CZWdpblJlZ2V4cCA9IC9eXHNccyovOw0KdmFyIHRyaW1FbmRSZWdleHAgPSAvXHNccyokLzsNCg0KZXhwb3J0cy5zdHJpbmdUcmltTGVmdCA9IGZ1bmN0aW9uIChzdHJpbmcpIHsNCiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UodHJpbUJlZ2luUmVnZXhwLCAnJyk7DQp9Ow0KDQpleHBvcnRzLnN0cmluZ1RyaW1SaWdodCA9IGZ1bmN0aW9uIChzdHJpbmcpIHsNCiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UodHJpbUVuZFJlZ2V4cCwgJycpOw0KfTsNCg0KZXhwb3J0cy5jb3B5T2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7DQogICAgdmFyIGNvcHkgPSB7fTsNCiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7DQogICAgICAgIGNvcHlba2V5XSA9IG9ialtrZXldOw0KICAgIH0NCiAgICByZXR1cm4gY29weTsNCn07DQoNCmV4cG9ydHMuY29weUFycmF5ID0gZnVuY3Rpb24oYXJyYXkpew0KICAgIHZhciBjb3B5ID0gW107DQogICAgZm9yICh2YXIgaT0wLCBsPWFycmF5Lmxlbmd0aDsgaTxsOyBpKyspIHsNCiAgICAgICAgaWYgKGFycmF5W2ldICYmIHR5cGVvZiBhcnJheVtpXSA9PSAib2JqZWN0IikNCiAgICAgICAgICAgIGNvcHlbaV0gPSB0aGlzLmNvcHlPYmplY3QoIGFycmF5W2ldICk7DQogICAgICAgIGVsc2UgDQogICAgICAgICAgICBjb3B5W2ldID0gYXJyYXlbaV07DQogICAgfQ0KICAgIHJldHVybiBjb3B5Ow0KfTsNCg0KZXhwb3J0cy5kZWVwQ29weSA9IGZ1bmN0aW9uIChvYmopIHsNCiAgICBpZiAodHlwZW9mIG9iaiAhPSAib2JqZWN0Iikgew0KICAgICAgICByZXR1cm4gb2JqOw0KICAgIH0NCiAgICANCiAgICB2YXIgY29weSA9IG9iai5jb25zdHJ1Y3RvcigpOw0KICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsNCiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PSAib2JqZWN0Iikgew0KICAgICAgICAgICAgY29weVtrZXldID0gdGhpcy5kZWVwQ29weShvYmpba2V5XSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBjb3B5W2tleV0gPSBvYmpba2V5XTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gY29weTsNCn07DQoNCmV4cG9ydHMuYXJyYXlUb01hcCA9IGZ1bmN0aW9uKGFycikgew0KICAgIHZhciBtYXAgPSB7fTsNCiAgICBmb3IgKHZhciBpPTA7IGk8YXJyLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIG1hcFthcnJbaV1dID0gMTsNCiAgICB9DQogICAgcmV0dXJuIG1hcDsNCg0KfTsNCg0KLyoqDQogKiBzcGxpY2Ugb3V0IG9mICdhcnJheScgYW55dGhpbmcgdGhhdCA9PT0gJ3ZhbHVlJw0KICovDQpleHBvcnRzLmFycmF5UmVtb3ZlID0gZnVuY3Rpb24oYXJyYXksIHZhbHVlKSB7DQogIGZvciAodmFyIGkgPSAwOyBpIDw9IGFycmF5Lmxlbmd0aDsgaSsrKSB7DQogICAgaWYgKHZhbHVlID09PSBhcnJheVtpXSkgew0KICAgICAgYXJyYXkuc3BsaWNlKGksIDEpOw0KICAgIH0NCiAgfQ0KfTsNCg0KZXhwb3J0cy5lc2NhcGVSZWdFeHAgPSBmdW5jdGlvbihzdHIpIHsNCiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbLiorP14ke30oKXxbXF1cL1xcXSkvZywgJ1xcJDEnKTsNCn07DQoNCmV4cG9ydHMuZGVmZXJyZWRDYWxsID0gZnVuY3Rpb24oZmNuKSB7DQoNCiAgICB2YXIgdGltZXIgPSBudWxsOw0KICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aW1lciA9IG51bGw7DQogICAgICAgIGZjbigpOw0KICAgIH07DQoNCiAgICB2YXIgZGVmZXJyZWQgPSBmdW5jdGlvbih0aW1lb3V0KSB7DQogICAgICAgIGRlZmVycmVkLmNhbmNlbCgpOw0KICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIHRpbWVvdXQgfHwgMCk7DQogICAgICAgIHJldHVybiBkZWZlcnJlZDsNCiAgICB9Ow0KDQogICAgZGVmZXJyZWQuc2NoZWR1bGUgPSBkZWZlcnJlZDsNCg0KICAgIGRlZmVycmVkLmNhbGwgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5jYW5jZWwoKTsNCiAgICAgICAgZmNuKCk7DQogICAgICAgIHJldHVybiBkZWZlcnJlZDsNCiAgICB9Ow0KDQogICAgZGVmZXJyZWQuY2FuY2VsID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7DQogICAgICAgIHRpbWVyID0gbnVsbDsNCiAgICAgICAgcmV0dXJuIGRlZmVycmVkOw0KICAgIH07DQoNCiAgICByZXR1cm4gZGVmZXJyZWQ7DQp9Ow0KDQp9KTsNCmRlZmluZSgnYWNlL3dvcmtlci9qc2hpbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KLyohDQogKiBKU0hpbnQsIGJ5IEpTSGludCBDb21tdW5pdHkuDQogKg0KICogTGljZW5zZWQgdW5kZXIgdGhlIHNhbWUgc2xpZ2h0bHkgbW9kaWZpZWQgTUlUIGxpY2Vuc2UgdGhhdCBKU0xpbnQgaXMuDQogKiBJdCBzdG9wcyBldmlsLWRvZXJzIGV2ZXJ5d2hlcmUuDQogKg0KICogSlNIaW50IGlzIGEgZGVyaXZhdGl2ZSB3b3JrIG9mIEpTTGludDoNCiAqDQogKiAgIENvcHlyaWdodCAoYykgMjAwMiBEb3VnbGFzIENyb2NrZm9yZCAgKHd3dy5KU0xpbnQuY29tKQ0KICoNCiAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nDQogKiAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwNCiAqICAgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbg0KICogICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwNCiAqICAgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20NCiAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQogKg0KICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZA0KICogICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCiAqDQogKiAgIFRoZSBTb2Z0d2FyZSBzaGFsbCBiZSB1c2VkIGZvciBHb29kLCBub3QgRXZpbC4NCiAqDQogKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQogKiAgIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLA0KICogICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCiAqICAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KICogICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORw0KICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSDQogKiAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4NCiAqDQogKiBKU0hpbnQgd2FzIGZvcmtlZCBmcm9tIDIwMTAtMTItMTYgZWRpdGlvbiBvZiBKU0xpbnQuDQogKg0KICovDQoNCi8qDQogSlNISU5UIGlzIGEgZ2xvYmFsIGZ1bmN0aW9uLiBJdCB0YWtlcyB0d28gcGFyYW1ldGVycy4NCg0KICAgICB2YXIgbXlSZXN1bHQgPSBKU0hJTlQoc291cmNlLCBvcHRpb24pOw0KDQogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncy4gSWYgaXQgaXMgYQ0KIHN0cmluZywgaXQgd2lsbCBiZSBzcGxpdCBvbiAnXG4nIG9yICdccicuIElmIGl0IGlzIGFuIGFycmF5IG9mIHN0cmluZ3MsIGl0DQogaXMgYXNzdW1lZCB0aGF0IGVhY2ggc3RyaW5nIHJlcHJlc2VudHMgb25lIGxpbmUuIFRoZSBzb3VyY2UgY2FuIGJlIGENCiBKYXZhU2NyaXB0IHRleHQgb3IgYSBKU09OIHRleHQuDQoNCiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBvYmplY3Qgb2Ygb3B0aW9ucyB3aGljaCBjb250cm9sIHRoZQ0KIG9wZXJhdGlvbiBvZiBKU0hJTlQuIE1vc3Qgb2YgdGhlIG9wdGlvbnMgYXJlIGJvb2xlYW5zOiBUaGV5IGFyZSBhbGwNCiBvcHRpb25hbCBhbmQgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgb2YgZmFsc2UuIE9uZSBvZiB0aGUgb3B0aW9ucywgcHJlZGVmLA0KIGNhbiBiZSBhbiBhcnJheSBvZiBuYW1lcywgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGRlY2xhcmUgZ2xvYmFsIHZhcmlhYmxlcywNCiBvciBhbiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgdXNlZCBhcyBnbG9iYWwgbmFtZXMsIHdpdGggYSBib29sZWFuIHZhbHVlDQogdGhhdCBkZXRlcm1pbmVzIGlmIHRoZXkgYXJlIGFzc2lnbmFibGUuDQoNCiBJZiBpdCBjaGVja3Mgb3V0LCBKU0hJTlQgcmV0dXJucyB0cnVlLiBPdGhlcndpc2UsIGl0IHJldHVybnMgZmFsc2UuDQoNCiBJZiBmYWxzZSwgeW91IGNhbiBpbnNwZWN0IEpTSElOVC5lcnJvcnMgdG8gZmluZCBvdXQgdGhlIHByb2JsZW1zLg0KIEpTSElOVC5lcnJvcnMgaXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHRoZXNlIG1lbWJlcnM6DQoNCiB7DQogICAgIGxpbmUgICAgICA6IFRoZSBsaW5lIChyZWxhdGl2ZSB0byAwKSBhdCB3aGljaCB0aGUgbGludCB3YXMgZm91bmQNCiAgICAgY2hhcmFjdGVyIDogVGhlIGNoYXJhY3RlciAocmVsYXRpdmUgdG8gMCkgYXQgd2hpY2ggdGhlIGxpbnQgd2FzIGZvdW5kDQogICAgIHJlYXNvbiAgICA6IFRoZSBwcm9ibGVtDQogICAgIGV2aWRlbmNlICA6IFRoZSB0ZXh0IGxpbmUgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJyZWQNCiAgICAgcmF3ICAgICAgIDogVGhlIHJhdyBtZXNzYWdlIGJlZm9yZSB0aGUgZGV0YWlscyB3ZXJlIGluc2VydGVkDQogICAgIGEgICAgICAgICA6IFRoZSBmaXJzdCBkZXRhaWwNCiAgICAgYiAgICAgICAgIDogVGhlIHNlY29uZCBkZXRhaWwNCiAgICAgYyAgICAgICAgIDogVGhlIHRoaXJkIGRldGFpbA0KICAgICBkICAgICAgICAgOiBUaGUgZm91cnRoIGRldGFpbA0KIH0NCg0KIElmIGEgZmF0YWwgZXJyb3Igd2FzIGZvdW5kLCBhIG51bGwgd2lsbCBiZSB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZQ0KIEpTSElOVC5lcnJvcnMgYXJyYXkuDQoNCiBZb3UgY2FuIHJlcXVlc3QgYSBGdW5jdGlvbiBSZXBvcnQsIHdoaWNoIHNob3dzIGFsbCBvZiB0aGUgZnVuY3Rpb25zDQogYW5kIHRoZSBwYXJhbWV0ZXJzIGFuZCB2YXJzIHRoYXQgdGhleSB1c2UuIFRoaXMgY2FuIGJlIHVzZWQgdG8gZmluZA0KIGltcGxpZWQgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgb3RoZXIgcHJvYmxlbXMuIFRoZSByZXBvcnQgaXMgaW4gSFRNTCBhbmQNCiBjYW4gYmUgaW5zZXJ0ZWQgaW4gYW4gSFRNTCA8Ym9keT4uDQoNCiAgICAgdmFyIG15UmVwb3J0ID0gSlNISU5ULnJlcG9ydChsaW1pdGVkKTsNCg0KIElmIGxpbWl0ZWQgaXMgdHJ1ZSwgdGhlbiB0aGUgcmVwb3J0IHdpbGwgYmUgbGltaXRlZCB0byBvbmx5IGVycm9ycy4NCg0KIFlvdSBjYW4gcmVxdWVzdCBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIEpTSGludCdzIHJlc3VsdHMuDQoNCiAgICAgdmFyIG15RGF0YSA9IEpTSElOVC5kYXRhKCk7DQoNCiBJdCByZXR1cm5zIGEgc3RydWN0dXJlIHdpdGggdGhpcyBmb3JtOg0KDQogew0KICAgICBlcnJvcnM6IFsNCiAgICAgICAgIHsNCiAgICAgICAgICAgICBsaW5lOiBOVU1CRVIsDQogICAgICAgICAgICAgY2hhcmFjdGVyOiBOVU1CRVIsDQogICAgICAgICAgICAgcmVhc29uOiBTVFJJTkcsDQogICAgICAgICAgICAgZXZpZGVuY2U6IFNUUklORw0KICAgICAgICAgfQ0KICAgICBdLA0KICAgICBmdW5jdGlvbnM6IFsNCiAgICAgICAgIG5hbWU6IFNUUklORywNCiAgICAgICAgIGxpbmU6IE5VTUJFUiwNCiAgICAgICAgIGxhc3Q6IE5VTUJFUiwNCiAgICAgICAgIHBhcmFtOiBbDQogICAgICAgICAgICAgU1RSSU5HDQogICAgICAgICBdLA0KICAgICAgICAgY2xvc3VyZTogWw0KICAgICAgICAgICAgIFNUUklORw0KICAgICAgICAgXSwNCiAgICAgICAgIHZhcjogWw0KICAgICAgICAgICAgIFNUUklORw0KICAgICAgICAgXSwNCiAgICAgICAgIGV4Y2VwdGlvbjogWw0KICAgICAgICAgICAgIFNUUklORw0KICAgICAgICAgXSwNCiAgICAgICAgIG91dGVyOiBbDQogICAgICAgICAgICAgU1RSSU5HDQogICAgICAgICBdLA0KICAgICAgICAgdW51c2VkOiBbDQogICAgICAgICAgICAgU1RSSU5HDQogICAgICAgICBdLA0KICAgICAgICAgZ2xvYmFsOiBbDQogICAgICAgICAgICAgU1RSSU5HDQogICAgICAgICBdLA0KICAgICAgICAgbGFiZWw6IFsNCiAgICAgICAgICAgICBTVFJJTkcNCiAgICAgICAgIF0NCiAgICAgXSwNCiAgICAgZ2xvYmFsczogWw0KICAgICAgICAgU1RSSU5HDQogICAgIF0sDQogICAgIG1lbWJlcjogew0KICAgICAgICAgU1RSSU5HOiBOVU1CRVINCiAgICAgfSwNCiAgICAgdW51c2VkczogWw0KICAgICAgICAgew0KICAgICAgICAgICAgIG5hbWU6IFNUUklORywNCiAgICAgICAgICAgICBsaW5lOiBOVU1CRVINCiAgICAgICAgIH0NCiAgICAgXSwNCiAgICAgaW1wbGllZHM6IFsNCiAgICAgICAgIHsNCiAgICAgICAgICAgICBuYW1lOiBTVFJJTkcsDQogICAgICAgICAgICAgbGluZTogTlVNQkVSDQogICAgICAgICB9DQogICAgIF0sDQogICAgIHVybHM6IFsNCiAgICAgICAgIFNUUklORw0KICAgICBdLA0KICAgICBqc29uOiBCT09MRUFODQogfQ0KDQogRW1wdHkgYXJyYXlzIHdpbGwgbm90IGJlIGluY2x1ZGVkLg0KDQoqLw0KDQovKmpzaGludA0KIGV2aWw6IHRydWUsIG5vbWVuOiBmYWxzZSwgb25ldmFyOiBmYWxzZSwgcmVnZXhwOiBmYWxzZSwgc3RyaWN0OiB0cnVlLCBib3NzOiB0cnVlLA0KIHVuZGVmOiB0cnVlLCBtYXhsZW46IDEwMA0KKi8NCg0KLyptZW1iZXJzICJcYiIsICJcdCIsICJcbiIsICJcZiIsICJcciIsICIhPSIsICIhPT0iLCAiXCIiLCAiJSIsICIoYmVnaW4pIiwNCiAiKGJyZWFrYWdlKSIsICIoY29udGV4dCkiLCAiKGVycm9yKSIsICIoZ2xvYmFsKSIsICIoaWRlbnRpZmllcikiLCAiKGxhc3QpIiwNCiAiKGxpbmUpIiwgIihsb29wYWdlKSIsICIobmFtZSkiLCAiKG9uZXZhcikiLCAiKHBhcmFtcykiLCAiKHNjb3BlKSIsDQogIihzdGF0ZW1lbnQpIiwgIih2ZXJiKSIsICIqIiwgIisiLCAiKysiLCAiLSIsICItLSIsICJcLyIsICI8IiwgIjw9IiwgIj09IiwNCiAiPT09IiwgIj4iLCAiPj0iLCAkLCAkJCwgJEEsICRGLCAkSCwgJFIsICRicmVhaywgJGNvbnRpbnVlLCAkdywgQWJzdHJhY3QsIEFqYXgsDQogX19maWxlbmFtZSwgX19kaXJuYW1lLCBBY3RpdmVYT2JqZWN0LCBBcnJheSwgQXJyYXlCdWZmZXIsIEFycmF5QnVmZmVyVmlldywNCiBBdXRvY29tcGxldGVyLCBBc3NldHMsIEJvb2xlYW4sIEJ1aWxkZXIsIEJ1ZmZlciwgQnJvd3NlciwgQ09NLCBDU2NyaXB0LCBDYW52YXMsDQogQ3VzdG9tQW5pbWF0aW9uLCBDbGFzcywgQ29udHJvbCwgQ2hhaW4sIENvbG9yLCBDb29raWUsIENvcmUsIERhdGFWaWV3LCBEYXRlLA0KIERlYnVnLCBEcmFnZ2FibGUsIERyYWdnYWJsZXMsIERyb3BwYWJsZXMsIERvY3VtZW50LCBEb21SZWFkeSwgRE9NUmVhZHksIERyYWcsDQogRSwgRW51bWVyYXRvciwgRW51bWVyYWJsZSwgRWxlbWVudCwgRWxlbWVudHMsIEVycm9yLCBFZmZlY3QsIEV2YWxFcnJvciwgRXZlbnQsDQogRXZlbnRzLCBGYWRlQW5pbWF0aW9uLCBGaWVsZCwgRmxhc2gsIEZsb2F0MzJBcnJheSwgRmxvYXQ2NEFycmF5LCBGb3JtLA0KIEZvcm1GaWVsZCwgRnJhbWUsIEZ1bmN0aW9uLCBGeCwgR2V0T2JqZWN0LCBHcm91cCwgSGFzaCwgSG90S2V5LCBIVE1MRWxlbWVudCwNCiBIdG1sVGFibGUsIElmcmFtZSwgSWZyYW1lU2hpbSwgSW1hZ2UsIEludDE2QXJyYXksIEludDMyQXJyYXksIEludDhBcnJheSwNCiBJbnNlcnRpb24sIElucHV0VmFsaWRhdG9yLCBKU09OLCBLZXlib2FyZCwgTG9jYWxlLCBMTjEwLCBMTjIsIExPRzEwRSwgTE9HMkUsDQogTUFYX1ZBTFVFLCBNSU5fVkFMVUUsIE1hc2ssIE1hdGgsIE1lbnVJdGVtLCBNb3ZlQW5pbWF0aW9uLCBNb29Ub29scywgTmF0aXZlLA0KIE5FR0FUSVZFX0lORklOSVRZLCBOdW1iZXIsIE9iamVjdCwgT2JqZWN0UmFuZ2UsIE9wdGlvbiwgT3B0aW9ucywgT3ZlclRleHQsIFBJLA0KIFBPU0lUSVZFX0lORklOSVRZLCBQZXJpb2RpY2FsRXhlY3V0ZXIsIFBvaW50LCBQb3NpdGlvbiwgUHJvdG90eXBlLCBSYW5nZUVycm9yLA0KIFJlY3RhbmdsZSwgUmVmZXJlbmNlRXJyb3IsIFJlZ0V4cCwgUmVzaXplQW5pbWF0aW9uLCBSZXF1ZXN0LCBSb3RhdGVBbmltYXRpb24sDQogU1FSVDFfMiwgU1FSVDIsIFNjcm9sbEJhciwgU2NyaXB0RW5naW5lLCBTY3JpcHRFbmdpbmVCdWlsZFZlcnNpb24sDQogU2NyaXB0RW5naW5lTWFqb3JWZXJzaW9uLCBTY3JpcHRFbmdpbmVNaW5vclZlcnNpb24sIFNjcmlwdGFjdWxvdXMsIFNjcm9sbGVyLA0KIFNsaWNrLCBTbGlkZXIsIFNlbGVjdG9yLCBTdHJpbmcsIFN0eWxlLCBTeW50YXhFcnJvciwgU29ydGFibGUsIFNvcnRhYmxlcywNCiBTb3J0YWJsZU9ic2VydmVyLCBTb3VuZCwgU3Bpbm5lciwgU3lzdGVtLCBTd2lmZiwgVGV4dCwgVGV4dEFyZWEsIFRlbXBsYXRlLA0KIFRpbWVyLCBUaXBzLCBUeXBlLCBUeXBlRXJyb3IsIFRvZ2dsZSwgVHJ5LCBVUkksIFVSSUVycm9yLCBVUkwsIFZCQXJyYXksIFdTSCwNCiBXU2NyaXB0LCBXZWIsIFdpbmRvdywgWE1MRE9NLCBYTUxIdHRwUmVxdWVzdCwgWFBhdGhFdmFsdWF0b3IsIFhQYXRoRXhjZXB0aW9uLA0KIFhQYXRoRXhwcmVzc2lvbiwgWFBhdGhOYW1lc3BhY2UsIFhQYXRoTlNSZXNvbHZlciwgWFBhdGhSZXN1bHQsICJcXCIsIGEsDQogYWRkRXZlbnRMaXN0ZW5lciwgYWRkcmVzcywgYWxlcnQsIGFwcGx5LCBhcHBsaWNhdGlvbkNhY2hlLCBhcmd1bWVudHMsIGFyaXR5LA0KIGFzaSwgYiwgYml0d2lzZSwgYmxvY2ssIGJsdXIsIGJvb2xPcHRpb25zLCBib3NzLCBicm93c2VyLCBjLCBjYWxsLCBjYWxsZWUsDQogY2FsbGVyLCBjYXNlcywgY2hhckF0LCBjaGFyQ29kZUF0LCBjaGFyYWN0ZXIsIGNsZWFySW50ZXJ2YWwsIGNsZWFyVGltZW91dCwNCiBjbG9zZSwgY2xvc2VkLCBjbG9zdXJlLCBjb21tZW50LCBjb25kaXRpb24sIGNvbmZpcm0sIGNvbnNvbGUsIGNvbnN0cnVjdG9yLA0KIGNvbnRlbnQsIGNvdWNoLCBjcmVhdGUsIGNzcywgY3VybHksIGQsIGRhdGEsIGRhdGFsaXN0LCBkZCwgZGVidWcsIGRlY29kZVVSSSwNCiBkZWNvZGVVUklDb21wb25lbnQsIGRlZmF1bHRTdGF0dXMsIGRlZmluZUNsYXNzLCBkZXNlcmlhbGl6ZSwgZGV2ZWwsIGRvY3VtZW50LA0KIGRvam8sIGRpaml0LCBkb2pveCwgZGVmaW5lLCBlZGl0aW9uLCBlbHNlLCBlbWl0LCBlbmNvZGVVUkksIGVuY29kZVVSSUNvbXBvbmVudCwNCiBlbnRpdHlpZnksIGVxZXFlcSwgZXFudWxsLCBlcnJvcnMsIGVzNSwgZXNjYXBlLCBldmFsLCBldmVudCwgZXZpZGVuY2UsIGV2aWwsDQogZXgsIGV4Y2VwdGlvbiwgZXhlYywgZXhwcywgZXhwciwgZXhwb3J0cywgRmlsZVJlYWRlciwgZmlyc3QsIGZsb29yLCBmb2N1cywNCiBmb3JpbiwgZnJhZ21lbnQsIGZyYW1lcywgZnJvbSwgZnJvbUNoYXJDb2RlLCBmdWQsIGZ1bmN0LCBmdW5jdGlvbiwgZnVuY3Rpb25zLA0KIGcsIGdjLCBnZXRDb21wdXRlZFN0eWxlLCBnZXRSb3csIEdMT0JBTCwgZ2xvYmFsLCBnbG9iYWxzLCBnbG9iYWxzdHJpY3QsDQogaGFzT3duUHJvcGVydHksIGhlbHAsIGhpc3RvcnksIGksIGlkLCBpZGVudGlmaWVyLCBpbW1lZCwgaW1wbGllZHMsIGluY2x1ZGUsDQogaW5kZW50LCBpbmRleE9mLCBpbml0LCBpbnMsIGluc3RhbmNlT2YsIGlzQWxwaGEsIGlzQXBwbGljYXRpb25SdW5uaW5nLCBpc0FycmF5LA0KIGlzRGlnaXQsIGlzRmluaXRlLCBpc05hTiwgaXRlcmF0b3IsIGpvaW4sIGpzaGludCwNCiBKU0hJTlQsIGpzb24sIGpxdWVyeSwgalF1ZXJ5LCBrZXlzLCBsYWJlbCwgbGFiZWxsZWQsIGxhc3QsIGxhc3RzZW1pYywgbGF4YnJlYWssDQogbGF0ZWRlZiwgbGJwLCBsZWQsIGxlZnQsIGxlbmd0aCwgbGluZSwgbG9hZCwgbG9hZENsYXNzLCBsb2NhbFN0b3JhZ2UsIGxvY2F0aW9uLA0KIGxvZywgbG9vcGZ1bmMsIG0sIG1hdGNoLCBtYXhlcnIsIG1heGxlbiwgbWVtYmVyLG1lc3NhZ2UsIG1ldGEsIG1vZHVsZSwgbW92ZUJ5LA0KIG1vdmVUbywgbW9vdG9vbHMsIG5hbWUsIG5hdmlnYXRvciwgbmV3LCBuZXdjYXAsIG5vYXJnLCBub2RlLCBub2VtcHR5LCBub21lbiwNCiBub25ldywgbnVkLCBvbmJlZm9yZXVubG9hZCwgb25ibHVyLCBvbmVycm9yLCBvbmV2YXIsIG9uZm9jdXMsIG9ubG9hZCwgb25yZXNpemUsDQogb251bmxvYWQsIG9wZW4sIG9wZW5EYXRhYmFzZSwgb3BlblVSTCwgb3BlbmVyLCBvcGVyYSwgb3V0ZXIsIHBhcmFtLCBwYXJlbnQsDQogcGFyc2VGbG9hdCwgcGFyc2VJbnQsIHBhc3NmYWlsLCBwbHVzcGx1cywgcHJlZGVmLCBwcmludCwgcHJvY2VzcywgcHJvbXB0LA0KIHByb3RvLCBwcm90b3R5cGUsIHByb3RvdHlwZWpzLCBwdXNoLCBxdWl0LCByYW5nZSwgcmF3LCByZWFjaCwgcmVhc29uLCByZWdleHAsDQogcmVhZEZpbGUsIHJlYWRVcmwsIHJlZ2V4ZGFzaCwgcmVtb3ZlRXZlbnRMaXN0ZW5lciwgcmVwbGFjZSwgcmVwb3J0LCByZXF1aXJlLA0KIHJlc2VydmVkLCByZXNpemVCeSwgcmVzaXplVG8sIHJlc29sdmVQYXRoLCByZXN1bWVVcGRhdGVzLCByZXNwb25kLCByaGlubywgcmlnaHQsDQogcnVuQ29tbWFuZCwgc2Nyb2xsLCBzY3JlZW4sIHNjcmlwdHVybCwgc2Nyb2xsQnksIHNjcm9sbFRvLCBzY3JvbGxiYXIsIHNlYXJjaCwgc2VhbCwgc2VuZCwNCiBzZXJpYWxpemUsIHNldEludGVydmFsLCBzZXRUaW1lb3V0LCBzaGlmdCwgc2xpY2UsIHNvcnQsc3Bhd24sIHNwbGl0LCBzdGFjaywNCiBzdGF0dXMsIHN0YXJ0LCBzdHJpY3QsIHN1Yiwgc3Vic3RyLCBzdXBlcm5ldywgc2hhZG93LCBzdXBwbGFudCwgc3VtLCBzeW5jLA0KIHRlc3QsIHRvTG93ZXJDYXNlLCB0b1N0cmluZywgdG9VcHBlckNhc2UsIHRvaW50MzIsIHRva2VuLCB0b3AsIHRyYWlsaW5nLCB0eXBlLA0KIHR5cGVPZiwgVWludDE2QXJyYXksIFVpbnQzMkFycmF5LCBVaW50OEFycmF5LCB1bmRlZiwgdW51c2VkLCB1cmxzLCB2YWx1ZSwgdmFsdWVPZiwNCiB2YXIsIHZlcnNpb24sIFdlYlNvY2tldCwgd2hpdGUsIHdpbmRvdywgV29ya2VyLCB3c2gqLw0KDQovKmdsb2JhbCBleHBvcnRzOiBmYWxzZSAqLw0KDQovLyBXZSBidWlsZCB0aGUgYXBwbGljYXRpb24gaW5zaWRlIGEgZnVuY3Rpb24gc28gdGhhdCB3ZSBwcm9kdWNlIG9ubHkgYSBzaW5nbGUNCi8vIGdsb2JhbCB2YXJpYWJsZS4gVGhhdCBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgaW1tZWRpYXRlbHksIGFuZCBpdHMgcmV0dXJuDQovLyB2YWx1ZSBpcyB0aGUgSlNISU5UIGZ1bmN0aW9uIGl0c2VsZi4NCg0KdmFyIEpTSElOVCA9IChmdW5jdGlvbiAoKSB7DQogICAgInVzZSBzdHJpY3QiOw0KDQogICAgdmFyIGFub25uYW1lLCAgICAgICAvLyBUaGUgZ3Vlc3NlZCBuYW1lIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zLg0KDQovLyBUaGVzZSBhcmUgb3BlcmF0b3JzIHRoYXQgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggdGhlICEgb3BlcmF0b3IuDQoNCiAgICAgICAgYmFuZyA9IHsNCiAgICAgICAgICAgICc8JyAgOiB0cnVlLA0KICAgICAgICAgICAgJzw9JyA6IHRydWUsDQogICAgICAgICAgICAnPT0nIDogdHJ1ZSwNCiAgICAgICAgICAgICc9PT0nOiB0cnVlLA0KICAgICAgICAgICAgJyE9PSc6IHRydWUsDQogICAgICAgICAgICAnIT0nIDogdHJ1ZSwNCiAgICAgICAgICAgICc+JyAgOiB0cnVlLA0KICAgICAgICAgICAgJz49JyA6IHRydWUsDQogICAgICAgICAgICAnKycgIDogdHJ1ZSwNCiAgICAgICAgICAgICctJyAgOiB0cnVlLA0KICAgICAgICAgICAgJyonICA6IHRydWUsDQogICAgICAgICAgICAnLycgIDogdHJ1ZSwNCiAgICAgICAgICAgICclJyAgOiB0cnVlDQogICAgICAgIH0sDQoNCi8vIFRoZXNlIGFyZSB0aGUgSlNIaW50IGJvb2xlYW4gb3B0aW9ucy4NCg0KICAgICAgICBib29sT3B0aW9ucyA9IHsNCiAgICAgICAgICAgIGFzaSAgICAgICAgIDogdHJ1ZSwgLy8gaWYgYXV0b21hdGljIHNlbWljb2xvbiBpbnNlcnRpb24gc2hvdWxkIGJlIHRvbGVyYXRlZA0KICAgICAgICAgICAgYml0d2lzZSAgICAgOiB0cnVlLCAvLyBpZiBiaXR3aXNlIG9wZXJhdG9ycyBzaG91bGQgbm90IGJlIGFsbG93ZWQNCiAgICAgICAgICAgIGJvc3MgICAgICAgIDogdHJ1ZSwgLy8gaWYgYWR2YW5jZWQgdXNhZ2Ugb2YgYXNzaWdubWVudHMgc2hvdWxkIGJlIGFsbG93ZWQNCiAgICAgICAgICAgIGJyb3dzZXIgICAgIDogdHJ1ZSwgLy8gaWYgdGhlIHN0YW5kYXJkIGJyb3dzZXIgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZA0KICAgICAgICAgICAgY291Y2ggICAgICAgOiB0cnVlLCAvLyBpZiBDb3VjaERCIGdsb2JhbHMgc2hvdWxkIGJlIHByZWRlZmluZWQNCiAgICAgICAgICAgIGN1cmx5ICAgICAgIDogdHJ1ZSwgLy8gaWYgY3VybHkgYnJhY2VzIGFyb3VuZCBhbGwgYmxvY2tzIHNob3VsZCBiZSByZXF1aXJlZA0KICAgICAgICAgICAgZGVidWcgICAgICAgOiB0cnVlLCAvLyBpZiBkZWJ1Z2dlciBzdGF0ZW1lbnRzIHNob3VsZCBiZSBhbGxvd2VkDQogICAgICAgICAgICBkZXZlbCAgICAgICA6IHRydWUsIC8vIGlmIGxvZ2dpbmcgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZCAoY29uc29sZSwgYWxlcnQsIGV0Yy4pDQogICAgICAgICAgICBkb2pvICAgICAgICA6IHRydWUsIC8vIGlmIERvam8gVG9vbGtpdCBnbG9iYWxzIHNob3VsZCBiZSBwcmVkZWZpbmVkDQogICAgICAgICAgICBlcWVxZXEgICAgICA6IHRydWUsIC8vIGlmID09PSBzaG91bGQgYmUgcmVxdWlyZWQNCiAgICAgICAgICAgIGVxbnVsbCAgICAgIDogdHJ1ZSwgLy8gaWYgPT0gbnVsbCBjb21wYXJpc29ucyBzaG91bGQgYmUgdG9sZXJhdGVkDQogICAgICAgICAgICBlczUgICAgICAgICA6IHRydWUsIC8vIGlmIEVTNSBzeW50YXggc2hvdWxkIGJlIGFsbG93ZWQNCiAgICAgICAgICAgIGV2aWwgICAgICAgIDogdHJ1ZSwgLy8gaWYgZXZhbCBzaG91bGQgYmUgYWxsb3dlZA0KICAgICAgICAgICAgZXhwciAgICAgICAgOiB0cnVlLCAvLyBpZiBFeHByZXNzaW9uU3RhdGVtZW50IHNob3VsZCBiZSBhbGxvd2VkIGFzIFByb2dyYW1zDQogICAgICAgICAgICBmb3JpbiAgICAgICA6IHRydWUsIC8vIGlmIGZvciBpbiBzdGF0ZW1lbnRzIG11c3QgZmlsdGVyDQogICAgICAgICAgICBnbG9iYWxzdHJpY3Q6IHRydWUsIC8vIGlmIGdsb2JhbCAidXNlIHN0cmljdCI7IHNob3VsZCBiZSBhbGxvd2VkIChhbHNvIGVuYWJsZXMgJ3N0cmljdCcpDQogICAgICAgICAgICBpbW1lZCAgICAgICA6IHRydWUsIC8vIGlmIGltbWVkaWF0ZSBpbnZvY2F0aW9ucyBtdXN0IGJlIHdyYXBwZWQgaW4gcGFyZW5zDQogICAgICAgICAgICBpdGVyYXRvciAgICA6IHRydWUsIC8vIGlmIHRoZSBgX19pdGVyYXRvcl9fYCBwcm9wZXJ0eSBzaG91bGQgYmUgZGlzYWxsb3dlZA0KICAgICAgICAgICAganF1ZXJ5ICAgICAgOiB0cnVlLCAvLyBpZiBqUXVlcnkgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZA0KICAgICAgICAgICAgbGF0ZWRlZiAgICAgOiB0cnVlLCAvLyBpZiB0aGUgdXNlIGJlZm9yZSBkZWZpbml0aW9uIHNob3VsZCBub3QgYmUgdG9sZXJhdGVkDQogICAgICAgICAgICBsYXhicmVhayAgICA6IHRydWUsIC8vIGlmIGxpbmUgYnJlYWtzIHNob3VsZCBub3QgYmUgY2hlY2tlZA0KICAgICAgICAgICAgbG9vcGZ1bmMgICAgOiB0cnVlLCAvLyBpZiBmdW5jdGlvbnMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gYmUgZGVmaW5lZCB3aXRoaW4gbG9vcHMNCiAgICAgICAgICAgIG1vb3Rvb2xzICAgIDogdHJ1ZSwgLy8gaWYgTW9vVG9vbHMgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZA0KICAgICAgICAgICAgbmV3Y2FwICAgICAgOiB0cnVlLCAvLyBpZiBjb25zdHJ1Y3RvciBuYW1lcyBtdXN0IGJlIGNhcGl0YWxpemVkDQogICAgICAgICAgICBub2FyZyAgICAgICA6IHRydWUsIC8vIGlmIGFyZ3VtZW50cy5jYWxsZXIgYW5kIGFyZ3VtZW50cy5jYWxsZWUgc2hvdWxkIGJlIGRpc2FsbG93ZWQNCiAgICAgICAgICAgIG5vZGUgICAgICAgIDogdHJ1ZSwgLy8gaWYgdGhlIE5vZGUuanMgZW52aXJvbm1lbnQgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZA0KICAgICAgICAgICAgbm9lbXB0eSAgICAgOiB0cnVlLCAvLyBpZiBlbXB0eSBibG9ja3Mgc2hvdWxkIGJlIGRpc2FsbG93ZWQNCiAgICAgICAgICAgIG5vbmV3ICAgICAgIDogdHJ1ZSwgLy8gaWYgdXNpbmcgYG5ld2AgZm9yIHNpZGUtZWZmZWN0cyBzaG91bGQgYmUgZGlzYWxsb3dlZA0KICAgICAgICAgICAgbm9tZW4gICAgICAgOiB0cnVlLCAvLyBpZiBuYW1lcyBzaG91bGQgYmUgY2hlY2tlZA0KICAgICAgICAgICAgb25ldmFyICAgICAgOiB0cnVlLCAvLyBpZiBvbmx5IG9uZSB2YXIgc3RhdGVtZW50IHBlciBmdW5jdGlvbiBzaG91bGQgYmUgYWxsb3dlZA0KICAgICAgICAgICAgcGFzc2ZhaWwgICAgOiB0cnVlLCAvLyBpZiB0aGUgc2NhbiBzaG91bGQgc3RvcCBvbiBmaXJzdCBlcnJvcg0KICAgICAgICAgICAgcGx1c3BsdXMgICAgOiB0cnVlLCAvLyBpZiBpbmNyZW1lbnQvZGVjcmVtZW50IHNob3VsZCBub3QgYmUgYWxsb3dlZA0KICAgICAgICAgICAgcHJvdG8gICAgICAgOiB0cnVlLCAvLyBpZiB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgc2hvdWxkIGJlIGRpc2FsbG93ZWQNCiAgICAgICAgICAgIHByb3RvdHlwZWpzIDogdHJ1ZSwgLy8gaWYgUHJvdG90eXBlIGFuZCBTY3JpcHRhY3Vsb3VzIGdsb2JhbHMgc2hvdWxkIGJlIHByZWRlZmluZWQNCiAgICAgICAgICAgIHJlZ2V4ZGFzaCAgIDogdHJ1ZSwgLy8gaWYgdW5lc2NhcGVkIGxhc3QgZGFzaCAoLSkgaW5zaWRlIGJyYWNrZXRzIHNob3VsZCBiZSB0b2xlcmF0ZWQNCiAgICAgICAgICAgIHJlZ2V4cCAgICAgIDogdHJ1ZSwgLy8gaWYgdGhlIC4gc2hvdWxkIG5vdCBiZSBhbGxvd2VkIGluIHJlZ2V4cCBsaXRlcmFscw0KICAgICAgICAgICAgcmhpbm8gICAgICAgOiB0cnVlLCAvLyBpZiB0aGUgUmhpbm8gZW52aXJvbm1lbnQgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZA0KICAgICAgICAgICAgdW5kZWYgICAgICAgOiB0cnVlLCAvLyBpZiB2YXJpYWJsZXMgc2hvdWxkIGJlIGRlY2xhcmVkIGJlZm9yZSB1c2VkDQogICAgICAgICAgICBzY3JpcHR1cmwgICA6IHRydWUsIC8vIGlmIHNjcmlwdC10YXJnZXRlZCBVUkxzIHNob3VsZCBiZSB0b2xlcmF0ZWQNCiAgICAgICAgICAgIHNoYWRvdyAgICAgIDogdHJ1ZSwgLy8gaWYgdmFyaWFibGUgc2hhZG93aW5nIHNob3VsZCBiZSB0b2xlcmF0ZWQNCiAgICAgICAgICAgIHN0cmljdCAgICAgIDogdHJ1ZSwgLy8gcmVxdWlyZSB0aGUgInVzZSBzdHJpY3QiOyBwcmFnbWENCiAgICAgICAgICAgIHN1YiAgICAgICAgIDogdHJ1ZSwgLy8gaWYgYWxsIGZvcm1zIG9mIHN1YnNjcmlwdCBub3RhdGlvbiBhcmUgdG9sZXJhdGVkDQogICAgICAgICAgICBzdXBlcm5ldyAgICA6IHRydWUsIC8vIGlmIGBuZXcgZnVuY3Rpb24gKCkgeyAuLi4gfTtgIGFuZCBgbmV3IE9iamVjdDtgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSB0b2xlcmF0ZWQNCiAgICAgICAgICAgIHRyYWlsaW5nICAgIDogdHJ1ZSwgLy8gaWYgdHJhaWxpbmcgd2hpdGVzcGFjZSBydWxlcyBhcHBseQ0KICAgICAgICAgICAgd2hpdGUgICAgICAgOiB0cnVlLCAvLyBpZiBzdHJpY3Qgd2hpdGVzcGFjZSBydWxlcyBhcHBseQ0KICAgICAgICAgICAgd3NoICAgICAgICAgOiB0cnVlICAvLyBpZiB0aGUgV2luZG93cyBTY3JpcHRpbmcgSG9zdCBlbnZpcm9ubWVudCBnbG9iYWxzIHNob3VsZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBwcmVkZWZpbmVkDQogICAgICAgIH0sDQoNCi8vIGJyb3dzZXIgY29udGFpbnMgYSBzZXQgb2YgZ2xvYmFsIG5hbWVzIHdoaWNoIGFyZSBjb21tb25seSBwcm92aWRlZCBieSBhDQovLyB3ZWIgYnJvd3NlciBlbnZpcm9ubWVudC4NCg0KICAgICAgICBicm93c2VyID0gew0KICAgICAgICAgICAgQXJyYXlCdWZmZXIgICAgIDogZmFsc2UsDQogICAgICAgICAgICBBcnJheUJ1ZmZlclZpZXcgOiBmYWxzZSwNCiAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZhbHNlLA0KICAgICAgICAgICAgYXBwbGljYXRpb25DYWNoZTogZmFsc2UsDQogICAgICAgICAgICBibHVyICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwgICA6IGZhbHNlLA0KICAgICAgICAgICAgY2xlYXJUaW1lb3V0ICAgIDogZmFsc2UsDQogICAgICAgICAgICBjbG9zZSAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGNsb3NlZCAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgRGF0YVZpZXcgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBkZWZhdWx0U3RhdHVzICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGRvY3VtZW50ICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgZXZlbnQgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBGaWxlUmVhZGVyICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEZsb2F0MzJBcnJheSAgICA6IGZhbHNlLA0KICAgICAgICAgICAgRmxvYXQ2NEFycmF5ICAgIDogZmFsc2UsDQogICAgICAgICAgICBmb2N1cyAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGZyYW1lcyAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZTogZmFsc2UsDQogICAgICAgICAgICBIVE1MRWxlbWVudCAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGhpc3RvcnkgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgSW50MTZBcnJheSAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBJbnQzMkFycmF5ICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEludDhBcnJheSAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgSW1hZ2UgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBsZW5ndGggICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGxvY2FsU3RvcmFnZSAgICA6IGZhbHNlLA0KICAgICAgICAgICAgbG9jYXRpb24gICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBtb3ZlQnkgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIG1vdmVUbyAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgbmFtZSAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBuYXZpZ2F0b3IgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIG9uYmVmb3JldW5sb2FkICA6IHRydWUsDQogICAgICAgICAgICBvbmJsdXIgICAgICAgICAgOiB0cnVlLA0KICAgICAgICAgICAgb25lcnJvciAgICAgICAgIDogdHJ1ZSwNCiAgICAgICAgICAgIG9uZm9jdXMgICAgICAgICA6IHRydWUsDQogICAgICAgICAgICBvbmxvYWQgICAgICAgICAgOiB0cnVlLA0KICAgICAgICAgICAgb25yZXNpemUgICAgICAgIDogdHJ1ZSwNCiAgICAgICAgICAgIG9udW5sb2FkICAgICAgICA6IHRydWUsDQogICAgICAgICAgICBvcGVuICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIG9wZW5EYXRhYmFzZSAgICA6IGZhbHNlLA0KICAgICAgICAgICAgb3BlbmVyICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBPcHRpb24gICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHBhcmVudCAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgcHJpbnQgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyOiBmYWxzZSwNCiAgICAgICAgICAgIHJlc2l6ZUJ5ICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgcmVzaXplVG8gICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBzY3JlZW4gICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHNjcm9sbCAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgc2Nyb2xsQnkgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBzY3JvbGxUbyAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHNldEludGVydmFsICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgc2V0VGltZW91dCAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBzdGF0dXMgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHRvcCAgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgVWludDE2QXJyYXkgICAgIDogZmFsc2UsDQogICAgICAgICAgICBVaW50MzJBcnJheSAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFVpbnQ4QXJyYXkgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgV2ViU29ja2V0ICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICB3aW5kb3cgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFdvcmtlciAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgWE1MSHR0cFJlcXVlc3QgIDogZmFsc2UsDQogICAgICAgICAgICBYUGF0aEV2YWx1YXRvciAgOiBmYWxzZSwNCiAgICAgICAgICAgIFhQYXRoRXhjZXB0aW9uICA6IGZhbHNlLA0KICAgICAgICAgICAgWFBhdGhFeHByZXNzaW9uIDogZmFsc2UsDQogICAgICAgICAgICBYUGF0aE5hbWVzcGFjZSAgOiBmYWxzZSwNCiAgICAgICAgICAgIFhQYXRoTlNSZXNvbHZlciA6IGZhbHNlLA0KICAgICAgICAgICAgWFBhdGhSZXN1bHQgICAgIDogZmFsc2UNCiAgICAgICAgfSwNCg0KICAgICAgICBjb3VjaCA9IHsNCiAgICAgICAgICAgICJyZXF1aXJlIiA6IGZhbHNlLA0KICAgICAgICAgICAgcmVzcG9uZCAgIDogZmFsc2UsDQogICAgICAgICAgICBnZXRSb3cgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGVtaXQgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgc2VuZCAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBzdGFydCAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHN1bSAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgbG9nICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBleHBvcnRzICAgOiBmYWxzZSwNCiAgICAgICAgICAgIG1vZHVsZSAgICA6IGZhbHNlDQogICAgICAgIH0sDQoNCiAgICAgICAgZGV2ZWwgPSB7DQogICAgICAgICAgICBhbGVydCAgIDogZmFsc2UsDQogICAgICAgICAgICBjb25maXJtIDogZmFsc2UsDQogICAgICAgICAgICBjb25zb2xlIDogZmFsc2UsDQogICAgICAgICAgICBEZWJ1ZyAgIDogZmFsc2UsDQogICAgICAgICAgICBvcGVyYSAgIDogZmFsc2UsDQogICAgICAgICAgICBwcm9tcHQgIDogZmFsc2UNCiAgICAgICAgfSwNCg0KICAgICAgICBkb2pvID0gew0KICAgICAgICAgICAgZG9qbyAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBkaWppdCAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGRvam94ICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgZGVmaW5lICAgIDogZmFsc2UsDQogICAgICAgICAgICAicmVxdWlyZSIgOiBmYWxzZQ0KICAgICAgICB9LA0KDQogICAgICAgIGVzY2FwZXMgPSB7DQogICAgICAgICAgICAnXGInOiAnXFxiJywNCiAgICAgICAgICAgICdcdCc6ICdcXHQnLA0KICAgICAgICAgICAgJ1xuJzogJ1xcbicsDQogICAgICAgICAgICAnXGYnOiAnXFxmJywNCiAgICAgICAgICAgICdccic6ICdcXHInLA0KICAgICAgICAgICAgJyInIDogJ1xcIicsDQogICAgICAgICAgICAnLycgOiAnXFwvJywNCiAgICAgICAgICAgICdcXCc6ICdcXFxcJw0KICAgICAgICB9LA0KDQogICAgICAgIGZ1bmN0LCAgICAgICAgICAvLyBUaGUgY3VycmVudCBmdW5jdGlvbg0KDQogICAgICAgIGZ1bmN0aW9uaWNpdHkgPSBbDQogICAgICAgICAgICAnY2xvc3VyZScsICdleGNlcHRpb24nLCAnZ2xvYmFsJywgJ2xhYmVsJywNCiAgICAgICAgICAgICdvdXRlcicsICd1bnVzZWQnLCAndmFyJw0KICAgICAgICBdLA0KDQogICAgICAgIGZ1bmN0aW9ucywgICAgICAvLyBBbGwgb2YgdGhlIGZ1bmN0aW9ucw0KDQogICAgICAgIGdsb2JhbCwgICAgICAgICAvLyBUaGUgZ2xvYmFsIHNjb3BlDQogICAgICAgIGltcGxpZWQsICAgICAgICAvLyBJbXBsaWVkIGdsb2JhbHMNCiAgICAgICAgaW5ibG9jaywNCiAgICAgICAgaW5kZW50LA0KICAgICAgICBqc29ubW9kZSwNCg0KICAgICAgICBqcXVlcnkgPSB7DQogICAgICAgICAgICAnJCcgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGpRdWVyeSA6IGZhbHNlDQogICAgICAgIH0sDQoNCiAgICAgICAgbGluZXMsDQogICAgICAgIGxvb2thaGVhZCwNCiAgICAgICAgbWVtYmVyLA0KICAgICAgICBtZW1iZXJzT25seSwNCg0KICAgICAgICBtb290b29scyA9IHsNCiAgICAgICAgICAgICckJyAgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgJyQkJyAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBBc3NldHMgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEJyb3dzZXIgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgQ2hhaW4gICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBDbGFzcyAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIENvbG9yICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgQ29va2llICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBDb3JlICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIERvY3VtZW50ICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgRG9tUmVhZHkgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBET01SZWFkeSAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIERyYWcgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgRWxlbWVudCAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBFbGVtZW50cyAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEV2ZW50ICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgRXZlbnRzICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBGeCAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEdyb3VwICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgSGFzaCAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBIdG1sVGFibGUgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIElmcmFtZSAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgSWZyYW1lU2hpbSAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBJbnB1dFZhbGlkYXRvciAgOiBmYWxzZSwNCiAgICAgICAgICAgIGluc3RhbmNlT2YgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgS2V5Ym9hcmQgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBMb2NhbGUgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIE1hc2sgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgTW9vVG9vbHMgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBOYXRpdmUgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIE9wdGlvbnMgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgT3ZlclRleHQgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBSZXF1ZXN0ICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFNjcm9sbGVyICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgU2xpY2sgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBTbGlkZXIgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFNvcnRhYmxlcyAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgU3Bpbm5lciAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBTd2lmZiAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFRpcHMgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICB0eXBlT2YgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFVSSSAgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgV2luZG93ICAgICAgICAgIDogZmFsc2UNCiAgICAgICAgfSwNCg0KICAgICAgICBuZXh0dG9rZW4sDQoNCiAgICAgICAgbm9kZSA9IHsNCiAgICAgICAgICAgIF9fZmlsZW5hbWUgIDogZmFsc2UsDQogICAgICAgICAgICBfX2Rpcm5hbWUgICA6IGZhbHNlLA0KICAgICAgICAgICAgZXhwb3J0cyAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEJ1ZmZlciAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBHTE9CQUwgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgZ2xvYmFsICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIG1vZHVsZSAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBwcm9jZXNzICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgcmVxdWlyZSAgICAgOiBmYWxzZQ0KICAgICAgICB9LA0KDQogICAgICAgIG5vcmVhY2gsDQogICAgICAgIG9wdGlvbiwNCiAgICAgICAgcHJlZGVmaW5lZCwgICAgIC8vIEdsb2JhbCB2YXJpYWJsZXMgZGVmaW5lZCBieSBvcHRpb24NCiAgICAgICAgcHJlcmVnLA0KICAgICAgICBwcmV2dG9rZW4sDQoNCiAgICAgICAgcHJvdG90eXBlanMgPSB7DQogICAgICAgICAgICAnJCcgICAgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgJyQkJyAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgICckQScgICAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICAnJEYnICAgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgJyRIJyAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgICckUicgICAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICAnJGJyZWFrJyAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgJyRjb250aW51ZScgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgICckdycgICAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBBYnN0cmFjdCAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgQWpheCAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBFbnVtZXJhYmxlICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEV2ZW50ICAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBGaWVsZCAgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgRm9ybSAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEhhc2ggICAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBJbnNlcnRpb24gICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgT2JqZWN0UmFuZ2UgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFBlcmlvZGljYWxFeGVjdXRlcjogZmFsc2UsDQogICAgICAgICAgICBQb3NpdGlvbiAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgUHJvdG90eXBlICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFNlbGVjdG9yICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBUZW1wbGF0ZSAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgVG9nZ2xlICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFRyeSAgICAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBBdXRvY29tcGxldGVyICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgQnVpbGRlciAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIENvbnRyb2wgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBEcmFnZ2FibGUgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgRHJhZ2dhYmxlcyAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIERyb3BwYWJsZXMgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBFZmZlY3QgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgU29ydGFibGUgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFNvcnRhYmxlT2JzZXJ2ZXIgIDogZmFsc2UsDQogICAgICAgICAgICBTb3VuZCAgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgU2NyaXB0YWN1bG91cyAgICAgOiBmYWxzZQ0KICAgICAgICB9LA0KDQogICAgICAgIHJoaW5vID0gew0KICAgICAgICAgICAgZGVmaW5lQ2xhc3MgOiBmYWxzZSwNCiAgICAgICAgICAgIGRlc2VyaWFsaXplIDogZmFsc2UsDQogICAgICAgICAgICBnYyAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgaGVscCAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGxvYWQgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBsb2FkQ2xhc3MgICA6IGZhbHNlLA0KICAgICAgICAgICAgcHJpbnQgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHF1aXQgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICByZWFkRmlsZSAgICA6IGZhbHNlLA0KICAgICAgICAgICAgcmVhZFVybCAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHJ1bkNvbW1hbmQgIDogZmFsc2UsDQogICAgICAgICAgICBzZWFsICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgc2VyaWFsaXplICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHNwYXduICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBzeW5jICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgdG9pbnQzMiAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHZlcnNpb24gICAgIDogZmFsc2UNCiAgICAgICAgfSwNCg0KICAgICAgICBzY29wZSwgICAgICAvLyBUaGUgY3VycmVudCBzY29wZQ0KICAgICAgICBzcmMsDQogICAgICAgIHN0YWNrLA0KDQovLyBzdGFuZGFyZCBjb250YWlucyB0aGUgZ2xvYmFsIG5hbWVzIHRoYXQgYXJlIHByb3ZpZGVkIGJ5IHRoZQ0KLy8gRUNNQVNjcmlwdCBzdGFuZGFyZC4NCg0KICAgICAgICBzdGFuZGFyZCA9IHsNCiAgICAgICAgICAgIEFycmF5ICAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEJvb2xlYW4gICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIERhdGUgICAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGRlY29kZVVSSSAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGRlY29kZVVSSUNvbXBvbmVudCAgOiBmYWxzZSwNCiAgICAgICAgICAgIGVuY29kZVVSSSAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudCAgOiBmYWxzZSwNCiAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgICdldmFsJyAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEV2YWxFcnJvciAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGhhc093blByb3BlcnR5ICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGlzRmluaXRlICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGlzTmFOICAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEpTT04gICAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIE1hdGggICAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHBhcnNlSW50ICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHBhcnNlRmxvYXQgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFJhbmdlRXJyb3IgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFJlZmVyZW5jZUVycm9yICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFJlZ0V4cCAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFN0cmluZyAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFN5bnRheEVycm9yICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFR5cGVFcnJvciAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFVSSUVycm9yICAgICAgICAgICAgOiBmYWxzZQ0KICAgICAgICB9LA0KDQogICAgICAgIHN0YW5kYXJkX21lbWJlciA9IHsNCiAgICAgICAgICAgIEUgICAgICAgICAgICAgICAgICAgOiB0cnVlLA0KICAgICAgICAgICAgTE4yICAgICAgICAgICAgICAgICA6IHRydWUsDQogICAgICAgICAgICBMTjEwICAgICAgICAgICAgICAgIDogdHJ1ZSwNCiAgICAgICAgICAgIExPRzJFICAgICAgICAgICAgICAgOiB0cnVlLA0KICAgICAgICAgICAgTE9HMTBFICAgICAgICAgICAgICA6IHRydWUsDQogICAgICAgICAgICBNQVhfVkFMVUUgICAgICAgICAgIDogdHJ1ZSwNCiAgICAgICAgICAgIE1JTl9WQUxVRSAgICAgICAgICAgOiB0cnVlLA0KICAgICAgICAgICAgTkVHQVRJVkVfSU5GSU5JVFkgICA6IHRydWUsDQogICAgICAgICAgICBQSSAgICAgICAgICAgICAgICAgIDogdHJ1ZSwNCiAgICAgICAgICAgIFBPU0lUSVZFX0lORklOSVRZICAgOiB0cnVlLA0KICAgICAgICAgICAgU1FSVDFfMiAgICAgICAgICAgICA6IHRydWUsDQogICAgICAgICAgICBTUVJUMiAgICAgICAgICAgICAgIDogdHJ1ZQ0KICAgICAgICB9LA0KDQogICAgICAgIHN0cmljdF9tb2RlLA0KICAgICAgICBzeW50YXggPSB7fSwNCiAgICAgICAgdGFiLA0KICAgICAgICB0b2tlbiwNCiAgICAgICAgdXJscywNCiAgICAgICAgd2FybmluZ3MsDQoNCiAgICAgICAgd3NoID0gew0KICAgICAgICAgICAgQWN0aXZlWE9iamVjdCAgICAgICAgICAgICA6IHRydWUsDQogICAgICAgICAgICBFbnVtZXJhdG9yICAgICAgICAgICAgICAgIDogdHJ1ZSwNCiAgICAgICAgICAgIEdldE9iamVjdCAgICAgICAgICAgICAgICAgOiB0cnVlLA0KICAgICAgICAgICAgU2NyaXB0RW5naW5lICAgICAgICAgICAgICA6IHRydWUsDQogICAgICAgICAgICBTY3JpcHRFbmdpbmVCdWlsZFZlcnNpb24gIDogdHJ1ZSwNCiAgICAgICAgICAgIFNjcmlwdEVuZ2luZU1ham9yVmVyc2lvbiAgOiB0cnVlLA0KICAgICAgICAgICAgU2NyaXB0RW5naW5lTWlub3JWZXJzaW9uICA6IHRydWUsDQogICAgICAgICAgICBWQkFycmF5ICAgICAgICAgICAgICAgICAgIDogdHJ1ZSwNCiAgICAgICAgICAgIFdTSCAgICAgICAgICAgICAgICAgICAgICAgOiB0cnVlLA0KICAgICAgICAgICAgV1NjcmlwdCAgICAgICAgICAgICAgICAgICA6IHRydWUNCiAgICAgICAgfTsNCg0KICAgICAgICAvLyBSZWd1bGFyIGV4cHJlc3Npb25zLiBTb21lIG9mIHRoZXNlIGFyZSBzdHVwaWRseSBsb25nLg0KICAgICAgICB2YXIgYXgsIGN4LCB0eCwgbngsIG54ZywgbHgsIGl4LCBqeCwgZnQ7DQogICAgICAgIChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAvKmpzaGludCBtYXhsZW46MzAwICovDQoNCiAgICAgICAgICAgIC8vIHVuc2FmZSBjb21tZW50IG9yIHN0cmluZw0KICAgICAgICAgICAgYXggPSAvQGNjfDxcLz98c2NyaXB0fFxdXHMqXF18PFxzKiF8Jmx0L2k7DQoNCiAgICAgICAgICAgIC8vIHVuc2FmZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIHNpbGVudGx5IGRlbGV0ZWQgYnkgb25lIG9yIG1vcmUgYnJvd3NlcnMNCiAgICAgICAgICAgIGN4ID0gL1tcdTAwMDAtXHUwMDFmXHUwMDdmLVx1MDA5Zlx1MDBhZFx1MDYwMC1cdTA2MDRcdTA3MGZcdTE3YjRcdTE3YjVcdTIwMGMtXHUyMDBmXHUyMDI4LVx1MjAyZlx1MjA2MC1cdTIwNmZcdWZlZmZcdWZmZjAtXHVmZmZmXS87DQoNCiAgICAgICAgICAgIC8vIHRva2VuDQogICAgICAgICAgICB0eCA9IC9eXHMqKFsoKXt9XFsuLDo7JyJ+XD9cXSNAXXw9PT89P3xcLyhcKihqc2hpbnR8anNsaW50fG1lbWJlcnM/fGdsb2JhbCk/fD18XC8pP3xcKltcLz1dP3xcKyg/Oj18XCsrKT98LSg/Oj18LSspP3wlPT98JlsmPV0/fFx8W3w9XT98Pj4/Pj89P3w8KFtcLz0hXXxcIShcW3wtLSk/fDw9Pyk/fFxePT98XCE9Pz0/fFthLXpBLVpfJF1bYS16QS1aMC05XyRdKnxbMC05XSsoW3hYXVswLTlhLWZBLUZdK3xcLlswLTldKik/KFtlRV1bK1wtXT9bMC05XSspPykvOw0KDQogICAgICAgICAgICAvLyBjaGFyYWN0ZXJzIGluIHN0cmluZ3MgdGhhdCBuZWVkIGVzY2FwZW1lbnQNCiAgICAgICAgICAgIG54ID0gL1tcdTAwMDAtXHUwMDFmJjwiXC9cXFx1MDA3Zi1cdTAwOWZcdTAwYWRcdTA2MDAtXHUwNjA0XHUwNzBmXHUxN2I0XHUxN2I1XHUyMDBjLVx1MjAwZlx1MjAyOC1cdTIwMmZcdTIwNjAtXHUyMDZmXHVmZWZmXHVmZmYwLVx1ZmZmZl0vOw0KICAgICAgICAgICAgbnhnID0gL1tcdTAwMDAtXHUwMDFmJjwiXC9cXFx1MDA3Zi1cdTAwOWZcdTAwYWRcdTA2MDAtXHUwNjA0XHUwNzBmXHUxN2I0XHUxN2I1XHUyMDBjLVx1MjAwZlx1MjAyOC1cdTIwMmZcdTIwNjAtXHUyMDZmXHVmZWZmXHVmZmYwLVx1ZmZmZl0vZzsNCg0KICAgICAgICAgICAgLy8gc3RhciBzbGFzaA0KICAgICAgICAgICAgbHggPSAvXCpcL3xcL1wqLzsNCg0KICAgICAgICAgICAgLy8gaWRlbnRpZmllcg0KICAgICAgICAgICAgaXggPSAvXihbYS16QS1aXyRdW2EtekEtWjAtOV8kXSopJC87DQoNCiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQgdXJsDQogICAgICAgICAgICBqeCA9IC9eKD86amF2YXNjcmlwdHxqc2NyaXB0fGVjbWFzY3JpcHR8dmJzY3JpcHR8bW9jaGF8bGl2ZXNjcmlwdClccyo6L2k7DQoNCiAgICAgICAgICAgIC8vIGNhdGNoZXMgLyogZmFsbHMgdGhyb3VnaCAqLyBjb21tZW50cw0KICAgICAgICAgICAgZnQgPSAvXlxzKlwvXCpccypmYWxsc1xzdGhyb3VnaFxzKlwqXC9ccyokLzsNCiAgICAgICAgfSgpKTsNCg0KICAgIGZ1bmN0aW9uIEYoKSB7fSAgICAgLy8gVXNlZCBieSBPYmplY3QuY3JlYXRlDQoNCiAgICBmdW5jdGlvbiBpc19vd24ob2JqZWN0LCBuYW1lKSB7DQoNCi8vIFRoZSBvYmplY3QuaGFzT3duUHJvcGVydHkgbWV0aG9kIGZhaWxzIHdoZW4gdGhlIHByb3BlcnR5IHVuZGVyIGNvbnNpZGVyYXRpb24NCi8vIGlzIG5hbWVkICdoYXNPd25Qcm9wZXJ0eScuIFNvIHdlIGhhdmUgdG8gdXNlIHRoaXMgbW9yZSBjb252b2x1dGVkIGZvcm0uDQoNCiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIG5hbWUpOw0KICAgIH0NCg0KLy8gUHJvdmlkZSBjcml0aWNhbCBFUzUgZnVuY3Rpb25zIHRvIEVTMy4NCg0KICAgIGlmICh0eXBlb2YgQXJyYXkuaXNBcnJheSAhPT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICBBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gKG8pIHsNCiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG8pID09PSAnW29iamVjdCBBcnJheV0nOw0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIGlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gKG8pIHsNCiAgICAgICAgICAgIEYucHJvdG90eXBlID0gbzsNCiAgICAgICAgICAgIHJldHVybiBuZXcgRigpOw0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIGlmICh0eXBlb2YgT2JqZWN0LmtleXMgIT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiAobykgew0KICAgICAgICAgICAgdmFyIGEgPSBbXSwgazsNCiAgICAgICAgICAgIGZvciAoayBpbiBvKSB7DQogICAgICAgICAgICAgICAgaWYgKGlzX293bihvLCBrKSkgew0KICAgICAgICAgICAgICAgICAgICBhLnB1c2goayk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGE7DQogICAgICAgIH07DQogICAgfQ0KDQovLyBOb24gc3RhbmRhcmQgbWV0aG9kcw0KDQogICAgaWYgKHR5cGVvZiBTdHJpbmcucHJvdG90eXBlLmVudGl0eWlmeSAhPT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICBTdHJpbmcucHJvdG90eXBlLmVudGl0eWlmeSA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzDQogICAgICAgICAgICAgICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JykNCiAgICAgICAgICAgICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpDQogICAgICAgICAgICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKTsNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICBpZiAodHlwZW9mIFN0cmluZy5wcm90b3R5cGUuaXNBbHBoYSAhPT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICBTdHJpbmcucHJvdG90eXBlLmlzQWxwaGEgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICByZXR1cm4gKHRoaXMgPj0gJ2EnICYmIHRoaXMgPD0gJ3pcdWZmZmYnKSB8fA0KICAgICAgICAgICAgICAgICh0aGlzID49ICdBJyAmJiB0aGlzIDw9ICdaXHVmZmZmJyk7DQogICAgICAgIH07DQogICAgfQ0KDQogICAgaWYgKHR5cGVvZiBTdHJpbmcucHJvdG90eXBlLmlzRGlnaXQgIT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgU3RyaW5nLnByb3RvdHlwZS5pc0RpZ2l0ID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgcmV0dXJuICh0aGlzID49ICcwJyAmJiB0aGlzIDw9ICc5Jyk7DQogICAgICAgIH07DQogICAgfQ0KDQogICAgaWYgKHR5cGVvZiBTdHJpbmcucHJvdG90eXBlLnN1cHBsYW50ICE9PSAnZnVuY3Rpb24nKSB7DQogICAgICAgIFN0cmluZy5wcm90b3R5cGUuc3VwcGxhbnQgPSBmdW5jdGlvbiAobykgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvXHsoW157fV0qKVx9L2csIGZ1bmN0aW9uIChhLCBiKSB7DQogICAgICAgICAgICAgICAgdmFyIHIgPSBvW2JdOw0KICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgciA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHIgPT09ICdudW1iZXInID8gciA6IGE7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICBpZiAodHlwZW9mIFN0cmluZy5wcm90b3R5cGUubmFtZSAhPT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICBTdHJpbmcucHJvdG90eXBlLm5hbWUgPSBmdW5jdGlvbiAoKSB7DQoNCi8vIElmIHRoZSBzdHJpbmcgbG9va3MgbGlrZSBhbiBpZGVudGlmaWVyLCB0aGVuIHdlIGNhbiByZXR1cm4gaXQgYXMgaXMuDQovLyBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG5vIGNvbnRyb2wgY2hhcmFjdGVycywgbm8gcXVvdGUgY2hhcmFjdGVycywgYW5kIG5vDQovLyBiYWNrc2xhc2ggY2hhcmFjdGVycywgdGhlbiB3ZSBjYW4gc2ltcGx5IHNsYXAgc29tZSBxdW90ZXMgYXJvdW5kIGl0Lg0KLy8gT3RoZXJ3aXNlIHdlIG11c3QgYWxzbyByZXBsYWNlIHRoZSBvZmZlbmRpbmcgY2hhcmFjdGVycyB3aXRoIHNhZmUNCi8vIHNlcXVlbmNlcy4NCg0KICAgICAgICAgICAgaWYgKGl4LnRlc3QodGhpcykpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChueC50ZXN0KHRoaXMpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICciJyArIHRoaXMucmVwbGFjZShueGcsIGZ1bmN0aW9uIChhKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjID0gZXNjYXBlc1thXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnXFx1JyArICgnMDAwMCcgKyBhLmNoYXJDb2RlQXQoKS50b1N0cmluZygxNikpLnNsaWNlKC00KTsNCiAgICAgICAgICAgICAgICB9KSArICciJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAnIicgKyB0aGlzICsgJyInOw0KICAgICAgICB9Ow0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gY29tYmluZSh0LCBvKSB7DQogICAgICAgIHZhciBuOw0KICAgICAgICBmb3IgKG4gaW4gbykgew0KICAgICAgICAgICAgaWYgKGlzX293bihvLCBuKSkgew0KICAgICAgICAgICAgICAgIHRbbl0gPSBvW25dOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYXNzdW1lKCkgew0KICAgICAgICBpZiAob3B0aW9uLmNvdWNoKQ0KICAgICAgICAgICAgY29tYmluZShwcmVkZWZpbmVkLCBjb3VjaCk7DQoNCiAgICAgICAgaWYgKG9wdGlvbi5yaGlubykNCiAgICAgICAgICAgIGNvbWJpbmUocHJlZGVmaW5lZCwgcmhpbm8pOw0KDQogICAgICAgIGlmIChvcHRpb24ucHJvdG90eXBlanMpDQogICAgICAgICAgICBjb21iaW5lKHByZWRlZmluZWQsIHByb3RvdHlwZWpzKTsNCg0KICAgICAgICBpZiAob3B0aW9uLm5vZGUpDQogICAgICAgICAgICBjb21iaW5lKHByZWRlZmluZWQsIG5vZGUpOw0KDQogICAgICAgIGlmIChvcHRpb24uZGV2ZWwpDQogICAgICAgICAgICBjb21iaW5lKHByZWRlZmluZWQsIGRldmVsKTsNCg0KICAgICAgICBpZiAob3B0aW9uLmRvam8pDQogICAgICAgICAgICBjb21iaW5lKHByZWRlZmluZWQsIGRvam8pOw0KDQogICAgICAgIGlmIChvcHRpb24uYnJvd3NlcikNCiAgICAgICAgICAgIGNvbWJpbmUocHJlZGVmaW5lZCwgYnJvd3Nlcik7DQoNCiAgICAgICAgaWYgKG9wdGlvbi5qcXVlcnkpDQogICAgICAgICAgICBjb21iaW5lKHByZWRlZmluZWQsIGpxdWVyeSk7DQoNCiAgICAgICAgaWYgKG9wdGlvbi5tb290b29scykNCiAgICAgICAgICAgIGNvbWJpbmUocHJlZGVmaW5lZCwgbW9vdG9vbHMpOw0KDQogICAgICAgIGlmIChvcHRpb24ud3NoKQ0KICAgICAgICAgICAgY29tYmluZShwcmVkZWZpbmVkLCB3c2gpOw0KDQogICAgICAgIGlmIChvcHRpb24uZ2xvYmFsc3RyaWN0ICYmIG9wdGlvbi5zdHJpY3QgIT09IGZhbHNlKQ0KICAgICAgICAgICAgb3B0aW9uLnN0cmljdCA9IHRydWU7DQogICAgfQ0KDQoNCi8vIFByb2R1Y2UgYW4gZXJyb3Igd2FybmluZy4NCg0KICAgIGZ1bmN0aW9uIHF1aXQobWVzc2FnZSwgbGluZSwgY2hyKSB7DQogICAgICAgIHZhciBwZXJjZW50YWdlID0gTWF0aC5mbG9vcigobGluZSAvIGxpbmVzLmxlbmd0aCkgKiAxMDApOw0KDQogICAgICAgIHRocm93IHsNCiAgICAgICAgICAgIG5hbWU6ICdKU0hpbnRFcnJvcicsDQogICAgICAgICAgICBsaW5lOiBsaW5lLA0KICAgICAgICAgICAgY2hhcmFjdGVyOiBjaHIsDQogICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlICsgIiAoIiArIHBlcmNlbnRhZ2UgKyAiJSBzY2FubmVkKS4iDQogICAgICAgIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gd2FybmluZyhtLCB0LCBhLCBiLCBjLCBkKSB7DQogICAgICAgIHZhciBjaCwgbCwgdzsNCiAgICAgICAgdCA9IHQgfHwgbmV4dHRva2VuOw0KICAgICAgICBpZiAodC5pZCA9PT0gJyhlbmQpJykgeyAgLy8gYH4NCiAgICAgICAgICAgIHQgPSB0b2tlbjsNCiAgICAgICAgfQ0KICAgICAgICBsID0gdC5saW5lIHx8IDA7DQogICAgICAgIGNoID0gdC5mcm9tIHx8IDA7DQogICAgICAgIHcgPSB7DQogICAgICAgICAgICBpZDogJyhlcnJvciknLA0KICAgICAgICAgICAgcmF3OiBtLA0KICAgICAgICAgICAgZXZpZGVuY2U6IGxpbmVzW2wgLSAxXSB8fCAnJywNCiAgICAgICAgICAgIGxpbmU6IGwsDQogICAgICAgICAgICBjaGFyYWN0ZXI6IGNoLA0KICAgICAgICAgICAgYTogYSwNCiAgICAgICAgICAgIGI6IGIsDQogICAgICAgICAgICBjOiBjLA0KICAgICAgICAgICAgZDogZA0KICAgICAgICB9Ow0KICAgICAgICB3LnJlYXNvbiA9IG0uc3VwcGxhbnQodyk7DQogICAgICAgIEpTSElOVC5lcnJvcnMucHVzaCh3KTsNCiAgICAgICAgaWYgKG9wdGlvbi5wYXNzZmFpbCkgew0KICAgICAgICAgICAgcXVpdCgnU3RvcHBpbmcuICcsIGwsIGNoKTsNCiAgICAgICAgfQ0KICAgICAgICB3YXJuaW5ncyArPSAxOw0KICAgICAgICBpZiAod2FybmluZ3MgPj0gb3B0aW9uLm1heGVycikgew0KICAgICAgICAgICAgcXVpdCgiVG9vIG1hbnkgZXJyb3JzLiIsIGwsIGNoKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB3YXJuaW5nQXQobSwgbCwgY2gsIGEsIGIsIGMsIGQpIHsNCiAgICAgICAgcmV0dXJuIHdhcm5pbmcobSwgew0KICAgICAgICAgICAgbGluZTogbCwNCiAgICAgICAgICAgIGZyb206IGNoDQogICAgICAgIH0sIGEsIGIsIGMsIGQpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGVycm9yKG0sIHQsIGEsIGIsIGMsIGQpIHsNCiAgICAgICAgdmFyIHcgPSB3YXJuaW5nKG0sIHQsIGEsIGIsIGMsIGQpOw0KICAgICAgICBxdWl0KCJTdG9wcGluZywgdW5hYmxlIHRvIGNvbnRpbnVlLiIsIHcubGluZSwgdy5jaGFyYWN0ZXIpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGVycm9yQXQobSwgbCwgY2gsIGEsIGIsIGMsIGQpIHsNCiAgICAgICAgcmV0dXJuIGVycm9yKG0sIHsNCiAgICAgICAgICAgIGxpbmU6IGwsDQogICAgICAgICAgICBmcm9tOiBjaA0KICAgICAgICB9LCBhLCBiLCBjLCBkKTsNCiAgICB9DQoNCg0KDQovLyBsZXhpY2FsIGFuYWx5c2lzIGFuZCB0b2tlbiBjb25zdHJ1Y3Rpb24NCg0KICAgIHZhciBsZXggPSAoZnVuY3Rpb24gbGV4KCkgew0KICAgICAgICB2YXIgY2hhcmFjdGVyLCBmcm9tLCBsaW5lLCBzOw0KDQovLyBQcml2YXRlIGxleCBtZXRob2RzDQoNCiAgICAgICAgZnVuY3Rpb24gbmV4dExpbmUoKSB7DQogICAgICAgICAgICB2YXIgYXQsDQogICAgICAgICAgICAgICAgdHc7IC8vIHRyYWlsaW5nIHdoaXRlc3BhY2UgY2hlY2sNCg0KICAgICAgICAgICAgaWYgKGxpbmUgPj0gbGluZXMubGVuZ3RoKQ0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICAgICAgY2hhcmFjdGVyID0gMTsNCiAgICAgICAgICAgIHMgPSBsaW5lc1tsaW5lXTsNCiAgICAgICAgICAgIGxpbmUgKz0gMTsNCiAgICAgICAgICAgIGF0ID0gcy5zZWFyY2goLyBcdC8pOw0KDQogICAgICAgICAgICBpZiAoYXQgPj0gMCkNCiAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIk1peGVkIHNwYWNlcyBhbmQgdGFicy4iLCBsaW5lLCBhdCArIDEpOw0KDQogICAgICAgICAgICBzID0gcy5yZXBsYWNlKC9cdC9nLCB0YWIpOw0KICAgICAgICAgICAgYXQgPSBzLnNlYXJjaChjeCk7DQoNCiAgICAgICAgICAgIGlmIChhdCA+PSAwKQ0KICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVW5zYWZlIGNoYXJhY3Rlci4iLCBsaW5lLCBhdCk7DQoNCiAgICAgICAgICAgIGlmIChvcHRpb24ubWF4bGVuICYmIG9wdGlvbi5tYXhsZW4gPCBzLmxlbmd0aCkNCiAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkxpbmUgdG9vIGxvbmcuIiwgbGluZSwgcy5sZW5ndGgpOw0KDQogICAgICAgICAgICAvLyBDaGVjayBmb3IgdHJhaWxpbmcgd2hpdGVzcGFjZXMNCiAgICAgICAgICAgIHR3ID0gcy5zZWFyY2goL1xzKyQvKTsNCiAgICAgICAgICAgIGlmIChvcHRpb24udHJhaWxpbmcgJiYgfnR3ICYmICF+cy5zZWFyY2goL15ccyskLykpDQogICAgICAgICAgICAgICAgd2FybmluZ0F0KCJUcmFpbGluZyB3aGl0ZXNwYWNlLiIsIGxpbmUsIHR3KTsNCg0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCg0KLy8gUHJvZHVjZSBhIHRva2VuIG9iamVjdC4gIFRoZSB0b2tlbiBpbmhlcml0cyBmcm9tIGEgc3ludGF4IHN5bWJvbC4NCg0KICAgICAgICBmdW5jdGlvbiBpdCh0eXBlLCB2YWx1ZSkgew0KICAgICAgICAgICAgdmFyIGksIHQ7DQogICAgICAgICAgICBpZiAodHlwZSA9PT0gJyhjb2xvciknIHx8IHR5cGUgPT09ICcocmFuZ2UpJykgew0KICAgICAgICAgICAgICAgIHQgPSB7dHlwZTogdHlwZX07DQogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICcocHVuY3R1YXRvciknIHx8DQogICAgICAgICAgICAgICAgICAgICh0eXBlID09PSAnKGlkZW50aWZpZXIpJyAmJiBpc19vd24oc3ludGF4LCB2YWx1ZSkpKSB7DQogICAgICAgICAgICAgICAgdCA9IHN5bnRheFt2YWx1ZV0gfHwgc3ludGF4WycoZXJyb3IpJ107DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHQgPSBzeW50YXhbdHlwZV07DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0ID0gT2JqZWN0LmNyZWF0ZSh0KTsNCiAgICAgICAgICAgIGlmICh0eXBlID09PSAnKHN0cmluZyknIHx8IHR5cGUgPT09ICcocmFuZ2UpJykgew0KICAgICAgICAgICAgICAgIGlmICghb3B0aW9uLnNjcmlwdHVybCAmJiBqeC50ZXN0KHZhbHVlKSkgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIlNjcmlwdCBVUkwuIiwgbGluZSwgZnJvbSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHR5cGUgPT09ICcoaWRlbnRpZmllciknKSB7DQogICAgICAgICAgICAgICAgdC5pZGVudGlmaWVyID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICdfX3Byb3RvX18nICYmICFvcHRpb24ucHJvdG8pIHsNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJUaGUgJ3thfScgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgZnJvbSwgdmFsdWUpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdfX2l0ZXJhdG9yX18nICYmICFvcHRpb24uaXRlcmF0b3IpIHsNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCIne2F9JyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBKYXZhU2NyaXB0IDEuNy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgZnJvbSwgdmFsdWUpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLm5vbWVuICYmICh2YWx1ZS5jaGFyQXQoMCkgPT09ICdfJyB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCh2YWx1ZS5sZW5ndGggLSAxKSA9PT0gJ18nKSkgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIlVuZXhwZWN0ZWQge2F9IGluICd7Yn0nLiIsIGxpbmUsIGZyb20sDQogICAgICAgICAgICAgICAgICAgICAgICAiZGFuZ2xpbmcgJ18nIiwgdmFsdWUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHQudmFsdWUgPSB2YWx1ZTsNCiAgICAgICAgICAgIHQubGluZSA9IGxpbmU7DQogICAgICAgICAgICB0LmNoYXJhY3RlciA9IGNoYXJhY3RlcjsNCiAgICAgICAgICAgIHQuZnJvbSA9IGZyb207DQogICAgICAgICAgICBpID0gdC5pZDsNCiAgICAgICAgICAgIGlmIChpICE9PSAnKGVuZGxpbmUpJykgew0KICAgICAgICAgICAgICAgIHByZXJlZyA9IGkgJiYNCiAgICAgICAgICAgICAgICAgICAgKCgnKCw9OlshJnw/e307Jy5pbmRleE9mKGkuY2hhckF0KGkubGVuZ3RoIC0gMSkpID49IDApIHx8DQogICAgICAgICAgICAgICAgICAgIGkgPT09ICdyZXR1cm4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0Ow0KICAgICAgICB9DQoNCi8vIFB1YmxpYyBsZXggbWV0aG9kcw0KDQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoc291cmNlKSB7DQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSB7DQogICAgICAgICAgICAgICAgICAgIGxpbmVzID0gc291cmNlDQogICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXHJcbi9nLCAnXG4nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xyL2csICdcbicpDQogICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ1xuJyk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgbGluZXMgPSBzb3VyY2U7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGZpcnN0IGxpbmUgaXMgYSBzaGViYW5nICgjISksIG1ha2UgaXQgYSBibGFuayBhbmQgbW92ZSBvbi4NCiAgICAgICAgICAgICAgICAvLyBTaGViYW5ncyBhcmUgdXNlZCBieSBOb2RlIHNjcmlwdHMuDQogICAgICAgICAgICAgICAgaWYgKGxpbmVzWzBdICYmIGxpbmVzWzBdLnN1YnN0cigwLCAyKSA9PSAnIyEnKQ0KICAgICAgICAgICAgICAgICAgICBsaW5lc1swXSA9ICcnOw0KDQogICAgICAgICAgICAgICAgbGluZSA9IDA7DQogICAgICAgICAgICAgICAgbmV4dExpbmUoKTsNCiAgICAgICAgICAgICAgICBmcm9tID0gMTsNCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgIHJhbmdlOiBmdW5jdGlvbiAoYmVnaW4sIGVuZCkgew0KICAgICAgICAgICAgICAgIHZhciBjLCB2YWx1ZSA9ICcnOw0KICAgICAgICAgICAgICAgIGZyb20gPSBjaGFyYWN0ZXI7DQogICAgICAgICAgICAgICAgaWYgKHMuY2hhckF0KDApICE9PSBiZWdpbikgew0KICAgICAgICAgICAgICAgICAgICBlcnJvckF0KCJFeHBlY3RlZCAne2F9JyBhbmQgaW5zdGVhZCBzYXcgJ3tifScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBjaGFyYWN0ZXIsIGJlZ2luLCBzLmNoYXJBdCgwKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICAgICAgcyA9IHMuc2xpY2UoMSk7DQogICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciArPSAxOw0KICAgICAgICAgICAgICAgICAgICBjID0gcy5jaGFyQXQoMCk7DQogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICcnOg0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JBdCgiTWlzc2luZyAne2F9Jy4iLCBsaW5lLCBjaGFyYWN0ZXIsIGMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgZW5kOg0KICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMuc2xpY2UoMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCgnKHJhbmdlKScsIHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnXFwnOg0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJVbmV4cGVjdGVkICd7YX0nLiIsIGxpbmUsIGNoYXJhY3RlciwgYyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gYzsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0sDQoNCi8vIHRva2VuIC0tIHRoaXMgaXMgY2FsbGVkIGJ5IGFkdmFuY2UgdG8gZ2V0IHRoZSBuZXh0IHRva2VuLg0KDQogICAgICAgICAgICB0b2tlbjogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIHZhciBiLCBjLCBjYXB0dXJlcywgZCwgZGVwdGgsIGhpZ2gsIGksIGwsIGxvdywgcSwgdDsNCg0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG1hdGNoKHgpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB4LmV4ZWMocyksIHIxOw0KICAgICAgICAgICAgICAgICAgICBpZiAocikgew0KICAgICAgICAgICAgICAgICAgICAgICAgbCA9IHJbMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSByWzFdOw0KICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHIxLmNoYXJBdCgwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLnN1YnN0cihsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBjaGFyYWN0ZXIgKyBsIC0gcjEubGVuZ3RoOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyICs9IGw7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjE7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzdHJpbmcoeCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgYywgaiwgciA9ICcnOw0KDQogICAgICAgICAgICAgICAgICAgIGlmIChqc29ubW9kZSAmJiB4ICE9PSAnIicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiU3RyaW5ncyBtdXN0IHVzZSBkb3VibGVxdW90ZS4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBjaGFyYWN0ZXIpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZXNjKG4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gcGFyc2VJbnQocy5zdWJzdHIoaiArIDEsIG4pLCAxNik7DQogICAgICAgICAgICAgICAgICAgICAgICBqICs9IG47DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSAzMiAmJiBpIDw9IDEyNiAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICE9PSAzNCAmJiBpICE9PSA5MiAmJiBpICE9PSAzOSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVW5uZWNlc3NhcnkgZXNjYXBlbWVudC4iLCBsaW5lLCBjaGFyYWN0ZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyICs9IG47DQogICAgICAgICAgICAgICAgICAgICAgICBjID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBqID0gMDsNCiAgICAgICAgICAgICAgICAgICAgZm9yICg7Oykgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPj0gcy5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHRMaW5lKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JBdCgiVW5jbG9zZWQgc3RyaW5nLiIsIGxpbmUsIGZyb20pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChqKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSB4KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyICs9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMuc3Vic3RyKGogKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQoJyhzdHJpbmcpJywgciwgeCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA8ICcgJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnXG4nIHx8IGMgPT09ICdccicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiQ29udHJvbCBjaGFyYWN0ZXIgaW4gc3RyaW5nOiB7YX0uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGNoYXJhY3RlciArIGosIHMuc2xpY2UoMCwgaikpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciArPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChqKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnIic6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1wnJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25tb2RlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkF2b2lkIFxcJy4iLCBsaW5lLCBjaGFyYWN0ZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2InOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gJ1xiJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZic6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnXGYnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICdcbic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gJ1xyJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnXHQnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjKDQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25tb2RlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkF2b2lkIFxcdi4iLCBsaW5lLCBjaGFyYWN0ZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnXHYnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25tb2RlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkF2b2lkIFxceC0uIiwgbGluZSwgY2hhcmFjdGVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2MoMik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiQmFkIGVzY2FwZW1lbnQuIiwgbGluZSwgY2hhcmFjdGVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICByICs9IGM7DQogICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQobmV4dExpbmUoKSA/ICcoZW5kbGluZSknIDogJyhlbmQpJywgJycpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHQgPSBtYXRjaCh0eCk7DQogICAgICAgICAgICAgICAgICAgIGlmICghdCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHMgJiYgcyA8ICchJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLnN1YnN0cigxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JBdCgiVW5leHBlY3RlZCAne2F9Jy4iLCBsaW5lLCBjaGFyYWN0ZXIsIHMuc3Vic3RyKDAsIDEpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCg0KICAgIC8vICAgICAgaWRlbnRpZmllcg0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5pc0FscGhhKCkgfHwgYyA9PT0gJ18nIHx8IGMgPT09ICckJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCgnKGlkZW50aWZpZXIpJywgdCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAvLyAgICAgIG51bWJlcg0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5pc0RpZ2l0KCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKE51bWJlcih0KSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJCYWQgbnVtYmVyICd7YX0nLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBjaGFyYWN0ZXIsIHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5zdWJzdHIoMCwgMSkuaXNBbHBoYSgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiTWlzc2luZyBzcGFjZSBhZnRlciAne2F9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGNoYXJhY3RlciwgdCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnMCcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHQuc3Vic3RyKDEsIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC5pc0RpZ2l0KCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi5pZCAhPT0gJy4nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJEb24ndCB1c2UgZXh0cmEgbGVhZGluZyB6ZXJvcyAne2F9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBjaGFyYWN0ZXIsIHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpzb25tb2RlICYmIChkID09PSAneCcgfHwgZCA9PT0gJ1gnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJBdm9pZCAweC0uICd7YX0nLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGNoYXJhY3RlciwgdCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuc3Vic3RyKHQubGVuZ3RoIC0gMSkgPT09ICcuJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoDQoiQSB0cmFpbGluZyBkZWNpbWFsIHBvaW50IGNhbiBiZSBjb25mdXNlZCB3aXRoIGEgZG90ICd7YX0nLiIsIGxpbmUsIGNoYXJhY3RlciwgdCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCgnKG51bWJlciknLCB0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCkgew0KDQogICAgLy8gICAgICBzdHJpbmcNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnIic6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICInIjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nKHQpOw0KDQogICAgLy8gICAgICAvLyBjb21tZW50DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8vJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVW5leHBlY3RlZCBjb21tZW50LiIsIGxpbmUsIGNoYXJhY3Rlcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5jb21tZW50ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgIC8vICAgICAgLyogY29tbWVudA0KDQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvKic6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyYykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIlVuZXhwZWN0ZWQgY29tbWVudC4iLCBsaW5lLCBjaGFyYWN0ZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBzLnNlYXJjaChseCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmV4dExpbmUoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JBdCgiVW5jbG9zZWQgY29tbWVudC4iLCBsaW5lLCBjaGFyYWN0ZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciArPSBpICsgMjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5zdWJzdHIoaSwgMSkgPT09ICcvJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckF0KCJOZXN0ZWQgY29tbWVudC4iLCBsaW5lLCBjaGFyYWN0ZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5zdWJzdHIoaSArIDIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmNvbW1lbnQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgLy8gICAgICAvKm1lbWJlcnMgLypqc2hpbnQgLypnbG9iYWwNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyptZW1iZXJzJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8qbWVtYmVyJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8qanNoaW50JzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8qanNsaW50JzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8qZ2xvYmFsJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyovJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NwZWNpYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiBsaW5lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXI6IGNoYXJhY3RlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbTogZnJvbQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgLy8gICAgICAvDQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4uaWQgPT09ICcvPScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JBdCgNCiJBIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFsIGNhbiBiZSBjb25mdXNlZCB3aXRoICcvPScuIiwgbGluZSwgZnJvbSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVyZWcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlcyA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckF0KCJVbmNsb3NlZCByZWd1bGFyIGV4cHJlc3Npb24uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGZyb20pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJVbmVzY2FwZWQgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBmcm9tICsgbCwgJy8nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHMuc3Vic3RyKDAsIGwgLSAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnOiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtOiB0cnVlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocVtzLmNoYXJBdChsKV0gPT09IHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcVtzLmNoYXJBdChsKV0gPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgKz0gbDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5zdWJzdHIobCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHMuY2hhckF0KDApOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxID09PSAnLycgfHwgcSA9PT0gJyonKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQXQoIkNvbmZ1c2luZyByZWd1bGFyIGV4cHJlc3Npb24uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBmcm9tKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0KCcocmVnZXhwKScsIGMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXFwnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA8ICcgJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoDQoiVW5leHBlY3RlZCBjb250cm9sIGNoYXJhY3RlciBpbiByZWd1bGFyIGV4cHJlc3Npb24uIiwgbGluZSwgZnJvbSArIGwpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJzwnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgNCiJVbmV4cGVjdGVkIGVzY2FwZWQgY2hhcmFjdGVyICd7YX0nIGluIHJlZ3VsYXIgZXhwcmVzc2lvbi4iLCBsaW5lLCBmcm9tICsgbCwgYyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJygnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoICs9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmNoYXJBdChsKSA9PT0gJz8nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzLmNoYXJBdChsKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc6JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyEnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoDQoiRXhwZWN0ZWQgJ3thfScgYW5kIGluc3RlYWQgc2F3ICd7Yn0nLiIsIGxpbmUsIGZyb20gKyBsLCAnOicsIHMuY2hhckF0KGwpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVzICs9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnfCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVW5lc2NhcGVkICd7YX0nLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgZnJvbSArIGwsICcpJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggLT0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcgJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocy5jaGFyQXQobCkgPT09ICcgJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHEgPiAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgNCiJTcGFjZXMgYXJlIGhhcmQgdG8gY291bnQuIFVzZSB7e2F9fS4iLCBsaW5lLCBmcm9tICsgbCwgcSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnWyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHMuY2hhckF0KGwpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnXicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLnJlZ2V4cCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJJbnNlY3VyZSAne2F9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBmcm9tICsgbCwgYyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy5jaGFyQXQobCkgPT09ICddJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JBdCgiVW5lc2NhcGVkICd7YX0nLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgZnJvbSArIGwsICdeJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnXScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJFbXB0eSBjbGFzcy4iLCBsaW5lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKyBsIC0gMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCmtsYXNzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnWyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ14nOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJVbmVzY2FwZWQgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgZnJvbSArIGwsIGMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJVbmVzY2FwZWQgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGZyb20gKyBsLCAnLScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ10nOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFxICYmICFvcHRpb24ucmVnZXhkYXNoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJVbmVzY2FwZWQgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGZyb20gKyBsIC0gMSwgJy0nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGtsYXNzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gcy5jaGFyQXQobCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA8ICcgJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgNCiJVbmV4cGVjdGVkIGNvbnRyb2wgY2hhcmFjdGVyIGluIHJlZ3VsYXIgZXhwcmVzc2lvbi4iLCBsaW5lLCBmcm9tICsgbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICc8Jykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgNCiJVbmV4cGVjdGVkIGVzY2FwZWQgY2hhcmFjdGVyICd7YX0nIGluIHJlZ3VsYXIgZXhwcmVzc2lvbi4iLCBsaW5lLCBmcm9tICsgbCwgYyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVW5lc2NhcGVkICd7YX0nLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGZyb20gKyBsIC0gMSwgJy8nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzwnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoYyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcuJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLnJlZ2V4cCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkluc2VjdXJlICd7YX0nLiIsIGxpbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArIGwsIGMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ10nOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd7JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ30nOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcqJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIlVuZXNjYXBlZCAne2F9Jy4iLCBsaW5lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArIGwsIGMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHMuY2hhckF0KGwpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKic6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuY2hhckF0KGwpID09PSAnPycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd7JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gcy5jaGFyQXQobCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjIDwgJzAnIHx8IGMgPiAnOScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgNCiJFeHBlY3RlZCBhIG51bWJlciBhbmQgaW5zdGVhZCBzYXcgJ3thfScuIiwgbGluZSwgZnJvbSArIGwsIGMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ID0gK2M7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjIDwgJzAnIHx8IGMgPiAnOScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdyA9ICtjICsgKGxvdyAqIDEwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoID0gbG93Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJywnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoID0gSW5maW5pdHk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gcy5jaGFyQXQobCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaCA9ICtjOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHMuY2hhckF0KGwpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA8ICcwJyB8fCBjID4gJzknKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2ggPSArYyArIChoaWdoICogMTApOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5jaGFyQXQobCkgIT09ICd9Jykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KA0KIkV4cGVjdGVkICd7YX0nIGFuZCBpbnN0ZWFkIHNhdyAne2J9Jy4iLCBsaW5lLCBmcm9tICsgbCwgJ30nLCBjKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5jaGFyQXQobCkgPT09ICc/Jykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb3cgPiBoaWdoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoDQoiJ3thfScgc2hvdWxkIG5vdCBiZSBncmVhdGVyIHRoYW4gJ3tifScuIiwgbGluZSwgZnJvbSArIGwsIGxvdywgaGlnaCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHMuc3Vic3RyKDAsIGwgLSAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyICs9IGw7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLnN1YnN0cihsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0KCcocmVnZXhwKScsIGMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQoJyhwdW5jdHVhdG9yKScsIHQpOw0KDQogICAgLy8gICAgICBwdW5jdHVhdG9yDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyMnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCgnKHB1bmN0dWF0b3IpJywgdCk7DQogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCgnKHB1bmN0dWF0b3IpJywgdCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgfSgpKTsNCg0KDQogICAgZnVuY3Rpb24gYWRkbGFiZWwodCwgdHlwZSkgew0KDQogICAgICAgIGlmICh0ID09PSAnaGFzT3duUHJvcGVydHknKSB7DQogICAgICAgICAgICB3YXJuaW5nKCInaGFzT3duUHJvcGVydHknIGlzIGEgcmVhbGx5IGJhZCBuYW1lLiIpOw0KICAgICAgICB9DQoNCi8vIERlZmluZSB0IGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGluIHRoZSBjdXJyZW50IHNjb3BlLg0KDQogICAgICAgIGlmIChpc19vd24oZnVuY3QsIHQpICYmICFmdW5jdFsnKGdsb2JhbCknXSkgew0KICAgICAgICAgICAgaWYgKGZ1bmN0W3RdID09PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5sYXRlZGVmKQ0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyB3YXMgdXNlZCBiZWZvcmUgaXQgd2FzIGRlZmluZWQuIiwgbmV4dHRva2VuLCB0KTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb24uc2hhZG93KQ0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBhbHJlYWR5IGRlZmluZWQuIiwgbmV4dHRva2VuLCB0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0W3RdID0gdHlwZTsNCiAgICAgICAgaWYgKGZ1bmN0WycoZ2xvYmFsKSddKSB7DQogICAgICAgICAgICBnbG9iYWxbdF0gPSBmdW5jdDsNCiAgICAgICAgICAgIGlmIChpc19vd24oaW1wbGllZCwgdCkpIHsNCiAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmxhdGVkZWYpDQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIid7YX0nIHdhcyB1c2VkIGJlZm9yZSBpdCB3YXMgZGVmaW5lZC4iLCBuZXh0dG9rZW4sIHQpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZSBpbXBsaWVkW3RdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgc2NvcGVbdF0gPSBmdW5jdDsNCiAgICAgICAgfQ0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gZG9PcHRpb24oKSB7DQogICAgICAgIHZhciBiLCBvYmosIGZpbHRlciwgbyA9IG5leHR0b2tlbi52YWx1ZSwgdCwgdjsNCiAgICAgICAgc3dpdGNoIChvKSB7DQogICAgICAgIGNhc2UgJyovJzoNCiAgICAgICAgICAgIGVycm9yKCJVbmJlZ3VuIGNvbW1lbnQuIik7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnLyptZW1iZXJzJzoNCiAgICAgICAgY2FzZSAnLyptZW1iZXInOg0KICAgICAgICAgICAgbyA9ICcvKm1lbWJlcnMnOw0KICAgICAgICAgICAgaWYgKCFtZW1iZXJzT25seSkgew0KICAgICAgICAgICAgICAgIG1lbWJlcnNPbmx5ID0ge307DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvYmogPSBtZW1iZXJzT25seTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICcvKmpzaGludCc6DQogICAgICAgIGNhc2UgJy8qanNsaW50JzoNCiAgICAgICAgICAgIG9iaiA9IG9wdGlvbjsNCiAgICAgICAgICAgIGZpbHRlciA9IGJvb2xPcHRpb25zOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJy8qZ2xvYmFsJzoNCiAgICAgICAgICAgIG9iaiA9IHByZWRlZmluZWQ7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIGVycm9yKCJXaGF0PyIpOw0KICAgICAgICB9DQogICAgICAgIHQgPSBsZXgudG9rZW4oKTsNCmxvb3A6ICAgZm9yICg7Oykgew0KICAgICAgICAgICAgZm9yICg7Oykgew0KICAgICAgICAgICAgICAgIGlmICh0LnR5cGUgPT09ICdzcGVjaWFsJyAmJiB0LnZhbHVlID09PSAnKi8nKSB7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICh0LmlkICE9PSAnKGVuZGxpbmUpJyAmJiB0LmlkICE9PSAnLCcpIHsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHQgPSBsZXgudG9rZW4oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0LnR5cGUgIT09ICcoc3RyaW5nKScgJiYgdC50eXBlICE9PSAnKGlkZW50aWZpZXIpJyAmJg0KICAgICAgICAgICAgICAgICAgICBvICE9PSAnLyptZW1iZXJzJykgew0KICAgICAgICAgICAgICAgIGVycm9yKCJCYWQgb3B0aW9uLiIsIHQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdiA9IGxleC50b2tlbigpOw0KICAgICAgICAgICAgaWYgKHYuaWQgPT09ICc6Jykgew0KICAgICAgICAgICAgICAgIHYgPSBsZXgudG9rZW4oKTsNCiAgICAgICAgICAgICAgICBpZiAob2JqID09PSBtZW1iZXJzT25seSkgew0KICAgICAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgJ3thfScgYW5kIGluc3RlYWQgc2F3ICd7Yn0nLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwgJyovJywgJzonKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHQudmFsdWUgPT09ICdpbmRlbnQnICYmIChvID09PSAnLypqc2hpbnQnIHx8IG8gPT09ICcvKmpzbGludCcpKSB7DQogICAgICAgICAgICAgICAgICAgIGIgPSArdi52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBiICE9PSAnbnVtYmVyJyB8fCAhaXNGaW5pdGUoYikgfHwgYiA8PSAwIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihiKSAhPT0gYikgew0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkIGEgc21hbGwgaW50ZWdlciBhbmQgaW5zdGVhZCBzYXcgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgdi52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgb2JqLndoaXRlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgb2JqLmluZGVudCA9IGI7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0LnZhbHVlID09PSAnbWF4ZXJyJyAmJiAobyA9PT0gJy8qanNoaW50JyB8fCBvID09PSAnLypqc2xpbnQnKSkgew0KICAgICAgICAgICAgICAgICAgICBiID0gK3YudmFsdWU7DQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYiAhPT0gJ251bWJlcicgfHwgIWlzRmluaXRlKGIpIHx8IGIgPD0gMCB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoYikgIT09IGIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCBhIHNtYWxsIGludGVnZXIgYW5kIGluc3RlYWQgc2F3ICd7YX0nLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsIHYudmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIG9iai5tYXhlcnIgPSBiOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodC52YWx1ZSA9PT0gJ21heGxlbicgJiYgKG8gPT09ICcvKmpzaGludCcgfHwgbyA9PT0gJy8qanNsaW50JykpIHsNCiAgICAgICAgICAgICAgICAgICAgYiA9ICt2LnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGIgIT09ICdudW1iZXInIHx8ICFpc0Zpbml0ZShiKSB8fCBiIDw9IDAgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGIpICE9PSBiKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgYSBzbWFsbCBpbnRlZ2VyIGFuZCBpbnN0ZWFkIHNhdyAne2F9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LCB2LnZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBvYmoubWF4bGVuID0gYjsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHYudmFsdWUgPT09ICd0cnVlJykgew0KICAgICAgICAgICAgICAgICAgICBvYmpbdC52YWx1ZV0gPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodi52YWx1ZSA9PT0gJ2ZhbHNlJykgew0KICAgICAgICAgICAgICAgICAgICBvYmpbdC52YWx1ZV0gPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBlcnJvcigiQmFkIG9wdGlvbiB2YWx1ZS4iLCB2KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdCA9IGxleC50b2tlbigpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBpZiAobyA9PT0gJy8qanNoaW50JyB8fCBvID09PSAnLypqc2xpbnQnKSB7DQogICAgICAgICAgICAgICAgICAgIGVycm9yKCJNaXNzaW5nIG9wdGlvbiB2YWx1ZS4iLCB0KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgb2JqW3QudmFsdWVdID0gZmFsc2U7DQogICAgICAgICAgICAgICAgdCA9IHY7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKGZpbHRlcikgew0KICAgICAgICAgICAgYXNzdW1lKCk7DQogICAgICAgIH0NCiAgICB9DQoNCg0KLy8gV2UgbmVlZCBhIHBlZWsgZnVuY3Rpb24uIElmIGl0IGhhcyBhbiBhcmd1bWVudCwgaXQgcGVla3MgdGhhdCBtdWNoIGZhcnRoZXINCi8vIGFoZWFkLiBJdCBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoDQovLyAgICAgZm9yICggdmFyIGkgaW4gLi4uDQovLyBmcm9tDQovLyAgICAgZm9yICggdmFyIGkgPSAuLi4NCg0KICAgIGZ1bmN0aW9uIHBlZWsocCkgew0KICAgICAgICB2YXIgaSA9IHAgfHwgMCwgaiA9IDAsIHQ7DQoNCiAgICAgICAgd2hpbGUgKGogPD0gaSkgew0KICAgICAgICAgICAgdCA9IGxvb2thaGVhZFtqXTsNCiAgICAgICAgICAgIGlmICghdCkgew0KICAgICAgICAgICAgICAgIHQgPSBsb29rYWhlYWRbal0gPSBsZXgudG9rZW4oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGogKz0gMTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdDsNCiAgICB9DQoNCg0KDQovLyBQcm9kdWNlIHRoZSBuZXh0IHRva2VuLiBJdCBsb29rcyBmb3IgcHJvZ3JhbW1pbmcgZXJyb3JzLg0KDQogICAgZnVuY3Rpb24gYWR2YW5jZShpZCwgdCkgew0KICAgICAgICBzd2l0Y2ggKHRva2VuLmlkKSB7DQogICAgICAgIGNhc2UgJyhudW1iZXIpJzoNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcuJykgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIkEgZG90IGZvbGxvd2luZyBhIG51bWJlciBjYW4gYmUgY29uZnVzZWQgd2l0aCBhIGRlY2ltYWwgcG9pbnQuIiwgdG9rZW4pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJy0nOg0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJy0nIHx8IG5leHR0b2tlbi5pZCA9PT0gJy0tJykgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIkNvbmZ1c2luZyBtaW51c3Nlcy4iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICcrJzoNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcrJyB8fCBuZXh0dG9rZW4uaWQgPT09ICcrKycpIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJDb25mdXNpbmcgcGx1c3Nlcy4iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGlmICh0b2tlbi50eXBlID09PSAnKHN0cmluZyknIHx8IHRva2VuLmlkZW50aWZpZXIpIHsNCiAgICAgICAgICAgIGFub25uYW1lID0gdG9rZW4udmFsdWU7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoaWQgJiYgbmV4dHRva2VuLmlkICE9PSBpZCkgew0KICAgICAgICAgICAgaWYgKHQpIHsNCiAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnKGVuZCknKSB7DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVubWF0Y2hlZCAne2F9Jy4iLCB0LCB0LmlkKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCAne2F9JyB0byBtYXRjaCAne2J9JyBmcm9tIGxpbmUge2N9IGFuZCBpbnN0ZWFkIHNhdyAne2R9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgaWQsIHQuaWQsIHQubGluZSwgbmV4dHRva2VuLnZhbHVlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2UgaWYgKG5leHR0b2tlbi50eXBlICE9PSAnKGlkZW50aWZpZXIpJyB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbi52YWx1ZSAhPT0gaWQpIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCAne2F9JyBhbmQgaW5zdGVhZCBzYXcgJ3tifScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgaWQsIG5leHR0b2tlbi52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcHJldnRva2VuID0gdG9rZW47DQogICAgICAgIHRva2VuID0gbmV4dHRva2VuOw0KICAgICAgICBmb3IgKDs7KSB7DQogICAgICAgICAgICBuZXh0dG9rZW4gPSBsb29rYWhlYWQuc2hpZnQoKSB8fCBsZXgudG9rZW4oKTsNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcoZW5kKScgfHwgbmV4dHRva2VuLmlkID09PSAnKGVycm9yKScpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobmV4dHRva2VuLnR5cGUgPT09ICdzcGVjaWFsJykgew0KICAgICAgICAgICAgICAgIGRvT3B0aW9uKCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgIT09ICcoZW5kbGluZSknKSB7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KDQovLyBUaGlzIGlzIHRoZSBoZWFydCBvZiBKU0hJTlQsIHRoZSBQcmF0dCBwYXJzZXIuIEluIGFkZGl0aW9uIHRvIHBhcnNpbmcsIGl0DQovLyBpcyBsb29raW5nIGZvciBhZCBob2MgbGludCBwYXR0ZXJucy4gV2UgYWRkIC5mdWQgdG8gUHJhdHQncyBtb2RlbCwgd2hpY2ggaXMNCi8vIGxpa2UgLm51ZCBleGNlcHQgdGhhdCBpdCBpcyBvbmx5IHVzZWQgb24gdGhlIGZpcnN0IHRva2VuIG9mIGEgc3RhdGVtZW50Lg0KLy8gSGF2aW5nIC5mdWQgbWFrZXMgaXQgbXVjaCBlYXNpZXIgdG8gZGVmaW5lIHN0YXRlbWVudC1vcmllbnRlZCBsYW5ndWFnZXMgbGlrZQ0KLy8gSmF2YVNjcmlwdC4gSSByZXRhaW5lZCBQcmF0dCdzIG5vbWVuY2xhdHVyZS4NCg0KLy8gLm51ZCAgICAgTnVsbCBkZW5vdGF0aW9uDQovLyAuZnVkICAgICBGaXJzdCBudWxsIGRlbm90YXRpb24NCi8vIC5sZWQgICAgIExlZnQgZGVub3RhdGlvbg0KLy8gIGxicCAgICAgTGVmdCBiaW5kaW5nIHBvd2VyDQovLyAgcmJwICAgICBSaWdodCBiaW5kaW5nIHBvd2VyDQoNCi8vIFRoZXkgYXJlIGVsZW1lbnRzIG9mIHRoZSBwYXJzaW5nIG1ldGhvZCBjYWxsZWQgVG9wIERvd24gT3BlcmF0b3IgUHJlY2VkZW5jZS4NCg0KICAgIGZ1bmN0aW9uIGV4cHJlc3Npb24ocmJwLCBpbml0aWFsKSB7DQogICAgICAgIHZhciBsZWZ0LCBpc0FycmF5ID0gZmFsc2U7DQoNCiAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJyhlbmQpJykNCiAgICAgICAgICAgIGVycm9yKCJVbmV4cGVjdGVkIGVhcmx5IGVuZCBvZiBwcm9ncmFtLiIsIHRva2VuKTsNCg0KICAgICAgICBhZHZhbmNlKCk7DQogICAgICAgIGlmIChpbml0aWFsKSB7DQogICAgICAgICAgICBhbm9ubmFtZSA9ICdhbm9ueW1vdXMnOw0KICAgICAgICAgICAgZnVuY3RbJyh2ZXJiKSddID0gdG9rZW4udmFsdWU7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGluaXRpYWwgPT09IHRydWUgJiYgdG9rZW4uZnVkKSB7DQogICAgICAgICAgICBsZWZ0ID0gdG9rZW4uZnVkKCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAodG9rZW4ubnVkKSB7DQogICAgICAgICAgICAgICAgbGVmdCA9IHRva2VuLm51ZCgpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLnR5cGUgPT09ICcobnVtYmVyKScgJiYgdG9rZW4uaWQgPT09ICcuJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJBIGxlYWRpbmcgZGVjaW1hbCBwb2ludCBjYW4gYmUgY29uZnVzZWQgd2l0aCBhIGRvdDogJy57YX0nLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4sIG5leHR0b2tlbi52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCBhbiBpZGVudGlmaWVyIGFuZCBpbnN0ZWFkIHNhdyAne2F9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLCB0b2tlbi5pZCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgd2hpbGUgKHJicCA8IG5leHR0b2tlbi5sYnApIHsNCiAgICAgICAgICAgICAgICBpc0FycmF5ID0gdG9rZW4udmFsdWUgPT0gJ0FycmF5JzsNCiAgICAgICAgICAgICAgICBhZHZhbmNlKCk7DQogICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkgJiYgdG9rZW4uaWQgPT0gJygnICYmIG5leHR0b2tlbi5pZCA9PSAnKScpDQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVzZSB0aGUgYXJyYXkgbGl0ZXJhbCBub3RhdGlvbiBbXS4iLCB0b2tlbik7DQogICAgICAgICAgICAgICAgaWYgKHRva2VuLmxlZCkgew0KICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gdG9rZW4ubGVkKGxlZnQpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCBhbiBvcGVyYXRvciBhbmQgaW5zdGVhZCBzYXcgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLCB0b2tlbi5pZCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBsZWZ0Ow0KICAgIH0NCg0KDQovLyBGdW5jdGlvbnMgZm9yIGNvbmZvcm1hbmNlIG9mIHN0eWxlLg0KDQogICAgZnVuY3Rpb24gYWRqYWNlbnQobGVmdCwgcmlnaHQpIHsNCiAgICAgICAgbGVmdCA9IGxlZnQgfHwgdG9rZW47DQogICAgICAgIHJpZ2h0ID0gcmlnaHQgfHwgbmV4dHRva2VuOw0KICAgICAgICBpZiAob3B0aW9uLndoaXRlKSB7DQogICAgICAgICAgICBpZiAobGVmdC5jaGFyYWN0ZXIgIT09IHJpZ2h0LmZyb20gJiYgbGVmdC5saW5lID09PSByaWdodC5saW5lKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCBzcGFjZSBhZnRlciAne2F9Jy4iLCByaWdodCwgbGVmdC52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBub2JyZWFrKGxlZnQsIHJpZ2h0KSB7DQogICAgICAgIGxlZnQgPSBsZWZ0IHx8IHRva2VuOw0KICAgICAgICByaWdodCA9IHJpZ2h0IHx8IG5leHR0b2tlbjsNCiAgICAgICAgaWYgKG9wdGlvbi53aGl0ZSAmJiAobGVmdC5jaGFyYWN0ZXIgIT09IHJpZ2h0LmZyb20gfHwgbGVmdC5saW5lICE9PSByaWdodC5saW5lKSkgew0KICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCBzcGFjZSBiZWZvcmUgJ3thfScuIiwgcmlnaHQsIHJpZ2h0LnZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIG5vc3BhY2UobGVmdCwgcmlnaHQpIHsNCiAgICAgICAgbGVmdCA9IGxlZnQgfHwgdG9rZW47DQogICAgICAgIHJpZ2h0ID0gcmlnaHQgfHwgbmV4dHRva2VuOw0KICAgICAgICBpZiAob3B0aW9uLndoaXRlICYmICFsZWZ0LmNvbW1lbnQpIHsNCiAgICAgICAgICAgIGlmIChsZWZ0LmxpbmUgPT09IHJpZ2h0LmxpbmUpIHsNCiAgICAgICAgICAgICAgICBhZGphY2VudChsZWZ0LCByaWdodCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBub25hZGphY2VudChsZWZ0LCByaWdodCkgew0KICAgICAgICBpZiAob3B0aW9uLndoaXRlKSB7DQogICAgICAgICAgICBsZWZ0ID0gbGVmdCB8fCB0b2tlbjsNCiAgICAgICAgICAgIHJpZ2h0ID0gcmlnaHQgfHwgbmV4dHRva2VuOw0KICAgICAgICAgICAgaWYgKGxlZnQubGluZSA9PT0gcmlnaHQubGluZSAmJiBsZWZ0LmNoYXJhY3RlciA9PT0gcmlnaHQuZnJvbSkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIk1pc3Npbmcgc3BhY2UgYWZ0ZXIgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgbGVmdC52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBub2JyZWFrbm9uYWRqYWNlbnQobGVmdCwgcmlnaHQpIHsNCiAgICAgICAgbGVmdCA9IGxlZnQgfHwgdG9rZW47DQogICAgICAgIHJpZ2h0ID0gcmlnaHQgfHwgbmV4dHRva2VuOw0KICAgICAgICBpZiAoIW9wdGlvbi5sYXhicmVhayAmJiBsZWZ0LmxpbmUgIT09IHJpZ2h0LmxpbmUpIHsNCiAgICAgICAgICAgIHdhcm5pbmcoIkJhZCBsaW5lIGJyZWFraW5nIGJlZm9yZSAne2F9Jy4iLCByaWdodCwgcmlnaHQuaWQpOw0KICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi53aGl0ZSkgew0KICAgICAgICAgICAgbGVmdCA9IGxlZnQgfHwgdG9rZW47DQogICAgICAgICAgICByaWdodCA9IHJpZ2h0IHx8IG5leHR0b2tlbjsNCiAgICAgICAgICAgIGlmIChsZWZ0LmNoYXJhY3RlciA9PT0gcmlnaHQuZnJvbSkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIk1pc3Npbmcgc3BhY2UgYWZ0ZXIgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgbGVmdC52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBpbmRlbnRhdGlvbihiaWFzKSB7DQogICAgICAgIHZhciBpOw0KICAgICAgICBpZiAob3B0aW9uLndoaXRlICYmIG5leHR0b2tlbi5pZCAhPT0gJyhlbmQpJykgew0KICAgICAgICAgICAgaSA9IGluZGVudCArIChiaWFzIHx8IDApOw0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5mcm9tICE9PSBpKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygNCiJFeHBlY3RlZCAne2F9JyB0byBoYXZlIGFuIGluZGVudGF0aW9uIGF0IHtifSBpbnN0ZWFkIGF0IHtjfS4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCBuZXh0dG9rZW4udmFsdWUsIGksIG5leHR0b2tlbi5mcm9tKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIG5vbGluZWJyZWFrKHQpIHsNCiAgICAgICAgdCA9IHQgfHwgdG9rZW47DQogICAgICAgIGlmICh0LmxpbmUgIT09IG5leHR0b2tlbi5saW5lKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJMaW5lIGJyZWFraW5nIGVycm9yICd7YX0nLiIsIHQsIHQudmFsdWUpOw0KICAgICAgICB9DQogICAgfQ0KDQoNCiAgICBmdW5jdGlvbiBjb21tYSgpIHsNCiAgICAgICAgaWYgKHRva2VuLmxpbmUgIT09IG5leHR0b2tlbi5saW5lKSB7DQogICAgICAgICAgICBpZiAoIW9wdGlvbi5sYXhicmVhaykgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIkJhZCBsaW5lIGJyZWFraW5nIGJlZm9yZSAne2F9Jy4iLCB0b2tlbiwgbmV4dHRva2VuLmlkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0b2tlbi5jaGFyYWN0ZXIgIT09IG5leHR0b2tlbi5mcm9tICYmIG9wdGlvbi53aGl0ZSkgew0KICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCBzcGFjZSBhZnRlciAne2F9Jy4iLCBuZXh0dG9rZW4sIHRva2VuLnZhbHVlKTsNCiAgICAgICAgfQ0KICAgICAgICBhZHZhbmNlKCcsJyk7DQogICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgIH0NCg0KDQovLyBGdW5jdGlvbmFsIGNvbnN0cnVjdG9ycyBmb3IgbWFraW5nIHRoZSBzeW1ib2xzIHRoYXQgd2lsbCBiZSBpbmhlcml0ZWQgYnkNCi8vIHRva2Vucy4NCg0KICAgIGZ1bmN0aW9uIHN5bWJvbChzLCBwKSB7DQogICAgICAgIHZhciB4ID0gc3ludGF4W3NdOw0KICAgICAgICBpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7DQogICAgICAgICAgICBzeW50YXhbc10gPSB4ID0gew0KICAgICAgICAgICAgICAgIGlkOiBzLA0KICAgICAgICAgICAgICAgIGxicDogcCwNCiAgICAgICAgICAgICAgICB2YWx1ZTogcw0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4geDsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIGRlbGltKHMpIHsNCiAgICAgICAgcmV0dXJuIHN5bWJvbChzLCAwKTsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHN0bXQocywgZikgew0KICAgICAgICB2YXIgeCA9IGRlbGltKHMpOw0KICAgICAgICB4LmlkZW50aWZpZXIgPSB4LnJlc2VydmVkID0gdHJ1ZTsNCiAgICAgICAgeC5mdWQgPSBmOw0KICAgICAgICByZXR1cm4geDsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIGJsb2Nrc3RtdChzLCBmKSB7DQogICAgICAgIHZhciB4ID0gc3RtdChzLCBmKTsNCiAgICAgICAgeC5ibG9jayA9IHRydWU7DQogICAgICAgIHJldHVybiB4Ow0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gcmVzZXJ2ZU5hbWUoeCkgew0KICAgICAgICB2YXIgYyA9IHguaWQuY2hhckF0KDApOw0KICAgICAgICBpZiAoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKSB7DQogICAgICAgICAgICB4LmlkZW50aWZpZXIgPSB4LnJlc2VydmVkID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4geDsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHByZWZpeChzLCBmKSB7DQogICAgICAgIHZhciB4ID0gc3ltYm9sKHMsIDE1MCk7DQogICAgICAgIHJlc2VydmVOYW1lKHgpOw0KICAgICAgICB4Lm51ZCA9ICh0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJykgPyBmIDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdGhpcy5yaWdodCA9IGV4cHJlc3Npb24oMTUwKTsNCiAgICAgICAgICAgIHRoaXMuYXJpdHkgPSAndW5hcnknOw0KICAgICAgICAgICAgaWYgKHRoaXMuaWQgPT09ICcrKycgfHwgdGhpcy5pZCA9PT0gJy0tJykgew0KICAgICAgICAgICAgICAgIGlmIChvcHRpb24ucGx1c3BsdXMpIHsNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCB1c2Ugb2YgJ3thfScuIiwgdGhpcywgdGhpcy5pZCk7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoIXRoaXMucmlnaHQuaWRlbnRpZmllciB8fCB0aGlzLnJpZ2h0LnJlc2VydmVkKSAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodC5pZCAhPT0gJy4nICYmIHRoaXMucmlnaHQuaWQgIT09ICdbJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJCYWQgb3BlcmFuZC4iLCB0aGlzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0dXJuIHg7DQogICAgfQ0KDQoNCiAgICBmdW5jdGlvbiB0eXBlKHMsIGYpIHsNCiAgICAgICAgdmFyIHggPSBkZWxpbShzKTsNCiAgICAgICAgeC50eXBlID0gczsNCiAgICAgICAgeC5udWQgPSBmOw0KICAgICAgICByZXR1cm4geDsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHJlc2VydmUocywgZikgew0KICAgICAgICB2YXIgeCA9IHR5cGUocywgZik7DQogICAgICAgIHguaWRlbnRpZmllciA9IHgucmVzZXJ2ZWQgPSB0cnVlOw0KICAgICAgICByZXR1cm4geDsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHJlc2VydmV2YXIocywgdikgew0KICAgICAgICByZXR1cm4gcmVzZXJ2ZShzLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgICAgICAgICB2KHRoaXMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICAgIH0pOw0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gaW5maXgocywgZiwgcCwgdykgew0KICAgICAgICB2YXIgeCA9IHN5bWJvbChzLCBwKTsNCiAgICAgICAgcmVzZXJ2ZU5hbWUoeCk7DQogICAgICAgIHgubGVkID0gZnVuY3Rpb24gKGxlZnQpIHsNCiAgICAgICAgICAgIGlmICghdykgew0KICAgICAgICAgICAgICAgIG5vYnJlYWtub25hZGphY2VudChwcmV2dG9rZW4sIHRva2VuKTsNCiAgICAgICAgICAgICAgICBub25hZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICAgICAgICAgIHJldHVybiBmKGxlZnQsIHRoaXMpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0Ow0KICAgICAgICAgICAgICAgIHRoaXMucmlnaHQgPSBleHByZXNzaW9uKHApOw0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICByZXR1cm4geDsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHJlbGF0aW9uKHMsIGYpIHsNCiAgICAgICAgdmFyIHggPSBzeW1ib2wocywgMTAwKTsNCiAgICAgICAgeC5sZWQgPSBmdW5jdGlvbiAobGVmdCkgew0KICAgICAgICAgICAgbm9icmVha25vbmFkamFjZW50KHByZXZ0b2tlbiwgdG9rZW4pOw0KICAgICAgICAgICAgbm9uYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7DQogICAgICAgICAgICB2YXIgcmlnaHQgPSBleHByZXNzaW9uKDEwMCk7DQogICAgICAgICAgICBpZiAoKGxlZnQgJiYgbGVmdC5pZCA9PT0gJ05hTicpIHx8IChyaWdodCAmJiByaWdodC5pZCA9PT0gJ05hTicpKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiVXNlIHRoZSBpc05hTiBmdW5jdGlvbiB0byBjb21wYXJlIHdpdGggTmFOLiIsIHRoaXMpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChmKSB7DQogICAgICAgICAgICAgICAgZi5hcHBseSh0aGlzLCBbbGVmdCwgcmlnaHRdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChsZWZ0LmlkID09PSAnIScpIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJDb25mdXNpbmcgdXNlIG9mICd7YX0nLiIsIGxlZnQsICchJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmlnaHQuaWQgPT09ICchJykgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIkNvbmZ1c2luZyB1c2Ugb2YgJ3thfScuIiwgbGVmdCwgJyEnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7DQogICAgICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7DQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0dXJuIHg7DQogICAgfQ0KDQoNCiAgICBmdW5jdGlvbiBpc1Bvb3JSZWxhdGlvbihub2RlKSB7DQogICAgICAgIHJldHVybiBub2RlICYmDQogICAgICAgICAgICAgICgobm9kZS50eXBlID09PSAnKG51bWJlciknICYmICtub2RlLnZhbHVlID09PSAwKSB8fA0KICAgICAgICAgICAgICAgKG5vZGUudHlwZSA9PT0gJyhzdHJpbmcpJyAmJiBub2RlLnZhbHVlID09PSAnJykgfHwNCiAgICAgICAgICAgICAgIChub2RlLnR5cGUgPT09ICdudWxsJyAmJiAhb3B0aW9uLmVxbnVsbCkgfHwNCiAgICAgICAgICAgICAgICBub2RlLnR5cGUgPT09ICd0cnVlJyB8fA0KICAgICAgICAgICAgICAgIG5vZGUudHlwZSA9PT0gJ2ZhbHNlJyB8fA0KICAgICAgICAgICAgICAgIG5vZGUudHlwZSA9PT0gJ3VuZGVmaW5lZCcpOw0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gYXNzaWdub3AocywgZikgew0KICAgICAgICBzeW1ib2wocywgMjApLmV4cHMgPSB0cnVlOw0KICAgICAgICByZXR1cm4gaW5maXgocywgZnVuY3Rpb24gKGxlZnQsIHRoYXQpIHsNCiAgICAgICAgICAgIHZhciBsOw0KICAgICAgICAgICAgdGhhdC5sZWZ0ID0gbGVmdDsNCiAgICAgICAgICAgIGlmIChwcmVkZWZpbmVkW2xlZnQudmFsdWVdID09PSBmYWxzZSAmJg0KICAgICAgICAgICAgICAgICAgICBzY29wZVtsZWZ0LnZhbHVlXVsnKGdsb2JhbCknXSA9PT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIlJlYWQgb25seS4iLCBsZWZ0KTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAobGVmdFsnZnVuY3Rpb24nXSkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIid7YX0nIGlzIGEgZnVuY3Rpb24uIiwgbGVmdCwgbGVmdC52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobGVmdCkgew0KICAgICAgICAgICAgICAgIGlmIChsZWZ0LmlkID09PSAnLicgfHwgbGVmdC5pZCA9PT0gJ1snKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghbGVmdC5sZWZ0IHx8IGxlZnQubGVmdC52YWx1ZSA9PT0gJ2FyZ3VtZW50cycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoJ0JhZCBhc3NpZ25tZW50LicsIHRoYXQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHRoYXQucmlnaHQgPSBleHByZXNzaW9uKDE5KTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQ7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0LmlkZW50aWZpZXIgJiYgIWxlZnQucmVzZXJ2ZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmN0W2xlZnQudmFsdWVdID09PSAnZXhjZXB0aW9uJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRG8gbm90IGFzc2lnbiB0byB0aGUgZXhjZXB0aW9uIHBhcmFtZXRlci4iLCBsZWZ0KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB0aGF0LnJpZ2h0ID0gZXhwcmVzc2lvbigxOSk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAobGVmdCA9PT0gc3ludGF4WydmdW5jdGlvbiddKSB7DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoDQoiRXhwZWN0ZWQgYW4gaWRlbnRpZmllciBpbiBhbiBhc3NpZ25tZW50IGFuZCBpbnN0ZWFkIHNhdyBhIGZ1bmN0aW9uIGludm9jYXRpb24uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVycm9yKCJCYWQgYXNzaWdubWVudC4iLCB0aGF0KTsNCiAgICAgICAgfSwgMjApOw0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gYml0d2lzZShzLCBmLCBwKSB7DQogICAgICAgIHZhciB4ID0gc3ltYm9sKHMsIHApOw0KICAgICAgICByZXNlcnZlTmFtZSh4KTsNCiAgICAgICAgeC5sZWQgPSAodHlwZW9mIGYgPT09ICdmdW5jdGlvbicpID8gZiA6IGZ1bmN0aW9uIChsZWZ0KSB7DQogICAgICAgICAgICBpZiAob3B0aW9uLmJpdHdpc2UpIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJVbmV4cGVjdGVkIHVzZSBvZiAne2F9Jy4iLCB0aGlzLCB0aGlzLmlkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7DQogICAgICAgICAgICB0aGlzLnJpZ2h0ID0gZXhwcmVzc2lvbihwKTsNCiAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICB9Ow0KICAgICAgICByZXR1cm4geDsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIGJpdHdpc2Vhc3NpZ25vcChzKSB7DQogICAgICAgIHN5bWJvbChzLCAyMCkuZXhwcyA9IHRydWU7DQogICAgICAgIHJldHVybiBpbmZpeChzLCBmdW5jdGlvbiAobGVmdCwgdGhhdCkgew0KICAgICAgICAgICAgaWYgKG9wdGlvbi5iaXR3aXNlKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCB1c2Ugb2YgJ3thfScuIiwgdGhhdCwgdGhhdC5pZCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBub25hZGphY2VudChwcmV2dG9rZW4sIHRva2VuKTsNCiAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgaWYgKGxlZnQpIHsNCiAgICAgICAgICAgICAgICBpZiAobGVmdC5pZCA9PT0gJy4nIHx8IGxlZnQuaWQgPT09ICdbJyB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgKGxlZnQuaWRlbnRpZmllciAmJiAhbGVmdC5yZXNlcnZlZCkpIHsNCiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbigxOSk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAobGVmdCA9PT0gc3ludGF4WydmdW5jdGlvbiddKSB7DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoDQoiRXhwZWN0ZWQgYW4gaWRlbnRpZmllciBpbiBhbiBhc3NpZ25tZW50LCBhbmQgaW5zdGVhZCBzYXcgYSBmdW5jdGlvbiBpbnZvY2F0aW9uLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlcnJvcigiQmFkIGFzc2lnbm1lbnQuIiwgdGhhdCk7DQogICAgICAgIH0sIDIwKTsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHN1ZmZpeChzLCBmKSB7DQogICAgICAgIHZhciB4ID0gc3ltYm9sKHMsIDE1MCk7DQogICAgICAgIHgubGVkID0gZnVuY3Rpb24gKGxlZnQpIHsNCiAgICAgICAgICAgIGlmIChvcHRpb24ucGx1c3BsdXMpIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJVbmV4cGVjdGVkIHVzZSBvZiAne2F9Jy4iLCB0aGlzLCB0aGlzLmlkKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoKCFsZWZ0LmlkZW50aWZpZXIgfHwgbGVmdC5yZXNlcnZlZCkgJiYNCiAgICAgICAgICAgICAgICAgICAgbGVmdC5pZCAhPT0gJy4nICYmIGxlZnQuaWQgIT09ICdbJykgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIkJhZCBvcGVyYW5kLiIsIHRoaXMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDsNCiAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICB9Ow0KICAgICAgICByZXR1cm4geDsNCiAgICB9DQoNCg0KICAgIC8vIGZucGFyYW0gbWVhbnMgdGhhdCB0aGlzIGlkZW50aWZpZXIgaXMgYmVpbmcgZGVmaW5lZCBhcyBhIGZ1bmN0aW9uDQogICAgLy8gYXJndW1lbnQgKHNlZSBpZGVudGlmaWVyKCkpDQogICAgZnVuY3Rpb24gb3B0aW9uYWxpZGVudGlmaWVyKGZucGFyYW0pIHsNCiAgICAgICAgaWYgKG5leHR0b2tlbi5pZGVudGlmaWVyKSB7DQogICAgICAgICAgICBhZHZhbmNlKCk7DQogICAgICAgICAgICBpZiAodG9rZW4ucmVzZXJ2ZWQgJiYgIW9wdGlvbi5lczUpIHsNCiAgICAgICAgICAgICAgICAvLyBgdW5kZWZpbmVkYCBhcyBhIGZ1bmN0aW9uIHBhcmFtIGlzIGEgY29tbW9uIHBhdHRlcm4gdG8gcHJvdGVjdA0KICAgICAgICAgICAgICAgIC8vIGFnYWluc3QgdGhlIGNhc2Ugd2hlbiBzb21lYm9keSBkb2VzIGB1bmRlZmluZWQgPSB0cnVlYCBhbmQNCiAgICAgICAgICAgICAgICAvLyBoZWxwIHdpdGggbWluaWZpY2F0aW9uLiBNb3JlIGluZm86IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tLzMxNTkxNg0KICAgICAgICAgICAgICAgIGlmICghZm5wYXJhbSB8fCB0b2tlbi52YWx1ZSAhPSAndW5kZWZpbmVkJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCBhbiBpZGVudGlmaWVyIGFuZCBpbnN0ZWFkIHNhdyAne2F9JyAoYSByZXNlcnZlZCB3b3JkKS4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLCB0b2tlbi5pZCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRva2VuLnZhbHVlOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLy8gZm5wYXJhbSBtZWFucyB0aGF0IHRoaXMgaWRlbnRpZmllciBpcyBiZWluZyBkZWZpbmVkIGFzIGEgZnVuY3Rpb24NCiAgICAvLyBhcmd1bWVudA0KICAgIGZ1bmN0aW9uIGlkZW50aWZpZXIoZm5wYXJhbSkgew0KICAgICAgICB2YXIgaSA9IG9wdGlvbmFsaWRlbnRpZmllcihmbnBhcmFtKTsNCiAgICAgICAgaWYgKGkpIHsNCiAgICAgICAgICAgIHJldHVybiBpOw0KICAgICAgICB9DQogICAgICAgIGlmICh0b2tlbi5pZCA9PT0gJ2Z1bmN0aW9uJyAmJiBuZXh0dG9rZW4uaWQgPT09ICcoJykgew0KICAgICAgICAgICAgd2FybmluZygiTWlzc2luZyBuYW1lIGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLiIpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkIGFuIGlkZW50aWZpZXIgYW5kIGluc3RlYWQgc2F3ICd7YX0nLiIsDQogICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgbmV4dHRva2VuLnZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gcmVhY2hhYmxlKHMpIHsNCiAgICAgICAgdmFyIGkgPSAwLCB0Ow0KICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnOycgfHwgbm9yZWFjaCkgew0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgIHQgPSBwZWVrKGkpOw0KICAgICAgICAgICAgaWYgKHQucmVhY2gpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodC5pZCAhPT0gJyhlbmRsaW5lKScpIHsNCiAgICAgICAgICAgICAgICBpZiAodC5pZCA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKA0KIklubmVyIGZ1bmN0aW9ucyBzaG91bGQgYmUgbGlzdGVkIGF0IHRoZSB0b3Agb2YgdGhlIG91dGVyIGZ1bmN0aW9uLiIsIHQpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgd2FybmluZygiVW5yZWFjaGFibGUgJ3thfScgYWZ0ZXIgJ3tifScuIiwgdCwgdC52YWx1ZSwgcyk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpICs9IDE7DQogICAgICAgIH0NCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHN0YXRlbWVudChub2luZGVudCkgew0KICAgICAgICB2YXIgaSA9IGluZGVudCwgciwgcyA9IHNjb3BlLCB0ID0gbmV4dHRva2VuOw0KDQovLyBXZSBkb24ndCBsaWtlIHRoZSBlbXB0eSBzdGF0ZW1lbnQuDQoNCiAgICAgICAgaWYgKHQuaWQgPT09ICc7Jykgew0KICAgICAgICAgICAgd2FybmluZygiVW5uZWNlc3Nhcnkgc2VtaWNvbG9uLiIsIHQpOw0KICAgICAgICAgICAgYWR2YW5jZSgnOycpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCi8vIElzIHRoaXMgYSBsYWJlbGxlZCBzdGF0ZW1lbnQ/DQoNCiAgICAgICAgaWYgKHQuaWRlbnRpZmllciAmJiAhdC5yZXNlcnZlZCAmJiBwZWVrKCkuaWQgPT09ICc6Jykgew0KICAgICAgICAgICAgYWR2YW5jZSgpOw0KICAgICAgICAgICAgYWR2YW5jZSgnOicpOw0KICAgICAgICAgICAgc2NvcGUgPSBPYmplY3QuY3JlYXRlKHMpOw0KICAgICAgICAgICAgYWRkbGFiZWwodC52YWx1ZSwgJ2xhYmVsJyk7DQogICAgICAgICAgICBpZiAoIW5leHR0b2tlbi5sYWJlbGxlZCkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIkxhYmVsICd7YX0nIG9uIHtifSBzdGF0ZW1lbnQuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgdC52YWx1ZSwgbmV4dHRva2VuLnZhbHVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChqeC50ZXN0KHQudmFsdWUgKyAnOicpKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiTGFiZWwgJ3thfScgbG9va3MgbGlrZSBhIGphdmFzY3JpcHQgdXJsLiIsDQogICAgICAgICAgICAgICAgICAgICAgICB0LCB0LnZhbHVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG5leHR0b2tlbi5sYWJlbCA9IHQudmFsdWU7DQogICAgICAgICAgICB0ID0gbmV4dHRva2VuOw0KICAgICAgICB9DQoNCi8vIFBhcnNlIHRoZSBzdGF0ZW1lbnQuDQoNCiAgICAgICAgaWYgKCFub2luZGVudCkgew0KICAgICAgICAgICAgaW5kZW50YXRpb24oKTsNCiAgICAgICAgfQ0KICAgICAgICByID0gZXhwcmVzc2lvbigwLCB0cnVlKTsNCg0KLy8gTG9vayBmb3IgdGhlIGZpbmFsIHNlbWljb2xvbi4NCg0KICAgICAgICBpZiAoIXQuYmxvY2spIHsNCiAgICAgICAgICAgIGlmICghb3B0aW9uLmV4cHIgJiYgKCFyIHx8ICFyLmV4cHMpKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiRXhwZWN0ZWQgYW4gYXNzaWdubWVudCBvciBmdW5jdGlvbiBjYWxsIGFuZCBpbnN0ZWFkIHNhdyBhbiBleHByZXNzaW9uLiIsDQogICAgICAgICAgICAgICAgICAgIHRva2VuKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLm5vbmV3ICYmIHIuaWQgPT09ICcoJyAmJiByLmxlZnQuaWQgPT09ICduZXcnKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiRG8gbm90IHVzZSAnbmV3JyBmb3Igc2lkZSBlZmZlY3RzLiIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJzsnKSB7DQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb24uYXNpICYmICEob3B0aW9uLmxhc3RzZW1pYyAmJiBuZXh0dG9rZW4uaWQgPT0gJ30nICYmDQogICAgICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4ubGluZSA9PSB0b2tlbi5saW5lKSkgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIk1pc3Npbmcgc2VtaWNvbG9uLiIsIHRva2VuLmxpbmUsIHRva2VuLmZyb20gKyB0b2tlbi52YWx1ZS5sZW5ndGgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7DQogICAgICAgICAgICAgICAgYWR2YW5jZSgnOycpOw0KICAgICAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCi8vIFJlc3RvcmUgdGhlIGluZGVudGF0aW9uLg0KDQogICAgICAgIGluZGVudCA9IGk7DQogICAgICAgIHNjb3BlID0gczsNCiAgICAgICAgcmV0dXJuIHI7DQogICAgfQ0KDQoNCiAgICBmdW5jdGlvbiB1c2Vfc3RyaWN0KCkgew0KICAgICAgICBpZiAobmV4dHRva2VuLnZhbHVlID09PSAndXNlIHN0cmljdCcpIHsNCiAgICAgICAgICAgIGlmIChzdHJpY3RfbW9kZSkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVubmVjZXNzYXJ5IFwidXNlIHN0cmljdFwiLiIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYWR2YW5jZSgpOw0KICAgICAgICAgICAgYWR2YW5jZSgnOycpOw0KICAgICAgICAgICAgc3RyaWN0X21vZGUgPSB0cnVlOw0KICAgICAgICAgICAgb3B0aW9uLm5ld2NhcCA9IHRydWU7DQogICAgICAgICAgICBvcHRpb24udW5kZWYgPSB0cnVlOw0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHN0YXRlbWVudHMoYmVnaW4pIHsNCiAgICAgICAgdmFyIGEgPSBbXSwgZiwgcDsNCg0KICAgICAgICB3aGlsZSAoIW5leHR0b2tlbi5yZWFjaCAmJiBuZXh0dG9rZW4uaWQgIT09ICcoZW5kKScpIHsNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICc7Jykgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVubmVjZXNzYXJ5IHNlbWljb2xvbi4iKTsNCiAgICAgICAgICAgICAgICBhZHZhbmNlKCc7Jyk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGEucHVzaChzdGF0ZW1lbnQoKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGE7DQogICAgfQ0KDQoNCiAgICAvKg0KICAgICAqIFBhcnNlcyBhIHNpbmdsZSBibG9jay4gQSBibG9jayBpcyBhIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgd3JhcHBlZCBpbg0KICAgICAqIGJyYWNlcy4NCiAgICAgKg0KICAgICAqIG9yZGluYXJ5IC0gdHJ1ZSBmb3IgZXZlcnl0aGluZyBidXQgZnVuY3Rpb24gYm9kaWVzIGFuZCB0cnkgYmxvY2tzLg0KICAgICAqIHN0bXQgICAgIC0gdHJ1ZSBpZiBibG9jayBjYW4gYmUgYSBzaW5nbGUgc3RhdGVtZW50IChlLmcuIGluIGlmL2Zvci93aGlsZSkuDQogICAgICovDQogICAgZnVuY3Rpb24gYmxvY2sob3JkaW5hcnksIHN0bXQpIHsNCiAgICAgICAgdmFyIGEsDQogICAgICAgICAgICBiID0gaW5ibG9jaywNCiAgICAgICAgICAgIG9sZF9pbmRlbnQgPSBpbmRlbnQsDQogICAgICAgICAgICBtID0gc3RyaWN0X21vZGUsDQogICAgICAgICAgICBzID0gc2NvcGUsDQogICAgICAgICAgICB0Ow0KDQogICAgICAgIGluYmxvY2sgPSBvcmRpbmFyeTsNCiAgICAgICAgc2NvcGUgPSBPYmplY3QuY3JlYXRlKHNjb3BlKTsNCiAgICAgICAgbm9uYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7DQogICAgICAgIHQgPSBuZXh0dG9rZW47DQoNCiAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ3snKSB7DQogICAgICAgICAgICBhZHZhbmNlKCd7Jyk7DQogICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnfScgfHwgdG9rZW4ubGluZSAhPT0gbmV4dHRva2VuLmxpbmUpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gb3B0aW9uLmluZGVudDsNCiAgICAgICAgICAgICAgICB3aGlsZSAoIW9yZGluYXJ5ICYmIG5leHR0b2tlbi5mcm9tID4gaW5kZW50KSB7DQogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSBvcHRpb24uaW5kZW50Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIW9yZGluYXJ5ICYmICF1c2Vfc3RyaWN0KCkgJiYgIW0gJiYgb3B0aW9uLnN0cmljdCAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3RbJyhjb250ZXh0KSddWycoZ2xvYmFsKSddKSB7DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIk1pc3NpbmcgXCJ1c2Ugc3RyaWN0XCIgc3RhdGVtZW50LiIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBhID0gc3RhdGVtZW50cygpOw0KICAgICAgICAgICAgICAgIHN0cmljdF9tb2RlID0gbTsNCiAgICAgICAgICAgICAgICBpbmRlbnQgLT0gb3B0aW9uLmluZGVudDsNCiAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbigpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYWR2YW5jZSgnfScsIHQpOw0KICAgICAgICAgICAgaW5kZW50ID0gb2xkX2luZGVudDsNCiAgICAgICAgfSBlbHNlIGlmICghb3JkaW5hcnkpIHsNCiAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCAne2F9JyBhbmQgaW5zdGVhZCBzYXcgJ3tifScuIiwNCiAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgJ3snLCBuZXh0dG9rZW4udmFsdWUpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaWYgKCFzdG10IHx8IG9wdGlvbi5jdXJseSkNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCAne2F9JyBhbmQgaW5zdGVhZCBzYXcgJ3tifScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgJ3snLCBuZXh0dG9rZW4udmFsdWUpOw0KDQogICAgICAgICAgICBub3JlYWNoID0gdHJ1ZTsNCiAgICAgICAgICAgIGEgPSBbc3RhdGVtZW50KCldOw0KICAgICAgICAgICAgbm9yZWFjaCA9IGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIGZ1bmN0WycodmVyYiknXSA9IG51bGw7DQogICAgICAgIHNjb3BlID0gczsNCiAgICAgICAgaW5ibG9jayA9IGI7DQogICAgICAgIGlmIChvcmRpbmFyeSAmJiBvcHRpb24ubm9lbXB0eSAmJiAoIWEgfHwgYS5sZW5ndGggPT09IDApKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJFbXB0eSBibG9jay4iKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gYTsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIGNvdW50TWVtYmVyKG0pIHsNCiAgICAgICAgaWYgKG1lbWJlcnNPbmx5ICYmIHR5cGVvZiBtZW1iZXJzT25seVttXSAhPT0gJ2Jvb2xlYW4nKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJVbmV4cGVjdGVkIC8qbWVtYmVyICd7YX0nLiIsIHRva2VuLCBtKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodHlwZW9mIG1lbWJlclttXSA9PT0gJ251bWJlcicpIHsNCiAgICAgICAgICAgIG1lbWJlclttXSArPSAxOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgbWVtYmVyW21dID0gMTsNCiAgICAgICAgfQ0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gbm90ZV9pbXBsaWVkKHRva2VuKSB7DQogICAgICAgIHZhciBuYW1lID0gdG9rZW4udmFsdWUsIGxpbmUgPSB0b2tlbi5saW5lLCBhID0gaW1wbGllZFtuYW1lXTsNCiAgICAgICAgaWYgKHR5cGVvZiBhID09PSAnZnVuY3Rpb24nKSB7DQogICAgICAgICAgICBhID0gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFhKSB7DQogICAgICAgICAgICBhID0gW2xpbmVdOw0KICAgICAgICAgICAgaW1wbGllZFtuYW1lXSA9IGE7DQogICAgICAgIH0gZWxzZSBpZiAoYVthLmxlbmd0aCAtIDFdICE9PSBsaW5lKSB7DQogICAgICAgICAgICBhLnB1c2gobGluZSk7DQogICAgICAgIH0NCiAgICB9DQoNCi8vIEJ1aWxkIHRoZSBzeW50YXggdGFibGUgYnkgZGVjbGFyaW5nIHRoZSBzeW50YWN0aWMgZWxlbWVudHMgb2YgdGhlIGxhbmd1YWdlLg0KDQogICAgdHlwZSgnKG51bWJlciknLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pOw0KICAgIHR5cGUoJyhzdHJpbmcpJywgZnVuY3Rpb24gKCkgew0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KTsNCg0KICAgIHN5bnRheFsnKGlkZW50aWZpZXIpJ10gPSB7DQogICAgICAgIHR5cGU6ICcoaWRlbnRpZmllciknLA0KICAgICAgICBsYnA6IDAsDQogICAgICAgIGlkZW50aWZpZXI6IHRydWUsDQogICAgICAgIG51ZDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHYgPSB0aGlzLnZhbHVlLA0KICAgICAgICAgICAgICAgIHMgPSBzY29wZVt2XSwNCiAgICAgICAgICAgICAgICBmOw0KICAgICAgICAgICAgaWYgKHR5cGVvZiBzID09PSAnZnVuY3Rpb24nKSB7DQoNCi8vIFByb3RlY3Rpb24gYWdhaW5zdCBhY2NpZGVudGFsIGluaGVyaXRhbmNlLg0KDQogICAgICAgICAgICAgICAgcyA9IHVuZGVmaW5lZDsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHMgPT09ICdib29sZWFuJykgew0KICAgICAgICAgICAgICAgIGYgPSBmdW5jdDsNCiAgICAgICAgICAgICAgICBmdW5jdCA9IGZ1bmN0aW9uc1swXTsNCiAgICAgICAgICAgICAgICBhZGRsYWJlbCh2LCAndmFyJyk7DQogICAgICAgICAgICAgICAgcyA9IGZ1bmN0Ow0KICAgICAgICAgICAgICAgIGZ1bmN0ID0gZjsNCiAgICAgICAgICAgIH0NCg0KLy8gVGhlIG5hbWUgaXMgaW4gc2NvcGUgYW5kIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24uDQoNCiAgICAgICAgICAgIGlmIChmdW5jdCA9PT0gcykgew0KDQovLyAgICAgIENoYW5nZSAndW51c2VkJyB0byAndmFyJywgYW5kIHJlamVjdCBsYWJlbHMuDQoNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZ1bmN0W3ZdKSB7DQogICAgICAgICAgICAgICAgY2FzZSAndW51c2VkJzoNCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rbdl0gPSAndmFyJzsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAndW5jdGlvbic6DQogICAgICAgICAgICAgICAgICAgIGZ1bmN0W3ZdID0gJ2Z1bmN0aW9uJzsNCiAgICAgICAgICAgICAgICAgICAgdGhpc1snZnVuY3Rpb24nXSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoNCiAgICAgICAgICAgICAgICAgICAgdGhpc1snZnVuY3Rpb24nXSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ2xhYmVsJzoNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiJ3thfScgaXMgYSBzdGF0ZW1lbnQgbGFiZWwuIiwgdG9rZW4sIHYpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCi8vIFRoZSBuYW1lIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBmdW5jdGlvbi4gIElmIHdlIGFyZSBpbiB0aGUgZ2xvYmFsIHNjb3BlLA0KLy8gdGhlbiB3ZSBoYXZlIGFuIHVuZGVmaW5lZCB2YXJpYWJsZS4NCi8vDQovLyBPcGVyYXRvcnMgdHlwZW9mIGFuZCBkZWxldGUgZG8gbm90IHJhaXNlIHJ1bnRpbWUgZXJyb3JzIGV2ZW4gaWYgdGhlIGJhc2UNCi8vIG9iamVjdCBvZiBhIHJlZmVyZW5jZSBpcyBudWxsIHNvIG5vIG5lZWQgdG8gZGlzcGxheSB3YXJuaW5nIGlmIHdlJ3JlDQovLyBpbnNpZGUgb2YgdHlwZW9mIG9yIGRlbGV0ZS4NCg0KICAgICAgICAgICAgfSBlbHNlIGlmIChmdW5jdFsnKGdsb2JhbCknXSkgew0KICAgICAgICAgICAgICAgIGlmIChhbm9ubmFtZSAhPSAndHlwZW9mJyAmJiBhbm9ubmFtZSAhPSAnZGVsZXRlJyAmJg0KICAgICAgICAgICAgICAgICAgICBvcHRpb24udW5kZWYgJiYgdHlwZW9mIHByZWRlZmluZWRbdl0gIT09ICdib29sZWFuJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBub3QgZGVmaW5lZC4iLCB0b2tlbiwgdik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIG5vdGVfaW1wbGllZCh0b2tlbik7DQoNCi8vIElmIHRoZSBuYW1lIGlzIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgY3VycmVudA0KLy8gZnVuY3Rpb24sIGJ1dCBub3QgYXMgb3V0ZXIsIHRoZW4gdGhlcmUgaXMgYSBzY29wZSBlcnJvci4NCg0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZ1bmN0W3ZdKSB7DQogICAgICAgICAgICAgICAgY2FzZSAnY2xvc3VyZSc6DQogICAgICAgICAgICAgICAgY2FzZSAnZnVuY3Rpb24nOg0KICAgICAgICAgICAgICAgIGNhc2UgJ3Zhcic6DQogICAgICAgICAgICAgICAgY2FzZSAndW51c2VkJzoNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiJ3thfScgdXNlZCBvdXQgb2Ygc2NvcGUuIiwgdG9rZW4sIHYpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdsYWJlbCc6DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIid7YX0nIGlzIGEgc3RhdGVtZW50IGxhYmVsLiIsIHRva2VuLCB2KTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnb3V0ZXInOg0KICAgICAgICAgICAgICAgIGNhc2UgJ2dsb2JhbCc6DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQoNCi8vIElmIHRoZSBuYW1lIGlzIGRlZmluZWQgaW4gYW4gb3V0ZXIgZnVuY3Rpb24sIG1ha2UgYW4gb3V0ZXIgZW50cnksIGFuZCBpZg0KLy8gaXQgd2FzIHVudXNlZCwgbWFrZSBpdCB2YXIuDQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKHMgPT09IHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0W3ZdID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzID09PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBub3QgYWxsb3dlZC4iLCB0b2tlbiwgdik7DQogICAgICAgICAgICAgICAgICAgICAgICBub3RlX2ltcGxpZWQodG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzICE9PSAnb2JqZWN0Jykgew0KDQovLyBPcGVyYXRvcnMgdHlwZW9mIGFuZCBkZWxldGUgZG8gbm90IHJhaXNlIHJ1bnRpbWUgZXJyb3JzIGV2ZW4gaWYgdGhlIGJhc2Ugb2JqZWN0IG9mDQovLyBhIHJlZmVyZW5jZSBpcyBudWxsIHNvIG5vIG5lZWQgdG8gZGlzcGxheSB3YXJuaW5nIGlmIHdlJ3JlIGluc2lkZSBvZiB0eXBlb2Ygb3IgZGVsZXRlLg0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5vbm5hbWUgIT0gJ3R5cGVvZicgJiYgYW5vbm5hbWUgIT0gJ2RlbGV0ZScgJiYgb3B0aW9uLnVuZGVmKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiJ3thfScgaXMgbm90IGRlZmluZWQuIiwgdG9rZW4sIHYpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdFt2XSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBub3RlX2ltcGxpZWQodG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzW3ZdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1bmN0aW9uJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzWydmdW5jdGlvbiddID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW3ZdID0gJ2Nsb3N1cmUnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0W3ZdID0gc1snKGdsb2JhbCknXSA/ICdnbG9iYWwnIDogJ291dGVyJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Zhcic6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1bnVzZWQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbdl0gPSAnY2xvc3VyZSc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rbdl0gPSBzWycoZ2xvYmFsKSddID8gJ2dsb2JhbCcgOiAnb3V0ZXInOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2xvc3VyZSc6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwYXJhbWV0ZXInOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0W3ZdID0gc1snKGdsb2JhbCknXSA/ICdnbG9iYWwnIDogJ291dGVyJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xhYmVsJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBhIHN0YXRlbWVudCBsYWJlbC4iLCB0b2tlbiwgdik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgfSwNCiAgICAgICAgbGVkOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgYW4gb3BlcmF0b3IgYW5kIGluc3RlYWQgc2F3ICd7YX0nLiIsDQogICAgICAgICAgICAgICAgbmV4dHRva2VuLCBuZXh0dG9rZW4udmFsdWUpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHR5cGUoJyhyZWdleHApJywgZnVuY3Rpb24gKCkgew0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KTsNCg0KDQovLyBFQ01BU2NyaXB0IHBhcnNlcg0KDQogICAgZGVsaW0oJyhlbmRsaW5lKScpOw0KICAgIGRlbGltKCcoYmVnaW4pJyk7DQogICAgZGVsaW0oJyhlbmQpJykucmVhY2ggPSB0cnVlOw0KICAgIGRlbGltKCc8LycpLnJlYWNoID0gdHJ1ZTsNCiAgICBkZWxpbSgnPCEnKTsNCiAgICBkZWxpbSgnPCEtLScpOw0KICAgIGRlbGltKCctLT4nKTsNCiAgICBkZWxpbSgnKGVycm9yKScpLnJlYWNoID0gdHJ1ZTsNCiAgICBkZWxpbSgnfScpLnJlYWNoID0gdHJ1ZTsNCiAgICBkZWxpbSgnKScpOw0KICAgIGRlbGltKCddJyk7DQogICAgZGVsaW0oJyInKS5yZWFjaCA9IHRydWU7DQogICAgZGVsaW0oIiciKS5yZWFjaCA9IHRydWU7DQogICAgZGVsaW0oJzsnKTsNCiAgICBkZWxpbSgnOicpLnJlYWNoID0gdHJ1ZTsNCiAgICBkZWxpbSgnLCcpOw0KICAgIGRlbGltKCcjJyk7DQogICAgZGVsaW0oJ0AnKTsNCiAgICByZXNlcnZlKCdlbHNlJyk7DQogICAgcmVzZXJ2ZSgnY2FzZScpLnJlYWNoID0gdHJ1ZTsNCiAgICByZXNlcnZlKCdjYXRjaCcpOw0KICAgIHJlc2VydmUoJ2RlZmF1bHQnKS5yZWFjaCA9IHRydWU7DQogICAgcmVzZXJ2ZSgnZmluYWxseScpOw0KICAgIHJlc2VydmV2YXIoJ2FyZ3VtZW50cycsIGZ1bmN0aW9uICh4KSB7DQogICAgICAgIGlmIChzdHJpY3RfbW9kZSAmJiBmdW5jdFsnKGdsb2JhbCknXSkgew0KICAgICAgICAgICAgd2FybmluZygiU3RyaWN0IHZpb2xhdGlvbi4iLCB4KTsNCiAgICAgICAgfQ0KICAgIH0pOw0KICAgIHJlc2VydmV2YXIoJ2V2YWwnKTsNCiAgICByZXNlcnZldmFyKCdmYWxzZScpOw0KICAgIHJlc2VydmV2YXIoJ0luZmluaXR5Jyk7DQogICAgcmVzZXJ2ZXZhcignTmFOJyk7DQogICAgcmVzZXJ2ZXZhcignbnVsbCcpOw0KICAgIHJlc2VydmV2YXIoJ3RoaXMnLCBmdW5jdGlvbiAoeCkgew0KICAgICAgICBpZiAoc3RyaWN0X21vZGUgJiYgKChmdW5jdFsnKHN0YXRlbWVudCknXSAmJg0KICAgICAgICAgICAgICAgIGZ1bmN0WycobmFtZSknXS5jaGFyQXQoMCkgPiAnWicpIHx8IGZ1bmN0WycoZ2xvYmFsKSddKSkgew0KICAgICAgICAgICAgd2FybmluZygiU3RyaWN0IHZpb2xhdGlvbi4iLCB4KTsNCiAgICAgICAgfQ0KICAgIH0pOw0KICAgIHJlc2VydmV2YXIoJ3RydWUnKTsNCiAgICByZXNlcnZldmFyKCd1bmRlZmluZWQnKTsNCiAgICBhc3NpZ25vcCgnPScsICdhc3NpZ24nLCAyMCk7DQogICAgYXNzaWdub3AoJys9JywgJ2Fzc2lnbmFkZCcsIDIwKTsNCiAgICBhc3NpZ25vcCgnLT0nLCAnYXNzaWduc3ViJywgMjApOw0KICAgIGFzc2lnbm9wKCcqPScsICdhc3NpZ25tdWx0JywgMjApOw0KICAgIGFzc2lnbm9wKCcvPScsICdhc3NpZ25kaXYnLCAyMCkubnVkID0gZnVuY3Rpb24gKCkgew0KICAgICAgICBlcnJvcigiQSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbCBjYW4gYmUgY29uZnVzZWQgd2l0aCAnLz0nLiIpOw0KICAgIH07DQogICAgYXNzaWdub3AoJyU9JywgJ2Fzc2lnbm1vZCcsIDIwKTsNCiAgICBiaXR3aXNlYXNzaWdub3AoJyY9JywgJ2Fzc2lnbmJpdGFuZCcsIDIwKTsNCiAgICBiaXR3aXNlYXNzaWdub3AoJ3w9JywgJ2Fzc2lnbmJpdG9yJywgMjApOw0KICAgIGJpdHdpc2Vhc3NpZ25vcCgnXj0nLCAnYXNzaWduYml0eG9yJywgMjApOw0KICAgIGJpdHdpc2Vhc3NpZ25vcCgnPDw9JywgJ2Fzc2lnbnNoaWZ0bGVmdCcsIDIwKTsNCiAgICBiaXR3aXNlYXNzaWdub3AoJz4+PScsICdhc3NpZ25zaGlmdHJpZ2h0JywgMjApOw0KICAgIGJpdHdpc2Vhc3NpZ25vcCgnPj4+PScsICdhc3NpZ25zaGlmdHJpZ2h0dW5zaWduZWQnLCAyMCk7DQogICAgaW5maXgoJz8nLCBmdW5jdGlvbiAobGVmdCwgdGhhdCkgew0KICAgICAgICB0aGF0LmxlZnQgPSBsZWZ0Ow0KICAgICAgICB0aGF0LnJpZ2h0ID0gZXhwcmVzc2lvbigxMCk7DQogICAgICAgIGFkdmFuY2UoJzonKTsNCiAgICAgICAgdGhhdFsnZWxzZSddID0gZXhwcmVzc2lvbigxMCk7DQogICAgICAgIHJldHVybiB0aGF0Ow0KICAgIH0sIDMwKTsNCg0KICAgIGluZml4KCd8fCcsICdvcicsIDQwKTsNCiAgICBpbmZpeCgnJiYnLCAnYW5kJywgNTApOw0KICAgIGJpdHdpc2UoJ3wnLCAnYml0b3InLCA3MCk7DQogICAgYml0d2lzZSgnXicsICdiaXR4b3InLCA4MCk7DQogICAgYml0d2lzZSgnJicsICdiaXRhbmQnLCA5MCk7DQogICAgcmVsYXRpb24oJz09JywgZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7DQogICAgICAgIHZhciBlcW51bGwgPSBvcHRpb24uZXFudWxsICYmDQogICAgICAgICAgICAgICAgKGxlZnQudmFsdWUgPT0gJ251bGwnIHx8IHJpZ2h0LnZhbHVlID09ICdudWxsJyk7DQoNCiAgICAgICAgaWYgKCFlcW51bGwgJiYgb3B0aW9uLmVxZXFlcSkgew0KICAgICAgICAgICAgd2FybmluZygiRXhwZWN0ZWQgJ3thfScgYW5kIGluc3RlYWQgc2F3ICd7Yn0nLiIsDQogICAgICAgICAgICAgICAgICAgIHRoaXMsICc9PT0nLCAnPT0nKTsNCiAgICAgICAgfSBlbHNlIGlmIChpc1Bvb3JSZWxhdGlvbihsZWZ0KSkgew0KICAgICAgICAgICAgd2FybmluZygiVXNlICd7YX0nIHRvIGNvbXBhcmUgd2l0aCAne2J9Jy4iLA0KICAgICAgICAgICAgICAgIHRoaXMsICc9PT0nLCBsZWZ0LnZhbHVlKTsNCiAgICAgICAgfSBlbHNlIGlmIChpc1Bvb3JSZWxhdGlvbihyaWdodCkpIHsNCiAgICAgICAgICAgIHdhcm5pbmcoIlVzZSAne2F9JyB0byBjb21wYXJlIHdpdGggJ3tifScuIiwNCiAgICAgICAgICAgICAgICB0aGlzLCAnPT09JywgcmlnaHQudmFsdWUpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pOw0KICAgIHJlbGF0aW9uKCc9PT0nKTsNCiAgICByZWxhdGlvbignIT0nLCBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsNCiAgICAgICAgdmFyIGVxbnVsbCA9IG9wdGlvbi5lcW51bGwgJiYNCiAgICAgICAgICAgICAgICAobGVmdC52YWx1ZSA9PSAnbnVsbCcgfHwgcmlnaHQudmFsdWUgPT0gJ251bGwnKTsNCg0KICAgICAgICBpZiAoIWVxbnVsbCAmJiBvcHRpb24uZXFlcWVxKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCAne2F9JyBhbmQgaW5zdGVhZCBzYXcgJ3tifScuIiwNCiAgICAgICAgICAgICAgICAgICAgdGhpcywgJyE9PScsICchPScpOw0KICAgICAgICB9IGVsc2UgaWYgKGlzUG9vclJlbGF0aW9uKGxlZnQpKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJVc2UgJ3thfScgdG8gY29tcGFyZSB3aXRoICd7Yn0nLiIsDQogICAgICAgICAgICAgICAgICAgIHRoaXMsICchPT0nLCBsZWZ0LnZhbHVlKTsNCiAgICAgICAgfSBlbHNlIGlmIChpc1Bvb3JSZWxhdGlvbihyaWdodCkpIHsNCiAgICAgICAgICAgIHdhcm5pbmcoIlVzZSAne2F9JyB0byBjb21wYXJlIHdpdGggJ3tifScuIiwNCiAgICAgICAgICAgICAgICAgICAgdGhpcywgJyE9PScsIHJpZ2h0LnZhbHVlKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KTsNCiAgICByZWxhdGlvbignIT09Jyk7DQogICAgcmVsYXRpb24oJzwnKTsNCiAgICByZWxhdGlvbignPicpOw0KICAgIHJlbGF0aW9uKCc8PScpOw0KICAgIHJlbGF0aW9uKCc+PScpOw0KICAgIGJpdHdpc2UoJzw8JywgJ3NoaWZ0bGVmdCcsIDEyMCk7DQogICAgYml0d2lzZSgnPj4nLCAnc2hpZnRyaWdodCcsIDEyMCk7DQogICAgYml0d2lzZSgnPj4+JywgJ3NoaWZ0cmlnaHR1bnNpZ25lZCcsIDEyMCk7DQogICAgaW5maXgoJ2luJywgJ2luJywgMTIwKTsNCiAgICBpbmZpeCgnaW5zdGFuY2VvZicsICdpbnN0YW5jZW9mJywgMTIwKTsNCiAgICBpbmZpeCgnKycsIGZ1bmN0aW9uIChsZWZ0LCB0aGF0KSB7DQogICAgICAgIHZhciByaWdodCA9IGV4cHJlc3Npb24oMTMwKTsNCiAgICAgICAgaWYgKGxlZnQgJiYgcmlnaHQgJiYgbGVmdC5pZCA9PT0gJyhzdHJpbmcpJyAmJiByaWdodC5pZCA9PT0gJyhzdHJpbmcpJykgew0KICAgICAgICAgICAgbGVmdC52YWx1ZSArPSByaWdodC52YWx1ZTsNCiAgICAgICAgICAgIGxlZnQuY2hhcmFjdGVyID0gcmlnaHQuY2hhcmFjdGVyOw0KICAgICAgICAgICAgaWYgKCFvcHRpb24uc2NyaXB0dXJsICYmIGp4LnRlc3QobGVmdC52YWx1ZSkpIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJKYXZhU2NyaXB0IFVSTC4iLCBsZWZ0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBsZWZ0Ow0KICAgICAgICB9DQogICAgICAgIHRoYXQubGVmdCA9IGxlZnQ7DQogICAgICAgIHRoYXQucmlnaHQgPSByaWdodDsNCiAgICAgICAgcmV0dXJuIHRoYXQ7DQogICAgfSwgMTMwKTsNCiAgICBwcmVmaXgoJysnLCAnbnVtJyk7DQogICAgcHJlZml4KCcrKysnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHdhcm5pbmcoIkNvbmZ1c2luZyBwbHVzZXMuIik7DQogICAgICAgIHRoaXMucmlnaHQgPSBleHByZXNzaW9uKDE1MCk7DQogICAgICAgIHRoaXMuYXJpdHkgPSAndW5hcnknOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KTsNCiAgICBpbmZpeCgnKysrJywgZnVuY3Rpb24gKGxlZnQpIHsNCiAgICAgICAgd2FybmluZygiQ29uZnVzaW5nIHBsdXNlcy4iKTsNCiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDsNCiAgICAgICAgdGhpcy5yaWdodCA9IGV4cHJlc3Npb24oMTMwKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwgMTMwKTsNCiAgICBpbmZpeCgnLScsICdzdWInLCAxMzApOw0KICAgIHByZWZpeCgnLScsICduZWcnKTsNCiAgICBwcmVmaXgoJy0tLScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgd2FybmluZygiQ29uZnVzaW5nIG1pbnVzZXMuIik7DQogICAgICAgIHRoaXMucmlnaHQgPSBleHByZXNzaW9uKDE1MCk7DQogICAgICAgIHRoaXMuYXJpdHkgPSAndW5hcnknOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KTsNCiAgICBpbmZpeCgnLS0tJywgZnVuY3Rpb24gKGxlZnQpIHsNCiAgICAgICAgd2FybmluZygiQ29uZnVzaW5nIG1pbnVzZXMuIik7DQogICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7DQogICAgICAgIHRoaXMucmlnaHQgPSBleHByZXNzaW9uKDEzMCk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sIDEzMCk7DQogICAgaW5maXgoJyonLCAnbXVsdCcsIDE0MCk7DQogICAgaW5maXgoJy8nLCAnZGl2JywgMTQwKTsNCiAgICBpbmZpeCgnJScsICdtb2QnLCAxNDApOw0KDQogICAgc3VmZml4KCcrKycsICdwb3N0aW5jJyk7DQogICAgcHJlZml4KCcrKycsICdwcmVpbmMnKTsNCiAgICBzeW50YXhbJysrJ10uZXhwcyA9IHRydWU7DQoNCiAgICBzdWZmaXgoJy0tJywgJ3Bvc3RkZWMnKTsNCiAgICBwcmVmaXgoJy0tJywgJ3ByZWRlYycpOw0KICAgIHN5bnRheFsnLS0nXS5leHBzID0gdHJ1ZTsNCiAgICBwcmVmaXgoJ2RlbGV0ZScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdmFyIHAgPSBleHByZXNzaW9uKDApOw0KICAgICAgICBpZiAoIXAgfHwgKHAuaWQgIT09ICcuJyAmJiBwLmlkICE9PSAnWycpKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJWYXJpYWJsZXMgc2hvdWxkIG5vdCBiZSBkZWxldGVkLiIpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZmlyc3QgPSBwOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KS5leHBzID0gdHJ1ZTsNCg0KICAgIHByZWZpeCgnficsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgaWYgKG9wdGlvbi5iaXR3aXNlKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJVbmV4cGVjdGVkICd7YX0nLiIsIHRoaXMsICd+Jyk7DQogICAgICAgIH0NCiAgICAgICAgZXhwcmVzc2lvbigxNTApOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KTsNCg0KICAgIHByZWZpeCgnIScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdGhpcy5yaWdodCA9IGV4cHJlc3Npb24oMTUwKTsNCiAgICAgICAgdGhpcy5hcml0eSA9ICd1bmFyeSc7DQogICAgICAgIGlmIChiYW5nW3RoaXMucmlnaHQuaWRdID09PSB0cnVlKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJDb25mdXNpbmcgdXNlIG9mICd7YX0nLiIsIHRoaXMsICchJyk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSk7DQogICAgcHJlZml4KCd0eXBlb2YnLCAndHlwZW9mJyk7DQogICAgcHJlZml4KCduZXcnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciBjID0gZXhwcmVzc2lvbigxNTUpLCBpOw0KICAgICAgICBpZiAoYyAmJiBjLmlkICE9PSAnZnVuY3Rpb24nKSB7DQogICAgICAgICAgICBpZiAoYy5pZGVudGlmaWVyKSB7DQogICAgICAgICAgICAgICAgY1snbmV3J10gPSB0cnVlOw0KICAgICAgICAgICAgICAgIHN3aXRjaCAoYy52YWx1ZSkgew0KICAgICAgICAgICAgICAgIGNhc2UgJ09iamVjdCc6DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVzZSB0aGUgb2JqZWN0IGxpdGVyYWwgbm90YXRpb24ge30uIiwgdG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdOdW1iZXInOg0KICAgICAgICAgICAgICAgIGNhc2UgJ1N0cmluZyc6DQogICAgICAgICAgICAgICAgY2FzZSAnQm9vbGVhbic6DQogICAgICAgICAgICAgICAgY2FzZSAnTWF0aCc6DQogICAgICAgICAgICAgICAgY2FzZSAnSlNPTic6DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIkRvIG5vdCB1c2Uge2F9IGFzIGEgY29uc3RydWN0b3IuIiwgdG9rZW4sIGMudmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdGdW5jdGlvbic6DQogICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9uLmV2aWwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIlRoZSBGdW5jdGlvbiBjb25zdHJ1Y3RvciBpcyBldmFsLiIpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ0RhdGUnOg0KICAgICAgICAgICAgICAgIGNhc2UgJ1JlZ0V4cCc6DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgIGlmIChjLmlkICE9PSAnZnVuY3Rpb24nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpID0gYy52YWx1ZS5zdWJzdHIoMCwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLm5ld2NhcCAmJiAoaSA8ICdBJyB8fCBpID4gJ1onKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIkEgY29uc3RydWN0b3IgbmFtZSBzaG91bGQgc3RhcnQgd2l0aCAiKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW4gdXBwZXJjYXNlIGxldHRlci4iLCB0b2tlbik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGlmIChjLmlkICE9PSAnLicgJiYgYy5pZCAhPT0gJ1snICYmIGMuaWQgIT09ICcoJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJCYWQgY29uc3RydWN0b3IuIiwgdG9rZW4pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICghb3B0aW9uLnN1cGVybmV3KQ0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIldlaXJkIGNvbnN0cnVjdGlvbi4gRGVsZXRlICduZXcnLiIsIHRoaXMpOw0KICAgICAgICB9DQogICAgICAgIGFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnKCcgJiYgIW9wdGlvbi5zdXBlcm5ldykgew0KICAgICAgICAgICAgd2FybmluZygiTWlzc2luZyAnKCknIGludm9raW5nIGEgY29uc3RydWN0b3IuIik7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5maXJzdCA9IGM7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pOw0KICAgIHN5bnRheFsnbmV3J10uZXhwcyA9IHRydWU7DQoNCiAgICBwcmVmaXgoJ3ZvaWQnKS5leHBzID0gdHJ1ZTsNCg0KICAgIGluZml4KCcuJywgZnVuY3Rpb24gKGxlZnQsIHRoYXQpIHsNCiAgICAgICAgYWRqYWNlbnQocHJldnRva2VuLCB0b2tlbik7DQogICAgICAgIG5vYnJlYWsoKTsNCiAgICAgICAgdmFyIG0gPSBpZGVudGlmaWVyKCk7DQogICAgICAgIGlmICh0eXBlb2YgbSA9PT0gJ3N0cmluZycpIHsNCiAgICAgICAgICAgIGNvdW50TWVtYmVyKG0pOw0KICAgICAgICB9DQogICAgICAgIHRoYXQubGVmdCA9IGxlZnQ7DQogICAgICAgIHRoYXQucmlnaHQgPSBtOw0KICAgICAgICBpZiAob3B0aW9uLm5vYXJnICYmIGxlZnQgJiYgbGVmdC52YWx1ZSA9PT0gJ2FyZ3VtZW50cycgJiYNCiAgICAgICAgICAgICAgICAobSA9PT0gJ2NhbGxlZScgfHwgbSA9PT0gJ2NhbGxlcicpKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJBdm9pZCBhcmd1bWVudHMue2F9LiIsIGxlZnQsIG0pOw0KICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb24uZXZpbCAmJiBsZWZ0ICYmIGxlZnQudmFsdWUgPT09ICdkb2N1bWVudCcgJiYNCiAgICAgICAgICAgICAgICAobSA9PT0gJ3dyaXRlJyB8fCBtID09PSAnd3JpdGVsbicpKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJkb2N1bWVudC53cml0ZSBjYW4gYmUgYSBmb3JtIG9mIGV2YWwuIiwgbGVmdCk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFvcHRpb24uZXZpbCAmJiAobSA9PT0gJ2V2YWwnIHx8IG0gPT09ICdleGVjU2NyaXB0JykpIHsNCiAgICAgICAgICAgIHdhcm5pbmcoJ2V2YWwgaXMgZXZpbC4nKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhhdDsNCiAgICB9LCAxNjAsIHRydWUpOw0KDQogICAgaW5maXgoJygnLCBmdW5jdGlvbiAobGVmdCwgdGhhdCkgew0KICAgICAgICBpZiAocHJldnRva2VuLmlkICE9PSAnfScgJiYgcHJldnRva2VuLmlkICE9PSAnKScpIHsNCiAgICAgICAgICAgIG5vYnJlYWsocHJldnRva2VuLCB0b2tlbik7DQogICAgICAgIH0NCiAgICAgICAgbm9zcGFjZSgpOw0KICAgICAgICBpZiAob3B0aW9uLmltbWVkICYmICFsZWZ0LmltbWVkICYmIGxlZnQuaWQgPT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgICAgIHdhcm5pbmcoIldyYXAgYW4gaW1tZWRpYXRlIGZ1bmN0aW9uIGludm9jYXRpb24gaW4gcGFyZW50aGVzZXMgIiArDQogICAgICAgICAgICAgICAgInRvIGFzc2lzdCB0aGUgcmVhZGVyIGluIHVuZGVyc3RhbmRpbmcgdGhhdCB0aGUgZXhwcmVzc2lvbiAiICsNCiAgICAgICAgICAgICAgICAiaXMgdGhlIHJlc3VsdCBvZiBhIGZ1bmN0aW9uLCBhbmQgbm90IHRoZSBmdW5jdGlvbiBpdHNlbGYuIik7DQogICAgICAgIH0NCiAgICAgICAgdmFyIG4gPSAwLA0KICAgICAgICAgICAgcCA9IFtdOw0KICAgICAgICBpZiAobGVmdCkgew0KICAgICAgICAgICAgaWYgKGxlZnQudHlwZSA9PT0gJyhpZGVudGlmaWVyKScpIHsNCiAgICAgICAgICAgICAgICBpZiAobGVmdC52YWx1ZS5tYXRjaCgvXltBLVpdKFtBLVowLTlfJF0qW2Etel1bQS1aYS16MC05XyRdKik/JC8pKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0LnZhbHVlICE9PSAnTnVtYmVyJyAmJiBsZWZ0LnZhbHVlICE9PSAnU3RyaW5nJyAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQudmFsdWUgIT09ICdCb29sZWFuJyAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQudmFsdWUgIT09ICdEYXRlJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQudmFsdWUgPT09ICdNYXRoJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIk1hdGggaXMgbm90IGEgZnVuY3Rpb24uIiwgbGVmdCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5uZXdjYXApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKA0KIk1pc3NpbmcgJ25ldycgcHJlZml4IHdoZW4gaW52b2tpbmcgYSBjb25zdHJ1Y3Rvci4iLCBsZWZ0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnKScpIHsNCiAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICBwW3AubGVuZ3RoXSA9IGV4cHJlc3Npb24oMTApOw0KICAgICAgICAgICAgICAgIG4gKz0gMTsNCiAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnLCcpIHsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNvbW1hKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgYWR2YW5jZSgnKScpOw0KICAgICAgICBub3NwYWNlKHByZXZ0b2tlbiwgdG9rZW4pOw0KICAgICAgICBpZiAodHlwZW9mIGxlZnQgPT09ICdvYmplY3QnKSB7DQogICAgICAgICAgICBpZiAobGVmdC52YWx1ZSA9PT0gJ3BhcnNlSW50JyAmJiBuID09PSAxKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiTWlzc2luZyByYWRpeCBwYXJhbWV0ZXIuIiwgbGVmdCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoIW9wdGlvbi5ldmlsKSB7DQogICAgICAgICAgICAgICAgaWYgKGxlZnQudmFsdWUgPT09ICdldmFsJyB8fCBsZWZ0LnZhbHVlID09PSAnRnVuY3Rpb24nIHx8DQogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LnZhbHVlID09PSAnZXhlY1NjcmlwdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiZXZhbCBpcyBldmlsLiIsIGxlZnQpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFswXSAmJiBwWzBdLmlkID09PSAnKHN0cmluZyknICYmDQogICAgICAgICAgICAgICAgICAgICAgIChsZWZ0LnZhbHVlID09PSAnc2V0VGltZW91dCcgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQudmFsdWUgPT09ICdzZXRJbnRlcnZhbCcpKSB7DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoDQogICAgIkltcGxpZWQgZXZhbCBpcyBldmlsLiBQYXNzIGEgZnVuY3Rpb24gaW5zdGVhZCBvZiBhIHN0cmluZy4iLCBsZWZ0KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoIWxlZnQuaWRlbnRpZmllciAmJiBsZWZ0LmlkICE9PSAnLicgJiYgbGVmdC5pZCAhPT0gJ1snICYmDQogICAgICAgICAgICAgICAgICAgIGxlZnQuaWQgIT09ICcoJyAmJiBsZWZ0LmlkICE9PSAnJiYnICYmIGxlZnQuaWQgIT09ICd8fCcgJiYNCiAgICAgICAgICAgICAgICAgICAgbGVmdC5pZCAhPT0gJz8nKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiQmFkIGludm9jYXRpb24uIiwgbGVmdCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhhdC5sZWZ0ID0gbGVmdDsNCiAgICAgICAgcmV0dXJuIHRoYXQ7DQogICAgfSwgMTU1LCB0cnVlKS5leHBzID0gdHJ1ZTsNCg0KICAgIHByZWZpeCgnKCcsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgbm9zcGFjZSgpOw0KICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnZnVuY3Rpb24nKSB7DQogICAgICAgICAgICBuZXh0dG9rZW4uaW1tZWQgPSB0cnVlOw0KICAgICAgICB9DQogICAgICAgIHZhciB2ID0gZXhwcmVzc2lvbigwKTsNCiAgICAgICAgYWR2YW5jZSgnKScsIHRoaXMpOw0KICAgICAgICBub3NwYWNlKHByZXZ0b2tlbiwgdG9rZW4pOw0KICAgICAgICBpZiAob3B0aW9uLmltbWVkICYmIHYuaWQgPT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcoJykgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoDQoiTW92ZSB0aGUgaW52b2NhdGlvbiBpbnRvIHRoZSBwYXJlbnMgdGhhdCBjb250YWluIHRoZSBmdW5jdGlvbi4iLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5nKA0KIkRvIG5vdCB3cmFwIGZ1bmN0aW9uIGxpdGVyYWxzIGluIHBhcmVucyB1bmxlc3MgdGhleSBhcmUgdG8gYmUgaW1tZWRpYXRlbHkgaW52b2tlZC4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHY7DQogICAgfSk7DQoNCiAgICBpbmZpeCgnWycsIGZ1bmN0aW9uIChsZWZ0LCB0aGF0KSB7DQogICAgICAgIG5vYnJlYWsocHJldnRva2VuLCB0b2tlbik7DQogICAgICAgIG5vc3BhY2UoKTsNCiAgICAgICAgdmFyIGUgPSBleHByZXNzaW9uKDApLCBzOw0KICAgICAgICBpZiAoZSAmJiBlLnR5cGUgPT09ICcoc3RyaW5nKScpIHsNCiAgICAgICAgICAgIGlmICghb3B0aW9uLmV2aWwgJiYgKGUudmFsdWUgPT09ICdldmFsJyB8fCBlLnZhbHVlID09PSAnZXhlY1NjcmlwdCcpKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiZXZhbCBpcyBldmlsLiIsIHRoYXQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY291bnRNZW1iZXIoZS52YWx1ZSk7DQogICAgICAgICAgICBpZiAoIW9wdGlvbi5zdWIgJiYgaXgudGVzdChlLnZhbHVlKSkgew0KICAgICAgICAgICAgICAgIHMgPSBzeW50YXhbZS52YWx1ZV07DQogICAgICAgICAgICAgICAgaWYgKCFzIHx8ICFzLnJlc2VydmVkKSB7DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIlsne2F9J10gaXMgYmV0dGVyIHdyaXR0ZW4gaW4gZG90IG5vdGF0aW9uLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwgZS52YWx1ZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGFkdmFuY2UoJ10nLCB0aGF0KTsNCiAgICAgICAgbm9zcGFjZShwcmV2dG9rZW4sIHRva2VuKTsNCiAgICAgICAgdGhhdC5sZWZ0ID0gbGVmdDsNCiAgICAgICAgdGhhdC5yaWdodCA9IGU7DQogICAgICAgIHJldHVybiB0aGF0Ow0KICAgIH0sIDE2MCwgdHJ1ZSk7DQoNCiAgICBwcmVmaXgoJ1snLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciBiID0gdG9rZW4ubGluZSAhPT0gbmV4dHRva2VuLmxpbmU7DQogICAgICAgIHRoaXMuZmlyc3QgPSBbXTsNCiAgICAgICAgaWYgKGIpIHsNCiAgICAgICAgICAgIGluZGVudCArPSBvcHRpb24uaW5kZW50Ow0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5mcm9tID09PSBpbmRlbnQgKyBvcHRpb24uaW5kZW50KSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IG9wdGlvbi5pbmRlbnQ7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgd2hpbGUgKG5leHR0b2tlbi5pZCAhPT0gJyhlbmQpJykgew0KICAgICAgICAgICAgd2hpbGUgKG5leHR0b2tlbi5pZCA9PT0gJywnKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiRXh0cmEgY29tbWEuIik7DQogICAgICAgICAgICAgICAgYWR2YW5jZSgnLCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ10nKSB7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYiAmJiB0b2tlbi5saW5lICE9PSBuZXh0dG9rZW4ubGluZSkgew0KICAgICAgICAgICAgICAgIGluZGVudGF0aW9uKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmZpcnN0LnB1c2goZXhwcmVzc2lvbigxMCkpOw0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJywnKSB7DQogICAgICAgICAgICAgICAgY29tbWEoKTsNCiAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnXScgJiYgIW9wdGlvbi5lczUpIHsNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRXh0cmEgY29tbWEuIiwgdG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChiKSB7DQogICAgICAgICAgICBpbmRlbnQgLT0gb3B0aW9uLmluZGVudDsNCiAgICAgICAgICAgIGluZGVudGF0aW9uKCk7DQogICAgICAgIH0NCiAgICAgICAgYWR2YW5jZSgnXScsIHRoaXMpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LCAxNjApOw0KDQoNCiAgICBmdW5jdGlvbiBwcm9wZXJ0eV9uYW1lKCkgew0KICAgICAgICB2YXIgaWQgPSBvcHRpb25hbGlkZW50aWZpZXIodHJ1ZSk7DQogICAgICAgIGlmICghaWQpIHsNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcoc3RyaW5nKScpIHsNCiAgICAgICAgICAgICAgICBpZCA9IG5leHR0b2tlbi52YWx1ZTsNCiAgICAgICAgICAgICAgICBhZHZhbmNlKCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKG5leHR0b2tlbi5pZCA9PT0gJyhudW1iZXIpJykgew0KICAgICAgICAgICAgICAgIGlkID0gbmV4dHRva2VuLnZhbHVlLnRvU3RyaW5nKCk7DQogICAgICAgICAgICAgICAgYWR2YW5jZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBpZDsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIGZ1bmN0aW9ucGFyYW1zKCkgew0KICAgICAgICB2YXIgaSwgdCA9IG5leHR0b2tlbiwgcCA9IFtdOw0KICAgICAgICBhZHZhbmNlKCcoJyk7DQogICAgICAgIG5vc3BhY2UoKTsNCiAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJyknKSB7DQogICAgICAgICAgICBhZHZhbmNlKCcpJyk7DQogICAgICAgICAgICBub3NwYWNlKHByZXZ0b2tlbiwgdG9rZW4pOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgIGkgPSBpZGVudGlmaWVyKHRydWUpOw0KICAgICAgICAgICAgcC5wdXNoKGkpOw0KICAgICAgICAgICAgYWRkbGFiZWwoaSwgJ3BhcmFtZXRlcicpOw0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJywnKSB7DQogICAgICAgICAgICAgICAgY29tbWEoKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgYWR2YW5jZSgnKScsIHQpOw0KICAgICAgICAgICAgICAgIG5vc3BhY2UocHJldnRva2VuLCB0b2tlbik7DQogICAgICAgICAgICAgICAgcmV0dXJuIHA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIGRvRnVuY3Rpb24oaSwgc3RhdGVtZW50KSB7DQogICAgICAgIHZhciBmLA0KICAgICAgICAgICAgb2xkT3B0aW9uID0gb3B0aW9uLA0KICAgICAgICAgICAgb2xkU2NvcGUgID0gc2NvcGU7DQoNCiAgICAgICAgb3B0aW9uID0gT2JqZWN0LmNyZWF0ZShvcHRpb24pOw0KICAgICAgICBzY29wZSA9IE9iamVjdC5jcmVhdGUoc2NvcGUpOw0KDQogICAgICAgIGZ1bmN0ID0gew0KICAgICAgICAgICAgJyhuYW1lKScgICAgIDogaSB8fCAnIicgKyBhbm9ubmFtZSArICciJywNCiAgICAgICAgICAgICcobGluZSknICAgICA6IG5leHR0b2tlbi5saW5lLA0KICAgICAgICAgICAgJyhjb250ZXh0KScgIDogZnVuY3QsDQogICAgICAgICAgICAnKGJyZWFrYWdlKScgOiAwLA0KICAgICAgICAgICAgJyhsb29wYWdlKScgIDogMCwNCiAgICAgICAgICAgICcoc2NvcGUpJyAgICA6IHNjb3BlLA0KICAgICAgICAgICAgJyhzdGF0ZW1lbnQpJzogc3RhdGVtZW50DQogICAgICAgIH07DQogICAgICAgIGYgPSBmdW5jdDsNCiAgICAgICAgdG9rZW4uZnVuY3QgPSBmdW5jdDsNCiAgICAgICAgZnVuY3Rpb25zLnB1c2goZnVuY3QpOw0KICAgICAgICBpZiAoaSkgew0KICAgICAgICAgICAgYWRkbGFiZWwoaSwgJ2Z1bmN0aW9uJyk7DQogICAgICAgIH0NCiAgICAgICAgZnVuY3RbJyhwYXJhbXMpJ10gPSBmdW5jdGlvbnBhcmFtcygpOw0KDQogICAgICAgIGJsb2NrKGZhbHNlKTsNCiAgICAgICAgc2NvcGUgPSBvbGRTY29wZTsNCiAgICAgICAgb3B0aW9uID0gb2xkT3B0aW9uOw0KICAgICAgICBmdW5jdFsnKGxhc3QpJ10gPSB0b2tlbi5saW5lOw0KICAgICAgICBmdW5jdCA9IGZ1bmN0WycoY29udGV4dCknXTsNCiAgICAgICAgcmV0dXJuIGY7DQogICAgfQ0KDQoNCiAgICAoZnVuY3Rpb24gKHgpIHsNCiAgICAgICAgeC5udWQgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgYiwgZiwgaSwgaiwgcCwgc2VlbiA9IHt9LCB0Ow0KDQogICAgICAgICAgICBiID0gdG9rZW4ubGluZSAhPT0gbmV4dHRva2VuLmxpbmU7DQogICAgICAgICAgICBpZiAoYikgew0KICAgICAgICAgICAgICAgIGluZGVudCArPSBvcHRpb24uaW5kZW50Ow0KICAgICAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uZnJvbSA9PT0gaW5kZW50ICsgb3B0aW9uLmluZGVudCkgew0KICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gb3B0aW9uLmluZGVudDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKDs7KSB7DQogICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ30nKSB7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoYikgew0KICAgICAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbigpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLnZhbHVlID09PSAnZ2V0JyAmJiBwZWVrKCkuaWQgIT09ICc6Jykgew0KICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCdnZXQnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb24uZXM1KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiZ2V0L3NldCBhcmUgRVM1IGZlYXR1cmVzLiIpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGkgPSBwcm9wZXJ0eV9uYW1lKCk7DQogICAgICAgICAgICAgICAgICAgIGlmICghaSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIk1pc3NpbmcgcHJvcGVydHkgbmFtZS4iKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB0ID0gbmV4dHRva2VuOw0KICAgICAgICAgICAgICAgICAgICBhZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsNCiAgICAgICAgICAgICAgICAgICAgZiA9IGRvRnVuY3Rpb24oKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb24ubG9vcGZ1bmMgJiYgZnVuY3RbJyhsb29wYWdlKSddKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJEb24ndCBtYWtlIGZ1bmN0aW9ucyB3aXRoaW4gYSBsb29wLiIsIHQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHAgPSBmWycocGFyYW1zKSddOw0KICAgICAgICAgICAgICAgICAgICBpZiAocCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCBwYXJhbWV0ZXIgJ3thfScgaW4gZ2V0IHtifSBmdW5jdGlvbi4iLCB0LCBwWzBdLCBpKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBhZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsNCiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgnLCcpOw0KICAgICAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbigpOw0KICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCdzZXQnKTsNCiAgICAgICAgICAgICAgICAgICAgaiA9IHByb3BlcnR5X25hbWUoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT09IGopIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCB7YX0gYW5kIGluc3RlYWQgc2F3IHtifS4iLCB0b2tlbiwgaSwgaik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdCA9IG5leHR0b2tlbjsNCiAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7DQogICAgICAgICAgICAgICAgICAgIGYgPSBkb0Z1bmN0aW9uKCk7DQogICAgICAgICAgICAgICAgICAgIHAgPSBmWycocGFyYW1zKSddOw0KICAgICAgICAgICAgICAgICAgICBpZiAoIXAgfHwgcC5sZW5ndGggIT09IDEgfHwgcFswXSAhPT0gJ3ZhbHVlJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRXhwZWN0ZWQgKHZhbHVlKSBpbiBzZXQge2F9IGZ1bmN0aW9uLiIsIHQsIGkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaSA9IHByb3BlcnR5X25hbWUoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpICE9PSAnc3RyaW5nJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgnOicpOw0KICAgICAgICAgICAgICAgICAgICBub25hZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsNCiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbigxMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChzZWVuW2ldID09PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIkR1cGxpY2F0ZSBtZW1iZXIgJ3thfScuIiwgbmV4dHRva2VuLCBpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgc2VlbltpXSA9IHRydWU7DQogICAgICAgICAgICAgICAgY291bnRNZW1iZXIoaSk7DQogICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJywnKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbW1hKCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcsJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRXh0cmEgY29tbWEuIiwgdG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ30nICYmICFvcHRpb24uZXM1KSB7DQogICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHRyYSBjb21tYS4iLCB0b2tlbik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYikgew0KICAgICAgICAgICAgICAgIGluZGVudCAtPSBvcHRpb24uaW5kZW50Ow0KICAgICAgICAgICAgICAgIGluZGVudGF0aW9uKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBhZHZhbmNlKCd9JywgdGhpcyk7DQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgfTsNCiAgICAgICAgeC5mdWQgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgdG8gc2VlIGEgc3RhdGVtZW50IGFuZCBpbnN0ZWFkIHNhdyBhIGJsb2NrLiIsIHRva2VuKTsNCiAgICAgICAgfTsNCiAgICB9KGRlbGltKCd7JykpKTsNCg0KICAgIHZhciB2YXJzdGF0ZW1lbnQgPSBzdG10KCd2YXInLCBmdW5jdGlvbiAocHJlZml4KSB7DQogICAgICAgIC8vIEphdmFTY3JpcHQgZG9lcyBub3QgaGF2ZSBibG9jayBzY29wZS4gSXQgb25seSBoYXMgZnVuY3Rpb24gc2NvcGUuIFNvLA0KICAgICAgICAvLyBkZWNsYXJpbmcgYSB2YXJpYWJsZSBpbiBhIGJsb2NrIGNhbiBoYXZlIHVuZXhwZWN0ZWQgY29uc2VxdWVuY2VzLg0KICAgICAgICB2YXIgaWQsIG5hbWUsIHZhbHVlOw0KDQogICAgICAgIGlmIChmdW5jdFsnKG9uZXZhciknXSAmJiBvcHRpb24ub25ldmFyKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJUb28gbWFueSB2YXIgc3RhdGVtZW50cy4iKTsNCiAgICAgICAgfSBlbHNlIGlmICghZnVuY3RbJyhnbG9iYWwpJ10pIHsNCiAgICAgICAgICAgIGZ1bmN0Wycob25ldmFyKSddID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmZpcnN0ID0gW107DQogICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgaWQgPSBpZGVudGlmaWVyKCk7DQogICAgICAgICAgICBpZiAoZnVuY3RbJyhnbG9iYWwpJ10gJiYgcHJlZGVmaW5lZFtpZF0gPT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiUmVkZWZpbml0aW9uIG9mICd7YX0nLiIsIHRva2VuLCBpZCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBhZGRsYWJlbChpZCwgJ3VudXNlZCcpOw0KICAgICAgICAgICAgaWYgKHByZWZpeCkgew0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbmFtZSA9IHRva2VuOw0KICAgICAgICAgICAgdGhpcy5maXJzdC5wdXNoKHRva2VuKTsNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICc9Jykgew0KICAgICAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgICAgIGFkdmFuY2UoJz0nKTsNCiAgICAgICAgICAgICAgICBub25hZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsNCiAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAndW5kZWZpbmVkJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGluaXRpYWxpemUgJ3thfScgdG8gJ3VuZGVmaW5lZCcuIiwgdG9rZW4sIGlkKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHBlZWsoMCkuaWQgPT09ICc9JyAmJiBuZXh0dG9rZW4uaWRlbnRpZmllcikgew0KICAgICAgICAgICAgICAgICAgICBlcnJvcigiVmFyaWFibGUge2F9IHdhcyBub3QgZGVjbGFyZWQgY29ycmVjdGx5LiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCBuZXh0dG9rZW4udmFsdWUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YWx1ZSA9IGV4cHJlc3Npb24oMCk7DQogICAgICAgICAgICAgICAgbmFtZS5maXJzdCA9IHZhbHVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJywnKSB7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjb21tYSgpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pOw0KICAgIHZhcnN0YXRlbWVudC5leHBzID0gdHJ1ZTsNCg0KICAgIGJsb2Nrc3RtdCgnZnVuY3Rpb24nLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIGlmIChpbmJsb2NrKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJGdW5jdGlvbiBkZWNsYXJhdGlvbnMgc2hvdWxkIG5vdCBiZSBwbGFjZWQgaW4gYmxvY2tzLiAiICsNCiAgICAgICAgICAgICAgICAiVXNlIGEgZnVuY3Rpb24gZXhwcmVzc2lvbiBvciBtb3ZlIHRoZSBzdGF0ZW1lbnQgdG8gdGhlIHRvcCBvZiAiICsNCiAgICAgICAgICAgICAgICAidGhlIG91dGVyIGZ1bmN0aW9uLiIsIHRva2VuKTsNCg0KICAgICAgICB9DQogICAgICAgIHZhciBpID0gaWRlbnRpZmllcigpOw0KICAgICAgICBhZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsNCiAgICAgICAgYWRkbGFiZWwoaSwgJ3VuY3Rpb24nKTsNCiAgICAgICAgZG9GdW5jdGlvbihpLCB0cnVlKTsNCiAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJygnICYmIG5leHR0b2tlbi5saW5lID09PSB0b2tlbi5saW5lKSB7DQogICAgICAgICAgICBlcnJvcigNCiJGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYXJlIG5vdCBpbnZvY2FibGUuIFdyYXAgdGhlIHdob2xlIGZ1bmN0aW9uIGludm9jYXRpb24gaW4gcGFyZW5zLiIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pOw0KDQogICAgcHJlZml4KCdmdW5jdGlvbicsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdmFyIGkgPSBvcHRpb25hbGlkZW50aWZpZXIoKTsNCiAgICAgICAgaWYgKGkpIHsNCiAgICAgICAgICAgIGFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgbm9uYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7DQogICAgICAgIH0NCiAgICAgICAgZG9GdW5jdGlvbihpKTsNCiAgICAgICAgaWYgKCFvcHRpb24ubG9vcGZ1bmMgJiYgZnVuY3RbJyhsb29wYWdlKSddKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJEb24ndCBtYWtlIGZ1bmN0aW9ucyB3aXRoaW4gYSBsb29wLiIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pOw0KDQogICAgYmxvY2tzdG10KCdpZicsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdmFyIHQgPSBuZXh0dG9rZW47DQogICAgICAgIGFkdmFuY2UoJygnKTsNCiAgICAgICAgbm9uYWRqYWNlbnQodGhpcywgdCk7DQogICAgICAgIG5vc3BhY2UoKTsNCiAgICAgICAgZXhwcmVzc2lvbigyMCk7DQogICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICc9Jykgew0KICAgICAgICAgICAgaWYgKCFvcHRpb24uYm9zcykNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYW5kIGluc3RlYWQgc2F3IGFuIGFzc2lnbm1lbnQuIik7DQogICAgICAgICAgICBhZHZhbmNlKCc9Jyk7DQogICAgICAgICAgICBleHByZXNzaW9uKDIwKTsNCiAgICAgICAgfQ0KICAgICAgICBhZHZhbmNlKCcpJywgdCk7DQogICAgICAgIG5vc3BhY2UocHJldnRva2VuLCB0b2tlbik7DQogICAgICAgIGJsb2NrKHRydWUsIHRydWUpOw0KICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnZWxzZScpIHsNCiAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgYWR2YW5jZSgnZWxzZScpOw0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ2lmJyB8fCBuZXh0dG9rZW4uaWQgPT09ICdzd2l0Y2gnKSB7DQogICAgICAgICAgICAgICAgc3RhdGVtZW50KHRydWUpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBibG9jayh0cnVlLCB0cnVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KTsNCg0KICAgIGJsb2Nrc3RtdCgndHJ5JywgZnVuY3Rpb24gKCkgew0KICAgICAgICB2YXIgYiwgZSwgczsNCg0KICAgICAgICBibG9jayhmYWxzZSk7DQogICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICdjYXRjaCcpIHsNCiAgICAgICAgICAgIGFkdmFuY2UoJ2NhdGNoJyk7DQogICAgICAgICAgICBub25hZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsNCiAgICAgICAgICAgIGFkdmFuY2UoJygnKTsNCiAgICAgICAgICAgIHMgPSBzY29wZTsNCiAgICAgICAgICAgIHNjb3BlID0gT2JqZWN0LmNyZWF0ZShzKTsNCiAgICAgICAgICAgIGUgPSBuZXh0dG9rZW4udmFsdWU7DQogICAgICAgICAgICBpZiAobmV4dHRva2VuLnR5cGUgIT09ICcoaWRlbnRpZmllciknKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiRXhwZWN0ZWQgYW4gaWRlbnRpZmllciBhbmQgaW5zdGVhZCBzYXcgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCBlKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgYWRkbGFiZWwoZSwgJ2V4Y2VwdGlvbicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYWR2YW5jZSgpOw0KICAgICAgICAgICAgYWR2YW5jZSgnKScpOw0KICAgICAgICAgICAgYmxvY2soZmFsc2UpOw0KICAgICAgICAgICAgYiA9IHRydWU7DQogICAgICAgICAgICBzY29wZSA9IHM7DQogICAgICAgIH0NCiAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ2ZpbmFsbHknKSB7DQogICAgICAgICAgICBhZHZhbmNlKCdmaW5hbGx5Jyk7DQogICAgICAgICAgICBibG9jayhmYWxzZSk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0gZWxzZSBpZiAoIWIpIHsNCiAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCAne2F9JyBhbmQgaW5zdGVhZCBzYXcgJ3tifScuIiwNCiAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCAnY2F0Y2gnLCBuZXh0dG9rZW4udmFsdWUpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pOw0KDQogICAgYmxvY2tzdG10KCd3aGlsZScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdmFyIHQgPSBuZXh0dG9rZW47DQogICAgICAgIGZ1bmN0WycoYnJlYWthZ2UpJ10gKz0gMTsNCiAgICAgICAgZnVuY3RbJyhsb29wYWdlKSddICs9IDE7DQogICAgICAgIGFkdmFuY2UoJygnKTsNCiAgICAgICAgbm9uYWRqYWNlbnQodGhpcywgdCk7DQogICAgICAgIG5vc3BhY2UoKTsNCiAgICAgICAgZXhwcmVzc2lvbigyMCk7DQogICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICc9Jykgew0KICAgICAgICAgICAgaWYgKCFvcHRpb24uYm9zcykNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYW5kIGluc3RlYWQgc2F3IGFuIGFzc2lnbm1lbnQuIik7DQogICAgICAgICAgICBhZHZhbmNlKCc9Jyk7DQogICAgICAgICAgICBleHByZXNzaW9uKDIwKTsNCiAgICAgICAgfQ0KICAgICAgICBhZHZhbmNlKCcpJywgdCk7DQogICAgICAgIG5vc3BhY2UocHJldnRva2VuLCB0b2tlbik7DQogICAgICAgIGJsb2NrKHRydWUsIHRydWUpOw0KICAgICAgICBmdW5jdFsnKGJyZWFrYWdlKSddIC09IDE7DQogICAgICAgIGZ1bmN0WycobG9vcGFnZSknXSAtPSAxOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KS5sYWJlbGxlZCA9IHRydWU7DQoNCiAgICByZXNlcnZlKCd3aXRoJyk7DQoNCiAgICBibG9ja3N0bXQoJ3N3aXRjaCcsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdmFyIHQgPSBuZXh0dG9rZW4sDQogICAgICAgICAgICBnID0gZmFsc2U7DQogICAgICAgIGZ1bmN0WycoYnJlYWthZ2UpJ10gKz0gMTsNCiAgICAgICAgYWR2YW5jZSgnKCcpOw0KICAgICAgICBub25hZGphY2VudCh0aGlzLCB0KTsNCiAgICAgICAgbm9zcGFjZSgpOw0KICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGV4cHJlc3Npb24oMjApOw0KICAgICAgICBhZHZhbmNlKCcpJywgdCk7DQogICAgICAgIG5vc3BhY2UocHJldnRva2VuLCB0b2tlbik7DQogICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICB0ID0gbmV4dHRva2VuOw0KICAgICAgICBhZHZhbmNlKCd7Jyk7DQogICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICBpbmRlbnQgKz0gb3B0aW9uLmluZGVudDsNCiAgICAgICAgdGhpcy5jYXNlcyA9IFtdOw0KICAgICAgICBmb3IgKDs7KSB7DQogICAgICAgICAgICBzd2l0Y2ggKG5leHR0b2tlbi5pZCkgew0KICAgICAgICAgICAgY2FzZSAnY2FzZSc6DQogICAgICAgICAgICAgICAgc3dpdGNoIChmdW5jdFsnKHZlcmIpJ10pIHsNCiAgICAgICAgICAgICAgICBjYXNlICdicmVhayc6DQogICAgICAgICAgICAgICAgY2FzZSAnY2FzZSc6DQogICAgICAgICAgICAgICAgY2FzZSAnY29udGludWUnOg0KICAgICAgICAgICAgICAgIGNhc2UgJ3JldHVybic6DQogICAgICAgICAgICAgICAgY2FzZSAnc3dpdGNoJzoNCiAgICAgICAgICAgICAgICBjYXNlICd0aHJvdyc6DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgIC8vIFlvdSBjYW4gdGVsbCBKU0hpbnQgdGhhdCB5b3UgZG9uJ3QgdXNlIGJyZWFrIGludGVudGlvbmFsbHkgYnkNCiAgICAgICAgICAgICAgICAgICAgLy8gYWRkaW5nIGEgY29tbWVudCAvKiBmYWxscyB0aHJvdWdoICovIG9uIGEgbGluZSBqdXN0IGJlZm9yZQ0KICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV4dCBgY2FzZWAuDQogICAgICAgICAgICAgICAgICAgIGlmICghZnQudGVzdChsaW5lc1tuZXh0dG9rZW4ubGluZSAtIDJdKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYSAnYnJlYWsnIHN0YXRlbWVudCBiZWZvcmUgJ2Nhc2UnLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGluZGVudGF0aW9uKC1vcHRpb24uaW5kZW50KTsNCiAgICAgICAgICAgICAgICBhZHZhbmNlKCdjYXNlJyk7DQogICAgICAgICAgICAgICAgdGhpcy5jYXNlcy5wdXNoKGV4cHJlc3Npb24oMjApKTsNCiAgICAgICAgICAgICAgICBnID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBhZHZhbmNlKCc6Jyk7DQogICAgICAgICAgICAgICAgZnVuY3RbJyh2ZXJiKSddID0gJ2Nhc2UnOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnZGVmYXVsdCc6DQogICAgICAgICAgICAgICAgc3dpdGNoIChmdW5jdFsnKHZlcmIpJ10pIHsNCiAgICAgICAgICAgICAgICBjYXNlICdicmVhayc6DQogICAgICAgICAgICAgICAgY2FzZSAnY29udGludWUnOg0KICAgICAgICAgICAgICAgIGNhc2UgJ3JldHVybic6DQogICAgICAgICAgICAgICAgY2FzZSAndGhyb3cnOg0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICBpZiAoIWZ0LnRlc3QobGluZXNbbmV4dHRva2VuLmxpbmUgLSAyXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGEgJ2JyZWFrJyBzdGF0ZW1lbnQgYmVmb3JlICdkZWZhdWx0Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbigtb3B0aW9uLmluZGVudCk7DQogICAgICAgICAgICAgICAgYWR2YW5jZSgnZGVmYXVsdCcpOw0KICAgICAgICAgICAgICAgIGcgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGFkdmFuY2UoJzonKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJ30nOg0KICAgICAgICAgICAgICAgIGluZGVudCAtPSBvcHRpb24uaW5kZW50Ow0KICAgICAgICAgICAgICAgIGluZGVudGF0aW9uKCk7DQogICAgICAgICAgICAgICAgYWR2YW5jZSgnfScsIHQpOw0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhc2VzLmxlbmd0aCA9PT0gMSB8fCB0aGlzLmNvbmRpdGlvbi5pZCA9PT0gJ3RydWUnIHx8DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmRpdGlvbi5pZCA9PT0gJ2ZhbHNlJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJUaGlzICdzd2l0Y2gnIHNob3VsZCBiZSBhbiAnaWYnLiIsIHRoaXMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBmdW5jdFsnKGJyZWFrYWdlKSddIC09IDE7DQogICAgICAgICAgICAgICAgZnVuY3RbJyh2ZXJiKSddID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIGNhc2UgJyhlbmQpJzoNCiAgICAgICAgICAgICAgICBlcnJvcigiTWlzc2luZyAne2F9Jy4iLCBuZXh0dG9rZW4sICd9Jyk7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBpZiAoZykgew0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLmlkKSB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJywnOg0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkVhY2ggdmFsdWUgc2hvdWxkIGhhdmUgaXRzIG93biBjYXNlIGxhYmVsLiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICc6JzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudHMoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIk1pc3NpbmcgJzonIG9uIGEgY2FzZSBjbGF1c2UuIiwgdG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkICd7YX0nIGFuZCBpbnN0ZWFkIHNhdyAne2J9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCAnY2FzZScsIG5leHR0b2tlbi52YWx1ZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSkubGFiZWxsZWQgPSB0cnVlOw0KDQogICAgc3RtdCgnZGVidWdnZXInLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIGlmICghb3B0aW9uLmRlYnVnKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJBbGwgJ2RlYnVnZ2VyJyBzdGF0ZW1lbnRzIHNob3VsZCBiZSByZW1vdmVkLiIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pLmV4cHMgPSB0cnVlOw0KDQogICAgKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdmFyIHggPSBzdG10KCdkbycsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGZ1bmN0WycoYnJlYWthZ2UpJ10gKz0gMTsNCiAgICAgICAgICAgIGZ1bmN0WycobG9vcGFnZSknXSArPSAxOw0KICAgICAgICAgICAgdGhpcy5maXJzdCA9IGJsb2NrKHRydWUpOw0KICAgICAgICAgICAgYWR2YW5jZSgnd2hpbGUnKTsNCiAgICAgICAgICAgIHZhciB0ID0gbmV4dHRva2VuOw0KICAgICAgICAgICAgbm9uYWRqYWNlbnQodG9rZW4sIHQpOw0KICAgICAgICAgICAgYWR2YW5jZSgnKCcpOw0KICAgICAgICAgICAgbm9zcGFjZSgpOw0KICAgICAgICAgICAgZXhwcmVzc2lvbigyMCk7DQogICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnPScpIHsNCiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbi5ib3NzKQ0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYW5kIGluc3RlYWQgc2F3IGFuIGFzc2lnbm1lbnQuIik7DQogICAgICAgICAgICAgICAgYWR2YW5jZSgnPScpOw0KICAgICAgICAgICAgICAgIGV4cHJlc3Npb24oMjApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYWR2YW5jZSgnKScsIHQpOw0KICAgICAgICAgICAgbm9zcGFjZShwcmV2dG9rZW4sIHRva2VuKTsNCiAgICAgICAgICAgIGZ1bmN0WycoYnJlYWthZ2UpJ10gLT0gMTsNCiAgICAgICAgICAgIGZ1bmN0WycobG9vcGFnZSknXSAtPSAxOw0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICAgIH0pOw0KICAgICAgICB4LmxhYmVsbGVkID0gdHJ1ZTsNCiAgICAgICAgeC5leHBzID0gdHJ1ZTsNCiAgICB9KCkpOw0KDQogICAgYmxvY2tzdG10KCdmb3InLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciBzLCB0ID0gbmV4dHRva2VuOw0KICAgICAgICBmdW5jdFsnKGJyZWFrYWdlKSddICs9IDE7DQogICAgICAgIGZ1bmN0WycobG9vcGFnZSknXSArPSAxOw0KICAgICAgICBhZHZhbmNlKCcoJyk7DQogICAgICAgIG5vbmFkamFjZW50KHRoaXMsIHQpOw0KICAgICAgICBub3NwYWNlKCk7DQogICAgICAgIGlmIChwZWVrKG5leHR0b2tlbi5pZCA9PT0gJ3ZhcicgPyAxIDogMCkuaWQgPT09ICdpbicpIHsNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICd2YXInKSB7DQogICAgICAgICAgICAgICAgYWR2YW5jZSgndmFyJyk7DQogICAgICAgICAgICAgICAgdmFyc3RhdGVtZW50LmZ1ZC5jYWxsKHZhcnN0YXRlbWVudCwgdHJ1ZSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHN3aXRjaCAoZnVuY3RbbmV4dHRva2VuLnZhbHVlXSkgew0KICAgICAgICAgICAgICAgIGNhc2UgJ3VudXNlZCc6DQogICAgICAgICAgICAgICAgICAgIGZ1bmN0W25leHR0b2tlbi52YWx1ZV0gPSAndmFyJzsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAndmFyJzoNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiQmFkIGZvciBpbiB2YXJpYWJsZSAne2F9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgbmV4dHRva2VuLnZhbHVlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYWR2YW5jZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYWR2YW5jZSgnaW4nKTsNCiAgICAgICAgICAgIGV4cHJlc3Npb24oMjApOw0KICAgICAgICAgICAgYWR2YW5jZSgnKScsIHQpOw0KICAgICAgICAgICAgcyA9IGJsb2NrKHRydWUsIHRydWUpOw0KICAgICAgICAgICAgaWYgKG9wdGlvbi5mb3JpbiAmJiAocy5sZW5ndGggPiAxIHx8IHR5cGVvZiBzWzBdICE9PSAnb2JqZWN0JyB8fA0KICAgICAgICAgICAgICAgICAgICBzWzBdLnZhbHVlICE9PSAnaWYnKSkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIlRoZSBib2R5IG9mIGEgZm9yIGluIHNob3VsZCBiZSB3cmFwcGVkIGluIGFuIGlmIHN0YXRlbWVudCB0byBmaWx0ZXIgIiArDQogICAgICAgICAgICAgICAgICAgICAgICAidW53YW50ZWQgcHJvcGVydGllcyBmcm9tIHRoZSBwcm90b3R5cGUuIiwgdGhpcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmdW5jdFsnKGJyZWFrYWdlKSddIC09IDE7DQogICAgICAgICAgICBmdW5jdFsnKGxvb3BhZ2UpJ10gLT0gMTsNCiAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJzsnKSB7DQogICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ3ZhcicpIHsNCiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgndmFyJyk7DQogICAgICAgICAgICAgICAgICAgIHZhcnN0YXRlbWVudC5mdWQuY2FsbCh2YXJzdGF0ZW1lbnQpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24oMCwgJ2ZvcicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJywnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBjb21tYSgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbm9saW5lYnJlYWsodG9rZW4pOw0KICAgICAgICAgICAgYWR2YW5jZSgnOycpOw0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJzsnKSB7DQogICAgICAgICAgICAgICAgZXhwcmVzc2lvbigyMCk7DQogICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJz0nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9uLmJvc3MpDQogICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYW5kIGluc3RlYWQgc2F3IGFuIGFzc2lnbm1lbnQuIik7DQogICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoJz0nKTsNCiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbigyMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbm9saW5lYnJlYWsodG9rZW4pOw0KICAgICAgICAgICAgYWR2YW5jZSgnOycpOw0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJzsnKSB7DQogICAgICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkICd7YX0nIGFuZCBpbnN0ZWFkIHNhdyAne2J9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCAnKScsICc7Jyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnKScpIHsNCiAgICAgICAgICAgICAgICBmb3IgKDs7KSB7DQogICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24oMCwgJ2ZvcicpOw0KICAgICAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnLCcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbW1hKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYWR2YW5jZSgnKScsIHQpOw0KICAgICAgICAgICAgbm9zcGFjZShwcmV2dG9rZW4sIHRva2VuKTsNCiAgICAgICAgICAgIGJsb2NrKHRydWUsIHRydWUpOw0KICAgICAgICAgICAgZnVuY3RbJyhicmVha2FnZSknXSAtPSAxOw0KICAgICAgICAgICAgZnVuY3RbJyhsb29wYWdlKSddIC09IDE7DQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgfQ0KICAgIH0pLmxhYmVsbGVkID0gdHJ1ZTsNCg0KDQogICAgc3RtdCgnYnJlYWsnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciB2ID0gbmV4dHRva2VuLnZhbHVlOw0KICAgICAgICBpZiAoZnVuY3RbJyhicmVha2FnZSknXSA9PT0gMCkgew0KICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCAne2F9Jy4iLCBuZXh0dG9rZW4sIHRoaXMudmFsdWUpOw0KICAgICAgICB9DQogICAgICAgIG5vbGluZWJyZWFrKHRoaXMpOw0KICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnOycpIHsNCiAgICAgICAgICAgIGlmICh0b2tlbi5saW5lID09PSBuZXh0dG9rZW4ubGluZSkgew0KICAgICAgICAgICAgICAgIGlmIChmdW5jdFt2XSAhPT0gJ2xhYmVsJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBub3QgYSBzdGF0ZW1lbnQgbGFiZWwuIiwgbmV4dHRva2VuLCB2KTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjb3BlW3ZdICE9PSBmdW5jdCkgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBvdXQgb2Ygc2NvcGUuIiwgbmV4dHRva2VuLCB2KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5maXJzdCA9IG5leHR0b2tlbjsNCiAgICAgICAgICAgICAgICBhZHZhbmNlKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmVhY2hhYmxlKCdicmVhaycpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KS5leHBzID0gdHJ1ZTsNCg0KDQogICAgc3RtdCgnY29udGludWUnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciB2ID0gbmV4dHRva2VuLnZhbHVlOw0KICAgICAgICBpZiAoZnVuY3RbJyhicmVha2FnZSknXSA9PT0gMCkgew0KICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCAne2F9Jy4iLCBuZXh0dG9rZW4sIHRoaXMudmFsdWUpOw0KICAgICAgICB9DQogICAgICAgIG5vbGluZWJyZWFrKHRoaXMpOw0KICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnOycpIHsNCiAgICAgICAgICAgIGlmICh0b2tlbi5saW5lID09PSBuZXh0dG9rZW4ubGluZSkgew0KICAgICAgICAgICAgICAgIGlmIChmdW5jdFt2XSAhPT0gJ2xhYmVsJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBub3QgYSBzdGF0ZW1lbnQgbGFiZWwuIiwgbmV4dHRva2VuLCB2KTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjb3BlW3ZdICE9PSBmdW5jdCkgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBvdXQgb2Ygc2NvcGUuIiwgbmV4dHRva2VuLCB2KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5maXJzdCA9IG5leHR0b2tlbjsNCiAgICAgICAgICAgICAgICBhZHZhbmNlKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAoIWZ1bmN0WycobG9vcGFnZSknXSkgew0KICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCAne2F9Jy4iLCBuZXh0dG9rZW4sIHRoaXMudmFsdWUpOw0KICAgICAgICB9DQogICAgICAgIHJlYWNoYWJsZSgnY29udGludWUnKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSkuZXhwcyA9IHRydWU7DQoNCg0KICAgIHN0bXQoJ3JldHVybicsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgbm9saW5lYnJlYWsodGhpcyk7DQogICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcocmVnZXhwKScpIHsNCiAgICAgICAgICAgIHdhcm5pbmcoIldyYXAgdGhlIC9yZWdleHAvIGxpdGVyYWwgaW4gcGFyZW5zIHRvIGRpc2FtYmlndWF0ZSB0aGUgc2xhc2ggb3BlcmF0b3IuIik7DQogICAgICAgIH0NCiAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJzsnICYmICFuZXh0dG9rZW4ucmVhY2gpIHsNCiAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgdGhpcy5maXJzdCA9IGV4cHJlc3Npb24oMjApOw0KICAgICAgICB9DQogICAgICAgIHJlYWNoYWJsZSgncmV0dXJuJyk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pLmV4cHMgPSB0cnVlOw0KDQoNCiAgICBzdG10KCd0aHJvdycsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgbm9saW5lYnJlYWsodGhpcyk7DQogICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICB0aGlzLmZpcnN0ID0gZXhwcmVzc2lvbigyMCk7DQogICAgICAgIHJlYWNoYWJsZSgndGhyb3cnKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSkuZXhwcyA9IHRydWU7DQoNCi8vICBTdXBlcmZsdW91cyByZXNlcnZlZCB3b3Jkcw0KDQogICAgcmVzZXJ2ZSgnY2xhc3MnKTsNCiAgICByZXNlcnZlKCdjb25zdCcpOw0KICAgIHJlc2VydmUoJ2VudW0nKTsNCiAgICByZXNlcnZlKCdleHBvcnQnKTsNCiAgICByZXNlcnZlKCdleHRlbmRzJyk7DQogICAgcmVzZXJ2ZSgnaW1wb3J0Jyk7DQogICAgcmVzZXJ2ZSgnc3VwZXInKTsNCg0KICAgIHJlc2VydmUoJ2xldCcpOw0KICAgIHJlc2VydmUoJ3lpZWxkJyk7DQogICAgcmVzZXJ2ZSgnaW1wbGVtZW50cycpOw0KICAgIHJlc2VydmUoJ2ludGVyZmFjZScpOw0KICAgIHJlc2VydmUoJ3BhY2thZ2UnKTsNCiAgICByZXNlcnZlKCdwcml2YXRlJyk7DQogICAgcmVzZXJ2ZSgncHJvdGVjdGVkJyk7DQogICAgcmVzZXJ2ZSgncHVibGljJyk7DQogICAgcmVzZXJ2ZSgnc3RhdGljJyk7DQoNCg0KLy8gUGFyc2UgSlNPTg0KDQogICAgZnVuY3Rpb24ganNvblZhbHVlKCkgew0KDQogICAgICAgIGZ1bmN0aW9uIGpzb25PYmplY3QoKSB7DQogICAgICAgICAgICB2YXIgbyA9IHt9LCB0ID0gbmV4dHRva2VuOw0KICAgICAgICAgICAgYWR2YW5jZSgneycpOw0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgZm9yICg7Oykgew0KICAgICAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnKGVuZCknKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiTWlzc2luZyAnfScgdG8gbWF0Y2ggJ3snIGZyb20gbGluZSB7YX0uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCB0LmxpbmUpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ30nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJVbmV4cGVjdGVkIGNvbW1hLiIsIHRva2VuKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHR0b2tlbi5pZCA9PT0gJywnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiVW5leHBlY3RlZCBjb21tYS4iLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHR0b2tlbi5pZCAhPT0gJyhzdHJpbmcpJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRXhwZWN0ZWQgYSBzdHJpbmcgYW5kIGluc3RlYWQgc2F3IHthfS4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4sIG5leHR0b2tlbi52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKG9bbmV4dHRva2VuLnZhbHVlXSA9PT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRHVwbGljYXRlIGtleSAne2F9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4sIG5leHR0b2tlbi52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG5leHR0b2tlbi52YWx1ZSA9PT0gJ19fcHJvdG9fXycgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgICFvcHRpb24ucHJvdG8pIHx8IChuZXh0dG9rZW4udmFsdWUgPT09ICdfX2l0ZXJhdG9yX18nICYmDQogICAgICAgICAgICAgICAgICAgICAgICAhb3B0aW9uLml0ZXJhdG9yKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIlRoZSAne2F9JyBrZXkgbWF5IHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgbmV4dHRva2VuLnZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG9bbmV4dHRva2VuLnZhbHVlXSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgpOw0KICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCc6Jyk7DQogICAgICAgICAgICAgICAgICAgIGpzb25WYWx1ZSgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnLCcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoJywnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBhZHZhbmNlKCd9Jyk7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBqc29uQXJyYXkoKSB7DQogICAgICAgICAgICB2YXIgdCA9IG5leHR0b2tlbjsNCiAgICAgICAgICAgIGFkdmFuY2UoJ1snKTsNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgIT09ICddJykgew0KICAgICAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJyhlbmQpJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIk1pc3NpbmcgJ10nIHRvIG1hdGNoICdbJyBmcm9tIGxpbmUge2F9LiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgdC5saW5lKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0dG9rZW4uaWQgPT09ICddJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCBjb21tYS4iLCB0b2tlbik7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0dG9rZW4uaWQgPT09ICcsJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIlVuZXhwZWN0ZWQgY29tbWEuIiwgbmV4dHRva2VuKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBqc29uVmFsdWUoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJywnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCcsJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYWR2YW5jZSgnXScpOw0KICAgICAgICB9DQoNCiAgICAgICAgc3dpdGNoIChuZXh0dG9rZW4uaWQpIHsNCiAgICAgICAgY2FzZSAneyc6DQogICAgICAgICAgICBqc29uT2JqZWN0KCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnWyc6DQogICAgICAgICAgICBqc29uQXJyYXkoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICd0cnVlJzoNCiAgICAgICAgY2FzZSAnZmFsc2UnOg0KICAgICAgICBjYXNlICdudWxsJzoNCiAgICAgICAgY2FzZSAnKG51bWJlciknOg0KICAgICAgICBjYXNlICcoc3RyaW5nKSc6DQogICAgICAgICAgICBhZHZhbmNlKCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnLSc6DQogICAgICAgICAgICBhZHZhbmNlKCctJyk7DQogICAgICAgICAgICBpZiAodG9rZW4uY2hhcmFjdGVyICE9PSBuZXh0dG9rZW4uZnJvbSkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgJy0nLiIsIHRva2VuKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgYWR2YW5jZSgnKG51bWJlciknKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkIGEgSlNPTiB2YWx1ZS4iLCBuZXh0dG9rZW4pOw0KICAgICAgICB9DQogICAgfQ0KDQoNCi8vIFRoZSBhY3R1YWwgSlNISU5UIGZ1bmN0aW9uIGl0c2VsZi4NCg0KICAgIHZhciBpdHNlbGYgPSBmdW5jdGlvbiAocywgbywgZykgew0KICAgICAgICB2YXIgYSwgaSwgazsNCiAgICAgICAgSlNISU5ULmVycm9ycyA9IFtdOw0KICAgICAgICBwcmVkZWZpbmVkID0gT2JqZWN0LmNyZWF0ZShzdGFuZGFyZCk7DQogICAgICAgIGNvbWJpbmUocHJlZGVmaW5lZCwgZyB8fCB7fSk7DQogICAgICAgIGlmIChvKSB7DQogICAgICAgICAgICBhID0gby5wcmVkZWY7DQogICAgICAgICAgICBpZiAoYSkgew0KICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwcmVkZWZpbmVkW2FbaV1dID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSB7DQogICAgICAgICAgICAgICAgICAgIGsgPSBPYmplY3Qua2V5cyhhKTsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGsubGVuZ3RoOyBpICs9IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlZmluZWRba1tpXV0gPSAhIWFba1tpXV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvcHRpb24gPSBvOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgb3B0aW9uID0ge307DQogICAgICAgIH0NCiAgICAgICAgb3B0aW9uLmluZGVudCA9IG9wdGlvbi5pbmRlbnQgfHwgNDsNCiAgICAgICAgb3B0aW9uLm1heGVyciA9IG9wdGlvbi5tYXhlcnIgfHwgNTA7DQoNCiAgICAgICAgdGFiID0gJyc7DQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBvcHRpb24uaW5kZW50OyBpICs9IDEpIHsNCiAgICAgICAgICAgIHRhYiArPSAnICc7DQogICAgICAgIH0NCiAgICAgICAgaW5kZW50ID0gMTsNCiAgICAgICAgZ2xvYmFsID0gT2JqZWN0LmNyZWF0ZShwcmVkZWZpbmVkKTsNCiAgICAgICAgc2NvcGUgPSBnbG9iYWw7DQogICAgICAgIGZ1bmN0ID0gew0KICAgICAgICAgICAgJyhnbG9iYWwpJzogdHJ1ZSwNCiAgICAgICAgICAgICcobmFtZSknOiAnKGdsb2JhbCknLA0KICAgICAgICAgICAgJyhzY29wZSknOiBzY29wZSwNCiAgICAgICAgICAgICcoYnJlYWthZ2UpJzogMCwNCiAgICAgICAgICAgICcobG9vcGFnZSknOiAwDQogICAgICAgIH07DQogICAgICAgIGZ1bmN0aW9ucyA9IFtmdW5jdF07DQogICAgICAgIHVybHMgPSBbXTsNCiAgICAgICAgc3JjID0gZmFsc2U7DQogICAgICAgIHN0YWNrID0gbnVsbDsNCiAgICAgICAgbWVtYmVyID0ge307DQogICAgICAgIG1lbWJlcnNPbmx5ID0gbnVsbDsNCiAgICAgICAgaW1wbGllZCA9IHt9Ow0KICAgICAgICBpbmJsb2NrID0gZmFsc2U7DQogICAgICAgIGxvb2thaGVhZCA9IFtdOw0KICAgICAgICBqc29ubW9kZSA9IGZhbHNlOw0KICAgICAgICB3YXJuaW5ncyA9IDA7DQogICAgICAgIGxleC5pbml0KHMpOw0KICAgICAgICBwcmVyZWcgPSB0cnVlOw0KICAgICAgICBzdHJpY3RfbW9kZSA9IGZhbHNlOw0KDQogICAgICAgIHByZXZ0b2tlbiA9IHRva2VuID0gbmV4dHRva2VuID0gc3ludGF4WycoYmVnaW4pJ107DQogICAgICAgIGFzc3VtZSgpOw0KDQogICAgICAgIHRyeSB7DQogICAgICAgICAgICBhZHZhbmNlKCk7DQogICAgICAgICAgICBzd2l0Y2ggKG5leHR0b2tlbi5pZCkgew0KICAgICAgICAgICAgY2FzZSAneyc6DQogICAgICAgICAgICBjYXNlICdbJzoNCiAgICAgICAgICAgICAgICBvcHRpb24ubGF4YnJlYWsgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGpzb25tb2RlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBqc29uVmFsdWUoKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi52YWx1ZSA9PT0gJ3VzZSBzdHJpY3QnKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9uLmdsb2JhbHN0cmljdCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVzZSB0aGUgZnVuY3Rpb24gZm9ybSBvZiBcInVzZSBzdHJpY3RcIi4iKTsNCiAgICAgICAgICAgICAgICAgICAgdXNlX3N0cmljdCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBzdGF0ZW1lbnRzKCdsaWInKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGFkdmFuY2UoJyhlbmQpJyk7DQogICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgIGlmIChlKSB7DQogICAgICAgICAgICAgICAgSlNISU5ULmVycm9ycy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgcmVhc29uICAgIDogZS5tZXNzYWdlLA0KICAgICAgICAgICAgICAgICAgICBsaW5lICAgICAgOiBlLmxpbmUgfHwgbmV4dHRva2VuLmxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA6IGUuY2hhcmFjdGVyIHx8IG5leHR0b2tlbi5mcm9tDQogICAgICAgICAgICAgICAgfSwgbnVsbCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIEpTSElOVC5lcnJvcnMubGVuZ3RoID09PSAwOw0KICAgIH07DQoNCg0KLy8gRGF0YSBzdW1tYXJ5Lg0KDQogICAgaXRzZWxmLmRhdGEgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICAgICAgdmFyIGRhdGEgPSB7ZnVuY3Rpb25zOiBbXX0sIGZ1LCBnbG9iYWxzLCBpbXBsaWVkcyA9IFtdLCBmLCBpLCBqLA0KICAgICAgICAgICAgbWVtYmVycyA9IFtdLCBuLCB1bnVzZWQgPSBbXSwgdjsNCiAgICAgICAgaWYgKGl0c2VsZi5lcnJvcnMubGVuZ3RoKSB7DQogICAgICAgICAgICBkYXRhLmVycm9ycyA9IGl0c2VsZi5lcnJvcnM7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoanNvbm1vZGUpIHsNCiAgICAgICAgICAgIGRhdGEuanNvbiA9IHRydWU7DQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKG4gaW4gaW1wbGllZCkgew0KICAgICAgICAgICAgaWYgKGlzX293bihpbXBsaWVkLCBuKSkgew0KICAgICAgICAgICAgICAgIGltcGxpZWRzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICBuYW1lOiBuLA0KICAgICAgICAgICAgICAgICAgICBsaW5lOiBpbXBsaWVkW25dDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKGltcGxpZWRzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIGRhdGEuaW1wbGllZHMgPSBpbXBsaWVkczsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh1cmxzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIGRhdGEudXJscyA9IHVybHM7DQogICAgICAgIH0NCg0KICAgICAgICBnbG9iYWxzID0gT2JqZWN0LmtleXMoc2NvcGUpOw0KICAgICAgICBpZiAoZ2xvYmFscy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICBkYXRhLmdsb2JhbHMgPSBnbG9iYWxzOw0KICAgICAgICB9DQoNCiAgICAgICAgZm9yIChpID0gMTsgaSA8IGZ1bmN0aW9ucy5sZW5ndGg7IGkgKz0gMSkgew0KICAgICAgICAgICAgZiA9IGZ1bmN0aW9uc1tpXTsNCiAgICAgICAgICAgIGZ1ID0ge307DQogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZnVuY3Rpb25pY2l0eS5sZW5ndGg7IGogKz0gMSkgew0KICAgICAgICAgICAgICAgIGZ1W2Z1bmN0aW9uaWNpdHlbal1dID0gW107DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKG4gaW4gZikgew0KICAgICAgICAgICAgICAgIGlmIChpc19vd24oZiwgbikgJiYgbi5jaGFyQXQoMCkgIT09ICcoJykgew0KICAgICAgICAgICAgICAgICAgICB2ID0gZltuXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09ICd1bmN0aW9uJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdiA9ICd1bnVzZWQnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZ1W3ZdKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZnVbdl0ucHVzaChuKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID09PSAndW51c2VkJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudXNlZC5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogZlsnKGxpbmUpJ10sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbic6IGZbJyhuYW1lKSddDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZnVuY3Rpb25pY2l0eS5sZW5ndGg7IGogKz0gMSkgew0KICAgICAgICAgICAgICAgIGlmIChmdVtmdW5jdGlvbmljaXR5W2pdXS5sZW5ndGggPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGZ1W2Z1bmN0aW9uaWNpdHlbal1dOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZ1Lm5hbWUgPSBmWycobmFtZSknXTsNCiAgICAgICAgICAgIGZ1LnBhcmFtID0gZlsnKHBhcmFtcyknXTsNCiAgICAgICAgICAgIGZ1LmxpbmUgPSBmWycobGluZSknXTsNCiAgICAgICAgICAgIGZ1Lmxhc3QgPSBmWycobGFzdCknXTsNCiAgICAgICAgICAgIGRhdGEuZnVuY3Rpb25zLnB1c2goZnUpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHVudXNlZC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICBkYXRhLnVudXNlZCA9IHVudXNlZDsNCiAgICAgICAgfQ0KDQogICAgICAgIG1lbWJlcnMgPSBbXTsNCiAgICAgICAgZm9yIChuIGluIG1lbWJlcikgew0KICAgICAgICAgICAgaWYgKHR5cGVvZiBtZW1iZXJbbl0gPT09ICdudW1iZXInKSB7DQogICAgICAgICAgICAgICAgZGF0YS5tZW1iZXIgPSBtZW1iZXI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gZGF0YTsNCiAgICB9Ow0KDQogICAgaXRzZWxmLnJlcG9ydCA9IGZ1bmN0aW9uIChvcHRpb24pIHsNCiAgICAgICAgdmFyIGRhdGEgPSBpdHNlbGYuZGF0YSgpOw0KDQogICAgICAgIHZhciBhID0gW10sIGMsIGUsIGVyciwgZiwgaSwgaywgbCwgbSA9ICcnLCBuLCBvID0gW10sIHM7DQoNCiAgICAgICAgZnVuY3Rpb24gZGV0YWlsKGgsIGFycmF5KSB7DQogICAgICAgICAgICB2YXIgYiwgaSwgc2luZ3VsYXJpdHk7DQogICAgICAgICAgICBpZiAoYXJyYXkpIHsNCiAgICAgICAgICAgICAgICBvLnB1c2goJzxkaXY+PGk+JyArIGggKyAnPC9pPiAnKTsNCiAgICAgICAgICAgICAgICBhcnJheSA9IGFycmF5LnNvcnQoKTsNCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICs9IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldICE9PSBzaW5ndWxhcml0eSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXJpdHkgPSBhcnJheVtpXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG8ucHVzaCgoYiA/ICcsICcgOiAnJykgKyBzaW5ndWxhcml0eSk7DQogICAgICAgICAgICAgICAgICAgICAgICBiID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBvLnB1c2goJzwvZGl2PicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCg0KICAgICAgICBpZiAoZGF0YS5lcnJvcnMgfHwgZGF0YS5pbXBsaWVkcyB8fCBkYXRhLnVudXNlZCkgew0KICAgICAgICAgICAgZXJyID0gdHJ1ZTsNCiAgICAgICAgICAgIG8ucHVzaCgnPGRpdiBpZD1lcnJvcnM+PGk+RXJyb3I6PC9pPicpOw0KICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JzKSB7DQogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGEuZXJyb3JzLmxlbmd0aDsgaSArPSAxKSB7DQogICAgICAgICAgICAgICAgICAgIGMgPSBkYXRhLmVycm9yc1tpXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBjLmV2aWRlbmNlIHx8ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgby5wdXNoKCc8cD5Qcm9ibGVtJyArIChpc0Zpbml0ZShjLmxpbmUpID8gJyBhdCBsaW5lICcgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmxpbmUgKyAnIGNoYXJhY3RlciAnICsgYy5jaGFyYWN0ZXIgOiAnJykgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOiAnICsgYy5yZWFzb24uZW50aXR5aWZ5KCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9wPjxwIGNsYXNzPWV2aWRlbmNlPicgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZSAmJiAoZS5sZW5ndGggPiA4MCA/IGUuc2xpY2UoMCwgNzcpICsgJy4uLicgOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKS5lbnRpdHlpZnkoKSkgKyAnPC9wPicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoZGF0YS5pbXBsaWVkcykgew0KICAgICAgICAgICAgICAgIHMgPSBbXTsNCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YS5pbXBsaWVkcy5sZW5ndGg7IGkgKz0gMSkgew0KICAgICAgICAgICAgICAgICAgICBzW2ldID0gJzxjb2RlPicgKyBkYXRhLmltcGxpZWRzW2ldLm5hbWUgKyAnPC9jb2RlPiZuYnNwOzxpPicgKw0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pbXBsaWVkc1tpXS5saW5lICsgJzwvaT4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBvLnB1c2goJzxwPjxpPkltcGxpZWQgZ2xvYmFsOjwvaT4gJyArIHMuam9pbignLCAnKSArICc8L3A+Jyk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChkYXRhLnVudXNlZCkgew0KICAgICAgICAgICAgICAgIHMgPSBbXTsNCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YS51bnVzZWQubGVuZ3RoOyBpICs9IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgc1tpXSA9ICc8Y29kZT48dT4nICsgZGF0YS51bnVzZWRbaV0ubmFtZSArICc8L3U+PC9jb2RlPiZuYnNwOzxpPicgKw0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS51bnVzZWRbaV0ubGluZSArICc8L2k+IDxjb2RlPicgKw0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS51bnVzZWRbaV1bJ2Z1bmN0aW9uJ10gKyAnPC9jb2RlPic7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIG8ucHVzaCgnPHA+PGk+VW51c2VkIHZhcmlhYmxlOjwvaT4gJyArIHMuam9pbignLCAnKSArICc8L3A+Jyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoZGF0YS5qc29uKSB7DQogICAgICAgICAgICAgICAgby5wdXNoKCc8cD5KU09OOiBiYWQuPC9wPicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgby5wdXNoKCc8L2Rpdj4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghb3B0aW9uKSB7DQoNCiAgICAgICAgICAgIG8ucHVzaCgnPGJyPjxkaXYgaWQ9ZnVuY3Rpb25zPicpOw0KDQogICAgICAgICAgICBpZiAoZGF0YS51cmxzKSB7DQogICAgICAgICAgICAgICAgZGV0YWlsKCJVUkxzPGJyPiIsIGRhdGEudXJscywgJzxicj4nKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKGRhdGEuanNvbiAmJiAhZXJyKSB7DQogICAgICAgICAgICAgICAgby5wdXNoKCc8cD5KU09OOiBnb29kLjwvcD4nKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5nbG9iYWxzKSB7DQogICAgICAgICAgICAgICAgby5wdXNoKCc8ZGl2PjxpPkdsb2JhbDwvaT4gJyArDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdsb2JhbHMuc29ydCgpLmpvaW4oJywgJykgKyAnPC9kaXY+Jyk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIG8ucHVzaCgnPGRpdj48aT5ObyBuZXcgZ2xvYmFsIHZhcmlhYmxlcyBpbnRyb2R1Y2VkLjwvaT48L2Rpdj4nKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGEuZnVuY3Rpb25zLmxlbmd0aDsgaSArPSAxKSB7DQogICAgICAgICAgICAgICAgZiA9IGRhdGEuZnVuY3Rpb25zW2ldOw0KDQogICAgICAgICAgICAgICAgby5wdXNoKCc8YnI+PGRpdiBjbGFzcz1mdW5jdGlvbj48aT4nICsgZi5saW5lICsgJy0nICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGYubGFzdCArICc8L2k+ICcgKyAoZi5uYW1lIHx8ICcnKSArICcoJyArDQogICAgICAgICAgICAgICAgICAgICAgICAoZi5wYXJhbSA/IGYucGFyYW0uam9pbignLCAnKSA6ICcnKSArICcpPC9kaXY+Jyk7DQogICAgICAgICAgICAgICAgZGV0YWlsKCc8YmlnPjxiPlVudXNlZDwvYj48L2JpZz4nLCBmLnVudXNlZCk7DQogICAgICAgICAgICAgICAgZGV0YWlsKCdDbG9zdXJlJywgZi5jbG9zdXJlKTsNCiAgICAgICAgICAgICAgICBkZXRhaWwoJ1ZhcmlhYmxlJywgZlsndmFyJ10pOw0KICAgICAgICAgICAgICAgIGRldGFpbCgnRXhjZXB0aW9uJywgZi5leGNlcHRpb24pOw0KICAgICAgICAgICAgICAgIGRldGFpbCgnT3V0ZXInLCBmLm91dGVyKTsNCiAgICAgICAgICAgICAgICBkZXRhaWwoJ0dsb2JhbCcsIGYuZ2xvYmFsKTsNCiAgICAgICAgICAgICAgICBkZXRhaWwoJ0xhYmVsJywgZi5sYWJlbCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChkYXRhLm1lbWJlcikgew0KICAgICAgICAgICAgICAgIGEgPSBPYmplY3Qua2V5cyhkYXRhLm1lbWJlcik7DQogICAgICAgICAgICAgICAgaWYgKGEubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgIGEgPSBhLnNvcnQoKTsNCiAgICAgICAgICAgICAgICAgICAgbSA9ICc8YnI+PHByZSBpZD1tZW1iZXJzPi8qbWVtYmVycyAnOw0KICAgICAgICAgICAgICAgICAgICBsID0gMTA7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBrID0gYVtpXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBrLm5hbWUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsICsgbi5sZW5ndGggPiA3Mikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8ucHVzaChtICsgJzxicj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gJyAgICAnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgbCArPSBuLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5tZW1iZXJba10gPT09IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gJzxpPicgKyBuICsgJzwvaT4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBhLmxlbmd0aCAtIDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICs9ICcsICc7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBtICs9IG47DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgby5wdXNoKG0gKyAnPGJyPiovPC9wcmU+Jyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIG8ucHVzaCgnPC9kaXY+Jyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG8uam9pbignJyk7DQogICAgfTsNCiAgICBpdHNlbGYuanNoaW50ID0gaXRzZWxmOw0KDQogICAgaXRzZWxmLmVkaXRpb24gPSAnMjAxMS0wNC0xNic7DQoNCiAgICByZXR1cm4gaXRzZWxmOw0KDQp9KCkpOw0KDQovLyBNYWtlIEpTSElOVCBhIE5vZGUgbW9kdWxlLCBpZiBwb3NzaWJsZS4NCmlmICh0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzKQ0KICAgIGV4cG9ydHMuSlNISU5UID0gSlNISU5UOw0KDQp9KTsvKiAtKi0gTW9kZTogSlM7IHRhYi13aWR0aDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0NCiAqIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz03ODoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgdGhlIE5hcmNpc3N1cyBKYXZhU2NyaXB0IGVuZ2luZS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEJyZW5kYW4gRWljaCA8YnJlbmRhbkBtb3ppbGxhLm9yZz4uDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDA0DQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgIFRvbSBBdXN0aW4gPHRhdXN0aW5AdWNzYy5lZHU+DQogKiAgIEJyZW5kYW4gRWljaCA8YnJlbmRhbkBtb3ppbGxhLm9yZz4NCiAqICAgU2h1LVl1IEd1byA8c2h1QHJmcm4ub3JnPg0KICogICBEYXZlIEhlcm1hbiA8ZGhlcm1hbkBtb3ppbGxhLmNvbT4NCiAqICAgRGltaXRyaXMgVmFyZG91bGFraXMgPGRpbXZhckBjY3MubmV1LmVkdT4NCiAqICAgUGF0cmljayBXYWx0b24gPHBjd2FsdG9uQG1vemlsbGEuY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCi8qDQogKiBOYXJjaXNzdXMgLSBKUyBpbXBsZW1lbnRlZCBpbiBKUy4NCiAqDQogKiBQYXJzZXIuDQogKi8NCg0KZGVmaW5lKCdhY2UvbmFyY2lzc3VzL2pzcGFyc2UnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9uYXJjaXNzdXMvanNsZXgnLCAnYWNlL25hcmNpc3N1cy9qc2RlZnMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCiAgICB2YXIgbGV4ZXIgPSByZXF1aXJlKCIuL2pzbGV4Iik7DQogICAgdmFyIGRlZmluaXRpb25zID0gcmVxdWlyZSgiLi9qc2RlZnMiKTsNCg0KICAgIGNvbnN0IFN0cmluZ01hcCA9IGRlZmluaXRpb25zLlN0cmluZ01hcDsNCiAgICBjb25zdCBTdGFjayA9IGRlZmluaXRpb25zLlN0YWNrOw0KDQogICAgLy8gU2V0IGNvbnN0YW50cyBpbiB0aGUgbG9jYWwgc2NvcGUuDQogICAgZXZhbChkZWZpbml0aW9ucy5jb25zdHMpOw0KDQogICAgLy8gQmFubmVkIHN0YXRlbWVudCB0eXBlcyBieSBsYW5ndWFnZSB2ZXJzaW9uLg0KICAgIGNvbnN0IGJsYWNrTGlzdHMgPSB7IDE2MDoge30sIDE4NToge30sIGhhcm1vbnk6IHt9IH07DQogICAgYmxhY2tMaXN0c1sxNjBdW0lNUE9SVF0gPSB0cnVlOw0KICAgIGJsYWNrTGlzdHNbMTYwXVtFWFBPUlRdID0gdHJ1ZTsNCiAgICBibGFja0xpc3RzWzE2MF1bTEVUXSA9IHRydWU7DQogICAgYmxhY2tMaXN0c1sxNjBdW01PRFVMRV0gPSB0cnVlOw0KICAgIGJsYWNrTGlzdHNbMTYwXVtZSUVMRF0gPSB0cnVlOw0KICAgIGJsYWNrTGlzdHNbMTg1XVtJTVBPUlRdID0gdHJ1ZTsNCiAgICBibGFja0xpc3RzWzE4NV1bRVhQT1JUXSA9IHRydWU7DQogICAgYmxhY2tMaXN0c1sxODVdW01PRFVMRV0gPSB0cnVlOw0KICAgIGJsYWNrTGlzdHMuaGFybW9ueVtXSVRIXSA9IHRydWU7DQoNCiAgICAvKg0KICAgICAqIHB1c2hEZXN0cnVjdHVyaW5nVmFyRGVjbHMgOjogKG5vZGUsIGhvaXN0aW5nIG5vZGUpIC0+IHZvaWQNCiAgICAgKg0KICAgICAqIFJlY3Vyc2l2ZWx5IGFkZCBhbGwgZGVzdHJ1Y3R1cmVkIGRlY2xhcmF0aW9ucyB0byB2YXJEZWNscy4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiBwdXNoRGVzdHJ1Y3R1cmluZ1ZhckRlY2xzKG4sIHMpIHsNCiAgICAgICAgZm9yICh2YXIgaSBpbiBuKSB7DQogICAgICAgICAgICB2YXIgc3ViID0gbltpXTsNCiAgICAgICAgICAgIGlmIChzdWIudHlwZSA9PT0gSURFTlRJRklFUikgew0KICAgICAgICAgICAgICAgIHMudmFyRGVjbHMucHVzaChzdWIpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBwdXNoRGVzdHJ1Y3R1cmluZ1ZhckRlY2xzKHN1Yiwgcyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBTdGF0aWNDb250ZXh0KHBhcmVudFNjcmlwdCwgcGFyZW50QmxvY2ssIGluTW9kdWxlLCBpbkZ1bmN0aW9uKSB7DQogICAgICAgIHRoaXMucGFyZW50U2NyaXB0ID0gcGFyZW50U2NyaXB0Ow0KICAgICAgICB0aGlzLnBhcmVudEJsb2NrID0gcGFyZW50QmxvY2sgfHwgcGFyZW50U2NyaXB0Ow0KICAgICAgICB0aGlzLmluTW9kdWxlID0gaW5Nb2R1bGUgfHwgZmFsc2U7DQogICAgICAgIHRoaXMuaW5GdW5jdGlvbiA9IGluRnVuY3Rpb24gfHwgZmFsc2U7DQogICAgICAgIHRoaXMuaW5Gb3JMb29wSW5pdCA9IGZhbHNlOw0KICAgICAgICB0aGlzLnRvcExldmVsID0gdHJ1ZTsNCiAgICAgICAgdGhpcy5hbGxMYWJlbHMgPSBuZXcgU3RhY2soKTsNCiAgICAgICAgdGhpcy5jdXJyZW50TGFiZWxzID0gbmV3IFN0YWNrKCk7DQogICAgICAgIHRoaXMubGFiZWxlZFRhcmdldHMgPSBuZXcgU3RhY2soKTsNCiAgICAgICAgdGhpcy5kZWZhdWx0TG9vcFRhcmdldCA9IG51bGw7DQogICAgICAgIHRoaXMuZGVmYXVsdFRhcmdldCA9IG51bGw7DQogICAgICAgIHRoaXMuYmxhY2tMaXN0ID0gYmxhY2tMaXN0c1tOYXJjaXNzdXMub3B0aW9ucy52ZXJzaW9uXTsNCiAgICAgICAgTmFyY2lzc3VzLm9wdGlvbnMuZWNtYTNPbmx5TW9kZSAmJiAodGhpcy5lY21hM09ubHlNb2RlID0gdHJ1ZSk7DQogICAgICAgIE5hcmNpc3N1cy5vcHRpb25zLnBhcmVuRnJlZU1vZGUgJiYgKHRoaXMucGFyZW5GcmVlTW9kZSA9IHRydWUpOw0KICAgIH0NCg0KICAgIFN0YXRpY0NvbnRleHQucHJvdG90eXBlID0gew0KICAgICAgICBlY21hM09ubHlNb2RlOiBmYWxzZSwNCiAgICAgICAgcGFyZW5GcmVlTW9kZTogZmFsc2UsDQogICAgICAgIC8vIG5vbi1kZXN0cnVjdGl2ZSB1cGRhdGUgdmlhIHByb3RvdHlwZSBleHRlbnNpb24NCiAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihleHQpIHsNCiAgICAgICAgICAgIHZhciBkZXNjID0ge307DQogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZXh0KSB7DQogICAgICAgICAgICAgICAgZGVzY1trZXldID0gew0KICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXh0W2tleV0sDQogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzLCBkZXNjKTsNCiAgICAgICAgfSwNCiAgICAgICAgcHVzaExhYmVsOiBmdW5jdGlvbihsYWJlbCkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKHsgY3VycmVudExhYmVsczogdGhpcy5jdXJyZW50TGFiZWxzLnB1c2gobGFiZWwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsTGFiZWxzOiB0aGlzLmFsbExhYmVscy5wdXNoKGxhYmVsKSB9KTsNCiAgICAgICAgfSwNCiAgICAgICAgcHVzaFRhcmdldDogZnVuY3Rpb24odGFyZ2V0KSB7DQogICAgICAgICAgICB2YXIgaXNEZWZhdWx0TG9vcFRhcmdldCA9IHRhcmdldC5pc0xvb3A7DQogICAgICAgICAgICB2YXIgaXNEZWZhdWx0VGFyZ2V0ID0gaXNEZWZhdWx0TG9vcFRhcmdldCB8fCB0YXJnZXQudHlwZSA9PT0gU1dJVENIOw0KDQogICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50TGFiZWxzLmlzRW1wdHkoKSkgew0KICAgICAgICAgICAgICAgIGlmIChpc0RlZmF1bHRMb29wVGFyZ2V0KSB0aGlzLnVwZGF0ZSh7IGRlZmF1bHRMb29wVGFyZ2V0OiB0YXJnZXQgfSk7DQogICAgICAgICAgICAgICAgaWYgKGlzRGVmYXVsdFRhcmdldCkgdGhpcy51cGRhdGUoeyBkZWZhdWx0VGFyZ2V0OiB0YXJnZXQgfSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRhcmdldC5sYWJlbHMgPSBuZXcgU3RyaW5nTWFwKCk7DQogICAgICAgICAgICB0aGlzLmN1cnJlbnRMYWJlbHMuZm9yRWFjaChmdW5jdGlvbihsYWJlbCkgew0KICAgICAgICAgICAgICAgIHRhcmdldC5sYWJlbHMuc2V0KGxhYmVsLCB0cnVlKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKHsgY3VycmVudExhYmVsczogbmV3IFN0YWNrKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbGVkVGFyZ2V0czogdGhpcy5sYWJlbGVkVGFyZ2V0cy5wdXNoKHRhcmdldCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TG9vcFRhcmdldDogaXNEZWZhdWx0TG9vcFRhcmdldA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGFyZ2V0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmRlZmF1bHRMb29wVGFyZ2V0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFRhcmdldDogaXNEZWZhdWx0VGFyZ2V0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRhcmdldA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmRlZmF1bHRUYXJnZXQgfSk7DQogICAgICAgIH0sDQogICAgICAgIG5lc3Q6IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wTGV2ZWwgPyB0aGlzLnVwZGF0ZSh7IHRvcExldmVsOiBmYWxzZSB9KSA6IHRoaXM7DQogICAgICAgIH0sDQogICAgICAgIGFsbG93OiBmdW5jdGlvbih0eXBlKSB7DQogICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsNCiAgICAgICAgICAgICAgY2FzZSBFWFBPUlQ6DQogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmluTW9kdWxlIHx8IHRoaXMuaW5GdW5jdGlvbiB8fCAhdGhpcy50b3BMZXZlbCkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSA0KDQogICAgICAgICAgICAgIGNhc2UgSU1QT1JUOg0KICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5pbkZ1bmN0aW9uICYmIHRoaXMudG9wTGV2ZWw7DQoNCiAgICAgICAgICAgICAgY2FzZSBNT0RVTEU6DQogICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmluRnVuY3Rpb24gJiYgdGhpcy50b3BMZXZlbDsNCg0KICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfTsNCg0KICAgIC8qDQogICAgICogU2NyaXB0IDo6ICh0b2tlbml6ZXIsIGJvb2xlYW4sIGJvb2xlYW4pIC0+IG5vZGUNCiAgICAgKg0KICAgICAqIFBhcnNlcyB0aGUgdG9wbGV2ZWwgYW5kIG1vZHVsZS9mdW5jdGlvbiBib2RpZXMuDQogICAgICovDQogICAgZnVuY3Rpb24gU2NyaXB0KHQsIGluTW9kdWxlLCBpbkZ1bmN0aW9uKSB7DQogICAgICAgIHZhciBuID0gbmV3IE5vZGUodCwgc2NyaXB0SW5pdCgpKTsNCiAgICAgICAgU3RhdGVtZW50cyh0LCBuZXcgU3RhdGljQ29udGV4dChuLCBuLCBpbk1vZHVsZSwgaW5GdW5jdGlvbiksIG4pOw0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICAvLyBXZSBleHRlbmQgQXJyYXkgc2xpZ2h0bHkgd2l0aCBhIHRvcC1vZi1zdGFjayBtZXRob2QuDQogICAgZGVmaW5pdGlvbnMuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCAidG9wIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoICYmIHRoaXNbdGhpcy5sZW5ndGgtMV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsNCg0KICAgIC8qDQogICAgICogTm9kZSA6OiAodG9rZW5pemVyLCBvcHRpb25hbCBpbml0IG9iamVjdCkgLT4gbm9kZQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIE5vZGUodCwgaW5pdCkgew0KICAgICAgICB2YXIgdG9rZW4gPSB0LnRva2VuOw0KICAgICAgICBpZiAodG9rZW4pIHsNCiAgICAgICAgICAgIC8vIElmIGluaXQudHlwZSBleGlzdHMgaXQgd2lsbCBvdmVycmlkZSB0b2tlbi50eXBlLg0KICAgICAgICAgICAgdGhpcy50eXBlID0gdG9rZW4udHlwZTsNCiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0b2tlbi52YWx1ZTsNCiAgICAgICAgICAgIHRoaXMubGluZW5vID0gdG9rZW4ubGluZW5vOw0KDQogICAgICAgICAgICAvLyBTdGFydCBhbmQgZW5kIGFyZSBmaWxlIHBvc2l0aW9ucyBmb3IgZXJyb3IgaGFuZGxpbmcuDQogICAgICAgICAgICB0aGlzLnN0YXJ0ID0gdG9rZW4uc3RhcnQ7DQogICAgICAgICAgICB0aGlzLmVuZCA9IHRva2VuLmVuZDsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMubGluZW5vID0gdC5saW5lbm87DQogICAgICAgIH0NCg0KICAgICAgICAvLyBOb2RlIHVzZXMgYSB0b2tlbml6ZXIgZm9yIGRlYnVnZ2luZyAoZ2V0U291cmNlLCBmaWxlbmFtZSBnZXR0ZXIpLg0KICAgICAgICB0aGlzLnRva2VuaXplciA9IHQ7DQogICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTsNCg0KICAgICAgICBmb3IgKHZhciBwcm9wIGluIGluaXQpDQogICAgICAgICAgICB0aGlzW3Byb3BdID0gaW5pdFtwcm9wXTsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIFN5bnRoZXRpY05vZGUgOjogKHRva2VuaXplciwgb3B0aW9uYWwgaW5pdCBvYmplY3QpIC0+IG5vZGUNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBTeW50aGV0aWNOb2RlKHQsIGluaXQpIHsNCiAgICAgICAgLy8gcHJpbnQoIlNZTlRIRVRJQyBOT0RFIik7DQogICAgICAgIC8vIGlmIChpbml0LnR5cGUgPT09IENPTU1BKSB7DQogICAgICAgIC8vICAgICBwcmludCgiU1lOVEhFVElDIENPTU1BIik7DQogICAgICAgIC8vICAgICBwcmludChpbml0KTsNCiAgICAgICAgLy8gfQ0KICAgICAgICB0aGlzLnRva2VuaXplciA9IHQ7DQogICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTsNCiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBpbml0KQ0KICAgICAgICAgICAgdGhpc1twcm9wXSA9IGluaXRbcHJvcF07DQogICAgICAgIHRoaXMuc3ludGhldGljID0gdHJ1ZTsNCiAgICB9DQoNCiAgICB2YXIgTnAgPSBOb2RlLnByb3RvdHlwZSA9IFN5bnRoZXRpY05vZGUucHJvdG90eXBlID0ge307DQogICAgTnAuY29uc3RydWN0b3IgPSBOb2RlOw0KDQogICAgY29uc3QgVE9fU09VUkNFX1NLSVAgPSB7DQogICAgICAgIHR5cGU6IHRydWUsDQogICAgICAgIHZhbHVlOiB0cnVlLA0KICAgICAgICBsaW5lbm86IHRydWUsDQogICAgICAgIHN0YXJ0OiB0cnVlLA0KICAgICAgICBlbmQ6IHRydWUsDQogICAgICAgIHRva2VuaXplcjogdHJ1ZSwNCiAgICAgICAgYXNzaWduT3A6IHRydWUNCiAgICB9Ow0KICAgIGZ1bmN0aW9uIHVuZXZhbGFibGVDb25zdChjb2RlKSB7DQogICAgICAgIHZhciB0b2tlbiA9IGRlZmluaXRpb25zLnRva2Vuc1tjb2RlXTsNCiAgICAgICAgdmFyIGNvbnN0TmFtZSA9IGRlZmluaXRpb25zLm9wVHlwZU5hbWVzLmhhc093blByb3BlcnR5KHRva2VuKQ0KICAgICAgICAgICAgICAgICAgICAgID8gZGVmaW5pdGlvbnMub3BUeXBlTmFtZXNbdG9rZW5dDQogICAgICAgICAgICAgICAgICAgICAgOiB0b2tlbiBpbiBkZWZpbml0aW9ucy5rZXl3b3Jkcw0KICAgICAgICAgICAgICAgICAgICAgID8gdG9rZW4udG9VcHBlckNhc2UoKQ0KICAgICAgICAgICAgICAgICAgICAgIDogdG9rZW47DQogICAgICAgIHJldHVybiB7IHRvU291cmNlOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNvbnN0TmFtZSB9IH07DQogICAgfQ0KICAgIE5wLnRvU291cmNlID0gZnVuY3Rpb24gdG9Tb3VyY2UoKSB7DQogICAgICAgIHZhciBtb2NrID0ge307DQogICAgICAgIHZhciBzZWxmID0gdGhpczsNCiAgICAgICAgbW9jay50eXBlID0gdW5ldmFsYWJsZUNvbnN0KHRoaXMudHlwZSk7DQogICAgICAgIGlmICgidmFsdWUiIGluIHRoaXMpDQogICAgICAgICAgICBtb2NrLnZhbHVlID0gdGhpcy52YWx1ZTsNCiAgICAgICAgaWYgKCJsaW5lbm8iIGluIHRoaXMpDQogICAgICAgICAgICBtb2NrLmxpbmVubyA9IHRoaXMubGluZW5vOw0KICAgICAgICBpZiAoInN0YXJ0IiBpbiB0aGlzKQ0KICAgICAgICAgICAgbW9jay5zdGFydCA9IHRoaXMuc3RhcnQ7DQogICAgICAgIGlmICgiZW5kIiBpbiB0aGlzKQ0KICAgICAgICAgICAgbW9jay5lbmQgPSB0aGlzLmVuZDsNCiAgICAgICAgaWYgKHRoaXMuYXNzaWduT3ApDQogICAgICAgICAgICBtb2NrLmFzc2lnbk9wID0gdW5ldmFsYWJsZUNvbnN0KHRoaXMuYXNzaWduT3ApOw0KICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcykgew0KICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhKGtleSBpbiBUT19TT1VSQ0VfU0tJUCkpDQogICAgICAgICAgICAgICAgbW9ja1trZXldID0gdGhpc1trZXldOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBtb2NrLnRvU291cmNlKCk7DQogICAgfTsNCg0KICAgIC8vIEFsd2F5cyB1c2UgcHVzaCB0byBhZGQgb3BlcmFuZHMgdG8gYW4gZXhwcmVzc2lvbiwgdG8gdXBkYXRlIHN0YXJ0IGFuZCBlbmQuDQogICAgTnAucHVzaCA9IGZ1bmN0aW9uIChraWQpIHsNCiAgICAgICAgLy8ga2lkIGNhbiBiZSBudWxsIGUuZy4gWzEsICwgMl0uDQogICAgICAgIGlmIChraWQgIT09IG51bGwpIHsNCiAgICAgICAgICAgIGlmIChraWQuc3RhcnQgPCB0aGlzLnN0YXJ0KQ0KICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgPSBraWQuc3RhcnQ7DQogICAgICAgICAgICBpZiAodGhpcy5lbmQgPCBraWQuZW5kKQ0KICAgICAgICAgICAgICAgIHRoaXMuZW5kID0ga2lkLmVuZDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5wdXNoKGtpZCk7DQogICAgfQ0KDQogICAgTm9kZS5pbmRlbnRMZXZlbCA9IDA7DQoNCiAgICBmdW5jdGlvbiB0b2tlblN0cmluZyh0dCkgew0KICAgICAgICB2YXIgdCA9IGRlZmluaXRpb25zLnRva2Vuc1t0dF07DQogICAgICAgIHJldHVybiAvXlxXLy50ZXN0KHQpID8gZGVmaW5pdGlvbnMub3BUeXBlTmFtZXNbdF0gOiB0LnRvVXBwZXJDYXNlKCk7DQogICAgfQ0KDQogICAgTnAudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciBhID0gW107DQogICAgICAgIGZvciAodmFyIGkgaW4gdGhpcykgew0KICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoaSkgJiYgaSAhPT0gJ3R5cGUnICYmIGkgIT09ICd0YXJnZXQnKQ0KICAgICAgICAgICAgICAgIGEucHVzaCh7aWQ6IGksIHZhbHVlOiB0aGlzW2ldfSk7DQogICAgICAgIH0NCiAgICAgICAgYS5zb3J0KGZ1bmN0aW9uIChhLGIpIHsgcmV0dXJuIChhLmlkIDwgYi5pZCkgPyAtMSA6IDE7IH0pOw0KICAgICAgICBjb25zdCBJTkRFTlRBVElPTiA9ICIgICAgIjsNCiAgICAgICAgdmFyIG4gPSArK05vZGUuaW5kZW50TGV2ZWw7DQogICAgICAgIHZhciBzID0gIntcbiIgKyBJTkRFTlRBVElPTi5yZXBlYXQobikgKyAidHlwZTogIiArIHRva2VuU3RyaW5nKHRoaXMudHlwZSk7DQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKQ0KICAgICAgICAgICAgcyArPSAiLFxuIiArIElOREVOVEFUSU9OLnJlcGVhdChuKSArIGFbaV0uaWQgKyAiOiAiICsgYVtpXS52YWx1ZTsNCiAgICAgICAgbiA9IC0tTm9kZS5pbmRlbnRMZXZlbDsNCiAgICAgICAgcyArPSAiXG4iICsgSU5ERU5UQVRJT04ucmVwZWF0KG4pICsgIn0iOw0KICAgICAgICByZXR1cm4gczsNCiAgICB9DQoNCiAgICBOcC5nZXRTb3VyY2UgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgIHJldHVybiB0aGlzLnRva2VuaXplci5zb3VyY2Uuc2xpY2UodGhpcy5zdGFydCwgdGhpcy5lbmQpOw0KICAgIH07DQoNCiAgICAvKg0KICAgICAqIEhlbHBlciBpbml0IG9iamVjdHMgZm9yIGNvbW1vbiBub2Rlcy4NCiAgICAgKi8NCg0KICAgIGNvbnN0IExPT1BfSU5JVCA9IHsgaXNMb29wOiB0cnVlIH07DQoNCiAgICBmdW5jdGlvbiBibG9ja0luaXQoKSB7DQogICAgICAgIHJldHVybiB7IHR5cGU6IEJMT0NLLCB2YXJEZWNsczogW10gfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzY3JpcHRJbml0KCkgew0KICAgICAgICByZXR1cm4geyB0eXBlOiBTQ1JJUFQsDQogICAgICAgICAgICAgICAgIGZ1bkRlY2xzOiBbXSwNCiAgICAgICAgICAgICAgICAgdmFyRGVjbHM6IFtdLA0KICAgICAgICAgICAgICAgICBtb2REZWZuczogbmV3IFN0cmluZ01hcCgpLA0KICAgICAgICAgICAgICAgICBtb2RBc3NuczogbmV3IFN0cmluZ01hcCgpLA0KICAgICAgICAgICAgICAgICBtb2REZWNsczogbmV3IFN0cmluZ01hcCgpLA0KICAgICAgICAgICAgICAgICBtb2RMb2FkczogbmV3IFN0cmluZ01hcCgpLA0KICAgICAgICAgICAgICAgICBpbXBEZWNsczogW10sDQogICAgICAgICAgICAgICAgIGV4cERlY2xzOiBbXSwNCiAgICAgICAgICAgICAgICAgZXhwb3J0czogbmV3IFN0cmluZ01hcCgpLA0KICAgICAgICAgICAgICAgICBoYXNFbXB0eVJldHVybjogZmFsc2UsDQogICAgICAgICAgICAgICAgIGhhc1JldHVybldpdGhWYWx1ZTogZmFsc2UsDQogICAgICAgICAgICAgICAgIGlzR2VuZXJhdG9yOiBmYWxzZSB9Ow0KICAgIH0NCg0KICAgIGRlZmluaXRpb25zLmRlZmluZUdldHRlcihOcCwgImZpbGVuYW1lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b2tlbml6ZXIuZmlsZW5hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KDQogICAgZGVmaW5pdGlvbnMuZGVmaW5lR2V0dGVyKE5wLCAibGVuZ3RoIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vZGUucHJvdG90eXBlLmxlbmd0aCBpcyBnb25lOyAiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlIG4uY2hpbGRyZW4ubGVuZ3RoIGluc3RlYWQiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICBkZWZpbml0aW9ucy5kZWZpbmVQcm9wZXJ0eShTdHJpbmcucHJvdG90eXBlLCAicmVwZWF0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihuKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gIiIsIHQgPSB0aGlzICsgczsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tbiA+PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArPSB0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmYWxzZSwgZmFsc2UsIHRydWUpOw0KDQogICAgZnVuY3Rpb24gTWF5YmVMZWZ0UGFyZW4odCwgeCkgew0KICAgICAgICBpZiAoeC5wYXJlbkZyZWVNb2RlKQ0KICAgICAgICAgICAgcmV0dXJuIHQubWF0Y2goTEVGVF9QQVJFTikgPyBMRUZUX1BBUkVOIDogRU5EOw0KICAgICAgICByZXR1cm4gdC5tdXN0TWF0Y2goTEVGVF9QQVJFTikudHlwZTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBNYXliZVJpZ2h0UGFyZW4odCwgcCkgew0KICAgICAgICBpZiAocCA9PT0gTEVGVF9QQVJFTikNCiAgICAgICAgICAgIHQubXVzdE1hdGNoKFJJR0hUX1BBUkVOKTsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIFN0YXRlbWVudHMgOjogKHRva2VuaXplciwgY29tcGlsZXIgY29udGV4dCwgbm9kZSkgLT4gdm9pZA0KICAgICAqDQogICAgICogUGFyc2VzIGEgc2VxdWVuY2Ugb2YgU3RhdGVtZW50cy4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiBTdGF0ZW1lbnRzKHQsIHgsIG4pIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIHdoaWxlICghdC5kb25lICYmIHQucGVlayh0cnVlKSAhPT0gUklHSFRfQ1VSTFkpDQogICAgICAgICAgICAgICAgbi5wdXNoKFN0YXRlbWVudCh0LCB4KSk7DQogICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgIGlmICh0LmRvbmUpDQogICAgICAgICAgICAgICAgdC51bmV4cGVjdGVkRU9GID0gdHJ1ZTsNCiAgICAgICAgICAgIHRocm93IGU7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBCbG9jayh0LCB4KSB7DQogICAgICAgIHQubXVzdE1hdGNoKExFRlRfQ1VSTFkpOw0KICAgICAgICB2YXIgbiA9IG5ldyBOb2RlKHQsIGJsb2NrSW5pdCgpKTsNCiAgICAgICAgU3RhdGVtZW50cyh0LCB4LnVwZGF0ZSh7IHBhcmVudEJsb2NrOiBuIH0pLnB1c2hUYXJnZXQobiksIG4pOw0KICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9DVVJMWSk7DQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIGNvbnN0IERFQ0xBUkVEX0ZPUk0gPSAwLCBFWFBSRVNTRURfRk9STSA9IDEsIFNUQVRFTUVOVF9GT1JNID0gMjsNCg0KICAgIC8qDQogICAgICogRXhwb3J0IDo6IChiaW5kaW5nIG5vZGUsIGJvb2xlYW4pIC0+IEV4cG9ydA0KICAgICAqDQogICAgICogU3RhdGljIHNlbWFudGljIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9kdWxlIGV4cG9ydC4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiBFeHBvcnQobm9kZSwgaXNEZWZpbml0aW9uKSB7DQogICAgICAgIHRoaXMubm9kZSA9IG5vZGU7ICAgICAgICAgICAgICAgICAvLyB0aGUgQVNUIG5vZGUgZGVjbGFyaW5nIHRoaXMgaW5kaXZpZHVhbCBleHBvcnQNCiAgICAgICAgdGhpcy5pc0RlZmluaXRpb24gPSBpc0RlZmluaXRpb247IC8vIGlzIHRoZSBub2RlIGFuICdleHBvcnQnLWFubm90YXRlZCBkZWZpbml0aW9uPw0KICAgICAgICB0aGlzLnJlc29sdmVkID0gbnVsbDsgICAgICAgICAgICAgLy8gcmVzb2x2ZWQgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG9mIHRoaXMgZXhwb3J0DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiByZWdpc3RlckV4cG9ydCA6OiAoU3RyaW5nTWFwLCBFWFBPUlQgbm9kZSkgLT4gdm9pZA0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHJlZ2lzdGVyRXhwb3J0KGV4cG9ydHMsIGRlY2wpIHsNCiAgICAgICAgZnVuY3Rpb24gcmVnaXN0ZXIobmFtZSwgZXhwKSB7DQogICAgICAgICAgICBpZiAoZXhwb3J0cy5oYXMobmFtZSkpDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJtdWx0aXBsZSBleHBvcnRzIG9mICIgKyBuYW1lKTsNCiAgICAgICAgICAgIGV4cG9ydHMuc2V0KG5hbWUsIGV4cCk7DQogICAgICAgIH0NCg0KICAgICAgICBzd2l0Y2ggKGRlY2wudHlwZSkgew0KICAgICAgICAgIGNhc2UgTU9EVUxFOg0KICAgICAgICAgIGNhc2UgRlVOQ1RJT046DQogICAgICAgICAgICByZWdpc3RlcihkZWNsLm5hbWUsIG5ldyBFeHBvcnQoZGVjbCwgdHJ1ZSkpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBjYXNlIFZBUjoNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVjbC5jaGlsZHJlbi5sZW5ndGg7IGkrKykNCiAgICAgICAgICAgICAgICByZWdpc3RlcihkZWNsLmNoaWxkcmVuW2ldLm5hbWUsIG5ldyBFeHBvcnQoZGVjbC5jaGlsZHJlbltpXSwgdHJ1ZSkpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBjYXNlIExFVDoNCiAgICAgICAgICBjYXNlIENPTlNUOg0KICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJOWUk6ICIgKyBkZWZpbml0aW9ucy50b2tlbnNbZGVjbC50eXBlXSk7DQoNCiAgICAgICAgICBjYXNlIEVYUE9SVDoNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVjbC5wYXRoTGlzdC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBwYXRoID0gZGVjbC5wYXRoTGlzdFtpXTsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhdGgudHlwZSkgew0KICAgICAgICAgICAgICAgICAgY2FzZSBPQkpFQ1RfSU5JVDoNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwYXRoLmNoaWxkcmVuLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0IDo6IElERU5USUZJRVIgfCBQUk9QRVJUWV9JTklUDQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5pdCA9IHBhdGguY2hpbGRyZW5bal07DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdC50eXBlID09PSBJREVOVElGSUVSKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyKGluaXQudmFsdWUsIG5ldyBFeHBvcnQoaW5pdCwgZmFsc2UpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcihpbml0LmNoaWxkcmVuWzBdLnZhbHVlLCBuZXcgRXhwb3J0KGluaXQuY2hpbGRyZW5bMV0sIGZhbHNlKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgIGNhc2UgRE9UOg0KICAgICAgICAgICAgICAgICAgICByZWdpc3RlcihwYXRoLmNoaWxkcmVuWzFdLnZhbHVlLCBuZXcgRXhwb3J0KHBhdGgsIGZhbHNlKSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6DQogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyKHBhdGgudmFsdWUsIG5ldyBFeHBvcnQocGF0aCwgZmFsc2UpKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigidW5leHBlY3RlZCBleHBvcnQgcGF0aDogIiArIGRlZmluaXRpb25zLnRva2Vuc1twYXRoLnR5cGVdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInVuZXhwZWN0ZWQgZXhwb3J0IGRlY2w6ICIgKyBkZWZpbml0aW9ucy50b2tlbnNbZXhwLnR5cGVdKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qDQogICAgICogTW9kdWxlIDo6IChub2RlKSAtPiBNb2R1bGUNCiAgICAgKg0KICAgICAqIFN0YXRpYyBzZW1hbnRpYyByZXByZXNlbnRhdGlvbiBvZiBhIG1vZHVsZS4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiBNb2R1bGUobm9kZSkgew0KICAgICAgICB2YXIgZXhwb3J0cyA9IG5vZGUuYm9keS5leHBvcnRzOw0KICAgICAgICB2YXIgbW9kRGVmbnMgPSBub2RlLmJvZHkubW9kRGVmbnM7DQoNCiAgICAgICAgdmFyIGV4cG9ydGVkTW9kdWxlcyA9IG5ldyBTdHJpbmdNYXAoKTsNCg0KICAgICAgICBleHBvcnRzLmZvckVhY2goZnVuY3Rpb24obmFtZSwgZXhwKSB7DQogICAgICAgICAgICB2YXIgbm9kZSA9IGV4cC5ub2RlOw0KICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gTU9EVUxFKSB7DQogICAgICAgICAgICAgICAgZXhwb3J0ZWRNb2R1bGVzLnNldChuYW1lLCBub2RlKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWV4cC5pc0RlZmluaXRpb24gJiYgbm9kZS50eXBlID09PSBJREVOVElGSUVSICYmIG1vZERlZm5zLmhhcyhub2RlLnZhbHVlKSkgew0KICAgICAgICAgICAgICAgIHZhciBtb2QgPSBtb2REZWZucy5nZXQobm9kZS52YWx1ZSk7DQogICAgICAgICAgICAgICAgZXhwb3J0ZWRNb2R1bGVzLnNldChuYW1lLCBtb2QpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICB0aGlzLm5vZGUgPSBub2RlOw0KICAgICAgICB0aGlzLmV4cG9ydHMgPSBleHBvcnRzOw0KICAgICAgICB0aGlzLmV4cG9ydGVkTW9kdWxlcyA9IGV4cG9ydGVkTW9kdWxlczsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIFN0YXRlbWVudCA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiBub2RlDQogICAgICoNCiAgICAgKiBQYXJzZXMgYSBTdGF0ZW1lbnQuDQogICAgICovDQogICAgZnVuY3Rpb24gU3RhdGVtZW50KHQsIHgpIHsNCiAgICAgICAgdmFyIGksIGxhYmVsLCBuLCBuMiwgcCwgYywgc3MsIHR0ID0gdC5nZXQodHJ1ZSksIHR0MiwgeDIsIHgzOw0KDQogICAgICAgIHZhciBjb21tZW50cyA9IHQuYmxvY2tDb21tZW50czsNCg0KICAgICAgICBpZiAoeC5ibGFja0xpc3RbdHRdKQ0KICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcihkZWZpbml0aW9ucy50b2tlbnNbdHRdICsgIiBzdGF0ZW1lbnRzIG9ubHkgYWxsb3dlZCBpbiBIYXJtb255Iik7DQogICAgICAgIGlmICgheC5hbGxvdyh0dCkpDQogICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKGRlZmluaXRpb25zLnRva2Vuc1t0dF0gKyAiIHN0YXRlbWVudCBpbiBpbGxlZ2FsIGNvbnRleHQiKTsNCg0KICAgICAgICAvLyBDYXNlcyBmb3Igc3RhdGVtZW50cyBlbmRpbmcgaW4gYSByaWdodCBjdXJseSByZXR1cm4gZWFybHksIGF2b2lkaW5nIHRoZQ0KICAgICAgICAvLyBjb21tb24gc2VtaWNvbG9uIGluc2VydGlvbiBtYWdpYyBhZnRlciB0aGlzIHN3aXRjaC4NCiAgICAgICAgc3dpdGNoICh0dCkgew0KICAgICAgICAgIGNhc2UgSU1QT1JUOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgbi5wYXRoTGlzdCA9IEltcG9ydFBhdGhMaXN0KHQsIHgpOw0KICAgICAgICAgICAgeC5wYXJlbnRTY3JpcHQuaW1wRGVjbHMucHVzaChuKTsNCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgY2FzZSBFWFBPUlQ6DQogICAgICAgICAgICBzd2l0Y2ggKHQucGVlaygpKSB7DQogICAgICAgICAgICAgIGNhc2UgTU9EVUxFOg0KICAgICAgICAgICAgICBjYXNlIEZVTkNUSU9OOg0KICAgICAgICAgICAgICBjYXNlIExFVDoNCiAgICAgICAgICAgICAgY2FzZSBWQVI6DQogICAgICAgICAgICAgIGNhc2UgQ09OU1Q6DQogICAgICAgICAgICAgICAgbiA9IFN0YXRlbWVudCh0LCB4KTsNCiAgICAgICAgICAgICAgICBuLmJsb2NrQ29tbWVudHMgPSBjb21tZW50czsNCiAgICAgICAgICAgICAgICBuLmV4cG9ydGVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB4LnBhcmVudFNjcmlwdC5leHBEZWNscy5wdXNoKG4pOw0KICAgICAgICAgICAgICAgIHJlZ2lzdGVyRXhwb3J0KHgucGFyZW50U2NyaXB0LmV4cG9ydHMsIG4pOw0KICAgICAgICAgICAgICAgIHJldHVybiBuOw0KDQogICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgICAgIG4ucGF0aExpc3QgPSBFeHBvcnRQYXRoTGlzdCh0LCB4KTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHgucGFyZW50U2NyaXB0LmV4cERlY2xzLnB1c2gobik7DQogICAgICAgICAgICByZWdpc3RlckV4cG9ydCh4LnBhcmVudFNjcmlwdC5leHBvcnRzLCBuKTsNCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgY2FzZSBNT0RVTEU6DQogICAgICAgICAgICBuID0gbmV3IE5vZGUodCk7DQogICAgICAgICAgICBuLmJsb2NrQ29tbWVudHMgPSBjb21tZW50czsNCiAgICAgICAgICAgIHQubXVzdE1hdGNoKElERU5USUZJRVIpOw0KICAgICAgICAgICAgbGFiZWwgPSB0LnRva2VuLnZhbHVlOw0KDQogICAgICAgICAgICBpZiAodC5tYXRjaChMRUZUX0NVUkxZKSkgew0KICAgICAgICAgICAgICAgIG4ubmFtZSA9IGxhYmVsOw0KICAgICAgICAgICAgICAgIG4uYm9keSA9IFNjcmlwdCh0LCB0cnVlLCBmYWxzZSk7DQogICAgICAgICAgICAgICAgbi5tb2R1bGUgPSBuZXcgTW9kdWxlKG4pOw0KICAgICAgICAgICAgICAgIHQubXVzdE1hdGNoKFJJR0hUX0NVUkxZKTsNCiAgICAgICAgICAgICAgICB4LnBhcmVudFNjcmlwdC5tb2REZWZucy5zZXQobi5uYW1lLCBuKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gbjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdC51bmdldCgpOw0KICAgICAgICAgICAgTW9kdWxlVmFyaWFibGVzKHQsIHgsIG4pOw0KICAgICAgICAgICAgcmV0dXJuIG47DQoNCiAgICAgICAgICBjYXNlIEZVTkNUSU9OOg0KICAgICAgICAgICAgLy8gREVDTEFSRURfRk9STSBleHRlbmRzIGZ1bkRlY2xzIG9mIHgsIFNUQVRFTUVOVF9GT1JNIGRvZXNuJ3QuDQogICAgICAgICAgICByZXR1cm4gRnVuY3Rpb25EZWZpbml0aW9uKHQsIHgsIHRydWUsIHgudG9wTGV2ZWwgPyBERUNMQVJFRF9GT1JNIDogU1RBVEVNRU5UX0ZPUk0sIGNvbW1lbnRzKTsNCg0KICAgICAgICAgIGNhc2UgTEVGVF9DVVJMWToNCiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0LCBibG9ja0luaXQoKSk7DQogICAgICAgICAgICBTdGF0ZW1lbnRzKHQsIHgudXBkYXRlKHsgcGFyZW50QmxvY2s6IG4gfSkucHVzaFRhcmdldChuKS5uZXN0KCksIG4pOw0KICAgICAgICAgICAgdC5tdXN0TWF0Y2goUklHSFRfQ1VSTFkpOw0KICAgICAgICAgICAgcmV0dXJuIG47DQoNCiAgICAgICAgICBjYXNlIElGOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgbi5jb25kaXRpb24gPSBIZWFkRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgICAgIHgyID0geC5wdXNoVGFyZ2V0KG4pLm5lc3QoKTsNCiAgICAgICAgICAgIG4udGhlblBhcnQgPSBTdGF0ZW1lbnQodCwgeDIpOw0KICAgICAgICAgICAgbi5lbHNlUGFydCA9IHQubWF0Y2goRUxTRSwgdHJ1ZSkgPyBTdGF0ZW1lbnQodCwgeDIpIDogbnVsbDsNCiAgICAgICAgICAgIHJldHVybiBuOw0KDQogICAgICAgICAgY2FzZSBTV0lUQ0g6DQogICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBDQVNFcyBhZnRlciBhIERFRkFVTFQsIHdoaWNoIGlzIGluIHRoZSBzdGFuZGFyZC4NCiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IGNhc2VzOiBbXSwgZGVmYXVsdEluZGV4OiAtMSB9KTsNCiAgICAgICAgICAgIG4uZGlzY3JpbWluYW50ID0gSGVhZEV4cHJlc3Npb24odCwgeCk7DQogICAgICAgICAgICB4MiA9IHgucHVzaFRhcmdldChuKS5uZXN0KCk7DQogICAgICAgICAgICB0Lm11c3RNYXRjaChMRUZUX0NVUkxZKTsNCiAgICAgICAgICAgIHdoaWxlICgodHQgPSB0LmdldCgpKSAhPT0gUklHSFRfQ1VSTFkpIHsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR0KSB7DQogICAgICAgICAgICAgICAgICBjYXNlIERFRkFVTFQ6DQogICAgICAgICAgICAgICAgICAgIGlmIChuLmRlZmF1bHRJbmRleCA+PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiTW9yZSB0aGFuIG9uZSBzd2l0Y2ggZGVmYXVsdCIpOw0KICAgICAgICAgICAgICAgICAgICAvLyBGQUxMIFRIUk9VR0gNCiAgICAgICAgICAgICAgICAgIGNhc2UgQ0FTRToNCiAgICAgICAgICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHR0ID09PSBERUZBVUxUKQ0KICAgICAgICAgICAgICAgICAgICAgICAgbi5kZWZhdWx0SW5kZXggPSBuLmNhc2VzLmxlbmd0aDsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgbjIuY2FzZUxhYmVsID0gRXhwcmVzc2lvbih0LCB4MiwgQ09MT04pOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiSW52YWxpZCBzd2l0Y2ggY2FzZSIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0Lm11c3RNYXRjaChDT0xPTik7DQogICAgICAgICAgICAgICAgbjIuc3RhdGVtZW50cyA9IG5ldyBOb2RlKHQsIGJsb2NrSW5pdCgpKTsNCiAgICAgICAgICAgICAgICB3aGlsZSAoKHR0PXQucGVlayh0cnVlKSkgIT09IENBU0UgJiYgdHQgIT09IERFRkFVTFQgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgIHR0ICE9PSBSSUdIVF9DVVJMWSkNCiAgICAgICAgICAgICAgICAgICAgbjIuc3RhdGVtZW50cy5wdXNoKFN0YXRlbWVudCh0LCB4MikpOw0KICAgICAgICAgICAgICAgIG4uY2FzZXMucHVzaChuMik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbjsNCg0KICAgICAgICAgIGNhc2UgRk9SOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQsIExPT1BfSU5JVCk7DQogICAgICAgICAgICBuLmJsb2NrQ29tbWVudHMgPSBjb21tZW50czsNCiAgICAgICAgICAgIGlmICh0Lm1hdGNoKElERU5USUZJRVIpKSB7DQogICAgICAgICAgICAgICAgaWYgKHQudG9rZW4udmFsdWUgPT09ICJlYWNoIikNCiAgICAgICAgICAgICAgICAgICAgbi5pc0VhY2ggPSB0cnVlOw0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgdC51bmdldCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCF4LnBhcmVuRnJlZU1vZGUpDQogICAgICAgICAgICAgICAgdC5tdXN0TWF0Y2goTEVGVF9QQVJFTik7DQogICAgICAgICAgICB4MiA9IHgucHVzaFRhcmdldChuKS5uZXN0KCk7DQogICAgICAgICAgICB4MyA9IHgudXBkYXRlKHsgaW5Gb3JMb29wSW5pdDogdHJ1ZSB9KTsNCiAgICAgICAgICAgIG4yID0gbnVsbDsNCiAgICAgICAgICAgIGlmICgodHQgPSB0LnBlZWsodHJ1ZSkpICE9PSBTRU1JQ09MT04pIHsNCiAgICAgICAgICAgICAgICBpZiAodHQgPT09IFZBUiB8fCB0dCA9PT0gQ09OU1QpIHsNCiAgICAgICAgICAgICAgICAgICAgdC5nZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgbjIgPSBWYXJpYWJsZXModCwgeDMpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHQgPT09IExFVCkgew0KICAgICAgICAgICAgICAgICAgICB0LmdldCgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAodC5wZWVrKCkgPT09IExFRlRfUEFSRU4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG4yID0gTGV0QmxvY2sodCwgeDMsIGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCBpbiBmb3IgaGVhZCwgd2UgbmVlZCB0byBhZGQgYW4gaW1wbGljaXQgYmxvY2sNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyb3VuZCB0aGUgcmVzdCBvZiB0aGUgZm9yLg0KICAgICAgICAgICAgICAgICAgICAgICAgeDMucGFyZW50QmxvY2sgPSBuOw0KICAgICAgICAgICAgICAgICAgICAgICAgbi52YXJEZWNscyA9IFtdOw0KICAgICAgICAgICAgICAgICAgICAgICAgbjIgPSBWYXJpYWJsZXModCwgeDMpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgbjIgPSBFeHByZXNzaW9uKHQsIHgzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobjIgJiYgdC5tYXRjaChJTikpIHsNCiAgICAgICAgICAgICAgICBuLnR5cGUgPSBGT1JfSU47DQogICAgICAgICAgICAgICAgbi5vYmplY3QgPSBFeHByZXNzaW9uKHQsIHgzKTsNCiAgICAgICAgICAgICAgICBpZiAobjIudHlwZSA9PT0gVkFSIHx8IG4yLnR5cGUgPT09IExFVCkgew0KICAgICAgICAgICAgICAgICAgICBjID0gbjIuY2hpbGRyZW47DQoNCiAgICAgICAgICAgICAgICAgICAgLy8gRGVzdHJ1Y3R1cmluZyB0dXJucyBvbmUgZGVjbCBpbnRvIG11bHRpcGxlcywgc28gZWl0aGVyDQogICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIG11c3QgYmUgb25seSBvbmUgZGVzdHJ1Y3R1cmluZyBvciBvbmx5IG9uZQ0KICAgICAgICAgICAgICAgICAgICAvLyBkZWNsLg0KICAgICAgICAgICAgICAgICAgICBpZiAoYy5sZW5ndGggIT09IDEgJiYgbjIuZGVzdHJ1Y3R1cmluZ3MubGVuZ3RoICE9PSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkludmFsaWQgZm9yLi5pbiBsZWZ0LWhhbmQgc2lkZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5maWxlbmFtZSwgbjIubGluZW5vKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAobjIuZGVzdHJ1Y3R1cmluZ3MubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbi5pdGVyYXRvciA9IG4yLmRlc3RydWN0dXJpbmdzWzBdOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgbi5pdGVyYXRvciA9IGNbMF07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgbi52YXJEZWNsID0gbjI7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG4yLnR5cGUgPT09IEFSUkFZX0lOSVQgfHwgbjIudHlwZSA9PT0gT0JKRUNUX0lOSVQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG4yLmRlc3RydWN0dXJlZE5hbWVzID0gY2hlY2tEZXN0cnVjdHVyaW5nKHQsIHgzLCBuMik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgbi5pdGVyYXRvciA9IG4yOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgeDMuaW5Gb3JMb29wSW5pdCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIG4uc2V0dXAgPSBuMjsNCiAgICAgICAgICAgICAgICB0Lm11c3RNYXRjaChTRU1JQ09MT04pOw0KICAgICAgICAgICAgICAgIGlmIChuLmlzRWFjaCkNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiSW52YWxpZCBmb3IgZWFjaC4uaW4gbG9vcCIpOw0KICAgICAgICAgICAgICAgIG4uY29uZGl0aW9uID0gKHQucGVlayh0cnVlKSA9PT0gU0VNSUNPTE9OKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEV4cHJlc3Npb24odCwgeDMpOw0KICAgICAgICAgICAgICAgIHQubXVzdE1hdGNoKFNFTUlDT0xPTik7DQogICAgICAgICAgICAgICAgdHQyID0gdC5wZWVrKHRydWUpOw0KICAgICAgICAgICAgICAgIG4udXBkYXRlID0gKHgucGFyZW5GcmVlTW9kZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdHQyID09PSBMRUZUX0NVUkxZIHx8IGRlZmluaXRpb25zLmlzU3RhdGVtZW50U3RhcnRDb2RlW3R0Ml0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHR0MiA9PT0gUklHSFRfUEFSRU4pDQogICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRXhwcmVzc2lvbih0LCB4Myk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoIXgucGFyZW5GcmVlTW9kZSkNCiAgICAgICAgICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9QQVJFTik7DQogICAgICAgICAgICBuLmJvZHkgPSBTdGF0ZW1lbnQodCwgeDIpOw0KICAgICAgICAgICAgcmV0dXJuIG47DQoNCiAgICAgICAgICBjYXNlIFdISUxFOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgaXNMb29wOiB0cnVlIH0pOw0KICAgICAgICAgICAgbi5ibG9ja0NvbW1lbnRzID0gY29tbWVudHM7DQogICAgICAgICAgICBuLmNvbmRpdGlvbiA9IEhlYWRFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICAgICAgbi5ib2R5ID0gU3RhdGVtZW50KHQsIHgucHVzaFRhcmdldChuKS5uZXN0KCkpOw0KICAgICAgICAgICAgcmV0dXJuIG47DQoNCiAgICAgICAgICBjYXNlIERPOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgaXNMb29wOiB0cnVlIH0pOw0KICAgICAgICAgICAgbi5ibG9ja0NvbW1lbnRzID0gY29tbWVudHM7DQogICAgICAgICAgICBuLmJvZHkgPSBTdGF0ZW1lbnQodCwgeC5wdXNoVGFyZ2V0KG4pLm5lc3QoKSk7DQogICAgICAgICAgICB0Lm11c3RNYXRjaChXSElMRSk7DQogICAgICAgICAgICBuLmNvbmRpdGlvbiA9IEhlYWRFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICAgICAgaWYgKCF4LmVjbWFTdHJpY3RNb2RlKSB7DQogICAgICAgICAgICAgICAgLy8gPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+ICh3aXRob3V0IHZlcnNpb24gaGludHMpIG1heSBuZWVkDQogICAgICAgICAgICAgICAgLy8gYXV0b21hdGljIHNlbWljb2xvbiBpbnNlcnRpb24gd2l0aG91dCBhIG5ld2xpbmUgYWZ0ZXIgZG8td2hpbGUuDQogICAgICAgICAgICAgICAgLy8gU2VlIGh0dHA6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjM4OTQ1Lg0KICAgICAgICAgICAgICAgIHQubWF0Y2goU0VNSUNPTE9OKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgY2FzZSBCUkVBSzoNCiAgICAgICAgICBjYXNlIENPTlRJTlVFOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgbi5ibG9ja0NvbW1lbnRzID0gY29tbWVudHM7DQoNCiAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgfGZvbzogYnJlYWsgZm9vO3wgY29ybmVyIGNhc2UNCiAgICAgICAgICAgIHgyID0geC5wdXNoVGFyZ2V0KG4pOw0KDQogICAgICAgICAgICBpZiAodC5wZWVrT25TYW1lTGluZSgpID09PSBJREVOVElGSUVSKSB7DQogICAgICAgICAgICAgICAgdC5nZXQoKTsNCiAgICAgICAgICAgICAgICBuLmxhYmVsID0gdC50b2tlbi52YWx1ZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKG4ubGFiZWwpIHsNCiAgICAgICAgICAgICAgICBuLnRhcmdldCA9IHgyLmxhYmVsZWRUYXJnZXRzLmZpbmQoZnVuY3Rpb24odGFyZ2V0KSB7IHJldHVybiB0YXJnZXQubGFiZWxzLmhhcyhuLmxhYmVsKSB9KTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHQgPT09IENPTlRJTlVFKSB7DQogICAgICAgICAgICAgICAgbi50YXJnZXQgPSB4Mi5kZWZhdWx0TG9vcFRhcmdldDsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgbi50YXJnZXQgPSB4Mi5kZWZhdWx0VGFyZ2V0Ow0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoIW4udGFyZ2V0KQ0KICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkludmFsaWQgIiArICgodHQgPT09IEJSRUFLKSA/ICJicmVhayIgOiAiY29udGludWUiKSk7DQogICAgICAgICAgICBpZiAoIW4udGFyZ2V0LmlzTG9vcCAmJiB0dCA9PT0gQ09OVElOVUUpDQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiSW52YWxpZCBjb250aW51ZSIpOw0KDQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgIGNhc2UgVFJZOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgY2F0Y2hDbGF1c2VzOiBbXSB9KTsNCiAgICAgICAgICAgIG4uYmxvY2tDb21tZW50cyA9IGNvbW1lbnRzOw0KICAgICAgICAgICAgbi50cnlCbG9jayA9IEJsb2NrKHQsIHgpOw0KICAgICAgICAgICAgd2hpbGUgKHQubWF0Y2goQ0FUQ0gpKSB7DQogICAgICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgICAgICBwID0gTWF5YmVMZWZ0UGFyZW4odCwgeCk7DQogICAgICAgICAgICAgICAgc3dpdGNoICh0LmdldCgpKSB7DQogICAgICAgICAgICAgICAgICBjYXNlIExFRlRfQlJBQ0tFVDoNCiAgICAgICAgICAgICAgICAgIGNhc2UgTEVGVF9DVVJMWToNCiAgICAgICAgICAgICAgICAgICAgLy8gRGVzdHJ1Y3R1cmVkIGNhdGNoIGlkZW50aWZpZXJzLg0KICAgICAgICAgICAgICAgICAgICB0LnVuZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgIG4yLnZhck5hbWUgPSBEZXN0cnVjdHVyaW5nRXhwcmVzc2lvbih0LCB4LCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6DQogICAgICAgICAgICAgICAgICAgIG4yLnZhck5hbWUgPSB0LnRva2VuLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIm1pc3NpbmcgaWRlbnRpZmllciBpbiBjYXRjaCIpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHQubWF0Y2goSUYpKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh4LmVjbWEzT25seU1vZGUpDQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJJbGxlZ2FsIGNhdGNoIGd1YXJkIik7DQogICAgICAgICAgICAgICAgICAgIGlmIChuLmNhdGNoQ2xhdXNlcy5sZW5ndGggJiYgIW4uY2F0Y2hDbGF1c2VzLnRvcCgpLmd1YXJkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiR3VhcmRlZCBjYXRjaCBhZnRlciB1bmd1YXJkZWQiKTsNCiAgICAgICAgICAgICAgICAgICAgbjIuZ3VhcmQgPSBFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBNYXliZVJpZ2h0UGFyZW4odCwgcCk7DQogICAgICAgICAgICAgICAgbjIuYmxvY2sgPSBCbG9jayh0LCB4KTsNCiAgICAgICAgICAgICAgICBuLmNhdGNoQ2xhdXNlcy5wdXNoKG4yKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0Lm1hdGNoKEZJTkFMTFkpKQ0KICAgICAgICAgICAgICAgIG4uZmluYWxseUJsb2NrID0gQmxvY2sodCwgeCk7DQogICAgICAgICAgICBpZiAoIW4uY2F0Y2hDbGF1c2VzLmxlbmd0aCAmJiAhbi5maW5hbGx5QmxvY2spDQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiSW52YWxpZCB0cnkgc3RhdGVtZW50Iik7DQogICAgICAgICAgICByZXR1cm4gbjsNCg0KICAgICAgICAgIGNhc2UgQ0FUQ0g6DQogICAgICAgICAgY2FzZSBGSU5BTExZOg0KICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcihkZWZpbml0aW9ucy50b2tlbnNbdHRdICsgIiB3aXRob3V0IHByZWNlZGluZyB0cnkiKTsNCg0KICAgICAgICAgIGNhc2UgVEhST1c6DQogICAgICAgICAgICBuID0gbmV3IE5vZGUodCk7DQogICAgICAgICAgICBuLmV4Y2VwdGlvbiA9IEV4cHJlc3Npb24odCwgeCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgIGNhc2UgUkVUVVJOOg0KICAgICAgICAgICAgbiA9IFJldHVybk9yWWllbGQodCwgeCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgIGNhc2UgV0lUSDoNCiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgIG4uYmxvY2tDb21tZW50cyA9IGNvbW1lbnRzOw0KICAgICAgICAgICAgbi5vYmplY3QgPSBIZWFkRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgICAgIG4uYm9keSA9IFN0YXRlbWVudCh0LCB4LnB1c2hUYXJnZXQobikubmVzdCgpKTsNCiAgICAgICAgICAgIHJldHVybiBuOw0KDQogICAgICAgICAgY2FzZSBWQVI6DQogICAgICAgICAgY2FzZSBDT05TVDoNCiAgICAgICAgICAgIG4gPSBWYXJpYWJsZXModCwgeCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgIGNhc2UgTEVUOg0KICAgICAgICAgICAgaWYgKHQucGVlaygpID09PSBMRUZUX1BBUkVOKQ0KICAgICAgICAgICAgICAgIG4gPSBMZXRCbG9jayh0LCB4LCB0cnVlKTsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICBuID0gVmFyaWFibGVzKHQsIHgpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBjYXNlIERFQlVHR0VSOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBjYXNlIE5FV0xJTkU6DQogICAgICAgICAgY2FzZSBTRU1JQ09MT046DQogICAgICAgICAgICBuID0gbmV3IE5vZGUodCwgeyB0eXBlOiBTRU1JQ09MT04gfSk7DQogICAgICAgICAgICBuLmJsb2NrQ29tbWVudHMgPSBjb21tZW50czsNCiAgICAgICAgICAgIG4uZXhwcmVzc2lvbiA9IG51bGw7DQogICAgICAgICAgICByZXR1cm4gbjsNCg0KICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICBpZiAodHQgPT09IElERU5USUZJRVIpIHsNCiAgICAgICAgICAgICAgICB0dCA9IHQucGVlaygpOw0KICAgICAgICAgICAgICAgIC8vIExhYmVsZWQgc3RhdGVtZW50Lg0KICAgICAgICAgICAgICAgIGlmICh0dCA9PT0gQ09MT04pIHsNCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB0LnRva2VuLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICBpZiAoeC5hbGxMYWJlbHMuaGFzKGxhYmVsKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkR1cGxpY2F0ZSBsYWJlbCIpOw0KICAgICAgICAgICAgICAgICAgICB0LmdldCgpOw0KICAgICAgICAgICAgICAgICAgICBuID0gbmV3IE5vZGUodCwgeyB0eXBlOiBMQUJFTCwgbGFiZWw6IGxhYmVsIH0pOw0KICAgICAgICAgICAgICAgICAgICBuLmJsb2NrQ29tbWVudHMgPSBjb21tZW50czsNCiAgICAgICAgICAgICAgICAgICAgbi5zdGF0ZW1lbnQgPSBTdGF0ZW1lbnQodCwgeC5wdXNoTGFiZWwobGFiZWwpLm5lc3QoKSk7DQogICAgICAgICAgICAgICAgICAgIG4udGFyZ2V0ID0gKG4uc3RhdGVtZW50LnR5cGUgPT09IExBQkVMKSA/IG4uc3RhdGVtZW50LnRhcmdldCA6IG4uc3RhdGVtZW50Ow0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIEV4cHJlc3Npb24gc3RhdGVtZW50Lg0KICAgICAgICAgICAgLy8gV2UgdW5nZXQgdGhlIGN1cnJlbnQgdG9rZW4gdG8gcGFyc2UgdGhlIGV4cHJlc3Npb24gYXMgYSB3aG9sZS4NCiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IFNFTUlDT0xPTiB9KTsNCiAgICAgICAgICAgIHQudW5nZXQoKTsNCiAgICAgICAgICAgIG4uYmxvY2tDb21tZW50cyA9IGNvbW1lbnRzOw0KICAgICAgICAgICAgbi5leHByZXNzaW9uID0gRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgICAgIG4uZW5kID0gbi5leHByZXNzaW9uLmVuZDsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQoNCiAgICAgICAgbi5ibG9ja0NvbW1lbnRzID0gY29tbWVudHM7DQogICAgICAgIE1hZ2ljYWxTZW1pY29sb24odCk7DQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIC8qDQogICAgICogTWFnaWNhbFNlbWljb2xvbiA6OiAodG9rZW5pemVyKSAtPiB2b2lkDQogICAgICovDQogICAgZnVuY3Rpb24gTWFnaWNhbFNlbWljb2xvbih0KSB7DQogICAgICAgIHZhciB0dDsNCiAgICAgICAgaWYgKHQubGluZW5vID09PSB0LnRva2VuLmxpbmVubykgew0KICAgICAgICAgICAgdHQgPSB0LnBlZWtPblNhbWVMaW5lKCk7DQogICAgICAgICAgICBpZiAodHQgIT09IEVORCAmJiB0dCAhPT0gTkVXTElORSAmJiB0dCAhPT0gU0VNSUNPTE9OICYmIHR0ICE9PSBSSUdIVF9DVVJMWSkNCiAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJtaXNzaW5nIDsgYmVmb3JlIHN0YXRlbWVudCIpOw0KICAgICAgICB9DQogICAgICAgIHQubWF0Y2goU0VNSUNPTE9OKTsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIFJldHVybk9yWWllbGQgOjogKHRva2VuaXplciwgY29tcGlsZXIgY29udGV4dCkgLT4gKFJFVFVSTiB8IFlJRUxEKSBub2RlDQogICAgICovDQogICAgZnVuY3Rpb24gUmV0dXJuT3JZaWVsZCh0LCB4KSB7DQogICAgICAgIHZhciBuLCBiLCB0dCA9IHQudG9rZW4udHlwZSwgdHQyOw0KDQogICAgICAgIHZhciBwYXJlbnRTY3JpcHQgPSB4LnBhcmVudFNjcmlwdDsNCg0KICAgICAgICBpZiAodHQgPT09IFJFVFVSTikgew0KICAgICAgICAgICAgaWYgKCF4LmluRnVuY3Rpb24pDQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiUmV0dXJuIG5vdCBpbiBmdW5jdGlvbiIpOw0KICAgICAgICB9IGVsc2UgLyogaWYgKHR0ID09PSBZSUVMRCkgKi8gew0KICAgICAgICAgICAgaWYgKCF4LmluRnVuY3Rpb24pDQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiWWllbGQgbm90IGluIGZ1bmN0aW9uIik7DQogICAgICAgICAgICBwYXJlbnRTY3JpcHQuaXNHZW5lcmF0b3IgPSB0cnVlOw0KICAgICAgICB9DQogICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHZhbHVlOiB1bmRlZmluZWQgfSk7DQoNCiAgICAgICAgdHQyID0gKHR0ID09PSBSRVRVUk4pID8gdC5wZWVrT25TYW1lTGluZSh0cnVlKSA6IHQucGVlayh0cnVlKTsNCiAgICAgICAgaWYgKHR0MiAhPT0gRU5EICYmIHR0MiAhPT0gTkVXTElORSAmJg0KICAgICAgICAgICAgdHQyICE9PSBTRU1JQ09MT04gJiYgdHQyICE9PSBSSUdIVF9DVVJMWQ0KICAgICAgICAgICAgJiYgKHR0ICE9PSBZSUVMRCB8fA0KICAgICAgICAgICAgICAgICh0dDIgIT09IHR0ICYmIHR0MiAhPT0gUklHSFRfQlJBQ0tFVCAmJiB0dDIgIT09IFJJR0hUX1BBUkVOICYmDQogICAgICAgICAgICAgICAgIHR0MiAhPT0gQ09MT04gJiYgdHQyICE9PSBDT01NQSkpKSB7DQogICAgICAgICAgICBpZiAodHQgPT09IFJFVFVSTikgew0KICAgICAgICAgICAgICAgIG4udmFsdWUgPSBFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICAgICAgICAgIHBhcmVudFNjcmlwdC5oYXNSZXR1cm5XaXRoVmFsdWUgPSB0cnVlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBuLnZhbHVlID0gQXNzaWduRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0dCA9PT0gUkVUVVJOKSB7DQogICAgICAgICAgICBwYXJlbnRTY3JpcHQuaGFzRW1wdHlSZXR1cm4gPSB0cnVlOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gRGlzYWxsb3cgcmV0dXJuIHY7IGluIGdlbmVyYXRvci4NCiAgICAgICAgaWYgKHBhcmVudFNjcmlwdC5oYXNSZXR1cm5XaXRoVmFsdWUgJiYgcGFyZW50U2NyaXB0LmlzR2VuZXJhdG9yKQ0KICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiR2VuZXJhdG9yIHJldHVybnMgYSB2YWx1ZSIpOw0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIC8qDQogICAgICogTW9kdWxlRXhwcmVzc2lvbiA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiAoU1RSSU5HIHwgSURFTlRJRklFUiB8IERPVCkgbm9kZQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIE1vZHVsZUV4cHJlc3Npb24odCwgeCkgew0KICAgICAgICByZXR1cm4gdC5tYXRjaChTVFJJTkcpID8gbmV3IE5vZGUodCkgOiBRdWFsaWZpZWRQYXRoKHQsIHgpOw0KICAgIH0NCg0KICAgIC8qDQogICAgICogSW1wb3J0UGF0aExpc3QgOjogKHRva2VuaXplciwgY29tcGlsZXIgY29udGV4dCkgLT4gQXJyYXlbRE9UIG5vZGVdDQogICAgICovDQogICAgZnVuY3Rpb24gSW1wb3J0UGF0aExpc3QodCwgeCkgew0KICAgICAgICB2YXIgYSA9IFtdOw0KICAgICAgICBkbyB7DQogICAgICAgICAgICBhLnB1c2goSW1wb3J0UGF0aCh0LCB4KSk7DQogICAgICAgIH0gd2hpbGUgKHQubWF0Y2goQ09NTUEpKTsNCiAgICAgICAgcmV0dXJuIGE7DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBJbXBvcnRQYXRoIDo6ICh0b2tlbml6ZXIsIGNvbXBpbGVyIGNvbnRleHQpIC0+IERPVCBub2RlDQogICAgICovDQogICAgZnVuY3Rpb24gSW1wb3J0UGF0aCh0LCB4KSB7DQogICAgICAgIHZhciBuID0gUXVhbGlmaWVkUGF0aCh0LCB4KTsNCiAgICAgICAgaWYgKCF0Lm1hdGNoKERPVCkpIHsNCiAgICAgICAgICAgIGlmIChuLnR5cGUgPT09IElERU5USUZJRVIpDQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiY2Fubm90IGltcG9ydCBsb2NhbCB2YXJpYWJsZSIpOw0KICAgICAgICAgICAgcmV0dXJuIG47DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgbjIgPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgbjIucHVzaChuKTsNCiAgICAgICAgbjIucHVzaChJbXBvcnRTcGVjaWZpZXJTZXQodCwgeCkpOw0KICAgICAgICByZXR1cm4gbjI7DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBFeHBsaWNpdFNwZWNpZmllclNldCA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0LCAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiBub2RlKQ0KICAgICAqICAgICAgICAgICAgICAgICAgICAgIC0+IE9CSkVDVF9JTklUIG5vZGUNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBFeHBsaWNpdFNwZWNpZmllclNldCh0LCB4LCBTcGVjaWZpZXJSSFMpIHsNCiAgICAgICAgdmFyIG4sIG4yLCBpZCwgdHQ7DQoNCiAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogT0JKRUNUX0lOSVQgfSk7DQogICAgICAgIHQubXVzdE1hdGNoKExFRlRfQ1VSTFkpOw0KDQogICAgICAgIGlmICghdC5tYXRjaChSSUdIVF9DVVJMWSkpIHsNCiAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICBpZCA9IElkZW50aWZpZXIodCwgeCk7DQogICAgICAgICAgICAgICAgaWYgKHQubWF0Y2goQ09MT04pKSB7DQogICAgICAgICAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCwgeyB0eXBlOiBQUk9QRVJUWV9JTklUIH0pOw0KICAgICAgICAgICAgICAgICAgICBuMi5wdXNoKGlkKTsNCiAgICAgICAgICAgICAgICAgICAgbjIucHVzaChTcGVjaWZpZXJSSFModCwgeCkpOw0KICAgICAgICAgICAgICAgICAgICBuLnB1c2gobjIpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIG4ucHVzaChpZCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSB3aGlsZSAoIXQubWF0Y2goUklHSFRfQ1VSTFkpICYmIHQubXVzdE1hdGNoKENPTU1BKSk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIEltcG9ydFNwZWNpZmllclNldCA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiAoSURFTlRJRklFUiB8IE9CSkVDVF9JTklUKSBub2RlDQogICAgICovDQogICAgZnVuY3Rpb24gSW1wb3J0U3BlY2lmaWVyU2V0KHQsIHgpIHsNCiAgICAgICAgcmV0dXJuIHQubWF0Y2goTVVMKQ0KICAgICAgICAgICAgID8gbmV3IE5vZGUodCwgeyB0eXBlOiBJREVOVElGSUVSLCBuYW1lOiAiKiIgfSkNCiAgICAgICAgICAgICA6IEV4cGxpY2l0U3BlY2lmaWVyU2V0KHQsIHgsIElkZW50aWZpZXIpOw0KICAgIH0NCg0KICAgIC8qDQogICAgICogSWRlbnRpZmllciA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiBJREVOVElGSUVSIG5vZGUNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBJZGVudGlmaWVyKHQsIHgpIHsNCiAgICAgICAgdC5tdXN0TWF0Y2goSURFTlRJRklFUik7DQogICAgICAgIHJldHVybiBuZXcgTm9kZSh0LCB7IHR5cGU6IElERU5USUZJRVIgfSk7DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBJZGVudGlmaWVyTmFtZSA6OiAodG9rZW5pemVyKSAtPiBJREVOVElGSUVSIG5vZGUNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBJZGVudGlmaWVyTmFtZSh0KSB7DQogICAgICAgIGlmICh0Lm1hdGNoKElERU5USUZJRVIpKQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlKHQsIHsgdHlwZTogSURFTlRJRklFUiB9KTsNCiAgICAgICAgdC5nZXQoKTsNCiAgICAgICAgaWYgKHQudG9rZW4udmFsdWUgaW4gZGVmaW5pdGlvbnMua2V5d29yZHMpDQogICAgICAgICAgICByZXR1cm4gbmV3IE5vZGUodCwgeyB0eXBlOiBJREVOVElGSUVSIH0pOw0KICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJtaXNzaW5nIElkZW50aWZpZXJOYW1lIik7DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBRdWFsaWZpZWRQYXRoIDo6ICh0b2tlbml6ZXIsIGNvbXBpbGVyIGNvbnRleHQpIC0+IChJREVOVElGSUVSIHwgRE9UKSBub2RlDQogICAgICovDQogICAgZnVuY3Rpb24gUXVhbGlmaWVkUGF0aCh0LCB4KSB7DQogICAgICAgIHZhciBuLCBuMjsNCg0KICAgICAgICBuID0gSWRlbnRpZmllcih0LCB4KTsNCg0KICAgICAgICB3aGlsZSAodC5tYXRjaChET1QpKSB7DQogICAgICAgICAgICBpZiAodC5wZWVrKCkgIT09IElERU5USUZJRVIpIHsNCiAgICAgICAgICAgICAgICAvLyBVbmdldCB0aGUgJy4nIHRva2VuLCB3aGljaCBpc24ndCBwYXJ0IG9mIHRoZSBRdWFsaWZpZWRQYXRoLg0KICAgICAgICAgICAgICAgIHQudW5nZXQoKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCk7DQogICAgICAgICAgICBuMi5wdXNoKG4pOw0KICAgICAgICAgICAgbjIucHVzaChJZGVudGlmaWVyKHQsIHgpKTsNCiAgICAgICAgICAgIG4gPSBuMjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIC8qDQogICAgICogRXhwb3J0UGF0aCA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiAoSURFTlRJRklFUiB8IERPVCB8IE9CSkVDVF9JTklUKSBub2RlDQogICAgICovDQogICAgZnVuY3Rpb24gRXhwb3J0UGF0aCh0LCB4KSB7DQogICAgICAgIGlmICh0LnBlZWsoKSA9PT0gTEVGVF9DVVJMWSkNCiAgICAgICAgICAgIHJldHVybiBFeHBsaWNpdFNwZWNpZmllclNldCh0LCB4LCBRdWFsaWZpZWRQYXRoKTsNCiAgICAgICAgcmV0dXJuIFF1YWxpZmllZFBhdGgodCwgeCk7DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBFeHBvcnRQYXRoTGlzdCA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KQ0KICAgICAqICAgICAgICAgICAgICAgIC0+IEFycmF5WyhJREVOVElGSUVSIHwgRE9UIHwgT0JKRUNUX0lOSVQpIG5vZGVdDQogICAgICovDQogICAgZnVuY3Rpb24gRXhwb3J0UGF0aExpc3QodCwgeCkgew0KICAgICAgICB2YXIgYSA9IFtdOw0KICAgICAgICBkbyB7DQogICAgICAgICAgICBhLnB1c2goRXhwb3J0UGF0aCh0LCB4KSk7DQogICAgICAgIH0gd2hpbGUgKHQubWF0Y2goQ09NTUEpKTsNCiAgICAgICAgcmV0dXJuIGE7DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBGdW5jdGlvbkRlZmluaXRpb24gOjogKHRva2VuaXplciwgY29tcGlsZXIgY29udGV4dCwgYm9vbGVhbiwNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkVEX0ZPUk0gb3IgRVhQUkVTU0VEX0ZPUk0gb3IgU1RBVEVNRU5UX0ZPUk0sDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICBbc3RyaW5nXSBvciBudWxsIG9yIHVuZGVmaW5lZCkNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgLT4gbm9kZQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIEZ1bmN0aW9uRGVmaW5pdGlvbih0LCB4LCByZXF1aXJlTmFtZSwgZnVuY3Rpb25Gb3JtLCBjb21tZW50cykgew0KICAgICAgICB2YXIgdHQ7DQogICAgICAgIHZhciBmID0gbmV3IE5vZGUodCwgeyBwYXJhbXM6IFtdLCBwYXJhbUNvbW1lbnRzOiBbXSB9KTsNCiAgICAgICAgaWYgKHR5cGVvZiBjb21tZW50ID09PSAidW5kZWZpbmVkIikNCiAgICAgICAgICAgIGNvbW1lbnQgPSBudWxsOw0KICAgICAgICBmLmJsb2NrQ29tbWVudHMgPSBjb21tZW50czsNCiAgICAgICAgaWYgKGYudHlwZSAhPT0gRlVOQ1RJT04pDQogICAgICAgICAgICBmLnR5cGUgPSAoZi52YWx1ZSA9PT0gImdldCIpID8gR0VUVEVSIDogU0VUVEVSOw0KICAgICAgICBpZiAodC5tYXRjaChJREVOVElGSUVSKSkNCiAgICAgICAgICAgIGYubmFtZSA9IHQudG9rZW4udmFsdWU7DQogICAgICAgIGVsc2UgaWYgKHJlcXVpcmVOYW1lKQ0KICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigibWlzc2luZyBmdW5jdGlvbiBpZGVudGlmaWVyIik7DQoNCiAgICAgICAgdmFyIGluTW9kdWxlID0geCA/IHguaW5Nb2R1bGUgOiBmYWxzZTsNCiAgICAgICAgdmFyIHgyID0gbmV3IFN0YXRpY0NvbnRleHQobnVsbCwgbnVsbCwgaW5Nb2R1bGUsIHRydWUpOw0KDQogICAgICAgIHQubXVzdE1hdGNoKExFRlRfUEFSRU4pOw0KICAgICAgICBpZiAoIXQubWF0Y2goUklHSFRfUEFSRU4pKSB7DQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgdHQgPSB0LmdldCgpOw0KICAgICAgICAgICAgICAgIGYucGFyYW1Db21tZW50cy5wdXNoKHQubGFzdEJsb2NrQ29tbWVudCgpKTsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR0KSB7DQogICAgICAgICAgICAgICAgICBjYXNlIExFRlRfQlJBQ0tFVDoNCiAgICAgICAgICAgICAgICAgIGNhc2UgTEVGVF9DVVJMWToNCiAgICAgICAgICAgICAgICAgICAgLy8gRGVzdHJ1Y3R1cmVkIGZvcm1hbCBwYXJhbWV0ZXJzLg0KICAgICAgICAgICAgICAgICAgICB0LnVuZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgIGYucGFyYW1zLnB1c2goRGVzdHJ1Y3R1cmluZ0V4cHJlc3Npb24odCwgeDIpKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6DQogICAgICAgICAgICAgICAgICAgIGYucGFyYW1zLnB1c2godC50b2tlbi52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigibWlzc2luZyBmb3JtYWwgcGFyYW1ldGVyIik7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gd2hpbGUgKHQubWF0Y2goQ09NTUEpKTsNCiAgICAgICAgICAgIHQubXVzdE1hdGNoKFJJR0hUX1BBUkVOKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIERvIHdlIGhhdmUgYW4gZXhwcmVzc2lvbiBjbG9zdXJlIG9yIGEgbm9ybWFsIGJvZHk/DQogICAgICAgIHR0ID0gdC5nZXQoKTsNCiAgICAgICAgaWYgKHR0ICE9PSBMRUZUX0NVUkxZKQ0KICAgICAgICAgICAgdC51bmdldCgpOw0KDQogICAgICAgIGlmICh0dCAhPT0gTEVGVF9DVVJMWSkgew0KICAgICAgICAgICAgZi5ib2R5ID0gQXNzaWduRXhwcmVzc2lvbih0LCB4Mik7DQogICAgICAgICAgICBpZiAoZi5ib2R5LmlzR2VuZXJhdG9yKQ0KICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkdlbmVyYXRvciByZXR1cm5zIGEgdmFsdWUiKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGYuYm9keSA9IFNjcmlwdCh0LCBpbk1vZHVsZSwgdHJ1ZSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodHQgPT09IExFRlRfQ1VSTFkpDQogICAgICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9DVVJMWSk7DQoNCiAgICAgICAgZi5lbmQgPSB0LnRva2VuLmVuZDsNCiAgICAgICAgZi5mdW5jdGlvbkZvcm0gPSBmdW5jdGlvbkZvcm07DQogICAgICAgIGlmIChmdW5jdGlvbkZvcm0gPT09IERFQ0xBUkVEX0ZPUk0pDQogICAgICAgICAgICB4LnBhcmVudFNjcmlwdC5mdW5EZWNscy5wdXNoKGYpOw0KICAgICAgICByZXR1cm4gZjsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIE1vZHVsZVZhcmlhYmxlcyA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0LCBNT0RVTEUgbm9kZSkgLT4gdm9pZA0KICAgICAqDQogICAgICogUGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlIGRlY2xhcmF0aW9ucyAoYW5kIG1heWJlDQogICAgICogaW5pdGlhbGl6YXRpb25zKS4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiBNb2R1bGVWYXJpYWJsZXModCwgeCwgbikgew0KICAgICAgICB2YXIgbjEsIG4yOw0KICAgICAgICBkbyB7DQogICAgICAgICAgICBuMSA9IElkZW50aWZpZXIodCwgeCk7DQogICAgICAgICAgICBpZiAodC5tYXRjaChBU1NJR04pKSB7DQogICAgICAgICAgICAgICAgbjIgPSBNb2R1bGVFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICAgICAgICAgIG4xLmluaXRpYWxpemVyID0gbjI7DQogICAgICAgICAgICAgICAgaWYgKG4yLnR5cGUgPT09IFNUUklORykNCiAgICAgICAgICAgICAgICAgICAgeC5wYXJlbnRTY3JpcHQubW9kTG9hZHMuc2V0KG4xLnZhbHVlLCBuMi52YWx1ZSk7DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB4LnBhcmVudFNjcmlwdC5tb2RBc3Nucy5zZXQobjEudmFsdWUsIG4xKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG4ucHVzaChuMSk7DQogICAgICAgIH0gd2hpbGUgKHQubWF0Y2goQ09NTUEpKTsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIFZhcmlhYmxlcyA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiBub2RlDQogICAgICoNCiAgICAgKiBQYXJzZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2YXIgZGVjbGFyYXRpb25zIChhbmQgbWF5YmUNCiAgICAgKiBpbml0aWFsaXphdGlvbnMpLg0KICAgICAqLw0KICAgIGZ1bmN0aW9uIFZhcmlhYmxlcyh0LCB4LCBsZXRCbG9jaykgew0KICAgICAgICB2YXIgbiwgbjIsIHNzLCBpLCBzLCB0dDsNCg0KICAgICAgICB0dCA9IHQudG9rZW4udHlwZTsNCiAgICAgICAgc3dpdGNoICh0dCkgew0KICAgICAgICAgIGNhc2UgVkFSOg0KICAgICAgICAgIGNhc2UgQ09OU1Q6DQogICAgICAgICAgICBzID0geC5wYXJlbnRTY3JpcHQ7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICBjYXNlIExFVDoNCiAgICAgICAgICAgIHMgPSB4LnBhcmVudEJsb2NrOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgY2FzZSBMRUZUX1BBUkVOOg0KICAgICAgICAgICAgdHQgPSBMRVQ7DQogICAgICAgICAgICBzID0gbGV0QmxvY2s7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KDQogICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IHR0LCBkZXN0cnVjdHVyaW5nczogW10gfSk7DQoNCiAgICAgICAgZG8gew0KICAgICAgICAgICAgdHQgPSB0LmdldCgpOw0KICAgICAgICAgICAgaWYgKHR0ID09PSBMRUZUX0JSQUNLRVQgfHwgdHQgPT09IExFRlRfQ1VSTFkpIHsNCiAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIHVuZ2V0IHRvIHBhcnNlIHRoZSBmdWxsIGRlc3RydWN0dXJlZCBleHByZXNzaW9uLg0KICAgICAgICAgICAgICAgIHQudW5nZXQoKTsNCg0KICAgICAgICAgICAgICAgIHZhciBkZXhwID0gRGVzdHJ1Y3R1cmluZ0V4cHJlc3Npb24odCwgeCwgdHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogSURFTlRJRklFUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZGV4cCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZE9ubHk6IG4udHlwZSA9PT0gQ09OU1QgfSk7DQogICAgICAgICAgICAgICAgbi5wdXNoKG4yKTsNCiAgICAgICAgICAgICAgICBwdXNoRGVzdHJ1Y3R1cmluZ1ZhckRlY2xzKG4yLm5hbWUuZGVzdHJ1Y3R1cmVkTmFtZXMsIHMpOw0KICAgICAgICAgICAgICAgIG4uZGVzdHJ1Y3R1cmluZ3MucHVzaCh7IGV4cDogZGV4cCwgZGVjbDogbjIgfSk7DQoNCiAgICAgICAgICAgICAgICBpZiAoeC5pbkZvckxvb3BJbml0ICYmIHQucGVlaygpID09PSBJTikgew0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB0Lm11c3RNYXRjaChBU1NJR04pOw0KICAgICAgICAgICAgICAgIGlmICh0LnRva2VuLmFzc2lnbk9wKQ0KICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJJbnZhbGlkIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIik7DQoNCiAgICAgICAgICAgICAgICBuMi5ibG9ja0NvbW1lbnQgPSB0Lmxhc3RCbG9ja0NvbW1lbnQoKTsNCiAgICAgICAgICAgICAgICBuMi5pbml0aWFsaXplciA9IEFzc2lnbkV4cHJlc3Npb24odCwgeCk7DQoNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHR0ICE9PSBJREVOVElGSUVSKQ0KICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIm1pc3NpbmcgdmFyaWFibGUgbmFtZSIpOw0KDQogICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogSURFTlRJRklFUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0LnRva2VuLnZhbHVlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRPbmx5OiBuLnR5cGUgPT09IENPTlNUIH0pOw0KICAgICAgICAgICAgbi5wdXNoKG4yKTsNCiAgICAgICAgICAgIHMudmFyRGVjbHMucHVzaChuMik7DQoNCiAgICAgICAgICAgIGlmICh0Lm1hdGNoKEFTU0lHTikpIHsNCiAgICAgICAgICAgICAgICB2YXIgY29tbWVudCA9IHQubGFzdEJsb2NrQ29tbWVudCgpOw0KICAgICAgICAgICAgICAgIGlmICh0LnRva2VuLmFzc2lnbk9wKQ0KICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJJbnZhbGlkIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIik7DQoNCiAgICAgICAgICAgICAgICBuMi5pbml0aWFsaXplciA9IEFzc2lnbkV4cHJlc3Npb24odCwgeCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBjb21tZW50ID0gdC5sYXN0QmxvY2tDb21tZW50KCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBuMi5ibG9ja0NvbW1lbnQgPSBjb21tZW50Ow0KICAgICAgICB9IHdoaWxlICh0Lm1hdGNoKENPTU1BKSk7DQoNCiAgICAgICAgcmV0dXJuIG47DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBMZXRCbG9jayA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0LCBib29sZWFuKSAtPiBub2RlDQogICAgICoNCiAgICAgKiBEb2VzIG5vdCBoYW5kbGUgbGV0IGluc2lkZSBvZiBmb3IgbG9vcCBpbml0Lg0KICAgICAqLw0KICAgIGZ1bmN0aW9uIExldEJsb2NrKHQsIHgsIGlzU3RhdGVtZW50KSB7DQogICAgICAgIHZhciBuLCBuMjsNCg0KICAgICAgICAvLyB0LnRva2VuLnR5cGUgbXVzdCBiZSBMRVQNCiAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogTEVUX0JMT0NLLCB2YXJEZWNsczogW10gfSk7DQogICAgICAgIHQubXVzdE1hdGNoKExFRlRfUEFSRU4pOw0KICAgICAgICBuLnZhcmlhYmxlcyA9IFZhcmlhYmxlcyh0LCB4LCBuKTsNCiAgICAgICAgdC5tdXN0TWF0Y2goUklHSFRfUEFSRU4pOw0KDQogICAgICAgIGlmIChpc1N0YXRlbWVudCAmJiB0LnBlZWsoKSAhPT0gTEVGVF9DVVJMWSkgew0KICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAqIElmIHRoaXMgaXMgcmVhbGx5IGFuIGV4cHJlc3Npb24gaW4gbGV0IHN0YXRlbWVudCBndWlzZSwgdGhlbiB3ZQ0KICAgICAgICAgICAgICogbmVlZCB0byB3cmFwIHRoZSBMRVRfQkxPQ0sgbm9kZSBpbiBhIFNFTUlDT0xPTiBub2RlIHNvIHRoYXQgd2UgcG9wDQogICAgICAgICAgICAgKiB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLg0KICAgICAgICAgICAgICovDQogICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogU0VNSUNPTE9OLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IG4gfSk7DQogICAgICAgICAgICBpc1N0YXRlbWVudCA9IGZhbHNlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGlzU3RhdGVtZW50KQ0KICAgICAgICAgICAgbi5ibG9jayA9IEJsb2NrKHQsIHgpOw0KICAgICAgICBlbHNlDQogICAgICAgICAgICBuLmV4cHJlc3Npb24gPSBBc3NpZ25FeHByZXNzaW9uKHQsIHgpOw0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNoZWNrRGVzdHJ1Y3R1cmluZyh0LCB4LCBuLCBzaW1wbGVOYW1lc09ubHkpIHsNCiAgICAgICAgaWYgKG4udHlwZSA9PT0gQVJSQVlfQ09NUCkNCiAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkludmFsaWQgYXJyYXkgY29tcHJlaGVuc2lvbiBsZWZ0LWhhbmQgc2lkZSIpOw0KICAgICAgICBpZiAobi50eXBlICE9PSBBUlJBWV9JTklUICYmIG4udHlwZSAhPT0gT0JKRUNUX0lOSVQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGxoc3MgPSB7fTsNCiAgICAgICAgdmFyIG5uLCBuMiwgaWR4LCBzdWIsIGNjLCBjID0gbi5jaGlsZHJlbjsNCiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBjLmxlbmd0aDsgaSA8IGo7IGkrKykgew0KICAgICAgICAgICAgaWYgKCEobm4gPSBjW2ldKSkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIGlmIChubi50eXBlID09PSBQUk9QRVJUWV9JTklUKSB7DQogICAgICAgICAgICAgICAgY2MgPSBubi5jaGlsZHJlbjsNCiAgICAgICAgICAgICAgICBzdWIgPSBjY1sxXTsNCiAgICAgICAgICAgICAgICBpZHggPSBjY1swXS52YWx1ZTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAobi50eXBlID09PSBPQkpFQ1RfSU5JVCkgew0KICAgICAgICAgICAgICAgIC8vIERvIHdlIGhhdmUgZGVzdHJ1Y3R1cmluZyBzaG9ydGhhbmQge2ZvbywgYmFyfT8NCiAgICAgICAgICAgICAgICBzdWIgPSBubjsNCiAgICAgICAgICAgICAgICBpZHggPSBubi52YWx1ZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgc3ViID0gbm47DQogICAgICAgICAgICAgICAgaWR4ID0gaTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHN1Yi50eXBlID09PSBBUlJBWV9JTklUIHx8IHN1Yi50eXBlID09PSBPQkpFQ1RfSU5JVCkgew0KICAgICAgICAgICAgICAgIGxoc3NbaWR4XSA9IGNoZWNrRGVzdHJ1Y3R1cmluZyh0LCB4LCBzdWIsIHNpbXBsZU5hbWVzT25seSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGlmIChzaW1wbGVOYW1lc09ubHkgJiYgc3ViLnR5cGUgIT09IElERU5USUZJRVIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gSW4gZGVjbGFyYXRpb25zLCBsaHMgbXVzdCBiZSBzaW1wbGUgbmFtZXMNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigibWlzc2luZyBuYW1lIGluIHBhdHRlcm4iKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBsaHNzW2lkeF0gPSBzdWI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbGhzczsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBEZXN0cnVjdHVyaW5nRXhwcmVzc2lvbih0LCB4LCBzaW1wbGVOYW1lc09ubHkpIHsNCiAgICAgICAgdmFyIG4gPSBQcmltYXJ5RXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgLy8gS2VlcCB0aGUgbGlzdCBvZiBsZWZ0aGFuZCBzaWRlcyBmb3IgdmFyRGVjbHMNCiAgICAgICAgbi5kZXN0cnVjdHVyZWROYW1lcyA9IGNoZWNrRGVzdHJ1Y3R1cmluZyh0LCB4LCBuLCBzaW1wbGVOYW1lc09ubHkpOw0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBHZW5lcmF0b3JFeHByZXNzaW9uKHQsIHgsIGUpIHsNCiAgICAgICAgcmV0dXJuIG5ldyBOb2RlKHQsIHsgdHlwZTogR0VORVJBVE9SLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsOiBDb21wcmVoZW5zaW9uVGFpbCh0LCB4KSB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBDb21wcmVoZW5zaW9uVGFpbCh0LCB4KSB7DQogICAgICAgIHZhciBib2R5LCBuLCBuMiwgbjMsIHA7DQoNCiAgICAgICAgLy8gdC50b2tlbi50eXBlIG11c3QgYmUgRk9SDQogICAgICAgIGJvZHkgPSBuZXcgTm9kZSh0LCB7IHR5cGU6IENPTVBfVEFJTCB9KTsNCg0KICAgICAgICBkbyB7DQogICAgICAgICAgICAvLyBDb21wcmVoZW5zaW9uIHRhaWxzIGFyZSBhbHdheXMgZm9yLi5pbiBsb29wcy4NCiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IEZPUl9JTiwgaXNMb29wOiB0cnVlIH0pOw0KICAgICAgICAgICAgaWYgKHQubWF0Y2goSURFTlRJRklFUikpIHsNCiAgICAgICAgICAgICAgICAvLyBCdXQgc29tZXRpbWVzIHRoZXkncmUgZm9yIGVhY2guLmluLg0KICAgICAgICAgICAgICAgIGlmICh0LnRva2VuLnZhbHVlID09PSAiZWFjaCIpDQogICAgICAgICAgICAgICAgICAgIG4uaXNFYWNoID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHQudW5nZXQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHAgPSBNYXliZUxlZnRQYXJlbih0LCB4KTsNCiAgICAgICAgICAgIHN3aXRjaCh0LmdldCgpKSB7DQogICAgICAgICAgICAgIGNhc2UgTEVGVF9CUkFDS0VUOg0KICAgICAgICAgICAgICBjYXNlIExFRlRfQ1VSTFk6DQogICAgICAgICAgICAgICAgdC51bmdldCgpOw0KICAgICAgICAgICAgICAgIC8vIERlc3RydWN0dXJlZCBsZWZ0IHNpZGUgb2YgZm9yIGluIGNvbXByZWhlbnNpb24gdGFpbHMuDQogICAgICAgICAgICAgICAgbi5pdGVyYXRvciA9IERlc3RydWN0dXJpbmdFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgIGNhc2UgSURFTlRJRklFUjoNCiAgICAgICAgICAgICAgICBuLml0ZXJhdG9yID0gbjMgPSBuZXcgTm9kZSh0LCB7IHR5cGU6IElERU5USUZJRVIgfSk7DQogICAgICAgICAgICAgICAgbjMubmFtZSA9IG4zLnZhbHVlOw0KICAgICAgICAgICAgICAgIG4udmFyRGVjbCA9IG4yID0gbmV3IE5vZGUodCwgeyB0eXBlOiBWQVIgfSk7DQogICAgICAgICAgICAgICAgbjIucHVzaChuMyk7DQogICAgICAgICAgICAgICAgeC5wYXJlbnRTY3JpcHQudmFyRGVjbHMucHVzaChuMyk7DQogICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWRkIHRvIHZhckRlY2xzIHNpbmNlIHRoZSBzZW1hbnRpY3Mgb2YgY29tcHJlaGVuc2lvbnMgaXMNCiAgICAgICAgICAgICAgICAvLyBzdWNoIHRoYXQgdGhlIHZhcmlhYmxlcyBhcmUgaW4gdGhlaXIgb3duIGZ1bmN0aW9uIHdoZW4NCiAgICAgICAgICAgICAgICAvLyBkZXN1Z2FyZWQuDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJtaXNzaW5nIGlkZW50aWZpZXIiKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHQubXVzdE1hdGNoKElOKTsNCiAgICAgICAgICAgIG4ub2JqZWN0ID0gRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgICAgIE1heWJlUmlnaHRQYXJlbih0LCBwKTsNCiAgICAgICAgICAgIGJvZHkucHVzaChuKTsNCiAgICAgICAgfSB3aGlsZSAodC5tYXRjaChGT1IpKTsNCg0KICAgICAgICAvLyBPcHRpb25hbCBndWFyZC4NCiAgICAgICAgaWYgKHQubWF0Y2goSUYpKQ0KICAgICAgICAgICAgYm9keS5ndWFyZCA9IEhlYWRFeHByZXNzaW9uKHQsIHgpOw0KDQogICAgICAgIHJldHVybiBib2R5Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIEhlYWRFeHByZXNzaW9uKHQsIHgpIHsNCiAgICAgICAgdmFyIHAgPSBNYXliZUxlZnRQYXJlbih0LCB4KTsNCiAgICAgICAgdmFyIG4gPSBQYXJlbkV4cHJlc3Npb24odCwgeCk7DQogICAgICAgIE1heWJlUmlnaHRQYXJlbih0LCBwKTsNCiAgICAgICAgaWYgKHAgPT09IEVORCAmJiAhbi5wYXJlbnRoZXNpemVkKSB7DQogICAgICAgICAgICB2YXIgdHQgPSB0LnBlZWsoKTsNCiAgICAgICAgICAgIGlmICh0dCAhPT0gTEVGVF9DVVJMWSAmJiAhZGVmaW5pdGlvbnMuaXNTdGF0ZW1lbnRTdGFydENvZGVbdHRdKQ0KICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIlVucGFyZW50aGVzaXplZCBoZWFkIGZvbGxvd2VkIGJ5IHVuYnJhY2VkIGJvZHkiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBQYXJlbkV4cHJlc3Npb24odCwgeCkgew0KICAgICAgICAvLyBBbHdheXMgYWNjZXB0IHRoZSAnaW4nIG9wZXJhdG9yIGluIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLA0KICAgICAgICAvLyB3aGVyZSBpdCdzIHVuYW1iaWd1b3VzLCBldmVuIGlmIHdlIG1pZ2h0IGJlIHBhcnNpbmcgdGhlIGluaXQgb2YgYQ0KICAgICAgICAvLyBmb3Igc3RhdGVtZW50Lg0KICAgICAgICB2YXIgbiA9IEV4cHJlc3Npb24odCwgeC51cGRhdGUoeyBpbkZvckxvb3BJbml0OiB4LmluRm9yTG9vcEluaXQgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQudG9rZW4udHlwZSA9PT0gTEVGVF9QQVJFTikgfSkpOw0KDQogICAgICAgIGlmICh0Lm1hdGNoKEZPUikpIHsNCiAgICAgICAgICAgIGlmIChuLnR5cGUgPT09IFlJRUxEICYmICFuLnBhcmVudGhlc2l6ZWQpDQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiWWllbGQgZXhwcmVzc2lvbiBtdXN0IGJlIHBhcmVudGhlc2l6ZWQiKTsNCiAgICAgICAgICAgIGlmIChuLnR5cGUgPT09IENPTU1BICYmICFuLnBhcmVudGhlc2l6ZWQpDQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiR2VuZXJhdG9yIGV4cHJlc3Npb24gbXVzdCBiZSBwYXJlbnRoZXNpemVkIik7DQogICAgICAgICAgICBuID0gR2VuZXJhdG9yRXhwcmVzc2lvbih0LCB4LCBuKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIC8qDQogICAgICogRXhwcmVzc2lvbiA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiBub2RlDQogICAgICoNCiAgICAgKiBUb3AtZG93biBleHByZXNzaW9uIHBhcnNlciBtYXRjaGVkIGFnYWluc3QgU3BpZGVyTW9ua2V5Lg0KICAgICAqLw0KICAgIGZ1bmN0aW9uIEV4cHJlc3Npb24odCwgeCkgew0KICAgICAgICB2YXIgbiwgbjI7DQoNCiAgICAgICAgbiA9IEFzc2lnbkV4cHJlc3Npb24odCwgeCk7DQogICAgICAgIGlmICh0Lm1hdGNoKENPTU1BKSkgew0KICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0LCB7IHR5cGU6IENPTU1BIH0pOw0KICAgICAgICAgICAgbjIucHVzaChuKTsNCiAgICAgICAgICAgIG4gPSBuMjsNCiAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICBuMiA9IG4uY2hpbGRyZW5bbi5jaGlsZHJlbi5sZW5ndGgtMV07DQogICAgICAgICAgICAgICAgaWYgKG4yLnR5cGUgPT09IFlJRUxEICYmICFuMi5wYXJlbnRoZXNpemVkKQ0KICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJZaWVsZCBleHByZXNzaW9uIG11c3QgYmUgcGFyZW50aGVzaXplZCIpOw0KICAgICAgICAgICAgICAgIG4ucHVzaChBc3NpZ25FeHByZXNzaW9uKHQsIHgpKTsNCiAgICAgICAgICAgIH0gd2hpbGUgKHQubWF0Y2goQ09NTUEpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIEFzc2lnbkV4cHJlc3Npb24odCwgeCkgew0KICAgICAgICB2YXIgbiwgbGhzOw0KDQogICAgICAgIC8vIEhhdmUgdG8gdHJlYXQgeWllbGQgbGlrZSBhbiBvcGVyYW5kIGJlY2F1c2UgaXQgY291bGQgYmUgdGhlIGxlZnRtb3N0DQogICAgICAgIC8vIG9wZXJhbmQgb2YgdGhlIGV4cHJlc3Npb24uDQogICAgICAgIGlmICh0Lm1hdGNoKFlJRUxELCB0cnVlKSkNCiAgICAgICAgICAgIHJldHVybiBSZXR1cm5PcllpZWxkKHQsIHgpOw0KDQogICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IEFTU0lHTiB9KTsNCiAgICAgICAgbGhzID0gQ29uZGl0aW9uYWxFeHByZXNzaW9uKHQsIHgpOw0KDQogICAgICAgIGlmICghdC5tYXRjaChBU1NJR04pKSB7DQogICAgICAgICAgICByZXR1cm4gbGhzOw0KICAgICAgICB9DQoNCiAgICAgICAgbi5ibG9ja0NvbW1lbnQgPSB0Lmxhc3RCbG9ja0NvbW1lbnQoKTsNCg0KICAgICAgICBzd2l0Y2ggKGxocy50eXBlKSB7DQogICAgICAgICAgY2FzZSBPQkpFQ1RfSU5JVDoNCiAgICAgICAgICBjYXNlIEFSUkFZX0lOSVQ6DQogICAgICAgICAgICBsaHMuZGVzdHJ1Y3R1cmVkTmFtZXMgPSBjaGVja0Rlc3RydWN0dXJpbmcodCwgeCwgbGhzKTsNCiAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSA0KICAgICAgICAgIGNhc2UgSURFTlRJRklFUjogY2FzZSBET1Q6IGNhc2UgSU5ERVg6IGNhc2UgQ0FMTDoNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJCYWQgbGVmdC1oYW5kIHNpZGUgb2YgYXNzaWdubWVudCIpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCg0KICAgICAgICBuLmFzc2lnbk9wID0gbGhzLmFzc2lnbk9wID0gdC50b2tlbi5hc3NpZ25PcDsNCiAgICAgICAgbi5wdXNoKGxocyk7DQogICAgICAgIG4ucHVzaChBc3NpZ25FeHByZXNzaW9uKHQsIHgpKTsNCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBDb25kaXRpb25hbEV4cHJlc3Npb24odCwgeCkgew0KICAgICAgICB2YXIgbiwgbjI7DQoNCiAgICAgICAgbiA9IE9yRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgaWYgKHQubWF0Y2goSE9PSykpIHsNCiAgICAgICAgICAgIG4yID0gbjsNCiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IEhPT0sgfSk7DQogICAgICAgICAgICBuLnB1c2gobjIpOw0KICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAqIEFsd2F5cyBhY2NlcHQgdGhlICdpbicgb3BlcmF0b3IgaW4gdGhlIG1pZGRsZSBjbGF1c2Ugb2YgYSB0ZXJuYXJ5LA0KICAgICAgICAgICAgICogd2hlcmUgaXQncyB1bmFtYmlndW91cywgZXZlbiBpZiB3ZSBtaWdodCBiZSBwYXJzaW5nIHRoZSBpbml0IG9mIGENCiAgICAgICAgICAgICAqIGZvciBzdGF0ZW1lbnQuDQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIG4ucHVzaChBc3NpZ25FeHByZXNzaW9uKHQsIHgudXBkYXRlKHsgaW5Gb3JMb29wSW5pdDogZmFsc2UgfSkpKTsNCiAgICAgICAgICAgIGlmICghdC5tYXRjaChDT0xPTikpDQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigibWlzc2luZyA6IGFmdGVyID8iKTsNCiAgICAgICAgICAgIG4ucHVzaChBc3NpZ25FeHByZXNzaW9uKHQsIHgpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIE9yRXhwcmVzc2lvbih0LCB4KSB7DQogICAgICAgIHZhciBuLCBuMjsNCg0KICAgICAgICBuID0gQW5kRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgd2hpbGUgKHQubWF0Y2goT1IpKSB7DQogICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgbjIucHVzaChuKTsNCiAgICAgICAgICAgIG4yLnB1c2goQW5kRXhwcmVzc2lvbih0LCB4KSk7DQogICAgICAgICAgICBuID0gbjI7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBBbmRFeHByZXNzaW9uKHQsIHgpIHsNCiAgICAgICAgdmFyIG4sIG4yOw0KDQogICAgICAgIG4gPSBCaXR3aXNlT3JFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICB3aGlsZSAodC5tYXRjaChBTkQpKSB7DQogICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgbjIucHVzaChuKTsNCiAgICAgICAgICAgIG4yLnB1c2goQml0d2lzZU9yRXhwcmVzc2lvbih0LCB4KSk7DQogICAgICAgICAgICBuID0gbjI7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBCaXR3aXNlT3JFeHByZXNzaW9uKHQsIHgpIHsNCiAgICAgICAgdmFyIG4sIG4yOw0KDQogICAgICAgIG4gPSBCaXR3aXNlWG9yRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgd2hpbGUgKHQubWF0Y2goQklUV0lTRV9PUikpIHsNCiAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCk7DQogICAgICAgICAgICBuMi5wdXNoKG4pOw0KICAgICAgICAgICAgbjIucHVzaChCaXR3aXNlWG9yRXhwcmVzc2lvbih0LCB4KSk7DQogICAgICAgICAgICBuID0gbjI7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBCaXR3aXNlWG9yRXhwcmVzc2lvbih0LCB4KSB7DQogICAgICAgIHZhciBuLCBuMjsNCg0KICAgICAgICBuID0gQml0d2lzZUFuZEV4cHJlc3Npb24odCwgeCk7DQogICAgICAgIHdoaWxlICh0Lm1hdGNoKEJJVFdJU0VfWE9SKSkgew0KICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgIG4yLnB1c2gobik7DQogICAgICAgICAgICBuMi5wdXNoKEJpdHdpc2VBbmRFeHByZXNzaW9uKHQsIHgpKTsNCiAgICAgICAgICAgIG4gPSBuMjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIEJpdHdpc2VBbmRFeHByZXNzaW9uKHQsIHgpIHsNCiAgICAgICAgdmFyIG4sIG4yOw0KDQogICAgICAgIG4gPSBFcXVhbGl0eUV4cHJlc3Npb24odCwgeCk7DQogICAgICAgIHdoaWxlICh0Lm1hdGNoKEJJVFdJU0VfQU5EKSkgew0KICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgIG4yLnB1c2gobik7DQogICAgICAgICAgICBuMi5wdXNoKEVxdWFsaXR5RXhwcmVzc2lvbih0LCB4KSk7DQogICAgICAgICAgICBuID0gbjI7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBFcXVhbGl0eUV4cHJlc3Npb24odCwgeCkgew0KICAgICAgICB2YXIgbiwgbjI7DQoNCiAgICAgICAgbiA9IFJlbGF0aW9uYWxFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICB3aGlsZSAodC5tYXRjaChFUSkgfHwgdC5tYXRjaChORSkgfHwNCiAgICAgICAgICAgICAgIHQubWF0Y2goU1RSSUNUX0VRKSB8fCB0Lm1hdGNoKFNUUklDVF9ORSkpIHsNCiAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCk7DQogICAgICAgICAgICBuMi5wdXNoKG4pOw0KICAgICAgICAgICAgbjIucHVzaChSZWxhdGlvbmFsRXhwcmVzc2lvbih0LCB4KSk7DQogICAgICAgICAgICBuID0gbjI7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBSZWxhdGlvbmFsRXhwcmVzc2lvbih0LCB4KSB7DQogICAgICAgIHZhciBuLCBuMjsNCg0KICAgICAgICAvKg0KICAgICAgICAgKiBVc2VzIG9mIHRoZSBpbiBvcGVyYXRvciBpbiBzaGlmdEV4cHJzIGFyZSBhbHdheXMgdW5hbWJpZ3VvdXMsDQogICAgICAgICAqIHNvIHVuc2V0IHRoZSBmbGFnIHRoYXQgcHJvaGliaXRzIHJlY29nbml6aW5nIGl0Lg0KICAgICAgICAgKi8NCiAgICAgICAgdmFyIHgyID0geC51cGRhdGUoeyBpbkZvckxvb3BJbml0OiBmYWxzZSB9KTsNCiAgICAgICAgbiA9IFNoaWZ0RXhwcmVzc2lvbih0LCB4Mik7DQogICAgICAgIHdoaWxlICgodC5tYXRjaChMVCkgfHwgdC5tYXRjaChMRSkgfHwgdC5tYXRjaChHRSkgfHwgdC5tYXRjaChHVCkgfHwNCiAgICAgICAgICAgICAgICgheC5pbkZvckxvb3BJbml0ICYmIHQubWF0Y2goSU4pKSB8fA0KICAgICAgICAgICAgICAgdC5tYXRjaChJTlNUQU5DRU9GKSkpIHsNCiAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCk7DQogICAgICAgICAgICBuMi5wdXNoKG4pOw0KICAgICAgICAgICAgbjIucHVzaChTaGlmdEV4cHJlc3Npb24odCwgeDIpKTsNCiAgICAgICAgICAgIG4gPSBuMjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIFNoaWZ0RXhwcmVzc2lvbih0LCB4KSB7DQogICAgICAgIHZhciBuLCBuMjsNCg0KICAgICAgICBuID0gQWRkRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgd2hpbGUgKHQubWF0Y2goTFNIKSB8fCB0Lm1hdGNoKFJTSCkgfHwgdC5tYXRjaChVUlNIKSkgew0KICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgIG4yLnB1c2gobik7DQogICAgICAgICAgICBuMi5wdXNoKEFkZEV4cHJlc3Npb24odCwgeCkpOw0KICAgICAgICAgICAgbiA9IG4yOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIG47DQogICAgfQ0KDQogICAgZnVuY3Rpb24gQWRkRXhwcmVzc2lvbih0LCB4KSB7DQogICAgICAgIHZhciBuLCBuMjsNCg0KICAgICAgICBuID0gTXVsdGlwbHlFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICB3aGlsZSAodC5tYXRjaChQTFVTKSB8fCB0Lm1hdGNoKE1JTlVTKSkgew0KICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgIG4yLnB1c2gobik7DQogICAgICAgICAgICBuMi5wdXNoKE11bHRpcGx5RXhwcmVzc2lvbih0LCB4KSk7DQogICAgICAgICAgICBuID0gbjI7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBNdWx0aXBseUV4cHJlc3Npb24odCwgeCkgew0KICAgICAgICB2YXIgbiwgbjI7DQoNCiAgICAgICAgbiA9IFVuYXJ5RXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgd2hpbGUgKHQubWF0Y2goTVVMKSB8fCB0Lm1hdGNoKERJVikgfHwgdC5tYXRjaChNT0QpKSB7DQogICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgbjIucHVzaChuKTsNCiAgICAgICAgICAgIG4yLnB1c2goVW5hcnlFeHByZXNzaW9uKHQsIHgpKTsNCiAgICAgICAgICAgIG4gPSBuMjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIFVuYXJ5RXhwcmVzc2lvbih0LCB4KSB7DQogICAgICAgIHZhciBuLCBuMiwgdHQ7DQoNCiAgICAgICAgc3dpdGNoICh0dCA9IHQuZ2V0KHRydWUpKSB7DQogICAgICAgICAgY2FzZSBERUxFVEU6IGNhc2UgVk9JRDogY2FzZSBUWVBFT0Y6DQogICAgICAgICAgY2FzZSBOT1Q6IGNhc2UgQklUV0lTRV9OT1Q6IGNhc2UgUExVUzogY2FzZSBNSU5VUzoNCiAgICAgICAgICAgIGlmICh0dCA9PT0gUExVUykNCiAgICAgICAgICAgICAgICBuID0gbmV3IE5vZGUodCwgeyB0eXBlOiBVTkFSWV9QTFVTIH0pOw0KICAgICAgICAgICAgZWxzZSBpZiAodHQgPT09IE1JTlVTKQ0KICAgICAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IFVOQVJZX01JTlVTIH0pOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgIG4ucHVzaChVbmFyeUV4cHJlc3Npb24odCwgeCkpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBjYXNlIElOQ1JFTUVOVDoNCiAgICAgICAgICBjYXNlIERFQ1JFTUVOVDoNCiAgICAgICAgICAgIC8vIFByZWZpeCBpbmNyZW1lbnQvZGVjcmVtZW50Lg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgbi5wdXNoKE1lbWJlckV4cHJlc3Npb24odCwgeCwgdHJ1ZSkpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgdC51bmdldCgpOw0KICAgICAgICAgICAgbiA9IE1lbWJlckV4cHJlc3Npb24odCwgeCwgdHJ1ZSk7DQoNCiAgICAgICAgICAgIC8vIERvbid0IGxvb2sgYWNyb3NzIGEgbmV3bGluZSBib3VuZGFyeSBmb3IgYSBwb3N0Zml4IHtpbixkZX1jcmVtZW50Lg0KICAgICAgICAgICAgaWYgKHQudG9rZW5zWyh0LnRva2VuSW5kZXggKyB0Lmxvb2thaGVhZCAtIDEpICYgM10ubGluZW5vID09PQ0KICAgICAgICAgICAgICAgIHQubGluZW5vKSB7DQogICAgICAgICAgICAgICAgaWYgKHQubWF0Y2goSU5DUkVNRU5UKSB8fCB0Lm1hdGNoKERFQ1JFTUVOVCkpIHsNCiAgICAgICAgICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0LCB7IHBvc3RmaXg6IHRydWUgfSk7DQogICAgICAgICAgICAgICAgICAgIG4yLnB1c2gobik7DQogICAgICAgICAgICAgICAgICAgIG4gPSBuMjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIE1lbWJlckV4cHJlc3Npb24odCwgeCwgYWxsb3dDYWxsU3ludGF4KSB7DQogICAgICAgIHZhciBuLCBuMiwgbmFtZSwgdHQ7DQoNCiAgICAgICAgaWYgKHQubWF0Y2goTkVXKSkgew0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgbi5wdXNoKE1lbWJlckV4cHJlc3Npb24odCwgeCwgZmFsc2UpKTsNCiAgICAgICAgICAgIGlmICh0Lm1hdGNoKExFRlRfUEFSRU4pKSB7DQogICAgICAgICAgICAgICAgbi50eXBlID0gTkVXX1dJVEhfQVJHUzsNCiAgICAgICAgICAgICAgICBuLnB1c2goQXJndW1lbnRMaXN0KHQsIHgpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIG4gPSBQcmltYXJ5RXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHdoaWxlICgodHQgPSB0LmdldCgpKSAhPT0gRU5EKSB7DQogICAgICAgICAgICBzd2l0Y2ggKHR0KSB7DQogICAgICAgICAgICAgIGNhc2UgRE9UOg0KICAgICAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCk7DQogICAgICAgICAgICAgICAgbjIucHVzaChuKTsNCiAgICAgICAgICAgICAgICBuMi5wdXNoKElkZW50aWZpZXJOYW1lKHQpKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICBjYXNlIExFRlRfQlJBQ0tFVDoNCiAgICAgICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogSU5ERVggfSk7DQogICAgICAgICAgICAgICAgbjIucHVzaChuKTsNCiAgICAgICAgICAgICAgICBuMi5wdXNoKEV4cHJlc3Npb24odCwgeCkpOw0KICAgICAgICAgICAgICAgIHQubXVzdE1hdGNoKFJJR0hUX0JSQUNLRVQpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgIGNhc2UgTEVGVF9QQVJFTjoNCiAgICAgICAgICAgICAgICBpZiAoYWxsb3dDYWxsU3ludGF4KSB7DQogICAgICAgICAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCwgeyB0eXBlOiBDQUxMIH0pOw0KICAgICAgICAgICAgICAgICAgICBuMi5wdXNoKG4pOw0KICAgICAgICAgICAgICAgICAgICBuMi5wdXNoKEFyZ3VtZW50TGlzdCh0LCB4KSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSA0KICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIHQudW5nZXQoKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gbjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbiA9IG4yOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIG47DQogICAgfQ0KDQogICAgZnVuY3Rpb24gQXJndW1lbnRMaXN0KHQsIHgpIHsNCiAgICAgICAgdmFyIG4sIG4yOw0KDQogICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IExJU1QgfSk7DQogICAgICAgIGlmICh0Lm1hdGNoKFJJR0hUX1BBUkVOLCB0cnVlKSkNCiAgICAgICAgICAgIHJldHVybiBuOw0KICAgICAgICBkbyB7DQogICAgICAgICAgICBuMiA9IEFzc2lnbkV4cHJlc3Npb24odCwgeCk7DQogICAgICAgICAgICBpZiAobjIudHlwZSA9PT0gWUlFTEQgJiYgIW4yLnBhcmVudGhlc2l6ZWQgJiYgdC5wZWVrKCkgPT09IENPTU1BKQ0KICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIllpZWxkIGV4cHJlc3Npb24gbXVzdCBiZSBwYXJlbnRoZXNpemVkIik7DQogICAgICAgICAgICBpZiAodC5tYXRjaChGT1IpKSB7DQogICAgICAgICAgICAgICAgbjIgPSBHZW5lcmF0b3JFeHByZXNzaW9uKHQsIHgsIG4yKTsNCiAgICAgICAgICAgICAgICBpZiAobi5jaGlsZHJlbi5sZW5ndGggPiAxIHx8IHQucGVlayh0cnVlKSA9PT0gQ09NTUEpDQogICAgICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkdlbmVyYXRvciBleHByZXNzaW9uIG11c3QgYmUgcGFyZW50aGVzaXplZCIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbi5wdXNoKG4yKTsNCiAgICAgICAgfSB3aGlsZSAodC5tYXRjaChDT01NQSkpOw0KICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9QQVJFTik7DQoNCiAgICAgICAgcmV0dXJuIG47DQogICAgfQ0KDQogICAgZnVuY3Rpb24gUHJpbWFyeUV4cHJlc3Npb24odCwgeCkgew0KICAgICAgICB2YXIgbiwgbjIsIHR0ID0gdC5nZXQodHJ1ZSk7DQoNCiAgICAgICAgc3dpdGNoICh0dCkgew0KICAgICAgICAgIGNhc2UgRlVOQ1RJT046DQogICAgICAgICAgICBuID0gRnVuY3Rpb25EZWZpbml0aW9uKHQsIHgsIGZhbHNlLCBFWFBSRVNTRURfRk9STSk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgIGNhc2UgTEVGVF9CUkFDS0VUOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogQVJSQVlfSU5JVCB9KTsNCiAgICAgICAgICAgIHdoaWxlICgodHQgPSB0LnBlZWsodHJ1ZSkpICE9PSBSSUdIVF9CUkFDS0VUKSB7DQogICAgICAgICAgICAgICAgaWYgKHR0ID09PSBDT01NQSkgew0KICAgICAgICAgICAgICAgICAgICB0LmdldCgpOw0KICAgICAgICAgICAgICAgICAgICBuLnB1c2gobnVsbCk7DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBuLnB1c2goQXNzaWduRXhwcmVzc2lvbih0LCB4KSk7DQogICAgICAgICAgICAgICAgaWYgKHR0ICE9PSBDT01NQSAmJiAhdC5tYXRjaChDT01NQSkpDQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBJZiB3ZSBtYXRjaGVkIGV4YWN0bHkgb25lIGVsZW1lbnQgYW5kIGdvdCBhIEZPUiwgd2UgaGF2ZSBhbg0KICAgICAgICAgICAgLy8gYXJyYXkgY29tcHJlaGVuc2lvbi4NCiAgICAgICAgICAgIGlmIChuLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiB0Lm1hdGNoKEZPUikpIHsNCiAgICAgICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogQVJSQVlfQ09NUCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogbi5jaGlsZHJlblswXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbDogQ29tcHJlaGVuc2lvblRhaWwodCwgeCkgfSk7DQogICAgICAgICAgICAgICAgbiA9IG4yOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdC5tdXN0TWF0Y2goUklHSFRfQlJBQ0tFVCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgIGNhc2UgTEVGVF9DVVJMWToNCiAgICAgICAgICAgIHZhciBpZCwgZmQ7DQogICAgICAgICAgICBuID0gbmV3IE5vZGUodCwgeyB0eXBlOiBPQkpFQ1RfSU5JVCB9KTsNCg0KICAgICAgICAgIG9iamVjdF9pbml0Og0KICAgICAgICAgICAgaWYgKCF0Lm1hdGNoKFJJR0hUX0NVUkxZKSkgew0KICAgICAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICAgICAgdHQgPSB0LmdldCgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKHQudG9rZW4udmFsdWUgPT09ICJnZXQiIHx8IHQudG9rZW4udmFsdWUgPT09ICJzZXQiKSAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgdC5wZWVrKCkgPT09IElERU5USUZJRVIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4LmVjbWEzT25seU1vZGUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiSWxsZWdhbCBwcm9wZXJ0eSBhY2Nlc3NvciIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgbi5wdXNoKEZ1bmN0aW9uRGVmaW5pdGlvbih0LCB4LCB0cnVlLCBFWFBSRVNTRURfRk9STSkpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnRzID0gdC5ibG9ja0NvbW1lbnRzOw0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0dCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6IGNhc2UgTlVNQkVSOiBjYXNlIFNUUklORzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IG5ldyBOb2RlKHQsIHsgdHlwZTogSURFTlRJRklFUiB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSSUdIVF9DVVJMWToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeC5lY21hM09ubHlNb2RlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJJbGxlZ2FsIHRyYWlsaW5nICwiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBvYmplY3RfaW5pdDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC50b2tlbi52YWx1ZSBpbiBkZWZpbml0aW9ucy5rZXl3b3Jkcykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IG5ldyBOb2RlKHQsIHsgdHlwZTogSURFTlRJRklFUiB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkludmFsaWQgcHJvcGVydHkgbmFtZSIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQubWF0Y2goQ09MT04pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0LCB7IHR5cGU6IFBST1BFUlRZX0lOSVQgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbjIucHVzaChpZCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbjIucHVzaChBc3NpZ25FeHByZXNzaW9uKHQsIHgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuMi5ibG9ja0NvbW1lbnRzID0gY29tbWVudHM7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5wdXNoKG4yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VwcG9ydCwgZS5nLiwgfHZhciB7eCwgeX0gPSBvfCBhcyBkZXN0cnVjdHVyaW5nIHNob3J0aGFuZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB8dmFyIHt4OiB4LCB5OiB5fSA9IG98LCBwZXIgcHJvcG9zZWQgSlMyL0VTNCBmb3IgSlMxLjguDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQucGVlaygpICE9PSBDT01NQSAmJiB0LnBlZWsoKSAhPT0gUklHSFRfQ1VSTFkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIm1pc3NpbmcgOiBhZnRlciBwcm9wZXJ0eSIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucHVzaChpZCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IHdoaWxlICh0Lm1hdGNoKENPTU1BKSk7DQogICAgICAgICAgICAgICAgdC5tdXN0TWF0Y2goUklHSFRfQ1VSTFkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBjYXNlIExFRlRfUEFSRU46DQogICAgICAgICAgICBuID0gUGFyZW5FeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICAgICAgdC5tdXN0TWF0Y2goUklHSFRfUEFSRU4pOw0KICAgICAgICAgICAgbi5wYXJlbnRoZXNpemVkID0gdHJ1ZTsNCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgY2FzZSBMRVQ6DQogICAgICAgICAgICBuID0gTGV0QmxvY2sodCwgeCwgZmFsc2UpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBjYXNlIE5VTEw6IGNhc2UgVEhJUzogY2FzZSBUUlVFOiBjYXNlIEZBTFNFOg0KICAgICAgICAgIGNhc2UgSURFTlRJRklFUjogY2FzZSBOVU1CRVI6IGNhc2UgU1RSSU5HOiBjYXNlIFJFR0VYUDoNCiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIm1pc3Npbmcgb3BlcmFuZCIpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIHBhcnNlIDo6IChzb3VyY2UsIGZpbGVuYW1lLCBsaW5lIG51bWJlcikgLT4gbm9kZQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHBhcnNlKHMsIGYsIGwpIHsNCiAgICAgICAgdmFyIHQgPSBuZXcgbGV4ZXIuVG9rZW5pemVyKHMsIGYsIGwpOw0KICAgICAgICB2YXIgbiA9IFNjcmlwdCh0LCBmYWxzZSwgZmFsc2UpOw0KICAgICAgICBpZiAoIXQuZG9uZSkNCiAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIlN5bnRheCBlcnJvciIpOw0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIC8qDQogICAgICogcGFyc2VTdGRpbiA6OiAoc291cmNlLCB7bGluZSBudW1iZXJ9LCBzdHJpbmcsIChzdHJpbmcpIC0+IGJvb2xlYW4pIC0+IHByb2dyYW0gbm9kZQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHBhcnNlU3RkaW4ocywgbG4sIHByZWZpeCwgaXNDb21tYW5kKSB7DQogICAgICAgIC8vIHRoZSBzcGVjaWFsIC5iZWdpbiBjb21tYW5kIGlzIG9ubHkgcmVjb2duaXplZCBhdCB0aGUgYmVnaW5uaW5nDQogICAgICAgIGlmIChzLm1hdGNoKC9eW1xzXSpcLmJlZ2luW1xzXSokLykpIHsNCiAgICAgICAgICAgICsrbG4udmFsdWU7DQogICAgICAgICAgICByZXR1cm4gcGFyc2VNdWx0aWxpbmUobG4sIHByZWZpeCk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBjb21tYW5kcyBhdCB0aGUgYmVnaW5uaW5nIGFyZSB0cmVhdGVkIGFzIHRoZSBlbnRpcmUgaW5wdXQNCiAgICAgICAgaWYgKGlzQ29tbWFuZChzLnRyaW0oKSkpDQogICAgICAgICAgICBzID0gIiI7DQoNCiAgICAgICAgZm9yICg7Oykgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICB2YXIgdCA9IG5ldyBsZXhlci5Ub2tlbml6ZXIocywgInN0ZGluIiwgbG4udmFsdWUpOw0KICAgICAgICAgICAgICAgIHZhciBuID0gU2NyaXB0KHQsIGZhbHNlLCBmYWxzZSk7DQogICAgICAgICAgICAgICAgbG4udmFsdWUgPSB0LmxpbmVubzsNCiAgICAgICAgICAgICAgICByZXR1cm4gbjsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICBpZiAoIXQudW5leHBlY3RlZEVPRikNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsNCg0KICAgICAgICAgICAgICAgIC8vIGNvbW1hbmRzIGluIHRoZSBtaWRkbGUgYXJlIG5vdCB0cmVhdGVkIGFzIHBhcnQgb2YgdGhlIGlucHV0DQogICAgICAgICAgICAgICAgdmFyIG1vcmU7DQogICAgICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4KQ0KICAgICAgICAgICAgICAgICAgICAgICAgcHV0c3RyKHByZWZpeCk7DQogICAgICAgICAgICAgICAgICAgIG1vcmUgPSByZWFkbGluZSgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoIW1vcmUpDQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOw0KICAgICAgICAgICAgICAgIH0gd2hpbGUgKGlzQ29tbWFuZChtb3JlLnRyaW0oKSkpOw0KDQogICAgICAgICAgICAgICAgcyArPSAiXG4iICsgbW9yZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qDQogICAgICogcGFyc2VNdWx0aWxpbmUgOjogKHtsaW5lIG51bWJlcn0sIHN0cmluZyB8IG51bGwpIC0+IHByb2dyYW0gbm9kZQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHBhcnNlTXVsdGlsaW5lKGxuLCBwcmVmaXgpIHsNCiAgICAgICAgdmFyIHMgPSAiIjsNCiAgICAgICAgZm9yICg7Oykgew0KICAgICAgICAgICAgaWYgKHByZWZpeCkNCiAgICAgICAgICAgICAgICBwdXRzdHIocHJlZml4KTsNCiAgICAgICAgICAgIHZhciBtb3JlID0gcmVhZGxpbmUoKTsNCiAgICAgICAgICAgIGlmIChtb3JlID09PSBudWxsKQ0KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgLy8gdGhlIG9ubHkgY29tbWFuZCByZWNvZ25pemVkIGluIG11bHRpbGluZSBtb2RlIGlzIC5lbmQNCiAgICAgICAgICAgIGlmIChtb3JlLm1hdGNoKC9eW1xzXSpcLmVuZFtcc10qJC8pKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgcyArPSAiXG4iICsgbW9yZTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgdCA9IG5ldyBsZXhlci5Ub2tlbml6ZXIocywgInN0ZGluIiwgbG4udmFsdWUpOw0KICAgICAgICB2YXIgbiA9IFNjcmlwdCh0LCBmYWxzZSwgZmFsc2UpOw0KICAgICAgICBsbi52YWx1ZSA9IHQubGluZW5vOw0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBtb2R1bGUuZXhwb3J0cyA9IHsNCiAgICAgICAgcGFyc2U6IHBhcnNlLA0KICAgICAgICBwYXJzZVN0ZGluOiBwYXJzZVN0ZGluLA0KICAgICAgICBOb2RlOiBOb2RlLA0KICAgICAgICBTeW50aGV0aWNOb2RlOiBTeW50aGV0aWNOb2RlLA0KICAgICAgICBERUNMQVJFRF9GT1JNOiBERUNMQVJFRF9GT1JNLA0KICAgICAgICBFWFBSRVNTRURfRk9STTogRVhQUkVTU0VEX0ZPUk0sDQogICAgICAgIFNUQVRFTUVOVF9GT1JNOiBTVEFURU1FTlRfRk9STSwNCiAgICAgICAgVG9rZW5pemVyOiBsZXhlci5Ub2tlbml6ZXIsDQogICAgICAgIEZ1bmN0aW9uRGVmaW5pdGlvbjogRnVuY3Rpb25EZWZpbml0aW9uLA0KICAgICAgICBNb2R1bGU6IE1vZHVsZSwNCiAgICAgICAgRXhwb3J0OiBFeHBvcnQNCiAgICB9Ow0KDQp9KTsvKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9Nzg6ICovDQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgdGhlIE5hcmNpc3N1cyBKYXZhU2NyaXB0IGVuZ2luZS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEJyZW5kYW4gRWljaCA8YnJlbmRhbkBtb3ppbGxhLm9yZz4uDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDA0DQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgIFRvbSBBdXN0aW4gPHRhdXN0aW5AdWNzYy5lZHU+DQogKiAgIEJyZW5kYW4gRWljaCA8YnJlbmRhbkBtb3ppbGxhLm9yZz4NCiAqICAgU2h1LVl1IEd1byA8c2h1QHJmcm4ub3JnPg0KICogICBEYXZlIEhlcm1hbiA8ZGhlcm1hbkBtb3ppbGxhLmNvbT4NCiAqICAgRGltaXRyaXMgVmFyZG91bGFraXMgPGRpbXZhckBjY3MubmV1LmVkdT4NCiAqICAgUGF0cmljayBXYWx0b24gPHBjd2FsdG9uQG1vemlsbGEuY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCi8qDQogKiBOYXJjaXNzdXMgLSBKUyBpbXBsZW1lbnRlZCBpbiBKUy4NCiAqDQogKiBMZXhpY2FsIHNjYW5uZXIuDQogKi8NCg0KIGRlZmluZSgnYWNlL25hcmNpc3N1cy9qc2xleCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL25hcmNpc3N1cy9qc2RlZnMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCiAgICB2YXIgZGVmaW5pdGlvbnMgPSByZXF1aXJlKCIuL2pzZGVmcyIpOw0KDQogICAgLy8gU2V0IGNvbnN0YW50cyBpbiB0aGUgbG9jYWwgc2NvcGUuDQogICAgZXZhbChkZWZpbml0aW9ucy5jb25zdHMpOw0KDQogICAgLy8gQmFubmVkIGtleXdvcmRzIGJ5IGxhbmd1YWdlIHZlcnNpb24NCiAgICBjb25zdCBibGFja0xpc3RzID0geyAxNjA6IHt9LCAxODU6IHt9LCBoYXJtb255OiB7fSB9Ow0KICAgIGJsYWNrTGlzdHNbMTYwXVtMRVRdID0gdHJ1ZTsNCiAgICBibGFja0xpc3RzWzE2MF1bTU9EVUxFXSA9IHRydWU7DQogICAgYmxhY2tMaXN0c1sxNjBdW1lJRUxEXSA9IHRydWU7DQogICAgYmxhY2tMaXN0c1sxODVdW01PRFVMRV0gPSB0cnVlOw0KDQogICAgLy8gQnVpbGQgdXAgYSB0cmllIG9mIG9wZXJhdG9yIHRva2Vucy4NCiAgICB2YXIgb3BUb2tlbnMgPSB7fTsNCiAgICBmb3IgKHZhciBvcCBpbiBkZWZpbml0aW9ucy5vcFR5cGVOYW1lcykgew0KICAgICAgICBpZiAob3AgPT09ICdcbicgfHwgb3AgPT09ICcuJykNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KDQogICAgICAgIHZhciBub2RlID0gb3BUb2tlbnM7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3AubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBjaCA9IG9wW2ldOw0KICAgICAgICAgICAgaWYgKCEoY2ggaW4gbm9kZSkpDQogICAgICAgICAgICAgICAgbm9kZVtjaF0gPSB7fTsNCiAgICAgICAgICAgIG5vZGUgPSBub2RlW2NoXTsNCiAgICAgICAgICAgIG5vZGUub3AgPSBvcDsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qDQogICAgICogVG9rZW5pemVyIDo6IChzb3VyY2UsIGZpbGVuYW1lLCBsaW5lIG51bWJlcikgLT4gVG9rZW5pemVyDQogICAgICovDQogICAgZnVuY3Rpb24gVG9rZW5pemVyKHMsIGYsIGwpIHsNCiAgICAgICAgdGhpcy5jdXJzb3IgPSAwOw0KICAgICAgICB0aGlzLnNvdXJjZSA9IFN0cmluZyhzKTsNCiAgICAgICAgdGhpcy50b2tlbnMgPSBbXTsNCiAgICAgICAgdGhpcy50b2tlbkluZGV4ID0gMDsNCiAgICAgICAgdGhpcy5sb29rYWhlYWQgPSAwOw0KICAgICAgICB0aGlzLnNjYW5OZXdsaW5lcyA9IGZhbHNlOw0KICAgICAgICB0aGlzLnVuZXhwZWN0ZWRFT0YgPSBmYWxzZTsNCiAgICAgICAgdGhpcy5maWxlbmFtZSA9IGYgfHwgIiI7DQogICAgICAgIHRoaXMubGluZW5vID0gbCB8fCAxOw0KICAgICAgICB0aGlzLmJsYWNrTGlzdCA9IGJsYWNrTGlzdHNbTmFyY2lzc3VzLm9wdGlvbnMudmVyc2lvbl07DQogICAgICAgIHRoaXMuYmxvY2tDb21tZW50cyA9IG51bGw7DQogICAgfQ0KDQogICAgVG9rZW5pemVyLnByb3RvdHlwZSA9IHsNCiAgICAgICAgZ2V0IGRvbmUoKSB7DQogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNldCBzY2FuT3BlcmFuZCB0byB0cnVlIGhlcmUgYmVjYXVzZSB0aGUgZmlyc3QgdGhpbmcNCiAgICAgICAgICAgIC8vIG1pZ2h0IGJlIGEgcmVnZXhwLg0KICAgICAgICAgICAgcmV0dXJuIHRoaXMucGVlayh0cnVlKSA9PT0gRU5EOw0KICAgICAgICB9LA0KDQogICAgICAgIGdldCB0b2tlbigpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLnRva2Vuc1t0aGlzLnRva2VuSW5kZXhdOw0KICAgICAgICB9LA0KDQogICAgICAgIG1hdGNoOiBmdW5jdGlvbiAodHQsIHNjYW5PcGVyYW5kKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoc2Nhbk9wZXJhbmQpID09PSB0dCB8fCB0aGlzLnVuZ2V0KCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgbXVzdE1hdGNoOiBmdW5jdGlvbiAodHQpIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCh0dCkpIHsNCiAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLm5ld1N5bnRheEVycm9yKCJNaXNzaW5nICIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnMudG9rZW5zW3R0XS50b0xvd2VyQ2FzZSgpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0aGlzLnRva2VuOw0KICAgICAgICB9LA0KDQogICAgICAgIHBlZWs6IGZ1bmN0aW9uIChzY2FuT3BlcmFuZCkgew0KICAgICAgICAgICAgdmFyIHR0LCBuZXh0Ow0KICAgICAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkKSB7DQogICAgICAgICAgICAgICAgbmV4dCA9IHRoaXMudG9rZW5zWyh0aGlzLnRva2VuSW5kZXggKyB0aGlzLmxvb2thaGVhZCkgJiAzXTsNCiAgICAgICAgICAgICAgICB0dCA9ICh0aGlzLnNjYW5OZXdsaW5lcyAmJiBuZXh0LmxpbmVubyAhPT0gdGhpcy5saW5lbm8pDQogICAgICAgICAgICAgICAgICAgICA/IE5FV0xJTkUNCiAgICAgICAgICAgICAgICAgICAgIDogbmV4dC50eXBlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0dCA9IHRoaXMuZ2V0KHNjYW5PcGVyYW5kKTsNCiAgICAgICAgICAgICAgICB0aGlzLnVuZ2V0KCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdHQ7DQogICAgICAgIH0sDQoNCiAgICAgICAgcGVla09uU2FtZUxpbmU6IGZ1bmN0aW9uIChzY2FuT3BlcmFuZCkgew0KICAgICAgICAgICAgdGhpcy5zY2FuTmV3bGluZXMgPSB0cnVlOw0KICAgICAgICAgICAgdmFyIHR0ID0gdGhpcy5wZWVrKHNjYW5PcGVyYW5kKTsNCiAgICAgICAgICAgIHRoaXMuc2Nhbk5ld2xpbmVzID0gZmFsc2U7DQogICAgICAgICAgICByZXR1cm4gdHQ7DQogICAgICAgIH0sDQoNCiAgICAgICAgbGFzdEJsb2NrQ29tbWVudDogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5ibG9ja0NvbW1lbnRzLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBsZW5ndGggPyB0aGlzLmJsb2NrQ29tbWVudHNbbGVuZ3RoIC0gMV0gOiBudWxsOw0KICAgICAgICB9LA0KDQogICAgICAgIC8vIEVhdCBjb21tZW50cyBhbmQgd2hpdGVzcGFjZS4NCiAgICAgICAgc2tpcDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcy5zb3VyY2U7DQogICAgICAgICAgICB0aGlzLmJsb2NrQ29tbWVudHMgPSBbXTsNCiAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICB2YXIgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsNCiAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IGlucHV0W3RoaXMuY3Vyc29yXTsNCiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgXHIsIFxyXG4gYW5kIChhbHdheXMgcHJlZmVyYWJsZSkgXG4NCiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdccicpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzIFxuLCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgYXQgYWxsDQogICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnXG4nKSBjb250aW51ZTsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIHdlIHdhbnQgdG8gY29uc2lkZXIgdGhpcyBhcyBhIG5ld2xpbmUNCiAgICAgICAgICAgICAgICAgICAgY2ggPSAnXG4nOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xuJyAmJiAhdGhpcy5zY2FuTmV3bGluZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lbm8rKzsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnLycgJiYgbmV4dCA9PT0gJyonKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjb21tZW50U3RhcnQgPSArK3RoaXMuY3Vyc29yOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjaCA9IGlucHV0W3RoaXMuY3Vyc29yKytdOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSB1bmRlZmluZWQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5uZXdTeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIGNvbW1lbnQiKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnKicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gaW5wdXRbdGhpcy5jdXJzb3JdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnLycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnRFbmQgPSB0aGlzLmN1cnNvciAtIDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yKys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcbicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVubysrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tDb21tZW50cy5wdXNoKGlucHV0LnN1YnN0cmluZyhjb21tZW50U3RhcnQsIGNvbW1lbnRFbmQpKTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnLycgJiYgbmV4dCA9PT0gJy8nKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yKys7DQogICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gaW5wdXRbdGhpcy5jdXJzb3IrK107DQogICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gaW5wdXRbdGhpcy5jdXJzb3JdOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSB1bmRlZmluZWQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdccicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgXHJcbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSAnXG4nKSBjaCA9ICdcbic7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xuJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjYW5OZXdsaW5lcykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci0tOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGluZW5vKys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKGNoIGluIGRlZmluaXRpb25zLndoaXRlc3BhY2UpKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLS07DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgLy8gTGV4IHRoZSBleHBvbmVudGlhbCBwYXJ0IG9mIGEgbnVtYmVyLCBpZiBwcmVzZW50LiBSZXR1cm4gdHJ1ZSBpZmYgYW4NCiAgICAgICAgLy8gZXhwb25lbnRpYWwgcGFydCB3YXMgZm91bmQuDQogICAgICAgIGxleEV4cG9uZW50OiBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHZhciBpbnB1dCA9IHRoaXMuc291cmNlOw0KICAgICAgICAgICAgdmFyIG5leHQgPSBpbnB1dFt0aGlzLmN1cnNvcl07DQogICAgICAgICAgICBpZiAobmV4dCA9PT0gJ2UnIHx8IG5leHQgPT09ICdFJykgew0KICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yKys7DQogICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsNCiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICcrJyB8fCBjaCA9PT0gJy0nKQ0KICAgICAgICAgICAgICAgICAgICBjaCA9IGlucHV0W3RoaXMuY3Vyc29yKytdOw0KDQogICAgICAgICAgICAgICAgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQ0KICAgICAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLm5ld1N5bnRheEVycm9yKCJNaXNzaW5nIGV4cG9uZW50Iik7DQoNCiAgICAgICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgICAgIGNoID0gaW5wdXRbdGhpcy5jdXJzb3IrK107DQogICAgICAgICAgICAgICAgfSB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jyk7DQogICAgICAgICAgICAgICAgdGhpcy5jdXJzb3ItLTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0sDQoNCiAgICAgICAgbGV4WmVyb051bWJlcjogZnVuY3Rpb24gKGNoKSB7DQogICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLnRva2VuLCBpbnB1dCA9IHRoaXMuc291cmNlOw0KICAgICAgICAgICAgdG9rZW4udHlwZSA9IE5VTUJFUjsNCg0KICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsNCiAgICAgICAgICAgIGlmIChjaCA9PT0gJy4nKSB7DQogICAgICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgICAgICBjaCA9IGlucHV0W3RoaXMuY3Vyc29yKytdOw0KICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpOw0KICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLS07DQoNCiAgICAgICAgICAgICAgICB0aGlzLmxleEV4cG9uZW50KCk7DQogICAgICAgICAgICAgICAgdG9rZW4udmFsdWUgPSBwYXJzZUZsb2F0KHRva2VuLnN0YXJ0LCB0aGlzLmN1cnNvcik7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAneCcgfHwgY2ggPT09ICdYJykgew0KICAgICAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsNCiAgICAgICAgICAgICAgICB9IHdoaWxlICgoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgKGNoID49ICdBJyAmJiBjaCA8PSAnRicpKTsNCiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci0tOw0KDQogICAgICAgICAgICAgICAgdG9rZW4udmFsdWUgPSBwYXJzZUludChpbnB1dC5zdWJzdHJpbmcodG9rZW4uc3RhcnQsIHRoaXMuY3Vyc29yKSk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnNycpIHsNCiAgICAgICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgICAgIGNoID0gaW5wdXRbdGhpcy5jdXJzb3IrK107DQogICAgICAgICAgICAgICAgfSB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc3Jyk7DQogICAgICAgICAgICAgICAgdGhpcy5jdXJzb3ItLTsNCg0KICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlID0gcGFyc2VJbnQoaW5wdXQuc3Vic3RyaW5nKHRva2VuLnN0YXJ0LCB0aGlzLmN1cnNvcikpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci0tOw0KICAgICAgICAgICAgICAgIHRoaXMubGV4RXhwb25lbnQoKTsgICAgIC8vIDBFMSwgJmMuDQogICAgICAgICAgICAgICAgdG9rZW4udmFsdWUgPSAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIGxleE51bWJlcjogZnVuY3Rpb24gKGNoKSB7DQogICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLnRva2VuLCBpbnB1dCA9IHRoaXMuc291cmNlOw0KICAgICAgICAgICAgdG9rZW4udHlwZSA9IE5VTUJFUjsNCg0KICAgICAgICAgICAgdmFyIGZsb2F0aW5nID0gZmFsc2U7DQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsNCiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICcuJyAmJiAhZmxvYXRpbmcpIHsNCiAgICAgICAgICAgICAgICAgICAgZmxvYXRpbmcgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICBjaCA9IGlucHV0W3RoaXMuY3Vyc29yKytdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gd2hpbGUgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpOw0KDQogICAgICAgICAgICB0aGlzLmN1cnNvci0tOw0KDQogICAgICAgICAgICB2YXIgZXhwb25lbnQgPSB0aGlzLmxleEV4cG9uZW50KCk7DQogICAgICAgICAgICBmbG9hdGluZyA9IGZsb2F0aW5nIHx8IGV4cG9uZW50Ow0KDQogICAgICAgICAgICB2YXIgc3RyID0gaW5wdXQuc3Vic3RyaW5nKHRva2VuLnN0YXJ0LCB0aGlzLmN1cnNvcik7DQogICAgICAgICAgICB0b2tlbi52YWx1ZSA9IGZsb2F0aW5nID8gcGFyc2VGbG9hdChzdHIpIDogcGFyc2VJbnQoc3RyKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBsZXhEb3Q6IGZ1bmN0aW9uIChjaCkgew0KICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy50b2tlbiwgaW5wdXQgPSB0aGlzLnNvdXJjZTsNCiAgICAgICAgICAgIHZhciBuZXh0ID0gaW5wdXRbdGhpcy5jdXJzb3JdOw0KICAgICAgICAgICAgaWYgKG5leHQgPj0gJzAnICYmIG5leHQgPD0gJzknKSB7DQogICAgICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgICAgICBjaCA9IGlucHV0W3RoaXMuY3Vyc29yKytdOw0KICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpOw0KICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLS07DQoNCiAgICAgICAgICAgICAgICB0aGlzLmxleEV4cG9uZW50KCk7DQoNCiAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gTlVNQkVSOw0KICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlID0gcGFyc2VGbG9hdCh0b2tlbi5zdGFydCwgdGhpcy5jdXJzb3IpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gRE9UOw0KICAgICAgICAgICAgICAgIHRva2VuLmFzc2lnbk9wID0gbnVsbDsNCiAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9ICcuJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCg0KICAgICAgICBsZXhTdHJpbmc6IGZ1bmN0aW9uIChjaCkgew0KICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy50b2tlbiwgaW5wdXQgPSB0aGlzLnNvdXJjZTsNCiAgICAgICAgICAgIHRva2VuLnR5cGUgPSBTVFJJTkc7DQoNCiAgICAgICAgICAgIHZhciBoYXNFc2NhcGVzID0gZmFsc2U7DQogICAgICAgICAgICB2YXIgZGVsaW0gPSBjaDsNCiAgICAgICAgICAgIGlmIChpbnB1dC5sZW5ndGggPD0gdGhpcy5jdXJzb3IpDQogICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5uZXdTeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIHN0cmluZyBsaXRlcmFsIik7DQogICAgICAgICAgICB3aGlsZSAoKGNoID0gaW5wdXRbdGhpcy5jdXJzb3IrK10pICE9PSBkZWxpbSkgew0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnNvciA9PSBpbnB1dC5sZW5ndGgpDQogICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMubmV3U3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBzdHJpbmcgbGl0ZXJhbCIpOw0KICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xcJykgew0KICAgICAgICAgICAgICAgICAgICBoYXNFc2NhcGVzID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCsrdGhpcy5jdXJzb3IgPT0gaW5wdXQubGVuZ3RoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5uZXdTeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIHN0cmluZyBsaXRlcmFsIik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0b2tlbi52YWx1ZSA9IGhhc0VzY2FwZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBldmFsKGlucHV0LnN1YnN0cmluZyh0b2tlbi5zdGFydCwgdGhpcy5jdXJzb3IpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlucHV0LnN1YnN0cmluZyh0b2tlbi5zdGFydCArIDEsIHRoaXMuY3Vyc29yIC0gMSk7DQogICAgICAgIH0sDQoNCiAgICAgICAgbGV4UmVnRXhwOiBmdW5jdGlvbiAoY2gpIHsNCiAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMudG9rZW4sIGlucHV0ID0gdGhpcy5zb3VyY2U7DQogICAgICAgICAgICB0b2tlbi50eXBlID0gUkVHRVhQOw0KDQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsNCiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXCcpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IrKzsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnWycpIHsNCiAgICAgICAgICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSB1bmRlZmluZWQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5uZXdTeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIGNoYXJhY3RlciBjbGFzcyIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IrKzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsNCiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY2ggIT09ICddJyk7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMubmV3U3ludGF4RXJyb3IoIlVudGVybWluYXRlZCByZWdleCIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gd2hpbGUgKGNoICE9PSAnLycpOw0KDQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsNCiAgICAgICAgICAgIH0gd2hpbGUgKGNoID49ICdhJyAmJiBjaCA8PSAneicpOw0KDQogICAgICAgICAgICB0aGlzLmN1cnNvci0tOw0KDQogICAgICAgICAgICB0b2tlbi52YWx1ZSA9IGV2YWwoaW5wdXQuc3Vic3RyaW5nKHRva2VuLnN0YXJ0LCB0aGlzLmN1cnNvcikpOw0KICAgICAgICB9LA0KDQogICAgICAgIGxleE9wOiBmdW5jdGlvbiAoY2gpIHsNCiAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMudG9rZW4sIGlucHV0ID0gdGhpcy5zb3VyY2U7DQoNCiAgICAgICAgICAgIC8vIEEgYml0IHVnbHksIGJ1dCBpdCBzZWVtcyB3YXN0ZWZ1bCB0byB3cml0ZSBhIHRyaWUgbG9va3VwIHJvdXRpbmUNCiAgICAgICAgICAgIC8vIGZvciBvbmx5IDMgY2hhcmFjdGVycy4uLg0KICAgICAgICAgICAgdmFyIG5vZGUgPSBvcFRva2Vuc1tjaF07DQogICAgICAgICAgICB2YXIgbmV4dCA9IGlucHV0W3RoaXMuY3Vyc29yXTsNCiAgICAgICAgICAgIGlmIChuZXh0IGluIG5vZGUpIHsNCiAgICAgICAgICAgICAgICBub2RlID0gbm9kZVtuZXh0XTsNCiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvcisrOw0KICAgICAgICAgICAgICAgIG5leHQgPSBpbnB1dFt0aGlzLmN1cnNvcl07DQogICAgICAgICAgICAgICAgaWYgKG5leHQgaW4gbm9kZSkgew0KICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZVtuZXh0XTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IrKzsNCiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGlucHV0W3RoaXMuY3Vyc29yXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBvcCA9IG5vZGUub3A7DQogICAgICAgICAgICBpZiAoZGVmaW5pdGlvbnMuYXNzaWduT3BzW29wXSAmJiBpbnB1dFt0aGlzLmN1cnNvcl0gPT09ICc9Jykgew0KICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yKys7DQogICAgICAgICAgICAgICAgdG9rZW4udHlwZSA9IEFTU0lHTjsNCiAgICAgICAgICAgICAgICB0b2tlbi5hc3NpZ25PcCA9IGRlZmluaXRpb25zLnRva2VuSWRzW2RlZmluaXRpb25zLm9wVHlwZU5hbWVzW29wXV07DQogICAgICAgICAgICAgICAgb3AgKz0gJz0nOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gZGVmaW5pdGlvbnMudG9rZW5JZHNbZGVmaW5pdGlvbnMub3BUeXBlTmFtZXNbb3BdXTsNCiAgICAgICAgICAgICAgICB0b2tlbi5hc3NpZ25PcCA9IG51bGw7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRva2VuLnZhbHVlID0gb3A7DQogICAgICAgIH0sDQoNCiAgICAgICAgLy8gRklYTUU6IFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcw0KICAgICAgICBsZXhJZGVudDogZnVuY3Rpb24gKGNoKSB7DQogICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLnRva2VuOw0KICAgICAgICAgICAgdmFyIGlkID0gY2g7DQoNCiAgICAgICAgICAgIHdoaWxlICgoY2ggPSB0aGlzLmdldFZhbGlkSWRlbnRpZmllckNoYXIoZmFsc2UpKSAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIGlkICs9IGNoOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0b2tlbi50eXBlID0gZGVmaW5pdGlvbnMua2V5d29yZHNbaWRdIHx8IElERU5USUZJRVI7DQogICAgICAgICAgICBpZiAodG9rZW4udHlwZSBpbiB0aGlzLmJsYWNrTGlzdCkgew0KICAgICAgICAgICAgICAgIC8vIGJhbm5lZCBrZXl3b3JkLCB0aGlzIGlzIGFuIGlkZW50aWZpZXINCiAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gSURFTlRJRklFUjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRva2VuLnZhbHVlID0gaWQ7DQogICAgICAgIH0sDQoNCiAgICAgICAgLyoNCiAgICAgICAgICogVG9rZW5pemVyLmdldCA6OiB2b2lkIC0+IHRva2VuIHR5cGUNCiAgICAgICAgICoNCiAgICAgICAgICogQ29uc3VtZSBpbnB1dCAqb25seSogaWYgdGhlcmUgaXMgbm8gbG9va2FoZWFkLg0KICAgICAgICAgKiBEaXNwYXRjaCB0byB0aGUgYXBwcm9wcmlhdGUgbGV4aW5nIGZ1bmN0aW9uIGRlcGVuZGluZyBvbiB0aGUgaW5wdXQuDQogICAgICAgICAqLw0KICAgICAgICBnZXQ6IGZ1bmN0aW9uIChzY2FuT3BlcmFuZCkgew0KICAgICAgICAgICAgdmFyIHRva2VuOw0KICAgICAgICAgICAgd2hpbGUgKHRoaXMubG9va2FoZWFkKSB7DQogICAgICAgICAgICAgICAgLS10aGlzLmxvb2thaGVhZDsNCiAgICAgICAgICAgICAgICB0aGlzLnRva2VuSW5kZXggPSAodGhpcy50b2tlbkluZGV4ICsgMSkgJiAzOw0KICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy50b2tlbnNbdGhpcy50b2tlbkluZGV4XTsNCiAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gTkVXTElORSB8fCB0aGlzLnNjYW5OZXdsaW5lcykNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuLnR5cGU7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRoaXMuc2tpcCgpOw0KDQogICAgICAgICAgICB0aGlzLnRva2VuSW5kZXggPSAodGhpcy50b2tlbkluZGV4ICsgMSkgJiAzOw0KICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnRva2Vuc1t0aGlzLnRva2VuSW5kZXhdOw0KICAgICAgICAgICAgaWYgKCF0b2tlbikNCiAgICAgICAgICAgICAgICB0aGlzLnRva2Vuc1t0aGlzLnRva2VuSW5kZXhdID0gdG9rZW4gPSB7fTsNCg0KICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcy5zb3VyY2U7DQogICAgICAgICAgICBpZiAodGhpcy5jdXJzb3IgPj0gaW5wdXQubGVuZ3RoKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbi50eXBlID0gRU5EOw0KDQogICAgICAgICAgICB0b2tlbi5zdGFydCA9IHRoaXMuY3Vyc29yOw0KICAgICAgICAgICAgdG9rZW4ubGluZW5vID0gdGhpcy5saW5lbm87DQoNCiAgICAgICAgICAgIHZhciBpY2ggPSB0aGlzLmdldFZhbGlkSWRlbnRpZmllckNoYXIodHJ1ZSk7DQogICAgICAgICAgICB2YXIgY2ggPSAoaWNoID09PSBudWxsKSA/IGlucHV0W3RoaXMuY3Vyc29yKytdIDogbnVsbDsNCiAgICAgICAgICAgIGlmIChpY2ggIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmxleElkZW50KGljaCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKHNjYW5PcGVyYW5kICYmIGNoID09PSAnLycpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmxleFJlZ0V4cChjaCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNoIGluIG9wVG9rZW5zKSB7DQogICAgICAgICAgICAgICAgdGhpcy5sZXhPcChjaCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnLicpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmxleERvdChjaCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNoID49ICcxJyAmJiBjaCA8PSAnOScpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmxleE51bWJlcihjaCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnMCcpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmxleFplcm9OdW1iZXIoY2gpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJyInIHx8IGNoID09PSAiJyIpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmxleFN0cmluZyhjaCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2Nhbk5ld2xpbmVzICYmIChjaCA9PT0gJ1xuJyB8fCBjaCA9PT0gJ1xyJykpIHsNCiAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHdhcyBhIFxyLCBsb29rIGZvciBcclxuDQogICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXHInICYmIGlucHV0W3RoaXMuY3Vyc29yXSA9PT0gJ1xuJykgdGhpcy5jdXJzb3IrKzsNCiAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gTkVXTElORTsNCiAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9ICdcbic7DQogICAgICAgICAgICAgICAgdGhpcy5saW5lbm8rKzsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5uZXdTeW50YXhFcnJvcigiSWxsZWdhbCB0b2tlbiIpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0b2tlbi5lbmQgPSB0aGlzLmN1cnNvcjsNCiAgICAgICAgICAgIHJldHVybiB0b2tlbi50eXBlOw0KICAgICAgICB9LA0KDQogICAgICAgIC8qDQogICAgICAgICAqIFRva2VuaXplci51bmdldCA6OiB2b2lkIC0+IHVuZGVmaW5lZA0KICAgICAgICAgKg0KICAgICAgICAgKiBNYXRjaCBkZXBlbmRzIG9uIHVuZ2V0IHJldHVybmluZyB1bmRlZmluZWQuDQogICAgICAgICAqLw0KICAgICAgICB1bmdldDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgaWYgKCsrdGhpcy5sb29rYWhlYWQgPT09IDQpIHRocm93ICJQQU5JQzogdG9vIG11Y2ggbG9va2FoZWFkISI7DQogICAgICAgICAgICB0aGlzLnRva2VuSW5kZXggPSAodGhpcy50b2tlbkluZGV4IC0gMSkgJiAzOw0KICAgICAgICB9LA0KDQogICAgICAgIG5ld1N5bnRheEVycm9yOiBmdW5jdGlvbiAobSkgew0KICAgICAgICAgICAgbSA9ICh0aGlzLmZpbGVuYW1lID8gdGhpcy5maWxlbmFtZSArICI6IiA6ICIiKSArIHRoaXMubGluZW5vICsgIjogIiArIG07DQogICAgICAgICAgICB2YXIgZSA9IG5ldyBTeW50YXhFcnJvcihtLCB0aGlzLmZpbGVuYW1lLCB0aGlzLmxpbmVubyk7DQogICAgICAgICAgICBlLnNvdXJjZSA9IHRoaXMuc291cmNlOw0KICAgICAgICAgICAgZS5jdXJzb3IgPSB0aGlzLmxvb2thaGVhZA0KICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMudG9rZW5zWyh0aGlzLnRva2VuSW5kZXggKyB0aGlzLmxvb2thaGVhZCkgJiAzXS5zdGFydA0KICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuY3Vyc29yOw0KICAgICAgICAgICAgcmV0dXJuIGU7DQogICAgICAgIH0sDQoNCiAgICAgICAgLyogR2V0cyBhIHNpbmdsZSB2YWxpZCBpZGVudGlmaWVyIGNoYXIgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBvciBudWxsDQogICAgICAgICAqIGlmIHRoZXJlIGlzIG5vbmUuDQogICAgICAgICAqIFNpbmNlIEphdmFTY3JpcHQgcHJvdmlkZXMgbm8gY29udmVuaWVudCB3YXkgdG8gZGV0ZXJtaW5lIGlmIGENCiAgICAgICAgICogY2hhcmFjdGVyIGlzIGluIGEgcGFydGljdWxhciBVbmljb2RlIGNhdGVnb3J5LCB3ZSB1c2UNCiAgICAgICAgICogbWV0YWNpcmN1bGFyaXR5IHRvIGFjY29tcGxpc2ggdGhpcyAob2ggeWVhYWFhaCEpICovDQogICAgICAgIGdldFZhbGlkSWRlbnRpZmllckNoYXI6IGZ1bmN0aW9uKGZpcnN0KSB7DQogICAgICAgICAgICB2YXIgaW5wdXQgPSB0aGlzLnNvdXJjZTsNCiAgICAgICAgICAgIGlmICh0aGlzLmN1cnNvciA+PSBpbnB1dC5sZW5ndGgpIHJldHVybiBudWxsOw0KICAgICAgICAgICAgdmFyIGNoID0gaW5wdXRbdGhpcy5jdXJzb3JdOw0KDQogICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBmb3IgXHUgZXNjYXBlcw0KICAgICAgICAgICAgaWYgKGNoID09PSAnXFwnICYmIGlucHV0W3RoaXMuY3Vyc29yKzFdID09PSAndScpIHsNCiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNoYXJhY3RlciB2YWx1ZQ0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIGNoID0gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludCgNCiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnN1YnN0cmluZyh0aGlzLmN1cnNvciArIDIsIHRoaXMuY3Vyc29yICsgNiksDQogICAgICAgICAgICAgICAgICAgICAgICAxNikpOw0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvciArPSA1Ow0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBjaGVjayBkaXJlY3RseSBmb3IgQVNDSUkNCiAgICAgICAgICAgIGlmIChjaCA8PSAiXHUwMDdGIikgew0KICAgICAgICAgICAgICAgIGlmICgoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykgfHwgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpIHx8IGNoID09PSAnJCcgfHwgY2ggPT09ICdfJyB8fA0KICAgICAgICAgICAgICAgICAgICAoIWZpcnN0ICYmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IrKzsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICANCiAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBvYmplY3QgdG8gdGVzdCB0aGlzIGluDQogICAgICAgICAgICB2YXIgeCA9IHt9Ow0KICAgICAgICAgICAgeFsieCIrY2hdID0gdHJ1ZTsNCiAgICAgICAgICAgIHhbY2hdID0gdHJ1ZTsNCiAgICANCiAgICAgICAgICAgIC8vIHRoZW4gdXNlIGV2YWwgdG8gZGV0ZXJtaW5lIGlmIGl0J3MgYSB2YWxpZCBjaGFyYWN0ZXINCiAgICAgICAgICAgIHZhciB2YWxpZCA9IGZhbHNlOw0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICB2YWxpZCA9IChGdW5jdGlvbigieCIsICJyZXR1cm4gKHguIiArIChmaXJzdD8iIjoieCIpICsgY2ggKyAiKTsiKSh4KSA9PT0gdHJ1ZSk7DQogICAgICAgICAgICB9IGNhdGNoIChleCkge30NCiAgICAgICAgICAgIGlmICh2YWxpZCkgdGhpcy5jdXJzb3IrKzsNCiAgICAgICAgICAgIHJldHVybiAodmFsaWQgPyBjaCA6IG51bGwpOw0KICAgICAgICB9LA0KICAgIH07DQoNCg0KICAgIG1vZHVsZS5leHBvcnRzID0geyBUb2tlbml6ZXI6IFRva2VuaXplciB9Ow0KDQp9KTsNCi8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz03ODogKi8NCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyB0aGUgTmFyY2lzc3VzIEphdmFTY3JpcHQgZW5naW5lLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQnJlbmRhbiBFaWNoIDxicmVuZGFuQG1vemlsbGEub3JnPi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDQNCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgVG9tIEF1c3RpbiA8dGF1c3RpbkB1Y3NjLmVkdT4NCiAqICAgQnJlbmRhbiBFaWNoIDxicmVuZGFuQG1vemlsbGEub3JnPg0KICogICBTaHUtWXUgR3VvIDxzaHVAcmZybi5vcmc+DQogKiAgIERhdmUgSGVybWFuIDxkaGVybWFuQG1vemlsbGEuY29tPg0KICogICBEaW1pdHJpcyBWYXJkb3VsYWtpcyA8ZGltdmFyQGNjcy5uZXUuZWR1Pg0KICogICBQYXRyaWNrIFdhbHRvbiA8cGN3YWx0b25AbW96aWxsYS5jb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KLyoNCiAqIE5hcmNpc3N1cyAtIEpTIGltcGxlbWVudGVkIGluIEpTLg0KICoNCiAqIFdlbGwta25vd24gY29uc3RhbnRzIGFuZCBsb29rdXAgdGFibGVzLiAgTWFueSBjb25zdHMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZQ0KICogdG9rZW5zIHRhYmxlIHZpYSBldmFsIHRvIG1pbmltaXplIHJlZHVuZGFuY3ksIHNvIGNvbnN1bWVycyBtdXN0IGJlIGNvbXBpbGVkDQogKiBzZXBhcmF0ZWx5IHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBzaW1wbGUgc3dpdGNoLWNhc2UgY29uc3RhbnQgcHJvcGFnYXRpb24NCiAqIGRvbmUgYnkgU3BpZGVyTW9ua2V5Lg0KICovDQoNCmRlZmluZSgnYWNlL25hcmNpc3N1cy9qc2RlZnMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KDQogICAgdmFyIG5hcmNpc3N1cyA9IHsNCiAgICAgICAgb3B0aW9uczogew0KICAgICAgICAgICAgdmVyc2lvbjogMTg1LA0KICAgICAgICAgICAgLy8gR2xvYmFsIHZhcmlhYmxlcyB0byBoaWRlIGZyb20gdGhlIGludGVycHJldGVyDQogICAgICAgICAgICBoaWRkZW5Ib3N0R2xvYmFsczogeyBOYXJjaXNzdXM6IHRydWUgfSwNCiAgICAgICAgICAgIC8vIERlc3VnYXIgU3BpZGVyTW9ua2V5IGxhbmd1YWdlIGV4dGVuc2lvbnM/DQogICAgICAgICAgICBkZXN1Z2FyRXh0ZW5zaW9uczogZmFsc2UNCiAgICAgICAgfSwNCiAgICAgICAgaG9zdFN1cHBvcnRzRXZhbENvbnN0OiAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIHJldHVybiBldmFsKCIoZnVuY3Rpb24ocykgeyBldmFsKHMpOyByZXR1cm4geCB9KSgnY29uc3QgeCA9IHRydWU7JykiKTsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0pKCksDQogICAgICAgIGhvc3RHbG9iYWw6IHRoaXMNCiAgICB9Ow0KICAgIE5hcmNpc3N1cyA9IG5hcmNpc3N1czsNCg0KICAgIHZhciB0b2tlbnMgPSBbDQogICAgICAgIC8vIEVuZCBvZiBzb3VyY2UuDQogICAgICAgICJFTkQiLA0KDQogICAgICAgIC8vIE9wZXJhdG9ycyBhbmQgcHVuY3R1YXRvcnMuICBTb21lIHBhaXItd2lzZSBvcmRlciBtYXR0ZXJzLCBlLmcuICgrLCAtKQ0KICAgICAgICAvLyBhbmQgKFVOQVJZX1BMVVMsIFVOQVJZX01JTlVTKS4NCiAgICAgICAgIlxuIiwgIjsiLA0KICAgICAgICAiLCIsDQogICAgICAgICI9IiwNCiAgICAgICAgIj8iLCAiOiIsICJDT05ESVRJT05BTCIsDQogICAgICAgICJ8fCIsDQogICAgICAgICImJiIsDQogICAgICAgICJ8IiwNCiAgICAgICAgIl4iLA0KICAgICAgICAiJiIsDQogICAgICAgICI9PSIsICIhPSIsICI9PT0iLCAiIT09IiwNCiAgICAgICAgIjwiLCAiPD0iLCAiPj0iLCAiPiIsDQogICAgICAgICI8PCIsICI+PiIsICI+Pj4iLA0KICAgICAgICAiKyIsICItIiwNCiAgICAgICAgIioiLCAiLyIsICIlIiwNCiAgICAgICAgIiEiLCAifiIsICJVTkFSWV9QTFVTIiwgIlVOQVJZX01JTlVTIiwNCiAgICAgICAgIisrIiwgIi0tIiwNCiAgICAgICAgIi4iLA0KICAgICAgICAiWyIsICJdIiwNCiAgICAgICAgInsiLCAifSIsDQogICAgICAgICIoIiwgIikiLA0KDQogICAgICAgIC8vIE5vbnRlcm1pbmFsIHRyZWUgbm9kZSB0eXBlIGNvZGVzLg0KICAgICAgICAiU0NSSVBUIiwgIkJMT0NLIiwgIkxBQkVMIiwgIkZPUl9JTiIsICJDQUxMIiwgIk5FV19XSVRIX0FSR1MiLCAiSU5ERVgiLA0KICAgICAgICAiQVJSQVlfSU5JVCIsICJPQkpFQ1RfSU5JVCIsICJQUk9QRVJUWV9JTklUIiwgIkdFVFRFUiIsICJTRVRURVIiLA0KICAgICAgICAiR1JPVVAiLCAiTElTVCIsICJMRVRfQkxPQ0siLCAiQVJSQVlfQ09NUCIsICJHRU5FUkFUT1IiLCAiQ09NUF9UQUlMIiwNCg0KICAgICAgICAvLyBUZXJtaW5hbHMuDQogICAgICAgICJJREVOVElGSUVSIiwgIk5VTUJFUiIsICJTVFJJTkciLCAiUkVHRVhQIiwNCg0KICAgICAgICAvLyBLZXl3b3Jkcy4NCiAgICAgICAgImJyZWFrIiwNCiAgICAgICAgImNhc2UiLCAiY2F0Y2giLCAiY29uc3QiLCAiY29udGludWUiLA0KICAgICAgICAiZGVidWdnZXIiLCAiZGVmYXVsdCIsICJkZWxldGUiLCAiZG8iLA0KICAgICAgICAiZWxzZSIsICJleHBvcnQiLA0KICAgICAgICAiZmFsc2UiLCAiZmluYWxseSIsICJmb3IiLCAiZnVuY3Rpb24iLA0KICAgICAgICAiaWYiLCAiaW1wb3J0IiwgImluIiwgImluc3RhbmNlb2YiLA0KICAgICAgICAibGV0IiwgIm1vZHVsZSIsDQogICAgICAgICJuZXciLCAibnVsbCIsDQogICAgICAgICJyZXR1cm4iLA0KICAgICAgICAic3dpdGNoIiwNCiAgICAgICAgInRoaXMiLCAidGhyb3ciLCAidHJ1ZSIsICJ0cnkiLCAidHlwZW9mIiwNCiAgICAgICAgInZhciIsICJ2b2lkIiwNCiAgICAgICAgInlpZWxkIiwNCiAgICAgICAgIndoaWxlIiwgIndpdGgiLA0KICAgIF07DQoNCiAgICB2YXIgc3RhdGVtZW50U3RhcnRUb2tlbnMgPSBbDQogICAgICAgICJicmVhayIsDQogICAgICAgICJjb25zdCIsICJjb250aW51ZSIsDQogICAgICAgICJkZWJ1Z2dlciIsICJkbyIsDQogICAgICAgICJmb3IiLA0KICAgICAgICAiaWYiLA0KICAgICAgICAicmV0dXJuIiwNCiAgICAgICAgInN3aXRjaCIsDQogICAgICAgICJ0aHJvdyIsICJ0cnkiLA0KICAgICAgICAidmFyIiwNCiAgICAgICAgInlpZWxkIiwNCiAgICAgICAgIndoaWxlIiwgIndpdGgiLA0KICAgIF07DQoNCiAgICAvLyBXaGl0ZXNwYWNlIGNoYXJhY3RlcnMgKHNlZSBFQ01BLTI2MiA3LjIpDQogICAgdmFyIHdoaXRlc3BhY2VDaGFycyA9IFsNCiAgICAgICAgLy8gbm9ybWFsIHdoaXRlc3BhY2U6DQogICAgICAgICJcdTAwMDkiLCAiXHUwMDBCIiwgIlx1MDAwQyIsICJcdTAwMjAiLCAiXHUwMEEwIiwgIlx1RkVGRiIsIA0KDQogICAgICAgIC8vIGhpZ2gtVW5pY29kZSB3aGl0ZXNwYWNlOg0KICAgICAgICAiXHUxNjgwIiwgIlx1MTgwRSIsDQogICAgICAgICJcdTIwMDAiLCAiXHUyMDAxIiwgIlx1MjAwMiIsICJcdTIwMDMiLCAiXHUyMDA0IiwgIlx1MjAwNSIsICJcdTIwMDYiLA0KICAgICAgICAiXHUyMDA3IiwgIlx1MjAwOCIsICJcdTIwMDkiLCAiXHUyMDBBIiwNCiAgICAgICAgIlx1MjAyRiIsICJcdTIwNUYiLCAiXHUzMDAwIg0KICAgIF07DQoNCiAgICB2YXIgd2hpdGVzcGFjZSA9IHt9Ow0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd2hpdGVzcGFjZUNoYXJzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIHdoaXRlc3BhY2Vbd2hpdGVzcGFjZUNoYXJzW2ldXSA9IHRydWU7DQogICAgfQ0KDQogICAgLy8gT3BlcmF0b3IgYW5kIHB1bmN0dWF0b3IgbWFwcGluZyBmcm9tIHRva2VuIHRvIHRyZWUgbm9kZSB0eXBlIG5hbWUuDQogICAgLy8gTkI6IGJlY2F1c2UgdGhlIGxleGVyIGRvZXNuJ3QgYmFja3RyYWNrLCBhbGwgdG9rZW4gcHJlZml4ZXMgbXVzdCB0aGVtc2VsdmVzDQogICAgLy8gYmUgdmFsaWQgdG9rZW5zIChlLmcuICE9PSBpcyBhY2NlcHRhYmxlIGJlY2F1c2UgaXRzIHByZWZpeGVzIGFyZSB0aGUgdmFsaWQNCiAgICAvLyB0b2tlbnMgIT0gYW5kICEpLg0KICAgIHZhciBvcFR5cGVOYW1lcyA9IHsNCiAgICAgICAgJ1xuJzogICAiTkVXTElORSIsDQogICAgICAgICc7JzogICAgIlNFTUlDT0xPTiIsDQogICAgICAgICcsJzogICAgIkNPTU1BIiwNCiAgICAgICAgJz8nOiAgICAiSE9PSyIsDQogICAgICAgICc6JzogICAgIkNPTE9OIiwNCiAgICAgICAgJ3x8JzogICAiT1IiLA0KICAgICAgICAnJiYnOiAgICJBTkQiLA0KICAgICAgICAnfCc6ICAgICJCSVRXSVNFX09SIiwNCiAgICAgICAgJ14nOiAgICAiQklUV0lTRV9YT1IiLA0KICAgICAgICAnJic6ICAgICJCSVRXSVNFX0FORCIsDQogICAgICAgICc9PT0nOiAgIlNUUklDVF9FUSIsDQogICAgICAgICc9PSc6ICAgIkVRIiwNCiAgICAgICAgJz0nOiAgICAiQVNTSUdOIiwNCiAgICAgICAgJyE9PSc6ICAiU1RSSUNUX05FIiwNCiAgICAgICAgJyE9JzogICAiTkUiLA0KICAgICAgICAnPDwnOiAgICJMU0giLA0KICAgICAgICAnPD0nOiAgICJMRSIsDQogICAgICAgICc8JzogICAgIkxUIiwNCiAgICAgICAgJz4+Pic6ICAiVVJTSCIsDQogICAgICAgICc+Pic6ICAgIlJTSCIsDQogICAgICAgICc+PSc6ICAgIkdFIiwNCiAgICAgICAgJz4nOiAgICAiR1QiLA0KICAgICAgICAnKysnOiAgICJJTkNSRU1FTlQiLA0KICAgICAgICAnLS0nOiAgICJERUNSRU1FTlQiLA0KICAgICAgICAnKyc6ICAgICJQTFVTIiwNCiAgICAgICAgJy0nOiAgICAiTUlOVVMiLA0KICAgICAgICAnKic6ICAgICJNVUwiLA0KICAgICAgICAnLyc6ICAgICJESVYiLA0KICAgICAgICAnJSc6ICAgICJNT0QiLA0KICAgICAgICAnISc6ICAgICJOT1QiLA0KICAgICAgICAnfic6ICAgICJCSVRXSVNFX05PVCIsDQogICAgICAgICcuJzogICAgIkRPVCIsDQogICAgICAgICdbJzogICAgIkxFRlRfQlJBQ0tFVCIsDQogICAgICAgICddJzogICAgIlJJR0hUX0JSQUNLRVQiLA0KICAgICAgICAneyc6ICAgICJMRUZUX0NVUkxZIiwNCiAgICAgICAgJ30nOiAgICAiUklHSFRfQ1VSTFkiLA0KICAgICAgICAnKCc6ICAgICJMRUZUX1BBUkVOIiwNCiAgICAgICAgJyknOiAgICAiUklHSFRfUEFSRU4iDQogICAgfTsNCg0KICAgIC8vIEhhc2ggb2Yga2V5d29yZCBpZGVudGlmaWVyIHRvIHRva2VucyBpbmRleC4gIE5COiB3ZSBtdXN0IG51bGwgX19wcm90b19fIHRvDQogICAgLy8gYXZvaWQgdG9TdHJpbmcsIGV0Yy4gbmFtZXNwYWNlIHBvbGx1dGlvbi4NCiAgICB2YXIga2V5d29yZHMgPSB7X19wcm90b19fOiBudWxsfTsNCg0KICAgIC8vIERlZmluZSBjb25zdCBFTkQsIGV0Yy4sIGJhc2VkIG9uIHRoZSB0b2tlbiBuYW1lcy4gIEFsc28gbWFwIG5hbWUgdG8gaW5kZXguDQogICAgdmFyIHRva2VuSWRzID0ge307DQoNCiAgICAvLyBCdWlsZGluZyB1cCBhIHN0cmluZyB0byBiZSBldmFsJ2QgaW4gZGlmZmVyZW50IGNvbnRleHRzLg0KICAgIHZhciBjb25zdHMgPSBOYXJjaXNzdXMuaG9zdFN1cHBvcnRzRXZhbENvbnN0ID8gImNvbnN0ICIgOiAidmFyICI7DQogICAgZm9yICh2YXIgaSA9IDAsIGogPSB0b2tlbnMubGVuZ3RoOyBpIDwgajsgaSsrKSB7DQogICAgICAgIGlmIChpID4gMCkNCiAgICAgICAgICAgIGNvbnN0cyArPSAiLCAiOw0KICAgICAgICB2YXIgdCA9IHRva2Vuc1tpXTsNCiAgICAgICAgdmFyIG5hbWU7DQogICAgICAgIGlmICgvXlthLXpdLy50ZXN0KHQpKSB7DQogICAgICAgICAgICBuYW1lID0gdC50b1VwcGVyQ2FzZSgpOw0KICAgICAgICAgICAga2V5d29yZHNbdF0gPSBpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgbmFtZSA9ICgvXlxXLy50ZXN0KHQpID8gb3BUeXBlTmFtZXNbdF0gOiB0KTsNCiAgICAgICAgfQ0KICAgICAgICBjb25zdHMgKz0gbmFtZSArICIgPSAiICsgaTsNCiAgICAgICAgdG9rZW5JZHNbbmFtZV0gPSBpOw0KICAgICAgICB0b2tlbnNbdF0gPSBpOw0KICAgIH0NCiAgICBjb25zdHMgKz0gIjsiOw0KDQogICAgdmFyIGlzU3RhdGVtZW50U3RhcnRDb2RlID0ge19fcHJvdG9fXzogbnVsbH07DQogICAgZm9yIChpID0gMCwgaiA9IHN0YXRlbWVudFN0YXJ0VG9rZW5zLmxlbmd0aDsgaSA8IGo7IGkrKykNCiAgICAgICAgaXNTdGF0ZW1lbnRTdGFydENvZGVba2V5d29yZHNbc3RhdGVtZW50U3RhcnRUb2tlbnNbaV1dXSA9IHRydWU7DQoNCiAgICAvLyBNYXAgYXNzaWdubWVudCBvcGVyYXRvcnMgdG8gdGhlaXIgaW5kZXhlcyBpbiB0aGUgdG9rZW5zIGFycmF5Lg0KICAgIHZhciBhc3NpZ25PcHMgPSBbJ3wnLCAnXicsICcmJywgJzw8JywgJz4+JywgJz4+PicsICcrJywgJy0nLCAnKicsICcvJywgJyUnXTsNCg0KICAgIGZvciAoaSA9IDAsIGogPSBhc3NpZ25PcHMubGVuZ3RoOyBpIDwgajsgaSsrKSB7DQogICAgICAgIHQgPSBhc3NpZ25PcHNbaV07DQogICAgICAgIGFzc2lnbk9wc1t0XSA9IHRva2Vuc1t0XTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkZWZpbmVHZXR0ZXIob2JqLCBwcm9wLCBmbiwgZG9udERlbGV0ZSwgZG9udEVudW0pIHsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ2V0OiBmbiwgY29uZmlndXJhYmxlOiAhZG9udERlbGV0ZSwgZW51bWVyYWJsZTogIWRvbnRFbnVtIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRlZmluZUdldHRlclNldHRlcihvYmosIHByb3AsIGdldHRlciwgc2V0dGVyLCBkb250RGVsZXRlLCBkb250RW51bSkgew0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7DQogICAgICAgICAgICBnZXQ6IGdldHRlciwNCiAgICAgICAgICAgIHNldDogc2V0dGVyLA0KICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhZG9udERlbGV0ZSwNCiAgICAgICAgICAgIGVudW1lcmFibGU6ICFkb250RW51bQ0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkZWZpbmVNZW1vR2V0dGVyKG9iaiwgcHJvcCwgZm4sIGRvbnREZWxldGUsIGRvbnRFbnVtKSB7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHsNCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgdmFyIHZhbCA9IGZuKCk7DQogICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB2YWwsIGRvbnREZWxldGUsIHRydWUsIGRvbnRFbnVtKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwNCiAgICAgICAgICAgIGVudW1lcmFibGU6ICFkb250RW51bQ0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHZhbCwgZG9udERlbGV0ZSwgcmVhZE9ubHksIGRvbnRFbnVtKSB7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHZhbHVlOiB2YWwsIHdyaXRhYmxlOiAhcmVhZE9ubHksIGNvbmZpZ3VyYWJsZTogIWRvbnREZWxldGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICFkb250RW51bSB9KTsNCiAgICB9DQoNCiAgICAvLyBSZXR1cm5zIHRydWUgaWYgZm4gaXMgYSBuYXRpdmUgZnVuY3Rpb24uICAoTm90ZTogU3BpZGVyTW9ua2V5IHNwZWNpZmljLikNCiAgICBmdW5jdGlvbiBpc05hdGl2ZUNvZGUoZm4pIHsNCiAgICAgICAgLy8gUmVsaWVzIG9uIHRoZSB0b1N0cmluZyBtZXRob2QgdG8gaWRlbnRpZnkgbmF0aXZlIGNvZGUuDQogICAgICAgIHJldHVybiAoKHR5cGVvZiBmbikgPT09ICJmdW5jdGlvbiIpICYmIGZuLnRvU3RyaW5nKCkubWF0Y2goL1xbbmF0aXZlIGNvZGVcXS8pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmosIG5hbWUpIHsNCiAgICAgICAgd2hpbGUgKG9iaikgew0KICAgICAgICAgICAgaWYgKCh7fSkuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIG5hbWUpKQ0KICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgbmFtZSk7DQogICAgICAgICAgICBvYmogPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFByb3BlcnR5TmFtZXMob2JqKSB7DQogICAgICAgIHZhciB0YWJsZSA9IE9iamVjdC5jcmVhdGUobnVsbCwge30pOw0KICAgICAgICB3aGlsZSAob2JqKSB7DQogICAgICAgICAgICB2YXIgbmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopOw0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBuYW1lcy5sZW5ndGg7IGkgPCBuOyBpKyspDQogICAgICAgICAgICAgICAgdGFibGVbbmFtZXNbaV1dID0gdHJ1ZTsNCiAgICAgICAgICAgIG9iaiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0YWJsZSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0T3duUHJvcGVydGllcyhvYmopIHsNCiAgICAgICAgdmFyIG1hcCA9IHt9Ow0KICAgICAgICBmb3IgKHZhciBuYW1lIGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikpDQogICAgICAgICAgICBtYXBbbmFtZV0gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgbmFtZSk7DQogICAgICAgIHJldHVybiBtYXA7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYmxhY2tsaXN0SGFuZGxlcih0YXJnZXQsIGJsYWNrbGlzdCkgew0KICAgICAgICB2YXIgbWFzayA9IE9iamVjdC5jcmVhdGUobnVsbCwge30pOw0KICAgICAgICB2YXIgcmVkaXJlY3QgPSBTdHJpbmdNYXAuY3JlYXRlKGJsYWNrbGlzdCkubWFwT2JqZWN0KGZ1bmN0aW9uKG5hbWUpIHsgcmV0dXJuIG1hc2s7IH0pOw0KICAgICAgICByZXR1cm4gbWl4aW5IYW5kbGVyKHJlZGlyZWN0LCB0YXJnZXQpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHdoaXRlbGlzdEhhbmRsZXIodGFyZ2V0LCB3aGl0ZWxpc3QpIHsNCiAgICAgICAgdmFyIGNhdGNoYWxsID0gT2JqZWN0LmNyZWF0ZShudWxsLCB7fSk7DQogICAgICAgIHZhciByZWRpcmVjdCA9IFN0cmluZ01hcC5jcmVhdGUod2hpdGVsaXN0KS5tYXBPYmplY3QoZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gdGFyZ2V0OyB9KTsNCiAgICAgICAgcmV0dXJuIG1peGluSGFuZGxlcihyZWRpcmVjdCwgY2F0Y2hhbGwpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIG1pcnJvckhhbmRsZXIodGFyZ2V0LCB3cml0YWJsZSkgew0KICAgICAgICB2YXIgaGFuZGxlciA9IG1ha2VQYXNzdGhydUhhbmRsZXIodGFyZ2V0KTsNCg0KICAgICAgICB2YXIgZGVmaW5lUHJvcGVydHkgPSBoYW5kbGVyLmRlZmluZVByb3BlcnR5Ow0KICAgICAgICBoYW5kbGVyLmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24obmFtZSwgZGVzYykgew0KICAgICAgICAgICAgaWYgKCFkZXNjLmVudW1lcmFibGUpDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJtaXJyb3IgcHJvcGVydHkgbXVzdCBiZSBlbnVtZXJhYmxlIik7DQogICAgICAgICAgICBpZiAoIWRlc2MuY29uZmlndXJhYmxlKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigibWlycm9yIHByb3BlcnR5IG11c3QgYmUgY29uZmlndXJhYmxlIik7DQogICAgICAgICAgICBpZiAoZGVzYy53cml0YWJsZSAhPT0gd3JpdGFibGUpDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJtaXJyb3IgcHJvcGVydHkgbXVzdCAiICsgKHdyaXRhYmxlID8gIiIgOiAibm90ICIpICsgImJlIHdyaXRhYmxlIik7DQogICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eShuYW1lLCBkZXNjKTsNCiAgICAgICAgfTsNCg0KICAgICAgICBoYW5kbGVyLmZpeCA9IGZ1bmN0aW9uKCkgeyB9Ow0KICAgICAgICBoYW5kbGVyLmdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGhhbmRsZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yOw0KICAgICAgICBoYW5kbGVyLmdldE93blByb3BlcnR5TmFtZXMgPSBnZXRQcm9wZXJ0eU5hbWVzLmJpbmQoaGFuZGxlciwgdGFyZ2V0KTsNCiAgICAgICAgaGFuZGxlci5rZXlzID0gaGFuZGxlci5lbnVtZXJhdGU7DQogICAgICAgIGhhbmRsZXJbImRlbGV0ZSJdID0gZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZTsgfTsNCiAgICAgICAgaGFuZGxlci5oYXNPd24gPSBoYW5kbGVyLmhhczsNCiAgICAgICAgcmV0dXJuIGhhbmRsZXI7DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBNaXhpbiBwcm94aWVzIGJyZWFrIHRoZSBzaW5nbGUtaW5oZXJpdGFuY2UgbW9kZWwgb2YgcHJvdG90eXBlcywgc28NCiAgICAgKiB0aGUgaGFuZGxlciB0cmVhdHMgYWxsIHByb3BlcnRpZXMgYXMgb3duLXByb3BlcnRpZXM6DQogICAgICoNCiAgICAgKiAgICAgICAgICAgICAgICAgIFgNCiAgICAgKiAgICAgICAgICAgICAgICAgIHwNCiAgICAgKiAgICAgKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rDQogICAgICogICAgIHwgICAgICAgICAgICAgICAgIE8gICAgICAgfA0KICAgICAqICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgIHwNCiAgICAgKiAgICAgfCAgTyAgICAgICAgIE8gICAgTyAgICAgICB8DQogICAgICogICAgIHwgIHwgICAgICAgICB8ICAgIHwgICAgICAgfA0KICAgICAqICAgICB8ICBPICAgIE8gICAgTyAgICBPICAgICAgIHwNCiAgICAgKiAgICAgfCAgfCAgICB8ICAgIHwgICAgfCAgICAgICB8DQogICAgICogICAgIHwgIE8gICAgTyAgICBPICAgIE8gICAgTyAgfA0KICAgICAqICAgICB8ICB8ICAgIHwgICAgfCAgICB8ICAgIHwgIHwNCiAgICAgKiAgICAgKy0oKiktLSh3KS0tKHgpLS0oeSktLSh6KS0rDQogICAgICovDQoNCiAgICBmdW5jdGlvbiBtaXhpbkhhbmRsZXIocmVkaXJlY3QsIGNhdGNoYWxsKSB7DQogICAgICAgIGZ1bmN0aW9uIHRhcmdldEZvcihuYW1lKSB7DQogICAgICAgICAgICByZXR1cm4gaGFzT3duKHJlZGlyZWN0LCBuYW1lKSA/IHJlZGlyZWN0W25hbWVdIDogY2F0Y2hhbGw7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBnZXRNdXhQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSkgew0KICAgICAgICAgICAgdmFyIGRlc2MgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0Rm9yKG5hbWUpLCBuYW1lKTsNCiAgICAgICAgICAgIGlmIChkZXNjKQ0KICAgICAgICAgICAgICAgIGRlc2MuY29uZmlndXJhYmxlID0gdHJ1ZTsNCiAgICAgICAgICAgIHJldHVybiBkZXNjOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gZ2V0TXV4UHJvcGVydHlOYW1lcygpIHsNCiAgICAgICAgICAgIHZhciBuYW1lczEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyZWRpcmVjdCkuZmlsdGVyKGZ1bmN0aW9uKG5hbWUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gbmFtZSBpbiByZWRpcmVjdFtuYW1lXTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgdmFyIG5hbWVzMiA9IGdldFByb3BlcnR5TmFtZXMoY2F0Y2hhbGwpLmZpbHRlcihmdW5jdGlvbihuYW1lKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICFoYXNPd24ocmVkaXJlY3QsIG5hbWUpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICByZXR1cm4gbmFtZXMxLmNvbmNhdChuYW1lczIpOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gZW51bWVyYXRlTXV4KCkgew0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHJlZGlyZWN0KS5maWx0ZXIoZnVuY3Rpb24obmFtZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBuYW1lIGluIHJlZGlyZWN0W25hbWVdOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBmb3IgKG5hbWUgaW4gY2F0Y2hhbGwpIHsNCiAgICAgICAgICAgICAgICBpZiAoIWhhc093bihyZWRpcmVjdCwgbmFtZSkpDQogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5hbWUpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBoYXNNdXgobmFtZSkgew0KICAgICAgICAgICAgcmV0dXJuIG5hbWUgaW4gdGFyZ2V0Rm9yKG5hbWUpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZ2V0TXV4UHJvcGVydHlEZXNjcmlwdG9yLA0KICAgICAgICAgICAgZ2V0UHJvcGVydHlEZXNjcmlwdG9yOiBnZXRNdXhQcm9wZXJ0eURlc2NyaXB0b3IsDQogICAgICAgICAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiBnZXRNdXhQcm9wZXJ0eU5hbWVzLA0KICAgICAgICAgICAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uKG5hbWUsIGRlc2MpIHsNCiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0Rm9yKG5hbWUpLCBuYW1lLCBkZXNjKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICAiZGVsZXRlIjogZnVuY3Rpb24obmFtZSkgew0KICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0YXJnZXRGb3IobmFtZSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZSB0YXJnZXRbbmFtZV07DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgLy8gRklYTUU6IGhhIGhhIGhhDQogICAgICAgICAgICBmaXg6IGZ1bmN0aW9uKCkgeyB9LA0KICAgICAgICAgICAgaGFzOiBoYXNNdXgsDQogICAgICAgICAgICBoYXNPd246IGhhc011eCwNCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24ocmVjZWl2ZXIsIG5hbWUpIHsNCiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGFyZ2V0Rm9yKG5hbWUpOw0KICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbbmFtZV07DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgc2V0OiBmdW5jdGlvbihyZWNlaXZlciwgbmFtZSwgdmFsKSB7DQogICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRhcmdldEZvcihuYW1lKTsNCiAgICAgICAgICAgICAgICB0YXJnZXRbbmFtZV0gPSB2YWw7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgZW51bWVyYXRlOiBlbnVtZXJhdGVNdXgsDQogICAgICAgICAgICBrZXlzOiBlbnVtZXJhdGVNdXgNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBtYWtlUGFzc3RocnVIYW5kbGVyKG9iaikgew0KICAgICAgICAvLyBIYW5kbGVyIGNvcGllZCBmcm9tDQogICAgICAgIC8vIGh0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPWhhcm1vbnk6cHJveGllcyZzPXByb3h5JTIwb2JqZWN0I2V4YW1wbGVhX25vLW9wX2ZvcndhcmRpbmdfcHJveHkNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24obmFtZSkgew0KICAgICAgICAgICAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIG5hbWUpOw0KDQogICAgICAgICAgICAgICAgLy8gYSB0cmFwcGluZyBwcm94eSdzIHByb3BlcnRpZXMgbXVzdCBhbHdheXMgYmUgY29uZmlndXJhYmxlDQogICAgICAgICAgICAgICAgZGVzYy5jb25maWd1cmFibGUgPSB0cnVlOw0KICAgICAgICAgICAgICAgIHJldHVybiBkZXNjOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGdldFByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24obmFtZSkgew0KICAgICAgICAgICAgICAgIHZhciBkZXNjID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgbmFtZSk7DQoNCiAgICAgICAgICAgICAgICAvLyBhIHRyYXBwaW5nIHByb3h5J3MgcHJvcGVydGllcyBtdXN0IGFsd2F5cyBiZSBjb25maWd1cmFibGUNCiAgICAgICAgICAgICAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IHRydWU7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRlc2M7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlOYW1lczogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaik7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uKG5hbWUsIGRlc2MpIHsNCiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBuYW1lLCBkZXNjKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICAiZGVsZXRlIjogZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gZGVsZXRlIG9ialtuYW1lXTsgfSwNCiAgICAgICAgICAgIGZpeDogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbihvYmopKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRPd25Qcm9wZXJ0aWVzKG9iaik7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gQXMgbG9uZyBhcyBvYmogaXMgbm90IGZyb3plbiwgdGhlIHByb3h5IHdvbid0IGFsbG93IGl0c2VsZiB0byBiZSBmaXhlZC4NCiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyB3aWxsIGNhdXNlIGEgVHlwZUVycm9yIHRvIGJlIHRocm93bg0KICAgICAgICAgICAgfSwNCg0KICAgICAgICAgICAgaGFzOiBmdW5jdGlvbihuYW1lKSB7IHJldHVybiBuYW1lIGluIG9iajsgfSwNCiAgICAgICAgICAgIGhhc093bjogZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgbmFtZSk7IH0sDQogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKHJlY2VpdmVyLCBuYW1lKSB7IHJldHVybiBvYmpbbmFtZV07IH0sDQoNCiAgICAgICAgICAgIC8vIGJhZCBiZWhhdmlvciB3aGVuIHNldCBmYWlscyBpbiBub24tc3RyaWN0IG1vZGUNCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24ocmVjZWl2ZXIsIG5hbWUsIHZhbCkgeyBvYmpbbmFtZV0gPSB2YWw7IHJldHVybiB0cnVlOyB9LA0KICAgICAgICAgICAgZW51bWVyYXRlOiBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107DQogICAgICAgICAgICAgICAgZm9yIChuYW1lIGluIG9iaikgeyByZXN1bHQucHVzaChuYW1lKTsgfTsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGtleXM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gT2JqZWN0LmtleXMob2JqKTsgfQ0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIHZhciBoYXNPd25Qcm9wZXJ0eSA9ICh7fSkuaGFzT3duUHJvcGVydHk7DQoNCiAgICBmdW5jdGlvbiBoYXNPd24ob2JqLCBuYW1lKSB7DQogICAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgbmFtZSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gU3RyaW5nTWFwKHRhYmxlLCBzaXplKSB7DQogICAgICAgIHRoaXMudGFibGUgPSB0YWJsZSB8fCBPYmplY3QuY3JlYXRlKG51bGwsIHt9KTsNCiAgICAgICAgdGhpcy5zaXplID0gc2l6ZSB8fCAwOw0KICAgIH0NCg0KICAgIFN0cmluZ01hcC5jcmVhdGUgPSBmdW5jdGlvbih0YWJsZSkgew0KICAgICAgICB2YXIgaW5pdCA9IE9iamVjdC5jcmVhdGUobnVsbCwge30pOw0KICAgICAgICB2YXIgc2l6ZSA9IDA7DQogICAgICAgIHZhciBuYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhYmxlKTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBuYW1lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBuYW1lID0gbmFtZXNbaV07DQogICAgICAgICAgICBpbml0W25hbWVdID0gdGFibGVbbmFtZV07DQogICAgICAgICAgICBzaXplKys7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdNYXAoaW5pdCwgc2l6ZSk7DQogICAgfTsNCg0KICAgIFN0cmluZ01hcC5wcm90b3R5cGUgPSB7DQogICAgICAgIGhhczogZnVuY3Rpb24oeCkgeyByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLnRhYmxlLCB4KTsgfSwNCiAgICAgICAgc2V0OiBmdW5jdGlvbih4LCB2KSB7DQogICAgICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwodGhpcy50YWJsZSwgeCkpDQogICAgICAgICAgICAgICAgdGhpcy5zaXplKys7DQogICAgICAgICAgICB0aGlzLnRhYmxlW3hdID0gdjsNCiAgICAgICAgfSwNCiAgICAgICAgZ2V0OiBmdW5jdGlvbih4KSB7IHJldHVybiB0aGlzLnRhYmxlW3hdOyB9LA0KICAgICAgICBnZXREZWY6IGZ1bmN0aW9uKHgsIHRodW5rKSB7DQogICAgICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwodGhpcy50YWJsZSwgeCkpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNpemUrKzsNCiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlW3hdID0gdGh1bmsoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0aGlzLnRhYmxlW3hdOw0KICAgICAgICB9LA0KICAgICAgICBmb3JFYWNoOiBmdW5jdGlvbihmKSB7DQogICAgICAgICAgICB2YXIgdGFibGUgPSB0aGlzLnRhYmxlOw0KICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRhYmxlKQ0KICAgICAgICAgICAgICAgIGYuY2FsbCh0aGlzLCBrZXksIHRhYmxlW2tleV0pOw0KICAgICAgICB9LA0KICAgICAgICBtYXA6IGZ1bmN0aW9uKGYpIHsNCiAgICAgICAgICAgIHZhciB0YWJsZTEgPSB0aGlzLnRhYmxlOw0KICAgICAgICAgICAgdmFyIHRhYmxlMiA9IE9iamVjdC5jcmVhdGUobnVsbCwge30pOw0KICAgICAgICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsKSB7DQogICAgICAgICAgICAgICAgdGFibGUyW2tleV0gPSBmLmNhbGwodGhpcywgdmFsLCBrZXkpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ01hcCh0YWJsZTIsIHRoaXMuc2l6ZSk7DQogICAgICAgIH0sDQogICAgICAgIG1hcE9iamVjdDogZnVuY3Rpb24oZikgew0KICAgICAgICAgICAgdmFyIHRhYmxlMSA9IHRoaXMudGFibGU7DQogICAgICAgICAgICB2YXIgdGFibGUyID0gT2JqZWN0LmNyZWF0ZShudWxsLCB7fSk7DQogICAgICAgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24oa2V5LCB2YWwpIHsNCiAgICAgICAgICAgICAgICB0YWJsZTJba2V5XSA9IGYuY2FsbCh0aGlzLCB2YWwsIGtleSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIHJldHVybiB0YWJsZTI7DQogICAgICAgIH0sDQogICAgICAgIHRvT2JqZWN0OiBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLm1hcE9iamVjdChmdW5jdGlvbih2YWwpIHsgcmV0dXJuIHZhbDsgfSk7DQogICAgICAgIH0sDQogICAgICAgIGNob29zZTogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcy50YWJsZSlbMF07DQogICAgICAgIH0sDQogICAgICAgIHJlbW92ZTogZnVuY3Rpb24oeCkgew0KICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodGhpcy50YWJsZSwgeCkpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNpemUtLTsNCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy50YWJsZVt4XTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgY29weTogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgdGFibGUgPSBPYmplY3QuY3JlYXRlKG51bGwsIHt9KTsNCiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnRhYmxlKQ0KICAgICAgICAgICAgICAgIHRhYmxlW2tleV0gPSB0aGlzLnRhYmxlW2tleV07DQogICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ01hcCh0YWJsZSwgdGhpcy5zaXplKTsNCiAgICAgICAgfSwNCiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeyByZXR1cm4gIltvYmplY3QgU3RyaW5nTWFwXSIgfQ0KICAgIH07DQoNCiAgICAvLyBhbiBvYmplY3Qta2V5IHRhYmxlIHdpdGggcG9vciBhc3ltcHRvdGljcyAocmVwbGFjZSB3aXRoIFdlYWtNYXAgd2hlbiBwb3NzaWJsZSkNCiAgICBmdW5jdGlvbiBPYmplY3RNYXAoYXJyYXkpIHsNCiAgICAgICAgdGhpcy5hcnJheSA9IGFycmF5IHx8IFtdOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNlYXJjaE1hcChtYXAsIGtleSwgZm91bmQsIG5vdEZvdW5kKSB7DQogICAgICAgIHZhciBhID0gbWFwLmFycmF5Ow0KICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGEubGVuZ3RoOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICB2YXIgcGFpciA9IGFbaV07DQogICAgICAgICAgICBpZiAocGFpci5rZXkgPT09IGtleSkNCiAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQocGFpciwgaSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG5vdEZvdW5kKCk7DQogICAgfQ0KDQogICAgT2JqZWN0TWFwLnByb3RvdHlwZSA9IHsNCiAgICAgICAgaGFzOiBmdW5jdGlvbih4KSB7DQogICAgICAgICAgICByZXR1cm4gc2VhcmNoTWFwKHRoaXMsIHgsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9LCBmdW5jdGlvbigpIHsgcmV0dXJuIGZhbHNlIH0pOw0KICAgICAgICB9LA0KICAgICAgICBzZXQ6IGZ1bmN0aW9uKHgsIHYpIHsNCiAgICAgICAgICAgIHZhciBhID0gdGhpcy5hcnJheTsNCiAgICAgICAgICAgIHNlYXJjaE1hcCh0aGlzLCB4LA0KICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHBhaXIpIHsgcGFpci52YWx1ZSA9IHYgfSwNCiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgYS5wdXNoKHsga2V5OiB4LCB2YWx1ZTogdiB9KSB9KTsNCiAgICAgICAgfSwNCiAgICAgICAgZ2V0OiBmdW5jdGlvbih4KSB7DQogICAgICAgICAgICByZXR1cm4gc2VhcmNoTWFwKHRoaXMsIHgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHBhaXIpIHsgcmV0dXJuIHBhaXIudmFsdWUgfSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiBudWxsIH0pOw0KICAgICAgICB9LA0KICAgICAgICBnZXREZWY6IGZ1bmN0aW9uKHgsIHRodW5rKSB7DQogICAgICAgICAgICB2YXIgYSA9IHRoaXMuYXJyYXk7DQogICAgICAgICAgICByZXR1cm4gc2VhcmNoTWFwKHRoaXMsIHgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHBhaXIpIHsgcmV0dXJuIHBhaXIudmFsdWUgfSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHRodW5rKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnB1c2goeyBrZXk6IHgsIHZhbHVlOiB2IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHY7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICB9LA0KICAgICAgICBmb3JFYWNoOiBmdW5jdGlvbihmKSB7DQogICAgICAgICAgICB2YXIgYSA9IHRoaXMuYXJyYXk7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGEubGVuZ3RoOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIHBhaXIgPSBhW2ldOw0KICAgICAgICAgICAgICAgIGYuY2FsbCh0aGlzLCBwYWlyLmtleSwgcGFpci52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIGNob29zZTogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5hcnJheVswXS5rZXk7DQogICAgICAgIH0sDQogICAgICAgIGdldCBzaXplKCkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RoOw0KICAgICAgICB9LA0KICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKHgpIHsNCiAgICAgICAgICAgIHZhciBhID0gdGhpcy5hcnJheTsNCiAgICAgICAgICAgIHNlYXJjaE1hcCh0aGlzLCB4LA0KICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHBhaXIsIGkpIHsgYS5zcGxpY2UoaSwgMSkgfSwNCiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgfSk7DQogICAgICAgIH0sDQogICAgICAgIGNvcHk6IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RNYXAodGhpcy5hcnJheS5tYXAoZnVuY3Rpb24ocGFpcikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7IGtleTogcGFpci5rZXksIHZhbHVlOiBwYWlyLnZhbHVlIH0NCiAgICAgICAgICAgIH0pKTsNCiAgICAgICAgfSwNCiAgICAgICAgY2xlYXI6IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdGhpcy5hcnJheSA9IFtdOw0KICAgICAgICB9LA0KICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7IHJldHVybiAiW29iamVjdCBPYmplY3RNYXBdIiB9DQogICAgfTsNCg0KICAgIC8vIG5vbi1kZXN0cnVjdGl2ZSBzdGFjaw0KICAgIGZ1bmN0aW9uIFN0YWNrKGVsdHMpIHsNCiAgICAgICAgdGhpcy5lbHRzID0gZWx0cyB8fCBudWxsOw0KICAgIH0NCg0KICAgIFN0YWNrLnByb3RvdHlwZSA9IHsNCiAgICAgICAgcHVzaDogZnVuY3Rpb24oeCkgew0KICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGFjayh7IHRvcDogeCwgcmVzdDogdGhpcy5lbHRzIH0pOw0KICAgICAgICB9LA0KICAgICAgICB0b3A6IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgaWYgKCF0aGlzLmVsdHMpDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJlbXB0eSBzdGFjayIpOw0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWx0cy50b3A7DQogICAgICAgIH0sDQogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wID09PSBudWxsOw0KICAgICAgICB9LA0KICAgICAgICBmaW5kOiBmdW5jdGlvbih0ZXN0KSB7DQogICAgICAgICAgICBmb3IgKHZhciBlbHRzID0gdGhpcy5lbHRzOyBlbHRzOyBlbHRzID0gZWx0cy5yZXN0KSB7DQogICAgICAgICAgICAgICAgaWYgKHRlc3QoZWx0cy50b3ApKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWx0cy50b3A7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfSwNCiAgICAgICAgaGFzOiBmdW5jdGlvbih4KSB7DQogICAgICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLmZpbmQoZnVuY3Rpb24oZWx0KSB7IHJldHVybiBlbHQgPT09IHggfSkpOw0KICAgICAgICB9LA0KICAgICAgICBmb3JFYWNoOiBmdW5jdGlvbihmKSB7DQogICAgICAgICAgICBmb3IgKHZhciBlbHRzID0gdGhpcy5lbHRzOyBlbHRzOyBlbHRzID0gZWx0cy5yZXN0KSB7DQogICAgICAgICAgICAgICAgZihlbHRzLnRvcCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgbW9kdWxlLmV4cG9ydHMgPSB7DQogICAgICAgIHRva2VuczogdG9rZW5zLA0KICAgICAgICB3aGl0ZXNwYWNlOiB3aGl0ZXNwYWNlLA0KICAgICAgICBvcFR5cGVOYW1lczogb3BUeXBlTmFtZXMsDQogICAgICAgIGtleXdvcmRzOiBrZXl3b3JkcywNCiAgICAgICAgaXNTdGF0ZW1lbnRTdGFydENvZGU6IGlzU3RhdGVtZW50U3RhcnRDb2RlLA0KICAgICAgICB0b2tlbklkczogdG9rZW5JZHMsDQogICAgICAgIGNvbnN0czogY29uc3RzLA0KICAgICAgICBhc3NpZ25PcHM6IGFzc2lnbk9wcywNCiAgICAgICAgZGVmaW5lR2V0dGVyOiBkZWZpbmVHZXR0ZXIsDQogICAgICAgIGRlZmluZUdldHRlclNldHRlcjogZGVmaW5lR2V0dGVyU2V0dGVyLA0KICAgICAgICBkZWZpbmVNZW1vR2V0dGVyOiBkZWZpbmVNZW1vR2V0dGVyLA0KICAgICAgICBkZWZpbmVQcm9wZXJ0eTogZGVmaW5lUHJvcGVydHksDQogICAgICAgIGlzTmF0aXZlQ29kZTogaXNOYXRpdmVDb2RlLA0KICAgICAgICBtaXJyb3JIYW5kbGVyOiBtaXJyb3JIYW5kbGVyLA0KICAgICAgICBtaXhpbkhhbmRsZXI6IG1peGluSGFuZGxlciwNCiAgICAgICAgd2hpdGVsaXN0SGFuZGxlcjogd2hpdGVsaXN0SGFuZGxlciwNCiAgICAgICAgYmxhY2tsaXN0SGFuZGxlcjogYmxhY2tsaXN0SGFuZGxlciwNCiAgICAgICAgbWFrZVBhc3N0aHJ1SGFuZGxlcjogbWFrZVBhc3N0aHJ1SGFuZGxlciwNCiAgICAgICAgU3RyaW5nTWFwOiBTdHJpbmdNYXAsDQogICAgICAgIE9iamVjdE1hcDogT2JqZWN0TWFwLA0KICAgICAgICBTdGFjazogU3RhY2sNCiAgICB9Ow0KfSk7]]></data>
	</file>
	<file>
	  <filename>/AceEditor.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY2xhc3MgQWNlRWRpdG9yIGV4dGVuZHMgQ01TTW9kdWxlIHsNCg0KCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0NCgkjIEF0dHJpYnV0ZXMNCgkjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCQ0KDQogICAgcHJvdGVjdGVkICRub2VkaXRvcnMgPSAwOw0KICAgIHB1YmxpYyAkaGVhZGVyaW5mb3NlbnQgPSBmYWxzZTsNCiAgICBwcml2YXRlICRfaHRtbGFjdGl2ZSA9IGZhbHNlOw0KICAgIHByaXZhdGUgJF9qYXZhc2NyaXB0YWN0aXZlID0gZmFsc2U7DQogICAgcHJpdmF0ZSAkX2Nzc2FjdGl2ZSA9IGZhbHNlOw0KICAgIHByaXZhdGUgJF9waHBhY3RpdmUgPSBmYWxzZTsNCiAgICBwcml2YXRlICRfZGVmYXVsdGFjdGl2ZSA9IGZhbHNlOw0KDQoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCSMgTW9kdWxlIGFwaSBtZXRob2RzDQoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQkJDQoJDQogICAgcHVibGljIGZ1bmN0aW9uIEdldE5hbWUoKSB7DQogICAgICAgIHJldHVybiAnQWNlRWRpdG9yJzsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkgew0KICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRWZXJzaW9uKCkgew0KICAgICAgICByZXR1cm4gJzAuMi4zLjEnOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRIZWxwKCkgew0KDQogICAgICAgICRzbWFydHkgPSBjbXNtcygpLT5HZXRTbWFydHkoKTsNCiAgICAgICAgJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOyAgICAgICAgIA0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ21vZHVsZV9wYXRoJywgKCR0aGlzLT5HZXRNb2R1bGVVUkxQYXRoKCkpKTsNCiAgICAgICAgDQogICAgICAgICRzbWFydHktPmFzc2lnbignaGVscF9nZW5lcmFsX3RpdGxlJywgJHRoaXMtPkxhbmcoJ2hlbHBfZ2VuZXJhbF90aXRsZScpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdoZWxwX2dlbmVyYWxfdGV4dCcsICR0aGlzLT5MYW5nKCdoZWxwX2dlbmVyYWxfdGV4dCcpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdoZWxwX2tleWJvYXJkc2hvcnRjdXRzX3RpdGxlJywgJHRoaXMtPkxhbmcoJ2hlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfdGl0bGUnKSk7DQogICAgICAgICRzbWFydHktPmFzc2lnbignaGVscF9rZXlib2FyZHNob3J0Y3V0c19jb250ZW50JywgJHRoaXMtPkxhbmcoJ2hlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfY29udGVudCcpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdoZWxwX2Zyb250ZW5kX3RpdGxlJywgJHRoaXMtPkxhbmcoJ2hlbHBfZnJvbnRlbmRfdGl0bGUnKSk7ICAgICANCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdoZWxwX2Zyb250ZW5kX2NvbnRlbnQnLCAkdGhpcy0+TGFuZygnaGVscF9mcm9udGVuZF9jb250ZW50JykpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2hlbHBfZnJvbnRlbmRfc2FtcGxlJywgY21zX2h0bWxlbnRpdGllcygkdGhpcy0+TGFuZygnaGVscF9mcm9udGVuZF9zYW1wbGUnKSkpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2hlbHBfYWJvdXRfdGl0bGUnLCAkdGhpcy0+TGFuZygnaGVscF9hYm91dF90aXRsZScpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdoZWxwX2Fib3V0X3RleHQnLCAkdGhpcy0+TGFuZygnaGVscF9hYm91dF90ZXh0JykpOw0KDQogICAgICAgIHJldHVybiAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdoZWxwLnRwbCcpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3IoKSB7DQogICAgICAgIHJldHVybiAnR29yYW4gSWxpYyc7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkgew0KICAgICAgICByZXR1cm4gJ3VuaXF1M2VAZ21haWwuY29tJzsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkgew0KICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2NoYW5nZWxvZycpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpIHsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIEluaXRpYWxpemVGcm9udGVuZCgpDQogICAgew0KICAgICAgICAkdGhpcy0+UmVnaXN0ZXJNb2R1bGVQbHVnaW4oKTsNCiAgICAgICAgJHRoaXMtPlJlc3RyaWN0VW5rbm93blBhcmFtcygpOw0KICAgICAgICANCiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2FjdGlvbicsIENMRUFOX1NUUklORyk7DQogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdtb2RlcycsIENMRUFOX1NUUklORyk7DQogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCd0aGVtZXMnLCBDTEVBTl9TVFJJTkcpOw0KICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnbW9kZScsIENMRUFOX1NUUklORyk7DQogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCd0aGVtZScsIENMRUFOX1NUUklORyk7DQogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCd3aWR0aCcsIENMRUFOX1NUUklORyk7DQogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdoZWlnaHQnLCBDTEVBTl9TVFJJTkcpOw0KICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnZGl2aWQnLCBDTEVBTl9TVFJJTkcpOw0KDQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIEluaXRpYWxpemVBZG1pbigpDQogICAgew0KICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdhY3Rpb24nLCAnZGVmYXVsdCcsICR0aGlzLT5MYW5nKCdoZWxwX3BhcmFtX2FjdGlvbicpKTsNCiAgICAgICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignbW9kZXMnLCAnaHRtbCcsICR0aGlzLT5MYW5nKCdoZWxwX3BhcmFtX21vZGVzJykpOw0KICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCd0aGVtZXMnLCAndGV4dG1hdGUnLCAkdGhpcy0+TGFuZygnaGVscF9wYXJhbV90aGVtZXMnKSk7DQogICAgICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ21vZGUnLCAnaHRtbCcsICR0aGlzLT5MYW5nKCdoZWxwX3BhcmFtX21vZGUnKSk7DQogICAgICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ3RoZW1lJywgJ3RleHRtYXRlJywgJHRoaXMtPkxhbmcoJ2hlbHBfcGFyYW1fdGhlbWUnKSk7DQogICAgICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ3dpZHRoJywgJzQwMCcsICR0aGlzLT5MYW5nKCdoZWxwX3BhcmFtX3dpZHRoJykpOw0KICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdoZWlnaHQnLCAnNDAwJywgJHRoaXMtPkxhbmcoJ2hlbHBfcGFyYW1faGVpZ2h0JykpOw0KICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdkaXZpZCcsICdlZGl0b3InLCAkdGhpcy0+TGFuZygnaGVscF9wYXJhbV9kaXZpZCcpKTsNCg0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBTZXRQYXJhbWV0ZXJzKCkgDQogICAgew0KICAgICAgICBpZiAodmVyc2lvbl9jb21wYXJlKENNU19WRVJTSU9OLCAnMS4xMCcpIDwgMCkgew0KICAgICAgICAgICAgJHRoaXMtPkluaXRpYWxpemVGcm9udGVuZCgpOw0KICAgICAgICAgICAgJHRoaXMtPkluaXRpYWxpemVBZG1pbigpOw0KICAgICAgICB9ICAgICAgIA0KICAgIH0gICAgICAgDQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gTGF6eUxvYWRGcm9udGVuZCgpIA0KICAgIHsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIExhenlMb2FkQWRtaW4oKSB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0gICAgDQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gSGFzQWRtaW4oKSB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKSB7DQogICAgICAgIHJldHVybiAnbXlwcmVmcyc7DQogICAgfSAgIA0KDQogICAgcHVibGljIGZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKSB7DQogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygnYWRtaW5kZXNjcmlwdGlvbicpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBWaXNpYmxlVG9BZG1pblVzZXIoKSB7DQogICAgICAgIHJldHVybiAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpfHwNCiAgICAgICAgICAgICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ0FjZUVkaXRvciBVc2VyIFByZWZlcmVuY2UnKXx8DQogICAgICAgICAgICAgICAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgVGVtcGxhdGVzJyk7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgew0KICAgICAgICByZXR1cm4gIjEuOSI7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIE1heGltdW1DTVNWZXJzaW9uKCkgew0KICAgICAgICByZXR1cm4gIjEuMTEiOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBJbnN0YWxsUG9zdE1lc3NhZ2UoKSB7DQogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygncG9zdGluc3RhbGwnKTsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKSB7DQogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygncG9zdHVuaW5zdGFsbCcpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkgew0KICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3JlYWxseV91bmluc3RhbGwnKTsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gSGFzQ2FwYWJpbGl0eSgkY2FwYWJpbGl0eSwgJHBhcmFtcyA9IGFycmF5KCkpIHsNCiAgICAgICAgc3dpdGNoKCRjYXBhYmlsaXR5KQ0KICAgICAgICB7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgY2FzZSAnd3lzaXd5Zyc6DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlICdzeW50YXhoaWdobGlnaHRpbmcnOg0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIElzV1lTSVdZRygpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBJc1N5bnRheEhpZ2hsaWdodGVyKCkgew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gU3ludGF4UGFnZUZvcm1TdWJtaXQoKSB7DQogICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gU3ludGF4VGV4dGFyZWEoJG5hbWUgPSAndGV4dGFyZWEnLCAkc3ludGF4ID0gJ2h0bWwnLCAkY29sdW1ucyA9ICc4MCcsICRyb3dzID0gJzE1JywgJGVuY29kaW5nID0gJycsICRjb250ZW50ID0gJycsICRzdHlsZXNoZWV0ID0gJycsICRhZGR0ZXh0ID0gJycpDQogICAgew0KICAgICAgICAkdGV4dGFyZWEgPSAnJzsNCiAgICAgICAgJHRoaXMtPnN5bnRheGFjdGl2ZSA9IHRydWU7DQogICAgICAgICRzbWFydHkgPSAkdGhpcy0+c21hcnR5Ow0KICAgICAgICAkY29uZmlnID0gY21zbXMoKS0+R2V0Q29uZmlnKCk7DQogICAgICAgICRzbWFydHktPmFzc2lnbigndGV4dGFyZWFpZCcsICJlZGl0b3IiLiR0aGlzLT5ub2VkaXRvcnMpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2VkaXRvcmlkJywgImFjZS1lZGl0b3IiLiR0aGlzLT5ub2VkaXRvcnMpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3RleHRhcmVhbmFtZScsICRuYW1lKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzeW50YXhfY29udGVudCcsICRjb250ZW50KTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdpZCcsICR0aGlzLT5ub2VkaXRvcnMpOyAgICANCiAgICAgICAgDQoJCS8vIEFzc2lnbiBwcmVmcw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3dpZHRoJywgJHRoaXMtPkFjZUdldFByZWZlcmVuY2UoJ3dpZHRoJywgJzgwJykpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2hlaWdodCcsICR0aGlzLT5BY2VHZXRQcmVmZXJlbmNlKCdoZWlnaHQnLCAnNDAnKSk7DQogICAgICAgICRzbWFydHktPmFzc2lnbigndGhlbWUnLCAkdGhpcy0+QWNlR2V0UHJlZmVyZW5jZSgndGhlbWUnKSk7IA0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2ZvbnRzaXplJywgJHRoaXMtPkFjZUdldFByZWZlcmVuY2UoJ2ZvbnRzaXplJykpOyAJCQ0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3NvZnRfd3JhcCcsICR0aGlzLT5BY2VHZXRQcmVmZXJlbmNlKCdzb2Z0X3dyYXAnKSk7IA0KCQkNCiAgICAgICAgaWYgKCR0aGlzLT5BY2VHZXRQcmVmZXJlbmNlKCdlbmFibGVfaWUnKSl7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2VuYWJsZV9pZScsICd0cnVlJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2VuYWJsZV9pZScsICdmYWxzZScpOw0KICAgICAgICB9DQoJCSAgICAgICAgICANCiAgICAgICAgaWYgKCR0aGlzLT5BY2VHZXRQcmVmZXJlbmNlKCdmdWxsX2xpbmUnKSl7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2Z1bGxfbGluZScsICdsaW5lJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2Z1bGxfbGluZScsICd0ZXh0Jyk7DQogICAgICAgIH0NCgkJDQogICAgICAgIGlmICgkdGhpcy0+QWNlR2V0UHJlZmVyZW5jZSgnaGlnaGxpZ2h0X2FjdGl2ZScpKXsNCiAgICAgICAgICAgICRzbWFydHktPmFzc2lnbignaGlnaGxpZ2h0X2FjdGl2ZScsICd0cnVlJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2hpZ2hsaWdodF9hY3RpdmUnLCAnZmFsc2UnKTsNCiAgICAgICAgfSANCgkJDQogICAgICAgIGlmICgkdGhpcy0+QWNlR2V0UHJlZmVyZW5jZSgnc2hvd19pbnZpc2libGVzJykpew0KICAgICAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzaG93X2ludmlzaWJsZXMnLCAndHJ1ZScpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzaG93X2ludmlzaWJsZXMnLCAnZmFsc2UnKTsNCiAgICAgICAgfSANCgkJDQogICAgICAgIGlmICgkdGhpcy0+QWNlR2V0UHJlZmVyZW5jZSgncGVyc2lzdGVudF9oc2Nyb2xsJykpew0KICAgICAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdwZXJzaXN0ZW50X2hzY3JvbGwnLCAndHJ1ZScpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdwZXJzaXN0ZW50X2hzY3JvbGwnLCAnZmFsc2UnKTsNCiAgICAgICAgfQ0KIA0KICAgICAgICBpZiAoJHRoaXMtPkFjZUdldFByZWZlcmVuY2UoJ3Nob3dfZ3V0dGVyJykpew0KICAgICAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzaG93X2d1dHRlcicsICd0cnVlJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3Nob3dfZ3V0dGVyJywgJ2ZhbHNlJyk7DQogICAgICAgIH0gICAgICAgIA0KCQkNCiAgICAgICAgaWYgKCR0aGlzLT5BY2VHZXRQcmVmZXJlbmNlKCdwcmludF9tYXJnaW4nKSl7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3ByaW50X21hcmdpbicsICd0cnVlJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3ByaW50X21hcmdpbicsICdmYWxzZScpOw0KICAgICAgICB9ICAgDQoJCQ0KICAgICAgICBpZiAoJHRoaXMtPkFjZUdldFByZWZlcmVuY2UoJ3NvZnRfdGFiJykpew0KICAgICAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzb2Z0X3RhYicsICd0cnVlJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3NvZnRfdGFiJywgJ2ZhbHNlJyk7DQogICAgICAgIH0gDQoJCQ0KICAgICAgICBpZiAoJHRoaXMtPkFjZUdldFByZWZlcmVuY2UoJ2hpZ2hsaWdodF9zZWxlY3RlZCcpKXsNCiAgICAgICAgICAgICRzbWFydHktPmFzc2lnbignaGlnaGxpZ2h0X3NlbGVjdGVkJywgJ3RydWUnKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRzbWFydHktPmFzc2lnbignaGlnaGxpZ2h0X3NlbGVjdGVkJywgJ2ZhbHNlJyk7DQogICAgICAgIH0gDQogICAgICAgIHN3aXRjaCAoJHN5bnRheCkgew0KICAgICAgICAgICAgY2FzZSAnaHRtbCcgOiAkc21hcnR5LT5hc3NpZ24oJ21vZGUnLCdodG1sJyk7ICR0aGlzLT5faHRtbGFjdGl2ZSA9IHRydWU7IGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnanMnOiBjYXNlICdqYXZhc2NyaXB0JyA6ICRzbWFydHktPmFzc2lnbignbW9kZScsJ2phdmFzY3JpcHQnKTsgJHRoaXMtPl9qYXZhc2NyaXB0YWN0aXZlID0gdHJ1ZTsgYnJlYWs7DQogICAgICAgICAgICBjYXNlICdjc3MnIDogJHNtYXJ0eS0+YXNzaWduKCdtb2RlJywnY3NzJyk7ICR0aGlzLT5fY3NzYWN0aXZlID0gdHJ1ZTsgYnJlYWs7DQogICAgICAgICAgICBjYXNlICdwaHAnIDogJHNtYXJ0eS0+YXNzaWduKCdtb2RlJywncGhwJyk7ICR0aGlzIC0+IF9waHBhY3RpdmUgPSB0cnVlOyBicmVhazsNCiAgICAgICAgICAgIGRlZmF1bHQgOiAkc21hcnR5LT5hc3NpZ24oJ21vZGUnLCAkdGhpcy0+QWNlR2V0UHJlZmVyZW5jZSgnbW9kZScpKTsgJHRoaXMtPl9kZWZhdWx0YWN0aXZlID0gdHJ1ZTsgYnJlYWs7ICAgIA0KICAgICAgICB9DQoJCQ0KICAgICAgICAkdGV4dGFyZWEgPSAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdhY2UudHBsJyk7DQogICAgICAgICR0aGlzLT5ub2VkaXRvcnMrKzsNCg0KICAgICAgICByZXR1cm4gJHRleHRhcmVhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gU3ludGF4R2VuZXJhdGVIZWFkZXIoJGh0bWxyZXN1bHQgPSAnJykgew0KICAgICAgICANCiAgICAgICAgaWYgKCR0aGlzLT5oZWFkZXJpbmZvc2VudCkgcmV0dXJuICcnOw0KCQkkdGhlbWUgPSAkdGhpcy0+QWNlR2V0UHJlZmVyZW5jZSgndGhlbWUnKTsNCgkJJGNvbXByZXNzaW9uID0gJHRoaXMtPkFjZUdldFByZWZlcmVuY2UoJ3VzZV91bmNvbXByZXNzZWQnKSA/ICctdW5jb21wcmVzc2VkJyA6ICcnOw0KCQkNCiAgICAgICAgaWYgKCR0aGlzLT5fY3NzYWN0aXZlKSB7DQogICAgICAgICAgICAkc3ludGF4ID0gJ2Nzcyc7DQogICAgICAgIH0NCgkJDQogICAgICAgIGlmICgkdGhpcy0+X2phdmFzY3JpcHRhY3RpdmUpIHsNCiAgICAgICAgICAgICRzeW50YXggPSAnamF2YXNjcmlwdCc7DQogICAgICAgIH0NCgkJDQogICAgICAgIGlmICgkdGhpcy0+X3BocGFjdGl2ZSkgew0KICAgICAgICAgICAgJHN5bnRheCA9ICdwaHAnOw0KICAgICAgICB9DQoJCQ0KICAgICAgICBpZiAoJHRoaXMtPl9odG1sYWN0aXZlKSB7DQogICAgICAgICAgICAkc3ludGF4ID0gJ2h0bWwnOw0KICAgICAgICB9DQoJCQ0KCQkNCiAgICAgICAgaWYgKCR0aGlzLT5fZGVmYXVsdGFjdGl2ZSl7DQoNCgkJCSRzeW50YXggPSAkdGhpcy0+QWNlR2V0UHJlZmVyZW5jZSgnbW9kZScpOw0KICAgICAgICB9DQoNCiAgICAgICAgJGhlYWRlciA9ICcNCiAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJyAuICR0aGlzLT5HZXRNb2R1bGVVUkxQYXRoKCkgLiAnL2Nzcy9qcXVlcnktdWktMS44LjE2LmN1c3RvbS5jc3MiIC8+DQogICAgICAgIDxzY3JpcHQgc3JjPSInIC4gJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKSAuICcvYWNlL3NyYy9hY2UnIC4gJGNvbXByZXNzaW9uIC4gJy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+DQogICAgICAgIDxzY3JpcHQgc3JjPSInIC4gJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKSAuICcvYWNlL3NyYy90aGVtZS0nIC4gJHRoZW1lIC4gJGNvbXByZXNzaW9uIC4gJy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+JzsNCg0KICAgICAgICBpZiAoJHN5bnRheCAhPSAncGxhaW4nKSB7DQogICAgICAgICAgICAkaGVhZGVyIC49ICcNCiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSInIC4gJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKSAuICcvYWNlL3NyYy9tb2RlLScgLiAkc3ludGF4IC4gJGNvbXByZXNzaW9uIC4gJy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+JzsNCiAgICAgICAgfQ0KDQogICAgICAgICR0aGlzLT5oZWFkZXJpbmZvc2VudCA9IHRydWU7DQogICAgICAgIHJldHVybiAkaGVhZGVyOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRIZWFkZXJIVE1MKCkgew0KICAgICAgICAkaW5jZGlyID0gJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKTsNCiAgICAgICAgJHRtcGwgPSA8PDxFT1QNCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JGluY2Rpcn0vanMvZnVuY3Rpb25zLmpzIj48L3NjcmlwdD4NCkVPVDsNCiAgICAgICAgcmV0dXJuICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YSgkdG1wbCk7DQogICAgfQ0KCQ0KCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0NCgkjIE1vZHVsZSBtZXRob2RzDQoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLSANCg0KCWZpbmFsIHByaXZhdGUgZnVuY3Rpb24gQWNlR2V0UHJlZmVyZW5jZSgkbmFtZSkgew0KCQ0KCQkkdXNlcmlkID0gZ2V0X3VzZXJpZCgpOw0KCQkkcmVzdWx0ID0gY21zX3VzZXJwcmVmczo6Z2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nXycuJG5hbWUpOw0KCQkNCiAgICAgICAgaWYgKCRyZXN1bHQgPT09ICcnKSB7DQoJCQkNCiAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgkbmFtZSk7DQogICAgICAgIH0NCg0KCQlyZXR1cm4gJHJlc3VsdDsNCgkJDQoJfQ0KCQ0KfSAvLyBlbmQgb2YgY2xhc3MNCj8+]]></data>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7DQoNCiRkaXZpZCA9ICcnOw0KJGZvbnRzaXplID0gJzEycHgnOw0KJHRoZW1lID0gJ3R3aWxpZ2h0JzsNCg0KaWYgKCFpc3NldCgkcGFyYW1zWydkaXZpZCddKSkNCglyZXR1cm47DQoJLy8gaWQgb2Ygd3JhcHBpbmcgZWxlbWVudA0KCSRkaXZpZCA9IHRyaW0oJHBhcmFtc1snZGl2aWQnXSk7DQoJLy8gZm9udHNpemUNCgkkZm9udHNpemUgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfZm9udHNpemUnKTsNCgkvLyB3aWR0aCBvZiB3cmFwcGluZyBlbGVtZW50DQoJJHdpZHRoID0gZ2V0X3BhcmFtZXRlcl92YWx1ZSgkcGFyYW1zLCd3aWR0aCcsJHRoaXMtPkdldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3dpZHRoJykpOw0KCS8vIGhlaWdodCBvZiB3cmFwcGluZyBlbGVtZW50DQoJJGhlaWdodCA9IGdldF9wYXJhbWV0ZXJfdmFsdWUoJHBhcmFtcywnaGVpZ2h0JywkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfaGVpZ2h0JykpOw0KCS8vIG1vZGUgZm9yIGN1cnJlbnQgYXJlYQ0KCSRtb2RlID0gZ2V0X3BhcmFtZXRlcl92YWx1ZSgkcGFyYW1zLCdtb2RlJywgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3N5bnRheGFyZWFfbW9kZScpKTsNCgkvLyB0aGVtZSBmb3IgY3VycmVudCBhcmVhDQoJJHRoZW1lID0gZ2V0X3BhcmFtZXRlcl92YWx1ZSgkcGFyYW1zLCd0aGVtZScsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdmcm9udGVuZF9zeW50YXhhcmVhX3RoZW1lJykpOw0KDQoJJHNtYXJ0eS0+YXNzaWduKCdkaXZpZCcsICRkaXZpZCk7DQoJaWYgKCRtb2RlKQ0KCQkkc21hcnR5LT5hc3NpZ24oJ21vZGUnLCAkbW9kZSk7DQoJaWYgKCR0aGVtZSkNCgkJJHNtYXJ0eS0+YXNzaWduKCd0aGVtZScsICR0aGVtZSk7DQoJaWYgKCRmb250c2l6ZSkNCgkJJHNtYXJ0eS0+YXNzaWduKCdmb250c2l6ZScsICRmb250c2l6ZSk7DQoJaWYgKCR3aWR0aCkNCgkJJHNtYXJ0eS0+YXNzaWduKCd3aWR0aCcsICR3aWR0aCk7DQoJaWYgKCRoZWlnaHQpDQoJCSRzbWFydHktPmFzc2lnbignaGVpZ2h0JywgJGhlaWdodCk7DQoJDQoJJHNtYXJ0eSAtPiBhc3NpZ24oJ2FjZV91cmwnLCAkdGhpcyAtPiBHZXRNb2R1bGVVUkxQYXRoKCkpOw0KCS8vIG91dHB1dCB0ZW1wbGF0ZQ0KCWVjaG8gJHRoaXMgLT4gUHJvY2Vzc1RlbXBsYXRlKCdvcmlnX2RlZmF1bHQudHBsJyk7DQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7DQoNCglpZiAoISgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpfHwkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdBY2VFZGl0b3IgVXNlciBQcmVmZXJlbmNlJyl8fCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBUZW1wbGF0ZXMnKSkpIHsNCgkgICAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbmVlZHBlcm1pc3Npb24nLCBhcnJheSgnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkpOw0KCQlyZXR1cm47DQoJfQ0KCQ0KICAgICR1c2VyaWQgPSBnZXRfdXNlcmlkKCk7IC8vIGdldCB1c2VyIGlkDQogICAgDQogCWlmICghZW1wdHkoJHBhcmFtc1snYWN0aXZlX3RhYiddKSkgew0KCSR0YWIgPSAkcGFyYW1zWydhY3RpdmVfdGFiJ107DQoJfSBlbHNlIHsNCgkJJHRhYiA9ICdzZXR0aW5ncyc7DQoJfQkNCgkvKiBUYWJIZWFkZXJzICovDQoJZWNobyAkdGhpcy0+U3RhcnRUYWJIZWFkZXJzKCk7DQoJCS8vIGJhY2tlbmQNCgkJaWYgKCgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdBY2VFZGl0b3IgVXNlciBQcmVmZXJlbmNlJyl8fCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBUZW1wbGF0ZXMnKSkpIHsNCgkJICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcignc2V0dGluZ3MnLCAkdGhpcy0+TGFuZygnc2V0dGluZ3NfdGFiJyksICgkdGFiID09ICdzZXR0aW5ncycpKTsNCiAgICAgICAgfQ0KCQkvLyBmcm9udGVuZA0KCQlpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkgew0KCQkgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcignZnJvbnRlbmRzZXR0aW5ncycsICR0aGlzLT5MYW5nKCdmcm9udGVuZHNldHRpbmdzX3RhYicpLCAoJHRhYiA9PSAnZnJvbnRlbmRzZXR0aW5ncycpKTsNCiAgICAgICAgfQ0KCWVjaG8gJHRoaXMtPkVuZFRhYkhlYWRlcnMoKTsNCgkNCgkvKiBUYWJDb250ZW50ICovDQoJZWNobyAkdGhpcy0+U3RhcnRUYWJDb250ZW50KCk7DQoJCS8vIGJhY2tlbmQNCgkJaWYgKCgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpfHwkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdBY2VFZGl0b3IgVXNlciBQcmVmZXJlbmNlJyl8fCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBUZW1wbGF0ZXMnKSkpIHsNCgkJICBlY2hvICR0aGlzLT5TdGFydFRhYignc2V0dGluZ3MnLCAkcGFyYW1zKTsNCgkgICAJICAgaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKS4nL2Z1bmN0aW9uLmFkbWluX3ByZWZzdGFiLnBocCcpOw0KCQkgIGVjaG8gJHRoaXMtPkVuZFRhYigpOw0KICAgICAgICB9DQoJCS8vIGZyb250ZW5kDQoJCWlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpKSB7DQoJCSAgZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2Zyb250ZW5kc2V0dGluZ3MnLCAkcGFyYW1zKTsNCgkJICBpbmNsdWRlKGRpcm5hbWUoX19GSUxFX18pLicvZnVuY3Rpb24uYWRtaW5fZnJvbnRlbmRwcmVmc3RhYi5waHAnKTsNCgkJICBlY2hvICR0aGlzLT5FbmRUYWIoKTsNCiAgICAgICAgfQ0KCWVjaG8gJHRoaXMtPkVuZFRhYkNvbnRlbnQoKTsNCj8+]]></data>
	</file>
	<file>
	  <filename>/action.head.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7DQoNCi8vIGluaXRpYWxpemUNCiR0aGlzLT5kaXZpZCA9ICcnOw0KLy8gc2VsZWN0ZWQgdGhlbWVzDQokdGhpcy0+dGhlbWVzID0gZ2V0X3BhcmFtZXRlcl92YWx1ZSgkcGFyYW1zLCAndGhlbWVzJywgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3RoZW1lJykpOw0KLy8gc2VsZWN0ZWQgbW9kZXMNCiR0aGlzLT5tb2RlcyA9IGdldF9wYXJhbWV0ZXJfdmFsdWUoJHBhcmFtcywgJ21vZGVzJywgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2Zyb250ZW5kX21vZGUnKSk7DQoNCglpZiAoaXNzZXQoJHBhcmFtc1snZGl2aWQnXSkpDQoJCSR0aGlzLT5kaXZpZCA9IHRyaW0oJHBhcmFtc1snZGl2aWQnXSk7DQoJaWYgKCFpc19hcnJheSgkdGhpcy0+bW9kZSkpIHsNCgkJJHRoaXMtPm1vZGVzID0gZXhwbG9kZSgnLCcsICR0aGlzLT5tb2Rlcyk7DQoJfQ0KCWlmIChpc3NldCgkdGhpcy0+dGhlbWVzKSAmJiAhaXNfYXJyYXkoJHRoaXMtPnRoZW1lcykpIHsNCgkJJHRoaXMtPnRoZW1lcyA9IGV4cGxvZGUoJywnLCAkdGhpcy0+dGhlbWVzKTsNCgl9DQoJaWYgKGlzc2V0KCR0aGlzLT50aGVtZXMpKSB7DQoJCSRzbWFydHktPmFzc2lnbigndGhlbWVzJywgJHRoaXMtPnRoZW1lcyk7DQoJfQ0KDQoJJHNtYXJ0eS0+YXNzaWduKCdtb2RlcycsICR0aGlzLT5tb2Rlcyk7DQoJJHNtYXJ0eS0+YXNzaWduKCdhY2VfdXJsJywgJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKSk7DQoJLy8gb3V0cHV0IHRlbXBsYXRlDQoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdvcmlnX2hlYWQuanMnKTsNCj8+]]></data>
	</file>
	<file>
	  <filename>/action.savefrontendsettings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7DQoNCglpZiAoISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykpIHsNCgkJZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbmVlZHBlcm1pc3Npb24nLCBhcnJheSgnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkpOw0KCQlyZXR1cm47DQoJfQ0KDQoJaWYoaXNzZXQoJHBhcmFtc1snZnJvbnRlbmRfd2lkdGgnXSkpIA0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdmcm9udGVuZF93aWR0aCcsICRwYXJhbXNbJ2Zyb250ZW5kX3dpZHRoJ10pOwkNCg0KCWlmKGlzc2V0KCRwYXJhbXNbJ2Zyb250ZW5kX2hlaWdodCddKSkgDQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX2hlaWdodCcsICRwYXJhbXNbJ2Zyb250ZW5kX2hlaWdodCddKTsJCQ0KDQoJaWYoaXNzZXQoJHBhcmFtc1snZnJvbnRlbmRfbW9kZSddKSkgDQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX21vZGUnLCBpbXBsb2RlKCcsJywgJHBhcmFtc1snZnJvbnRlbmRfbW9kZSddKSk7DQoNCglpZihpc3NldCgkcGFyYW1zWydmcm9udGVuZF9zeW50YXhhcmVhX21vZGUnXSkpDQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3N5bnRheGFyZWFfbW9kZScsICRwYXJhbXNbJ2Zyb250ZW5kX3N5bnRheGFyZWFfbW9kZSddKTsJDQoNCglpZihpc3NldCgkcGFyYW1zWydmcm9udGVuZF90aGVtZSddKSkgDQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3RoZW1lJywgaW1wbG9kZSgnLCcsICRwYXJhbXNbJ2Zyb250ZW5kX3RoZW1lJ10pKTsJDQoJDQoJaWYoaXNzZXQoJHBhcmFtc1snZnJvbnRlbmRfc3ludGF4YXJlYV90aGVtZSddKSkNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfc3ludGF4YXJlYV90aGVtZScsICRwYXJhbXNbJ2Zyb250ZW5kX3N5bnRheGFyZWFfdGhlbWUnXSk7DQoJDQoJaWYoaXNzZXQoJHBhcmFtc1snZnJvbnRlbmRfZm9udHNpemUnXSkpDQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX2ZvbnRzaXplJywgJHBhcmFtc1snZnJvbnRlbmRfZm9udHNpemUnXSk7CQkJCQkNCg0KCS8vIHJlZGlyZWN0IHRvIHRhYgkJCQ0KCSRwYXJhbXMgPSBhcnJheSgnbW9kdWxlX21lc3NhZ2UnID0+ICR0aGlzLT5MYW5nKCdzZXR0aW5nc3NhdmVkJyksICdhY3RpdmVfdGFiJyA9PiAnZnJvbnRlbmRzZXR0aW5ncycpOw0KCSR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAnJywgJHBhcmFtcyk7DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/action.savesettings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7DQoNCmlmICghKCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ0FjZUVkaXRvciBVc2VyIFByZWZlcmVuY2UnKXx8JHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFRlbXBsYXRlcycpKSkgew0KCWVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoJ25lZWRwZXJtaXNzaW9uJywgYXJyYXkoJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykpKTsNCglyZXR1cm47DQp9DQoNCiR1c2VyaWQgPSBnZXRfdXNlcmlkKCk7IA0KDQppZighZW1wdHkoJHBhcmFtc1snd2lkdGgnXSkpDQp7DQogICAgY21zX3VzZXJwcmVmczo6c2V0X2Zvcl91c2VyKCR1c2VyaWQsICR0aGlzLT5HZXROYW1lKCkuJ193aWR0aCcsICRwYXJhbXNbJ3dpZHRoJ10pOw0KfQ0KDQppZighZW1wdHkoJHBhcmFtc1snaGVpZ2h0J10pKQ0Kew0KICAgIGNtc191c2VycHJlZnM6OnNldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ19oZWlnaHQnLCAkcGFyYW1zWydoZWlnaHQnXSk7DQp9DQoNCmNtc191c2VycHJlZnM6OnNldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ19lbmFibGVfaWUnLCAoaXNzZXQoJHBhcmFtc1snZW5hYmxlX2llJ10pID8gMSA6IDApKTsNCmNtc191c2VycHJlZnM6OnNldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ191c2VfdW5jb21wcmVzc2VkJywgKGlzc2V0KCRwYXJhbXNbJ3VzZV91bmNvbXByZXNzZWQnXSkgPyAxIDogMCkpOw0KY21zX3VzZXJwcmVmczo6c2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nX21vZGUnLCAkcGFyYW1zWydtb2RlJ10pOw0KY21zX3VzZXJwcmVmczo6c2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nX3RoZW1lJywgJHBhcmFtc1sndGhlbWUnXSk7DQpjbXNfdXNlcnByZWZzOjpzZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfZm9udHNpemUnLCAkcGFyYW1zWydmb250c2l6ZSddKTsgDQpjbXNfdXNlcnByZWZzOjpzZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfZnVsbF9saW5lJywgKGlzc2V0KCRwYXJhbXNbJ2Z1bGxfbGluZSddKSA/IDEgOiAwKSk7DQpjbXNfdXNlcnByZWZzOjpzZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfaGlnaGxpZ2h0X2FjdGl2ZScsIChpc3NldCgkcGFyYW1zWydoaWdobGlnaHRfYWN0aXZlJ10pID8gMSA6IDApKTsNCmNtc191c2VycHJlZnM6OnNldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ19zaG93X2ludmlzaWJsZXMnLCAoaXNzZXQoJHBhcmFtc1snc2hvd19pbnZpc2libGVzJ10pID8gMSA6IDApKTsNCmNtc191c2VycHJlZnM6OnNldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ19wZXJzaXN0ZW50X2hzY3JvbGwnLCAoaXNzZXQoJHBhcmFtc1sncGVyc2lzdGVudF9oc2Nyb2xsJ10pID8gMSA6IDApKTsNCmNtc191c2VycHJlZnM6OnNldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ19rZXliaW5kaW5nJywgKGlzc2V0KCRwYXJhbXNbJ2tleWJpbmRpbmcnXSkgPyAxIDogMCkpOw0KY21zX3VzZXJwcmVmczo6c2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nX3NvZnRfd3JhcCcsICRwYXJhbXNbJ3NvZnRfd3JhcCddKTsNCmNtc191c2VycHJlZnM6OnNldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ19zaG93X2d1dHRlcicsIChpc3NldCgkcGFyYW1zWydzaG93X2d1dHRlciddKSA/IDEgOiAwKSk7DQpjbXNfdXNlcnByZWZzOjpzZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfcHJpbnRfbWFyZ2luJywgKGlzc2V0KCRwYXJhbXNbJ3ByaW50X21hcmdpbiddKSA/IDEgOiAwKSk7DQpjbXNfdXNlcnByZWZzOjpzZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfc29mdF90YWInLCAoaXNzZXQoJHBhcmFtc1snc29mdF90YWInXSkgPyAxIDogMCkpOw0KY21zX3VzZXJwcmVmczo6c2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nX2hpZ2hsaWdodF9zZWxlY3RlZCcsIChpc3NldCgkcGFyYW1zWydoaWdobGlnaHRfc2VsZWN0ZWQnXSkgPyAxIDogMCkpOw0KY21zX3VzZXJwcmVmczo6c2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nX2VuYWJsZV9iZWhhdmlvcnMnLCAoaXNzZXQoJHBhcmFtc1snZW5hYmxlX2JlaGF2aW9ycyddKSA/IDEgOiAwKSk7ICAgIAkJCQkNCg0KLy8gcmVkaXJlY3QgdG8gdGFiDQokcGFyYW1zID0gYXJyYXkoJ21vZHVsZV9tZXNzYWdlJyA9PiAkdGhpcy0+TGFuZygnc2V0dGluZ3NzYXZlZCcpLCAnYWN0aXZlX3RhYicgPT4gJ3NldHRpbmdzJyk7DQokdGhpcy0+UmVkaXJlY3QoJGlkLCAnZGVmYXVsdGFkbWluJywgJycsICRwYXJhbXMpOw0KPz4=]]></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[LyoNCiAqIGpRdWVyeSBVSSBDU1MgRnJhbWV3b3JrIDEuOC4xNg0KICoNCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkNCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLg0KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQ0KICoNCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvVGhlbWluZy9BUEkNCiAqLw0KDQovKiBMYXlvdXQgaGVscGVycw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoudWktaGVscGVyLWhpZGRlbiB7IGRpc3BsYXk6IG5vbmU7IH0NCi51aS1oZWxwZXItaGlkZGVuLWFjY2Vzc2libGUgeyBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsgY2xpcDogcmVjdCgxcHggMXB4IDFweCAxcHgpOyBjbGlwOiByZWN0KDFweCwxcHgsMXB4LDFweCk7IH0NCi51aS1oZWxwZXItcmVzZXQgeyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IGJvcmRlcjogMDsgb3V0bGluZTogMDsgbGluZS1oZWlnaHQ6IDEuMzsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXNpemU6IDEwMCU7IGxpc3Qtc3R5bGU6IG5vbmU7IH0NCi51aS1oZWxwZXItY2xlYXJmaXg6YWZ0ZXIgeyBjb250ZW50OiAiLiI7IGRpc3BsYXk6IGJsb2NrOyBoZWlnaHQ6IDA7IGNsZWFyOiBib3RoOyB2aXNpYmlsaXR5OiBoaWRkZW47IH0NCi51aS1oZWxwZXItY2xlYXJmaXggeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IH0NCi8qIHJlcXVpcmVkIGNvbW1lbnQgZm9yIGNsZWFyZml4IHRvIHdvcmsgaW4gT3BlcmEgXCovDQoqIGh0bWwgLnVpLWhlbHBlci1jbGVhcmZpeCB7IGhlaWdodDoxJTsgfQ0KLnVpLWhlbHBlci1jbGVhcmZpeCB7IGRpc3BsYXk6YmxvY2s7IH0NCi8qIGVuZCBjbGVhcmZpeCAqLw0KLnVpLWhlbHBlci16Zml4IHsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgdG9wOiAwOyBsZWZ0OiAwOyBwb3NpdGlvbjogYWJzb2x1dGU7IG9wYWNpdHk6IDA7IGZpbHRlcjpBbHBoYShPcGFjaXR5PTApOyB9DQoNCg0KLyogSW50ZXJhY3Rpb24gQ3Vlcw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoudWktc3RhdGUtZGlzYWJsZWQgeyBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDsgfQ0KDQoNCi8qIEljb25zDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogc3RhdGVzIGFuZCBpbWFnZXMgKi8NCi51aS1pY29uIHsgZGlzcGxheTogYmxvY2s7IHRleHQtaW5kZW50OiAtOTk5OTlweDsgb3ZlcmZsb3c6IGhpZGRlbjsgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgfQ0KDQoNCi8qIE1pc2MgdmlzdWFscw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIE92ZXJsYXlzICovDQoudWktd2lkZ2V0LW92ZXJsYXkgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgfQ0KDQoNCi8qDQogKiBqUXVlcnkgVUkgQ1NTIEZyYW1ld29yayAxLjguMTYNCiAqDQogKiBDb3B5cmlnaHQgMjAxMSwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpDQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4NCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UNCiAqDQogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1RoZW1pbmcvQVBJDQogKg0KICogVG8gdmlldyBhbmQgbW9kaWZ5IHRoaXMgdGhlbWUsIHZpc2l0IGh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvP2ZmRGVmYXVsdD1WZXJkYW5hLEFyaWFsLHNhbnMtc2VyaWYmZndEZWZhdWx0PW5vcm1hbCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTRweCZiZ0NvbG9ySGVhZGVyPWNjY2NjYyZiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj03NSZib3JkZXJDb2xvckhlYWRlcj1hYWFhYWEmZmNIZWFkZXI9MjIyMjIyJmljb25Db2xvckhlYWRlcj0yMjIyMjImYmdDb2xvckNvbnRlbnQ9ZmZmZmZmJmJnVGV4dHVyZUNvbnRlbnQ9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5Q29udGVudD03NSZib3JkZXJDb2xvckNvbnRlbnQ9YWFhYWFhJmZjQ29udGVudD0yMjIyMjImaWNvbkNvbG9yQ29udGVudD0yMjIyMjImYmdDb2xvckRlZmF1bHQ9ZTZlNmU2JmJnVGV4dHVyZURlZmF1bHQ9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eURlZmF1bHQ9NzUmYm9yZGVyQ29sb3JEZWZhdWx0PWQzZDNkMyZmY0RlZmF1bHQ9NTU1NTU1Jmljb25Db2xvckRlZmF1bHQ9ODg4ODg4JmJnQ29sb3JIb3Zlcj1kYWRhZGEmYmdUZXh0dXJlSG92ZXI9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTc1JmJvcmRlckNvbG9ySG92ZXI9OTk5OTk5JmZjSG92ZXI9MjEyMTIxJmljb25Db2xvckhvdmVyPTQ1NDU0NSZiZ0NvbG9yQWN0aXZlPWZmZmZmZiZiZ1RleHR1cmVBY3RpdmU9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUFjdGl2ZT02NSZib3JkZXJDb2xvckFjdGl2ZT1hYWFhYWEmZmNBY3RpdmU9MjEyMTIxJmljb25Db2xvckFjdGl2ZT00NTQ1NDUmYmdDb2xvckhpZ2hsaWdodD1mYmY5ZWUmYmdUZXh0dXJlSGlnaGxpZ2h0PTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NTUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9ZmNlZmExJmZjSGlnaGxpZ2h0PTM2MzYzNiZpY29uQ29sb3JIaWdobGlnaHQ9MmU4M2ZmJmJnQ29sb3JFcnJvcj1mZWYxZWMmYmdUZXh0dXJlRXJyb3I9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUVycm9yPTk1JmJvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmZjRXJyb3I9Y2QwYTBhJmljb25Db2xvckVycm9yPWNkMGEwYSZiZ0NvbG9yT3ZlcmxheT1hYWFhYWEmYmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTAmb3BhY2l0eU92ZXJsYXk9MzAmYmdDb2xvclNoYWRvdz1hYWFhYWEmYmdUZXh0dXJlU2hhZG93PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eVNoYWRvdz0wJm9wYWNpdHlTaGFkb3c9MzAmdGhpY2tuZXNzU2hhZG93PThweCZvZmZzZXRUb3BTaGFkb3c9LThweCZvZmZzZXRMZWZ0U2hhZG93PS04cHgmY29ybmVyUmFkaXVzU2hhZG93PThweA0KICovDQoNCg0KLyogQ29tcG9uZW50IGNvbnRhaW5lcnMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLnVpLXdpZGdldCB7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLEFyaWFsLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMS4xZW07IH0NCi51aS13aWRnZXQgLnVpLXdpZGdldCB7IGZvbnQtc2l6ZTogMWVtOyB9DQoudWktd2lkZ2V0IGlucHV0LCAudWktd2lkZ2V0IHNlbGVjdCwgLnVpLXdpZGdldCB0ZXh0YXJlYSwgLnVpLXdpZGdldCBidXR0b24geyBmb250LWZhbWlseTogVmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmOyBmb250LXNpemU6IDFlbTsgfQ0KLnVpLXdpZGdldC1jb250ZW50IHsgYm9yZGVyOiAxcHggc29saWQgI2FhYWFhYTsgYmFja2dyb3VuZDogI2ZmZmZmZiB1cmwoaW1hZ2VzL3VpLWJnX2ZsYXRfNzVfZmZmZmZmXzQweDEwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7IGNvbG9yOiAjMjIyMjIyOyB9DQoudWktd2lkZ2V0LWNvbnRlbnQgYSB7IGNvbG9yOiAjMjIyMjIyOyB9DQoudWktd2lkZ2V0LWhlYWRlciB7IGJvcmRlcjogMXB4IHNvbGlkICNhYWFhYWE7IGJhY2tncm91bmQ6ICNjY2NjY2MgdXJsKGltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF83NV9jY2NjY2NfMXgxMDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBjb2xvcjogIzIyMjIyMjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCi51aS13aWRnZXQtaGVhZGVyIGEgeyBjb2xvcjogIzIyMjIyMjsgfQ0KDQovKiBJbnRlcmFjdGlvbiBzdGF0ZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLnVpLXN0YXRlLWRlZmF1bHQsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZGVmYXVsdCwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWRlZmF1bHQgeyBib3JkZXI6IDFweCBzb2xpZCAjZDNkM2QzOyBiYWNrZ3JvdW5kOiAjZTZlNmU2IHVybChpbWFnZXMvdWktYmdfZ2xhc3NfNzVfZTZlNmU2XzF4NDAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgY29sb3I6ICM1NTU1NTU7IH0NCi51aS1zdGF0ZS1kZWZhdWx0IGEsIC51aS1zdGF0ZS1kZWZhdWx0IGE6bGluaywgLnVpLXN0YXRlLWRlZmF1bHQgYTp2aXNpdGVkIHsgY29sb3I6ICM1NTU1NTU7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQ0KLnVpLXN0YXRlLWhvdmVyLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWhvdmVyLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtaG92ZXIsIC51aS1zdGF0ZS1mb2N1cywgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1mb2N1cywgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWZvY3VzIHsgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTsgYmFja2dyb3VuZDogI2RhZGFkYSB1cmwoaW1hZ2VzL3VpLWJnX2dsYXNzXzc1X2RhZGFkYV8xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGNvbG9yOiAjMjEyMTIxOyB9DQoudWktc3RhdGUtaG92ZXIgYSwgLnVpLXN0YXRlLWhvdmVyIGE6aG92ZXIgeyBjb2xvcjogIzIxMjEyMTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9DQoudWktc3RhdGUtYWN0aXZlLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWFjdGl2ZSwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWFjdGl2ZSB7IGJvcmRlcjogMXB4IHNvbGlkICNhYWFhYWE7IGJhY2tncm91bmQ6ICNmZmZmZmYgdXJsKGltYWdlcy91aS1iZ19nbGFzc182NV9mZmZmZmZfMXg0MDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBmb250LXdlaWdodDogbm9ybWFsOyBjb2xvcjogIzIxMjEyMTsgfQ0KLnVpLXN0YXRlLWFjdGl2ZSBhLCAudWktc3RhdGUtYWN0aXZlIGE6bGluaywgLnVpLXN0YXRlLWFjdGl2ZSBhOnZpc2l0ZWQgeyBjb2xvcjogIzIxMjEyMTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9DQoudWktd2lkZ2V0IDphY3RpdmUgeyBvdXRsaW5lOiBub25lOyB9DQoNCi8qIEludGVyYWN0aW9uIEN1ZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLnVpLXN0YXRlLWhpZ2hsaWdodCwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1oaWdobGlnaHQsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1oaWdobGlnaHQgIHtib3JkZXI6IDFweCBzb2xpZCAjZmNlZmExOyBiYWNrZ3JvdW5kOiAjZmJmOWVlIHVybChpbWFnZXMvdWktYmdfZ2xhc3NfNTVfZmJmOWVlXzF4NDAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsgY29sb3I6ICMzNjM2MzY7IH0NCi51aS1zdGF0ZS1oaWdobGlnaHQgYSwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1oaWdobGlnaHQgYSwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtaGlnaGxpZ2h0IGEgeyBjb2xvcjogIzM2MzYzNjsgfQ0KLnVpLXN0YXRlLWVycm9yLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkICNjZDBhMGE7IGJhY2tncm91bmQ6ICNmZWYxZWMgdXJsKGltYWdlcy91aS1iZ19nbGFzc185NV9mZWYxZWNfMXg0MDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBjb2xvcjogI2NkMGEwYTsgfQ0KLnVpLXN0YXRlLWVycm9yIGEsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3IgYSwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9yIGEgeyBjb2xvcjogI2NkMGEwYTsgfQ0KLnVpLXN0YXRlLWVycm9yLXRleHQsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3ItdGV4dCwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9yLXRleHQgeyBjb2xvcjogI2NkMGEwYTsgfQ0KLnVpLXByaW9yaXR5LXByaW1hcnksIC51aS13aWRnZXQtY29udGVudCAudWktcHJpb3JpdHktcHJpbWFyeSwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXByaW9yaXR5LXByaW1hcnkgeyBmb250LXdlaWdodDogYm9sZDsgfQ0KLnVpLXByaW9yaXR5LXNlY29uZGFyeSwgLnVpLXdpZGdldC1jb250ZW50IC51aS1wcmlvcml0eS1zZWNvbmRhcnksICAudWktd2lkZ2V0LWhlYWRlciAudWktcHJpb3JpdHktc2Vjb25kYXJ5IHsgb3BhY2l0eTogLjc7IGZpbHRlcjpBbHBoYShPcGFjaXR5PTcwKTsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgfQ0KLnVpLXN0YXRlLWRpc2FibGVkLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWRpc2FibGVkLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZGlzYWJsZWQgeyBvcGFjaXR5OiAuMzU7IGZpbHRlcjpBbHBoYShPcGFjaXR5PTM1KTsgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsgfQ0KDQovKiBJY29ucw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIHN0YXRlcyBhbmQgaW1hZ2VzICovDQoudWktaWNvbiB7IHdpZHRoOiAxNnB4OyBoZWlnaHQ6IDE2cHg7IGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvdWktaWNvbnNfMjIyMjIyXzI1NngyNDAucG5nKTsgfQ0KLnVpLXdpZGdldC1jb250ZW50IC51aS1pY29uIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zXzIyMjIyMl8yNTZ4MjQwLnBuZyk7IH0NCi51aS13aWRnZXQtaGVhZGVyIC51aS1pY29uIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zXzIyMjIyMl8yNTZ4MjQwLnBuZyk7IH0NCi51aS1zdGF0ZS1kZWZhdWx0IC51aS1pY29uIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy91aS1pY29uc184ODg4ODhfMjU2eDI0MC5wbmcpOyB9DQoudWktc3RhdGUtaG92ZXIgLnVpLWljb24sIC51aS1zdGF0ZS1mb2N1cyAudWktaWNvbiB7YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy91aS1pY29uc180NTQ1NDVfMjU2eDI0MC5wbmcpOyB9DQoudWktc3RhdGUtYWN0aXZlIC51aS1pY29uIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zXzQ1NDU0NV8yNTZ4MjQwLnBuZyk7IH0NCi51aS1zdGF0ZS1oaWdobGlnaHQgLnVpLWljb24ge2JhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvdWktaWNvbnNfMmU4M2ZmXzI1NngyNDAucG5nKTsgfQ0KLnVpLXN0YXRlLWVycm9yIC51aS1pY29uLCAudWktc3RhdGUtZXJyb3ItdGV4dCAudWktaWNvbiB7YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy91aS1pY29uc19jZDBhMGFfMjU2eDI0MC5wbmcpOyB9DQoNCi8qIHBvc2l0aW9uaW5nICovDQoudWktaWNvbi1jYXJhdC0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7IH0NCi51aS1pY29uLWNhcmF0LTEtbmUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAwOyB9DQoudWktaWNvbi1jYXJhdC0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAwOyB9DQoudWktaWNvbi1jYXJhdC0xLXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggMDsgfQ0KLnVpLWljb24tY2FyYXQtMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggMDsgfQ0KLnVpLWljb24tY2FyYXQtMS1zdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IDA7IH0NCi51aS1pY29uLWNhcmF0LTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IDA7IH0NCi51aS1pY29uLWNhcmF0LTEtbncgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggMDsgfQ0KLnVpLWljb24tY2FyYXQtMi1uLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggMDsgfQ0KLnVpLWljb24tY2FyYXQtMi1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggMDsgfQ0KLnVpLWljb24tdHJpYW5nbGUtMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTZweDsgfQ0KLnVpLWljb24tdHJpYW5nbGUtMS1uZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xNnB4OyB9DQoudWktaWNvbi10cmlhbmdsZS0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTZweDsgfQ0KLnVpLWljb24tdHJpYW5nbGUtMS1zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xNnB4OyB9DQoudWktaWNvbi10cmlhbmdsZS0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTZweDsgfQ0KLnVpLWljb24tdHJpYW5nbGUtMS1zdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNnB4OyB9DQoudWktaWNvbi10cmlhbmdsZS0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTZweDsgfQ0KLnVpLWljb24tdHJpYW5nbGUtMS1udyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTZweDsgfQ0KLnVpLWljb24tdHJpYW5nbGUtMi1uLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE2cHg7IH0NCi51aS1pY29uLXRyaWFuZ2xlLTItZS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xNnB4OyB9DQoudWktaWNvbi1hcnJvdy0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0zMnB4OyB9DQoudWktaWNvbi1hcnJvdy0xLW5lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTMycHg7IH0NCi51aS1pY29uLWFycm93LTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0zMnB4OyB9DQoudWktaWNvbi1hcnJvdy0xLXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTMycHg7IH0NCi51aS1pY29uLWFycm93LTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0zMnB4OyB9DQoudWktaWNvbi1hcnJvdy0xLXN3IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTMycHg7IH0NCi51aS1pY29uLWFycm93LTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0zMnB4OyB9DQoudWktaWNvbi1hcnJvdy0xLW53IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0zMnB4OyB9DQoudWktaWNvbi1hcnJvdy0yLW4tcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMzJweDsgfQ0KLnVpLWljb24tYXJyb3ctMi1uZS1zdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMzJweDsgfQ0KLnVpLWljb24tYXJyb3ctMi1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTMycHg7IH0NCi51aS1pY29uLWFycm93LTItc2UtbncgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTMycHg7IH0NCi51aS1pY29uLWFycm93c3RvcC0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTMycHg7IH0NCi51aS1pY29uLWFycm93c3RvcC0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTMycHg7IH0NCi51aS1pY29uLWFycm93c3RvcC0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTMycHg7IH0NCi51aS1pY29uLWFycm93c3RvcC0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTMycHg7IH0NCi51aS1pY29uLWFycm93dGhpY2stMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNDhweDsgfQ0KLnVpLWljb24tYXJyb3d0aGljay0xLW5lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTQ4cHg7IH0NCi51aS1pY29uLWFycm93dGhpY2stMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTQ4cHg7IH0NCi51aS1pY29uLWFycm93dGhpY2stMS1zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC00OHB4OyB9DQoudWktaWNvbi1hcnJvd3RoaWNrLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC00OHB4OyB9DQoudWktaWNvbi1hcnJvd3RoaWNrLTEtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtNDhweDsgfQ0KLnVpLWljb24tYXJyb3d0aGljay0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtNDhweDsgfQ0KLnVpLWljb24tYXJyb3d0aGljay0xLW53IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC00OHB4OyB9DQoudWktaWNvbi1hcnJvd3RoaWNrLTItbi1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC00OHB4OyB9DQoudWktaWNvbi1hcnJvd3RoaWNrLTItbmUtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTQ4cHg7IH0NCi51aS1pY29uLWFycm93dGhpY2stMi1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTQ4cHg7IH0NCi51aS1pY29uLWFycm93dGhpY2stMi1zZS1udyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtNDhweDsgfQ0KLnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC00OHB4OyB9DQoudWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTQ4cHg7IH0NCi51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtNDhweDsgfQ0KLnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC00OHB4OyB9DQoudWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTY0cHg7IH0NCi51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTY0cHg7IH0NCi51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTY0cHg7IH0NCi51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTY0cHg7IH0NCi51aS1pY29uLWFycm93cmV0dXJuLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC02NHB4OyB9DQoudWktaWNvbi1hcnJvd3JldHVybi0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtNjRweDsgfQ0KLnVpLWljb24tYXJyb3dyZXR1cm4tMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTY0cHg7IH0NCi51aS1pY29uLWFycm93cmV0dXJuLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtNjRweDsgfQ0KLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtNjRweDsgfQ0KLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtNjRweDsgfQ0KLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtNjRweDsgfQ0KLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtNjRweDsgfQ0KLnVpLWljb24tYXJyb3ctNCB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTgwcHg7IH0NCi51aS1pY29uLWFycm93LTQtZGlhZyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC04MHB4OyB9DQoudWktaWNvbi1leHRsaW5rIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTgwcHg7IH0NCi51aS1pY29uLW5ld3dpbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC04MHB4OyB9DQoudWktaWNvbi1yZWZyZXNoIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTgwcHg7IH0NCi51aS1pY29uLXNodWZmbGUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtODBweDsgfQ0KLnVpLWljb24tdHJhbnNmZXItZS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTgwcHg7IH0NCi51aS1pY29uLXRyYW5zZmVydGhpY2stZS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC04MHB4OyB9DQoudWktaWNvbi1mb2xkZXItY29sbGFwc2VkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtOTZweDsgfQ0KLnVpLWljb24tZm9sZGVyLW9wZW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtOTZweDsgfQ0KLnVpLWljb24tZG9jdW1lbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtOTZweDsgfQ0KLnVpLWljb24tZG9jdW1lbnQtYiB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC05NnB4OyB9DQoudWktaWNvbi1ub3RlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTk2cHg7IH0NCi51aS1pY29uLW1haWwtY2xvc2VkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTk2cHg7IH0NCi51aS1pY29uLW1haWwtb3BlbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC05NnB4OyB9DQoudWktaWNvbi1zdWl0Y2FzZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtOTZweDsgfQ0KLnVpLWljb24tY29tbWVudCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtOTZweDsgfQ0KLnVpLWljb24tcGVyc29uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC05NnB4OyB9DQoudWktaWNvbi1wcmludCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtOTZweDsgfQ0KLnVpLWljb24tdHJhc2ggeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTk2cHg7IH0NCi51aS1pY29uLWxvY2tlZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtOTZweDsgfQ0KLnVpLWljb24tdW5sb2NrZWQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTk2cHg7IH0NCi51aS1pY29uLWJvb2ttYXJrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC05NnB4OyB9DQoudWktaWNvbi10YWcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTk2cHg7IH0NCi51aS1pY29uLWhvbWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xMTJweDsgfQ0KLnVpLWljb24tZmxhZyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xMTJweDsgfQ0KLnVpLWljb24tY2FsZW5kYXIgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTEycHg7IH0NCi51aS1pY29uLWNhcnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTEycHg7IH0NCi51aS1pY29uLXBlbmNpbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xMTJweDsgfQ0KLnVpLWljb24tY2xvY2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTEycHg7IH0NCi51aS1pY29uLWRpc2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTEycHg7IH0NCi51aS1pY29uLWNhbGN1bGF0b3IgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTExMnB4OyB9DQoudWktaWNvbi16b29taW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTExMnB4OyB9DQoudWktaWNvbi16b29tb3V0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xMTJweDsgfQ0KLnVpLWljb24tc2VhcmNoIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xMTJweDsgfQ0KLnVpLWljb24td3JlbmNoIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xMTJweDsgfQ0KLnVpLWljb24tZ2VhciB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtMTEycHg7IH0NCi51aS1pY29uLWhlYXJ0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC0xMTJweDsgfQ0KLnVpLWljb24tc3RhciB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMTEycHg7IH0NCi51aS1pY29uLWxpbmsgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTExMnB4OyB9DQoudWktaWNvbi1jYW5jZWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xMjhweDsgfQ0KLnVpLWljb24tcGx1cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xMjhweDsgfQ0KLnVpLWljb24tcGx1c3RoaWNrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4OyB9DQoudWktaWNvbi1taW51cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xMjhweDsgfQ0KLnVpLWljb24tbWludXN0aGljayB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xMjhweDsgfQ0KLnVpLWljb24tY2xvc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTI4cHg7IH0NCi51aS1pY29uLWNsb3NldGhpY2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTI4cHg7IH0NCi51aS1pY29uLWtleSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTI4cHg7IH0NCi51aS1pY29uLWxpZ2h0YnVsYiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7IH0NCi51aS1pY29uLXNjaXNzb3JzIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xMjhweDsgfQ0KLnVpLWljb24tY2xpcGJvYXJkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xMjhweDsgfQ0KLnVpLWljb24tY29weSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMTI4cHg7IH0NCi51aS1pY29uLWNvbnRhY3QgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTEyOHB4OyB9DQoudWktaWNvbi1pbWFnZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtMTI4cHg7IH0NCi51aS1pY29uLXZpZGVvIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC0xMjhweDsgfQ0KLnVpLWljb24tc2NyaXB0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC0xMjhweDsgfQ0KLnVpLWljb24tYWxlcnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNDRweDsgfQ0KLnVpLWljb24taW5mbyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xNDRweDsgfQ0KLnVpLWljb24tbm90aWNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTE0NHB4OyB9DQoudWktaWNvbi1oZWxwIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE0NHB4OyB9DQoudWktaWNvbi1jaGVjayB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xNDRweDsgfQ0KLnVpLWljb24tYnVsbGV0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTE0NHB4OyB9DQoudWktaWNvbi1yYWRpby1vZmYgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTQ0cHg7IH0NCi51aS1pY29uLXJhZGlvLW9uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xNDRweDsgfQ0KLnVpLWljb24tcGluLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE0NHB4OyB9DQoudWktaWNvbi1waW4tcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTQ0cHg7IH0NCi51aS1pY29uLXBsYXkgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNjBweDsgfQ0KLnVpLWljb24tcGF1c2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTYwcHg7IH0NCi51aS1pY29uLXNlZWstbmV4dCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNjBweDsgfQ0KLnVpLWljb24tc2Vlay1wcmV2IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE2MHB4OyB9DQoudWktaWNvbi1zZWVrLWVuZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xNjBweDsgfQ0KLnVpLWljb24tc2Vlay1zdGFydCB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNjBweDsgfQ0KLyogdWktaWNvbi1zZWVrLWZpcnN0IGlzIGRlcHJlY2F0ZWQsIHVzZSB1aS1pY29uLXNlZWstc3RhcnQgaW5zdGVhZCAqLw0KLnVpLWljb24tc2Vlay1maXJzdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNjBweDsgfQ0KLnVpLWljb24tc3RvcCB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xNjBweDsgfQ0KLnVpLWljb24tZWplY3QgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE2MHB4OyB9DQoudWktaWNvbi12b2x1bWUtb2ZmIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xNjBweDsgfQ0KLnVpLWljb24tdm9sdW1lLW9uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xNjBweDsgfQ0KLnVpLWljb24tcG93ZXIgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNzZweDsgfQ0KLnVpLWljb24tc2lnbmFsLWRpYWcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTc2cHg7IH0NCi51aS1pY29uLXNpZ25hbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNzZweDsgfQ0KLnVpLWljb24tYmF0dGVyeS0wIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE3NnB4OyB9DQoudWktaWNvbi1iYXR0ZXJ5LTEgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTc2cHg7IH0NCi51aS1pY29uLWJhdHRlcnktMiB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNzZweDsgfQ0KLnVpLWljb24tYmF0dGVyeS0zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTE3NnB4OyB9DQoudWktaWNvbi1jaXJjbGUtcGx1cyB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE5MnB4OyB9DQoudWktaWNvbi1jaXJjbGUtbWludXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTkycHg7IH0NCi51aS1pY29uLWNpcmNsZS1jbG9zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xOTJweDsgfQ0KLnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTkycHg7IH0NCi51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE5MnB4OyB9DQoudWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xOTJweDsgfQ0KLnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTkycHg7IH0NCi51aS1pY29uLWNpcmNsZS1hcnJvdy1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xOTJweDsgfQ0KLnVpLWljb24tY2lyY2xlLWFycm93LXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE5MnB4OyB9DQoudWktaWNvbi1jaXJjbGUtYXJyb3ctdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTkycHg7IH0NCi51aS1pY29uLWNpcmNsZS1hcnJvdy1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xOTJweDsgfQ0KLnVpLWljb24tY2lyY2xlLXpvb21pbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMTkycHg7IH0NCi51aS1pY29uLWNpcmNsZS16b29tb3V0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0xOTJweDsgfQ0KLnVpLWljb24tY2lyY2xlLWNoZWNrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC0xOTJweDsgfQ0KLnVpLWljb24tY2lyY2xlc21hbGwtcGx1cyB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTIwOHB4OyB9DQoudWktaWNvbi1jaXJjbGVzbWFsbC1taW51cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0yMDhweDsgfQ0KLnVpLWljb24tY2lyY2xlc21hbGwtY2xvc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMjA4cHg7IH0NCi51aS1pY29uLXNxdWFyZXNtYWxsLXBsdXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMjA4cHg7IH0NCi51aS1pY29uLXNxdWFyZXNtYWxsLW1pbnVzIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTIwOHB4OyB9DQoudWktaWNvbi1zcXVhcmVzbWFsbC1jbG9zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0yMDhweDsgfQ0KLnVpLWljb24tZ3JpcC1kb3R0ZWQtdmVydGljYWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0yMjRweDsgfQ0KLnVpLWljb24tZ3JpcC1kb3R0ZWQtaG9yaXpvbnRhbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0yMjRweDsgfQ0KLnVpLWljb24tZ3JpcC1zb2xpZC12ZXJ0aWNhbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0yMjRweDsgfQ0KLnVpLWljb24tZ3JpcC1zb2xpZC1ob3Jpem9udGFsIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTIyNHB4OyB9DQoudWktaWNvbi1ncmlwc21hbGwtZGlhZ29uYWwtc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMjI0cHg7IH0NCi51aS1pY29uLWdyaXAtZGlhZ29uYWwtc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMjI0cHg7IH0NCg0KDQovKiBNaXNjIHZpc3VhbHMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiBDb3JuZXIgcmFkaXVzICovDQoudWktY29ybmVyLWFsbCwgLnVpLWNvcm5lci10b3AsIC51aS1jb3JuZXItbGVmdCwgLnVpLWNvcm5lci10bCB7IC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OiA0cHg7IC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OyAta2h0bWwtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OyBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7IH0NCi51aS1jb3JuZXItYWxsLCAudWktY29ybmVyLXRvcCwgLnVpLWNvcm5lci1yaWdodCwgLnVpLWNvcm5lci10ciB7IC1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodDogNHB4OyAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7IC1raHRtbC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OyB9DQoudWktY29ybmVyLWFsbCwgLnVpLWNvcm5lci1ib3R0b20sIC51aS1jb3JuZXItbGVmdCwgLnVpLWNvcm5lci1ibCB7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiA0cHg7IC13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4OyAta2h0bWwtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7IH0NCi51aS1jb3JuZXItYWxsLCAudWktY29ybmVyLWJvdHRvbSwgLnVpLWNvcm5lci1yaWdodCwgLnVpLWNvcm5lci1iciB7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogNHB4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7IC1raHRtbC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OyB9DQoNCi8qIE92ZXJsYXlzICovDQoudWktd2lkZ2V0LW92ZXJsYXkgeyBiYWNrZ3JvdW5kOiAjYWFhYWFhIHVybChpbWFnZXMvdWktYmdfZmxhdF8wX2FhYWFhYV80MHgxMDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBvcGFjaXR5OiAuMzA7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MzApOyB9DQoudWktd2lkZ2V0LXNoYWRvdyB7IG1hcmdpbjogLThweCAwIDAgLThweDsgcGFkZGluZzogOHB4OyBiYWNrZ3JvdW5kOiAjYWFhYWFhIHVybChpbWFnZXMvdWktYmdfZmxhdF8wX2FhYWFhYV80MHgxMDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBvcGFjaXR5OiAuMzA7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MzApOyAtbW96LWJvcmRlci1yYWRpdXM6IDhweDsgLWtodG1sLWJvcmRlci1yYWRpdXM6IDhweDsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgfS8qDQogKiBqUXVlcnkgVUkgUmVzaXphYmxlIDEuOC4xNg0KICoNCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkNCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLg0KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQ0KICoNCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvUmVzaXphYmxlI3RoZW1pbmcNCiAqLw0KLnVpLXJlc2l6YWJsZSB7IHBvc2l0aW9uOiByZWxhdGl2ZTt9DQoudWktcmVzaXphYmxlLWhhbmRsZSB7IHBvc2l0aW9uOiBhYnNvbHV0ZTtmb250LXNpemU6IDAuMXB4O3otaW5kZXg6IDk5OTk5OyBkaXNwbGF5OiBibG9jazsgfQ0KLnVpLXJlc2l6YWJsZS1kaXNhYmxlZCAudWktcmVzaXphYmxlLWhhbmRsZSwgLnVpLXJlc2l6YWJsZS1hdXRvaGlkZSAudWktcmVzaXphYmxlLWhhbmRsZSB7IGRpc3BsYXk6IG5vbmU7IH0NCi51aS1yZXNpemFibGUtbiB7IGN1cnNvcjogbi1yZXNpemU7IGhlaWdodDogN3B4OyB3aWR0aDogMTAwJTsgdG9wOiAtNXB4OyBsZWZ0OiAwOyB9DQoudWktcmVzaXphYmxlLXMgeyBjdXJzb3I6IHMtcmVzaXplOyBoZWlnaHQ6IDdweDsgd2lkdGg6IDEwMCU7IGJvdHRvbTogLTVweDsgbGVmdDogMDsgfQ0KLnVpLXJlc2l6YWJsZS1lIHsgY3Vyc29yOiBlLXJlc2l6ZTsgd2lkdGg6IDdweDsgcmlnaHQ6IC01cHg7IHRvcDogMDsgaGVpZ2h0OiAxMDAlOyB9DQoudWktcmVzaXphYmxlLXcgeyBjdXJzb3I6IHctcmVzaXplOyB3aWR0aDogN3B4OyBsZWZ0OiAtNXB4OyB0b3A6IDA7IGhlaWdodDogMTAwJTsgfQ0KLnVpLXJlc2l6YWJsZS1zZSB7IGN1cnNvcjogc2UtcmVzaXplOyB3aWR0aDogMTJweDsgaGVpZ2h0OiAxMnB4OyByaWdodDogMXB4OyBib3R0b206IDFweDsgfQ0KLnVpLXJlc2l6YWJsZS1zdyB7IGN1cnNvcjogc3ctcmVzaXplOyB3aWR0aDogOXB4OyBoZWlnaHQ6IDlweDsgbGVmdDogLTVweDsgYm90dG9tOiAtNXB4OyB9DQoudWktcmVzaXphYmxlLW53IHsgY3Vyc29yOiBudy1yZXNpemU7IHdpZHRoOiA5cHg7IGhlaWdodDogOXB4OyBsZWZ0OiAtNXB4OyB0b3A6IC01cHg7IH0NCi51aS1yZXNpemFibGUtbmUgeyBjdXJzb3I6IG5lLXJlc2l6ZTsgd2lkdGg6IDlweDsgaGVpZ2h0OiA5cHg7IHJpZ2h0OiAtNXB4OyB0b3A6IC01cHg7fQ==]]></data>
	</file>
	<file>
	  <filename>/function.admin_frontendprefstab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KCWlmIChpc3NldCgkcGFyYW1zWydleGFtcGxlX3N5bnRheCddKSkgDQoJew0KCQkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZXhhbXBsZV9zeW50YXgnLCAkcGFyYW1zWydleGFtcGxlX3N5bnRheCddKTsNCgl9DQoJCSRzbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsICdzYXZlZnJvbnRlbmRzZXR0aW5ncycsICRyZXR1cm5pZCkpOw0KCQkkc21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsNCgkJJHNtYXJ0eS0+YXNzaWduKCdzZXR0aW5nc3RleHQnLCAkdGhpcy0+TGFuZygnZnJvbnRlbmRfaGVhZF9zZXR0aW5ncycpKTsNCgkJJHNtYXJ0eS0+YXNzaWduKCdzeW50YXhfc2V0dGluZ3N0ZXh0JywgJHRoaXMtPkxhbmcoJ2Zyb250ZW5kX3N5bnRheGFyZWFfc2V0dGluZ3MnKSk7DQoJCSRzbWFydHktPmFzc2lnbignaGVhZF9kZXNjcmlwdGlvbicsICR0aGlzLT5MYW5nKCdoZWFkX2Rlc2NyaXB0aW9uJykpOw0KCQkkc21hcnR5LT5hc3NpZ24oJ2NvbnRlbnRfZGVzY3JpcHRpb24nLCAkdGhpcy0+TGFuZygnY29udGVudF9kZXNjcmlwdGlvbicpKTsNCgkJDQoJCSRzbWFydHktPmFzc2lnbignd2lkdGhfdGl0bGUnLCAkdGhpcy0+TGFuZygnZnJvbnRlbmRfd2lkdGhfdGl0bGUnKSk7DQoJCSRzbWFydHktPmFzc2lnbignd2lkdGhfaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2Zyb250ZW5kX3dpZHRoJywgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3dpZHRoJywgJzUwMCcpLCAxMCwgMjU1KSk7CQkNCgkJJHNtYXJ0eS0+YXNzaWduKCdoZWlnaHRfdGl0bGUnLCAkdGhpcy0+TGFuZygnZnJvbnRlbmRfaGVpZ2h0X3RpdGxlJykpOw0KCQkkc21hcnR5LT5hc3NpZ24oJ2hlaWdodF9pbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAnZnJvbnRlbmRfaGVpZ2h0JywgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2Zyb250ZW5kX2hlaWdodCcsICc0MDAnKSwgMTAsIDI1NSkpOw0KCQkNCgkJLyogbW9kZXMgKi8NCgkJJHNtYXJ0eS0+YXNzaWduKCdmcm9udGVuZF9zeW50YXhfbW9kZScsICR0aGlzLT5MYW5nKCdzeW50YXhfbW9kZScpKTsNCgkJCSRtb2RlcyA9IGFycmF5KA0KCQkJCSR0aGlzLT5MYW5nKCdqcycpID0+ICdqYXZhc2NyaXB0JywgDQoJCQkJJHRoaXMtPkxhbmcoJ3BsYWluJykgPT4gJ3BsYWluJywgDQoJCQkJJHRoaXMtPkxhbmcoJ3N2ZycpID0+ICdzdmcnLCANCgkJCQkkdGhpcy0+TGFuZygnaHRtbCcpID0+ICdodG1sJywNCgkJCQkkdGhpcy0+TGFuZygnY3NzJykgPT4gJ2NzcycsDQoJCQkJJHRoaXMtPkxhbmcoJ3Njc3MnKSA9PiAnc2NzcycsDQoJCQkJJHRoaXMtPkxhbmcoJ2NvZmZlZScpID0+ICdjb2ZmZWUnLA0KCQkJCSR0aGlzLT5MYW5nKCdqc29uJykgPT4gJ2pzb24nLA0KCQkJCSR0aGlzLT5MYW5nKCdweXRob24nKSA9PiAncHl0aG9uJywNCgkJCQkkdGhpcy0+TGFuZygncnVieScpID0+ICdydWJ5JywNCgkJCQkkdGhpcy0+TGFuZygncGVybCcpID0+ICdwZXJsJywNCgkJCQkkdGhpcy0+TGFuZygncGhwJykgPT4gJ3BocCcsDQoJCQkJJHRoaXMtPkxhbmcoJ2phdmEnKSA9PiAnamF2YScsDQoJCQkJJHRoaXMtPkxhbmcoJ2NzaGFycCcpID0+ICdjc2hhcnAnLA0KCQkJCSR0aGlzLT5MYW5nKCdjX2NwcCcpID0+ICdjX2NwcCcsDQoJCQkJJHRoaXMtPkxhbmcoJ2Nsb2p1cmUnKSA9PiAnY2xvanVyZScsDQoJCQkJJHRoaXMtPkxhbmcoJ2NvbGRmdXNpb24nKSA9PiAnY29sZGZ1c2lvbicsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ2hheGUnKSA9PiAnaGF4ZScsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ2xhdGV4JykgPT4gJ2xhdGV4JywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnbHVhJykgPT4gJ2x1YScsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ21hcmtkb3duJykgPT4gJ21hcmtkb3duJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygncG93ZXJzaGVsbCcpID0+ICdwb3dlcnNoZWxsJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnc3FsJykgPT4gJ3NxbCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3Bnc3FsJykgPT4gJ3Bnc3FsJywNCgkJCQkkdGhpcy0+TGFuZygnb2NhbWwnKSA9PiAnb2NhbWwnLA0KCQkJCSR0aGlzLT5MYW5nKCd0ZXh0aWxlJykgPT4gJ3RleHRpbGUnLA0KCQkJCSR0aGlzLT5MYW5nKCdncm9vdnknKSA9PiAnZ3Jvb3Z5JywNCgkJCQkkdGhpcy0+TGFuZygnc2NhbGEnKSA9PiAnc2NhbGEnDQoJCQkJKTsJDQoJCS8vIGhlYWQgbXVsdGlzZWxlY3QJCQ0KCQkkc21hcnR5LT5hc3NpZ24oJ2Zyb250ZW5kX3N5bnRheF9tb2RlaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTZWxlY3RMaXN0KCRpZCwgJ2Zyb250ZW5kX21vZGVbXScsICRtb2RlcywgZXhwbG9kZSgnLCcsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdmcm9udGVuZF9tb2RlJywgJ2h0bWwnKSksIDUpKTsNCgkJLy8gc3ludGF4YXJlYSBwcmVmDQoJCSRzbWFydHktPmFzc2lnbignZnJvbnRlbmRfc3ludGF4YXJlYV9tb2RlaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigkaWQsICdmcm9udGVuZF9zeW50YXhhcmVhX21vZGUnLCAkbW9kZXMsIC0xLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfc3ludGF4YXJlYV9tb2RlJywgJ2h0bWwnKSkpOwkJDQoJCQ0KCQkvKiB0aGVtZXMgKi8JCQ0KCQkkc21hcnR5LT5hc3NpZ24oJ3RoZW1ldGV4dCcsICR0aGlzLT5MYW5nKCd0aGVtZXMnKSk7DQoJCQkkdGhlbWVzID0gYXJyYXkoDQoJCQkJJHRoaXMtPkxhbmcoJ2Nocm9tZScpID0+ICdjaHJvbWUnLCANCgkJCQkkdGhpcy0+TGFuZygnY2xvdWRzJykgPT4gJ2Nsb3VkcycsIA0KCQkJCSR0aGlzLT5MYW5nKCdjbG91ZHNfbWlkbmlnaHQnKSA9PiAnY2xvdWRzX21pZG5pZ2h0JywgDQoJCQkJJHRoaXMtPkxhbmcoJ2NvYmFsdCcpID0+ICdjb2JhbHQnLCANCgkJCQkkdGhpcy0+TGFuZygnY3JpbXNvbl9lZGl0b3InKSA9PiAnY3JpbXNvbl9lZGl0b3InLA0KCQkJCSR0aGlzLT5MYW5nKCdkYXduJykgPT4gJ2Rhd24nLA0KCQkJCSR0aGlzLT5MYW5nKCdkcmVhbXdlYXZlcicpID0+ICdkcmVhbXdlYXZlcicsIA0KCQkJCSR0aGlzLT5MYW5nKCdlY2xpcHNlJykgPT4gJ2VjbGlwc2UnLA0KCQkJCSR0aGlzLT5MYW5nKCdpZGxlX2ZpbmdlcnMnKSA9PiAnaWRsZV9maW5nZXJzJywNCgkJCQkkdGhpcy0+TGFuZygna3JfdGhlbWUnKSA9PiAna3JfdGhlbWUnLA0KCQkJCSR0aGlzLT5MYW5nKCdtZXJiaXZvcmUnKSA9PiAnbWVyYml2b3JlJywNCgkJCQkkdGhpcy0+TGFuZygnbWVyYml2b3JlX3NvZnQnKSA9PiAnbWVyYml2b3JlX3NvZnQnLA0KCQkJCSR0aGlzLT5MYW5nKCdtb25vX2luZHVzdHJpYWwnKSA9PiAnbW9ub19pbmR1c3RyaWFsJywNCgkJCQkkdGhpcy0+TGFuZygnbW9ub2thaScpID0+ICdtb25va2FpJywNCgkJCQkkdGhpcy0+TGFuZygncGFzdGVsX29uX2RhcmsnKSA9PiAncGFzdGVsX29uX2RhcmsnLA0KCQkJCSR0aGlzLT5MYW5nKCdzb2xhcml6ZWRfZGFyaycpID0+ICdzb2xhcml6ZWRfZGFyaycsDQoJCQkJJHRoaXMtPkxhbmcoJ3NvbGFyaXplZF9saWdodCcpID0+ICdzb2xhcml6ZWRfbGlnaHQnLA0KCQkJCSR0aGlzLT5MYW5nKCd0ZXh0bWF0ZScpID0+ICd0ZXh0bWF0ZScsDQoJCQkJJHRoaXMtPkxhbmcoJ3R3aWxpZ2h0JykgPT4gJ3R3aWxpZ2h0JywNCgkJCQkkdGhpcy0+TGFuZygndmlicmFudF9pbmsnKSA9PiAndmlicmFudF9pbmsnCQkNCgkJCSk7DQoJCS8vIGhlYWQgdGhlbWVzDQoJCSRzbWFydHktPmFzc2lnbignZnJvbnRlbmRfdGhlbWVpbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dFNlbGVjdExpc3QoJGlkLCAnZnJvbnRlbmRfdGhlbWVbXScsICR0aGVtZXMsIGV4cGxvZGUoJywnLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfdGhlbWUnLCAndGV4dG1hdGUnKSksIDUpKTsNCgkJLy8gc3ludGF4YXJlYSB0aGVtZQkNCgkJJHNtYXJ0eS0+YXNzaWduKCd0aGVtZWlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCAnZnJvbnRlbmRfc3ludGF4YXJlYV90aGVtZScsICR0aGVtZXMsIC0xLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfc3ludGF4YXJlYV90aGVtZScsICd0ZXh0bWF0ZScpKSk7DQoJCQ0KCQkvKiBmb250IHNpemUgKi8NCgkJJHNtYXJ0eS0+YXNzaWduKCdmb250c2l6ZXRleHQnLCAkdGhpcy0+TGFuZygnZm9udF9zaXplJykpOw0KCQkJJGZvbnRzID0gYXJyYXkoDQoJCQkJJzEwcHgnID0+ICcxMHB4JywgDQoJCQkJJzExcHgnID0+ICcxMXB4JywgDQoJCQkJJzEycHgnID0+ICcxMnB4JywgDQoJCQkJJzE0cHgnID0+ICcxNHB4JywNCgkJCQknMTZweCcgPT4gJzE2cHgnLA0KCQkJCScyMHB4JyA9PiAnMjBweCcsDQoJCQkJJzI0cHgnID0+ICcyNHB4Jw0KCQkJKTsNCgkJJHNtYXJ0eS0+YXNzaWduKCdmb250c2l6ZWlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCAnZnJvbnRlbmRfZm9udHNpemUnLCAkZm9udHMsIC0xLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfZm9udHNpemUnLCAnMTJweCcpKSk7CQkNCgkJLy8gc3VibWl0IHNldHRpbmdzDQoJCSRzbWFydHktPmFzc2lnbignZnJvbnRlbmRzdWJtaXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnZnJvbnRlbmRzdWJtaXQnLCAkdGhpcy0+TGFuZygnc2F2ZXNldHRpbmdzJykpKTsNCgkJDQoJLyogUHJvY2Vzc1RlbXBhbHRlICovDQoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdmcm9udGVuZHNldHRpbmdzLnRwbCcpOw0KDQo/Pgk=]]></data>
	</file>
	<file>
	  <filename>/function.admin_prefstab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgIGlmIChpc3NldCgkcGFyYW1zWydleGFtcGxlX3N5bnRheCddKSkgDQogICAgew0KICAgICAgICBjbXNfdXNlcnByZWZzOjpzZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfZXhhbXBsZV9zeW50YXgnLCRwYXJhbXNbJ2V4YW1wbGVfc3ludGF4J10pOw0KICAgIH0NCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwnc2F2ZXNldHRpbmdzJywkcmV0dXJuaWQpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7DQogICAgICAgICRzbWFydHktPmFzc2lnbignc2V0dGluZ3N0ZXh0JywgJHRoaXMtPkxhbmcoJ3NldHRpbmdzX3RhYicpKTsNCg0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3dpZHRoX3RpdGxlJywgJHRoaXMtPkxhbmcoJ3dpZHRoX3RpdGxlJykpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3dpZHRoX2lucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICd3aWR0aCcsIGNtc191c2VycHJlZnM6OmdldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ193aWR0aCcsICc4MCcpLCAxMCwgMjU1KSk7ICAgICAgICANCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdoZWlnaHRfdGl0bGUnLCAkdGhpcy0+TGFuZygnaGVpZ2h0X3RpdGxlJykpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2hlaWdodF9pbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAnaGVpZ2h0JywgY21zX3VzZXJwcmVmczo6Z2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nX2hlaWdodCcsICc0MCcpLCAxMCwgMjU1KSk7DQogICAgICAgIC8vIGNyZWF0ZSBhIElFIHByZWYsIERPTlQgV0FOVCBUTyBTRUUgQSBCUiBGT1IgVEhJUyBTSElUIQ0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2VuYWJsZV9pZXRleHQnLCAkdGhpcy0+TGFuZygnZW5hYmxlX2llJykpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2VuYWJsZV9pZWRlc2NyJywgJHRoaXMtPkxhbmcoJ2VuYWJsZV9pZWRlc2NyaXB0aW9uJykpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2VuYWJsZV9pZWlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCAnZW5hYmxlX2llJywgMSwgY21zX3VzZXJwcmVmczo6Z2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nX2VuYWJsZV9pZScsIDApKSk7DQoNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCd1c2VfdW5jb21wcmVzc2VkX3RpdGxlJywgJHRoaXMtPkxhbmcoJ3VzZV91bmNvbXByZXNzZWQnKSk7DQogICAgICAgICRzbWFydHktPmFzc2lnbigndXNlX3VuY29tcHJlc3NlZF90ZXh0JywgJHRoaXMtPkxhbmcoJ3VzZV91bmNvbXByZXNzZWRfdGV4dCcpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCd1c2VfdW5jb21wcmVzc2VkX2lucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCAndXNlX3VuY29tcHJlc3NlZCcsIDEsIGNtc191c2VycHJlZnM6OmdldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ191c2VfdW5jb21wcmVzc2VkJywgMCkpKTsNCg0KICAgICAgICAvKiBtb2RlIGRyb3Bkb3duICovDQogICAgICAgICRzbWFydHktPmFzc2lnbignc3ludGF4X21vZGUnLCAkdGhpcy0+TGFuZygnc3ludGF4X21vZGUnKSk7DQogICAgICAgICAgICAkbW9kZXMgPSBhcnJheSgNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnanMnKSA9PiAnamF2YXNjcmlwdCcsIA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdwbGFpbicpID0+ICdwbGFpbicsIA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdzdmcnKSA9PiAnc3ZnJywgDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ2h0bWwnKSA9PiAnaHRtbCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ2NzcycpID0+ICdjc3MnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdzY3NzJykgPT4gJ3Njc3MnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdjb2ZmZWUnKSA9PiAnY29mZmVlJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnanNvbicpID0+ICdqc29uJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygncHl0aG9uJykgPT4gJ3B5dGhvbicsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3J1YnknKSA9PiAncnVieScsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3BlcmwnKSA9PiAncGVybCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3BocCcpID0+ICdwaHAnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdqYXZhJykgPT4gJ2phdmEnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdjc2hhcnAnKSA9PiAnY3NoYXJwJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnY19jcHAnKSA9PiAnY19jcHAnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdjbG9qdXJlJykgPT4gJ2Nsb2p1cmUnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdjb2xkZnVzaW9uJykgPT4gJ2NvbGRmdXNpb24nLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdoYXhlJykgPT4gJ2hheGUnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdsYXRleCcpID0+ICdsYXRleCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ2x1YScpID0+ICdsdWEnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdtYXJrZG93bicpID0+ICdtYXJrZG93bicsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3Bvd2Vyc2hlbGwnKSA9PiAncG93ZXJzaGVsbCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3NxbCcpID0+ICdzcWwnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdwZ3NxbCcpID0+ICdwZ3NxbCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ29jYW1sJykgPT4gJ29jYW1sJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygndGV4dGlsZScpID0+ICd0ZXh0aWxlJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnZ3Jvb3Z5JykgPT4gJ2dyb292eScsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3NjYWxhJykgPT4gJ3NjYWxhJw0KICAgICAgICAgICAgICAgICk7ICANCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzeW50YXhfbW9kZWlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCAnbW9kZScsICRtb2RlcywgLTEsIGNtc191c2VycHJlZnM6OmdldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ19tb2RlJywgJ2h0bWwnKSwnb25jaGFuZ2U9InRoaXMuZm9ybS5zdWJtaXQoKSInKSk7ICAgICAgICAgICAgICAgIA0KDQogICAgICAgIC8qIHRoZW1lcyAqLyAgICAgICAgDQogICAgICAgICRzbWFydHktPmFzc2lnbigndGhlbWV0ZXh0JywgJHRoaXMgLT4gTGFuZygndGhlbWVzJykpOw0KICAgICAgICAgICAgJHRoZW1lcyA9IGFycmF5KA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdjaHJvbWUnKSA9PiAnY2hyb21lJywgDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ2Nsb3VkcycpID0+ICdjbG91ZHMnLCANCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnY2xvdWRzX21pZG5pZ2h0JykgPT4gJ2Nsb3Vkc19taWRuaWdodCcsIA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdjb2JhbHQnKSA9PiAnY29iYWx0JywgDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ2NyaW1zb25fZWRpdG9yJykgPT4gJ2NyaW1zb25fZWRpdG9yJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnZGF3bicpID0+ICdkYXduJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnZHJlYW13ZWF2ZXInKSA9PiAnZHJlYW13ZWF2ZXInLCANCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnZWNsaXBzZScpID0+ICdlY2xpcHNlJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnaWRsZV9maW5nZXJzJykgPT4gJ2lkbGVfZmluZ2VycycsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ2tyX3RoZW1lJykgPT4gJ2tyX3RoZW1lJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnbWVyYml2b3JlJykgPT4gJ21lcmJpdm9yZScsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ21lcmJpdm9yZV9zb2Z0JykgPT4gJ21lcmJpdm9yZV9zb2Z0JywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnbW9ub19pbmR1c3RyaWFsJykgPT4gJ21vbm9faW5kdXN0cmlhbCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ21vbm9rYWknKSA9PiAnbW9ub2thaScsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3Bhc3RlbF9vbl9kYXJrJykgPT4gJ3Bhc3RlbF9vbl9kYXJrJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnc29sYXJpemVkX2RhcmsnKSA9PiAnc29sYXJpemVkX2RhcmsnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdzb2xhcml6ZWRfbGlnaHQnKSA9PiAnc29sYXJpemVkX2xpZ2h0JywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygndGV4dG1hdGUnKSA9PiAndGV4dG1hdGUnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCd0b21vcnJvdycpID0+ICd0b21vcnJvdycsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3RvbW9ycm93X25pZ2h0JykgPT4gJ3RvbW9ycm93X25pZ2h0JywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygndG9tb3Jyb3dfbmlnaHRfYmx1ZScpID0+ICd0b21vcnJvd19uaWdodF9ibHVlJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygndG9tb3Jyb3dfbmlnaHRfYnJpZ2h0JykgPT4gJ3RvbW9ycm93X25pZ2h0X2JyaWdodCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3RvbW9ycm93X25pZ2h0X2VpZ2h0aWVzJykgPT4gJ3RvbW9ycm93X25pZ2h0X2VpZ2h0aWVzJywgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3R3aWxpZ2h0JykgPT4gJ3R3aWxpZ2h0JywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygndmlicmFudF9pbmsnKSA9PiAndmlicmFudF9pbmsnICAgICANCiAgICAgICAgICAgICk7DQogICAgICAgICRzbWFydHktPmFzc2lnbigndGhlbWVpbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKCRpZCwgJ3RoZW1lJywgJHRoZW1lcywgLTEsIGNtc191c2VycHJlZnM6OmdldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ190aGVtZScsICd0ZXh0bWF0ZScpLCdvbmNoYW5nZT0idGhpcy5mb3JtLnN1Ym1pdCgpIicpKTsNCg0KICAgICAgICAvKiBmb250IHNpemUgKi8NCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdmb250c2l6ZXRleHQnLCAkdGhpcy0+TGFuZygnZm9udF9zaXplJykpOw0KICAgICAgICAgICAgJGZvbnRzID0gYXJyYXkoDQogICAgICAgICAgICAgICAgJzEwcHgnID0+ICcxMHB4JywgDQogICAgICAgICAgICAgICAgJzExcHgnID0+ICcxMXB4JywgDQogICAgICAgICAgICAgICAgJzEycHgnID0+ICcxMnB4JywgDQogICAgICAgICAgICAgICAgJzE0cHgnID0+ICcxNHB4JywNCiAgICAgICAgICAgICAgICAnMTZweCcgPT4gJzE2cHgnLA0KICAgICAgICAgICAgICAgICcyMHB4JyA9PiAnMjBweCcsDQogICAgICAgICAgICAgICAgJzI0cHgnID0+ICcyNHB4Jw0KICAgICAgICAgICAgKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdmb250c2l6ZWlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCAnZm9udHNpemUnLCAkZm9udHMsIC0xLCBjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfZm9udHNpemUnLCAnMTJweCcpKSk7ICAgICAgIA0KDQogICAgICAgICRzbWFydHktPmFzc2lnbignZnVsbF9saW5ldGV4dCcsICR0aGlzLT5MYW5nKCdmdWxsX2xpbmUnKSk7DQogICAgICAgICRzbWFydHktPmFzc2lnbignZnVsbF9saW5laW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsICdmdWxsX2xpbmUnLCAxLCBjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfZnVsbF9saW5lJywgMSkpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdoaWdobGlnaHRfYWN0aXZldGV4dCcsICR0aGlzLT5MYW5nKCdoaWdobGlnaHRfYWN0aXZlJykpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2hpZ2hsaWdodF9hY3RpdmVpbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCRpZCwgJ2hpZ2hsaWdodF9hY3RpdmUnLCAxLCBjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfaGlnaGxpZ2h0X2FjdGl2ZScsIDEpKSk7DQogICAgICAgICRzbWFydHktPmFzc2lnbignc2hvd19pbnZpc2libGVzdGV4dCcsICR0aGlzLT5MYW5nKCdzaG93X2ludmlzaWJsZXMnKSk7DQogICAgICAgICRzbWFydHktPmFzc2lnbignc2hvd19pbnZpc2libGVzaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsICdzaG93X2ludmlzaWJsZXMnLCAxLCBjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfc2hvd19pbnZpc2libGVzJywgMCkpKTsgICAgDQogICAgICAgICRzbWFydHktPmFzc2lnbigncGVyc2lzdGVudF9oc2Nyb2xsdGV4dCcsICR0aGlzLT5MYW5nKCdwZXJzaXN0ZW50X2hzY3JvbGwnKSk7DQogICAgICAgICRzbWFydHktPmFzc2lnbigncGVyc2lzdGVudF9oc2Nyb2xsaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsICdwZXJzaXN0ZW50X2hzY3JvbGwnLCAxLCBjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfcGVyc2lzdGVudF9oc2Nyb2xsJywgMSkpKTsNCg0KICAgICAgICAvKiB0ZXh0IHdyYXBwaW5nICovDQogICAgICAgICRzbWFydHktPmFzc2lnbignc29mdF93cmFwdGV4dCcsICR0aGlzLT5MYW5nKCdzb2Z0X3dyYXAnKSk7DQogICAgICAgICAgICAkc29mdF93cmFwID0gYXJyYXkoDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ29mZicpID0+ICdvZmYnLCANCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnNDAnKSA9PiAnNDAsNDAnLCANCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnODAnKSA9PiAnODAsODAnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCcxMDAnKSA9PiAnMTAwLDEwMCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJzE0MCcpID0+ICcxNDAsMTQwJw0KICAgICAgICAgICAgKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzb2Z0X3dyYXBpbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKCRpZCwgJ3NvZnRfd3JhcCcsICRzb2Z0X3dyYXAsIC0xLCBjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfc29mdF93cmFwJywgJzgwLDgwJykpKTsNCg0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3Nob3dfZ3V0dGVydGV4dCcsICR0aGlzLT5MYW5nKCdzaG93X2d1dHRlcicpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzaG93X2d1dHRlcmlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCAnc2hvd19ndXR0ZXInLCAxLCBjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfc2hvd19ndXR0ZXInLCAxKSkpOyAgICANCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdwcmludF9tYXJnaW50ZXh0JywgJHRoaXMtPkxhbmcoJ3ByaW50X21hcmdpbicpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdwcmludF9tYXJnaW5pbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCRpZCwgJ3ByaW50X21hcmdpbicsIDEsIGNtc191c2VycHJlZnM6OmdldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ19wcmludF9tYXJnaW4nLCAwKSkpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3NvZnRfdGFidGV4dCcsICR0aGlzLT5MYW5nKCdzb2Z0X3RhYicpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzb2Z0X3RhYmlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCAnc29mdF90YWInLCAxLCBjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfc29mdF90YWInLCAxKSkpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2hpZ2hsaWdodF9zZWxlY3RlZHRleHQnLCAkdGhpcy0+TGFuZygnaGlnaGxpZ2h0X3NlbGVjdGVkJykpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2hpZ2hsaWdodF9zZWxlY3RlZGlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCAnaGlnaGxpZ2h0X3NlbGVjdGVkJywgMSwgY21zX3VzZXJwcmVmczo6Z2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nX2hpZ2hsaWdodF9zZWxlY3RlZCcsIDEpKSk7ICAgDQoNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnc3VibWl0JywgJHRoaXMtPkxhbmcoJ3NhdmVzZXR0aW5ncycpKSk7DQogICAgICAgIA0KICAgICAgICAvKiBzYW1wbGUgY29udGVudCAqLw0KICAgICAgICAkc3ludGF4X2NvbnRlbnQgPSAnJzsNCiAgICAgICAgc3dpdGNoIChjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfbW9kZScsJ2h0bWwnKSkgew0KICAgICAgICAgICAgY2FzZSAnaHRtbCcgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KPGh0bWw+DQo8aGVhZD4NCg0KPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPg0KLnRleHQtbGF5ZXIgew0KICAgIGZvbnQtZmFtaWx5OiBNb25hY28sIFwiQ291cmllciBOZXdcIiwgbW9ub3NwYWNlOw0KICAgIGZvbnQtc2l6ZTogMTJweDsNCiAgICBjdXJzb3I6IHRleHQ7DQp9DQo8L3N0eWxlPg0KDQo8L2hlYWQ+DQo8Ym9keT4NCiAgICA8aDEgc3R5bGU9XCJjb2xvcjpyZWRcIj5KdWh1IEtpbm5lcnM8L2gxPg0KPC9ib2R5Pg0KPC9odG1sPg0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdjc3MnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCi50ZXh0LWxheWVyIHsNCiAgICBmb250LWZhbWlseTogTW9uYWNvLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZTsNCiAgICBmb250LXNpemU6IDEycHg7DQogICAgY3Vyc29yOiB0ZXh0Ow0KfSAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdqYXZhc2NyaXB0JyA6IHsNCiAgICAgICAgICAgICAgICAkc3ludGF4X2NvbnRlbnQgPSAiDQpmdW5jdGlvbiBmb28oaXRlbXMpIHsNCiAgICBmb3IgKHZhciBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgYWxlcnQoaXRlbXNbaV0gKyBcImp1aHVcIik7DQogICAgfSAgIC8vIFJlYWwgVGFiLg0KfSAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdwbGFpbicgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCBjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0IGNsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gdm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4NCg0KRHVpcyBhdXRlbSB2ZWwgZXVtIGlyaXVyZSBkb2xvciBpbiBoZW5kcmVyaXQgaW4gdnVscHV0YXRlIHZlbGl0IGVzc2UgbW9sZXN0aWUgY29uc2VxdWF0LCB2ZWwgaWxsdW0gZG9sb3JlIGV1IGZldWdpYXQgbnVsbGEgZmFjaWxpc2lzIGF0IHZlcm8gZXJvcyBldCBhY2N1bXNhbiBldCBpdXN0byBvZGlvIGRpZ25pc3NpbSBxdWkgYmxhbmRpdCBwcmFlc2VudCBsdXB0YXR1bSB6enJpbCBkZWxlbml0IGF1Z3VlIGR1aXMgZG9sb3JlIHRlIGZldWdhaXQgbnVsbGEgZmFjaWxpc2kuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZGlhbSBub251bW15IG5pYmggZXVpc21vZCB0aW5jaWR1bnQgdXQgbGFvcmVldCBkb2xvcmUgbWFnbmEgYWxpcXVhbSBlcmF0IHZvbHV0cGF0Lg0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdzdmcnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCjxzdmcNCiAgd2lkdGg9XCI4MDBcIiBoZWlnaHQ9XCI2MDBcIg0KICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCINCiAgb25sb2FkPVwiU3RhcnRBbmltYXRpb24oZXZ0KVwiPg0KDQogIDx0aXRsZT5UZXN0IFR1YmUgUHJvZ3Jlc3MgQmFyPC90aXRsZT4NCiAgPGRlc2M+Q3JlYXRlZCBmb3IgdGhlIFdlYiBEaXJlY3Rpb25zIFNWRyBjb21wZXRpdGlvbjwvZGVzYz4NCg0KICA8c2NyaXB0IHR5cGU9XCJ0ZXh0L2VjbWFzY3JpcHRcIj48IVtDREFUQVsNCiAgICB2YXIgdGltZXZhbHVlID0gMDsNCiAgICB2YXIgdGltZXJfaW5jcmVtZW50ID0gMTsNCiAgICB2YXIgbWF4X3RpbWUgPSAxMDA7DQogICAgdmFyIGhpY2tvcnk7DQogICAgdmFyIGRpY2tvcnk7DQogICAgdmFyIGRvY2s7DQogICAgdmFyIGk7DQoNCiAgICBmdW5jdGlvbiBTdGFydEFuaW1hdGlvbihldnQpIHsNCiAgICAgICAgaGlja29yeSAgPSBldnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoaWNrb3J5XCIpOw0KICAgICAgICBkaWNrb3J5ID0gZXZ0LnRhcmdldC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZGlja29yeVwiKTsNCiAgICAgICAgZG9jayA9IGV2dC50YXJnZXQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRvY2tcIik7DQoNCiAgICAgICAgU2hvd0FuZEdyb3dFbGVtZW50KCk7DQogICAgfQ0KICAgIGZ1bmN0aW9uIFNob3dBbmRHcm93RWxlbWVudCgpIHsNCiAgICAgICAgdGltZXZhbHVlID0gdGltZXZhbHVlICsgdGltZXJfaW5jcmVtZW50Ow0KICAgICAgICBpZiAodGltZXZhbHVlID4gbWF4X3RpbWUpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIC8vIFNjYWxlIHRoZSB0ZXh0IHN0cmluZyBncmFkdWFsbHkgdW50aWwgaXQgaXMgMjAgdGltZXMgbGFyZ2VyDQogICAgICAgIHNjYWxlZmFjdG9yID0gKHRpbWV2YWx1ZSAqIDY1MCkgLyBtYXhfdGltZTsNCg0KICAgICAgICBpZiAodGltZXZhbHVlIDwgMzApIHsNCiAgICAgICAgICAgIGhpY2tvcnkuc2V0QXR0cmlidXRlKFwiZGlzcGxheVwiLCBcIlwiKTsNCiAgICAgICAgICAgIGhpY2tvcnkuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlKFwiICsgKDYwMCtzY2FsZWZhY3RvciozKi0xICkgKyBcIiwgLTE0NCApXCIpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRpbWV2YWx1ZSA+IDMwICYmIHRpbWV2YWx1ZSA8IDY2KSB7DQogICAgICAgICAgICBkaWNrb3J5LnNldEF0dHJpYnV0ZShcImRpc3BsYXlcIiwgXCJcIik7DQogICAgICAgICAgICBkaWNrb3J5LnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZShcIiArICgtNzk1K3NjYWxlZmFjdG9yKjIpICsgXCIsIDAgKVwiKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGltZXZhbHVlID4gNjYpIHsNCiAgICAgICAgICAgIGRvY2suc2V0QXR0cmlidXRlKFwiZGlzcGxheVwiLCBcIlwiKTsNCiAgICAgICAgICAgIGRvY2suc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlKFwiICsgKDE0NTArc2NhbGVmYWN0b3IqMiotMSkgKyBcIiwgMTQ0IClcIik7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBDYWxsIFNob3dBbmRHcm93RWxlbWVudCBhZ2FpbiA8dGltZXJfaW5jcmVtZW50PiBtaWxsaXNlY29uZHMgbGF0ZXIuDQogICAgICAgIHNldFRpbWVvdXQoXCJTaG93QW5kR3Jvd0VsZW1lbnQoKVwiLCB0aW1lcl9pbmNyZW1lbnQpDQogICAgfQ0KICAgIHdpbmRvdy5TaG93QW5kR3Jvd0VsZW1lbnQgPSBTaG93QW5kR3Jvd0VsZW1lbnQNCiAgXV0+PC9zY3JpcHQ+DQoNCiAgPHJlY3QNCiAgICBmaWxsPVwiIzJlMzQzNlwiDQogICAgZmlsbC1ydWxlPVwibm9uemVyb1wiDQogICAgc3Ryb2tlLXdpZHRoPVwiM1wiDQogICAgeT1cIjBcIg0KICAgIHg9XCIwXCINCiAgICBoZWlnaHQ9XCI2MDBcIg0KICAgIHdpZHRoPVwiODAwXCINCiAgICBpZD1cInJlY3QzNTkwXCIvPg0KDQogICAgPHRleHQNCiAgICAgICBzdHlsZT1cImZvbnQtc2l6ZToxNDRweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOkJpdHN0cmVhbSBWZXJhIFNhbnMgQm9sZFwiDQogICAgICAgeD1cIjUwXCINCiAgICAgICB5PVwiMzUwXCINCiAgICAgICBpZD1cImhpY2tvcnlcIg0KICAgICAgIGRpc3BsYXk9XCJub25lXCI+DQogICAgICAgIEhpY2tvcnksPC90ZXh0Pg0KICAgIDx0ZXh0DQogICAgICAgc3R5bGU9XCJmb250LXNpemU6MTQ0cHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpCaXRzdHJlYW0gVmVyYSBTYW5zIEJvbGRcIg0KICAgICAgIHg9XCI1MFwiDQogICAgICAgeT1cIjM1MFwiDQogICAgICAgaWQ9XCJkaWNrb3J5XCINCiAgICAgICBkaXNwbGF5PVwibm9uZVwiPg0KICAgICAgICBkaWNrb3J5LDwvdGV4dD4NCiAgICA8dGV4dA0KICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjE0NHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246Qml0c3RyZWFtIFZlcmEgU2FucyBCb2xkXCINCiAgICAgICB4PVwiNTBcIg0KICAgICAgIHk9XCIzNTBcIg0KICAgICAgIGlkPVwiZG9ja1wiDQogICAgICAgZGlzcGxheT1cIm5vbmVcIj4NCiAgICAgICAgZG9jayE8L3RleHQ+DQo8L3N2Zz4gICAgICAgICAgIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhc2UgJ3Njc3MnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCi8qIHN0eWxlLnNjc3MgKi8NCg0KI25hdmJhciB7DQogICAgXCRuYXZiYXItd2lkdGg6IDgwMHB4Ow0KICAgIFwkaXRlbXM6IDU7DQogICAgXCRuYXZiYXItY29sb3I6ICNjZTRkZDY7DQoNCiAgICB3aWR0aDogXCRuYXZiYXItd2lkdGg7DQogICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIFwkbmF2YmFyLWNvbG9yOw0KDQogICAgbGkgew0KICAgICAgICBmbG9hdDogbGVmdDsNCiAgICAgICAgd2lkdGg6IFwkbmF2YmFyLXdpZHRoL1wkaXRlbXMgLSAxMHB4Ow0KDQogICAgICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0ZW4oXCRuYXZiYXItY29sb3IsIDIwJSk7DQogICAgICAgICY6aG92ZXIgew0KICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRlbihcJG5hdmJhci1jb2xvciwgMTAlKTsNCiAgICAgICAgfQ0KICAgIH0NCn0gICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAnY29mZmVlJyA6IHsNCiAgICAgICAgICAgICAgICAkc3ludGF4X2NvbnRlbnQgPSAiDQojIS91c3IvYmluL2VudiBjb2ZmZWUNCg0KdHJ5DQogICAgdGhyb3cgVVJJRXJyb3IgZGVjb2RlVVJJKDB4QzBmZmVlICogMTIzNDU2LjdlLTggLyAuOSkNCmNhdGNoIGUNCiAgICBjb25zb2xlLmxvZyAncXN0cmluZycgKyBcInFxc3RyaW5nXCIgKyAnJycNCiAgICAgICAgcWRvYw0KICAgICcnJyArIFwiXCJcIg0KICAgICAgICBxcWRvYw0KICAgIFwiXCJcIg0KDQpkbyAtPg0KICAgICMjIw0KICAgIGhlcmVjb21tZW50DQogICAgIyMjDQogICAgcmUgPSAvcmVnZXgvaW1neS50ZXN0IC8vLw0KICAgICAgICBoZXJlZ2V4ICAjIGNvbW1lbnQNCiAgICAvLy9pbWd5DQogICAgdGhpcyBpc250OiBganVzdCBKYXZhU2NyaXB0YA0KICAgIHVuZGVmaW5lZCAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdqc29uJyA6IHsNCiAgICAgICAgICAgICAgICAkc3ludGF4X2NvbnRlbnQgPSAiDQp7DQogXCJxdWVyeVwiOiB7DQogIFwiY291bnRcIjogMTAsDQogIFwiY3JlYXRlZFwiOiBcIjIwMTEtMDYtMjFUMDg6MTA6NDZaXCIsDQogIFwibGFuZ1wiOiBcImVuLVVTXCIsDQogIFwicmVzdWx0c1wiOiB7DQogICBcInBob3RvXCI6IFsNCiAgICB7DQogICAgIFwiZmFybVwiOiBcIjZcIiwNCiAgICAgXCJpZFwiOiBcIjU4NTU2MjA5NzVcIiwNCiAgICAgXCJpc2ZhbWlseVwiOiBcIjBcIiwNCiAgICAgXCJpc2ZyaWVuZFwiOiBcIjBcIiwNCiAgICAgXCJpc3B1YmxpY1wiOiBcIjFcIiwNCiAgICAgXCJvd25lclwiOiBcIjMyMDIxNTU0QE4wNFwiLA0KICAgICBcInNlY3JldFwiOiBcImYxZjVlODUxNWRcIiwNCiAgICAgXCJzZXJ2ZXJcIjogXCI1MTEwXCIsDQogICAgIFwidGl0bGVcIjogXCI3MDg3IGJhbmRpdCBjYXRcIg0KICAgIH0sDQogICAgew0KICAgICBcImZhcm1cIjogXCI0XCIsDQogICAgIFwiaWRcIjogXCI1ODU2MTcwNTM0XCIsDQogICAgIFwiaXNmYW1pbHlcIjogXCIwXCIsDQogICAgIFwiaXNmcmllbmRcIjogXCIwXCIsDQogICAgIFwiaXNwdWJsaWNcIjogXCIxXCIsDQogICAgIFwib3duZXJcIjogXCIzMjAyMTU1NEBOMDRcIiwNCiAgICAgXCJzZWNyZXRcIjogXCJmZjFlZmIyYTZmXCIsDQogICAgIFwic2VydmVyXCI6IFwiMzIxN1wiLA0KICAgICBcInRpdGxlXCI6IFwiNjk3NSBydXN0eSBjYXRcIg0KICAgIH0sDQogICAgew0KICAgICBcImZhcm1cIjogXCI2XCIsDQogICAgIFwiaWRcIjogXCI1ODU2MTcyOTcyXCIsDQogICAgIFwiaXNmYW1pbHlcIjogXCIwXCIsDQogICAgIFwiaXNmcmllbmRcIjogXCIwXCIsDQogICAgIFwiaXNwdWJsaWNcIjogXCIxXCIsDQogICAgIFwib3duZXJcIjogXCI1MTI0OTg3NUBOMDNcIiwNCiAgICAgXCJzZWNyZXRcIjogXCI2YzY4ODczNDdjXCIsDQogICAgIFwic2VydmVyXCI6IFwiNTE5MlwiLA0KICAgICBcInRpdGxlXCI6IFwid2F0ZXJtYXJrZWQtY2F0c1wiDQogICAgfSwNCiAgICB7DQogICAgIFwiZmFybVwiOiBcIjZcIiwNCiAgICAgXCJpZFwiOiBcIjU4NTYxNjgzMjhcIiwNCiAgICAgXCJpc2ZhbWlseVwiOiBcIjBcIiwNCiAgICAgXCJpc2ZyaWVuZFwiOiBcIjBcIiwNCiAgICAgXCJpc3B1YmxpY1wiOiBcIjFcIiwNCiAgICAgXCJvd25lclwiOiBcIjMyMDIxNTU0QE4wNFwiLA0KICAgICBcInNlY3JldFwiOiBcIjBjMWNmZGY2NGNcIiwNCiAgICAgXCJzZXJ2ZXJcIjogXCI1MDc4XCIsDQogICAgIFwidGl0bGVcIjogXCI3MDIwIG1hbmR5IGNhdFwiDQogICAgfSwNCiAgICB7DQogICAgIFwiZmFybVwiOiBcIjNcIiwNCiAgICAgXCJpZFwiOiBcIjU4NTYxNzE3NzRcIiwNCiAgICAgXCJpc2ZhbWlseVwiOiBcIjBcIiwNCiAgICAgXCJpc2ZyaWVuZFwiOiBcIjBcIiwNCiAgICAgXCJpc3B1YmxpY1wiOiBcIjFcIiwNCiAgICAgXCJvd25lclwiOiBcIjMyMDIxNTU0QE4wNFwiLA0KICAgICBcInNlY3JldFwiOiBcIjdmNWEzMTgwYWJcIiwNCiAgICAgXCJzZXJ2ZXJcIjogXCIyNjk2XCIsDQogICAgIFwidGl0bGVcIjogXCI3NDQ4IGJvYmJ5IGNhdFwiDQogICAgfQ0KICAgXQ0KICB9DQogfQ0KfSAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdweXRob24nIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCiMhL3Vzci9sb2NhbC9iaW4vcHl0aG9uDQoNCmltcG9ydCBzdHJpbmcsIHN5cw0KDQojIElmIG5vIGFyZ3VtZW50cyB3ZXJlIGdpdmVuLCBwcmludCBhIGhlbHBmdWwgbWVzc2FnZQ0KaWYgbGVuKHN5cy5hcmd2KT09MToNCiAgICBwcmludCAnVXNhZ2U6IGNlbHNpdXMgdGVtcDEgdGVtcDIgLi4uJw0KICAgIHN5cy5leGl0KDApDQoNCiMgTG9vcCBvdmVyIHRoZSBhcmd1bWVudHMNCmZvciBpIGluIHN5cy5hcmd2WzE6XToNCiAgICB0cnk6DQogICAgICAgIGZhaHJlbmhlaXQ9ZmxvYXQoc3RyaW5nLmF0b2koaSkpDQogICAgZXhjZXB0IHN0cmluZy5hdG9pX2Vycm9yOg0KICAgICAgICBwcmludCByZXByKGkpLCBcIm5vdCBhIG51bWVyaWMgdmFsdWVcIiAgDQogICAgZWxzZToNCiAgICAgICAgY2Vsc2l1cz0oZmFocmVuaGVpdC0zMikqNS4wLzkuMA0KICAgICAgICBwcmludCAnJWlcXDI2MEYgPSAlaVxcMjYwQycgJSAoaW50KGZhaHJlbmhlaXQpLCBpbnQoY2Vsc2l1cysuNSkpDQogICAgICAgICAgICAgICAgIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhc2UgJ3BocCcgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KPD9waHANCg0KZnVuY3Rpb24gbmZhY3QoXCRuKSB7DQogIGlmIChcJG4gPT0gMCkgew0KICAgIHJldHVybiAxOw0KICB9DQogIGVsc2Ugew0KICAgIHJldHVybiBcJG4gKiBuZmFjdChcJG4gLSAxKTsNCiAgfQ0KfQ0KDQplY2hvIFwiXFxuXFxuUGxlYXNlIGVudGVyIGEgd2hvbGUgbnVtYmVyIC4uLiBcIjsNClwkbnVtID0gdHJpbShmZ2V0cyhTVERJTikpOw0KDQovLyA9PT09PSBQUk9DRVNTIC0gRGV0ZXJtaW5nIHRoZSBmYWN0b3JpYWwgb2YgdGhlIGlucHV0IG51bWJlciA9PT09PQ0KXCRvdXRwdXQgPSBcIlxcblxcbkZhY3RvcmlhbCBcIiAuIFwkbnVtIC4gXCIgPSBcIiAuIG5mYWN0KFwkbnVtKSAuIFwiXFxuXFxuXCI7DQplY2hvIFwkb3V0cHV0Ow0KDQo/Pg0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdydWJ5JyA6IHsNCiAgICAgICAgICAgICAgICAkc3ludGF4X2NvbnRlbnQgPSAiDQojIS91c3IvYmluL3J1YnkNCg0KIyBQcm9ncmFtIHRvIGZpbmQgdGhlIGZhY3RvcmlhbCBvZiBhIG51bWJlcg0KZGVmIGZhY3QobikNCiAgICBpZiBuID09IDANCiAgICAgICAgMQ0KICAgIGVsc2UNCiAgICAgICAgbiAqIGZhY3Qobi0xKQ0KICAgIGVuZA0KZW5kDQoNCnB1dHMgZmFjdChBUkdWWzBdLnRvX2kpDQogICAgICAgICAgICAgICAgIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhc2UgJ3BlcmwnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCiMhL3Vzci9iaW4vcGVybA0KdXNlIHN0cmljdDsNCnVzZSB3YXJuaW5nczsNCm15IFwkbnVtX3ByaW1lcyA9IDA7DQpteSBAcHJpbWVzOw0KDQojIFB1dCAyIGFzIHRoZSBmaXJzdCBwcmltZSBzbyB3ZSB3b24ndCBoYXZlIGFuIGVtcHR5IGFycmF5DQpcJHByaW1lc1tcJG51bV9wcmltZXNdID0gMjsNClwkbnVtX3ByaW1lcysrOw0KDQpNQUlOX0xPT1A6DQpmb3IgbXkgXCRudW1iZXJfdG9fY2hlY2sgKDMgLi4gMjAwKQ0Kew0KICAgIGZvciBteSBcJHAgKDAgLi4gKFwkbnVtX3ByaW1lcy0xKSkNCiAgICB7DQogICAgICAgIGlmIChcJG51bWJlcl90b19jaGVjayAlIFwkcHJpbWVzW1wkcF0gPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgbmV4dCBNQUlOX0xPT1A7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAjIElmIHdlIHJlYWNoZWQgdGhpcyBwb2ludCBpdCBtZWFucyBcJG51bWJlcl90b19jaGVjayBpcyBub3QNCiAgICAjIGRpdmlzYWJsZSBieSBhbnkgcHJpbWUgbnVtYmVyIHRoYXQgY2FtZSBiZWZvcmUgaXQuDQogICAgXCRwcmltZXNbXCRudW1fcHJpbWVzXSA9IFwkbnVtYmVyX3RvX2NoZWNrOw0KICAgIFwkbnVtX3ByaW1lcysrOw0KfQ0KDQpmb3IgbXkgXCRwICgwIC4uIChcJG51bV9wcmltZXMtMSkpDQp7DQogICAgcHJpbnQgXCRwcmltZXNbXCRwXSwgXCIsIFwiOw0KfQ0KcHJpbnQgXCJcXG5cIjsNCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAnamF2YScgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KcHVibGljIGNsYXNzIEluZmluaXRlTG9vcCB7DQoNCiAgICAvKg0KICAgICAqIFRoaXMgd2lsbCBjYXVzZSB0aGUgcHJvZ3JhbSB0byBoYW5nLi4uDQogICAgICoNCiAgICAgKiBUYWtlbiBmcm9tOg0KICAgICAqIGh0dHA6Ly93d3cuZXhwbG9yaW5nYmluYXJ5LmNvbS9qYXZhLWhhbmdzLXdoZW4tY29udmVydGluZy0yLTIyNTA3Mzg1ODUwNzIwMTJlLTMwOC8NCiAgICAgKi8NCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQogICAgICAgIGRvdWJsZSBkID0gRG91YmxlLnBhcnNlRG91YmxlKFwiMi4yMjUwNzM4NTg1MDcyMDEyZS0zMDhcIik7DQoNCiAgICAgICAgLy8gdW5yZWFjaGFibGUgY29kZQ0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJWYWx1ZTogXCIgKyBkKTsNCiAgICB9DQp9DQogICAgICAgICAgICAgICAgIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhc2UgJ2NzaGFycCcgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KcHVibGljIHZvaWQgSGVsbG9Xb3JsZCgpIHsNCiAgIC8vU2F5IEhlbGxvIQ0KICAgQ29uc29sZS5Xcml0ZUxpbmUoXCJIZWxsbyBXb3JsZFwiKTsNCn0gICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAnY19jcHAnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCi8vIGNvbXBvdW5kIGFzc2lnbm1lbnQgb3BlcmF0b3JzDQoNCiNpbmNsdWRlIDxpb3N0cmVhbT4NCnVzaW5nIG5hbWVzcGFjZSBzdGQ7DQoNCmludCBtYWluICgpDQp7DQogICAgaW50IGEsIGI9MzsgLyogZm9vYmFyICovDQogICAgYSA9IGI7DQogICAgYSs9MjsgLy8gZXF1aXZhbGVudCB0byBhPWErMg0KICAgIGNvdXQgPDwgYTsNCiAgICByZXR1cm4gMDsNCn0gICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAnY2xvanVyZScgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KKGRlZm4gcGFydGluZw0KICBcInJldHVybnMgYSBTdHJpbmcgcGFydGluZyBpbiBhIGdpdmVuIGxhbmd1YWdlXCINCiAgKFtdIChwYXJ0aW5nIFwiV29ybGRcIikpDQogIChbbmFtZV0gKHBhcnRpbmcgbmFtZSBcImVuXCIpKQ0KICAoW25hbWUgbGFuZ3VhZ2VdDQogICAgOyBjb25kcCBpcyBzaW1pbGFyIHRvIGEgY2FzZSBzdGF0ZW1lbnQgaW4gb3RoZXIgbGFuZ3VhZ2VzLg0KICAgIDsgSXQgaXMgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGxhdGVyLg0KICAgIDsgSXQgaXMgdXNlZCBoZXJlIHRvIHRha2UgZGlmZmVyZW50IGFjdGlvbnMgYmFzZWQgb24gd2hldGhlciB0aGUNCiAgICA7IHBhcmFtZXRlciBcImxhbmd1YWdlXCIgaXMgc2V0IHRvIFwiZW5cIiwgXCJlc1wiIG9yIHNvbWV0aGluZyBlbHNlLg0KICAgIChjb25kcCA9IGxhbmd1YWdlDQogICAgICBcImVuXCIgKHN0ciBcIkdvb2RieWUsIFwiIG5hbWUpDQogICAgICBcImVzXCIgKHN0ciBcIkFkaW9zLCBcIiBuYW1lKQ0KICAgICAgKHRocm93IChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uDQogICAgICAgIChzdHIgXCJ1bnN1cHBvcnRlZCBsYW5ndWFnZSBcIiBsYW5ndWFnZSkpKSkpKQ0KDQoocHJpbnRsbiAocGFydGluZykpIDsgLT4gR29vZGJ5ZSwgV29ybGQNCihwcmludGxuIChwYXJ0aW5nIFwiTWFya1wiKSkgOyAtPiBHb29kYnllLCBNYXJrDQoocHJpbnRsbiAocGFydGluZyBcIk1hcmtcIiBcImVzXCIpKSA7IC0+IEFkaW9zLCBNYXJrDQoocHJpbnRsbiAocGFydGluZyBcIk1hcmtcIiwgXCJ4eVwiKSkgOyAtPiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOiB1bnN1cHBvcnRlZCBsYW5ndWFnZSB4eSAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdvY2FtbCcgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KKCoNCiAqIEV4YW1wbGUgb2YgZWFybHkgcmV0dXJuIGltcGxlbWVudGF0aW9uIHRha2VuIGZyb20NCiAqIGh0dHA6Ly9vY2FtbC5qYW5lc3RyZWV0LmNvbS8/cT1ub2RlLzkxDQogKikNCg0KbGV0IHdpdGhfcmV0dXJuICh0eXBlIHQpIChmIDogXyAtPiB0KSA9DQogIGxldCBtb2R1bGUgTSA9DQogICAgIHN0cnVjdCBleGNlcHRpb24gUmV0dXJuIG9mIHQgZW5kDQogIGluDQogIGxldCByZXR1cm4gPSB7IHJldHVybiA9IChmdW4geCAtPiByYWlzZSAoTS5SZXR1cm4geCkpOyB9IGluDQogIHRyeSBmIHJldHVybiB3aXRoIE0uUmV0dXJuIHggLT4geA0KDQoNCigqIEZ1bmN0aW9uIHRoYXQgdXNlcyB0aGUgJ2Vhcmx5IHJldHVybicgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSBgd2l0aF9yZXR1cm5gICopDQpsZXQgc3VtX3VudGlsX2ZpcnN0X25lZ2F0aXZlIGxpc3QgPQ0KICB3aXRoX3JldHVybiAoZnVuIHIgLT4NCiAgICBMaXN0LmZvbGQgbGlzdCB+aW5pdDowIH5mOihmdW4gYWNjIHggLT4NCiAgICAgIGlmIHggPj0gMCB0aGVuIGFjYyArIHggZWxzZSByLnJldHVybiBhY2MpKSAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAndGV4dGlsZScgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KaDEuIFRleHRpbGUgZG9jdW1lbnQNCg0KaDIuIEhlYWRpbmcgVHdvDQoNCmgzLiBBIHR3by1saW5lDQogICAgaGVhZGVyDQoNCmgyLiBBbm90aGVyIHR3by1saW5lDQpoZWFkZXINCg0KUGFyYWdyYXBoOg0Kb25lLCB0d28sDQp0aGVlIGxpbmVzIQ0KDQpwKGNsYXNzb25lIHR3byB0aHJlZSkuIFRoaXMgaXMgYSBwYXJhZ3JhcGggd2l0aCBjbGFzc2VzDQoNCnAoI2lkKS4gKG9uZSB3aXRoIGFuIGlkKQ0KDQpwKG9uZSB0d28gdGhyZWUjbXlfaWQpLiAuLmNsYXNzZXMgKyBpZA0KDQoqIFVub3JkZXJlZCBsaXN0DQoqKiBzdWJsaXN0DQoqIGJhY2sgYWdhaW4hDQoqKiBzdWJsaXN0IGFnYWluLi4NCg0KIyBvcmRlcmVkDQoNCmJnLiBCbG9ja3F1b3RlIQ0KICAgIFRoaXMgaXMgYSB0d28tbGlzdCBibG9ja3F1b3RlLi4hICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdncm9vdnknIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCg0KLy9odHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy9Db25jdXJyZW5jeSt3aXRoK0dyb292eQ0KaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyDQoNCmRlZiBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoKQ0KDQpzeW5jaHJvbml6ZWQgb3V0KG1lc3NhZ2UpIHsNCiAgICBwcmludGxuKG1lc3NhZ2UpDQp9DQoNCmRlZiB0aCA9IFRocmVhZC5zdGFydCB7DQogICAgZm9yKCBpIGluIDEuLjggKSB7DQogICAgICAgIHNsZWVwIDMwDQogICAgICAgIG91dCBcInRocmVhZCBsb29wIFwkaVwiDQogICAgICAgIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCkNCiAgICB9DQp9DQoNCmZvciggaiBpbiAxLi40ICkgew0KICAgIHNsZWVwIDUwDQogICAgb3V0IFwibWFpbiBsb29wIFwkalwiDQogICAgY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKQ0KfQ0KDQp0aC5qb2luKCkNCg0KYXNzZXJ0IGNvdW50ZXIuZ2V0KCkgPT0gMTINCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAnc2NhbGEnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCi8vaHR0cDovL3d3dy5zY2FsYS1sYW5nLm9yZy9ub2RlLzIyNw0KLyogRGVmaW5lcyBhIG5ldyBtZXRob2QgJ3NvcnQnIGZvciBhcnJheSBvYmplY3RzICovDQpvYmplY3QgaW1wbGljaXRzIGV4dGVuZHMgQXBwbGljYXRpb24gew0KICBpbXBsaWNpdCBkZWYgYXJyYXlXcmFwcGVyW0EgOiBDbGFzc01hbmlmZXN0XSh4OiBBcnJheVtBXSkgPQ0KICAgIG5ldyB7DQogICAgICBkZWYgc29ydChwOiAoQSwgQSkgPT4gQm9vbGVhbikgPSB7DQogICAgICAgIHV0aWwuU29ydGluZy5zdGFibGVTb3J0KHgsIHApOyB4DQogICAgICB9DQogICAgfQ0KICB2YWwgeCA9IEFycmF5KDIsIDMsIDEsIDQpDQogIHByaW50bG4oXCJ4ID0gXCIrIHguc29ydCgoeDogSW50LCB5OiBJbnQpID0+IHggPCB5KSkNCn0gICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIGNhc2UgJ2NvbGRmdXNpb24nIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCjwhLS0tIGhlbGxvIHdvcmxkIC0tLT4NCg0KPGNmc2V0IHdlbGNvbWU9XCJIZWxsbyBXb3JsZCFcIj4NCg0KPGNmb3V0cHV0PiN3ZWxjb21lIzwvY2ZvdXRwdXQ+ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdsdWEnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCi0tW1stLQ0KbnVtX2FyZ3MgdGFrZXMgaW4gNS4xIGJ5dGUgY29kZSBhbmQgZXh0cmFjdHMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMNCmZyb20gaXRzIGZ1bmN0aW9uIGhlYWRlci4NCi0tXV0tLQ0KDQpmdW5jdGlvbiBpbnQodCkNCiAgICByZXR1cm4gdDpieXRlKDEpK3Q6Ynl0ZSgyKSoweDEwMCt0OmJ5dGUoMykqMHgxMDAwMCt0OmJ5dGUoNCkqMHgxMDAwMDAwDQplbmQNCg0KZnVuY3Rpb24gbnVtX2FyZ3MoZnVuYykNCiAgICBsb2NhbCBkdW1wID0gc3RyaW5nLmR1bXAoZnVuYykNCiAgICBsb2NhbCBvZmZzZXQsIGN1cnNvciA9IGludChkdW1wOnN1YigxMykpLCBvZmZzZXQgKyAyNg0KICAgIC0tR2V0IHRoZSBwYXJhbXMgYW5kIHZhciBmbGFnICh3aGV0aGVyIHRoZXJlJ3MgYSAuLi4gaW4gdGhlIHBhcmFtKQ0KICAgIHJldHVybiBkdW1wOnN1YihjdXJzb3IpOmJ5dGUoKSwgZHVtcDpzdWIoY3Vyc29yKzEpOmJ5dGUoKQ0KZW5kDQoNCi0tIFVzYWdlOg0KbnVtX2FyZ3MoZnVuY3Rpb24oYSxiLGMsZCwgLi4uKSBlbmQpIC0tIHJldHVybiA0LCA3DQoNCi0tIFB5dGhvbiBzdHlsZWQgc3RyaW5nIGZvcm1hdCBvcGVyYXRvcg0KbG9jYWwgZ20gPSBkZWJ1Zy5nZXRtZXRhdGFibGUoXCJcIikNCg0KZ20uX19tb2Q9ZnVuY3Rpb24oc2VsZiwgb3RoZXIpDQogICAgaWYgdHlwZShvdGhlcikgfj0gXCJ0YWJsZVwiIHRoZW4gb3RoZXIgPSB7b3RoZXJ9IGVuZA0KICAgIGZvciBpLHYgaW4gaXBhaXJzKG90aGVyKSBkbyBvdGhlcltpXSA9IHRvc3RyaW5nKHYpIGVuZA0KICAgIHJldHVybiBzZWxmOmZvcm1hdCh1bnBhY2sob3RoZXIpKQ0KZW5kDQoNCnByaW50KFs9PT1bDQogICAgYmxhaCBibGFoICVzLCAoJWQgJWQpDQpdPT09XSV7XCJibGFoXCIsIG51bV9hcmdzKGludCl9KQ0KDQotLVs9Wy0tDQp0YWJsZS5tYXhuIGlzIGRlcHJlY2F0ZWQsIHVzZSAjIGluc3RlYWQuDQotLV09XS0tDQpwcmludCh0YWJsZS5tYXhuezEsMixbNF09NCxbOF09OCkgLS0gb3V0cHV0cyA4IGluc3RlYWQgb2YgMiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAnaGF4ZScgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KY2xhc3MgSGF4ZSANCnsNCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1haW4oKSANCiAgICB7DQogICAgICAgIC8vIFNheSBIZWxsbyENCiAgICAgICAgdmFyIGdyZWV0aW5nOlN0cmluZyA9IFwiSGVsbG8gV29ybGRcIjsNCiAgICAgICAgdHJhY2UoZ3JlZXRpbmcpOw0KICAgICAgICANCiAgICAgICAgdmFyIHRhcmdldHM6QXJyYXk8U3RyaW5nPiA9IFtcIkZsYXNoXCIsXCJKYXZhc2NyaXB0XCIsXCJQSFBcIixcIk5la29cIixcIkMrK1wiLFwiaU9TXCIsXCJBbmRyb2lkXCIsXCJ3ZWJPU1wiXTsNCiAgICAgICAgdHJhY2UoXCJIYXhlIGlzIGEgZ3JlYXQgbGFuZ3VhZ2UgdGhhdCBjYW4gdGFyZ2V0OlwiKTsNCiAgICAgICAgZm9yICh0YXJnZXQgaW4gdGFyZ2V0cykNCiAgICAgICAgew0KICAgICAgICAgICAgdHJhY2UgKFwiIC0gXCIgKyB0YXJnZXQpOw0KICAgICAgICB9DQogICAgICAgIHRyYWNlKFwiQW5kIG1hbnkgbW9yZSFcIik7DQogICAgfQ0KfSAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOyAgICANCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhc2UgJ21hcmtkb3duJyA6IHsNCiAgICAgICAgICAgICAgICAkc3ludGF4X2NvbnRlbnQgPSAiDQpBY2UgKEFqYXgub3JnIENsb3VkOSBFZGl0b3IpDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCkFjZSBpcyBhIHN0YW5kYWxvbmUgY29kZSBlZGl0b3Igd3JpdHRlbiBpbiBKYXZhU2NyaXB0LiBPdXIgZ29hbCBpcyB0byBjcmVhdGUgYSBicm93c2VyIGJhc2VkIGVkaXRvciB0aGF0IG1hdGNoZXMgYW5kIGV4dGVuZHMgdGhlIGZlYXR1cmVzLCB1c2FiaWxpdHkgYW5kIHBlcmZvcm1hbmNlIG9mIGV4aXN0aW5nIG5hdGl2ZSBlZGl0b3JzIHN1Y2ggYXMgVGV4dE1hdGUsIFZpbSBvciBFY2xpcHNlLiBJdCBjYW4gYmUgZWFzaWx5IGVtYmVkZGVkIGluIGFueSB3ZWIgcGFnZSBvciBKYXZhU2NyaXB0IGFwcGxpY2F0aW9uLiBBY2UgaXMgZGV2ZWxvcGVkIGFzIHRoZSBwcmltYXJ5IGVkaXRvciBmb3IgW0Nsb3VkOSBJREVdKGh0dHA6Ly93d3cuY2xvdWQ5aWRlLmNvbS8pIGFuZCB0aGUgc3VjY2Vzc29yIG9mIHRoZSBNb3ppbGxhIFNreXdyaXRlciAoQmVzcGluKSBQcm9qZWN0Lg0KDQpGZWF0dXJlcw0KLS0tLS0tLS0NCg0KKiBTeW50YXggaGlnaGxpZ2h0aW5nDQoqIEF1dG9tYXRpYyBpbmRlbnQgYW5kIG91dGRlbnQNCiogQW4gb3B0aW9uYWwgY29tbWFuZCBsaW5lDQoqIEhhbmRsZXMgaHVnZSBkb2N1bWVudHMgKDEwMCwwMDAgbGluZXMgYW5kIG1vcmUgYXJlIG5vIHByb2JsZW0pDQoqIEZ1bGx5IGN1c3RvbWl6YWJsZSBrZXkgYmluZGluZ3MgaW5jbHVkaW5nIFZJIGFuZCBFbWFjcyBtb2Rlcw0KKiBUaGVtZXMgKFRleHRNYXRlIHRoZW1lcyBjYW4gYmUgaW1wb3J0ZWQpDQoqIFNlYXJjaCBhbmQgcmVwbGFjZSB3aXRoIHJlZ3VsYXIgZXhwcmVzc2lvbnMNCiogSGlnaGxpZ2h0IG1hdGNoaW5nIHBhcmVudGhlc2VzDQoqIFRvZ2dsZSBiZXR3ZWVuIHNvZnQgdGFicyBhbmQgcmVhbCB0YWJzDQoqIERpc3BsYXlzIGhpZGRlbiBjaGFyYWN0ZXJzDQoqIERyYWcgYW5kIGRyb3AgdGV4dCB1c2luZyB0aGUgbW91c2UNCiogTGluZSB3cmFwcGluZw0KKiBVbnN0cnVjdHVyZWQgLyB1c2VyIGNvZGUgZm9sZGluZw0KKiBMaXZlIHN5bnRheCBjaGVja2VyIChjdXJyZW50bHkgSmF2YVNjcmlwdC9Db2ZmZWVTY3JpcHQpICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdzcWwnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINClNFTEVDVCBjaXR5LCBDT1VOVChpZCkgQVMgdXNlcnNfY291bnQNCkZST00gdXNlcnMNCldIRVJFIGdyb3VwX25hbWUgPSBcJ3NhbGVzbWFuXCcNCkFORCBjcmVhdGVkID4gXCcyMDExLTA1LTIxXCcNCkdST1VQIEJZIDENCk9SREVSIEJZIDIgREVTQyAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAncGdzcWwnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCkJFR0lOOw0KDQovKioNCiogU2FtcGxlcyBmcm9tIFBvc3RncmVTUUwgc3JjL3R1dG9yaWFsL2Jhc2ljcy5zb3VyY2UNCiovDQpDUkVBVEUgVEFCTEUgd2VhdGhlciAoDQogICAgY2l0eSAgICAgICAgdmFyY2hhcig4MCksDQogICAgdGVtcF9sbyAgICAgaW50LCAgICAgICAgLS0gbG93IHRlbXBlcmF0dXJlDQogICAgdGVtcF9oaSAgICAgaW50LCAgICAgICAgLS0gaGlnaCB0ZW1wZXJhdHVyZQ0KICAgIHByY3AgICAgICAgIHJlYWwsICAgICAgIC0tIHByZWNpcGl0YXRpb24NCiAgICBcImRhdGVcIiAgICAgIGRhdGUNCik7ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0gICANCiAgICAgICAgDQogICAgICAgIC8qIGNyZWF0ZSB0ZXN0IHRleHRhcmVhICovDQogICAgICAgICRzbWFydHktPmFzc2lnbigndGVzdGFyZWF0ZXh0JywgJHRoaXMtPkxhbmcoJ3Rlc3RhcmVhdGV4dCcpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCd0ZXN0YXJlYScsICR0aGlzLT5DcmVhdGVUZXh0QXJlYShmYWxzZSwkaWQsJHN5bnRheF9jb250ZW50LCd0ZXN0YXJlYScsJycsJycsJycsJycsJycsJycsJ0FjZUVkaXRvcicsY21zX3VzZXJwcmVmczo6Z2V0X2Zvcl91c2VyKCR1c2VyaWQsDQogICAgICAgICdtb2RlJywNCiAgICAgICAgJ3RoZW1lJywNCiAgICAgICAgJ2ZvbnRzaXplJywNCiAgICAgICAgJ2Z1bGxfbGluZScsDQogICAgICAgICdoaWdobGlnaHRfYWN0aXZlJywNCiAgICAgICAgJ3Nob3dfaW52aXNpYmxlcycsDQogICAgICAgICdwZXJzaXN0ZW5faHNjcm9sbCcsDQogICAgICAgICdrZXliaW5kaW5nJywNCiAgICAgICAgJ3NvZnRfd3JhcCcsDQogICAgICAgICdzaG93X2d1dHRlcicsDQogICAgICAgICdwcmludF9tYXJnaW4nLA0KICAgICAgICAnc29mdF90YWInLA0KICAgICAgICAnaGlnaGxpZ2h0X3NlbGVjdGVkJywNCiAgICAgICAgJ2VuYWJsZV9iZWhhdmlvcnMnDQogICAgICAgICkpKTsNCiAgICAgICAgDQogICAgLyogUHJvY2Vzc1RlbXBhbHRlICovDQogICAgZWNobyAkdGhpcyAtPiBQcm9jZXNzVGVtcGxhdGUoJ3NldHRpbmdzLnRwbCcpOw0KDQo/Pg==]]></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[alF1ZXJ5KGZ1bmN0aW9uKCkgew0KCWpRdWVyeSgiLnBhZ2VtY29udGFpbmVyLC5wYWdlZXJyb3Jjb250YWluZXIiKS5lYWNoKGZ1bmN0aW9uKCkgew0KCQl2YXIgYyA9IGpRdWVyeSh0aGlzKTsNCgkJd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQoJCQljLmhpZGUoKTsNCgkJfSwgOTAwMCk7DQoJfSk7DQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiRsYW5nWydmcmllbmRseW5hbWUnXT0iQWNlRWRpdG9yIjsNCiRsYW5nWydhZG1pbmRlc2NyaXB0aW9uJ10gPSAiQWNlRWRpdG9yIGlzIGEgU3ludGF4aGlnaGxpZ2h0ZXIgbW9kdWxlIHVzaW5nIDxzdHJvbmc+QWNlPC9zdHJvbmc+IGEgc3RhbmRhbG9uZSBjb2RlIGVkaXRvciB3cml0dGVuIGluIEphdmFTY3JpcHQuIjsNCg0KDQovKiAtLS0gVGFicyAtLS0gKi8NCiRsYW5nWydzZXR0aW5nc190YWInXSA9ICJQcmVmZXJlbmNlcyI7DQokbGFuZ1snZnJvbnRlbmRzZXR0aW5nc190YWInXSA9ICJGcm9udGVuZCBQcmVmZXJlbmNlcyI7DQokbGFuZ1snZnJvbnRlbmRfaGVhZF9zZXR0aW5ncyddID0gIkZyb250ZW5kIEhlYWQgUHJlZmVyZW5jZXMiOw0KJGxhbmdbJ2Zyb250ZW5kX3N5bnRheGFyZWFfc2V0dGluZ3MnXSA9ICJGcm9udGVuZCBTeW50YXhhcmVhIFByZWZlcmVuY2VzIjsNCiRsYW5nWydoZWFkX2Rlc2NyaXB0aW9uJ10gPSAiVGhlc2UgcHJlZmVyZW5jZXMgYXJlIHVzZWQgZm9yIGRlZmF1bHQgc2V0dGluZ3Mgb2YgQWNlIHNjcmlwdHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gcGFnZSA8Y29kZT4mbHQ7aGVhZCZndDs8L2NvZGU+IHdoZW4gY2FsbGluZyA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0naGVhZCd9PC9jb2RlPiBmcm9tIFBhZ2UgU3BlY2lmaWMgTWV0YWRhdGEgb3IgVGVtcGxhdGUuIjsNCiRsYW5nWydjb250ZW50X2Rlc2NyaXB0aW9uJ10gPSAiVGhlc2UgcHJlZmVyZW5jZXMgYXJlIHVzZWQgZm9yIGRlZmF1bHQgc2V0dGluZ3Mgb2YgU3ludGF4aGlnaGxpZ2h0aW5nIGFyZWEgd2hlbiBjYWxsaW5nIDxjb2RlPntBY2VFZGl0b3IgZGl2aWQ9J2VkaXRvcid9PC9jb2RlPiB0YWcgd2l0aGluIGEgUGFnZS4iOw0KJGxhbmdbJ3N5bnRheGFyZWFkZXNjcmlwdGlvbiddID0gIlRoZXNlIHByZWZlcmVuY2VzIGFyZSB1c2VkIGZvciBkZWZhdWx0IHNldHRpbmdzIG9mIEFjZSBiZWhhdmlvciB3aGVuIGNhbGxpbmcgPGNvZGU+e0FjZUVkaXRvciBkaXZpZD0nZm9vJ308L2NvZGU+IGZyb20gYSBQYWdlIG9yIFRlbXBsYXRlIjsNCg0KLyogLS0tIFNldHRpbmdzIGxhYmVscyAtLS0gKi8NCiRsYW5nWydleGFtcGxlX2RvY3VtZW50J10gPSAiRG9jdW1lbnQiOw0KJGxhbmdbJ3dpZHRoX3RpdGxlJ10gPSAiRWRpdG9yIHdpZHRoIChpbiBlbSkiOw0KJGxhbmdbJ2hlaWdodF90aXRsZSddID0gIkVkaXRvciBoZWlnaHQgKGluIGVtKSI7DQokbGFuZ1snZW5hYmxlX2llJ10gPSAiRW5hYmxlIEludGVybmV0IEV4cGxvcmVyIjsNCiRsYW5nWyd1c2VfdW5jb21wcmVzc2VkJ10gPSAiVXNlIHVuY29tcHJlc3NlZCI7DQokbGFuZ1sndXNlX3VuY29tcHJlc3NlZF90ZXh0J10gPSAnTWlnaHQgaGVscCBpZiB5b3UgaGF2ZSBwcm9ibGVtcyB1c2luZyBpbiBTYWZhcmkuJzsNCiRsYW5nWydlbmFibGVfaWVkZXNjcmlwdGlvbiddID0gIkFjZSBTeW50YXhoaWdobGlnaHRlciBkb2VzIG5vdCBiZWhhdmUgcHJvcGVybHkgd2hlbiB1c2luZyBJbnRlcm5ldCBFeHBsb3Jlci4gRW5hYmxlIHRoaXMgYXQgeW91ciBvd24gcmlzayEiOw0KJGxhbmdbJ2Zyb250ZW5kX3dpZHRoX3RpdGxlJ10gPSAiRnJvbnRlbmQgU3ludGF4YXJlYSB3aWR0aCAoaW4gcHgpIjsNCiRsYW5nWydmcm9udGVuZF9oZWlnaHRfdGl0bGUnXSA9ICJGcm9udGVuZCBTeW50YXhhcmVhIGhlaWdodCAoaW4gcHgpIjsNCiRsYW5nWydzeW50YXhfbW9kZSddID0gIk1vZGUiOw0KJGxhbmdbJ3RoZW1lcyddID0gIlRoZW1lIjsNCiRsYW5nWydmb250X3NpemUnXSA9ICJGb250IFNpemUiOw0KJGxhbmdbJ2Z1bGxfbGluZSddID0gIkZ1bGwgTGluZSBTZWxlY3Rpb24iOw0KJGxhbmdbJ2hpZ2hsaWdodF9hY3RpdmUnXSA9ICJIaWdobGlnaHQgQWN0aXZlIExpbmUiOw0KJGxhbmdbJ3Nob3dfaW52aXNpYmxlcyddID0gIlNob3cgSW52aXNpYmxlcyI7DQokbGFuZ1sncGVyc2lzdGVudF9oc2Nyb2xsJ10gPSAiUGVyc2l0ZW50IEhTY3JvbGwiOw0KJGxhbmdbJ2tleV9iaW5kaW5nJ10gPSAiS2V5IEJpbmRpbmciOw0KJGxhbmdbJ3NvZnRfd3JhcCddID0gIlNvZnQgV3JhcCI7DQokbGFuZ1snc2hvd19ndXR0ZXInXSA9ICJTaG93IEd1dHRlciI7DQokbGFuZ1sncHJpbnRfbWFyZ2luJ10gPSAiU2hvdyBQcmludCBNYXJnaW4iOw0KJGxhbmdbJ3NvZnRfdGFiJ10gPSAiVXNlIFNvZnQgVGFiIjsNCiRsYW5nWydoaWdobGlnaHRfc2VsZWN0ZWQnXSA9ICJIaWdobGlnaHQgc2VsZWN0ZWQgd29yZCI7DQokbGFuZ1snZW5hYmxlX2JlaGF2aW9ycyddID0gIkVuYWJsZSBCZWhhdmlvcnMiOw0KJGxhbmdbJ3Rlc3RhcmVhdGV4dCddID0gIlByZXZpZXciOw0KDQovKiAtLS0gU2VsZWN0IG9wdGlvbnMgLS0tICovDQoNCi8qIGxhbmd1YWdlcyAqLw0KJGxhbmdbJ2pzJ10gPSAiSmF2YVNjcmlwdCI7DQokbGFuZ1sncGxhaW4nXSA9ICJQbGFpbiBUZXh0IjsNCiRsYW5nWydzdmcnXSA9ICJTVkciOw0KJGxhbmdbJ2h0bWwnXSA9ICJIVE1MIjsNCiRsYW5nWydjc3MnXSA9ICJDU1MiOw0KJGxhbmdbJ3Njc3MnXSA9ICJTQ1NTIjsNCiRsYW5nWydjb2ZmZWUnXSA9ICJDb2ZmZWVTY3JpcHQiOw0KJGxhbmdbJ2pzb24nXSA9ICJKU09OIjsNCiRsYW5nWydweXRob24nXSA9ICJQeXRob24iOw0KJGxhbmdbJ3J1YnknXSA9ICJSdWJ5IjsNCiRsYW5nWydwZXJsJ10gPSAiUGVybCI7DQokbGFuZ1sncGhwJ10gPSAiUEhQIjsNCiRsYW5nWydqYXZhJ10gPSAiSmF2YSI7DQokbGFuZ1snY3NoYXJwJ10gPSAiQyMiOw0KJGxhbmdbJ2NfY3BwJ10gPSAiQysrIjsNCiRsYW5nWydjbG9qdXJlJ10gPSAiQ2xvanVyZSI7DQokbGFuZ1snY29sZGZ1c2lvbiddID0gIkNvbGRmdXNpb24iOw0KJGxhbmdbJ2hheGUnXSA9ICJIYXhlIjsNCiRsYW5nWydsYXRleCddID0gIkxhdGV4IjsNCiRsYW5nWydsdWEnXSA9ICJMdWEiOw0KJGxhbmdbJ21hcmtkb3duJ10gPSAiTWFya2Rvd24iOw0KJGxhbmdbJ3Bvd2Vyc2hlbGwnXSA9ICJQb3dlclNoZWxsIjsNCiRsYW5nWydzcWwnXSA9ICJTUUwiOw0KJGxhbmdbJ3Bnc3FsJ10gPSAicGdTUUwiOw0KJGxhbmdbJ29jYW1sJ10gPSAiT0NhbWwiOw0KJGxhbmdbJ3RleHRpbGUnXSA9ICJUZXh0aWxlIjsNCiRsYW5nWydncm9vdnknXSA9ICJHcm9vdnkiOw0KJGxhbmdbJ3NjYWxhJ10gPSAiU2NhbGEiOw0KDQovKiB0aGVtZXMgKi8NCiRsYW5nWydjbG91ZHMnXSA9ICJDbG91ZHMiOyANCiRsYW5nWydjaHJvbWUnXSA9ICJDaHJvbWUiOyANCiRsYW5nWydjbG91ZHNfbWlkbmlnaHQnXSA9ICJDbG91ZHMgTWlkbmlnaHQiOyANCiRsYW5nWydjb2JhbHQnXSA9ICJDb2JhbHQiOyANCiRsYW5nWydjcmltc29uX2VkaXRvciddID0gIkNyaW1zb24gRWRpdG9yIjsNCiRsYW5nWydkYXduJ10gPSAiRGF3biI7DQokbGFuZ1snZHJlYW13ZWF2ZXInXSA9ICJEcmVhbXdlYXZlciI7IA0KJGxhbmdbJ2VjbGlwc2UnXSA9ICJFY2xpcHNlIjsNCiRsYW5nWydpZGxlX2ZpbmdlcnMnXSA9ICJpZGxlRmluZ2VycyI7DQokbGFuZ1sna3JfdGhlbWUnXSA9ICJrclRoZW1lIjsNCiRsYW5nWydtZXJiaXZvcmUnXSA9ICJNZXJiaXZvcmUiOw0KJGxhbmdbJ21lcmJpdm9yZV9zb2Z0J10gPSAiTWVyYml2b3JlIFNvZnQiOw0KJGxhbmdbJ21vbm9faW5kdXN0cmlhbCddID0gIk1vbm8gSW5kdXN0cmlhbCI7DQokbGFuZ1snbW9ub2thaSddID0gIk1vbm9rYWkiOw0KJGxhbmdbJ3Bhc3RlbF9vbl9kYXJrJ10gPSAiUGFzdGVsIG9uIGRhcmsiOw0KJGxhbmdbJ3NvbGFyaXplZF9kYXJrJ10gPSAiU29sYXJpemVkIERhcmsiOw0KJGxhbmdbJ3NvbGFyaXplZF9saWdodCddID0gIlNvbGFyaXplZCBMaWdodCI7DQokbGFuZ1sndGV4dG1hdGUnXSA9ICJUZXh0TWF0ZSI7DQokbGFuZ1sndG9tb3Jyb3cnXSA9ICJUb21vcnJvdyI7DQokbGFuZ1sndG9tb3Jyb3dfbmlnaHQnXSA9ICJUb21vcnJvdyBOaWdodCI7DQokbGFuZ1sndG9tb3Jyb3dfbmlnaHRfYnJpZ2h0J10gPSAiVG9tb3Jyb3cgTmlnaHQgQnJpZ2h0IjsNCiRsYW5nWyd0b21vcnJvd19uaWdodF9ibHVlJ10gPSAiVG9tb3Jyb3cgTmlnaHQgQmx1ZSI7DQokbGFuZ1sndG9tb3Jyb3dfbmlnaHRfZWlnaHRpZXMnXSA9ICJUb21vcnJvdyBOaWdodCBFaWdodGllcyI7DQokbGFuZ1sndHdpbGlnaHQnXSA9ICJUd2lsaWdodCI7DQokbGFuZ1sndmlicmFudF9pbmsnXSA9ICJWaWJyYW50IEluayI7DQoNCi8qIGtleSBiaW5kaW5nICovDQokbGFuZ1snYWNlJ10gPSAiQWNlIjsgDQokbGFuZ1sndmltJ10gPSAiVmltIjsgDQokbGFuZ1snY29iYWx0J10gPSAiQ29iYWx0IjsgDQokbGFuZ1snZW1hY3MnXSA9ICJFTWFjcyI7DQokbGFuZ1snY3VzdG9tJ10gPSAiQ3VzdG9tIjsNCg0KLyogU29mdCB3cmFwICovDQokbGFuZ1snb2ZmJ10gPSAiT2ZmIjsgDQokbGFuZ1snNDAnXSA9ICI0MCBDaGFycyI7IA0KJGxhbmdbJzgwJ10gPSAiODAgQ2hhcnMiOyANCiRsYW5nWycxMDAnXSA9ICIxMDAgQ2hhcnMiOyANCiRsYW5nWycxNDAnXSA9ICIxNDAgQ2hhcnMiOyANCg0KLyogLS0tIENvbW1vbiAtLS0gKi8NCiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICJTYXZlIFByZWZlcmVuY2VzIjsNCiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAiWW91ciBBY2VFZGl0b3Igc2V0dGluZ3MgaGF2ZSBiZWVuIHNhdmVkIjsNCiRsYW5nWydmcm9udGVuZHNldHRpbmdzc2F2ZWQnXSA9ICJZb3VyIEFjZUVkaXRvciBGcm9udGVuZCBzZXR0aW5ncyBoYXZlIGJlZW4gc2F2ZWQiOw0KJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAiQWNlRWRpdG9yIFN1Y2Nlc3NmdWxseSBJbnN0YWxsZWQhIFNldCBcIk1vZGlmeSBTaXRlIFByZWZlcmVuY2VzXCIsIFwiTW9kaWZ5IFRlbXBsYXRlc1wiIG9yIFwiQWNlRWRpdG9yIFVzZXIgUHJlZmVyZW5jZVwiIHBlcm1pc3Npb25zIHRvIHVzZSB0aGlzIG1vZHVsZSEgSWYgeW91J3JlIHN1cmZpbmcgd2l0aCBTYWZhcmksIHNldCB0aGUgb3B0aW9uIFwiVXNlIHVuY29tcHJlc3NlZFwiLiI7DQokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gIkFjZUVkaXRvciBTdWNjZXNzZnVsbHkgVW5pbnN0YWxsZWQiOw0KJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICJSZWFsbHk/IEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byB1bmluc3RhbGwgQWNlRWRpdG9yPyBUaGluayBhZ2FpbiEiOw0KJGxhbmdbJ25lZWRwZXJtaXNzaW9uJ10gPSAiTWlzc2luZyBQZXJtaXNzaW9uIS4gU2V0IFwiTW9kaWZ5IFRlbXBsYXRlc1wiIG9yIFwiQWNlRWRpdG9yIFVzZXIgUHJlZmVyZW5jZVwiIHBlcm1pc3Npb25zIHRvIHVzZSB0aGlzIG1vZHVsZS4iOw0KDQovKiAtLS0gSGVscCAtLS0gKi8NCiRsYW5nWydoZWxwX3BhcmFtX2FjdGlvbiddID0gImlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhY3Rpb24gb2YgTW9kdWxlIHRhZy4gUG9zc2libGUgdmFsdWVzIGFyZSAnZGVmYXVsdCcgYW5kICdoZWFkJy4gQm90aCBhcmUgbmVlZGVkIGZvciBjb3JyZWN0IEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGluZyBmdW5jdGlvbi4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+aGVhZDwvbGk+DQoJPGxpPmRlZmF1bHQ8L2xpPg0KPC91bD4iOw0KJGxhbmdbJ2hlbHBfcGFyYW1fbW9kZXMnXSA9ICJpcyB1c2VkIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249J2hlYWQnfTwvY29kZT4uIFlvdSBjYW4gaW5jbHVkZSBtdWx0aXBsZSBjb21tYSBzZXBhcmF0ZWQgJ21vZGVzJyB0aGF0IHlvdSB3aWxsIGJlIHVzaW5nIG9uIHlvdXIgd2Vic2l0ZS4gVGhpcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4geW91ciAmbHQ7aGVhZCZndDsgb2YgVGVtcGxhdGUgb3IgUGFnZSBzcGVjaWZpYyBNZXRhZGF0YS4gVGhpcyB3aWxsIG92ZXJyaWRlIHlvdSBQcmVmZXJlbmNlcyBzZWxlY3RlZCBpbiBNb2R1bGUgQWRtaW4gYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+amF2YXNjcmlwdDwvbGk+IA0KCTxsaT5wbGFpbjwvbGk+IA0KCTxsaT5zdmc8L2xpPiANCgk8bGk+aHRtbDwvbGk+DQoJPGxpPmNzczwvbGk+DQoJPGxpPnNjc3M8L2xpPg0KCTxsaT5jb2ZmZWU8L2xpPg0KCTxsaT5qc29uPC9saT4NCgk8bGk+cHl0aG9uPC9saT4NCgk8bGk+cnVieTwvbGk+DQoJPGxpPnBlcmw8L2xpPg0KCTxsaT5waHA8L2xpPg0KCTxsaT5qYXZhPC9saT4NCgk8bGk+Y3NoYXJwPC9saT4NCgk8bGk+Y19jcHA8L2xpPg0KCTxsaT5jbG9qdXJlPC9saT4NCgk8bGk+b2NhbWw8L2xpPg0KCTxsaT50ZXh0aWxlPC9saT4NCgk8bGk+Z3Jvb3Z5PC9saT4NCgk8bGk+c2NhbGE8L2xpPg0KPC91bD4iOw0KJGxhbmdbJ2hlbHBfcGFyYW1fdGhlbWVzJ10gPSAiaXMgdXNlZCB3aXRoIDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSdoZWFkJ308L2NvZGU+LiBZb3UgY2FuIGluY2x1ZGUgbXVsdGlwbGUgY29tbWEgc2VwYXJhdGVkICd0aGVtZXMnIHRoYXQgeW91IHdpbGwgYmUgdXNpbmcgb24geW91ciB3ZWJzaXRlLiBUaGlzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB5b3VyICZsdDtoZWFkJmd0OyBvZiBUZW1wbGF0ZSBvciBQYWdlIHNwZWNpZmljIE1ldGFkYXRhLiBUaGlzIHdpbGwgb3ZlcnJpZGUgeW91IFByZWZlcmVuY2VzIHNlbGVjdGVkIGluIE1vZHVsZSBBZG1pbiBhcmVhLiA8YnIgLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlOg0KPHVsPg0KCTxsaT5jbG91ZHM8L2xpPiANCgk8bGk+Y2xvdWRzX21pZG5pZ2h0PC9saT4gDQoJPGxpPmNvYmFsdDwvbGk+IA0KCTxsaT5jcmltc29uX2VkaXRvcjwvbGk+DQoJPGxpPmRhd248L2xpPg0KCTxsaT5lY2xpcHNlPC9saT4NCgk8bGk+aWRsZV9maW5nZXJzPC9saT4NCgk8bGk+a3JfdGhlbWU8L2xpPg0KCTxsaT5tZXJiaXZvcmU8L2xpPg0KCTxsaT5tZXJiaXZvcmVfc29mdDwvbGk+DQoJPGxpPm1vbm9faW5kdXN0cmlhbDwvbGk+DQoJPGxpPm1vbm9rYWk8L2xpPg0KCTxsaT5wYXN0ZWxfb25fZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2xpZ2h0PC9saT4NCgk8bGk+dGV4dG1hdGU8L2xpPg0KCTxsaT50d2lsaWdodDwvbGk+DQoJPGxpPnZpYnJhbnRfaW5rPC9saT4NCjwvdWw+IjsNCiRsYW5nWydoZWxwX3BhcmFtX21vZGUnXSA9ICJpcyB1c2VkIHdpdGhpbiBhIHBhZ2Ugd2l0aCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0nZGVmYXVsdCd9PC9jb2RlPiBtb2R1bGUgdGFnLiBUaGlzIHNwZWNpZmllcyBTeW50YXhoaWdobGlnaHRlciBtb2RlIGZvciBzcGVjaWZpYyBjb2RlIGFyZWEuIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6DQo8dWw+DQoJPGxpPmphdmFzY3JpcHQ8L2xpPiANCgk8bGk+cGxhaW48L2xpPiANCgk8bGk+c3ZnPC9saT4gDQoJPGxpPmh0bWw8L2xpPg0KCTxsaT5jc3M8L2xpPg0KCTxsaT5zY3NzPC9saT4NCgk8bGk+Y29mZmVlPC9saT4NCgk8bGk+anNvbjwvbGk+DQoJPGxpPnB5dGhvbjwvbGk+DQoJPGxpPnJ1Ynk8L2xpPg0KCTxsaT5wZXJsPC9saT4NCgk8bGk+cGhwPC9saT4NCgk8bGk+amF2YTwvbGk+DQoJPGxpPmNzaGFycDwvbGk+DQoJPGxpPmNfY3BwPC9saT4NCgk8bGk+Y2xvanVyZTwvbGk+DQoJPGxpPm9jYW1sPC9saT4NCgk8bGk+dGV4dGlsZTwvbGk+DQoJPGxpPmdyb292eTwvbGk+DQoJPGxpPnNjYWxhPC9saT4NCjwvdWw+IjsNCiRsYW5nWydoZWxwX3BhcmFtX3RoZW1lJ10gPSAiaXMgdXNlZCB3aXRoaW4gYSBwYWdlIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249J2RlZmF1bHQnfTwvY29kZT4gbW9kdWxlIHRhZy4gVGhpcyBzcGVjaWZpZXMgU3ludGF4aGlnaGxpZ2h0ZXIgdGhlbWUgZm9yIHNwZWNpZmljIGNvZGUgYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+Y2xvdWRzPC9saT4gDQoJPGxpPmNsb3Vkc19taWRuaWdodDwvbGk+IA0KCTxsaT5jb2JhbHQ8L2xpPiANCgk8bGk+Y3JpbXNvbl9lZGl0b3I8L2xpPg0KCTxsaT5kYXduPC9saT4NCgk8bGk+ZWNsaXBzZTwvbGk+DQoJPGxpPmlkbGVfZmluZ2VyczwvbGk+DQoJPGxpPmtyX3RoZW1lPC9saT4NCgk8bGk+bWVyYml2b3JlPC9saT4NCgk8bGk+bWVyYml2b3JlX3NvZnQ8L2xpPg0KCTxsaT5tb25vX2luZHVzdHJpYWw8L2xpPg0KCTxsaT5tb25va2FpPC9saT4NCgk8bGk+cGFzdGVsX29uX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9saWdodDwvbGk+DQoJPGxpPnRleHRtYXRlPC9saT4NCgk8bGk+dHdpbGlnaHQ8L2xpPg0KCTxsaT52aWJyYW50X2luazwvbGk+DQo8L3VsPiI7DQokbGFuZ1snaGVscF9wYXJhbV93aWR0aCddID0gInNwZWNpZmllcyB3aWR0aCBvZiBTeW50YXhoaWdobGlnaHRlciBhcmVhIGluIHBpeGVsLiI7DQokbGFuZ1snaGVscF9wYXJhbV9oZWlnaHQnXSA9ICJzcGVjaWZpZXMgaGVpZ2h0IG9mIFN5bnRheGhpZ2hsaWdodGVyIGFyZWEgaW4gcGl4ZWwuIjsNCiRsYW5nWydoZWxwX3BhcmFtX2RpdmlkJ10gPSAiaWQgb2YgdGhlIGVsZW1lbnQgY29udGFpbmluZyB5b3VyIGNvZGUuIFVzZSB1bmlxdWUgaWQgZm9yIGVhY2ggY29kZSBjaHVuY2suIjsNCiRsYW5nWydoZWxwX2dlbmVyYWxfdGl0bGUnXSA9ICJHZW5lcmFsIjsNCiRsYW5nWydoZWxwX2dlbmVyYWxfdGV4dCddID0gIg0KPGgzPldoYXQgZG9lcyB0aGlzIG1vZHVsZSBkbz88L2gzPg0KPHA+QWNlRWRpdG9yIGlzIGEgU3ludGF4aGlnaGxpZ2h0ZXIgbW9kdWxlIHVzaW5nIDxzdHJvbmc+QWNlPC9zdHJvbmc+IGEgc3RhbmRhbG9uZSBjb2RlIGVkaXRvciB3cml0dGVuIGluIEphdmFTY3JpcHQuPGJyIC8+IA0KR29hbCBvZiBBY2UgY29kZSBlZGl0b3IgZ3JvdXAgaXMgdG8gY3JlYXRlIGEgd2ViIGJhc2VkIGNvZGUgZWRpdG9yIHRoYXQgbWF0Y2hlcyBhbmQgZXh0ZW5kcyB0aGUgZmVhdHVyZXMsIHVzYWJpbGl0eSBhbmQgcGVyZm9ybWFuY2Ugb2YgZXhpc3RpbmcgbmF0aXZlIGVkaXRvcnMgc3VjaCBhcyBUZXh0TWF0ZSwgVmltIG9yIEVjbGlwc2UuPGJyIC8+DQpJdCBjYW4gYmUgZWFzaWx5IGVtYmVkZGVkIGluIGFueSB3ZWIgcGFnZSBhbmQgSmF2YVNjcmlwdCBhcHBsaWNhdGlvbi48YnIgLz4gDQpBY2UgaXMgZGV2ZWxvcGVkIGFzIHRoZSBwcmltYXJ5IGVkaXRvciBmb3IgPGEgaHJlZj1cImh0dHA6Ly93d3cuY2xvdWQ5aWRlLmNvbVwiPkNsb3VkOSBJREU8L2E+IGFuZCB0aGUgc3VjY2Vzc29yIG9mIHRoZSBNb3ppbGxhIFNreXdyaXRlciAoQmVzcGluKSBQcm9qZWN0LjwvcD4NCjxoMz5BY2UgaXMgaG9zdGVkIG9uIEdpdEh1YjwvaDM+DQo8cD5UaGUgQWNlIHNvdXJjZSBjb2RlIGlzIGhvc3RlZCBvbiBHaXRIdWIuIEl0IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNb3ppbGxhIHRyaS1saWNlbnNlIChNUEwvR1BML0xHUEwpLjxiciAvPg0KVGhpcyBpcyB0aGUgc2FtZSBsaWNlbnNlIHVzZWQgYnkgRmlyZWZveC4gVGhpcyBsaWNlbnNlIGlzIGZyaWVuZGx5IHRvIGFsbCBraW5kcyBvZiBwcm9qZWN0cywgd2hldGhlciBvcGVuIHNvdXJjZSBvciBub3QuPGJyIC8+DQogVGFrZSBjaGFyZ2Ugb2YgeW91ciBlZGl0b3IgYW5kIGFkZCB5b3VyIGZhdm9yaXRlIGxhbmd1YWdlIGhpZ2hsaWdodGluZyBhbmQga2V5YmluZGluZ3MhPC9wPg0KPGgzPlVzaW5nIEFjZUVkaXRvciBNb2R1bGU8L2gzPg0KPHA+VXNpbmcgQWNlRWRpdG9yIE1vZHVsZSBpcyBzaW1wbGUuPGJyIC8+DQpBZnRlciBBY2VFZGl0b3Igd2FzIGluc3RhbGxlZCBnbyB0byBcIk15IFByZWZlcmVuY2VzICZyYXF1bzsgVXNlciBQcmVmZXJlbmNlc1wiIGFuZCBjaG9vc2UgQWNlRWRpdG9yIGFzIHlvdXIgU3ludGF4aGlnaGxpZ2h0ZXIgb2YgY2hvaWNlIGZyb20gXCJTZWxlY3Qgc3ludGF4IGhpZ2hsaWdodGVyIHRvIHVzZTpcIiBEcm9wZG93bi48YnIgLz4NCk1ha2Ugc3VyZSB5b3UgaGF2ZSAnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnIFBlcm1zaXNzaW9uLjwvcD4NCjxoMz5TZXR0aW5nczwvaDM+DQo8cD5Zb3UgY2FuIGNoYW5nZSBkZWZhdWx0IFNldHRpbmdzIGFuZCBUaGVtZXMgaW4gXCJFeHRlbnNpb25zICZyYXF1bzsgQWNlRWRpdG9yXCI8L3A+IjsNCg0KJGxhbmdbJ2hlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfdGl0bGUnXSA9ICJLZXlib2FyZCBTaG9ydGN1dHMiOw0KJGxhbmdbJ2hlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfY29udGVudCddID0gJw0KICAgICAgPGgzPkRlZmF1bHQgS2V5Ym9hcmQgU2hvcnRjdXRzPC9oMz4NCg0KPHRhYmxlIGNsYXNzPSJwYWdldGFibGUiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSJEZWZhdWx0IEtleWJvYXJkIFNob3J0Y3V0cyI+DQo8dGhlYWQ+PHRyPg0KPHRoPlBDIChXaW5kb3dzL0xpbnV4KTwvdGQ+DQo8dGg+TWFjPC90ZD4NCjx0aD5hY3Rpb248L3RkPg0KPC90cj48L3RoZWFkPg0KPHRib2R5Pg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1SZXR1cm48L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVJldHVybjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmZ1bGxzY3JlZW48L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtUzwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtUzwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnBlcmZvcm0gc2F2ZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1MPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Y2VudGVyIHNlbGVjdGlvbjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1BbHQtRG93bjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtT3B0aW9uLURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5jb3B5IGxpbmVzIGRvd248L3RkPg0KPC90cj4NCjx0ciBsY2Fzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtQWx0LVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1PcHRpb24tVXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5jb3B5IGxpbmVzIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzIiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUY8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUY8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5maW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUs8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUc8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5maW5kIG5leHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtSzwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtRzwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmZpbmQgcHJldmlvdXM8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkRvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Eb3duLEN0cmwtTjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIGxpbmUgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+VXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5VcCxDdHJsLVA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyBsaW5lIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUVuZCxDdHJsLURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUVuZCxDb21tYW5kLURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5MZWZ0LEN0cmwtQjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtTDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtTDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGxpbmU8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkFsdC1SaWdodCxFbmQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVJpZ2h0LEVuZCxDdHJsLUU8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBsaW5lIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+QWx0LUxlZnQsSG9tZTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtTGVmdCxIb21lLEN0cmwtQTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGxpbmUgc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPlBhZ2VEb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVBhZ2VEb3duLEN0cmwtVjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHBhZ2UgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+UGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVBhZ2VVcDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHBhZ2UgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPlJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+UmlnaHQsQ3RybC1GPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtSG9tZSxDdHJsLVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1Ib21lLENvbW1hbmQtVXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLUxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byB3b3JkIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5PcHRpb24tUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzIiPg0KPHRkIGFsaWduPSJsZWZ0Ij5UYWI8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5UYWI8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5pbmRlbnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkFsdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5tb3ZlIGxpbmVzIGRvd248L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkFsdC1VcDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1VcDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPm1vdmUgbGluZXMgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVRhYjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVRhYjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPm91dGRlbnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkluc2VydDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkluc2VydDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPm92ZXJ3cml0ZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+UGFnZURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5wYWdlZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+UGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+cGFnZXVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVNoaWZ0LVosQ3RybC1ZPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1aLENvbW1hbmQtWTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnJlZG88L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtRDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtRDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnJlbW92ZSBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUs8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgdG8gbGluZSBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1CYWNrc3BhY2U8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgdG8gbGluZXN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5BbHQtQmFja3NwYWNlLEN0cmwtQWx0LUJhY2tzcGFjZTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnJlbW92ZSB3b3JkIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkFsdC1EZWxldGU8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgd29yZCByaWdodDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1SPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1PcHRpb24tRjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnJlcGxhY2U8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtUjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtT3B0aW9uLUY8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5yZXBsYWNlIGFsbDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1BPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1BPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IGFsbDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRG93bjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRW5kPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRW5kPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IGxpbmUgZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1Ib21lPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtSG9tZTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCBsaW5lIHN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzIiPg0KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1QYWdlRG93bjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVBhZ2VEb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHBhZ2UgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHBhZ2UgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtRW5kLEFsdC1TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHRvIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+QWx0LVNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB0byBsaW5lIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+QWx0LVNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdG8gbGluZSBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1Ib21lLEFsdC1TaGlmdC1VcDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdG8gc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1TaGlmdC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHdvcmQgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzIiPg0KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLU88L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zcGxpdCBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLTc8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLTc8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij50b2dnbGUgY29tbWVudDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1UPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1UPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+dHJhbnNwb3NlIGxldHRlcnM8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtWjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtWjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnVuZG88L3RkPg0KPC90cj4NCjwvdGJvZHk+DQo8L3RhYmxlPic7DQoNCiRsYW5nWydoZWxwX2Zyb250ZW5kX3RpdGxlJ10gPSAiRnJvbnRlbmQiOw0KJGxhbmdbJ2hlbHBfZnJvbnRlbmRfY29udGVudCddID0gIjxwPlRoaXMgTW9kdWxlIGFuZCBBY2UgU2NyaXB0IGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRlci48YnIgLz4NClRvIG1ha2UgaXQgd29yayB5b3UgaGF2ZSB0byBpbmNsdWRlIGpRdWVyeSBGcmFtZXdvcmssIGZvciBleGFtcGxlIHVzaW5nIENNU01TIHtjbXNfanF1ZXJ5fSB0YWcgYW5kIGFzIHdlbGwgaW5jbHVkZSB7QWNlRWRpdG9yfSBpbiB5b3VyIHBhZ2UgdHdpY2UuIEZpcnN0IGFkZCB0aGUgbW9kdWxlIHRhZyBpbiB5b3VyICZsdDtoZWFkJmd0OyBzZWN0aW9uIG9mIFRlbXBsYXRlIG9yIGluICZxdW90O1BhZ2UgU3BlY2lmaWMgTWV0ZGF0YSZxdW90OyBmaWVsZCBvZiB5b3VyIENvbnRlbnQgcGFnZSwgbGlrZSB7QWNlRWRpdG9yIGFjdGlvbj0naGVhZCd9IGFuZCBhbm90aGVyIGNhbGwgdG8gc3BlY2lmeSB3aGljaCBhcmVhIHNob3VsZCBiZSBoaWdobGlnaHRlZCwgZm9yIGV4YW1wbGUge0FjZUVkaXRvciBkaXZpZD0nZm9vJ30sIHdoaWNoIHdvdWxkIHRhcmdldCBhIHBhZ2UgZWxlbWVudCB3aXRoIGlkIDxlbT5mb288L2VtPi48L3A+DQo8aDM+U28gaG93IGRvIHlvdSB1c2UgaXQ/PC9oMz4NCjxwPkZpcnN0IGluY2x1ZGUgalF1ZXJ5IGFuZCBNb2R1bGUgdGFnIGluIHlvdXIgUGFnZSAmbHQ7aGVhZCZndDsgYXJlYSwgZm9yIGV4YW1wbGUgaW4gJnF1b3Q7UGFnZSBTcGVjaWZpYyBNZXRkYXRhJnF1b3Q7OjwvcD4NCgk8cHJlPg0KCXtjbXNfanF1ZXJ5fQ0KCXtBY2VFZGl0b3IgYWN0aW9uPSdoZWFkJ30NCgk8L3ByZT4NCjxwPlRoaXMgaW5jbHVkZXMgbmVlZGVkIHNjcmlwdHMgZm9yIEFjZSBTeW50YXhoaWdobGlnaHRlciB0byB3b3JrLjxiciAvPg0KSW4gTW9kdWxlcyBBZG1pbiBpbnRlcmZhY2UgeW91IGNhbiBzZWxlY3QgZGVmYXVsdCBzZXR0aW5ncyBmb3IgeW91ciAnaGVhZCcgYWN0aW9uIG9yIHVzZSBwYXJhbWV0ZXIgbW9kZXM9J2h0bWwsamF2YXNjcmlwdCcgYW5kIHRoZW1lcz0ndGV4dG1hdGUnIHdoaWNoIHdvdWxkIG92ZXJyaWRlIHNlbGVjdGVkIFByZWZlcmVuY2VzLjwvcD4NCjxwPk5vdyB3aGVuIHlvdSBoYXZlIG5lZWRlZCBzY3JpcHRzIGluY2x1ZGVkLCBvbmUgbW9yZSBNb2R1bGUgdGFnIGNhbGwgaXMgbmVlZGVkIChmb3IgZXhhbXBsZSBpbiB5b3VyIENvbnRlbnQgRWRpdG9yIGFyZWEpIHRvIHNwZWNpZnkgd2hpY2ggYXJlYSBvZiB5b3VyIFBhZ2Ugc2hvdWxkIGJlIGhpZ2hsaWdodGVkLjwvcD4NCgk8cHJlPg0KCXtBY2VFZGl0b3IgZGl2aWQ9J3NvbWUtaWQnfQ0KCTwvcHJlPg0KPHA+VGhpcyB0YWcgaW5jbHVkZXMgbmVlZGVkIFNjcmlwdCBhbmQgU3R5bGUgdGhhdCBpcyB1c2VkIHRvIEhpZ2hsaWdodCBzZWxlY3RlZCBlbGVtZW50IHdpdGggc3BlY2lmaWVkIGlkLjxiciAvPg0KQWxsIHlvdSBuZWVkIHRoZW4gaXMgd3JpdGUgeW91ciBDb2RlIHRoYXQgeW91IHdhbnQgdG8gSGlnaGxpZ2h0IGFuZCB3cmFwIGl0IGluc2lkZSBhbiBlbGVtZW4gbGlrZSAmbHQ7ZGl2Jmd0OyB3aXRoIHNwZWNpZmllZCBpZC48L3A+IjsNCiRsYW5nWydoZWxwX2Zyb250ZW5kX3NhbXBsZSddID0gJw0KPHByZSBpZD0ic29tZS1pZCI+DQombHQ7aHRtbCZndDsNCiDCoCDCoCAmbHQ7aGVhZCZndDsNCiDCoCDCoCAmbHQ7c3R5bGUgdHlwZT0idGV4dC9jc3MiJmd0Ow0KIMKgIMKgIMKgIMKgIC50ZXh0LWxheWVyIHsNCiDCoCDCoCDCoCDCoCDCoCDCoCBmb250LWZhbWlseTogTW9uYWNvLCAiQ291cmllciBOZXciLCBtb25vc3BhY2U7DQogwqAgwqAgwqAgwqAgwqAgwqAgZm9udC1zaXplOiAxMnB4Ow0KIMKgIMKgIMKgIMKgIMKgIMKgIGN1cnNvcjogdGV4dDsNCiDCoCDCoCDCoCDCoCB9DQogwqAgwqAgJmx0Oy9zdHlsZSZndDsNCiDCoCDCoCAmbHQ7L2hlYWQmZ3Q7DQogwqAgwqAgJmx0O2JvZHkmZ3Q7DQogwqAgwqAgwqAgwqAgJmx0O2gxIHN0eWxlPSJjb2xvcjpyZWQiJmd0O0p1aHUgS2lubmVycyZsdDsvaDEmZ3Q7DQogwqAgwqAgJmx0Oy9ib2R5Jmd0OyAmbHQ7L2h0bWwmZ3Q7DQo8L3ByZT4nOw0KDQokbGFuZ1snaGVscF9hYm91dF90aXRsZSddID0gIkFib3V0IjsNCiRsYW5nWydoZWxwX2Fib3V0X3RleHQnXSA9ICc8aDM+U3VwcG9ydDwvaDM+DQo8cD5BcyBwZXIgdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcy1pcy4gUGxlYXNlIHJlYWQgdGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgZm9yIHRoZSBmdWxsIGRpc2NsYWltZXIuPC9wPg0KPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+DQo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMTIsIEdvcmFuIElsaWMgPGEgaHJlZj0ibWFpbHRvOnVuaXF1M2VAZ21haWwuY29tIj4mbHQ7dW5pcXUzZUBnbWFpbC5jb20mZ3Q7PC9hPiA8YSBocmVmPSJodHRwOi8vd3d3LmljaC1tYWNoLWRhcy5hdCIgcmVsPSJleHRlcm5hbCI+d3d3LmljaC1tYWNoLWRhcy5hdDwvYT4uIEFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4NCjxwPlRoaXMgbW9kdWxlIGhhcyBiZWVuIHJlbGVhc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwiPkdOVSBQdWJsaWMgTGljZW5zZTwvYT4uIFlvdSBtdXN0IGFncmVlIHRvIHRoaXMgbGljZW5zZSBiZWZvcmUgdXNpbmcgdGhlIG1vZHVsZS48L3A+DQoJPGgzPlRlYW08L2gzPg0KCTx1bD4NCgkJPGxpPkdvcmFuIElsaWMgKHVuaXF1MykgZy5pbGljQGktYXJ0cy5ldSA8YnIgLz53d3cuaWNoLW1hY2gtZGFzLmF0PC9saT4JDQoJCTxsaT5Sb2JlcnQgQ2FtcGJlbGwgKGNhbGd1eTEwMDApIGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcgIDxiciAvPnd3dy5jYWxndXkxMDAwLmNvbTwvbGk+CQkNCgkJPGxpPkpvbmF0aGFuIFNjaG1pZCAoRm9hbHkqKSBoaUBqb25hdGhhbnNjaG1pZC5kZSA8YnIgLz53d3cuam9uYXRoYW5zY2htaWQuZGU8L2xpPg0KCTwvdWw+DQonOw0KDQovKiAtLS0gQ2hhbmdlbG9nIC0tLSAqLw0KJGxhbmdbJ2NoYW5nZWxvZyddID0gIg0KPGgzPlZlcnNpb24gMC4xPC9oMz4NCjx1bD4NCgk8bGk+SXQncyBmcmVzaCEgTm90aGluZyBjaGFuZ2VkIHlldCE8L2xpPg0KCTxsaT5Vc2luZyBBY2UgVmVyc2lvbiAwLjIuMDwvbGk+DQo8L3VsPg0KPGgzPlZlcnNpb24gMC4yPC9oMz4NCjx1bD4NCgk8bGk+QWRkZWQgQ1RSTC1TIEtleWJpbmRpbmc8L2xpPg0KCTxsaT5BZGRlZCBGdWxsc2NyZWVubW9kZTwvbGk+DQoJPGxpPkFkZGVkIEZyb250ZW5kIEhpZ2hsaWdodGluZzwvbGk+DQoJPGxpPlVwZGF0ZWQgQWNlPC9saT4NCjwvdWw+DQo8aDM+VmVyc2lvbiAwLjIuMTwvaDM+DQo8dWw+DQoJPGxpPkFkZGVkIEludGVybmV0IEV4cGxvcmVyIHByZWZlcmVuY2U8L2xpPg0KCTxsaT5VcGRhdGVkIEFDRSB3aXRoIHRoZW1lczwvbGk+DQo8L3VsPg0KPGgzPlZlcnNpb24gMC4yLjI8L2gzPg0KPHVsPg0KCTxsaT5GaXggZm9yIFNhZmFyaS9NYWM8L2xpPg0KPC91bD4NCjxoMz5WZXJzaW9uIDAuMi4zPC9oMz4NCjx1bD4NCiAgICA8bGk+VXBkYXRlZCB0byBsYXRlc3QgYWNlIGZyb20gZ2l0aHViPC9saT4NCiAgICA8bGk+QWRkZWQgYWRkaXRpb25hbCBwcmVmZXJlbmNlcyAoTW9kaWZ5IFRlbXBsYXRlcywgQWNlRWRpdG9yIFVzZXIgUHJlZmVyZW5jZSk8L2xpPg0KICAgIDxsaT5BZGRlZCBhYmlsaXR5IHRvIGNoYW5nZSBBY2VFZGl0b3IgcHJlZmVyZW5jZXMgcGVyIHVzZXI8L2xpPg0KICAgIDxsaT5Nb3ZlZCBtb2R1bGUgZnJvbSBleHRlbmlvbnMgdG8gbXlwcmVmczwvbGk+DQo8L3VsPg0KPGgzPlZlcnNpb24gMC4yLjMuMTwvaDM+DQo8dWw+DQogICAgPGxpPk1vZGUgcHJlZmVyZW5jZSBidWdmaXg8L2xpPg0KPC91bD4NCjxoMz5Sb2FkbWFwPC9oMz4NCjx1bD4NCgk8bGk+PGRlbD5BZGQgRnJvbnRlbmQgU3ludGF4aGlnaGxpZ2h0aW5nPC9kZWw+PC9saT4NCgk8bGk+PGRlbD5BZGQgRnVsbHNjcmVlbm1vZGU8L2RlbD48L2xpPg0KCTxsaT48ZGVsPkFkZCBLZXliaW5kaW5nIChDVFJMK1MpPC9kZWw+PC9saT4NCgk8bGk+QWRkIEVkaXRvciBiZWhhdmlvciAoVmltLCBFTWFjcyk8L2xpPg0KCTxsaT5NYXliZSBhZGQgVG9vbGJhcjwvbGk+DQo8L3VsPiI7DQoNCj8+DQo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</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+JzsKJGxhbmdbJ2hlbHBfcGFyYW1fbW9kZSddID0gJ3dpcmQgaW5uZXJoYWxiIGVpbmVyIFNlaXRlIG1pdCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbiA9ICYjMDM5O2RlZmF1bHQmIzAzOTt9PC9jb2RlPiBNb2R1bC1UYWcgdmVyd2VuZGV0LiBEYW1pdCB3aXJkIFN5bnRheEhpZ2hsaWdodGVyIE1vZHVzIGYmdXVtbDtyIGFrdHVlbGxlbiBDb2RlLUJlcmVpY2ggZmVzdGdlbGVndC4gPGJyIC8+IE0mb3VtbDtnbGljaGUgV2VydGUgc2luZDoNCjx1bD4NCgk8bGk+amF2YXNjcmlwdDwvbGk+IA0KCTxsaT5wbGFpbjwvbGk+IA0KCTxsaT5zdmc8L2xpPiANCgk8bGk+aHRtbDwvbGk+DQoJPGxpPmNzczwvbGk+DQoJPGxpPnNjc3M8L2xpPg0KCTxsaT5jb2ZmZWU8L2xpPg0KCTxsaT5qc29uPC9saT4NCgk8bGk+cHl0aG9uPC9saT4NCgk8bGk+cnVieTwvbGk+DQoJPGxpPnBlcmw8L2xpPg0KCTxsaT5waHA8L2xpPg0KCTxsaT5qYXZhPC9saT4NCgk8bGk+Y3NoYXJwPC9saT4NCgk8bGk+Y19jcHA8L2xpPg0KCTxsaT5jbG9qdXJlPC9saT4NCgk8bGk+b2NhbWw8L2xpPg0KCTxsaT50ZXh0aWxlPC9saT4NCgk8bGk+Z3Jvb3Z5PC9saT4NCgk8bGk+c2NhbGE8L2xpPg0KPC91bD4nOwokbGFuZ1snaGVscF9wYXJhbV90aGVtZSddID0gJ3dpcmQgaW5uZXJoYWxiIGVpbmVyIFNlaXRlIG1pdCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbiA9ICYjMDM5O2RlZmF1bHQmIzAzOTt9PC9jb2RlPiBNb2R1bC1UYWcgdmVyd2VuZGV0LiBEYW1pdCB3aXJkIFN5bnRheEhpZ2hsaWdodGVyIFRlbXBsYXRlIGYmdXVtbDtyIGFrdHVlbGxlbiBDb2RlLUJlcmVpY2ggZmVzdGdlbGVndC4gPGJyIC8+IE0mb3VtbDtnbGljaGUgV2VydGUgc2luZDoNCjx1bD4NCgk8bGk+Y2xvdWRzPC9saT4gDQoJPGxpPmNsb3Vkc19taWRuaWdodDwvbGk+IA0KCTxsaT5jb2JhbHQ8L2xpPiANCgk8bGk+Y3JpbXNvbl9lZGl0b3I8L2xpPg0KCTxsaT5kYXduPC9saT4NCgk8bGk+ZWNsaXBzZTwvbGk+DQoJPGxpPmlkbGVfZmluZ2VyczwvbGk+DQoJPGxpPmtyX3RoZW1lPC9saT4NCgk8bGk+bWVyYml2b3JlPC9saT4NCgk8bGk+bWVyYml2b3JlX3NvZnQ8L2xpPg0KCTxsaT5tb25vX2luZHVzdHJpYWw8L2xpPg0KCTxsaT5tb25va2FpPC9saT4NCgk8bGk+cGFzdGVsX29uX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9saWdodDwvbGk+DQoJPGxpPnRleHRtYXRlPC9saT4NCgk8bGk+dHdpbGlnaHQ8L2xpPg0KCTxsaT52aWJyYW50X2luazwvbGk+DQo8L3VsPic7CiRsYW5nWydoZWxwX3BhcmFtX3dpZHRoJ10gPSAnYmVzdGltbXQgZGllIEJyZWl0ZSBkZXMgU3ludGF4aGlnaGxpZ2h0ZXIgQmVyZWljaHMgaW4gUGl4ZWwuJzsKJGxhbmdbJ2hlbHBfcGFyYW1faGVpZ2h0J10gPSAnYmVzdGltbXQgZGllIEgmb3VtbDtoZSBkZXMgU3ludGF4aGlnaGxpZ2h0ZXIgQmVyZWljaHMgaW4gUGl4ZWwuJzsKJGxhbmdbJ2hlbHBfcGFyYW1fZGl2aWQnXSA9ICdpZCBkZXMgRWxlbWVudHMgbWl0IElocmVtIENvZGUuIFZlcndlbmRlbiBTaWUgZWluZGV1dGlnZSBJRCBmJnV1bWw7ciBqZWRlbiBDb2RlIHNuaXBwZXQuJzsKJGxhbmdbJ2hlbHBfZ2VuZXJhbF90aXRsZSddID0gJ0FsbGdlbWVpbic7CiRsYW5nWydoZWxwX2dlbmVyYWxfdGV4dCddID0gJzxoMz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/PC9oMz4NCjxwPkFjZUVkaXRvciBpcyBhIFN5bnRheGhpZ2hsaWdodGVyIG1vZHVsZSB1c2luZyA8c3Ryb25nPkFjZTwvc3Ryb25nPiBhIHN0YW5kYWxvbmUgY29kZSBlZGl0b3Igd3JpdHRlbiBpbiBKYXZhU2NyaXB0LjxiciAvPiANCkdvYWwgb2YgQWNlIGNvZGUgZWRpdG9yIGdyb3VwIGlzIHRvIGNyZWF0ZSBhIHdlYiBiYXNlZCBjb2RlIGVkaXRvciB0aGF0IG1hdGNoZXMgYW5kIGV4dGVuZHMgdGhlIGZlYXR1cmVzLCB1c2FiaWxpdHkgYW5kIHBlcmZvcm1hbmNlIG9mIGV4aXN0aW5nIG5hdGl2ZSBlZGl0b3JzIHN1Y2ggYXMgVGV4dE1hdGUsIFZpbSBvciBFY2xpcHNlLjxiciAvPg0KSXQgY2FuIGJlIGVhc2lseSBlbWJlZGRlZCBpbiBhbnkgd2ViIHBhZ2UgYW5kIEphdmFTY3JpcHQgYXBwbGljYXRpb24uPGJyIC8+IA0KQWNlIGlzIGRldmVsb3BlZCBhcyB0aGUgcHJpbWFyeSBlZGl0b3IgZm9yIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xvdWQ5aWRlLmNvbSI+Q2xvdWQ5IElERTwvYT4gYW5kIHRoZSBzdWNjZXNzb3Igb2YgdGhlIE1vemlsbGEgU2t5d3JpdGVyIChCZXNwaW4pIFByb2plY3QuPC9wPg0KPGgzPkFjZSBpcyBob3N0ZWQgb24gR2l0SHViPC9oMz4NCjxwPlRoZSBBY2Ugc291cmNlIGNvZGUgaXMgaG9zdGVkIG9uIEdpdEh1Yi4gSXQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1vemlsbGEgdHJpLWxpY2Vuc2UgKE1QTC9HUEwvTEdQTCkuPGJyIC8+DQpUaGlzIGlzIHRoZSBzYW1lIGxpY2Vuc2UgdXNlZCBieSBGaXJlZm94LiBUaGlzIGxpY2Vuc2UgaXMgZnJpZW5kbHkgdG8gYWxsIGtpbmRzIG9mIHByb2plY3RzLCB3aGV0aGVyIG9wZW4gc291cmNlIG9yIG5vdC48YnIgLz4NCiBUYWtlIGNoYXJnZSBvZiB5b3VyIGVkaXRvciBhbmQgYWRkIHlvdXIgZmF2b3JpdGUgbGFuZ3VhZ2UgaGlnaGxpZ2h0aW5nIGFuZCBrZXliaW5kaW5ncyE8L3A+DQo8aDM+VXNpbmcgQWNlRWRpdG9yIE1vZHVsZTwvaDM+DQo8cD5Vc2luZyBBY2VFZGl0b3IgTW9kdWxlIGlzIHNpbXBsZS48YnIgLz4NCkFmdGVyIEFjZUVkaXRvciB3YXMgaW5zdGFsbGVkIGdvIHRvICZxdW90O015IFByZWZlcmVuY2VzICZyYXF1bzsgVXNlciBQcmVmZXJlbmNlcyZxdW90OyBhbmQgY2hvb3NlIEFjZUVkaXRvciBhcyB5b3VyIFN5bnRheGhpZ2hsaWdodGVyIG9mIGNob2ljZSBmcm9tICZxdW90O1NlbGVjdCBzeW50YXggaGlnaGxpZ2h0ZXIgdG8gdXNlOiZxdW90OyBEcm9wZG93bi48YnIgLz4NCk1ha2Ugc3VyZSB5b3UgaGF2ZSAmIzAzOTtNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcyYjMDM5OyBQZXJtc2lzc2lvbi48L3A+DQo8aDM+U2V0dGluZ3M8L2gzPg0KPHA+WW91IGNhbiBjaGFuZ2UgZGVmYXVsdCBTZXR0aW5ncyBhbmQgVGhlbWVzIGluICZxdW90O0V4dGVuc2lvbnMgJnJhcXVvOyBBY2VFZGl0b3ImcXVvdDs8L3A+JzsKJGxhbmdbJ2hlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfdGl0bGUnXSA9ICdUYXN0YXR1cmsmdXVtbDtyemVsJzsKJGxhbmdbJ2hlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfY29udGVudCddID0gJyAgICAgIDxoMz5EZWZhdWx0IEtleWJvYXJkIFNob3J0Y3V0czwvaDM+DQoNCjx0YWJsZSBjbGFzcz0icGFnZXRhYmxlIiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iRGVmYXVsdCBLZXlib2FyZCBTaG9ydGN1dHMiPgo8dGhlYWQ+PHRyPgo8dGg+UEMgKFdpbmRvd3MvTGludXgpPC90ZD4KPHRoPk1hYzwvdGQ+Cjx0aD5hY3Rpb248L3RkPgo8L3RyPjwvdGhlYWQ+Cjx0Ym9keT4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtTDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Y2VudGVyIHNlbGVjdGlvbjwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1BbHQtRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1PcHRpb24tRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Y29weSBsaW5lcyBkb3duPC90ZD4KPC90cj4KPHRyIGxjYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUFsdC1VcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1PcHRpb24tVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmNvcHkgbGluZXMgdXA8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtRjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1GPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5maW5kPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUs8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtRzwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+ZmluZCBuZXh0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVNoaWZ0LUs8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtRzwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+ZmluZCBwcmV2aW91czwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+RG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+RG93bixDdHJsLU48L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIGxpbmUgZG93bjwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+VXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPlVwLEN0cmwtUDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Z28gbGluZSB1cDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1FbmQsQ3RybC1Eb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUVuZCxDb21tYW5kLURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGVuZDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+TGVmdDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+TGVmdCxDdHJsLUI8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGxlZnQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtTDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1MPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBsaW5lPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5BbHQtUmlnaHQsRW5kPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVJpZ2h0LEVuZCxDdHJsLUU8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGxpbmUgZW5kPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5BbHQtTGVmdCxIb21lPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUxlZnQsSG9tZSxDdHJsLUE8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGxpbmUgc3RhcnQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPlBhZ2VEb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5PcHRpb24tUGFnZURvd24sQ3RybC1WPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBwYWdlIGRvd248L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPlBhZ2VVcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVBhZ2VVcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gcGFnZSB1cDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+UmlnaHQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPlJpZ2h0LEN0cmwtRjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gcmlnaHQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtSG9tZSxDdHJsLVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUhvbWUsQ29tbWFuZC1VcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gc3RhcnQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtTGVmdDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLUxlZnQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHdvcmQgbGVmdDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1SaWdodDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVJpZ2h0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byB3b3JkIHJpZ2h0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5UYWI8L3RkPgo8dGQgYWxpZ249ImxlZnQiPlRhYjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+aW5kZW50PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5BbHQtRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPm1vdmUgbGluZXMgZG93bjwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+QWx0LVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5PcHRpb24tVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPm1vdmUgbGluZXMgdXA8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVRhYjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtVGFiPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5vdXRkZW50PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5JbnNlcnQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkluc2VydDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+b3ZlcndyaXRlPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgo8dGQgYWxpZ249ImxlZnQiPlBhZ2VEb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5wYWdlZG93bjwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5QYWdlVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnBhZ2V1cDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1aLEN0cmwtWTwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1aLENvbW1hbmQtWTwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+cmVkbzwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1EPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnJlbW92ZSBsaW5lPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtSzwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+cmVtb3ZlIHRvIGxpbmUgZW5kPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1CYWNrc3BhY2U8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnJlbW92ZSB0byBsaW5lc3RhcnQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+QWx0LUJhY2tzcGFjZSxDdHJsLUFsdC1CYWNrc3BhY2U8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnJlbW92ZSB3b3JkIGxlZnQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+QWx0LURlbGV0ZTwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+cmVtb3ZlIHdvcmQgcmlnaHQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtUjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1PcHRpb24tRjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+cmVwbGFjZTwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1SPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVNoaWZ0LU9wdGlvbi1GPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5yZXBsYWNlIGFsbDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1BPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUE8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCBhbGw8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCBkb3duPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1MZWZ0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1MZWZ0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgbGVmdDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRW5kPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1FbmQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCBsaW5lIGVuZDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtSG9tZTwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtSG9tZTwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IGxpbmUgc3RhcnQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVBhZ2VEb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1QYWdlRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHBhZ2UgZG93bjwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUGFnZVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1QYWdlVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCBwYWdlIHVwPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1SaWdodDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUmlnaHQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCByaWdodDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1FbmQsQWx0LVNoaWZ0LURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHRvIGVuZDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+QWx0LVNoaWZ0LVJpZ2h0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVNoaWZ0LVJpZ2h0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdG8gbGluZSBlbmQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkFsdC1TaGlmdC1MZWZ0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVNoaWZ0LUxlZnQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB0byBsaW5lIHN0YXJ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVNoaWZ0LUhvbWUsQWx0LVNoaWZ0LVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVNoaWZ0LVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdG8gc3RhcnQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1VcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHVwPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVNoaWZ0LUxlZnQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1TaGlmdC1MZWZ0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3Qgd29yZCBsZWZ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVNoaWZ0LVJpZ2h0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5PcHRpb24tU2hpZnQtUmlnaHQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB3b3JkIHJpZ2h0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtTzwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c3BsaXQgbGluZTwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC03PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLTc8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnRvZ2dsZSBjb21tZW50PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtVDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+dHJhbnNwb3NlIGxldHRlcnM8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtWjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1aPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij51bmRvPC90ZD4KPC90cj4KPC90Ym9keT4KPC90YWJsZT4nOwokbGFuZ1snaGVscF9mcm9udGVuZF90aXRsZSddID0gJ0Zyb250ZW5kJzsKJGxhbmdbJ2hlbHBfZnJvbnRlbmRfY29udGVudCddID0gJzxwPlRoaXMgTW9kdWxlIGFuZCBBY2UgU2NyaXB0IGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRlci48YnIgLz4NClRvIG1ha2UgaXQgd29yayB5b3UgaGF2ZSB0byBpbmNsdWRlIGpRdWVyeSBGcmFtZXdvcmssIGZvciBleGFtcGxlIHVzaW5nIENNU01TIHtjbXNfanF1ZXJ5fSB0YWcgYW5kIGFzIHdlbGwgaW5jbHVkZSB7QWNlRWRpdG9yfSBpbiB5b3VyIHBhZ2UgdHdpY2UuIEZpcnN0IGFkZCB0aGUgbW9kdWxlIHRhZyBpbiB5b3VyIDxoZWFkPiBzZWN0aW9uIG9mIFRlbXBsYXRlIG9yIGluICZxdW90O1BhZ2UgU3BlY2lmaWMgTWV0ZGF0YSZxdW90OyBmaWVsZCBvZiB5b3VyIENvbnRlbnQgcGFnZSwgbGlrZSB7QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fSBhbmQgYW5vdGhlciBjYWxsIHRvIHNwZWNpZnkgd2hpY2ggYXJlYSBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQsIGZvciBleGFtcGxlIHtBY2VFZGl0b3IgZGl2aWQ9JiMwMzk7Zm9vJiMwMzk7fSwgd2hpY2ggd291bGQgdGFyZ2V0IGEgcGFnZSBlbGVtZW50IHdpdGggaWQgPGVtPmZvbzwvZW0+LjwvcD4NCjxoMz5TbyBob3cgZG8geW91IHVzZSBpdD88L2gzPg0KPHA+Rmlyc3QgaW5jbHVkZSBqUXVlcnkgYW5kIE1vZHVsZSB0YWcgaW4geW91ciBQYWdlIDxoZWFkPiBhcmVhLCBmb3IgZXhhbXBsZSBpbiAmcXVvdDtQYWdlIFNwZWNpZmljIE1ldGRhdGEmcXVvdDs6PC9wPg0KCTxwcmU+DQoJe2Ntc19qcXVlcnl9DQoJe0FjZUVkaXRvciBhY3Rpb249JiMwMzk7aGVhZCYjMDM5O30NCgk8L3ByZT4NCjxwPlRoaXMgaW5jbHVkZXMgbmVlZGVkIHNjcmlwdHMgZm9yIEFjZSBTeW50YXhoaWdobGlnaHRlciB0byB3b3JrLjxiciAvPg0KSW4gTW9kdWxlcyBBZG1pbiBpbnRlcmZhY2UgeW91IGNhbiBzZWxlY3QgZGVmYXVsdCBzZXR0aW5ncyBmb3IgeW91ciAmIzAzOTtoZWFkJiMwMzk7IGFjdGlvbiBvciB1c2UgcGFyYW1ldGVyIG1vZGVzPSYjMDM5O2h0bWwsamF2YXNjcmlwdCYjMDM5OyBhbmQgdGhlbWVzPSYjMDM5O3RleHRtYXRlJiMwMzk7IHdoaWNoIHdvdWxkIG92ZXJyaWRlIHNlbGVjdGVkIFByZWZlcmVuY2VzLjwvcD4NCjxwPk5vdyB3aGVuIHlvdSBoYXZlIG5lZWRlZCBzY3JpcHRzIGluY2x1ZGVkLCBvbmUgbW9yZSBNb2R1bGUgdGFnIGNhbGwgaXMgbmVlZGVkIChmb3IgZXhhbXBsZSBpbiB5b3VyIENvbnRlbnQgRWRpdG9yIGFyZWEpIHRvIHNwZWNpZnkgd2hpY2ggYXJlYSBvZiB5b3VyIFBhZ2Ugc2hvdWxkIGJlIGhpZ2hsaWdodGVkLjwvcD4NCgk8cHJlPg0KCXtBY2VFZGl0b3IgZGl2aWQ9JiMwMzk7c29tZS1pZCYjMDM5O30NCgk8L3ByZT4NCjxwPlRoaXMgdGFnIGluY2x1ZGVzIG5lZWRlZCBTY3JpcHQgYW5kIFN0eWxlIHRoYXQgaXMgdXNlZCB0byBIaWdobGlnaHQgc2VsZWN0ZWQgZWxlbWVudCB3aXRoIHNwZWNpZmllZCBpZC48YnIgLz4NCkFsbCB5b3UgbmVlZCB0aGVuIGlzIHdyaXRlIHlvdXIgQ29kZSB0aGF0IHlvdSB3YW50IHRvIEhpZ2hsaWdodCBhbmQgd3JhcCBpdCBpbnNpZGUgYW4gZWxlbWVuIGxpa2UgPGRpdj4gd2l0aCBzcGVjaWZpZWQgaWQuPC9wPic7CiRsYW5nWydoZWxwX2Zyb250ZW5kX3NhbXBsZSddID0gJwo8cHJlIGlkPSJzb21lLWlkIj4KJmx0O2h0bWwmZ3Q7CiDCoCDCoCAmbHQ7aGVhZCZndDsKIMKgIMKgICZsdDtzdHlsZSB0eXBlPSJ0ZXh0L2NzcyImZ3Q7CiDCoCDCoCDCoCDCoCAudGV4dC1sYXllciB7CiDCoCDCoCDCoCDCoCDCoCDCoCBmb250LWZhbWlseTogTW9uYWNvLCAiQ291cmllciBOZXciLCBtb25vc3BhY2U7CiDCoCDCoCDCoCDCoCDCoCDCoCBmb250LXNpemU6IDEycHg7CiDCoCDCoCDCoCDCoCDCoCDCoCBjdXJzb3I6IHRleHQ7CiDCoCDCoCDCoCDCoCB9CiDCoCDCoCAmbHQ7L3N0eWxlJmd0OwogwqAgwqAgJmx0Oy9oZWFkJmd0OwogwqAgwqAgJmx0O2JvZHkmZ3Q7CiDCoCDCoCDCoCDCoCAmbHQ7aDEgc3R5bGU9ImNvbG9yOnJlZCImZ3Q7SnVodSBLaW5uZXJzJmx0Oy9oMSZndDsKIMKgIMKgICZsdDsvYm9keSZndDsgJmx0Oy9odG1sJmd0Owo8L3ByZT4nOwokbGFuZ1snaGVscF9hYm91dF90aXRsZSddID0gJyZVdW1sO2Jlcic7CiRsYW5nWydoZWxwX2Fib3V0X3RleHQnXSA9ICc8aDM+U3VwcG9ydDwvaDM+DQo8cD5BcyBwZXIgdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcy1pcy4gUGxlYXNlIHJlYWQgdGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgZm9yIHRoZSBmdWxsIGRpc2NsYWltZXIuPC9wPg0KPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+DQo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMTIsIEdvcmFuIElsaWMgPGEgaHJlZj0ibWFpbHRvOnVuaXF1M2VAZ21haWwuY29tIj48dW5pcXUzZUBnbWFpbC5jb20+PC9hPiA8YSBocmVmPSJodHRwOi8vd3d3LmljaC1tYWNoLWRhcy5hdCIgcmVsPSJleHRlcm5hbCI+d3d3LmljaC1tYWNoLWRhcy5hdDwvYT4uIEFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4NCjxwPlRoaXMgbW9kdWxlIGhhcyBiZWVuIHJlbGVhc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwiPkdOVSBQdWJsaWMgTGljZW5zZTwvYT4uIFlvdSBtdXN0IGFncmVlIHRvIHRoaXMgbGljZW5zZSBiZWZvcmUgdXNpbmcgdGhlIG1vZHVsZS48L3A+DQoJPGgzPlRlYW08L2gzPg0KCTx1bD4NCgkJPGxpPkdvcmFuIElsaWMgKHVuaXF1MykgZy5pbGljQGktYXJ0cy5ldSA8YnIgLz53d3cuaWNoLW1hY2gtZGFzLmF0PC9saT4JDQoJCTxsaT5Sb2JlcnQgQ2FtcGJlbGwgKGNhbGd1eTEwMDApIGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcgIDxiciAvPnd3dy5jYWxndXkxMDAwLmNvbTwvbGk+CQkNCgkJPGxpPkpvbmF0aGFuIFNjaG1pZCAoRm9hbHkqKSBoaUBqb25hdGhhbnNjaG1pZC5kZSA8YnIgLz53d3cuam9uYXRoYW5zY2htaWQuZGU8L2xpPg0KCTwvdWw+DQonOwokbGFuZ1snY2hhbmdlbG9nJ10gPSAnPGgzPlZlcnNpb24gMC4xPC9oMz4NCjx1bD4NCgk8bGk+SXQmIzAzOTtzIGZyZXNoISBOb3RoaW5nIGNoYW5nZWQgeWV0ITwvbGk+DQoJPGxpPlVzaW5nIEFjZSBWZXJzaW9uIDAuMi4wPC9saT4NCjwvdWw+DQo8aDM+VmVyc2lvbiAwLjI8L2gzPg0KPHVsPg0KCTxsaT5BZGRlZCBDVFJMLVMgS2V5YmluZGluZzwvbGk+DQoJPGxpPkFkZGVkIEZ1bGxzY3JlZW5tb2RlPC9saT4NCgk8bGk+QWRkZWQgRnJvbnRlbmQgSGlnaGxpZ2h0aW5nPC9saT4NCgk8bGk+VXBkYXRlZCBBY2U8L2xpPg0KPC91bD4NCjxoMz5WZXJzaW9uIDAuMi4xPC9oMz4NCjx1bD4NCgk8bGk+QWRkZWQgSW50ZXJuZXQgRXhwbG9yZXIgcHJlZmVyZW5jZTwvbGk+DQoJPGxpPlVwZGF0ZWQgQUNFIHdpdGggdGhlbWVzPC9saT4NCjwvdWw+DQo8aDM+Um9hZG1hcDwvaDM+DQo8dWw+DQoJPGxpPjxkZWw+QWRkIEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGluZzwvZGVsPjwvbGk+DQoJPGxpPjxkZWw+QWRkIEZ1bGxzY3JlZW5tb2RlPC9kZWw+PC9saT4NCgk8bGk+PGRlbD5BZGQgS2V5YmluZGluZyAoQ1RSTCtTKTwvZGVsPjwvbGk+DQoJPGxpPkFkZCBFZGl0b3IgYmVoYXZpb3IgKFZpbSwgRU1hY3MpPC9saT4NCgk8bGk+TWF5YmUgYWRkIFRvb2xiYXI8L2xpPg0KPC91bD4nOwokbGFuZ1sncWNhJ10gPSAnUDAtMTQ1ODQ1MDY2NC0xMjg0NTczMDg0OTE4JzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuNDUwOTE2MzEwLjEzMjc3NzM4MDMuMTMyNzc3MzgwMy4xMzI3NzczODAzLjEnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEzMjc3NzM4MDMuMS4xLnV0bWNjbj0oZGlyZWN0KXx1dG1jc3I9KGRpcmVjdCl8dXRtY21kPShub25lKSc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzJzsKPz4=]]></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+IGZyb20gYSBQYWdlIG9yIFRlbXBsYXRlJzsKJGxhbmdbJ2V4YW1wbGVfZG9jdW1lbnQnXSA9ICdEb2N1bWVudCAnOwokbGFuZ1snd2lkdGhfdGl0bGUnXSA9ICdFZGl0b3IgYnJlZWR0ZSAoaW4gZW0pJzsKJGxhbmdbJ2hlaWdodF90aXRsZSddID0gJ0VkaXRvciBicmVlZHRlIChpbiBlbSknOwokbGFuZ1snZW5hYmxlX2llJ10gPSAnSW50ZXJuZXQgRXhwbG9yZXIgSW5zY2hha2VsZW4nOwokbGFuZ1sndXNlX3VuY29tcHJlc3NlZCddID0gJ0dlYnJ1aWsgb25nZWNvbXByaW1lZXJkJzsKJGxhbmdbJ3VzZV91bmNvbXByZXNzZWRfdGV4dCddID0gJ0RpdCBrYW4gaGVscGVuIGFscyB1IHByb2JsZW1lbiBlcnZhYXJ0IGluIFNhZmFyaS4nOwokbGFuZ1snZW5hYmxlX2llZGVzY3JpcHRpb24nXSA9ICdBY2UgU3ludGF4aGlnaGxpZ2h0ZXIgZnVuY3Rpb25lZXJ0IG5pZXQgY29ycmVjdCBpbiBJbnRlcm5ldCBFeHBsb3Jlci4gR2VicnVpayBkaXQgb3AgZWlnZW4gcmlzaWNvISc7CiRsYW5nWydmcm9udGVuZF93aWR0aF90aXRsZSddID0gJ0Zyb250ZW5kIFN5bnRheCBydWltdGUgYnJlZWR0ZSAoaW4gcHgpJzsKJGxhbmdbJ2Zyb250ZW5kX2hlaWdodF90aXRsZSddID0gJ0Zyb250ZW5kIFN5bnRheCBydWltdGUgaG9vZ3RlIChpbiBweCknOwokbGFuZ1snc3ludGF4X21vZGUnXSA9ICdNb2R1cyc7CiRsYW5nWyd0aGVtZXMnXSA9ICdUaGVtYSc7CiRsYW5nWydmb250X3NpemUnXSA9ICdMZXR0ZXJncm9vdHRlJzsKJGxhbmdbJ2Z1bGxfbGluZSddID0gJ1ZvbGxlZGlnZSBsaWpuJzsKJGxhbmdbJ2hpZ2hsaWdodF9hY3RpdmUnXSA9ICdIaWdobGlnaHQgYWN0aWV2ZSBsaWpuJzsKJGxhbmdbJ3Nob3dfaW52aXNpYmxlcyddID0gJ0dlZWYgb256aWNodGJhcmUgd2Vlcic7CiRsYW5nWydwZXJzaXN0ZW50X2hzY3JvbGwnXSA9ICdQZXJzaXRlbnQgSFNjcm9sbCAnOwokbGFuZ1sna2V5X2JpbmRpbmcnXSA9ICdLZXkgQmluZGluZyAnOwokbGFuZ1snc29mdF93cmFwJ10gPSAnU29mdCBXcmFwICc7CiRsYW5nWydzaG93X2d1dHRlciddID0gJ0dlZWYgR3V0dGVyIHdlZXInOwokbGFuZ1sncHJpbnRfbWFyZ2luJ10gPSAnR2VlZiBwcmludG1hcmdlIHdlZXInOwokbGFuZ1snc29mdF90YWInXSA9ICdHZWJydWlrIFNvZnQgVGFiJzsKJGxhbmdbJ2hpZ2hsaWdodF9zZWxlY3RlZCddID0gJ0hpZ2hsaWdodCBoZXQgZ2VzZWxlY3RlZXJkZSB3b29yZCc7CiRsYW5nWydlbmFibGVfYmVoYXZpb3JzJ10gPSAnU2NoYWtlbCBCZWhhdmlvcnMgaW4nOwokbGFuZ1sndGVzdGFyZWF0ZXh0J10gPSAnVm9vcmJlZWxkJzsKJGxhbmdbJ2pzJ10gPSAnSmF2YVNjcmlwdCAnOwokbGFuZ1sncGxhaW4nXSA9ICdQbGF0dGUgdGVrc3QnOwokbGFuZ1snc3ZnJ10gPSAnU1ZHICc7CiRsYW5nWydodG1sJ10gPSAnSFRNTCAnOwokbGFuZ1snY3NzJ10gPSAnQ1NTICc7CiRsYW5nWydzY3NzJ10gPSAnU0NTUyAnOwokbGFuZ1snY29mZmVlJ10gPSAnQ29mZmVlU2NyaXB0ICc7CiRsYW5nWydqc29uJ10gPSAnSlNPTiAnOwokbGFuZ1sncHl0aG9uJ10gPSAnUHl0aG9uICc7CiRsYW5nWydydWJ5J10gPSAnUnVieSAnOwokbGFuZ1sncGVybCddID0gJ1BlcmwgJzsKJGxhbmdbJ3BocCddID0gJ1BIUCAnOwokbGFuZ1snamF2YSddID0gJ0phdmEgJzsKJGxhbmdbJ2NzaGFycCddID0gJ0MjICc7CiRsYW5nWydjX2NwcCddID0gJ0MrKyAnOwokbGFuZ1snY2xvanVyZSddID0gJ0Nsb2p1cmUgJzsKJGxhbmdbJ29jYW1sJ10gPSAnT0NhbWwgJzsKJGxhbmdbJ3RleHRpbGUnXSA9ICdUZXh0aWxlICc7CiRsYW5nWydncm9vdnknXSA9ICdHcm9vdnkgJzsKJGxhbmdbJ3NjYWxhJ10gPSAnU2NhbGEgJzsKJGxhbmdbJ2Nsb3VkcyddID0gJ0Nsb3VkcyAnOwokbGFuZ1snY2hyb21lJ10gPSAnQ2hyb21lICc7CiRsYW5nWydjbG91ZHNfbWlkbmlnaHQnXSA9ICdDbG91ZHMgTWlkbmlnaHQgJzsKJGxhbmdbJ2NvYmFsdCddID0gJ0NvYmFsdCAnOwokbGFuZ1snY3JpbXNvbl9lZGl0b3InXSA9ICdDcmltc29uIEVkaXRvciAnOwokbGFuZ1snZGF3biddID0gJ0Rhd24gJzsKJGxhbmdbJ2RyZWFtd2VhdmVyJ10gPSAnRHJlYW13ZWF2ZXIgJzsKJGxhbmdbJ2VjbGlwc2UnXSA9ICdFY2xpcHNlICc7CiRsYW5nWydpZGxlX2ZpbmdlcnMnXSA9ICdpZGxlRmluZ2VycyAnOwokbGFuZ1sna3JfdGhlbWUnXSA9ICdrclRoZW1lICc7CiRsYW5nWydtZXJiaXZvcmUnXSA9ICdNZXJiaXZvcmUgJzsKJGxhbmdbJ21lcmJpdm9yZV9zb2Z0J10gPSAnTWVyYml2aW9yZSBTb2Z0ICc7CiRsYW5nWydtb25vX2luZHVzdHJpYWwnXSA9ICdNb25vIEluZHVzdHJpYWwgJzsKJGxhbmdbJ21vbm9rYWknXSA9ICdNb25va2FpICc7CiRsYW5nWydwYXN0ZWxfb25fZGFyayddID0gJ1Bhc3RlbCBvbiBkYXJrICc7CiRsYW5nWydzb2xhcml6ZWRfZGFyayddID0gJ1NvbGFyaXplZCBEYXJrICc7CiRsYW5nWydzb2xhcml6ZWRfbGlnaHQnXSA9ICdTb2xhcml6ZWQgTGlnaHQgJzsKJGxhbmdbJ3RleHRtYXRlJ10gPSAnVGV4dE1hdGUgJzsKJGxhbmdbJ3RvbW9ycm93J10gPSAnVG9tb3Jyb3cgJzsKJGxhbmdbJ3RvbW9ycm93X25pZ2h0J10gPSAnVG9tb3Jyb3cgTmlnaHQgJzsKJGxhbmdbJ3RvbW9ycm93X25pZ2h0X2JyaWdodCddID0gJ1RvbW9ycm93IE5pZ2h0IEJyaWdodCAnOwokbGFuZ1sndG9tb3Jyb3dfbmlnaHRfYmx1ZSddID0gJ1RvbW9ycm93IE5pZ2h0IEJsdWUgJzsKJGxhbmdbJ3RvbW9ycm93X25pZ2h0X2VpZ2h0aWVzJ10gPSAnVG9tb3Jyb3cgTmlnaHQgRWlnaHRpZXMgJzsKJGxhbmdbJ3R3aWxpZ2h0J10gPSAnVHdpbGlnaHQgJzsKJGxhbmdbJ3ZpYnJhbnRfaW5rJ10gPSAnVmlicmFudCBJbmsgJzsKJGxhbmdbJ2FjZSddID0gJ0FjZSAnOwokbGFuZ1sndmltJ10gPSAnVmltICc7CiRsYW5nWydlbWFjcyddID0gJ0VNYWNzICc7CiRsYW5nWydjdXN0b20nXSA9ICdHZWF2YW5jZWVyZCc7CiRsYW5nWydvZmYnXSA9ICdVaXQnOwokbGFuZ1snNDAnXSA9ICc0MCBLYXJha3RlcnMnOwokbGFuZ1snODAnXSA9ICc4MCBLYXJha3RlcnMnOwokbGFuZ1snMTAwJ10gPSAnMTAwIEthcmFrdGVycyc7CiRsYW5nWycxNDAnXSA9ICcxNDAgS2FyYWt0ZXJzJzsKJGxhbmdbJ3NhdmVzZXR0aW5ncyddID0gJ0luc3RlbGxpbmdlbiBvcHNsYWFuJzsKJGxhbmdbJ3NldHRpbmdzc2F2ZWQnXSA9ICdVdyBBY2VFZGl0b3IgaW5zdGVsbGluZ2VuIHppam4gb3BnZXNsYWdlbic7CiRsYW5nWydmcm9udGVuZHNldHRpbmdzc2F2ZWQnXSA9ICdVdyBBY2VFZGl0b3IgRnJvbnRlbmQgaW5zdGVsbGluZ2VuIHppam4gb3BnZXNsYWdlbic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0FjZUVkaXRvciBzdWNjZXN2b2wgZ2UmaXVtbDtuc3RhbGxlZXJkISBTdGVsICZxdW90O0Jld2VyayBzaXRldm9vcmtldXJlbiZxdW90OyBwZXJtaXNzaWVzIGluIG9tIGRlemUgbW9kdWxlIHRlIGdlYnJ1aWtlbiEnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0FjZUVkaXRvciBzdWNjZXN2b2wgZ2UmaXVtbDtuc3RhbGxlZXJkJzsKJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICdFY2h0PyBXZWV0IHUgemVrZXIgZGF0IHUgQWNlRWRpdG9yIHdpbHQgdmVyd2lqZGVyZW4/IERlbmsgbm9nIGVlbnMgZ29lZCBuYSEnOwokbGFuZ1snaGVscF9wYXJhbV9hY3Rpb24nXSA9ICdpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgYWN0aW9uIG9mIE1vZHVsZSB0YWcuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJiMwMzk7ZGVmYXVsdCYjMDM5OyBhbmQgJiMwMzk7aGVhZCYjMDM5Oy4gQm90aCBhcmUgbmVlZGVkIGZvciBjb3JyZWN0IEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGluZyBmdW5jdGlvbi4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+aGVhZDwvbGk+DQoJPGxpPmRlZmF1bHQ8L2xpPg0KPC91bD4nOwokbGFuZ1snaGVscF9wYXJhbV9tb2RlcyddID0gJ2lzIHVzZWQgd2l0aCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fTwvY29kZT4uIFlvdSBjYW4gaW5jbHVkZSBtdWx0aXBsZSBjb21tYSBzZXBhcmF0ZWQgJiMwMzk7bW9kZXMmIzAzOTsgdGhhdCB5b3Ugd2lsbCBiZSB1c2luZyBvbiB5b3VyIHdlYnNpdGUuIFRoaXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHlvdXIgJmFtcDtsdDtoZWFkJmFtcDtndDsgb2YgVGVtcGxhdGUgb3IgUGFnZSBzcGVjaWZpYyBNZXRhZGF0YS4gVGhpcyB3aWxsIG92ZXJyaWRlIHlvdSBQcmVmZXJlbmNlcyBzZWxlY3RlZCBpbiBNb2R1bGUgQWRtaW4gYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+amF2YXNjcmlwdDwvbGk+IA0KCTxsaT5wbGFpbjwvbGk+IA0KCTxsaT5zdmc8L2xpPiANCgk8bGk+aHRtbDwvbGk+DQoJPGxpPmNzczwvbGk+DQoJPGxpPnNjc3M8L2xpPg0KCTxsaT5jb2ZmZWU8L2xpPg0KCTxsaT5qc29uPC9saT4NCgk8bGk+cHl0aG9uPC9saT4NCgk8bGk+cnVieTwvbGk+DQoJPGxpPnBlcmw8L2xpPg0KCTxsaT5waHA8L2xpPg0KCTxsaT5qYXZhPC9saT4NCgk8bGk+Y3NoYXJwPC9saT4NCgk8bGk+Y19jcHA8L2xpPg0KCTxsaT5jbG9qdXJlPC9saT4NCgk8bGk+b2NhbWw8L2xpPg0KCTxsaT50ZXh0aWxlPC9saT4NCgk8bGk+Z3Jvb3Z5PC9saT4NCgk8bGk+c2NhbGE8L2xpPg0KPC91bD4gJzsKJGxhbmdbJ2hlbHBfcGFyYW1fdGhlbWVzJ10gPSAnaXMgdXNlZCB3aXRoIDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2hlYWQmIzAzOTt9PC9jb2RlPi4gWW91IGNhbiBpbmNsdWRlIG11bHRpcGxlIGNvbW1hIHNlcGFyYXRlZCAmIzAzOTt0aGVtZXMmIzAzOTsgdGhhdCB5b3Ugd2lsbCBiZSB1c2luZyBvbiB5b3VyIHdlYnNpdGUuIFRoaXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHlvdXIgJmFtcDtsdDtoZWFkJmFtcDtndDsgb2YgVGVtcGxhdGUgb3IgUGFnZSBzcGVjaWZpYyBNZXRhZGF0YS4gVGhpcyB3aWxsIG92ZXJyaWRlIHlvdSBQcmVmZXJlbmNlcyBzZWxlY3RlZCBpbiBNb2R1bGUgQWRtaW4gYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+Y2xvdWRzPC9saT4gDQoJPGxpPmNsb3Vkc19taWRuaWdodDwvbGk+IA0KCTxsaT5jb2JhbHQ8L2xpPiANCgk8bGk+Y3JpbXNvbl9lZGl0b3I8L2xpPg0KCTxsaT5kYXduPC9saT4NCgk8bGk+ZWNsaXBzZTwvbGk+DQoJPGxpPmlkbGVfZmluZ2VyczwvbGk+DQoJPGxpPmtyX3RoZW1lPC9saT4NCgk8bGk+bWVyYml2b3JlPC9saT4NCgk8bGk+bWVyYml2b3JlX3NvZnQ8L2xpPg0KCTxsaT5tb25vX2luZHVzdHJpYWw8L2xpPg0KCTxsaT5tb25va2FpPC9saT4NCgk8bGk+cGFzdGVsX29uX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9saWdodDwvbGk+DQoJPGxpPnRleHRtYXRlPC9saT4NCgk8bGk+dHdpbGlnaHQ8L2xpPg0KCTxsaT52aWJyYW50X2luazwvbGk+DQo8L3VsPiAnOwokbGFuZ1snaGVscF9wYXJhbV9tb2RlJ10gPSAnaXMgdXNlZCB3aXRoaW4gYSBwYWdlIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249JiMwMzk7ZGVmYXVsdCYjMDM5O308L2NvZGU+IG1vZHVsZSB0YWcuIFRoaXMgc3BlY2lmaWVzIFN5bnRheGhpZ2hsaWdodGVyIG1vZGUgZm9yIHNwZWNpZmljIGNvZGUgYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+amF2YXNjcmlwdDwvbGk+IA0KCTxsaT5wbGFpbjwvbGk+IA0KCTxsaT5zdmc8L2xpPiANCgk8bGk+aHRtbDwvbGk+DQoJPGxpPmNzczwvbGk+DQoJPGxpPnNjc3M8L2xpPg0KCTxsaT5jb2ZmZWU8L2xpPg0KCTxsaT5qc29uPC9saT4NCgk8bGk+cHl0aG9uPC9saT4NCgk8bGk+cnVieTwvbGk+DQoJPGxpPnBlcmw8L2xpPg0KCTxsaT5waHA8L2xpPg0KCTxsaT5qYXZhPC9saT4NCgk8bGk+Y3NoYXJwPC9saT4NCgk8bGk+Y19jcHA8L2xpPg0KCTxsaT5jbG9qdXJlPC9saT4NCgk8bGk+b2NhbWw8L2xpPg0KCTxsaT50ZXh0aWxlPC9saT4NCgk8bGk+Z3Jvb3Z5PC9saT4NCgk8bGk+c2NhbGE8L2xpPg0KPC91bD4gDQoNCic7CiRsYW5nWydoZWxwX3BhcmFtX3RoZW1lJ10gPSAnaXMgdXNlZCB3aXRoaW4gYSBwYWdlIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249JiMwMzk7ZGVmYXVsdCYjMDM5O308L2NvZGU+IG1vZHVsZSB0YWcuIFRoaXMgc3BlY2lmaWVzIFN5bnRheGhpZ2hsaWdodGVyIHRoZW1lIGZvciBzcGVjaWZpYyBjb2RlIGFyZWEuIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6DQo8dWw+DQoJPGxpPmNsb3VkczwvbGk+IA0KCTxsaT5jbG91ZHNfbWlkbmlnaHQ8L2xpPiANCgk8bGk+Y29iYWx0PC9saT4gDQoJPGxpPmNyaW1zb25fZWRpdG9yPC9saT4NCgk8bGk+ZGF3bjwvbGk+DQoJPGxpPmVjbGlwc2U8L2xpPg0KCTxsaT5pZGxlX2ZpbmdlcnM8L2xpPg0KCTxsaT5rcl90aGVtZTwvbGk+DQoJPGxpPm1lcmJpdm9yZTwvbGk+DQoJPGxpPm1lcmJpdm9yZV9zb2Z0PC9saT4NCgk8bGk+bW9ub19pbmR1c3RyaWFsPC9saT4NCgk8bGk+bW9ub2thaTwvbGk+DQoJPGxpPnBhc3RlbF9vbl9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfbGlnaHQ8L2xpPg0KCTxsaT50ZXh0bWF0ZTwvbGk+DQoJPGxpPnR3aWxpZ2h0PC9saT4NCgk8bGk+dmlicmFudF9pbms8L2xpPg0KPC91bD4gJzsKJGxhbmdbJ2hlbHBfcGFyYW1fd2lkdGgnXSA9ICdCcmVlZHRlIHZhbiBkZSBTeW50YXhoaWdobGlnaHRlciBydWltdGUgaW4gcGl4ZWxzLic7CiRsYW5nWydoZWxwX3BhcmFtX2hlaWdodCddID0gJ0hvb2d0ZSB2YW4gZGUgU3ludGF4aGlnaGxpZ2h0ZXIgcnVpbXRlIGluIHBpeGVscy4nOwokbGFuZ1snaGVscF9wYXJhbV9kaXZpZCddID0gJ2lkIHZhbiBoZXQgZWxlbWVudCBkYXQgdXcgY29kZSBiZXZhdC4gR2VicnVpayBlZW4gdW5pZWtlIGlkIHZvb3IgZWxrIGNvZGUgYmxvay4nOwokbGFuZ1snaGVscF9nZW5lcmFsX3RpdGxlJ10gPSAnQWxnZW1lZW4nOwokbGFuZ1snaGVscF9nZW5lcmFsX3RleHQnXSA9ICc8aDM+V2hhdCBkb2VzIHRoaXMgbW9kdWxlIGRvPzwvaDM+DQo8cD5BY2VFZGl0b3IgaXMgYSBTeW50YXhoaWdobGlnaHRlciBtb2R1bGUgdXNpbmcgPHN0cm9uZz5BY2U8L3N0cm9uZz4gYSBzdGFuZGFsb25lIGNvZGUgZWRpdG9yIHdyaXR0ZW4gaW4gSmF2YVNjcmlwdC48YnIgLz4gDQpHb2FsIG9mIEFjZSBjb2RlIGVkaXRvciBncm91cCBpcyB0byBjcmVhdGUgYSB3ZWIgYmFzZWQgY29kZSBlZGl0b3IgdGhhdCBtYXRjaGVzIGFuZCBleHRlbmRzIHRoZSBmZWF0dXJlcywgdXNhYmlsaXR5IGFuZCBwZXJmb3JtYW5jZSBvZiBleGlzdGluZyBuYXRpdmUgZWRpdG9ycyBzdWNoIGFzIFRleHRNYXRlLCBWaW0gb3IgRWNsaXBzZS48YnIgLz4NCkl0IGNhbiBiZSBlYXNpbHkgZW1iZWRkZWQgaW4gYW55IHdlYiBwYWdlIGFuZCBKYXZhU2NyaXB0IGFwcGxpY2F0aW9uLjxiciAvPiANCkFjZSBpcyBkZXZlbG9wZWQgYXMgdGhlIHByaW1hcnkgZWRpdG9yIGZvciA8YSBocmVmPSJodHRwOi8vd3d3LmNsb3VkOWlkZS5jb20iPkNsb3VkOSBJREU8L2E+IGFuZCB0aGUgc3VjY2Vzc29yIG9mIHRoZSBNb3ppbGxhIFNreXdyaXRlciAoQmVzcGluKSBQcm9qZWN0LjwvcD4NCjxoMz5BY2UgaXMgaG9zdGVkIG9uIEdpdEh1YjwvaDM+DQo8cD5UaGUgQWNlIHNvdXJjZSBjb2RlIGlzIGhvc3RlZCBvbiBHaXRIdWIuIEl0IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNb3ppbGxhIHRyaS1saWNlbnNlIChNUEwvR1BML0xHUEwpLjxiciAvPg0KVGhpcyBpcyB0aGUgc2FtZSBsaWNlbnNlIHVzZWQgYnkgRmlyZWZveC4gVGhpcyBsaWNlbnNlIGlzIGZyaWVuZGx5IHRvIGFsbCBraW5kcyBvZiBwcm9qZWN0cywgd2hldGhlciBvcGVuIHNvdXJjZSBvciBub3QuPGJyIC8+DQogVGFrZSBjaGFyZ2Ugb2YgeW91ciBlZGl0b3IgYW5kIGFkZCB5b3VyIGZhdm9yaXRlIGxhbmd1YWdlIGhpZ2hsaWdodGluZyBhbmQga2V5YmluZGluZ3MhPC9wPg0KPGgzPlVzaW5nIEFjZUVkaXRvciBNb2R1bGU8L2gzPg0KPHA+VXNpbmcgQWNlRWRpdG9yIE1vZHVsZSBpcyBzaW1wbGUuPGJyIC8+DQpBZnRlciBBY2VFZGl0b3Igd2FzIGluc3RhbGxlZCBnbyB0byAmcXVvdDtNeSBQcmVmZXJlbmNlcyAmcmFxdW87IFVzZXIgUHJlZmVyZW5jZXMmcXVvdDsgYW5kIGNob29zZSBBY2VFZGl0b3IgYXMgeW91ciBTeW50YXhoaWdobGlnaHRlciBvZiBjaG9pY2UgZnJvbSAmcXVvdDtTZWxlY3Qgc3ludGF4IGhpZ2hsaWdodGVyIHRvIHVzZTomcXVvdDsgRHJvcGRvd24uPGJyIC8+DQpNYWtlIHN1cmUgeW91IGhhdmUgJiMwMzk7TW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMmIzAzOTsgUGVybXNpc3Npb24uPC9wPg0KPGgzPlNldHRpbmdzPC9oMz4NCjxwPllvdSBjYW4gY2hhbmdlIGRlZmF1bHQgU2V0dGluZ3MgYW5kIFRoZW1lcyBpbiAmcXVvdDtFeHRlbnNpb25zICZyYXF1bzsgQWNlRWRpdG9yJnF1b3Q7PC9wPic7CiRsYW5nWydoZWxwX2tleWJvYXJkc2hvcnRjdXRzX3RpdGxlJ10gPSAnVG9ldHNlbmJvcmQgU25lbGtvcHBlbGluZ2VuJzsKJGxhbmdbJ2hlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfY29udGVudCddID0gJyAgICANCiAgICAgIDxoMz5EZWZhdWx0IEtleWJvYXJkIFNob3J0Y3V0czwvaDM+DQoNCjx0YWJsZSBjbGFzcz0mcXVvdDtwYWdldGFibGUmcXVvdDsgY2VsbHNwYWNpbmc9JnF1b3Q7MCZxdW90OyBzdW1tYXJ5PSZxdW90O0RlZmF1bHQgS2V5Ym9hcmQgU2hvcnRjdXRzJnF1b3Q7Pg0KPHRoZWFkPjx0cj4NCjx0aD5QQyAoV2luZG93cy9MaW51eCk8L3RkPg0KPHRoPk1hYzwvdGQ+DQo8dGg+YWN0aW9uPC90ZD4NCjwvdHI+PC90aGVhZD4NCjx0Ym9keT4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1SZXR1cm48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1SZXR1cm48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+ZnVsbHNjcmVlbjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVM8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnBlcmZvcm0gc2F2ZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+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+JzsKJGxhbmdbJ2hlbHBfZnJvbnRlbmRfdGl0bGUnXSA9ICcgRnJvbnRlbmQnOwokbGFuZ1snaGVscF9mcm9udGVuZF9jb250ZW50J10gPSAnPHA+VGhpcyBNb2R1bGUgYW5kIEFjZSBTY3JpcHQgY2FuIGFsc28gYmUgdXNlZCBhcyBhIEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGVyLjxiciAvPg0KVG8gbWFrZSBpdCB3b3JrIHlvdSBoYXZlIHRvIGluY2x1ZGUgalF1ZXJ5IEZyYW1ld29yaywgZm9yIGV4YW1wbGUgdXNpbmcgQ01TTVMge2Ntc19qcXVlcnl9IHRhZyBhbmQgYXMgd2VsbCBpbmNsdWRlIHtBY2VFZGl0b3J9IGluIHlvdXIgcGFnZSB0d2ljZS4gRmlyc3QgYWRkIHRoZSBtb2R1bGUgdGFnIGluIHlvdXIgJmFtcDtsdDtoZWFkJmFtcDtndDsgc2VjdGlvbiBvZiBUZW1wbGF0ZSBvciBpbiAmYW1wO3F1b3Q7UGFnZSBTcGVjaWZpYyBNZXRkYXRhJmFtcDtxdW90OyBmaWVsZCBvZiB5b3VyIENvbnRlbnQgcGFnZSwgbGlrZSB7QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fSBhbmQgYW5vdGhlciBjYWxsIHRvIHNwZWNpZnkgd2hpY2ggYXJlYSBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQsIGZvciBleGFtcGxlIHtBY2VFZGl0b3IgZGl2aWQ9JiMwMzk7Zm9vJiMwMzk7fSwgd2hpY2ggd291bGQgdGFyZ2V0IGEgcGFnZSBlbGVtZW50IHdpdGggaWQgPGVtPmZvbzwvZW0+LjwvcD4NCjxoMz5TbyBob3cgZG8geW91IHVzZSBpdD88L2gzPg0KPHA+Rmlyc3QgaW5jbHVkZSBqUXVlcnkgYW5kIE1vZHVsZSB0YWcgaW4geW91ciBQYWdlICZhbXA7bHQ7aGVhZCZhbXA7Z3Q7IGFyZWEsIGZvciBleGFtcGxlIGluICZhbXA7cXVvdDtQYWdlIFNwZWNpZmljIE1ldGRhdGEmYW1wO3F1b3Q7OjwvcD4NCgk8cHJlPg0KCXtjbXNfanF1ZXJ5fQ0KCXtBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2hlYWQmIzAzOTt9DQoJPC9wcmU+DQo8cD5UaGlzIGluY2x1ZGVzIG5lZWRlZCBzY3JpcHRzIGZvciBBY2UgU3ludGF4aGlnaGxpZ2h0ZXIgdG8gd29yay48YnIgLz4NCkluIE1vZHVsZXMgQWRtaW4gaW50ZXJmYWNlIHlvdSBjYW4gc2VsZWN0IGRlZmF1bHQgc2V0dGluZ3MgZm9yIHlvdXIgJiMwMzk7aGVhZCYjMDM5OyBhY3Rpb24gb3IgdXNlIHBhcmFtZXRlciBtb2Rlcz0mIzAzOTtodG1sLGphdmFzY3JpcHQmIzAzOTsgYW5kIHRoZW1lcz0mIzAzOTt0ZXh0bWF0ZSYjMDM5OyB3aGljaCB3b3VsZCBvdmVycmlkZSBzZWxlY3RlZCBQcmVmZXJlbmNlcy48L3A+DQo8cD5Ob3cgd2hlbiB5b3UgaGF2ZSBuZWVkZWQgc2NyaXB0cyBpbmNsdWRlZCwgb25lIG1vcmUgTW9kdWxlIHRhZyBjYWxsIGlzIG5lZWRlZCAoZm9yIGV4YW1wbGUgaW4geW91ciBDb250ZW50IEVkaXRvciBhcmVhKSB0byBzcGVjaWZ5IHdoaWNoIGFyZWEgb2YgeW91ciBQYWdlIHNob3VsZCBiZSBoaWdobGlnaHRlZC48L3A+DQoJPHByZT4NCgl7QWNlRWRpdG9yIGRpdmlkPSYjMDM5O3NvbWUtaWQmIzAzOTt9DQoJPC9wcmU+DQo8cD5UaGlzIHRhZyBpbmNsdWRlcyBuZWVkZWQgU2NyaXB0IGFuZCBTdHlsZSB0aGF0IGlzIHVzZWQgdG8gSGlnaGxpZ2h0IHNlbGVjdGVkIGVsZW1lbnQgd2l0aCBzcGVjaWZpZWQgaWQuPGJyIC8+DQpBbGwgeW91IG5lZWQgdGhlbiBpcyB3cml0ZSB5b3VyIENvZGUgdGhhdCB5b3Ugd2FudCB0byBIaWdobGlnaHQgYW5kIHdyYXAgaXQgaW5zaWRlIGFuIGVsZW1lbiBsaWtlICZhbXA7bHQ7ZGl2JmFtcDtndDsgd2l0aCBzcGVjaWZpZWQgaWQuPC9wPiAnOwokbGFuZ1snaGVscF9mcm9udGVuZF9zYW1wbGUnXSA9ICc8cHJlIGlkPSZxdW90O3NvbWUtaWQmcXVvdDs+DQomYW1wO2x0O2h0bWwmYW1wO2d0Ow0KICAgICAmYW1wO2x0O2hlYWQmYW1wO2d0Ow0KICAgICAmYW1wO2x0O3N0eWxlIHR5cGU9JnF1b3Q7dGV4dC9jc3MmcXVvdDsmYW1wO2d0Ow0KICAgICAgICAgLnRleHQtbGF5ZXIgew0KICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBNb25hY28sICZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7LCBtb25vc3BhY2U7DQogICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4Ow0KICAgICAgICAgICAgIGN1cnNvcjogdGV4dDsNCiAgICAgICAgIH0NCiAgICAgJmFtcDtsdDsvc3R5bGUmYW1wO2d0Ow0KICAgICAmYW1wO2x0Oy9oZWFkJmFtcDtndDsNCiAgICAgJmFtcDtsdDtib2R5JmFtcDtndDsNCiAgICAgICAgICZhbXA7bHQ7aDEgc3R5bGU9JnF1b3Q7Y29sb3I6cmVkJnF1b3Q7JmFtcDtndDtKdWh1IEtpbm5lcnMmYW1wO2x0Oy9oMSZhbXA7Z3Q7DQogICAgICZhbXA7bHQ7L2JvZHkmYW1wO2d0OyAmYW1wO2x0Oy9odG1sJmFtcDtndDsNCjwvcHJlPic7CiRsYW5nWydoZWxwX2Fib3V0X3RpdGxlJ10gPSAnT3Zlcic7CiRsYW5nWydoZWxwX2Fib3V0X3RleHQnXSA9ICc8aDM+U3VwcG9ydDwvaDM+IA0KPHA+QXMgcGVyIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMuIFBsZWFzZSByZWFkIHRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGZvciB0aGUgZnVsbCBkaXNjbGFpbWVyLjwvcD4NCjxoMz5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gzPg0KPHA+Q29weXJpZ2h0ICZhbXA7Y29weTsgMjAxMiwgR29yYW4gSWxpYyA8YSBocmVmPSJtYWlsdG86dW5pcXUzZUBnbWFpbC5jb20iPiZhbXA7bHQ7dW5pcXUzZUBnbWFpbC5jb20mYW1wO2d0OzwvYT4gPGEgaHJlZj0iaHR0cDovL3d3dy5pY2gtbWFjaC1kYXMuYXQiIHJlbD0iZXh0ZXJuYWwiPnd3dy5pY2gtbWFjaC1kYXMuYXQ8L2E+LiBBbGwgUmlnaHRzIEFyZSBSZXNlcnZlZC48L3A+DQo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5HTlUgUHVibGljIExpY2Vuc2U8L2E+LiBZb3UgbXVzdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgYmVmb3JlIHVzaW5nIHRoZSBtb2R1bGUuPC9wPg0KCTxoMz5UZWFtPC9oMz4NCgk8dWw+DQoJCTxsaT5Hb3JhbiBJbGljICh1bmlxdTMpIGcuaWxpY0BpLWFydHMuZXUgPGJyIC8+d3d3LmljaC1tYWNoLWRhcy5hdDwvbGk+CQ0KCQk8bGk+Um9iZXJ0IENhbXBiZWxsIChjYWxndXkxMDAwKSBjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnICA8YnIgLz53d3cuY2FsZ3V5MTAwMC5jb208L2xpPgkJDQoJCTxsaT5Kb25hdGhhbiBTY2htaWQgKEZvYWx5KikgaGlAam9uYXRoYW5zY2htaWQuZGUgPGJyIC8+d3d3LmpvbmF0aGFuc2NobWlkLmRlPC9saT4NCgk8L3VsPic7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9ICc8aDM+VmVyc2lvbiAwLjE8L2gzPg0KPHVsPg0KCTxsaT5JdCYjMDM5O3MgZnJlc2ghIE5vdGhpbmcgY2hhbmdlZCB5ZXQhPC9saT4NCgk8bGk+VXNpbmcgQWNlIFZlcnNpb24gMC4yLjA8L2xpPg0KPC91bD4NCjxoMz5WZXJzaW9uIDAuMjwvaDM+DQo8dWw+DQoJPGxpPkFkZGVkIENUUkwtUyBLZXliaW5kaW5nPC9saT4NCgk8bGk+QWRkZWQgRnVsbHNjcmVlbm1vZGU8L2xpPg0KCTxsaT5BZGRlZCBGcm9udGVuZCBIaWdobGlnaHRpbmc8L2xpPg0KCTxsaT5VcGRhdGVkIEFjZTwvbGk+DQo8L3VsPg0KPGgzPlZlcnNpb24gMC4yLjE8L2gzPg0KPHVsPg0KCTxsaT5BZGRlZCBJbnRlcm5ldCBFeHBsb3JlciBwcmVmZXJlbmNlPC9saT4NCgk8bGk+VXBkYXRlZCBBQ0Ugd2l0aCB0aGVtZXM8L2xpPg0KPC91bD4NCjxoMz5WZXJzaW9uIDAuMi4yPC9oMz4NCjx1bD4NCgk8bGk+Rml4IGZvciBTYWZhcmkvTWFjPC9saT4NCjwvdWw+DQo8aDM+Um9hZG1hcDwvaDM+DQo8dWw+DQoJPGxpPjxkZWw+QWRkIEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGluZzwvZGVsPjwvbGk+DQoJPGxpPjxkZWw+QWRkIEZ1bGxzY3JlZW5tb2RlPC9kZWw+PC9saT4NCgk8bGk+PGRlbD5BZGQgS2V5YmluZGluZyAoQ1RSTCtTKTwvZGVsPjwvbGk+DQoJPGxpPkFkZCBFZGl0b3IgYmVoYXZpb3IgKFZpbSwgRU1hY3MpPC9saT4NCgk8bGk+TWF5YmUgYWRkIFRvb2xiYXI8L2xpPg0KPC91bD4nOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMzI3NTMxNDc1LjEuMS51dG1jY249KHJlZmVycmFsKXx1dG1jc3I9Zm9ydW0uY21zbWFkZXNpbXBsZS5vcmd8dXRtY2N0PS92aWV3dG9waWMucGhwfHV0bWNtZD1yZWZlcnJhbCc7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjE0OTMzNzYyNTkuMTMyNzUzMTQ3NS4xMzI3NTMxNDc1LjEzMjc1MzE0NzUuMSc7CiRsYW5nWydxY2EnXSA9ICdQMC04MDIyNjM2MDktMTI2ODQyMzg2MjY5OSc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bWInXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></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[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7DQoNCgkvLyBCYWNrZW5kIGVkaXRvciBwcmVmcw0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdtb2RlJywnaHRtbCcpOw0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCd0aGVtZScsJ3RleHRtYXRlJyk7DQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2ZvbnRzaXplJywnMTJweCcpOw0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdmdWxsX2xpbmUnLDEpOw0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdlbmFibGVfaWUnLDApOwkNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnc2hvd19pbnZpc2libGVzJywwKTsNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnc29mdF93cmFwJywnODAsODAnKTsNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnaGlnaGxpZ2h0X2FjdGl2ZScsMSk7DQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ3BlcnNpc3RlbnRfaHNjcm9sbCcsMSk7DQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2tleV9iaW5kaW5nJywnYWNlJyk7DQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ3NvZnRfdGFiJywxKTsNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgncHJpbnRfbWFyZ2luJywwKTsJDQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2hpZ2hsaWdodF9zZWxlY3RlZCcsMSk7DQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2VuYWJsZV9iZWhhdmlvcnMnLDEpOw0KDQoJLy8gRnJvbnRlbmQgc3ludGF4YXJlYSBwcmVmcw0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdmcm9udGVuZF9tb2RlJywnaHRtbCcpOw0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdmcm9udGVuZF9zeW50YXhhcmVhX21vZGUnLCdodG1sJyk7DQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3N5bnRheGFyZWFfdGhlbWUnLCd0ZXh0bWF0ZScpOwkJDQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3RoZW1lJywndGV4dG1hdGUnKTsNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfZm9udHNpemUnLCcxMnB4Jyk7DQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3dpZHRoJywnNTAwJyk7DQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX2hlaWdodCcsJzQwMCcpOw0KICAgIA0KICAgIC8vIHBlcm1pc3Npb25zDQogICAgJHRoaXMtPkNyZWF0ZVBlcm1pc3Npb24oJ0FjZUVkaXRvciBVc2VyIFByZWZlcmVuY2UnLCdBY2VFZGl0b3IgVXNlciBQcmVmZXJlbmNlJyk7CQ0KCQkNCj8+]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7DQogICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCk7DQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7DQoNCnN3aXRjaCgkb2xkdmVyc2lvbikgew0KICAgIGNhc2UgJzAuMi4wJzoNCgkgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZW5hYmxlX2llJywwKTsNCiAgICBjYXNlICcwLjIuMic6DQogICAgICAgIC8vIHBlcm1pc3Npb25zDQogICAgICAgICR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKCdBY2VFZGl0b3IgVXNlciBQcmVmZXJlbmNlJywnQWNlRWRpdG9yIFVzZXIgUHJlZmVyZW5jZScpOw0KfSAgICANCj8+]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/ace.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHRleHRhcmVhIGlkPSJ7JHRleHRhcmVhaWR9IiBuYW1lPSJ7JHRleHRhcmVhbmFtZX0iPnskc3ludGF4X2NvbnRlbnR9PC90ZXh0YXJlYT4NCgk8c3R5bGU+DQoJI3skZWRpdG9yaWR9IHtsZGVsaW19DQoJCXBvc2l0aW9uOiByZWxhdGl2ZTsNCgkgICAgd2lkdGg6IHskd2lkdGh9ZW07DQoJICAgIGhlaWdodDogeyRoZWlnaHR9ZW07DQoJICAgIGJvcmRlcjogNXB4IHNvbGlkICNkZGQ7DQoJICAgIGJhY2tncm91bmQ6ICNmZWZlZmU7IA0KCXtyZGVsaW19DQoJI3skZWRpdG9yaWR9LmZ1bGxzY3JlZW4ge2xkZWxpbX0NCgkJcG9zaXRpb246IGFic29sdXRlOw0KCQl6LWluZGV4OiA5OTk5Ow0KCQltYXJnaW46MDsNCgkJbGVmdDowOw0KCQl0b3A6MDsNCgkJe3JkZWxpbX0NCgk8L3N0eWxlPgkNCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCgkkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpe2xkZWxpbX0NCglpZiAoIXdpbmRvdy5hY2UpcmV0dXJuOw0KCWlmIChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC8oaVBvZHxpUGhvbmV8aVBhZCkvKSkgcmV0dXJuOw0KCXtpZiAkZW5hYmxlX2llID09ICdmYWxzZSd9DQoJaWYgKCQuYnJvd3Nlci5tc2llKSByZXR1cm47CQ0KCXsvaWZ9DQoJCQ0KCQkkKCcjeyR0ZXh0YXJlYWlkfScpLmJlZm9yZSgnPGRpdiBpZD0ieyRlZGl0b3JpZH0iPjwvZGl2PicpOw0KCQkvLyBpbml0IGVkaXRvcg0KCQl2YXIgZWRpdG9yID0gYWNlLmVkaXQoInskZWRpdG9yaWR9Iik7DQoJCXZhciB0ZXh0YXJlYSA9ICQoJyN7JHRleHRhcmVhaWR9JykuaGlkZSgpOw0KDQoJCS8vIHJlc2l6ZSBhY2Ugd2l0aCBqdWkNCgkJJCgnI3skZWRpdG9yaWR9JykucmVzaXphYmxlKHtsZGVsaW19DQoJCQlzdG9wOiBmdW5jdGlvbihldmVudCwgdWkpe2xkZWxpbX0NCgkJCQllZGl0b3IucmVuZGVyZXIub25SZXNpemUodHJ1ZSk7DQoJCQkJZWRpdG9yLnJlbmRlcmVyLnVwZGF0ZUZ1bGwoKTsNCgkJCQllZGl0b3IuZm9jdXMoKTsNCgkJCXtyZGVsaW19LAkJCQ0KCQkJZ2hvc3Q6IHRydWUNCgkJe3JkZWxpbX0pOw0KDQoJCS8vIHNldCB0aGVtZQ0KCQllZGl0b3Iuc2V0VGhlbWUoImFjZS90aGVtZS97JHRoZW1lfSIpOw0KCQkvLyBzZXQgaGlnaGxpZ2h0ZXIgbW9kZQ0KCQl7aWYgJG1vZGUgIT0gJ3BsYWluJ30NCgkJDQoJCXZhciBzZXRNb2RlID0gcmVxdWlyZSgiYWNlL21vZGUveyRtb2RlfSIpLk1vZGU7DQoJCWVkaXRvci5nZXRTZXNzaW9uKCkuc2V0TW9kZShuZXcgc2V0TW9kZSgpKTsNCgkJey9pZn0NCgkJLy8gc2V0IGZvbnRzaXplDQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd7JGVkaXRvcmlkfScpLnN0eWxlLmZvbnRTaXplPSd7JGZvbnRzaXplfSc7DQoJCS8vIGZ1bGwgbGluZSBzZWxlY3Rpb24NCgkJZWRpdG9yLnNldFNlbGVjdGlvblN0eWxlKCd7JGZ1bGxfbGluZX0nKTsNCgkJLy8gaGlnaGxpZ2h0IGFjdGl2ZSBsaW5lDQoJCWVkaXRvci5zZXRIaWdobGlnaHRBY3RpdmVMaW5lKHskaGlnaGxpZ2h0X2FjdGl2ZX0pOw0KCQkvLyBoaWdobGlnaHQgc2VsZWN0ZWQgd29yZA0KCQllZGl0b3Iuc2V0SGlnaGxpZ2h0U2VsZWN0ZWRXb3JkKHskaGlnaGxpZ2h0X3NlbGVjdGVkfSk7DQoJCS8vIHNob3cgaW52aXNpYmxlcw0KCQllZGl0b3Iuc2V0U2hvd0ludmlzaWJsZXMoeyRzaG93X2ludmlzaWJsZXN9KTsNCgkJLy8gcGVyc2lzdGVudCBoc2Nyb2xsDQoJCWVkaXRvci5yZW5kZXJlci5zZXRIU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZSh7JHBlcnNpc3RlbnRfaHNjcm9sbH0pOw0KCQkvLyBzaG93IGd1dHRlcg0KCQllZGl0b3IucmVuZGVyZXIuc2V0U2hvd0d1dHRlcih7JHNob3dfZ3V0dGVyfSk7DQoJCXtpZiAkc29mdF93cmFwICE9ICdvZmYnfQ0KCQkvLyAgc29mdCB3cmFwDQoJCWVkaXRvci5nZXRTZXNzaW9uKCkuc2V0VXNlV3JhcE1vZGUodHJ1ZSk7DQoJCWVkaXRvci5nZXRTZXNzaW9uKCkuc2V0V3JhcExpbWl0UmFuZ2UoeyRzb2Z0X3dyYXB9KTsNCgkJey9pZn0NCgkJLy8gc2V0IHNvZnQgdGFiDQoJCWVkaXRvci5nZXRTZXNzaW9uKCkuc2V0VXNlU29mdFRhYnMoeyRzb2Z0X3RhYn0pOw0KCQkvLyBzZXQgcHJpbnQgbWFyZ2luDQoJCWVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oeyRwcmludF9tYXJnaW59KTsNCgkJDQoJICAgICAgICAvLyBiaW5kIGN0cmwrZW50ZXIgdG8gZnVsbCBzY3JlZW4gbW9kZS4NCiAgICAgICAgICAgICAgICB7bGl0ZXJhbH0NCgkJZWRpdG9yLmNvbW1hbmRzLmFkZENvbW1hbmQoew0KICAgICAgICAgICAgICAgICAgbmFtZTogJ2Z1bGxTY3JlZW5FZGl0aW5nJywNCiAgICAgICAgICAgICAgICAgIGJpbmRLZXk6IHsNCiAgICAgICAgICAgICAgICAgICAgd2luOiAnQ3RybC1SZXR1cm4nLA0KICAgICAgICAgICAgICAgICAgICBtYWM6ICdDb21tYW5kLVJldHVybicsDQogICAgICAgICAgICAgICAgICAgIHNlbmRlcjogJ2VkaXRvcicNCiAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICBleGVjOiBmdW5jdGlvbihlbnYsYXJncyxyZXF1ZXN0KSB7DQoJICAgICAgICAgICAgdmFyIGVkaXRvckRpdiA9ICQoJyN7L2xpdGVyYWx9eyRlZGl0b3JpZH17bGl0ZXJhbH0nKTsNCiAgICAgICAgICAgICAgICAgICAgaWYoIGVkaXRvckRpdi5oYXNDbGFzcygnZnVsbHNjcmVlbicpICkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAvLyBzaHV0IGRvd24gZnVsbCBzY3JlZW4NCgkgICAgICAgICAgICAgICBlZGl0b3JEaXYucmVtb3ZlQ2xhc3MoJ2Z1bGxzY3JlZW4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IGVkaXRvckRpdi5kYXRhKCk7DQogICAgICAgICAgICAgICAgICAgICAgIGVkaXRvckRpdi53aWR0aCh0bXAub3JpZ1dpZHRoKTsNCgkJICAgICAgIGVkaXRvckRpdi5oZWlnaHQodG1wLm9yaWdIZWlnaHQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJuIG9uIGZ1bGwgc2NyZWVuDQoJCSAgICAgICBlZGl0b3JEaXYuYWRkQ2xhc3MoJ2Z1bGxzY3JlZW4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yRGl2LmRhdGEoJ29yaWdXaWR0aCcsZWRpdG9yRGl2LndpZHRoKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3JEaXYuZGF0YSgnb3JpZ0hlaWdodCcsZWRpdG9yRGl2LmhlaWdodCgpKTsNCgkJICAgICAgIAkJICAgZWRpdG9yRGl2LndpZHRoKCQod2luZG93KS53aWR0aCgpKjAuOTk1KTsNCiAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yRGl2LmhlaWdodCgkKHdpbmRvdykuaGVpZ2h0KCkqMC45OCk7DQogICAgICAgICAgICAgICAgICAgIH0NCgkJICAgIGVkaXRvci5yZW5kZXJlci5vblJlc2l6ZSh0cnVlKTsNCgkgICAgICAgICAgICBlZGl0b3IucmVuZGVyZXIudXBkYXRlRnVsbCgpOw0KCSAgICAgICAgICAgIGVkaXRvci5mb2N1cygpOw0KICAgICAgICAgICAgICAgICAgICAvL2VkaXRvci5yZWZyZXNoKCk7DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQoJCWVkaXRvci5jb21tYW5kcy5hZGRDb21tYW5kKHsNCiAgICAgICAgICAgICAgICAgIG5hbWU6ICdteXNhdmUnLA0KICAgICAgICAgICAgICAgICAgYmluZEtleTogew0KICAgICAgICAgICAgICAgICAgICB3aW46ICdDdHJsLVMnLA0KICAgICAgICAgICAgICAgICAgICBtYWM6ICdDb21tYW5kLVMnLA0KICAgICAgICAgICAgICAgICAgICBzZW5kZXI6ICdlZGl0b3InDQogICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgZXhlYzogZnVuY3Rpb24oZW52LGFyZ3MscmVxdWVzdCkgew0KCQkgICAgLy8gdXBkYXRlIHRoZSB0ZXh0IGFyZWEgZmllbGQuDQogICAgICAgICAJICAgIHZhciB0ZXh0ID0gZWRpdG9yLmdldFNlc3Npb24oKS5nZXRWYWx1ZSgpOw0KCQkgICAgdGV4dGFyZWEudmFsKHRleHQpOw0KICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBwYXJlbnQgZm9ybS4gYW5kIGEgY2hpbGQgYnV0dG9uIG5hbWVkICdhcHBseScsIGFuZCBjbGljayBpdC4NCiAgICAgICAgICAgICAgICAgICAgJCgney9saXRlcmFsfSN7JGVkaXRvcmlkfXtsaXRlcmFsfScpLmNsb3Nlc3QoJ2Zvcm0nKS5maW5kKCdbbmFtZSQ9ImFwcGx5Il0nKS5maXJzdCgpLmNsaWNrKCk7DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICB7L2xpdGVyYWx9DQoNCgkJLy8gZ2V0IHRoZSB2YWx1ZSBmcm9tIHRleHRhcmVhDQoJCXZhciBpbnRpYWxEYXRhID0gJCgnI3skdGV4dGFyZWFpZH0nKS52YWwoKTsNCgkJZWRpdG9yLmdldFNlc3Npb24oKS5zZXRWYWx1ZShpbnRpYWxEYXRhKTsNCgkJLy8gVXBkYXRlIHRoZSB0ZXh0YXJlYSBvbiBjaGFuZ2UuDQoJCWVkaXRvci5nZXRTZXNzaW9uKCkub24oJ2NoYW5nZScsIGZ1bmN0aW9uKCl7bGRlbGltfQ0KCQkJLy8gR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBlZGl0b3IgYW5kIHBsYWNlIGl0IGludG8gdGhlIHRleHRhcmVhLg0KCQkJdmFyIHRleHQgPSBlZGl0b3IuZ2V0U2Vzc2lvbigpLmdldFZhbHVlKCk7DQoJCQl0ZXh0YXJlYS52YWwodGV4dCk7DQoJCQkvL2FsZXJ0KHRleHQpOw0KCQl7cmRlbGltfSk7DQoJe3JkZWxpbX0pOw0KPC9zY3JpcHQ+DQo=]]></data>
	</file>
	<file>
	  <filename>/templates/frontendsettings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e3N0cmlwfQ0KeyRzdGFydGZvcm19DQo8ZmllbGRzZXQ+DQoJPGxlZ2VuZD4NCgkJeyRzZXR0aW5nc3RleHR9DQoJPC9sZWdlbmQ+DQoJPHA+eyRoZWFkX2Rlc2NyaXB0aW9ufTwvcD4NCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCQk8cCBjbGFzcz0icGFnZXRleHQiPg0KCQkJeyRmcm9udGVuZF9zeW50YXhfbW9kZX0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskZnJvbnRlbmRfc3ludGF4X21vZGVpbnB1dH0NCgkJPC9wPg0KCTwvZGl2Pg0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JHRoZW1ldGV4dH0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskZnJvbnRlbmRfdGhlbWVpbnB1dH0NCgkJPC9wPg0KCTwvZGl2Pg0KPC9maWVsZHNldD4NCjxmaWVsZHNldD4JDQoJPGxlZ2VuZD4NCgkJeyRzeW50YXhfc2V0dGluZ3N0ZXh0fQ0KCTwvbGVnZW5kPg0KCTxwPnskY29udGVudF9kZXNjcmlwdGlvbn08L3A+CQkJDQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskd2lkdGhfdGl0bGV9DQoJCTwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQoJCQl7JHdpZHRoX2lucHV0fQ0KCQk8L3A+DQoJPC9kaXY+CQ0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JGhlaWdodF90aXRsZX0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskaGVpZ2h0X2lucHV0fQ0KCQk8L3A+DQoJPC9kaXY+CQ0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JGZyb250ZW5kX3N5bnRheF9tb2RlfQ0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyRmcm9udGVuZF9zeW50YXhhcmVhX21vZGVpbnB1dH0NCgkJPC9wPg0KCTwvZGl2PgkJDQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskdGhlbWV0ZXh0fQ0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyR0aGVtZWlucHV0fQ0KCQk8L3A+DQoJPC9kaXY+DQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskZm9udHNpemV0ZXh0fQ0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyRmb250c2l6ZWlucHV0fQ0KCQk8L3A+DQoJPC9kaXY+CQkJCQkJCQ0KPC9maWVsZHNldD4NCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCQk8cCBjbGFzcz0icGFnZXRleHQiPg0KCQkJJm5ic3A7DQoJCTwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQoJCQl7JHN1Ym1pdH0NCgkJPC9wPg0KCTwvZGl2Pg0KeyRlbmRmb3JtfQ0Key9zdHJpcH0NCg==]]></data>
	</file>
	<file>
	  <filename>/templates/help.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e3N0cmlwfQ0KPGRpdiBzdHlsZT0iZmxvYXQ6cmlnaHQ7Ij4NCgk8Zm9ybSBhY3Rpb249Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3IiIG1ldGhvZD0icG9zdCI+DQoJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhjbGljayIgLz4NCgkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaG9zdGVkX2J1dHRvbl9pZCIgdmFsdWU9IkZMSDJBTjg5VVBQQUciIC8+DQoJCTxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJodHRwczovL3d3dy5wYXlwYWxvYmplY3RzLmNvbS9lbl9HQi9pL2J0bi9idG5fZG9uYXRlX0xHLmdpZiIgYm9yZGVyPSIwIiBuYW1lPSJzdWJtaXQiIGFsdD0iUGF5UGFsIOKAlCBUaGUgc2FmZXIsIGVhc2llciB3YXkgdG8gcGF5IG9ubGluZS4iIHN0eWxlPSJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7IiAvPg0KCQk8aW1nIGFsdD0iIiBib3JkZXI9IjAiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsb2JqZWN0cy5jb20vZGVfREUvaS9zY3IvcGl4ZWwuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPg0KCTwvZm9ybT4NCjwvZGl2Pg0KPGRpdiBpZD0icGFnZV90YWJzIj4NCgk8ZGl2IGlkPSJnZW5lcmFsIj4NCgkJeyRoZWxwX2dlbmVyYWxfdGl0bGV9DQoJPC9kaXY+DQoJPGRpdiBpZD0ic2hvcnRjdXRzIj4NCgkJeyRoZWxwX2tleWJvYXJkc2hvcnRjdXRzX3RpdGxlfQ0KCTwvZGl2Pg0KCTxkaXYgaWQ9ImZyb250ZW5kIj4NCgkJeyRoZWxwX2Zyb250ZW5kX3RpdGxlfQ0KCTwvZGl2PgkNCgk8ZGl2IGlkPSJhYm91dCI+DQoJCXskaGVscF9hYm91dF90aXRsZX0NCgk8L2Rpdj4JDQo8L2Rpdj4NCjxkaXYgY2xhc3M9ImNsZWFyYiI+PC9kaXY+DQo8ZGl2IGlkPSJwYWdlX2NvbnRlbnQiPg0KCTxkaXYgaWQ9ImdlbmVyYWxfYyI+DQoJCTxpbWcgc3R5bGU9ImZsb2F0OnJpZ2h0O21hcmdpbjowIDEwcHggMTBweCAxMHB4OyBib3JkZXI6IDVweCBzb2xpZCAjZjBmMGYwOyIgc3JjPSJ7JG1vZHVsZV9wYXRofS9pbWFnZXMvZWRpdG9yLmpwZyIgYWx0PSJFZGl0b3IiIHdpZHRoPSIzMTYiIGhlaWdodD0iMjU5IiAvPg0KCQl7JGhlbHBfZ2VuZXJhbF90ZXh0fQ0KCQk8YnIgc3R5bGUgPSJjbGVhcjpib3RoOyIgLz4NCgk8L2Rpdj4NCgk8ZGl2IGlkPSJzaG9ydGN1dHNfYyI+DQoJCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCXskaGVscF9rZXlib2FyZHNob3J0Y3V0c19jb250ZW50fQ0KCQk8L2Rpdj4NCgk8L2Rpdj4NCgk8ZGl2IGlkPSJmcm9udGVuZF9jIj4NCgkJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJeyRoZWxwX2Zyb250ZW5kX2NvbnRlbnR9DQoJCTxwcmU+eyRoZWxwX2Zyb250ZW5kX3NhbXBsZX08L3ByZT4NCgkJPC9kaXY+DQoJPC9kaXY+DQoJPGRpdiBpZD0iYWJvdXRfYyI+DQoJCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCXskaGVscF9hYm91dF90ZXh0fQ0KCQk8L2Rpdj4NCgk8L2Rpdj4JCQ0KPC9kaXY+DQp7L3N0cmlwfQ0K]]></data>
	</file>
	<file>
	  <filename>/templates/orig_default.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpe2xkZWxpbX0NCgl2YXIgdHh0ID0gJCgnI3skZGl2aWR9JykudGV4dCgpOw0KICAJdmFyIGVkaXRvciA9IGFjZS5lZGl0KCd7JGRpdmlkfScpOw0KICAJCWVkaXRvci5zZXRSZWFkT25seSh0cnVlKTsNCiAgCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgneyRkaXZpZH0nKS5zdHlsZS5mb250U2l6ZT0neyRmb250c2l6ZX0nOw0Ke2lmIGlzc2V0KCR0aGVtZSl9DQoJCWVkaXRvci5zZXRUaGVtZSgnYWNlL3RoZW1lL3skdGhlbWV9Jyk7DQp7L2lmfQ0Ke2lmIGlzc2V0KCRtb2RlKX0NCgkJdmFyIHRoZU1vZGUgPSByZXF1aXJlKCdhY2UvbW9kZS97JG1vZGV9JykuTW9kZTsNCiAgCQllZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUobmV3IHRoZU1vZGUpOw0Key9pZn0NCiAgCQllZGl0b3IucmVuZGVyZXIuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTsNCiAgCQllZGl0b3IuZ2V0U2Vzc2lvbigpLnNldFZhbHVlKHR4dCk7DQp7cmRlbGltfSk7DQo8L3NjcmlwdD4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJI3skZGl2aWR9IHtsZGVsaW19DQoJCXBvc2l0aW9uOiByZWxhdGl2ZTsNCgkJaGVpZ2h0OiB7JGhlaWdodH1weDsNCgkJd2lkdGg6IHskd2lkdGh9cHg7DQoJCWJhY2tncm91bmQ6ICNmZmY7DQoJCWRpc3BsYXk6IGJsb2NrOw0KCXtyZGVsaW19DQo8L3N0eWxlPg0K]]></data>
	</file>
	<file>
	  <filename>/templates/orig_head.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InskYWNlX3VybH0vYWNlL3NyYy9hY2UuanMiPjwvc2NyaXB0Pg0Ke2ZvcmVhY2ggZnJvbT0kbW9kZXMgaXRlbT0nbW9kZSd9DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0ieyRhY2VfdXJsfS9hY2Uvc3JjL21vZGUteyRtb2RlfS5qcyI+PC9zY3JpcHQ+DQp7L2ZvcmVhY2h9DQp7aWYgaXNzZXQoJHRoZW1lcyl9DQp7Zm9yZWFjaCBmcm9tPSR0aGVtZXMgaXRlbT0ndGhlbWUnfQ0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InskYWNlX3VybH0vYWNlL3NyYy90aGVtZS17JHRoZW1lfS5qcyI+PC9zY3JpcHQ+DQp7L2ZvcmVhY2h9DQp7L2lmfQ0K]]></data>
	</file>
	<file>
	  <filename>/templates/settings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e3N0cmlwfQ0KeyRzdGFydGZvcm19DQo8ZmllbGRzZXQ+DQoJPGxlZ2VuZD4NCgkJeyRzZXR0aW5nc3RleHR9DQoJPC9sZWdlbmQ+DQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskd2lkdGhfdGl0bGV9DQoJCTwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQoJCQl7JHdpZHRoX2lucHV0fQ0KCQk8L3A+DQoJPC9kaXY+CQ0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JGhlaWdodF90aXRsZX0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskaGVpZ2h0X2lucHV0fQ0KCQk8L3A+DQoJPC9kaXY+DQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskZW5hYmxlX2lldGV4dH0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskZW5hYmxlX2llaW5wdXR9IHskZW5hYmxlX2llZGVzY3J9DQoJCTwvcD4NCgk8L2Rpdj4NCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCQk8cCBjbGFzcz0icGFnZXRleHQiPg0KCQkJeyR1c2VfdW5jb21wcmVzc2VkX3RpdGxlfQ0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyR1c2VfdW5jb21wcmVzc2VkX2lucHV0fSB7JHVzZV91bmNvbXByZXNzZWRfdGV4dH0NCgkJPC9wPg0KCTwvZGl2Pg0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JHN5bnRheF9tb2RlfQ0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyRzeW50YXhfbW9kZWlucHV0fQ0KCQk8L3A+DQoJPC9kaXY+DQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskdGhlbWV0ZXh0fQ0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyR0aGVtZWlucHV0fQ0KCQk8L3A+DQoJPC9kaXY+DQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskZm9udHNpemV0ZXh0fQ0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyRmb250c2l6ZWlucHV0fQ0KCQk8L3A+DQoJPC9kaXY+CQ0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JGZ1bGxfbGluZXRleHR9DQoJCTwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQoJCQl7JGZ1bGxfbGluZWlucHV0fQ0KCQk8L3A+DQoJPC9kaXY+DQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskaGlnaGxpZ2h0X2FjdGl2ZXRleHR9DQoJCTwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQoJCQl7JGhpZ2hsaWdodF9hY3RpdmVpbnB1dH0NCgkJPC9wPg0KCTwvZGl2Pg0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JHNob3dfaW52aXNpYmxlc3RleHR9DQoJCTwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQoJCQl7JHNob3dfaW52aXNpYmxlc2lucHV0fQ0KCQk8L3A+DQoJPC9kaXY+DQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskcGVyc2lzdGVudF9oc2Nyb2xsdGV4dH0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskcGVyc2lzdGVudF9oc2Nyb2xsaW5wdXR9DQoJCTwvcD4NCgk8L2Rpdj4NCgl7Kg0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JGtleV9iaW5kaW5ndGV4dH0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXska2V5X2JpbmRpbmdpbnB1dH0NCgkJPC9wPg0KCTwvZGl2Pg0KCSp9CQ0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JHNvZnRfd3JhcHRleHR9DQoJCTwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQoJCQl7JHNvZnRfd3JhcGlucHV0fQ0KCQk8L3A+DQoJPC9kaXY+CQ0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JHNob3dfZ3V0dGVydGV4dH0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskc2hvd19ndXR0ZXJpbnB1dH0NCgkJPC9wPg0KCTwvZGl2PgkNCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCQk8cCBjbGFzcz0icGFnZXRleHQiPg0KCQkJeyRwcmludF9tYXJnaW50ZXh0fQ0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyRwcmludF9tYXJnaW5pbnB1dH0NCgkJPC9wPg0KCTwvZGl2PgkNCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCQk8cCBjbGFzcz0icGFnZXRleHQiPg0KCQkJeyRzb2Z0X3RhYnRleHR9DQoJCTwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQoJCQl7JHNvZnRfdGFiaW5wdXR9DQoJCTwvcD4NCgk8L2Rpdj4JDQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskaGlnaGxpZ2h0X3NlbGVjdGVkdGV4dH0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskaGlnaGxpZ2h0X3NlbGVjdGVkaW5wdXR9DQoJCTwvcD4NCgk8L2Rpdj4NCgl7KgkNCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCQk8cCBjbGFzcz0icGFnZXRleHQiPg0KCQkJeyRlbmFibGVfYmVoYXZpb3JzdGV4dH0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskZW5hYmxlX2JlaGF2aW9yc2lucHV0fQ0KCQk8L3A+DQoJPC9kaXY+CQ0KCSp9CQkJCQkJDQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCSZuYnNwOw0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyRzdWJtaXR9DQoJCTwvcD4NCgk8L2Rpdj4NCjwvZmllbGRzZXQ+DQo8ZmllbGRzZXQ+DQoJPGxlZ2VuZD57JHRlc3RhcmVhdGV4dH08L2xlZ2VuZD4NCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskdGVzdGFyZWF9DQoJCTwvcD4NCgk8L2Rpdj4JDQoJDQo8L2ZpZWxkc2V0Pg0KeyRlbmRmb3JtfSANCnsvc3RyaXB9DQo=]]></data>
	</file>
</module>
