<?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>ECB2</name>
	<version>1.0</version>
  <mincmsversion>2.0</mincmsversion>
	<help><![CDATA[CgoKPGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPk1vZHVsZSBhZGRzIGFkaXRpb25hbCBjb250ZW50IGJsb2NrcyBmb3IgQ01TIE1hZGUgU2ltcGxlIHYyKy4gVGhpcyBpcyBhIGZvcmsgb2YgdGhlIG9yaWdpbmFsIEVDQiBtb2R1bGUgdGhhdCB3b3JrZWQgd2l0aCBDTVNNUyB2MS48L3A+CjxwPlByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZmllbGQgdHlwZXM6PGJyPgo8b2w+CiAgIDxsaT5maWxlX3NlbGVjdG9yPC9saT4KICAgPGxpPmNvbG9yX3BpY2tlcjwvbGk+CiAgIDxsaT5kcm9wZG93bl9mcm9tX3VkdDwvbGk+CiAgIDxsaT5kcm9wZG93bjwvbGk+CiAgIDxsaT5jaGVja2JveDwvbGk+CiAgIDxsaT5tb2R1bGVfbGluazwvbGk+CiAgIDxsaT5saW5rPC9saT4KICAgPGxpPnRpbWVwaWNrZXI8L2xpPgogICA8bGk+ZGF0ZXBpY2tlcjwvbGk+CiAgIDxsaT5pbnB1dDwvbGk+CiAgIDxsaT50ZXh0YXJlYTwvbGk+CiAgIDxsaT5lZGl0b3IgKHRleHRhcmVhIHdpdGggd3lzaXd5Zyk8L2xpPgogICA8bGk+dGV4dCA8L2xpPgogICA8bGk+cGFnZXMgPC9saT4KICAgPGxpPmhyIChob3Jpem9udGFsIGxpbmUpPC9saT4KICAgPGxpPnNvcnRhYmxlbGlzdDwvbGk+CiAgIDxsaT5yYWRpbyA8c3BhbiBzdHlsZT0iY29sb3I6cmVkOyI+bmV3PC9zcGFuPjwvbGk+Cjwvb2w+CjwvcD48YnI+Cgo8cD5JZiB5b3UgbGlrZSB0aGlzIG1vZHVsZSBwbGVhc2UgPGEgaHJlZj0iaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZy9hYm91dC1saW5rL2RvbmF0aW9ucy8iIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsiPmRvbmF0ZSB0byBDTVNNUzwvYT48L3A+PGJyPgoKPGgzPkZpZWxkczwvaDM+Cgo8cD48c3Ryb25nPmZpbGVfc2VsZWN0b3I8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6ICB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0iZmlsZV9zZWxlY3RvciIgYmxvY2s9InRlc3QxMCIgZGlyPSJpbWFnZXMiIGZpbGV0eXBlcz0ianBnLGdpZixwbmciIGV4Y2x1ZGVwcmVmaXg9InRodW1iXyJ9ICAgICAgICA8L3A+CjxwPlBhcmFtZXRlcnM6CmZpbGV0eXBlcyAtIGNvbW1hIHNlcGFyYXRlZDxiciAvPgpkaXIgKG9wdGlvbmFsKSAtIGRlZmF1bHQgdXBsb2Fkcy88YnIgLz4KZXhjbHVkZXByZWZpeCAob3B0aW9uYWwpPGJyIC8+CnJlY3Vyc2UgKG9wdGlvbmFsKTxiciAvPgpzb3J0ZmlsZXMgKG9wdGlvbmFsKQpwcmV2aWV3IChvcHRpb25hbCkgLSBvbmx5IGZvciBpbWFnZXMKPC9wPjxicj4KCjxwPjxzdHJvbmc+Y29sb3JfcGlja2VyPC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiAge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9ImNvbG9yX3BpY2tlciIgYmxvY2s9InRlc3QxIiBsYWJlbD0iQ29sb3IiIGRlZmF1bHRfdmFsdWU9IiMwMDAwMDAifTwvcD4KPHA+UGFyYW1ldGVyczoKZGVmYXVsdF92YWx1ZSAob3B0aW9uYWwpPGJyIC8+CnNpemUgKG9wdGlvbmFsKSAtIGRlZmF1bHQgMTAKPC9wPjxicj4KCjxwPjxzdHJvbmc+ZHJvcGRvd25fZnJvbV91ZHQ8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJkcm9wZG93bl9mcm9tX3VkdCIgYmxvY2s9InRlc3QyIiBsYWJlbD0iR2FsbGVyeSIgdWR0PSJteWN1c3RvbXVkdCIgIGZpcnN0X3ZhbHVlPSI9c2VsZWN0PSJ9PC9wPgo8cD5PdXB1dCBmcm9tIFVEVCBtdXN0IGJlIGFycmF5KCkgLSBleGFtcGxlOiByZXR1cm4gYXJyYXkoImxhYmVsIj0+InZhbHVlIiwgImxhYmVsIDIgIj0+InZhbHVlIDIiKTwvcD4KPHA+UGFyYW1ldGVyczoKdWR0IChyZXF1aXJlZCkgLSB1ZHQgbmFtZTxiciAvPgpmaXJzdF92YWx1ZSAob3B0aW9uYWwpIDxiciAvPgptdWx0aXBsZSAob3B0aW9uYWwpIC0gYWRkIG11bHRpcGxlIG9wdGlvbiBzZWxlY3Qgc3VwcG9ydDxiciAvPgpzaXplIChvcHRpb25hbCkgLSBtdWx0aXBsZSBlbmFibGVkIG9ubHkKPC9wPgo8cD48c3Ryb25nPkV4YW1wbGVzIFVEVDwvc3Ryb25nPjoKPGJyIC8+CjxhIGhyZWY9Imh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2t1em1hbnkvNjc3OWMxOTNiODEwNGFhNmFiZmUiPkdhbGxlcnkgbGlzdCBmcm9tIEdhbGxlcnkgbW9kdWxlPC9hPiA8YnIgLz4KPGEgaHJlZj0iaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20va3V6bWFueS80NjQyNzZlMTZmM2I3NGMwNzU1NSI+R3JvdXAgbGlzdCBmcm9tIEZFVTwvYT4gPGJyIC8+CjxhIGhyZWY9Imh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2t1em1hbnkvNTE1ODNjNjQzOWNiMDQxNjc5YTYiPlVzZXJzIGxpc3QgZnJvbSBGRVU8L2E+CjwvcD48YnI+Cgo8cD48c3Ryb25nPmRyb3Bkb3duPC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0iZHJvcGRvd24iIGJsb2NrPSJ0ZXN0NSIgbGFiZWw9IkZydWl0IiAgdmFsdWVzPSJBcHBsZT1hcHBsZSxPcmFuZ2U9b3JhbmdlIiBmaXJzdF92YWx1ZT0ic2VsZWN0IGZydWl0In08L3A+CjxwPlBhcmFtZXRlcnM6CnZhbHVlcyAocmVxdWlyZWQpIC0gY29tbWEgc2VwYXJhdGVkLiBFeGFtcGxlOiBBcHBsZT1hcHBsZSxPcmFuZ2U9b3JhbmdlLEdyZWVuPWdyZWVuIDxiciAvPgpmaXJzdF92YWx1ZSAob3B0aW9uYWwpPGJyIC8+Cm11bHRpcGxlIChvcHRpb25hbCkgLSBhZGQgbXVsdGlwbGUgb3B0aW9uIHNlbGVjdCBzdXBwb3J0PGJyIC8+CnNpemUgKG9wdGlvbmFsKSAtIG11bHRpcGxlIGVuYWJsZWQgb25seQo8L3A+PGJyPgoKPHA+PHN0cm9uZz5jaGVja2JveDwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9ImNoZWNrYm94IiBibG9jaz0idGVzdDExIiBsYWJlbD0iQ2hlY2tib3giICBkZWZhdWx0X3ZhbHVlPSIxIn08L3A+CjxwPlBhcmFtZXRlcnM6CmRlZmF1bHRfdmFsdWUgKG9wdGlvbmFsKQo8L3A+PGJyPgoKPHA+PHN0cm9uZz5tb2R1bGVfbGluazwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9Im1vZHVsZV9saW5rIiBsYWJlbD0iTW9kdWxlIGVkaXQiIGJsb2NrPSJ0ZXN0MyIgIG1vZD0iQ2F0YWxvZ2VyIiB0ZXh0PSJFZGl0IGNhdGFsb2ciIH08L3A+CjxwPlBhcmFtZXRlcnM6Cm1vZCAocmVxdWlyZWQpIDxiciAvPgp0ZXh0IChyZXF1aXJlZCkgPGJyIC8+CnRhcmdldCAob3B0aW9uYWwpIC0gZGVmYXVsdCBfc2VsZgo8L3A+PGJyPgoKPHA+PHN0cm9uZz5saW5rPC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0ibGluayIgbGFiZWw9IlNlYXJjaCIgYmxvY2s9InRlc3Q0IiB0YXJnZXQ9Il9ibGFuayIgbGluaz0iaHR0cDovL3d3dy5iaW5nLmNvbSIgdGV4dD0iYmluZyBzZWFyY2gifTwvcD4KPHA+UGFyYW1ldGVyczoKbGluayAocmVxdWlyZWQpIDxiciAvPgp0ZXh0IChyZXF1aXJlZCkgPGJyIC8+CnRhcmdldCAob3B0aW9uYWwpIC0gZGVmYXVsdCBfc2VsZgo8L3A+PGJyPgoKPHA+PHN0cm9uZz50aW1lcGlja2VyPC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0idGltZXBpY2tlciIgbGFiZWw9IlRpbWUiIGJsb2NrPSJ0ZXN0NDUifTwvcD4KPHA+UGFyYW1ldGVyczoKc2l6ZSAob3B0aW9uYWwpIGRlZmF1bHQgMTAwPGJyIC8+CnRpbWVfZm9ybWF0IChvcHRpb25hbCkgZGVmYXVsdCBISDo6c3M8YnIgLz4KbWF4X2xlbmd0aCAob3B0aW9uYWwpIGRlZmF1bHQgMTAgPGJyIC8+CjwvcD48YnI+Cgo8cD48c3Ryb25nPmRhdGVwaWNrZXI8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJkYXRlcGlja2VyIiBsYWJlbD0iRGF0ZSIgYmxvY2s9InRlc3Q0NCJ9PC9wPgo8cD5QYXJhbWV0ZXJzOgpzaXplIChvcHRpb25hbCkgZGVmYXVsdCAxMDA8YnIgLz4KZGF0ZV9mb3JtYXQgKG9wdGlvbmFsKSBkZWZhdWx0IHl5LW1tLWRkPGJyIC8+CnRpbWUgKG9wdGlvbmFsKSAtIGFkZCB0aW1lIHBpY2tlciBkZWZhdWx0IDA8YnIgLz4KdGltZV9mb3JtYXQgKG9wdGlvbmFsKSBkZWZhdWx0IEhIOjpzczxiciAvPgptYXhfbGVuZ3RoIChvcHRpb25hbCkgZGVmYXVsdCAxMCA8YnIgLz4KPC9wPjxicj4KCjxwPjxzdHJvbmc+aW5wdXQ8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJpbnB1dCIgbGFiZWw9IlRleHQiIGJsb2NrPSJ0ZXN0NSIgc2l6ZT01NSBtYXhfbGVuZ3RoPTU1IGRlZmF1bHRfdmFsdWU9ImZpbGwgaXQifTwvcD4KPHA+UGFyYW1ldGVyczoKc2l6ZSAob3B0aW9uYWwpIGRlZmF1bHQgMzA8YnIgLz4KbWF4X2xlbmd0aCAob3B0aW9uYWwpIGRlZmF1bHQgMjU1IDxiciAvPgpkZWZhdWx0X3ZhbHVlIChvcHRpb25hbCkgLSBkZWZhdWx0IHZhbHVlIGZvciBpbnB1dAo8L3A+PGJyPgoKPHA+PHN0cm9uZz50ZXh0YXJlYTwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9InRleHRhcmVhIiBsYWJlbD0iVGV4dGFyZWEiIGJsb2NrPSJ0ZXN0NiIgcm93cz0xMCBjb2xzPTQwIGRlZmF1bHRfdmFsdWU9ImZpbGwgaXQifTwvcD4KPHA+UGFyYW1ldGVyczoKcm93cyAob3B0aW9uYWwpIGRlZmF1bHQgMjA8YnIgLz4KY29scyAob3B0aW9uYWwpIGRlZmF1bHQgODAgPGJyIC8+CmRlZmF1bHRfdmFsdWUgKG9wdGlvbmFsKSAtIGRlZmF1bHQgdmFsdWUgZm9yIHRleHRhcmVhCjwvcD48YnI+Cgo8cD48c3Ryb25nPmVkaXRvciAodGV4dGFyZWEgd2l0aCB3eXNpd3lnKTwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9ImVkaXRvciIgbGFiZWw9IlRleHRhcmVhIiBibG9jaz0idGVzdDciIHJvd3M9MTAgY29scz00MCBkZWZhdWx0X3ZhbHVlPSJmaWxsIGl0In08L3A+CjxwPlBhcmFtZXRlcnM6CnJvd3MgKG9wdGlvbmFsKSBkZWZhdWx0IDIwPGJyIC8+CmNvbHMgKG9wdGlvbmFsKSBkZWZhdWx0IDgwIDxiciAvPgpkZWZhdWx0X3ZhbHVlIChvcHRpb25hbCkgLSBkZWZhdWx0IHZhbHVlIGZvciB0ZXh0YXJlYQo8L3A+PGJyPgoKPHA+PHN0cm9uZz50ZXh0IDwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9InRleHQiIGxhYmVsPSJUZXh0IiBibG9jaz0idGVzdDgiIHRleHQ9IkhlbGxvIHdvcmQhIn08L3A+CjxwPlBhcmFtZXRlcnM6CnRleHQgKHJlcXVpcmVkKSB0ZXh0IGluIGFkbWluIChhZGQgaW5mb3JtYXRpb24gZm9yIHVzZXJzLCBQcm9jZXNzVGVtcGxhdGVGcm9tRGF0YSk8YnIgLz4KPC9wPjxicj4KCjxwPjxzdHJvbmc+cGFnZXMgPC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0icGFnZXMiIGxhYmVsPSJQYWdlIiBibG9jaz0idGVzdDEwIn0KPC9wPjxicj4KCjxwPjxzdHJvbmc+aHIgKGhvcml6b250YWwgbGluZSk8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJociIgbGFiZWw9Ik90aGVyIGJsb2NrcyIgYmxvY2s9ImJsb2NrbmFtZSJ9CjwvcD48YnI+Cgo8cD48c3Ryb25nPnNvcnRhYmxlbGlzdDwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9InNvcnRhYmxlbGlzdCIgYmxvY2s9InRlc3Rzb3J0YWJsZWxpc3QiIGxhYmVsPSJDaG9vc2UgZnJ1aXQiIHVkdD0ibXlkdXQifTwvcD4KPHA+UGFyYW1ldGVyczoKdmFsdWVzIChvcHRpb25hbCkgLSBjb21tYSBzZXBhcmF0ZWQuIEV4YW1wbGU6IEFwcGxlPWFwcGxlLE9yYW5nZT1vcmFuZ2UsR3JlZW49Z3JlZW4gPGJyIC8+CnVkdCAob3B0aW9uYWwpIC0gdWR0PGJyIC8+CmZpcnN0X3ZhbHVlIChvcHRpb25hbCk8YnIgLz4KYWxsb3dkdXBsaWNhdGVzIChvcHRpb25hbCktIGRlZmF1bHQgdHJ1ZTxiciAvPgptYXhfc2VsZWN0ZWQgKG9wdGlvbmFsKSAtIGRlZmF1bHQgLTE8YnIgLz4KdGVtcGxhdGUgKG9wdGlvbmFsKSAtIGZyb20gQ0dFeHRlbnNpb25zIG1vZHVsZTxiciAvPgpsYWJlbF9sZWZ0IChvcHRpb25hbCk8YnIgLz4KbGFiZWxfcmlnaHQgKG9wdGlvbmFsKTxiciAvPgo8L3A+PGJyPgoKPHA+PHN0cm9uZz5yYWRpbzwvc3Ryb25nPiA8c3BhbiBzdHlsZT0iY29sb3I6cmVkOyI+bmV3PC9zcGFuPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9InJhZGlvIiBibG9jaz0idGVzdDE3IiBsYWJlbD0iRnJ1aXQiIHZhbHVlcz0iQXBwbGU9YXBwbGUsT3JhbmdlPW9yYW5nZSxLaXdpZnJ1aXQ9a2l3aWZydWl0IiBkZWZhdWx0X3ZhbHVlPSJPcmFuZ2UifTwvcD4KPHA+UGFyYW1ldGVyczoKdmFsdWVzIChyZXF1aXJlZCkgLSBjb21tYSBzZXBhcmF0ZWQuIEV4YW1wbGU6IEFwcGxlPWFwcGxlLE9yYW5nZT1vcmFuZ2UsS2l3aWZydWl0PWtpd2lmcnVpdDxicj4KZGVmYXVsdF92YWx1ZSAob3B0aW9uYWwpIC0gZGVmYXVsdCBpcyBmaXJzdCBjaG9pY2UgLSBzZXQgdG8gZGVmYXVsdCB2YWx1ZSBlLmcuICJPcmFuZ2UiCmlubGluZSAob3B0aW9uYWwpIC0gaWYgc2V0IGRpc3BsYXlzIGFkbWluIHJhZGlvIGJ1dHRvbnMgaW5saW5lPGJyPgo8L3A+PGJyPgoKCjxoMz5VcGdyYWRlIGZyb20gRUNCPC9oMz4KPHA+SW5zdGFsbCBFQ0IyIG1vZHVsZSBhbmQgY2hhbmdlIGFsbCAibW9kdWxlIiBwYXJhbWV0ZXJzLCBpbiBjb250ZW50X21vZHVsZSB0YWdzIHRvIGJlIG1vZHVsZT0iRUNCMiIgKHdhcyAiRUNCIikuIFRoZW4gRUNCIGNhbiBiZSB1bmluc3RhbGxlZC48L3A+PGJyPgoKCjxoMz5EZXBlbmRlbmNpZXM8L2gzPjx1bD48bGk+Q0dFeHRlbnNpb25zID0mZ3Q7IDEuMzg8L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBDaHJpcyBUYXlsb3IgKHR3aXR0ZXIuY29tL0tpd2lDaHJpc0JUKSAmbHQ7Y2hyaXNAYmlubm92YXRpdmUuY28udWsmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMS4wPGJyIC8+PGJyIC8+Q2hhbmdlIEhpc3Rvcnk6PGJyIC8+PGgzPlZlcnNpb24gMS4wIC0gMTVBcHIxNjwvaDM+Cjx1bD4KICAgIDxsaT5Jbml0aWFsIHJlbGVhc2UuIEEgZm9yayBvZiBFQ0IgbW9kdWxlIHYxLjYsIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIENNU01TIHYyKzwvbGk+CiAgICA8bGk+QWRkZWQgcmFkaW8gZmllbGQgLSB0byBwcm92aWRlIHJhZGlvIGJ1dHRvbnMgb24gYW4gYWRtaW4gcGFnZTwvbGk+CjwvdWw+PGJyIC8+]]></about>
	<description><![CDATA[This module adds new content  blocks to CMS Made Simple v2+]]></description>
	<requires>
	  <requiredname>CGExtensions</requiredname>
	  <requiredversion>1.38</requiredversion>
	</requires>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIwojIEVDQjIgLSBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAyCiMKIyBtYWludGFpbmVkIGJ5IENocmlzIFRheWxvciwgPGNocmlzQGJpbm5vdmF0aXZlLmNvLnVrPiwgc2luY2UgMjAxNgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBBIGZvcmsgb2YgbW9kdWxlOiBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAoRUNCKQojIE9yaWdpbmFsIEF1dGhvcjogWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIC8ga3V6bWFueS5iaXogIC8gdHdpdHRlci5jb20va3V6bWFueQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDkgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NrZWxldG9uLwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgppZiAoIWlzc2V0KCRnQ21zKSkKICAgIGV4aXQ7CgojIyBub3RoaW5nCgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIwojIEVDQjIgLSBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAyCiMKIyBtYWludGFpbmVkIGJ5IENocmlzIFRheWxvciwgPGNocmlzQGJpbm5vdmF0aXZlLmNvLnVrPiwgc2luY2UgMjAxNgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBBIGZvcmsgb2YgbW9kdWxlOiBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAoRUNCKQojIE9yaWdpbmFsIEF1dGhvcjogWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIC8ga3V6bWFueS5iaXogIC8gdHdpdHRlci5jb20va3V6bWFueQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDkgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NrZWxldG9uLwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgppZiAoIWlzc2V0KCRnQ21zKSkKICAgIGV4aXQ7CgoKZWNobyAkdGhpcy0+TGFuZygnaGVscCcpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.refresh.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIwojIEVDQjIgLSBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAyCiMKIyBtYWludGFpbmVkIGJ5IENocmlzIFRheWxvciwgPGNocmlzQGJpbm5vdmF0aXZlLmNvLnVrPiwgc2luY2UgMjAxNgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBBIGZvcmsgb2YgbW9kdWxlOiBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAoRUNCKQojIE9yaWdpbmFsIEF1dGhvcjogWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIC8ga3V6bWFueS5iaXogIC8gdHdpdHRlci5jb20va3V6bWFueQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDkgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NrZWxldG9uLwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgppZiAoIWlzc2V0KCRnQ21zKSkKICAgIGV4aXQ7CgoKaWYgKCFpc3NldCgkcGFyYW1zWydibG9ja19uYW1lJ10pIHx8ICFpc3NldCgkcGFyYW1zWyd2YWx1ZSddKSB8fCAhaXNzZXQoJHBhcmFtc1snYWRkaW5nJ10pKQogICAgcmV0dXJuOwoKJGJsb2NrTmFtZSA9ICRwYXJhbXNbJ2Jsb2NrX25hbWUnXTsKJHZhbHVlID0gJHBhcmFtc1sndmFsdWUnXTsKJGFkZGluZyA9ICRwYXJhbXNbJ2FkZGluZyddOwoKCiRlY2IyID0gbmV3IGVjYjJfdG9vbHMoJGJsb2NrTmFtZSwgJHZhbHVlLCAkcGFyYW1zLCAkYWRkaW5nKTsKZWNobyAkZWNiMi0+Z2V0X2NvbnRlbnRfYmxvY2tfaW5wdXQoKTsKCiMjIG5vdGhpbmcKPz4=]]></data>
	</file>
	<file>
	  <filename>/changelog.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgzPlZlcnNpb24gMS4wIC0gMTVBcHIxNjwvaDM+Cjx1bD4KICAgIDxsaT5Jbml0aWFsIHJlbGVhc2UuIEEgZm9yayBvZiBFQ0IgbW9kdWxlIHYxLjYsIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIENNU01TIHYyKzwvbGk+CiAgICA8bGk+QWRkZWQgcmFkaW8gZmllbGQgLSB0byBwcm92aWRlIHJhZGlvIGJ1dHRvbnMgb24gYW4gYWRtaW4gcGFnZTwvbGk+CjwvdWw+]]></data>
	</file>
	<file>
	  <filename>/ECB2.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIwojIEVDQjIgLSBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAyCiMKIyBtYWludGFpbmVkIGJ5IENocmlzIFRheWxvciwgPGNocmlzQGJpbm5vdmF0aXZlLmNvLnVrPiwgc2luY2UgMjAxNgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBBIGZvcmsgb2YgbW9kdWxlOiBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAoRUNCKQojIE9yaWdpbmFsIEF1dGhvcjogWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIC8ga3V6bWFueS5iaXogIC8gdHdpdHRlci5jb20va3V6bWFueQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDkgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NrZWxldG9uLwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgpkZWZpbmUoJ1VTRV9FQ0IyJywgJ1VzZSBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAyJyk7CgpjbGFzcyBFQ0IyIGV4dGVuZHMgQ0dFeHRlbnNpb25zIHsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7CiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpIHsgcmV0dXJuICcyLjAnOyB9CiAgICBwdWJsaWMgZnVuY3Rpb24gTGF6eUxvYWRGcm9udGVuZCgpIHsgcmV0dXJuIFRSVUU7ICAgfQogICAgcHVibGljIGZ1bmN0aW9uIEdldE5hbWUoKSB7IHJldHVybiAnRUNCMic7ICB9CiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkgeyByZXR1cm4gJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpOyB9CiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0VmVyc2lvbigpIHsgcmV0dXJuICcxLjAnOyB9CiAgICBwdWJsaWMgZnVuY3Rpb24gSW5pdGlhbGl6ZUFkbWluKCkgeyAkdGhpcy0+QWRkSW1hZ2VEaXIoJ2ljb25zJyk7IH0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRIZWxwKCkgeyByZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTsgfQogICAgcHVibGljIGZ1bmN0aW9uIEdldEF1dGhvcigpIHsgcmV0dXJuICdDaHJpcyBUYXlsb3IgKHR3aXR0ZXIuY29tL0tpd2lDaHJpc0JUKSc7IH0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpIHsgcmV0dXJuICdjaHJpc0BiaW5ub3ZhdGl2ZS5jby51ayc7IH0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRDaGFuZ2VMb2coKSB7IHJldHVybiBmaWxlX2dldF9jb250ZW50cyhkaXJuYW1lKF9fZmlsZV9fKSAuICcvY2hhbmdlbG9nLmluYycpOyB9CiAgICBwdWJsaWMgZnVuY3Rpb24gSGFzQWRtaW4oKSB7IHJldHVybiBUUlVFO30KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKSB7IHJldHVybiAnZXh0ZW5zaW9ucyc7fQogICAgcHVibGljIGZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKSB7IHJldHVybiAkdGhpcy0+TGFuZygnYWRtaW5kZXNjcmlwdGlvbicpOyB9CiAgICBwdWJsaWMgZnVuY3Rpb24gVmlzaWJsZVRvQWRtaW5Vc2VyKCkgeyByZXR1cm4gKCR0aGlzLT5DaGVja0FjY2VzcygpKTsgfQogICAgcHVibGljIGZ1bmN0aW9uIENoZWNrQWNjZXNzKCRwZXJtID0gVVNFX0VDQjIpIHsgcmV0dXJuICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJHBlcm0pOyB9CiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0RGVwZW5kZW5jaWVzKCkgeyByZXR1cm4gYXJyYXkoJ0NHRXh0ZW5zaW9ucycgPT4gJzEuMzgnKTt9CiAgICBwdWJsaWMgZnVuY3Rpb24gSW5zdGFsbFBvc3RNZXNzYWdlKCkgeyByZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3RpbnN0YWxsJyk7fQogICAgcHVibGljIGZ1bmN0aW9uIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCkgeyByZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3R1bmluc3RhbGwnKTt9CiAgICBwdWJsaWMgZnVuY3Rpb24gVW5pbnN0YWxsUHJlTWVzc2FnZSgpIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdyZWFsbHlfdW5pbnN0YWxsJyk7fQoKICAgIHB1YmxpYyBmdW5jdGlvbiBJbml0aWFsaXplRnJvbnRlbmQoKSB7CiAgICAgICAgJHRoaXMtPlJlZ2lzdGVyTW9kdWxlUGx1Z2luKCk7CiAgICAgICAgJHRoaXMtPlJlc3RyaWN0VW5rbm93blBhcmFtcygpOwoKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnYmxvY2tfbmFtZScsIENMRUFOX1NUUklORyk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ3ZhbHVlJywgQ0xFQU5fU1RSSU5HKTsKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnYWRkaW5nJywgQ0xFQU5fU1RSSU5HKTsKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnc29ydGZpbGVzJywgQ0xFQU5fU1RSSU5HKTsKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnZXhjbHVkZXByZWZpeCcsIENMRUFOX1NUUklORyk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ3JlY3Vyc2UnLCBDTEVBTl9TVFJJTkcpOwogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdmaWxldHlwZXMnLCBDTEVBTl9TVFJJTkcpOwogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdmaWVsZCcsIENMRUFOX1NUUklORyk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2RpcicsIENMRUFOX1NUUklORyk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ3ByZXZpZXcnLCBDTEVBTl9TVFJJTkcpOwogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdkYXRlX2Zvcm1hdCcsIENMRUFOX1NUUklORyk7CgogICAgfQoKCiAgICAvKioKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcvYXBpZG9jL0NNUy9DTVNNb2R1bGUuaHRtbCNIYXNDYXBhYmlsaXR5CiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgIGZ1bmN0aW9uIEhhc0NhcGFiaWxpdHkoJGNhcGFiaWxpdHksICRwYXJhbXMgPSBhcnJheSgpKSB7CiAgICAgICAgc3dpdGNoICgkY2FwYWJpbGl0eSkgewogICAgICAgICAgICBjYXNlICdjb250ZW50YmxvY2tzJzoKICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBjb250ZW50IGJsb2NrCiAgICAvKioKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcvQVBJRE9DMl8wL2NsYXNzZXMvQ01TTW9kdWxlLmh0bWwjbWV0aG9kX0dldENvbnRlbnRCbG9ja0ZpZWxkSW5wdXQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIEdldENvbnRlbnRCbG9ja0ZpZWxkSW5wdXQoJGJsb2NrTmFtZSwgJHZhbHVlLCAkcGFyYW1zLCAkYWRkaW5nPWZhbHNlLCBDb250ZW50QmFzZSAkY29udGVudF9vYmopIHsKICAgIC8vIENUIE1PRCAtIDEyRmViMTYKICAgIC8vIHdhczogICBwdWJsaWMgZnVuY3Rpb24gR2V0Q29udGVudEJsb2NrSW5wdXQoJGJsb2NrTmFtZSwgJHZhbHVlLCAkcGFyYW1zLCAkYWRkaW5nPWZhbHNlKSB7CiAgICAgICAgJGVjYjIgPSBuZXcgZWNiMl90b29scygkYmxvY2tOYW1lLCAkdmFsdWUsICRwYXJhbXMsICRhZGRpbmcpOwogICAgICAgIHJldHVybiAkZWNiMi0+Z2V0X2NvbnRlbnRfYmxvY2tfaW5wdXQoKTsKICAgIH0KCn0KCj8+]]></data>
	</file>
	<file>
	  <filename>/icons/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/icons/ajax-refresh-icon.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAMQAAP///wAAAPj4+Dg4OISEhAYGBiYmJtbW1qioqBYWFnZ2dmZmZuTk5JiYmMbGxkhISFZWVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAAVQICCOZGmepTAUbCEqhGCqrZgUxpEaNYDwBtmIgFuNBDwCaYVQkRCFAYmFoo6sKSyASVr4oiRi8LpIkpA4hKg1Jh14iTVrIDwTFPJ5HcXvj0IAOw==]]></data>
	</file>
	<file>
	  <filename>/icons/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAyJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnRXh0ZW5kZWQgQ29udGVudCBCbG9ja3MgMiB3YXMgc3VjY2Vzc2Z1bCBpbnN0YWxsZWQnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0V4dGVuZGVkIENvbnRlbnQgQmxvY2tzIDIgd2FzIHN1Y2Nlc3NmdWwgdW5pbnN0YWxsZWQnOwokbGFuZ1sncmVhbGx5X3VuaW5zdGFsbCddID0gJ1JlYWxseT8gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHVuc2luc3RhbGwgdGhpcyBmaW5lIG1vZHVsZT8nOwokbGFuZ1sndW5pbnN0YWxsZWQnXSA9ICdNb2R1bGUgVW5pbnN0YWxsZWQuJzsKJGxhbmdbJ2luc3RhbGxlZCddID0gJ01vZHVsZSB2ZXJzaW9uICVzIGluc3RhbGxlZC4nOwokbGFuZ1sndXBncmFkZWQnXSA9ICdNb2R1bGUgdXBncmFkZWQgdG8gdmVyc2lvbiAlcy4nOwokbGFuZ1snYWRtaW5kZXNjcmlwdGlvbiddID0gJ1RoaXMgbW9kdWxlIGFkZHMgbmV3IGNvbnRlbnQgIGJsb2NrcyB0byBDTVMgTWFkZSBTaW1wbGUgdjIrJzsKCgokbGFuZ1snc2VsZWN0ZWQnXSA9ICdTZWxlY3RlZCc7CiRsYW5nWydzZWxlY3QnXSA9ICdTZWxlY3QnOwokbGFuZ1sncmVmcmVzaCddID0gJ1JlZnJlc2gnOwoKJGxhbmdbJ2hlbHAnXSA9ICcKCgo8aDM+V2hhdCBEb2VzIFRoaXMgRG8/PC9oMz4KPHA+TW9kdWxlIGFkZHMgYWRpdGlvbmFsIGNvbnRlbnQgYmxvY2tzIGZvciBDTVMgTWFkZSBTaW1wbGUgdjIrLiBUaGlzIGlzIGEgZm9yayBvZiB0aGUgb3JpZ2luYWwgRUNCIG1vZHVsZSB0aGF0IHdvcmtlZCB3aXRoIENNU01TIHYxLjwvcD4KPHA+UHJvdmlkZXMgdGhlIGZvbGxvd2luZyBmaWVsZCB0eXBlczo8YnI+CjxvbD4KICAgPGxpPmZpbGVfc2VsZWN0b3I8L2xpPgogICA8bGk+Y29sb3JfcGlja2VyPC9saT4KICAgPGxpPmRyb3Bkb3duX2Zyb21fdWR0PC9saT4KICAgPGxpPmRyb3Bkb3duPC9saT4KICAgPGxpPmNoZWNrYm94PC9saT4KICAgPGxpPm1vZHVsZV9saW5rPC9saT4KICAgPGxpPmxpbms8L2xpPgogICA8bGk+dGltZXBpY2tlcjwvbGk+CiAgIDxsaT5kYXRlcGlja2VyPC9saT4KICAgPGxpPmlucHV0PC9saT4KICAgPGxpPnRleHRhcmVhPC9saT4KICAgPGxpPmVkaXRvciAodGV4dGFyZWEgd2l0aCB3eXNpd3lnKTwvbGk+CiAgIDxsaT50ZXh0IDwvbGk+CiAgIDxsaT5wYWdlcyA8L2xpPgogICA8bGk+aHIgKGhvcml6b250YWwgbGluZSk8L2xpPgogICA8bGk+c29ydGFibGVsaXN0PC9saT4KICAgPGxpPnJhZGlvIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQ7Ij5uZXc8L3NwYW4+PC9saT4KPC9vbD4KPC9wPjxicj4KCjxwPklmIHlvdSBsaWtlIHRoaXMgbW9kdWxlIHBsZWFzZSA8YSBocmVmPSJodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnL2Fib3V0LWxpbmsvZG9uYXRpb25zLyIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyI+ZG9uYXRlIHRvIENNU01TPC9hPjwvcD48YnI+Cgo8aDM+RmllbGRzPC9oMz4KCjxwPjxzdHJvbmc+ZmlsZV9zZWxlY3Rvcjwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZTogIHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJmaWxlX3NlbGVjdG9yIiBibG9jaz0idGVzdDEwIiBkaXI9ImltYWdlcyIgZmlsZXR5cGVzPSJqcGcsZ2lmLHBuZyIgZXhjbHVkZXByZWZpeD0idGh1bWJfIn0gICAgICAgIDwvcD4KPHA+UGFyYW1ldGVyczoKZmlsZXR5cGVzIC0gY29tbWEgc2VwYXJhdGVkPGJyIC8+CmRpciAob3B0aW9uYWwpIC0gZGVmYXVsdCB1cGxvYWRzLzxiciAvPgpleGNsdWRlcHJlZml4IChvcHRpb25hbCk8YnIgLz4KcmVjdXJzZSAob3B0aW9uYWwpPGJyIC8+CnNvcnRmaWxlcyAob3B0aW9uYWwpCnByZXZpZXcgKG9wdGlvbmFsKSAtIG9ubHkgZm9yIGltYWdlcwo8L3A+PGJyPgoKPHA+PHN0cm9uZz5jb2xvcl9waWNrZXI8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6ICB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0iY29sb3JfcGlja2VyIiBibG9jaz0idGVzdDEiIGxhYmVsPSJDb2xvciIgZGVmYXVsdF92YWx1ZT0iIzAwMDAwMCJ9PC9wPgo8cD5QYXJhbWV0ZXJzOgpkZWZhdWx0X3ZhbHVlIChvcHRpb25hbCk8YnIgLz4Kc2l6ZSAob3B0aW9uYWwpIC0gZGVmYXVsdCAxMAo8L3A+PGJyPgoKPHA+PHN0cm9uZz5kcm9wZG93bl9mcm9tX3VkdDwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9ImRyb3Bkb3duX2Zyb21fdWR0IiBibG9jaz0idGVzdDIiIGxhYmVsPSJHYWxsZXJ5IiB1ZHQ9Im15Y3VzdG9tdWR0IiAgZmlyc3RfdmFsdWU9Ij1zZWxlY3Q9In08L3A+CjxwPk91cHV0IGZyb20gVURUIG11c3QgYmUgYXJyYXkoKSAtIGV4YW1wbGU6IHJldHVybiBhcnJheSgibGFiZWwiPT4idmFsdWUiLCAibGFiZWwgMiAiPT4idmFsdWUgMiIpPC9wPgo8cD5QYXJhbWV0ZXJzOgp1ZHQgKHJlcXVpcmVkKSAtIHVkdCBuYW1lPGJyIC8+CmZpcnN0X3ZhbHVlIChvcHRpb25hbCkgPGJyIC8+Cm11bHRpcGxlIChvcHRpb25hbCkgLSBhZGQgbXVsdGlwbGUgb3B0aW9uIHNlbGVjdCBzdXBwb3J0PGJyIC8+CnNpemUgKG9wdGlvbmFsKSAtIG11bHRpcGxlIGVuYWJsZWQgb25seQo8L3A+CjxwPjxzdHJvbmc+RXhhbXBsZXMgVURUPC9zdHJvbmc+Ogo8YnIgLz4KPGEgaHJlZj0iaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20va3V6bWFueS82Nzc5YzE5M2I4MTA0YWE2YWJmZSI+R2FsbGVyeSBsaXN0IGZyb20gR2FsbGVyeSBtb2R1bGU8L2E+IDxiciAvPgo8YSBocmVmPSJodHRwczovL2dpc3QuZ2l0aHViLmNvbS9rdXptYW55LzQ2NDI3NmUxNmYzYjc0YzA3NTU1Ij5Hcm91cCBsaXN0IGZyb20gRkVVPC9hPiA8YnIgLz4KPGEgaHJlZj0iaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20va3V6bWFueS81MTU4M2M2NDM5Y2IwNDE2NzlhNiI+VXNlcnMgbGlzdCBmcm9tIEZFVTwvYT4KPC9wPjxicj4KCjxwPjxzdHJvbmc+ZHJvcGRvd248L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJkcm9wZG93biIgYmxvY2s9InRlc3Q1IiBsYWJlbD0iRnJ1aXQiICB2YWx1ZXM9IkFwcGxlPWFwcGxlLE9yYW5nZT1vcmFuZ2UiIGZpcnN0X3ZhbHVlPSJzZWxlY3QgZnJ1aXQifTwvcD4KPHA+UGFyYW1ldGVyczoKdmFsdWVzIChyZXF1aXJlZCkgLSBjb21tYSBzZXBhcmF0ZWQuIEV4YW1wbGU6IEFwcGxlPWFwcGxlLE9yYW5nZT1vcmFuZ2UsR3JlZW49Z3JlZW4gPGJyIC8+CmZpcnN0X3ZhbHVlIChvcHRpb25hbCk8YnIgLz4KbXVsdGlwbGUgKG9wdGlvbmFsKSAtIGFkZCBtdWx0aXBsZSBvcHRpb24gc2VsZWN0IHN1cHBvcnQ8YnIgLz4Kc2l6ZSAob3B0aW9uYWwpIC0gbXVsdGlwbGUgZW5hYmxlZCBvbmx5CjwvcD48YnI+Cgo8cD48c3Ryb25nPmNoZWNrYm94PC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0iY2hlY2tib3giIGJsb2NrPSJ0ZXN0MTEiIGxhYmVsPSJDaGVja2JveCIgIGRlZmF1bHRfdmFsdWU9IjEifTwvcD4KPHA+UGFyYW1ldGVyczoKZGVmYXVsdF92YWx1ZSAob3B0aW9uYWwpCjwvcD48YnI+Cgo8cD48c3Ryb25nPm1vZHVsZV9saW5rPC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0ibW9kdWxlX2xpbmsiIGxhYmVsPSJNb2R1bGUgZWRpdCIgYmxvY2s9InRlc3QzIiAgbW9kPSJDYXRhbG9nZXIiIHRleHQ9IkVkaXQgY2F0YWxvZyIgfTwvcD4KPHA+UGFyYW1ldGVyczoKbW9kIChyZXF1aXJlZCkgPGJyIC8+CnRleHQgKHJlcXVpcmVkKSA8YnIgLz4KdGFyZ2V0IChvcHRpb25hbCkgLSBkZWZhdWx0IF9zZWxmCjwvcD48YnI+Cgo8cD48c3Ryb25nPmxpbms8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJsaW5rIiBsYWJlbD0iU2VhcmNoIiBibG9jaz0idGVzdDQiIHRhcmdldD0iX2JsYW5rIiBsaW5rPSJodHRwOi8vd3d3LmJpbmcuY29tIiB0ZXh0PSJiaW5nIHNlYXJjaCJ9PC9wPgo8cD5QYXJhbWV0ZXJzOgpsaW5rIChyZXF1aXJlZCkgPGJyIC8+CnRleHQgKHJlcXVpcmVkKSA8YnIgLz4KdGFyZ2V0IChvcHRpb25hbCkgLSBkZWZhdWx0IF9zZWxmCjwvcD48YnI+Cgo8cD48c3Ryb25nPnRpbWVwaWNrZXI8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJ0aW1lcGlja2VyIiBsYWJlbD0iVGltZSIgYmxvY2s9InRlc3Q0NSJ9PC9wPgo8cD5QYXJhbWV0ZXJzOgpzaXplIChvcHRpb25hbCkgZGVmYXVsdCAxMDA8YnIgLz4KdGltZV9mb3JtYXQgKG9wdGlvbmFsKSBkZWZhdWx0IEhIOjpzczxiciAvPgptYXhfbGVuZ3RoIChvcHRpb25hbCkgZGVmYXVsdCAxMCA8YnIgLz4KPC9wPjxicj4KCjxwPjxzdHJvbmc+ZGF0ZXBpY2tlcjwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9ImRhdGVwaWNrZXIiIGxhYmVsPSJEYXRlIiBibG9jaz0idGVzdDQ0In08L3A+CjxwPlBhcmFtZXRlcnM6CnNpemUgKG9wdGlvbmFsKSBkZWZhdWx0IDEwMDxiciAvPgpkYXRlX2Zvcm1hdCAob3B0aW9uYWwpIGRlZmF1bHQgeXktbW0tZGQ8YnIgLz4KdGltZSAob3B0aW9uYWwpIC0gYWRkIHRpbWUgcGlja2VyIGRlZmF1bHQgMDxiciAvPgp0aW1lX2Zvcm1hdCAob3B0aW9uYWwpIGRlZmF1bHQgSEg6OnNzPGJyIC8+Cm1heF9sZW5ndGggKG9wdGlvbmFsKSBkZWZhdWx0IDEwIDxiciAvPgo8L3A+PGJyPgoKPHA+PHN0cm9uZz5pbnB1dDwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9ImlucHV0IiBsYWJlbD0iVGV4dCIgYmxvY2s9InRlc3Q1IiBzaXplPTU1IG1heF9sZW5ndGg9NTUgZGVmYXVsdF92YWx1ZT0iZmlsbCBpdCJ9PC9wPgo8cD5QYXJhbWV0ZXJzOgpzaXplIChvcHRpb25hbCkgZGVmYXVsdCAzMDxiciAvPgptYXhfbGVuZ3RoIChvcHRpb25hbCkgZGVmYXVsdCAyNTUgPGJyIC8+CmRlZmF1bHRfdmFsdWUgKG9wdGlvbmFsKSAtIGRlZmF1bHQgdmFsdWUgZm9yIGlucHV0CjwvcD48YnI+Cgo8cD48c3Ryb25nPnRleHRhcmVhPC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0idGV4dGFyZWEiIGxhYmVsPSJUZXh0YXJlYSIgYmxvY2s9InRlc3Q2IiByb3dzPTEwIGNvbHM9NDAgZGVmYXVsdF92YWx1ZT0iZmlsbCBpdCJ9PC9wPgo8cD5QYXJhbWV0ZXJzOgpyb3dzIChvcHRpb25hbCkgZGVmYXVsdCAyMDxiciAvPgpjb2xzIChvcHRpb25hbCkgZGVmYXVsdCA4MCA8YnIgLz4KZGVmYXVsdF92YWx1ZSAob3B0aW9uYWwpIC0gZGVmYXVsdCB2YWx1ZSBmb3IgdGV4dGFyZWEKPC9wPjxicj4KCjxwPjxzdHJvbmc+ZWRpdG9yICh0ZXh0YXJlYSB3aXRoIHd5c2l3eWcpPC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0iZWRpdG9yIiBsYWJlbD0iVGV4dGFyZWEiIGJsb2NrPSJ0ZXN0NyIgcm93cz0xMCBjb2xzPTQwIGRlZmF1bHRfdmFsdWU9ImZpbGwgaXQifTwvcD4KPHA+UGFyYW1ldGVyczoKcm93cyAob3B0aW9uYWwpIGRlZmF1bHQgMjA8YnIgLz4KY29scyAob3B0aW9uYWwpIGRlZmF1bHQgODAgPGJyIC8+CmRlZmF1bHRfdmFsdWUgKG9wdGlvbmFsKSAtIGRlZmF1bHQgdmFsdWUgZm9yIHRleHRhcmVhCjwvcD48YnI+Cgo8cD48c3Ryb25nPnRleHQgPC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0idGV4dCIgbGFiZWw9IlRleHQiIGJsb2NrPSJ0ZXN0OCIgdGV4dD0iSGVsbG8gd29yZCEifTwvcD4KPHA+UGFyYW1ldGVyczoKdGV4dCAocmVxdWlyZWQpIHRleHQgaW4gYWRtaW4gKGFkZCBpbmZvcm1hdGlvbiBmb3IgdXNlcnMsIFByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhKTxiciAvPgo8L3A+PGJyPgoKPHA+PHN0cm9uZz5wYWdlcyA8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJwYWdlcyIgbGFiZWw9IlBhZ2UiIGJsb2NrPSJ0ZXN0MTAifQo8L3A+PGJyPgoKPHA+PHN0cm9uZz5ociAoaG9yaXpvbnRhbCBsaW5lKTwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9ImhyIiBsYWJlbD0iT3RoZXIgYmxvY2tzIiBibG9jaz0iYmxvY2tuYW1lIn0KPC9wPjxicj4KCjxwPjxzdHJvbmc+c29ydGFibGVsaXN0PC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0ic29ydGFibGVsaXN0IiBibG9jaz0idGVzdHNvcnRhYmxlbGlzdCIgbGFiZWw9IkNob29zZSBmcnVpdCIgdWR0PSJteWR1dCJ9PC9wPgo8cD5QYXJhbWV0ZXJzOgp2YWx1ZXMgKG9wdGlvbmFsKSAtIGNvbW1hIHNlcGFyYXRlZC4gRXhhbXBsZTogQXBwbGU9YXBwbGUsT3JhbmdlPW9yYW5nZSxHcmVlbj1ncmVlbiA8YnIgLz4KdWR0IChvcHRpb25hbCkgLSB1ZHQ8YnIgLz4KZmlyc3RfdmFsdWUgKG9wdGlvbmFsKTxiciAvPgphbGxvd2R1cGxpY2F0ZXMgKG9wdGlvbmFsKS0gZGVmYXVsdCB0cnVlPGJyIC8+Cm1heF9zZWxlY3RlZCAob3B0aW9uYWwpIC0gZGVmYXVsdCAtMTxiciAvPgp0ZW1wbGF0ZSAob3B0aW9uYWwpIC0gZnJvbSBDR0V4dGVuc2lvbnMgbW9kdWxlPGJyIC8+CmxhYmVsX2xlZnQgKG9wdGlvbmFsKTxiciAvPgpsYWJlbF9yaWdodCAob3B0aW9uYWwpPGJyIC8+CjwvcD48YnI+Cgo8cD48c3Ryb25nPnJhZGlvPC9zdHJvbmc+IDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQ7Ij5uZXc8L3NwYW4+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0icmFkaW8iIGJsb2NrPSJ0ZXN0MTciIGxhYmVsPSJGcnVpdCIgdmFsdWVzPSJBcHBsZT1hcHBsZSxPcmFuZ2U9b3JhbmdlLEtpd2lmcnVpdD1raXdpZnJ1aXQiIGRlZmF1bHRfdmFsdWU9Ik9yYW5nZSJ9PC9wPgo8cD5QYXJhbWV0ZXJzOgp2YWx1ZXMgKHJlcXVpcmVkKSAtIGNvbW1hIHNlcGFyYXRlZC4gRXhhbXBsZTogQXBwbGU9YXBwbGUsT3JhbmdlPW9yYW5nZSxLaXdpZnJ1aXQ9a2l3aWZydWl0PGJyPgpkZWZhdWx0X3ZhbHVlIChvcHRpb25hbCkgLSBkZWZhdWx0IGlzIGZpcnN0IGNob2ljZSAtIHNldCB0byBkZWZhdWx0IHZhbHVlIGUuZy4gIk9yYW5nZSIKaW5saW5lIChvcHRpb25hbCkgLSBpZiBzZXQgZGlzcGxheXMgYWRtaW4gcmFkaW8gYnV0dG9ucyBpbmxpbmU8YnI+CjwvcD48YnI+CgoKPGgzPlVwZ3JhZGUgZnJvbSBFQ0I8L2gzPgo8cD5JbnN0YWxsIEVDQjIgbW9kdWxlIGFuZCBjaGFuZ2UgYWxsICJtb2R1bGUiIHBhcmFtZXRlcnMsIGluIGNvbnRlbnRfbW9kdWxlIHRhZ3MgdG8gYmUgbW9kdWxlPSJFQ0IyIiAod2FzICJFQ0IiKS4gVGhlbiBFQ0IgY2FuIGJlIHVuaW5zdGFsbGVkLjwvcD48YnI+CgoKJzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.ecb2_tools.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIwojIEVDQjIgLSBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAyCiMKIyBtYWludGFpbmVkIGJ5IENocmlzIFRheWxvciwgPGNocmlzQGJpbm5vdmF0aXZlLmNvLnVrPiwgc2luY2UgMjAxNgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBBIGZvcmsgb2YgbW9kdWxlOiBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAoRUNCKQojIE9yaWdpbmFsIEF1dGhvcjogWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIC8ga3V6bWFueS5iaXogIC8gdHdpdHRlci5jb20va3V6bWFueQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDkgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NrZWxldG9uLwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgpjbGFzcyBlY2IyX3Rvb2xzIHsKCiAgICBwcml2YXRlICRibG9ja19uYW1lID0gJyc7CiAgICBwcml2YXRlICR2YWx1ZSA9ICcnOwogICAgcHJpdmF0ZSAkYWRkaW5nID0gZmFsc2U7CiAgICBwcml2YXRlICRvcHRpb25zID0gYXJyYXkoKTsKICAgIHByaXZhdGUgJGFsaWFzID0gJyc7CiAgICBwcml2YXRlICRmaWVsZCA9ICcnOwogICAgcHJpdmF0ZSAkdHh0ID0gJyc7CiAgICBwcml2YXRlICRpc19jb2xvcl9waWNrZXJfbGliX2xvYWQgPSBmYWxzZTsKICAgIHByaXZhdGUgJGlzX2RhdGVwaWNrZXJfbGliX2xvYWQgPSBmYWxzZTsKCiAgICAvKioKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaWJuZyAkYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHBhcmFtIGFycmF5ICRwYXJhbXMKICAgICAqIEBwYXJhbSBib29sZWFuICRhZGRpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRibG9ja05hbWUsICR2YWx1ZSwgJHBhcmFtcywgJGFkZGluZykgewoKICAgICAgICAkdGhpcy0+YmxvY2tfbmFtZSA9ICRibG9ja05hbWU7CiAgICAgICAgJHRoaXMtPmFsaWFzID0gbXVuZ2Vfc3RyaW5nX3RvX3VybCgkYmxvY2tOYW1lLCB0cnVlKTsKICAgICAgICAkdGhpcy0+dmFsdWUgPSAkdmFsdWU7CiAgICAgICAgJHRoaXMtPmFkZGluZyA9ICRhZGRpbmc7CgogICAgICAgICR0aGlzLT5nZXRfZXh0cmFfb3B0aW9ucygkcGFyYW1zKTsKCiAgICAgICAgaWYgKCRhZGRpbmcgPT0gdHJ1ZSAmJiBpc1NldCgkdGhpcy0+b3B0aW9uc1siZGVmYXVsdF92YWx1ZSJdKSAmJiBlbXB0eSgkdmFsdWUpID09IHRydWUpCiAgICAgICAgICAgICR0aGlzLT52YWx1ZSA9ICRwYXJhbXNbImRlZmF1bHRfdmFsdWUiXTsKICAgIH0KCiAgICAvKioKICAgICAqICBnZXQgY29udGVudCBibG9jawogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldF9jb250ZW50X2Jsb2NrX2lucHV0KCkgewogICAgICAgICRmdW5jdGlvbiA9ICdnZXRfJyAuICR0aGlzLT5maWVsZDsKICAgICAgICByZXR1cm4gJHRoaXMtPiRmdW5jdGlvbigpOwogICAgfQoKICAgIC8qKgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X3RleHRhcmVhKCkgewogICAgICAgICR0bXAgPSAnPHRleHRhcmVhIG5hbWU9IiVzIiByb3dzPSIlZCIgY29scz0iJWQiPiVzPC90ZXh0YXJlYT4nOwogICAgICAgIHJldHVybiBzcHJpbnRmKCR0bXAsICR0aGlzLT5ibG9ja19uYW1lLCAkdGhpcy0+b3B0aW9uc1sicm93cyJdLCAkdGhpcy0+b3B0aW9uc1siY29scyJdLCAkdGhpcy0+dmFsdWUpOwogICAgfQoKICAgIC8qKgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X3BhZ2VzKCkgewogICAgICAgICRjb250ZW50b3BzID0gY21zbXMoKS0+R2V0Q29udGVudE9wZXJhdGlvbnMoKTsKICAgICAgICByZXR1cm4gJGNvbnRlbnRvcHMtPkNyZWF0ZUhpZXJhcmNoeURyb3Bkb3duKCcnLCAkdGhpcy0+dmFsdWUsICR0aGlzLT5ibG9ja19uYW1lLCAxLCAxKTsKICAgIH0KCiAgICAvKioKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9lZGl0b3IoKSB7CiAgICAgICAgJG1vZCA9IGNtc191dGlsczo6Z2V0X21vZHVsZSgnRUNCMicpOwogICAgICAgIHJldHVybiAkbW9kLT5DcmVhdGVUZXh0QXJlYSh0cnVlLCAnJywgJHRoaXMtPnZhbHVlLCAkdGhpcy0+YmxvY2tfbmFtZSwgJycsICcnLCAnJywgJycsICR0aGlzLT5vcHRpb25zWyJjb2xzIl0sICR0aGlzLT5vcHRpb25zWyJyb3dzIl0pOwogICAgfQoKICAgIC8qKgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X2lucHV0KCkgewogICAgICAgICR0bXAgPSAnPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IiVzIiBzaXplPSIlZCIgbWF4bGVuZ3RoPSIlZCIgdmFsdWU9IiVzIi8+JzsKICAgICAgICByZXR1cm4gc3ByaW50ZigkdG1wLCAkdGhpcy0+YmxvY2tfbmFtZSwgJHRoaXMtPm9wdGlvbnNbInNpemUiXSwgJHRoaXMtPm9wdGlvbnNbIm1heF9sZW5ndGgiXSwgJHRoaXMtPnZhbHVlKTsKICAgIH0KCiAgICAvKioKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF90aW1lcGlja2VyKCkgewogICAgICAgICR0bXAgPSAkdGhpcy0+Z2V0X2RhdGVwaWNrZXJfbGliKCk7CiAgICAgICAgJHRtcCAuPSAnPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJ0aW1lcGlja2VyIiAgbmFtZT0iJXMiIHNpemU9IiVkIiBtYXhsZW5ndGg9IiVkIiB2YWx1ZT0iJXMiLz4nOwogICAgICAgIHJldHVybiBzcHJpbnRmKCR0bXAsICR0aGlzLT5ibG9ja19uYW1lLCAkdGhpcy0+b3B0aW9uc1sic2l6ZSJdLCAkdGhpcy0+b3B0aW9uc1sibWF4X2xlbmd0aCJdLCAkdGhpcy0+dmFsdWUpOwogICAgfQoKICAgIC8qKgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X2RhdGVwaWNrZXIoKSB7CiAgICAgICAgJHRtcCA9ICR0aGlzLT5nZXRfZGF0ZXBpY2tlcl9saWIoKTsKICAgICAgICAkdG1wIC49ICc8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImRhdGVwaWNrZXIiICBuYW1lPSIlcyIgc2l6ZT0iJWQiIG1heGxlbmd0aD0iJWQiIHZhbHVlPSIlcyIvPic7CiAgICAgICAgcmV0dXJuIHNwcmludGYoJHRtcCwgJHRoaXMtPmJsb2NrX25hbWUsICR0aGlzLT5vcHRpb25zWyJzaXplIl0sICR0aGlzLT5vcHRpb25zWyJtYXhfbGVuZ3RoIl0sICR0aGlzLT52YWx1ZSk7CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRfZGF0ZXBpY2tlcl9saWIoKSB7CiAgICAgICAgaWYgKCR0aGlzLT5pc19kYXRlcGlja2VyX2xpYl9sb2FkKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgJG1vZCA9IGNtc191dGlsczo6Z2V0X21vZHVsZSgnRUNCMicpOwogICAgICAgICRjb25maWcgPSBjbXNtcygpLT5HZXRDb25maWcoKTsKICAgICAgICAkdG1wID0gIgogICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9XCJqYXZhc2NyaXB0XCIgZmllbGQ9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCIiIC4gJGNvbmZpZ1sicm9vdF91cmwiXSAuICIvbW9kdWxlcy8iIC4gJG1vZC0+R2V0TmFtZSgpIC4gIi9saWIvanMvanF1ZXJ5LXVpLXRpbWVwaWNrZXItYWRkb24uanNcIj48L3NjcmlwdD4KICAgICAgICA8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj4KCQkkKGZ1bmN0aW9uKCkgewoJCQkkKCcuZGF0ZXBpY2tlcicpLiIgLiAoaXNzZXQoJHRoaXMtPm9wdGlvbnNbInRpbWUiXSkgJiYgJHRoaXMtPm9wdGlvbnNbInRpbWUiXSA/ICdkYXRldGltZXBpY2tlcicgOiAnZGF0ZXBpY2tlcicgKSAuICIgKHsKCQkJCSIgLiAoaXNzZXQoJHRoaXMtPm9wdGlvbnNbImRhdGVfZm9ybWF0Il0pICYmICR0aGlzLT5vcHRpb25zWyJkYXRlX2Zvcm1hdCJdID8gImRhdGVGb3JtYXQ6ICciIC4gJHRoaXMtPm9wdGlvbnNbImRhdGVfZm9ybWF0Il0gLiAiJywiIDogIiIpIC4gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLiAoaXNzZXQoJHRoaXMtPm9wdGlvbnNbInRpbWVfZm9ybWF0Il0pICYmICR0aGlzLT5vcHRpb25zWyJ0aW1lX2Zvcm1hdCJdID8gInRpbWVGb3JtYXQ6ICciIC4gJHRoaXMtPm9wdGlvbnNbInRpbWVfZm9ybWF0Il0gLiAiJyIgOiAiIikgLiAiLAoJCQkJc2hvd090aGVyTW9udGhzOiB0cnVlLAoJCQkJc2VsZWN0T3RoZXJNb250aHM6IHRydWUKCQkJfSk7CgkJCSQoJy50aW1lcGlja2VyJykudGltZXBpY2tlciAoewoJCQkJdGltZUZvcm1hdDogJyIgLiAkdGhpcy0+b3B0aW9uc1sidGltZV9mb3JtYXQiXSAuICInCgkJCX0pOwoKCQl9KTsKPC9zY3JpcHQ+IjsKICAgICAgICAkdGhpcy0+aXNfZGF0ZXBpY2tlcl9saWJfbG9hZCA9IHRydWU7CiAgICAgICAgcmV0dXJuICR0bXA7CiAgICB9CgogICAgLyoqCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRfY29sb3JfcGlja2VyKCkgewoKICAgICAgICAkdHh0ID0gJyc7CiAgICAgICAgJGZpcnN0ID0gY21zX3V0aWxzOjpnZXRfYXBwX2RhdGEoX19GVU5DVElPTl9fKTsKICAgICAgICAkY29uZmlnID0gY21zbXMoKS0+R2V0Q29uZmlnKCk7CiAgICAgICAgJG1vZCA9IGNtc191dGlsczo6Z2V0X21vZHVsZSgnRUNCMicpOwogICAgICAgIGlmICghJGZpcnN0KSB7CiAgICAgICAgICAgICR0eHQuPSAnPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgZmllbGQ9InRleHQvamF2YXNjcmlwdCIgc3JjPSInIC4gJGNvbmZpZ1sicm9vdF91cmwiXSAuICcvbW9kdWxlcy8nIC4gJG1vZC0+R2V0TmFtZSgpIC4gJy9saWIvanMvbUNvbG9yUGlja2VyLm1pbi5qcyI+PC9zY3JpcHQ+JzsKICAgICAgICAgICAgJHR4dC49ICc8c2NyaXB0PgokLmZuLm1Db2xvclBpY2tlci5kZWZhdWx0cy5pbWFnZUZvbGRlciA9ICIgJyAuICRjb25maWdbInJvb3RfdXJsIl0gLiAnL21vZHVsZXMvJyAuICRtb2QtPkdldE5hbWUoKSAuICcvbGliL2pzL2ltYWdlcy8iOwo8L3NjcmlwdD4nOwogICAgICAgIH0KCiAgICAgICAgJHRtcCA9ICc8aW5wdXQgIHR5cGU9ImNvbG9yIiBkYXRhLWhleD0idHJ1ZSIgbmFtZT0iJXMiIGlkPSIlcyIgc2l6ZT0iJyAuICR0aGlzLT5vcHRpb25zWyJzaXplIl0gLiAnIiB2YWx1ZT0iJXMiLz4nOwogICAgICAgICR0eHQgLj0gc3ByaW50ZigkdG1wLCAkdGhpcy0+YmxvY2tfbmFtZSwgJHRoaXMtPmFsaWFzLCAkdGhpcy0+dmFsdWUpOwoKICAgICAgICBjbXNfdXRpbHM6OnNldF9hcHBfZGF0YShfX0ZVTkNUSU9OX18sIDEpOwoKICAgICAgICByZXR1cm4gJHR4dDsKICAgIH0KCiAgICAvKioKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9jaGVja2JveCgpIHsKCiAgICAgICAgJG1vZCA9IGNtc191dGlsczo6Z2V0X21vZHVsZSgnRUNCMicpOwogICAgICAgIHJldHVybiAkbW9kLT5DcmVhdGVJbnB1dEhpZGRlbignJywgJHRoaXMtPmJsb2NrX25hbWUsIDApIC4gJG1vZC0+Q3JlYXRlSW5wdXRDaGVja2JveCgnJywgJHRoaXMtPmJsb2NrX25hbWUsIDEsICR0aGlzLT52YWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRfZmlsZV9zZWxlY3RvcigpIHsKCiAgICAgICAgJG1vZCA9IGNtc191dGlsczo6Z2V0X21vZHVsZSgnRUNCMicpOwogICAgICAgICRjb25maWcgPSBjbXNtcygpLT5HZXRDb25maWcoKTsKICAgICAgICAvLyAxLiAgR2V0IHRoZSBkaXJlY3RvcnkgY29udGVudHMKICAgICAgICAkYWRkZGlyID0gZ2V0X3NpdGVfcHJlZmVyZW5jZSgnY29udGVudGltYWdlX3BhdGgnKTsKICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ2RpciddKQogICAgICAgICAgICAkYWRkZGlyID0gJHRoaXMtPm9wdGlvbnNbJ2RpciddOwoKCiAgICAgICAgJGRpciA9IGNtc19qb2luX3BhdGgoJGNvbmZpZ1sndXBsb2Fkc19wYXRoJ10sICRhZGRkaXIpOwogICAgICAgICRmaWxldHlwZXMgPSAkdGhpcy0+b3B0aW9uc1snZmlsZXR5cGVzJ107CiAgICAgICAgaWYgKCRmaWxldHlwZXMgIT0gJycpIHsKICAgICAgICAgICAgJGZpbGV0eXBlcyA9IGV4cGxvZGUoJywnLCAkZmlsZXR5cGVzKTsKICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJGZpbGV0eXBlcyk7ICRpKyspIHsKICAgICAgICAgICAgICAgICRmaWxldHlwZXNbJGldID0gJyouJyAuICRmaWxldHlwZXNbJGldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRleGNsdWRlcyA9ICR0aGlzLT5vcHRpb25zWydleGNsdWRlcHJlZml4J107CiAgICAgICAgaWYgKCRleGNsdWRlcyAhPSAnJykgewogICAgICAgICAgICAkZXhjbHVkZXMgPSBleHBsb2RlKCcsJywgJGV4Y2x1ZGVzKTsKICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJGV4Y2x1ZGVzKTsgJGkrKykgewogICAgICAgICAgICAgICAgJGV4Y2x1ZGVzWyRpXSA9ICRleGNsdWRlc1skaV0gLiAnKic7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGZsID0gY2dlX2Rpcjo6cmVjdXJzaXZlX2dsb2IoJGRpciwgJGZpbGV0eXBlcywgJ0ZJTEVTJywgJGV4Y2x1ZGVzLCAkdGhpcy0+b3B0aW9uc1sncmVjdXJzZSddKTsKCiAgICAgICAgLy8gMi4gIFJlbW92ZSBwcmVmaXgKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBjb3VudCgkZmwpOyAkaSsrKSB7CiAgICAgICAgICAgICRmbFskaV0gPSBzdHJfcmVwbGFjZSgkZGlyLCAnJywgJGZsWyRpXSk7CiAgICAgICAgfQoKICAgICAgICAvLyAyLiAgU29ydAogICAgICAgIGlmIChpc19hcnJheSgkZmwpICYmICR0aGlzLT5vcHRpb25zWydzb3J0ZmlsZXMnXSkgewogICAgICAgICAgICBzb3J0KCRmbCk7CiAgICAgICAgfQoKICAgICAgICAkb3B0cyA9IGFycmF5KCk7CiAgICAgICAgJHVybF9wcmVmaXggPSAkYWRkZGlyOwogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IGNvdW50KCRmbCk7ICRpKyspIHsKICAgICAgICAgICAgJG9wdHNbJGZsWyRpXV0gPSAkdXJsX3ByZWZpeCAuICRmbFskaV07CiAgICAgICAgfQogICAgICAgICRvcHRzID0gYXJyYXkoJycgPT4gJycpICsgJG9wdHM7CgogICAgICAgICRkZWZhdWx0X2NvbnRlbnRfaWQgPSBDb250ZW50T3BlcmF0aW9uczo6Z2V0X2luc3RhbmNlKCktPkdldERlZmF1bHRDb250ZW50KCk7CiAgICAgICAgJHBhcm1zID0gYXJyYXkoKTsKICAgICAgICAkcGFybXMgPSAkdGhpcy0+b3B0aW9uczsKICAgICAgICAkcGFybXNbJ2ZpZWxkJ10gPSAnZmlsZV9zZWxlY3Rvcic7CiAgICAgICAgJHBhcm1zWydibG9ja19uYW1lJ10gPSAkdGhpcy0+YmxvY2tfbmFtZTsKICAgICAgICAkcGFybXNbJ3ZhbHVlJ10gPSAkdGhpcy0+dmFsdWU7CiAgICAgICAgJHBhcm1zWydhZGRpbmcnXSA9ICR0aGlzLT5hZGRpbmc7CiAgICAgICAgJHBhcm1zWydzaG93dGVtcGxhdGUnXSA9ICdmYWxzZSc7CiAgICAgICAgJHJlZnJlc2hfdXJsID0gJG1vZC0+Q3JlYXRlbGluaygnY250bnQwMScsICdyZWZyZXNoJywgJGRlZmF1bHRfY29udGVudF9pZCwgJycsICRwYXJtcywgJycsIHRydWUpOwogICAgICAgICRyZWZyZXNoID0gJzxhIGhyZWY9IicgLiAkcmVmcmVzaF91cmwgLiAnJnNob3d0ZW1wbGF0ZT1mYWxzZSIgY2xhc3M9ImZpbGVfc2VsZWN0b3JfcmVmcmVzaCI+CjxpbWcgc3JjPSIuLi9tb2R1bGVzLycgLiAkbW9kLT5HZXROYW1lKCkgLiAnL2ljb25zL2FqYXgtcmVmcmVzaC1pY29uLmdpZiIgYWx0PSInIC4gJG1vZC0+TGFuZygncmVmcmVzaCcpIC4gJyI+CjwvYT4nOwoKICAgICAgICAkc2NyaXB0ID0gJyc7CiAgICAgICAgaWYgKCFjbXNfdXRpbHM6OmdldF9hcHBfZGF0YShfX0ZVTkNUSU9OX18pKSB7CiAgICAgICAgICAgICRzY3JpcHQgPSAiCiAgICAgICAgICAgICAgICA8c2NyaXB0PgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewokKCcuZmlsZV9zZWxlY3Rvcl9yZWZyZXNoJykubGl2ZSgnY2xpY2snLCBmdW5jdGlvbigpewogdmFyIHVybCA9ICQodGhpcykuYXR0cignaHJlZicpOwogJCh0aGlzKS5wcmV2KCkuY3NzKCdvcGFjaXR5JywwLjMpOwogJCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5sb2FkKHVybCwgJycsIGZ1bmN0aW9uKGh0bWwpewp9KTsKcmV0dXJuIGZhbHNlOwp9KQoKJCgnLmZpbGVfc2VsZWN0b3Jfc2VsZWN0IHNlbGVjdCcpLmNoYW5nZShmdW5jdGlvbigpewp2YXIgaW1ndGFnID0gJCh0aGlzKS5wYXJlbnQoKS5uZXh0KCk7CmltZ3RhZy5hdHRyKCdzcmMnLCBpbWd0YWcuZGF0YSgndXBsb2Fkc3VybCcpKycvJyskKHRoaXMpLnZhbCgpKTsKfSkKfSkKPC9zY3JpcHQ+CiI7CgogICAgICAgICAgICBjbXNfdXRpbHM6OnNldF9hcHBfZGF0YShfX0ZVTkNUSU9OX18sIDEpOwogICAgICAgIH0KCiAgICAgICAgJHByZXZpZXcgPSAnJzsKICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3ByZXZpZXcnXSkgewogICAgICAgICAgICBpZiAoJHRoaXMtPnZhbHVlKQogICAgICAgICAgICAgICAgJHByZXZpZXcgPSAnPGltZyBzdHlsZSJtYXgtd2lkdGg6MjAwcHg7IiBjbGFzcz0iZmlsZV9zZWxlY3Rvcl9wcmV2aWV3IiBkYXRhLXVwbG9hZHN1cmw9IicgLiAkY29uZmlnWyJ1cGxvYWRzX3VybCJdIC4gJyIgICBzcmM9IicgLiAkY29uZmlnWyJ1cGxvYWRzX3VybCJdIC4gJy8nIC4gJHRoaXMtPnZhbHVlIC4gJyIgYWx0PSIiPic7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICRwcmV2aWV3ID0gJzxpbWcgc3R5bGUibWF4LXdpZHRoOjIwMHB4OyIgY2xhc3M9ImZpbGVfc2VsZWN0b3JfcHJldmlldyIgYWx0PSIiIGRhdGEtdXBsb2Fkc3VybD0iJyAuICRjb25maWdbInVwbG9hZHNfdXJsIl0gLiAnIj4nOwogICAgICAgIH0KCgoKCiAgICAgICAgcmV0dXJuICc8ZGl2IGNsYXNzPSJmaWxlX3NlbGVjdG9yX3NlbGVjdCI+JyAuICRtb2QtPkNyZWF0ZUlucHV0RHJvcGRvd24oJycsICR0aGlzLT5ibG9ja19uYW1lLCAkb3B0cywgLTEsICR0aGlzLT52YWx1ZSkgLiAkcmVmcmVzaCAuICRzY3JpcHQgLiAnPC9kaXY+JyAuICRwcmV2aWV3OwogICAgfQoKICAgIC8qKgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X3NvcnRhYmxlbGlzdCgpIHsKICAgICAgICAkbW9kID0gY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdFQ0IyJyk7CiAgICAgICAgJG9wdGlvbnMgPSBhcnJheSgpOwogICAgICAgICR0bXAgPSBhcnJheSgpOwoKICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbInVkdCJdKQogICAgICAgICAgICAkb3B0aW9ucyA9IFVzZXJUYWdPcGVyYXRpb25zOjpnZXRfaW5zdGFuY2UoKS0+Q2FsbFVzZXJUYWcoJHRoaXMtPm9wdGlvbnNbInVkdCJdLCAkdG1wKTsKICAgICAgICAkb3B0aW9uc2FycmF5ID0gZXhwbG9kZSgnLCcsICR0aGlzLT5vcHRpb25zWyJ2YWx1ZXMiXSk7CiAgICAgICAgaWYgKGVtcHR5KCRvcHRpb25zYXJyYXkpKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgZm9yZWFjaCAoJG9wdGlvbnNhcnJheSBhcyAkb3B0aW9uKSB7CiAgICAgICAgICAgIGlmICgkb3B0aW9uIT0nJykgewogICAgICAgICAgICAgICAgJGtleV92YWwgPSBleHBsb2RlKCc9JywgJG9wdGlvbik7CiAgICAgICAgICAgICAgICAkb3B0aW9uc1ska2V5X3ZhbFswXV0gPSAka2V5X3ZhbFsxXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPm9wdGlvbnNbJ2ZpcnN0X3ZhbHVlJ10pID09IGZhbHNlKQogICAgICAgICAgICAkb3B0aW9ucyA9IGFycmF5KCR0aGlzLT5vcHRpb25zWydmaXJzdF92YWx1ZSddID0+ICcnKSArICRvcHRpb25zOwogICAgICAgIHJldHVybiAkbW9kLT5DcmVhdGVTb3J0YWJsZUxpc3RBcmVhKCcnLCAkdGhpcy0+YmxvY2tfbmFtZSwgJG9wdGlvbnMsICR0aGlzLT52YWx1ZSwgJHRoaXMtPm9wdGlvbnNbImFsbG93ZHVwbGljYXRlcyJdLCAkdGhpcy0+b3B0aW9uc1sibWF4X3NlbGVjdGVkIl0sICR0aGlzLT5vcHRpb25zWyJ0ZW1wbGF0ZSJdLCAkdGhpcy0+b3B0aW9uc1sibGFiZWxfbGVmdCJdLCAkdGhpcy0+b3B0aW9uc1sibGFiZWxfcmlnaHQiXSk7CiAgICB9CgogICAgLyoqCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRfdGV4dCgpIHsKCiAgICAgICAgaWYgKCEkdGhpcy0+b3B0aW9uc1sidGV4dCJdKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgcmV0dXJuICR0aGlzLT5vcHRpb25zWyJ0ZXh0Il07CiAgICB9CgogICAgLyoqCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRfaHIoKSB7CiAgICAgICAgcmV0dXJuICc8aHIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7IGJvcmRlcjowIG5vbmU7IGJhY2tncm91bmQ6I2NjYzsiIC8+JzsKICAgIH0KCiAgICAvKioKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9saW5rKCkgewoKICAgICAgICBpZiAoISR0aGlzLT5vcHRpb25zWyJsaW5rIl0gfHwgISR0aGlzLT5vcHRpb25zWyJ0ZXh0Il0pCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgJG1vZCA9IGNtc191dGlsczo6Z2V0X21vZHVsZSgnRUNCMicpOwogICAgICAgIHJldHVybiAnPGEgdGFyZ2V0PSInIC4gJHRoaXMtPm9wdGlvbnNbInRhcmdldCJdIC4gJyIgaHJlZj0iJyAuICR0aGlzLT5vcHRpb25zWyJsaW5rIl0gLiAnIj4nIC4gJHRoaXMtPm9wdGlvbnNbInRleHQiXSAuICc8L2E+JzsKICAgIH0KCiAgICAvKioKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9tb2R1bGVfbGluaygpIHsKCiAgICAgICAgJG1vZCA9ICcnOwogICAgICAgIGlmICgkdGhpcy0+b3B0aW9uc1sibW9kIl0pCiAgICAgICAgICAgICRtb2QgPSBjbXNfdXRpbHM6OmdldF9tb2R1bGUoJHRoaXMtPm9wdGlvbnNbIm1vZCJdKTsKCiAgICAgICAgJHVzZXJpZCA9IGdldF91c2VyaWQoKTsKICAgICAgICAkdXNlcm9wcyA9IGNtc21zKCktPkdldFVzZXJPcGVyYXRpb25zKCk7CiAgICAgICAgJGFkbWludXNlciA9ICR1c2Vyb3BzLT5Vc2VySW5Hcm91cCgkdXNlcmlkLCAxKTsKCiAgICAgICAgJHRtcCA9ICc8aW5wdXQgaWQ9Im10XycgLiAkdGhpcy0+YmxvY2tfbmFtZSAuICciICcgLiAoICRhZG1pbnVzZXIgPyAndHlwZT0idGV4dCInIDogJ3R5cGU9ImhpZGRlbiInKSAuICcgbmFtZT0iJyAuICR0aGlzLT5ibG9ja19uYW1lIC4gJyIgdmFsdWU9IicgLiAoJHRoaXMtPnZhbHVlID8gJHRoaXMtPnZhbHVlIDogJHRoaXMtPm9wdGlvbnNbImRlZmF1bHRfdmFsdWUiXSkgLiAnIiAgc2l6ZT0iJWQiIG1heGxlbmd0aD0iJWQiIC8+JzsKICAgICAgICAkdG1wID0gc3ByaW50ZigkdG1wLCAkdGhpcy0+b3B0aW9uc1sic2l6ZSJdLCAkdGhpcy0+b3B0aW9uc1sibWF4X2xlbmd0aCJdKTsKICAgICAgICAvLyBvcmlnaW5hbCBDVCBlZGl0CiAgICAgICAgcmV0dXJuIChpc19vYmplY3QoJG1vZCkgPyAkbW9kLT5DcmVhdGVMaW5rKCcnLCAnZGVmYXVsdGFkbWluJywgJycsICR0aGlzLT5vcHRpb25zWyJ0ZXh0Il0sIGFycmF5KCksICcnLCBmYWxzZSwgMCwgJ3RhcmdldD0iJyAuICR0aGlzLT5vcHRpb25zWyJ0YXJnZXQiXSAuICciJykgOiAkdGhpcy0+b3B0aW9uc1sidGV4dCJdKTsgLy8gLiAnPGJyIC8+JyAuICR0bXA7IC8vIENUIGNvbW1lbnQgb3V0CiAgICB9CgoKCiAgICAvKioKICAgICAqIERFUFJFQ0FURUQKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X2Ryb3Bkb3duX2Zyb21fbW9kdWxlKCkgewogICAgICAgIGlmICghJHRoaXMtPm9wdGlvbnNbIm1vZCJdKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgICRtb2QgPSBjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ0VDQicpOwogICAgICAgICRkYXRhID0gJG1vZC0+UHJvY2Vzc1RlbXBsYXRlRnJvbURhdGEoJ3snIC4gJHRoaXMtPm9wdGlvbnNbIm1vZCJdIC4gJ30nKTsKCiAgICAgICAgJG9wdGlvbnMgPSBhcnJheSgpOwogICAgICAgICRvcHRpb25zYXJyYXkgPSBleHBsb2RlKCcsJywgJGRhdGEpOwogICAgICAgIGlmIChlbXB0eSgkb3B0aW9uc2FycmF5KSkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICBmb3JlYWNoICgkb3B0aW9uc2FycmF5IGFzICRvcHRpb24pIHsKICAgICAgICAgICAgJGtleV92YWwgPSBleHBsb2RlKCc9JywgJG9wdGlvbik7CiAgICAgICAgICAgICRvcHRpb25zWyRrZXlfdmFsWzBdXSA9ICRrZXlfdmFsWzFdOwogICAgICAgIH0KICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPm9wdGlvbnNbJ2RlZmF1bHRfdmFsdWUnXSkgPT0gZmFsc2UpCiAgICAgICAgICAgICRvcHRpb25zID0gYXJyYXkoJHRoaXMtPm9wdGlvbnNbJ2RlZmF1bHRfdmFsdWUnXSA9PiAnJykgKyAkb3B0aW9uczsKCiAgICAgICAgcmV0dXJuICRtb2QtPkNyZWF0ZUlucHV0RHJvcGRvd24oJycsICR0aGlzLT5ibG9ja19uYW1lLCAkb3B0aW9ucywgLTEsICR0aGlzLT52YWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRfZHJvcGRvd24oKSB7CiAgICAgICAgaWYgKCEkdGhpcy0+b3B0aW9uc1sidmFsdWVzIl0pCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAkbW9kID0gY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdFQ0IyJyk7CiAgICAgICAgJHNtYXJ0eSA9IGNtc21zKCktPkdldFNtYXJ0eSgpOwoKICAgICAgICAkb3B0aW9ucyA9IGFycmF5KCk7CgogICAgICAgICRvcHRpb25zYXJyYXkgPSBleHBsb2RlKCcsJywgJHRoaXMtPm9wdGlvbnNbInZhbHVlcyJdKTsKICAgICAgICBpZiAoZW1wdHkoJG9wdGlvbnNhcnJheSkpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgZm9yZWFjaCAoJG9wdGlvbnNhcnJheSBhcyAkb3B0aW9uKSB7CiAgICAgICAgICAgICRrZXlfdmFsID0gZXhwbG9kZSgnPScsICRvcHRpb24pOwogICAgICAgICAgICAkb3B0aW9uc1ska2V5X3ZhbFswXV0gPSAka2V5X3ZhbFsxXTsKICAgICAgICB9CiAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5vcHRpb25zWydmaXJzdF92YWx1ZSddKSA9PSBmYWxzZSkKICAgICAgICAgICAgJG9wdGlvbnMgPSBhcnJheSgkdGhpcy0+b3B0aW9uc1snZmlyc3RfdmFsdWUnXSA9PiAnJykgKyAkb3B0aW9uczsKCiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydtdWx0aXBsZSddKSB7CiAgICAgICAgICAgICRzZWxlY3RlZGl0ZW1zID0gZXhwbG9kZSgnLCcsICR0aGlzLT52YWx1ZSk7CiAgICAgICAgICAgICRzY3JpcHQgPSAnJzsKICAgICAgICAgICAgaWYgKCFjbXNfdXRpbHM6OmdldF9hcHBfZGF0YShfX0ZVTkNUSU9OX18pKSB7CiAgICAgICAgICAgICAgICAkc2NyaXB0ID0gIgogICAgICAgICAgICAgICAgPHNjcmlwdD4KJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsKJCgnLmVjYl9tdXRsaXBsZV9zZWxlY3Qgc2VsZWN0JykuY2hhbmdlKGZ1bmN0aW9uKCl7CiQodGhpcykucHJldigpLnZhbCgoJCh0aGlzKS52YWwoKS5qb2luKCcsJykpKTsKfSkKfSkKPC9zY3JpcHQ+CiI7CiAgICAgICAgICAgICAgICBjbXNfdXRpbHM6OnNldF9hcHBfZGF0YShfX0ZVTkNUSU9OX18sIDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJHNjcmlwdCAuICc8ZGl2IGNsYXNzPSJlY2JfbXV0bGlwbGVfc2VsZWN0Ij4nIC4gJG1vZC0+Q3JlYXRlSW5wdXRIaWRkZW4oJycsICR0aGlzLT5ibG9ja19uYW1lLCAkdGhpcy0+dmFsdWUpIC4gJG1vZC0+Q3JlYXRlSW5wdXRTZWxlY3RMaXN0KCcnLCAkdGhpcy0+YmxvY2tfbmFtZSAuICdfdG1wJywgJG9wdGlvbnMsICRzZWxlY3RlZGl0ZW1zLCAkdGhpcy0+b3B0aW9uc1sic2l6ZSJdKSAuICc8L2Rpdj4nOwogICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICByZXR1cm4gJG1vZC0+Q3JlYXRlSW5wdXREcm9wZG93bignJywgJHRoaXMtPmJsb2NrX25hbWUsICRvcHRpb25zLCAtMSwgJHRoaXMtPnZhbHVlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRfZHJvcGRvd25fZnJvbV91ZHQoKSB7CiAgICAgICAgaWYgKCEkdGhpcy0+b3B0aW9uc1sidWR0Il0pCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAkbW9kID0gY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdFQ0InKTsKICAgICAgICAkc21hcnR5ID0gY21zbXMoKS0+R2V0U21hcnR5KCk7CgogICAgICAgICR0bXAgPSBhcnJheSgpOwogICAgICAgICRvcHRpb25zID0gVXNlclRhZ09wZXJhdGlvbnM6OmdldF9pbnN0YW5jZSgpLT5DYWxsVXNlclRhZygkdGhpcy0+b3B0aW9uc1sidWR0Il0sICR0bXApOwoKICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPm9wdGlvbnNbJ2ZpcnN0X3ZhbHVlJ10pID09IGZhbHNlKQogICAgICAgICAgICAkb3B0aW9ucyA9IGFycmF5KCR0aGlzLT5vcHRpb25zWydmaXJzdF92YWx1ZSddID0+ICcnKSArICRvcHRpb25zOwoKICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ211bHRpcGxlJ10pIHsKICAgICAgICAgICAgJHNlbGVjdGVkaXRlbXMgPSBleHBsb2RlKCcsJywgJHRoaXMtPnZhbHVlKTsKICAgICAgICAgICAgJHNjcmlwdCA9ICcnOwogICAgICAgICAgICBpZiAoIWNtc191dGlsczo6Z2V0X2FwcF9kYXRhKF9fRlVOQ1RJT05fXykpIHsKICAgICAgICAgICAgICAgICRzY3JpcHQgPSAiCiAgICAgICAgICAgICAgICA8c2NyaXB0PgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewokKCcuZWNiX211dGxpcGxlX3NlbGVjdF91ZHQgc2VsZWN0JykuY2hhbmdlKGZ1bmN0aW9uKCl7CiQodGhpcykucHJldigpLnZhbCgoJCh0aGlzKS52YWwoKS5qb2luKCcsJykpKTsKfSkKfSkKPC9zY3JpcHQ+CiI7CiAgICAgICAgICAgICAgICBjbXNfdXRpbHM6OnNldF9hcHBfZGF0YShfX0ZVTkNUSU9OX18sIDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJHNjcmlwdCAuICc8ZGl2IGNsYXNzPSJlY2JfbXV0bGlwbGVfc2VsZWN0X3VkdCI+JyAuICRtb2QtPkNyZWF0ZUlucHV0SGlkZGVuKCcnLCAkdGhpcy0+YmxvY2tfbmFtZSwgJHRoaXMtPnZhbHVlKSAuICRtb2QtPkNyZWF0ZUlucHV0U2VsZWN0TGlzdCgnJywgJHRoaXMtPmJsb2NrX25hbWUgLiAnX3RtcCcsICRvcHRpb25zLCAkc2VsZWN0ZWRpdGVtcywgJHRoaXMtPm9wdGlvbnNbInNpemUiXSkgLiAnPC9kaXY+JzsKICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgcmV0dXJuICRtb2QtPkNyZWF0ZUlucHV0RHJvcGRvd24oJycsICR0aGlzLT5ibG9ja19uYW1lLCAkb3B0aW9ucywgLTEsICR0aGlzLT52YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X2Ryb3Bkb3duX2Zyb21fZ2JjKCkgewogICAgICAgIGlmICghJHRoaXMtPm9wdGlvbnNbImdiYyJdKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgJG1vZCA9IGNtc191dGlsczo6Z2V0X21vZHVsZSgnRUNCMicpOwogICAgICAgICRzbWFydHkgPSBjbXNtcygpLT5HZXRTbWFydHkoKTsKCiAgICAgICAgJHRtcCA9IGFycmF5KCk7CiAgICAgICAgJG9wdGlvbnMgPSBhcnJheSgpOwogICAgICAgICRvcHRpb25zZ2JjID0gJHNtYXJ0eS0+ZmV0Y2goJ2dsb2JhbGNvbnRlbnQ6JyAuICR0aGlzLT5vcHRpb25zWyJnYmMiXSk7CgogICAgICAgICRvcHRpb25zYXJyYXkgPSBleHBsb2RlKCcsJywgJG9wdGlvbnNnYmMpOwogICAgICAgIGlmIChlbXB0eSgkb3B0aW9uc2FycmF5KSkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICBmb3JlYWNoICgkb3B0aW9uc2FycmF5IGFzICRvcHRpb24pIHsKICAgICAgICAgICAgJGtleV92YWwgPSBleHBsb2RlKCc9JywgJG9wdGlvbik7CiAgICAgICAgICAgICRvcHRpb25zWyRrZXlfdmFsWzBdXSA9ICRrZXlfdmFsWzFdOwogICAgICAgIH0KCiAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5vcHRpb25zWydmaXJzdF92YWx1ZSddKSA9PSBmYWxzZSkKICAgICAgICAgICAgJG9wdGlvbnMgPSBhcnJheSgkdGhpcy0+b3B0aW9uc1snZmlyc3RfdmFsdWUnXSA9PiAnJykgKyAkb3B0aW9uczsKCiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydtdWx0aXBsZSddKSB7CiAgICAgICAgICAgICRzZWxlY3RlZGl0ZW1zID0gZXhwbG9kZSgnLCcsICR0aGlzLT52YWx1ZSk7CiAgICAgICAgICAgICRzY3JpcHQgPSAnJzsKICAgICAgICAgICAgaWYgKCFjbXNfdXRpbHM6OmdldF9hcHBfZGF0YShfX0ZVTkNUSU9OX18pKSB7CiAgICAgICAgICAgICAgICAkc2NyaXB0ID0gIgogICAgICAgICAgICAgICAgPHNjcmlwdD4KJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsKJCgnLmVjYl9tdXRsaXBsZV9zZWxlY3RfdWR0IHNlbGVjdCcpLmNoYW5nZShmdW5jdGlvbigpewokKHRoaXMpLnByZXYoKS52YWwoKCQodGhpcykudmFsKCkuam9pbignLCcpKSk7Cn0pCn0pCjwvc2NyaXB0PgoiOwogICAgICAgICAgICAgICAgY21zX3V0aWxzOjpzZXRfYXBwX2RhdGEoX19GVU5DVElPTl9fLCAxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRzY3JpcHQgLiAnPGRpdiBjbGFzcz0iZWNiX211dGxpcGxlX3NlbGVjdF91ZHQiPicgLiAkbW9kLT5DcmVhdGVJbnB1dEhpZGRlbignJywgJHRoaXMtPmJsb2NrX25hbWUsICR0aGlzLT52YWx1ZSkgLiAkbW9kLT5DcmVhdGVJbnB1dFNlbGVjdExpc3QoJycsICR0aGlzLT5ibG9ja19uYW1lIC4gJ190bXAnLCAkb3B0aW9ucywgJHNlbGVjdGVkaXRlbXMsICR0aGlzLT5vcHRpb25zWyJzaXplIl0pIC4gJzwvZGl2Pic7CiAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgIHJldHVybiAkbW9kLT5DcmVhdGVJbnB1dERyb3Bkb3duKCcnLCAkdGhpcy0+YmxvY2tfbmFtZSwgJG9wdGlvbnMsIC0xLCAkdGhpcy0+dmFsdWUpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9tb2R1bGUoKSB7CgogICAgICAgICRtb2RvcHMgPSBjbXNtcygpLT5HZXRNb2R1bGVPcGVyYXRpb25zKCk7CiAgICAgICAgJG1vZHVsZXMgPSAkbW9kb3BzLT5HZXRJbnN0YWxsZWRNb2R1bGVzKCk7CiAgICAgICAgJG1vZHVsZXNhcnJheSA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJG1vZHVsZXMgYXMgJG1vZHVsZSkgewogICAgICAgICAgICAkbW9kID0gY21zX3V0aWxzOjpnZXRfbW9kdWxlKCRtb2R1bGUpOwogICAgICAgICAgICBpZiAoaXNfb2JqZWN0KCRtb2QpKQogICAgICAgICAgICAgICAgJG1vZHVsZXNhcnJheVskbW9kLT5HZXROYW1lKCldID0gJG1vZHVsZTsKICAgICAgICB9CgogICAgICAgICRtb2QgPSBjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ0VDQjInKTsKICAgICAgICByZXR1cm4gJG1vZC0+Q3JlYXRlSW5wdXREcm9wZG93bignJywgJHRoaXMtPmJsb2NrX25hbWUsICRtb2R1bGVzYXJyYXksIC0xLCAkdGhpcy0+dmFsdWUpOwogICAgfQoKCgogICAgLyoqCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRfcmFkaW8oKSB7CiAgICAgICAgaWYgKCEkdGhpcy0+b3B0aW9uc1sidmFsdWVzIl0pCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAkbW9kID0gY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdFQ0IyJyk7CiAgICAgICAgJHNtYXJ0eSA9IGNtc21zKCktPkdldFNtYXJ0eSgpOwoKICAgICAgICAkb3B0aW9ucyA9IGFycmF5KCk7CgogICAgICAgICRvcHRpb25zYXJyYXkgPSBleHBsb2RlKCcsJywgJHRoaXMtPm9wdGlvbnNbInZhbHVlcyJdKTsKICAgICAgICBpZiAoZW1wdHkoJG9wdGlvbnNhcnJheSkpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgZm9yZWFjaCAoJG9wdGlvbnNhcnJheSBhcyAkb3B0aW9uKSB7CiAgICAgICAgICAgICRrZXlfdmFsID0gZXhwbG9kZSgnPScsICRvcHRpb24pOwogICAgICAgICAgICAkb3B0aW9uc1ska2V5X3ZhbFswXV0gPSAka2V5X3ZhbFsxXTsKICAgICAgICB9CgogICAgICAgICRkZWxpbWl0ZXIgPSAoJHRoaXMtPm9wdGlvbnNbImlubGluZSJdKSA/ICcmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsnIDogJzxicj4nOwoKICAgICAgICBpZiAoICFlbXB0eSgkdGhpcy0+dmFsdWUpICkgewogICAgICAgICAgICAkc2VsZWN0ZWRWYWx1ZSA9ICR0aGlzLT52YWx1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbImRlZmF1bHRfdmFsdWUiXT09Jy0xJykgewogICAgICAgICAgICAgICAgJHNlbGVjdGVkVmFsdWUgPSByZXNldCgkb3B0aW9ucyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc2VsZWN0ZWRWYWx1ZSA9ICRvcHRpb25zWyR0aGlzLT5vcHRpb25zWyJkZWZhdWx0X3ZhbHVlIl1dOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG1vZC0+Q3JlYXRlSW5wdXRSYWRpb0dyb3VwKCcnLCAkdGhpcy0+YmxvY2tfbmFtZSwgJG9wdGlvbnMsICRzZWxlY3RlZFZhbHVlLCAnJywgJGRlbGltaXRlcik7CiAgICB9CgoKCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9leHRyYV9vcHRpb25zKGFycmF5ICRwYXJhbXMpIHsKCiAgICAgICAgaWYgKCFpc1NldCgkcGFyYW1zWyJmaWVsZCJdKSkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAkb3B0aW9ucyA9IGFycmF5KCk7CiAgICAgICAgJGRlZmF1bHRfb3B0aW9ucyA9IGFycmF5KCk7CiAgICAgICAgc3dpdGNoIChzdHJ0b2xvd2VyKCRwYXJhbXNbImZpZWxkIl0pKSB7CiAgICAgICAgICAgIGNhc2UgImNvbG9yX3BpY2tlciI6CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJzaXplIl0gPSAxMDsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlZmF1bHRfdmFsdWUiXSA9ICcnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIm1vZHVsZV9saW5rIjoKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbIm1vZCJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJ0ZXh0Il0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInRhcmdldCJdID0gJ19zZWxmJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlZmF1bHRfdmFsdWUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sic2l6ZSJdID0gMzA7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJtYXhfbGVuZ3RoIl0gPSAyNTU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAibGluayI6CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJ0ZXh0Il0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInRhcmdldCJdID0gJ19zZWxmJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImxpbmsiXSA9ICcnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIm1vZHVsZSI6CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkZWZhdWx0X3ZhbHVlIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInRleHQiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sibGluayJdID0gJyc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZHJvcGRvd25fZnJvbV9tb2R1bGUiOgogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sibW9kIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlZmF1bHRfdmFsdWUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZmlyc3RfdmFsdWUiXSA9ICcnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImZpbGVfc2VsZWN0b3IiOgogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZmlsZXR5cGVzIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImV4Y2x1ZGVwcmVmaXgiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sicmVjdXJzZSJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJzb3J0ZmlsZXMiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGlyIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInByZXZpZXciXSA9ICcnOwogICAgICAgICAgICBjYXNlICJkcm9wZG93biI6CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJzaXplIl0gPSA1OwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sibXVsdGlwbGUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sidmFsdWVzIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlZmF1bHRfdmFsdWUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZmlyc3RfdmFsdWUiXSA9ICcnOwogICAgICAgICAgICBjYXNlICJkcm9wZG93bl9mcm9tX3VkdCI6CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJzaXplIl0gPSA1OwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sibXVsdGlwbGUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sidmFsdWVzIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlZmF1bHRfdmFsdWUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZmlyc3RfdmFsdWUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sidWR0Il0gPSAnJzsKICAgICAgICAgICAgY2FzZSAiZHJvcGRvd25fZnJvbV9nYmMiOgogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sic2l6ZSJdID0gNTsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbIm11bHRpcGxlIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInZhbHVlcyJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkZWZhdWx0X3ZhbHVlIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImZpcnN0X3ZhbHVlIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImdiYyJdID0gJyc7CiAgICAgICAgICAgIGNhc2UgInRleHRhcmVhIjoKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlZmF1bHRfdmFsdWUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sicm93cyJdID0gMjA7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJjb2xzIl0gPSA4MDsKICAgICAgICAgICAgY2FzZSAiZWRpdG9yIjoKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlZmF1bHRfdmFsdWUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sicm93cyJdID0gMjA7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJjb2xzIl0gPSA4MDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJpbnB1dCI6CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkZWZhdWx0X3ZhbHVlIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInNpemUiXSA9IDMwOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sibWF4X2xlbmd0aCJdID0gMjU1OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInNvcnRhYmxlbGlzdCI6CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJ2YWx1ZXMiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZmlyc3RfdmFsdWUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siYWxsb3dkdXBsaWNhdGVzIl0gPSBmYWxzZTsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbIm1heF9zZWxlY3RlZCJdID0gLTE7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJ0ZW1wbGF0ZSJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJsYWJlbF9sZWZ0Il0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImxhYmVsX3JpZ2h0Il0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInVkdCJdID0gJyc7CiAgICAgICAgICAgIGNhc2UgInRleHQiOgogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sidGV4dCJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJleGVjdXRlIl0gPSAnJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJwYWdlcyI6CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkZWZhdWx0X3ZhbHVlIl0gPSAnJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJjaGVja2JveCI6CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkZWZhdWx0X3ZhbHVlIl0gPSAnJzsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAiaHIiOgogICAgICAgICAgICBjYXNlICJpbWFnZV9waWNrZXIiOgogICAgICAgICAgICBjYXNlICd0aW1lcGlja2VyJzoKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInNpemUiXSA9IDEwOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sibWF4X2xlbmd0aCJdID0gMTA7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJ0aW1lX2Zvcm1hdCJdID0gJ0hIOm1tJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdkYXRlcGlja2VyJzoKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInNpemUiXSA9IDIwOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sibWF4X2xlbmd0aCJdID0gMjA7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkYXRlX2Zvcm1hdCJdID0gJ3l5LW1tLWRkJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInRpbWVfZm9ybWF0Il0gPSAnSEg6bW0nOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sidGltZSJdID0gJyc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAncmFkaW8nOgogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sibXVsdGlwbGUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sidmFsdWVzIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlZmF1bHRfdmFsdWUiXSA9IC0xOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siaW5saW5lIl0gPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5maWVsZCA9ICRwYXJhbXNbImZpZWxkIl07CgogICAgICAgIGlmIChlbXB0eSgkcGFyYW1zKSA9PSBmYWxzZSkgewogICAgICAgICAgICBmb3JlYWNoICgkcGFyYW1zIGFzICRrZXkgPT4gJHBhcmFtKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNTZXQoJGRlZmF1bHRfb3B0aW9uc1ska2V5XSkgJiYgZW1wdHkoJHBhcmFtKSA9PSBmYWxzZSkKICAgICAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyRrZXldID0gJHBhcmFtOwogICAgICAgICAgICB9CiAgICAgICAgfQoKCiAgICAgICAgJHRoaXMtPm9wdGlvbnMgPSAkZGVmYXVsdF9vcHRpb25zOwogICAgfQoKfQoKPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/lib/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/images/color.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMOSURBVDjLVZNNaBxlAIafb+ab2Z3N7Oxv/nYTEyv2LzQJpKBgrQqNUKmY4kUIXqUHT70p9iB48CKIiN5E0It6KFiwiv9FpAVpKUggNc3mZ7vpJpv9n93ZnZ35PNRI+8B7e9/n9gqlFAeIVUfPeN3zh0R0eVpYM1OanhvTCEY0f3tU79+ctnpfHM73fuQhxIHAWHnmkOGXPjgZyS09l5hnNv4YOdMhoQmigzqGt4nhfeub1fpnVsl/e+hMv/q/QKy+Me0EO5dfso/OvzB8grgV4HGXJC7jwAQ2oxxDuC36xZ+Rhe+v6iutZf2iqklReNe0tPSHZ2Nz84ujR7ht3iJKjcexiOIQI8SiixxcR7QtRORFlK7O9t0rlyy4KBEj5+YisVeez85wy9zGIUeGDDYhDhYOITYuoh2BvTJ68y7B0GnCym8XGq+KL2U0MrE8Z2SRVhqdPmlCsvgk8RlCkgAivRbUNKj1YPMeeu4wcnjRql7/+jVpyvxsPjbK3whi5LEAB0WWgBRgqwAaFah04X4V7puwdwddz+FXjJMSbXI8aSTYCgU2oKMwEdgCEoDhug/G5SjsmFDUoV+DXJ7BnpiUVCNBaJqEXfDVfwG6CjoKnF4crZGCVvNBug0IPXzPZOCnAunfk8W6ro7H2gK3A02gGoDeA1MDGx2nkYG6C24bvDaMSzq7ZfxBsiC7O+aNDaWOn0oLfl0HMwDlQRCAHYUkEGvFkLsp2G9Bo0n41AiNG6sMBvY1yZr6/JsV//XZZ3WZaEp2t6DvgWFA1QRHQbwjSDeTUGvCiSPU1ovU/typQPIrTV0yrrl3vE+/+8XlaCIgq8H+BtSLUN2C2ibsl8ArR+HYGE0rwvbvRTr96HsL6od1CUDDf+enK92JwT+982cWEswvRmiug6qAr0E4AV4uoFXosnV1g8bN5kcp7E8eOZOYKtmUqm/ZiDdfPhV3Zp6IM5k0SIUBstwmXKvCX5UdM6y9n2b34wV1IXxEcEBU3J4dprU0zODpjFBTIyoIxgjXxlB/PIl1eUmdLjzc/xceOVXddrB6BQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/js/images/grid.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFAAUAJEAAAAAAP///+zp2P///yH5BAEAAAMALAAAAAAUABQAAAIojI+iy+jBonhJLnrsxVBP7n1YyHVaSYKhh7Lq+VotPLo1TaW3HEtlAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/js/images/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/lib/js/images/meta100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAAAAACMIRMSAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAaAAAAGgAHsmYvAAACLklEQVQoz0VSW0hUURRd9zVvBcmhyKEMhCghMCT6KIwoiIgIIwZ6CNXHEEUf1cd81Jc9fiKjQoL6kLDQiqISmZgypCdoQUSIg2YoFNhrpgxm5px7V3uuA204j73X2efss/YCxTytlPbom+cqpdyKAxnarcRc/X/2lOdDisWRTGa0RC0hl+OPM8O/WNYCaWZbDMBsfUKt+Kk9DCBxxSt5UOwzYQeDFqx75GQjTCdgGzhGBc7E4VSyHDR84TYETMCwbAzIhRcQRENPVwwBXM/BhHXybrPsdwiUlLWHPCUnDt+SaS85BAuNeXANUDNNPoeNLWmEcJPFP8uA2BjyS4Gm8WnmpLLWpOC3f2iuk7QhzC4GaheFB7/XAM1bYTm10X5uliOD+LkEpmHhUCEGtOyEbVro4CaBnqK0AkZkQeL954CB9SnYVjTxTN43nVFwA4zY6zyzcNB+Vio877KQAOqmwH3iXiWPy3LigVS4S73otm0s/wvekFi8rzsk3+v/KrxEm4REB/vly3MrERJyrDBW/eZBhFF/5+OZoDlCaL6KwzANAwvfUhfagGvvkhOPuir0aub2xB2jvmOi0tO59OpvKdSNsey30uXs6FSequjqkjiXAmEcmYc8XebudInSc4/um+1C3NHT1L42RAIDds2B3uGXD8+12cDaD9SiIsyriDOpCHyLbOwtijK8KiRCcpnPXu7svHh/0pUUP1aFPFWu6pCuqu6qkK/Asti8On37BwKNc9D2ur7jAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDEwLTA4LTE1VDEyOjUwOjE3LTA0OjAwUhXmOgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMC0wOC0xNVQxMjo1MDoxNy0wNDowMCNIXoYAAAARdEVYdGpwZWc6Y29sb3JzcGFjZQAyLHVVnwAAACB0RVh0anBlZzpzYW1wbGluZy1mYWN0b3IAMngyLDF4MSwxeDFJ+qa0AAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/js/images/picker.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAMAAAACICAIAAAA+tXNRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAE6NJREFUeNrcXcGywrYOtR0WXXTRL3j9///rTBfE0gNCEtmWZAWiDC5zhwkhF84xx7Isy0rE+z08HjEwD/akcp574KGLzSeb82MTcEP/uBiDJ4GI//5bgIoC0igzUF9W7Y/B+hLVk7KAhiTghr4V0MkEIv7zT59BFFgaDrb2RwNAVF8ux7h+9hEB/ToBN/RUQC4EbmGea4wtXpZKJB/V/pTlWyg8K29JF6NmgUYl4IzekcBDQPcCZgzWl9iQiOuHq9i/ecmdtCP+RQIRvdH7EiAWiKKTjqWTyA3F5CT95haF8bg9KQhoJAKtgBzQOxIoBdT+tW9h+e7jZeLGbc6Gtiikk0G+AOpPY1EOQ+Aq9F4EbiHnDoNEqCSOE8hDcRCN6dG/LwT00wSuRX8+gcUC4Q4nCZpfsGdyzAYoVOWz2IE7E+R3mysruIMR8EfvSSBSAaVVz4njRHkAecsAX6LCosvrZbB+VXUZiAIaksC16M8msAsorbhSSSKtw2xsLCkbINj+XZ0MUCAtTGguoP8iCGhUAheidyAQ3z4Q7r4Zlq7a9jLJM8skuG24h7G6AyzIzy18KPpIFBCPQcAZvd3p+YjAU0D3+3MqmUr9L8+JePlYCpteXMUIVGOq45VOqrTiinVIAkvbX4X+bAJxmcZvJDZEkdjEDT49Q7nGxjraYijIoc7NSeW4FNCQBLa2d0PvSaAW0OM7p5IBEviJmylOckeQl+BY0wkC8OpM1gQ0HgEqIDf0bgRqAaXSDlK9tnPHtH5OapQd+96/UeSZgw+igMYjQNveE70PgaeAHk50xBpvxSBp+Sb7lZHDHE0kpD+9/aFGMB6Ba9GfTeA1jb8XvQDJgRTjZuGzf7EzAYCGRBbgS2fKDjwegYTe6D0JvONAi4CmZuGszTFhAURukVO2ocY5pUQi1/1ia/whCWwC8kfvQKAQ0OatTSUWJRsFyGIMChlIXM6SPg5ncpB7ZxrjORiBTUDO6H0I7AKaVuyhPAgNleoZuK7RkNDXYKSxt4KfOU5lBx6PQMIL0LsReAsoIZ+hdhOSJWMjfnaIDnUsAs3iz6Xmq2anB2v7j0og4TXofQhEWAW0mc5N/2FdVqsQVWkEyuK/Og6DoH/kukCWX+LucQ5JIOHF6E8l8BLQgwTU2IOKneaqSNixPwFAg91sX86igIYkkNAVvTOB9BBQngOAplsl5QnKVWPW04+dOYAUImmP55LQ/O6jqdfxfprAhegdCKS3DwRaHlsk9rRNfzIb0O00CGswUkdgu0MuLJCeiPfTBBJeg96HwC4g1n1fYObyuOoCSTCgsg0Nhjio1OBzc4z7AsCQBLYJjBt6TwKFgKqc7Mp65tJuJvLt1aJwLw6nZ6OwkQfgSDQCGpIAnQE7o3cgUAuIYs8lg8QJHhvTmILxYcluYhUzawIajwAbQvFHfxIBRkBszIHqH8pABLscrIaxQPDfutOADbsqoMEIVALyQe9G4CmgxywMYc9yy4Lfv3xUItgThycw4zAKoVBQ14JZl7l665XOPZVpeoMRmNAbvSeBBGQW1m6gTWQjSW40XwWikjYTqJYJocnb7q7E5Mb8z28BYbOLfCQCiBegdyPwFND90QuAnz6m0oYCIQRkQS9xW2CFFTy9C2QhkF5Zz+Xv/h7CQA6gDEAA0BW9M4G3D4TAxDtTOWtMjYVL3Kai454bGGwoyOMw7hsWhiSQ8Er0ZxN4+0B0e1K7RzI14hey26WQFprX8SwuHH139YFSGJbAhN7oPQmk3FigwDFInDqlba/H9d8NZs0EeGVGsa5wMhgBxCvRn02gEBDbBdLq/ScD/KAFs5RkuO4cAIRYRCmgIQkgXoPeh0AtoFjKPpG5I/R22oeGR+QduaDu3Ge7wCy4EI2AxiOAeAF6NwJ9AS0kJq4jsACCltNnH4ez8DdrQ9iQBHQBnYfeh8BLQDlgrlGnhkQS7NzBTKxgSEvJ5mW9udjWPyQBxMvQOxCY8hKJzh0SkzzR6xUl6pamsQdBVSd6VAKIruidCeA7Er1aoFmAnxseUr0S8wQAeindUObAzVwYurFA4xGgFsgZvQOBXUAb/JkzoBNZjJkMXUCo2hcOpnS3CzDtbBL32ktDEkB0Re9M4CmgfH8OYXnd2k8njhP5qMkci5DXAw5tKmGjENV84P7+5C1sOyQBf/RuBGBekurzO+wwlwwocHrMlq6yRSGkERiFrZtZyMQiSxk0bjIegYjXoPciQIawtL5FY1iZUEGD8xa+XY/Z6vSxqy9cHCgQB3RIApejP48AVgJqlV/Zs0ktz3hkGUb6y9x2/moElgU0JAFP9M4EXgK6FwKaSEeYiFUVSmNYNibZ14KzMI9U1sKgFtB4BC5EfzYBWAKJU65HutQ4b60o27QkdslFrREKvc1t3eRKLOz9eAQiXobeg8B7KSPv+p9fz1OTVASNbc2v3dtSOP3IOl63F4Dgws37LGxgAv7o3QggFdAGfybGNAtjYjsNDGKtLFQTu429YBZX40PT/oMRcEbvSeApoPv9LaDben4S7JYlEKHua0Ch0rUSxgJ1EvlyIbaiXkMSQLgGvQ8BWCzQ49TUYM/C2HtwNQ/l2kZgq9CnrybBu1bpwAQ80TsTeFqgZ5HNvIt/UvdygLAe05tHWpaAu4u/7OZgfO/CG5XAw4l2Ru9LgFigqfwhMleega1fbphHdm9SVVnSLAzCbR/G3QKNSsAfvRsBfAto3klIvQBJjWnshSDMJQahiWG13j+oCWVQCGhIApeg9yHwFFAuBXQTvH+jAZWKox/MRpFG4Gpb1RqHo40/GIEI16B3IgDL3Xqylj+UVV/OUs/YUCYUbblMHK5kvfAnCSS4DL0DgbjsTMV51/9MegHILhwYLGkvhgWGXCZQJzH32gcakoAzelcCy1rYMoRt8FsSmbtLBZtS8FGhXFBL4epxuJcPNIeRCVyC3ofAOxK9CKiF3zWgoO4xiRp26AXSlRlksxa5hXDHIxDhAvR+BCoBSeLXbSiY1oItQVCLDZ01AY1HgArIE70TARpItHtxUkq3ucay5YYfudnNdp4T/UMEPnCiv0B/NoGYbzC/jm5HXH8QUvq5GSLE+h0w3NzMvsUN3xZoVAIRXdGHyLx5HoGHgGZ71BvlCtSwZltXf1OYkQn9gfAZ+ZxkzYEJnI0+IB98PY1AKaBuCVgU4gUzicCr7V8lt2UuVP9FAYqxCTigbwV0MoFb7uYb4cG1tnLozOpwCupiIRiqCBgSpgYg4IY+BGcCt7ue8ajU8WQJLeM5kA4Mu92sbhQBctKCjt1sgQYj4IA+QDFynU+ADGFHN963wHO5oLy0fyqWrti+cDTSiudUDvgtAj7oQ6oXD08m8BKQpfKQNPbempczSfBK4T4VeOeD0w1l8+XB0km/S8AT/ePgHjwJlBaIvgvmMozQiJ8waH3QbqqUEiXrLXUOTMAHPetEn0ngBi0dXf/dMozlXzc+Ji30wIdVSIcncCr6EDwJxMWJxm78oR2HkbOnU/ny/urAUIy9bVrb9nnZVsvteNrpAATc0C9OtBeBuAxhqOz9qLSYyXdJd7ObiiT3xQeVgg9U/1g2TdUFgilIPzABH/SbE+1CYBUQyrs+kEsdyII9pcGs6e3CzYm5Q0oWbuqKhkVmQ9L4YAQ80dNZ2PkE4hJIxG6qGpprMFZ/99dy7ZFgVteGfpRr9+sE3NCHmxZl/JbAywdCMoR9kDXLrvZPe6mtbRJDx9svp49Hbmbx6wSc0dNZ2PkEXkNY3G8Yc2DPEMi5jqvpfLd/6swjFR6SPY3FTxDVDvzrBJzRh8Qspp5GgDjR2JsJGPMTaHmSpv2zOgjnrxYDxibghr71gc4kUM7CDhVBY7eecUUilQ4McsJUt4bt11XcfpGAA3rdAn1LoBGQUgjWUkQmMZ3i0f4fbFhhGRwv3jYegbPRh9RPi/ycwEtA+IoHsdsbdeCJG35zWekvhnvSBl5lJmAu5MbOj4ch4Iz+uZgX3AiUcSBLyiyuhY1aQtXwO7/hS3G41mh29+0a5vBDEvBErwQSTyDQRKJRvo2LMhSnBjvRfxuHm4WVGOyVUbI5QKMS8EHPBhJPI1DOwoKhkPkmdVo8PREXLpKDWORjGe1m7t2KxnZn0MEIuKGnCWXnE+AskOWOiMCVU5+aOxOlVyA3ifd7hF4NpeMpxQMT8EEfknbHzW8JHJnGo1zrkY66c33TvTaMohf/1LPi1OoTwxNwQM/GgU4j8F4Lg6ORLCh1Tv+q26YFJowy9+aRlijEd6G4nyPghp6NA51GIC3TeLDvK6HwWTaxPCDtfygQoey8lL3PIQk4ow+p7wN9TiAtQxh8UEiPRV0xeN2CJoNpIZgdk9t5rKEC16gEfNAHsC7Ff0KACAhtBUBYErGxnnFfJ2RdiFnGbvTf5KSaIQm4oZd8oHMIpBCJBQpr+fzp+GicyT27Sh40DiftSmqnjyjfiK+3JDA2gbPRV4HEkwk0Q5hS/UPpBS3wuFenmROTDDdzIQh2yAU5FhGPlS/5dQI+6IOQT3kOgVJA9lhELu9SyqHeHrMaS9f3lRxMShyegAP6oMbRvyVQ+kAfVKOm3hr9m/cetsXhZnUbyqEy7MfzgX6dgBv60IRBzySwCqglZqkaE5se0fYFfLZ/N6Vb2dpPO0Iw5YWOR8AT/SIgLwLEiZaUnwTPLRLxhwZ44Nt/VqteHSoAaI5Bj0HADX0loJMJND6QtJqXOPFT5cN7F6TS/q3zBrZ0JjhQnWN4AmejpwI6nwA3hCl9geq/5RFIp5j3k0scblbvggfcZAAPZBWPTcAT/RZIdCHAOdFsSlwsn6np3J5pu0xrGAvExexvvDjBDRqYgBt6ZTX+BAJcHGiDTAfhikdFJRP9N+a4msRIqFEIoYd+JhBblWA8Aj7og0H+nxPgfKDqekqi7RcU/sy3h9KB2/LoKNfnCsfy6gcmcCp63QJ9SyAtO1MB5bRKKvvtmH0IEXiIxzK5LSEIJLFc5FeYhiGA6Ip+KfPrReA5jX878NgrLrLdXDvw6wji4k60buQ2FvQ/siNsGAJu6C0C+orAc2tzxt5UMhIzVi34siEI8r+QrAlw9iJ9WG8NCOMScEb/kB0ENwK4+EA5qMMsNaOhDHNK+SzTPgJv7Q/CXsh8ELg5FDcSATf0VEDnE8DFB8r6ijBVe2h4bP84rc9rAOvd/pG5hRBbp+2DOrPIb6saiYAz+u1WBy4EIOAzJzqj2gtaKtIAQn/Y1W1f2n8mlZGMN7Ru0wuklSO1yOkABDzRbwJyIhDJEKaEsYIgfimRLu0ZubQD6weWMJa6o2FgAm7oKwt0MgHiA3VnAtjGi0jiJK6bTaaVwbTqP/Ews1r5Bns7s49PZX6dgA/6kETEJxDApUpr/ozK9jmpZENduPjcO2SpsWUsaXq8xMV4BE5F/yQQ3AhAYYG2wXOSlY/FOm/BmAZNSbY3RH7LdXf9F45VGf8vEHBAHyIP9xwCuGws3KfxUY6GBjIZQC7AHvkzlvZHQ4FrW0biqATc0BsF9DmBlwVCsqQby3L7iTwHsgMglFdWDIDvwG2OSW6SxlG9MbEcRhmYgCf6SkAnEyjjQG3KYigjoKHMHogllbgCT8XObOnORSgjVbC3s4+y/ccj4Iw+BE8CUESiI8eg6gVliKroNbHMQgCx/VHeOmvJZZKnYAMTcEMfgieBZhpPLSOsCmejoRR4Khkk8lEvhxCERAGUOSn3iultDh6VgBv6ENwIrE40NpltZUrSzqNaxMMSfiTD7/oS4vu/u/CVfdi2m7WNSsAT/eIDORIgcSDk9tmmclmPyj6W1rNd+lujEO1uyyA4ZtkQCOllYo1KwAd9CJ4EYLFAs0JISmGCJp9g6x2peEta6AlcWIytbxI+vIn22AROQq8stZ1D4DZvAkJxY8jurUVuXbiyrdBp/2A4kHwGuTrH8AR80IfgTIAEEqNAAhpzGeQkg1i/hdEKP8hUQieKODwBN/SHesBhAu8aiTP16VmGyGWjKIkq5BmjFuSwPEtvce0/JAFP9FRALgTiX7fbPM9i0sD3L7mvRfnkoXe5xJghCTij9yJwu93in4uAgvzl3WPDxSgkvtiPsecu/AcIuKH3IvAU0B9UQKGX9R/NJ4X2DwYdHLr4CNBhCJyN3ovAU0Dxs99FGbFDsXYcUZu3Hvq8Mx5jEziO/nFBDJ4E4v/+/puxQJYwhYVBeLf/oRaJ4YLH2ATM6DcBuRB4WiB8PZ7/tz7osf4AAOXMdiwdSM/0JXsN+1I6rq5vL1O+XYHd/RwWnkKKvaD6xu3kIcDtL6W/lB6sSN55bbje8imuYxoid4Ox3ogXDUPi9vXtPy7P7AXdL12up8fKh7OXWWBXHCu+9IuUNlFaiUUuYYivx2HrhWeOsumQFCzfXf02H8Blf4ZvWuSUJvu4b9gbzfjSCfw5Ajra1hTZZtws0Nm+1f13aj+qyyoDIxFp7dDpP0P359cbWTfA9DwdUC4zOdVnpnD5o/sz0BasLJk09Oht9JmpbwF3h/UTO/oH3oKfmVF+pnT6dxs7t+KmGF0EyT9Yjtt3qSIP+UAWg3FoCGs1R50bxXxWajaO9U7CWj42fWPlKqpGoEaTW0mq67qyxuZjXocUc3QIU1pD8h2V3nKZ41wNl4UF+mZ6ohse3RdR+m41kHXhbW9V+mN/zg98IPu0tGuBDjVvxesDx/EUg9T20uXM/wUYAOBDukFiC65yAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/js/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/lib/js/jquery-ui-timepicker-addon.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IHRpbWVwaWNrZXIgYWRkb24KICogQnk6IFRyZW50IFJpY2hhcmRzb24gW2h0dHA6Ly90cmVudHJpY2hhcmRzb24uY29tXQogKiBWZXJzaW9uIDEuMS4xCiAqIExhc3QgTW9kaWZpZWQ6IDExLzA3LzIwMTIKICoKICogQ29weXJpZ2h0IDIwMTIgVHJlbnQgUmljaGFyZHNvbgogKiBZb3UgbWF5IHVzZSB0aGlzIHByb2plY3QgdW5kZXIgTUlUIG9yIEdQTCBsaWNlbnNlcy4KICogaHR0cDovL3RyZW50cmljaGFyZHNvbi5jb20vSW1wcm9tcHR1L0dQTC1MSUNFTlNFLnR4dAogKiBodHRwOi8vdHJlbnRyaWNoYXJkc29uLmNvbS9JbXByb21wdHUvTUlULUxJQ0VOU0UudHh0CiAqLwoKLypqc2xpbnQgZXZpbDogdHJ1ZSwgd2hpdGU6IGZhbHNlLCB1bmRlZjogZmFsc2UsIG5vbWVuOiBmYWxzZSAqLwoKKGZ1bmN0aW9uKCQpIHsKCgkvKgoJKiBMZXRzIG5vdCByZWRlZmluZSB0aW1lcGlja2VyLCBQcmV2ZW50ICJVbmNhdWdodCBSYW5nZUVycm9yOiBNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZCIKCSovCgkkLnVpLnRpbWVwaWNrZXIgPSAkLnVpLnRpbWVwaWNrZXIgfHwge307CglpZiAoJC51aS50aW1lcGlja2VyLnZlcnNpb24pIHsKCQlyZXR1cm47Cgl9CgoJLyoKCSogRXh0ZW5kIGpRdWVyeVVJLCBnZXQgaXQgc3RhcnRlZCB3aXRoIG91ciB2ZXJzaW9uIG51bWJlcgoJKi8KCSQuZXh0ZW5kKCQudWksIHsKCQl0aW1lcGlja2VyOiB7CgkJCXZlcnNpb246ICIxLjEuMSIKCQl9Cgl9KTsKCgkvKiAKCSogVGltZXBpY2tlciBtYW5hZ2VyLgoJKiBVc2UgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCAkLnRpbWVwaWNrZXIsIHRvIGludGVyYWN0IHdpdGggdGhlIHRpbWUgcGlja2VyLgoJKiBTZXR0aW5ncyBmb3IgKGdyb3VwcyBvZikgdGltZSBwaWNrZXJzIGFyZSBtYWludGFpbmVkIGluIGFuIGluc3RhbmNlIG9iamVjdCwKCSogYWxsb3dpbmcgbXVsdGlwbGUgZGlmZmVyZW50IHNldHRpbmdzIG9uIHRoZSBzYW1lIHBhZ2UuCgkqLwoJZnVuY3Rpb24gVGltZXBpY2tlcigpIHsKCQl0aGlzLnJlZ2lvbmFsID0gW107IC8vIEF2YWlsYWJsZSByZWdpb25hbCBzZXR0aW5ncywgaW5kZXhlZCBieSBsYW5ndWFnZSBjb2RlCgkJdGhpcy5yZWdpb25hbFsnJ10gPSB7IC8vIERlZmF1bHQgcmVnaW9uYWwgc2V0dGluZ3MKCQkJY3VycmVudFRleHQ6ICdOb3cnLAoJCQljbG9zZVRleHQ6ICdEb25lJywKCQkJYW1OYW1lczogWydBTScsICdBJ10sCgkJCXBtTmFtZXM6IFsnUE0nLCAnUCddLAoJCQl0aW1lRm9ybWF0OiAnSEg6bW0nLAoJCQl0aW1lU3VmZml4OiAnJywKCQkJdGltZU9ubHlUaXRsZTogJ0Nob29zZSBUaW1lJywKCQkJdGltZVRleHQ6ICdUaW1lJywKCQkJaG91clRleHQ6ICdIb3VyJywKCQkJbWludXRlVGV4dDogJ01pbnV0ZScsCgkJCXNlY29uZFRleHQ6ICdTZWNvbmQnLAoJCQltaWxsaXNlY1RleHQ6ICdNaWxsaXNlY29uZCcsCgkJCXRpbWV6b25lVGV4dDogJ1RpbWUgWm9uZScsCgkJCWlzUlRMOiBmYWxzZQoJCX07CgkJdGhpcy5fZGVmYXVsdHMgPSB7IC8vIEdsb2JhbCBkZWZhdWx0cyBmb3IgYWxsIHRoZSBkYXRldGltZSBwaWNrZXIgaW5zdGFuY2VzCgkJCXNob3dCdXR0b25QYW5lbDogdHJ1ZSwKCQkJdGltZU9ubHk6IGZhbHNlLAoJCQlzaG93SG91cjogdHJ1ZSwKCQkJc2hvd01pbnV0ZTogdHJ1ZSwKCQkJc2hvd1NlY29uZDogZmFsc2UsCgkJCXNob3dNaWxsaXNlYzogZmFsc2UsCgkJCXNob3dUaW1lem9uZTogZmFsc2UsCgkJCXNob3dUaW1lOiB0cnVlLAoJCQlzdGVwSG91cjogMSwKCQkJc3RlcE1pbnV0ZTogMSwKCQkJc3RlcFNlY29uZDogMSwKCQkJc3RlcE1pbGxpc2VjOiAxLAoJCQlob3VyOiAwLAoJCQltaW51dGU6IDAsCgkJCXNlY29uZDogMCwKCQkJbWlsbGlzZWM6IDAsCgkJCXRpbWV6b25lOiBudWxsLAoJCQl1c2VMb2NhbFRpbWV6b25lOiBmYWxzZSwKCQkJZGVmYXVsdFRpbWV6b25lOiAiKzAwMDAiLAoJCQlob3VyTWluOiAwLAoJCQltaW51dGVNaW46IDAsCgkJCXNlY29uZE1pbjogMCwKCQkJbWlsbGlzZWNNaW46IDAsCgkJCWhvdXJNYXg6IDIzLAoJCQltaW51dGVNYXg6IDU5LAoJCQlzZWNvbmRNYXg6IDU5LAoJCQltaWxsaXNlY01heDogOTk5LAoJCQltaW5EYXRlVGltZTogbnVsbCwKCQkJbWF4RGF0ZVRpbWU6IG51bGwsCgkJCW9uU2VsZWN0OiBudWxsLAoJCQlob3VyR3JpZDogMCwKCQkJbWludXRlR3JpZDogMCwKCQkJc2Vjb25kR3JpZDogMCwKCQkJbWlsbGlzZWNHcmlkOiAwLAoJCQlhbHdheXNTZXRUaW1lOiB0cnVlLAoJCQlzZXBhcmF0b3I6ICcgJywKCQkJYWx0RmllbGRUaW1lT25seTogdHJ1ZSwKCQkJYWx0VGltZUZvcm1hdDogbnVsbCwKCQkJYWx0U2VwYXJhdG9yOiBudWxsLAoJCQlhbHRUaW1lU3VmZml4OiBudWxsLAoJCQlwaWNrZXJUaW1lRm9ybWF0OiBudWxsLAoJCQlwaWNrZXJUaW1lU3VmZml4OiBudWxsLAoJCQlzaG93VGltZXBpY2tlcjogdHJ1ZSwKCQkJdGltZXpvbmVJc284NjAxOiBmYWxzZSwKCQkJdGltZXpvbmVMaXN0OiBudWxsLAoJCQlhZGRTbGlkZXJBY2Nlc3M6IGZhbHNlLAoJCQlzbGlkZXJBY2Nlc3NBcmdzOiBudWxsLAoJCQljb250cm9sVHlwZTogJ3NsaWRlcicsCgkJCWRlZmF1bHRWYWx1ZTogbnVsbCwKCQkJcGFyc2U6ICdzdHJpY3QnCgkJfTsKCQkkLmV4dGVuZCh0aGlzLl9kZWZhdWx0cywgdGhpcy5yZWdpb25hbFsnJ10pOwoJfQoKCSQuZXh0ZW5kKFRpbWVwaWNrZXIucHJvdG90eXBlLCB7CgkJJGlucHV0OiBudWxsLAoJCSRhbHRJbnB1dDogbnVsbCwKCQkkdGltZU9iajogbnVsbCwKCQlpbnN0OiBudWxsLAoJCWhvdXJfc2xpZGVyOiBudWxsLAoJCW1pbnV0ZV9zbGlkZXI6IG51bGwsCgkJc2Vjb25kX3NsaWRlcjogbnVsbCwKCQltaWxsaXNlY19zbGlkZXI6IG51bGwsCgkJdGltZXpvbmVfc2VsZWN0OiBudWxsLAoJCWhvdXI6IDAsCgkJbWludXRlOiAwLAoJCXNlY29uZDogMCwKCQltaWxsaXNlYzogMCwKCQl0aW1lem9uZTogbnVsbCwKCQlkZWZhdWx0VGltZXpvbmU6ICIrMDAwMCIsCgkJaG91ck1pbk9yaWdpbmFsOiBudWxsLAoJCW1pbnV0ZU1pbk9yaWdpbmFsOiBudWxsLAoJCXNlY29uZE1pbk9yaWdpbmFsOiBudWxsLAoJCW1pbGxpc2VjTWluT3JpZ2luYWw6IG51bGwsCgkJaG91ck1heE9yaWdpbmFsOiBudWxsLAoJCW1pbnV0ZU1heE9yaWdpbmFsOiBudWxsLAoJCXNlY29uZE1heE9yaWdpbmFsOiBudWxsLAoJCW1pbGxpc2VjTWF4T3JpZ2luYWw6IG51bGwsCgkJYW1wbTogJycsCgkJZm9ybWF0dGVkRGF0ZTogJycsCgkJZm9ybWF0dGVkVGltZTogJycsCgkJZm9ybWF0dGVkRGF0ZVRpbWU6ICcnLAoJCXRpbWV6b25lTGlzdDogbnVsbCwKCQl1bml0czogWydob3VyJywnbWludXRlJywnc2Vjb25kJywnbWlsbGlzZWMnXSwKCQljb250cm9sOiBudWxsLAoKCQkvKiAKCQkqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHNldHRpbmdzIGZvciBhbGwgaW5zdGFuY2VzIG9mIHRoZSB0aW1lIHBpY2tlci4KCQkqIEBwYXJhbSAgc2V0dGluZ3MgIG9iamVjdCAtIHRoZSBuZXcgc2V0dGluZ3MgdG8gdXNlIGFzIGRlZmF1bHRzIChhbm9ueW1vdXMgb2JqZWN0KQoJCSogQHJldHVybiB0aGUgbWFuYWdlciBvYmplY3QKCQkqLwoJCXNldERlZmF1bHRzOiBmdW5jdGlvbihzZXR0aW5ncykgewoJCQlleHRlbmRSZW1vdmUodGhpcy5fZGVmYXVsdHMsIHNldHRpbmdzIHx8IHt9KTsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCgkJLyoKCQkqIENyZWF0ZSBhIG5ldyBUaW1lcGlja2VyIGluc3RhbmNlCgkJKi8KCQlfbmV3SW5zdDogZnVuY3Rpb24oJGlucHV0LCBvKSB7CgkJCXZhciB0cF9pbnN0ID0gbmV3IFRpbWVwaWNrZXIoKSwKCQkJCWlubGluZVNldHRpbmdzID0ge30sCiAgICAgICAgICAgICAgICBmbnMgPSB7fSwKCQkgICAgICAgIG92ZXJyaWRlcywgaTsKCgkJCWZvciAodmFyIGF0dHJOYW1lIGluIHRoaXMuX2RlZmF1bHRzKSB7CgkJCQlpZih0aGlzLl9kZWZhdWx0cy5oYXNPd25Qcm9wZXJ0eShhdHRyTmFtZSkpewoJCQkJCXZhciBhdHRyVmFsdWUgPSAkaW5wdXQuYXR0cigndGltZTonICsgYXR0ck5hbWUpOwoJCQkJCWlmIChhdHRyVmFsdWUpIHsKCQkJCQkJdHJ5IHsKCQkJCQkJCWlubGluZVNldHRpbmdzW2F0dHJOYW1lXSA9IGV2YWwoYXR0clZhbHVlKTsKCQkJCQkJfSBjYXRjaCAoZXJyKSB7CgkJCQkJCQlpbmxpbmVTZXR0aW5nc1thdHRyTmFtZV0gPSBhdHRyVmFsdWU7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkgICAgb3ZlcnJpZGVzID0gewoJCSAgICAgICAgYmVmb3JlU2hvdzogZnVuY3Rpb24gKGlucHV0LCBkcF9pbnN0KSB7CgkJICAgICAgICAgICAgaWYgKCQuaXNGdW5jdGlvbih0cF9pbnN0Ll9kZWZhdWx0cy5ldm50cy5iZWZvcmVTaG93KSkgewoJCSAgICAgICAgICAgICAgICByZXR1cm4gdHBfaW5zdC5fZGVmYXVsdHMuZXZudHMuYmVmb3JlU2hvdy5jYWxsKCRpbnB1dFswXSwgaW5wdXQsIGRwX2luc3QsIHRwX2luc3QpOwoJCSAgICAgICAgICAgIH0KCQkgICAgICAgIH0sCgkJICAgICAgICBvbkNoYW5nZU1vbnRoWWVhcjogZnVuY3Rpb24gKHllYXIsIG1vbnRoLCBkcF9pbnN0KSB7CgkJICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB0aW1lIGFzIHdlbGwgOiB0aGlzIHByZXZlbnRzIHRoZSB0aW1lIGZyb20gZGlzYXBwZWFyaW5nIGZyb20gdGhlICRpbnB1dCBmaWVsZC4KCQkgICAgICAgICAgICB0cF9pbnN0Ll91cGRhdGVEYXRlVGltZShkcF9pbnN0KTsKCQkgICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKHRwX2luc3QuX2RlZmF1bHRzLmV2bnRzLm9uQ2hhbmdlTW9udGhZZWFyKSkgewoJCSAgICAgICAgICAgICAgICB0cF9pbnN0Ll9kZWZhdWx0cy5ldm50cy5vbkNoYW5nZU1vbnRoWWVhci5jYWxsKCRpbnB1dFswXSwgeWVhciwgbW9udGgsIGRwX2luc3QsIHRwX2luc3QpOwoJCSAgICAgICAgICAgIH0KCQkgICAgICAgIH0sCgkJICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbiAoZGF0ZVRleHQsIGRwX2luc3QpIHsKCQkgICAgICAgICAgICBpZiAodHBfaW5zdC50aW1lRGVmaW5lZCA9PT0gdHJ1ZSAmJiAkaW5wdXQudmFsKCkgIT09ICcnKSB7CgkJICAgICAgICAgICAgICAgIHRwX2luc3QuX3VwZGF0ZURhdGVUaW1lKGRwX2luc3QpOwoJCSAgICAgICAgICAgIH0KCQkgICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKHRwX2luc3QuX2RlZmF1bHRzLmV2bnRzLm9uQ2xvc2UpKSB7CgkJICAgICAgICAgICAgICAgIHRwX2luc3QuX2RlZmF1bHRzLmV2bnRzLm9uQ2xvc2UuY2FsbCgkaW5wdXRbMF0sIGRhdGVUZXh0LCBkcF9pbnN0LCB0cF9pbnN0KTsKCQkgICAgICAgICAgICB9CgkJICAgICAgICB9CgkJICAgIH07CgkJICAgIGZvciAoaSBpbiBvdmVycmlkZXMpIHsKCQkgICAgICAgIGlmIChvdmVycmlkZXMuaGFzT3duUHJvcGVydHkoaSkpIHsKCQkgICAgICAgICAgICBmbnNbaV0gPSBvW2ldIHx8IG51bGw7CgkJICAgICAgICB9CgkJICAgIH0KCQkgICAgdHBfaW5zdC5fZGVmYXVsdHMgPSAkLmV4dGVuZCh7fSwgdGhpcy5fZGVmYXVsdHMsIGlubGluZVNldHRpbmdzLCBvLCBvdmVycmlkZXMsIHsKCQkgICAgICAgIGV2bnRzOmZucywKCQkgICAgICAgIHRpbWVwaWNrZXI6IHRwX2luc3QgLy8gYWRkIHRpbWVwaWNrZXIgYXMgYSBwcm9wZXJ0eSBvZiBkYXRlcGlja2VyOiAkLmRhdGVwaWNrZXIuX2dldChkcF9pbnN0LCAndGltZXBpY2tlcicpOwoJCSAgICB9KTsKCQkJdHBfaW5zdC5hbU5hbWVzID0gJC5tYXAodHBfaW5zdC5fZGVmYXVsdHMuYW1OYW1lcywgZnVuY3Rpb24odmFsKSB7CgkJCQlyZXR1cm4gdmFsLnRvVXBwZXJDYXNlKCk7CgkJCX0pOwoJCQl0cF9pbnN0LnBtTmFtZXMgPSAkLm1hcCh0cF9pbnN0Ll9kZWZhdWx0cy5wbU5hbWVzLCBmdW5jdGlvbih2YWwpIHsKCQkJCXJldHVybiB2YWwudG9VcHBlckNhc2UoKTsKCQkJfSk7CgoJCQkvLyBjb250cm9sVHlwZSBpcyBzdHJpbmcgLSBrZXkgdG8gb3VyIHRoaXMuX2NvbnRyb2xzCgkJCWlmKHR5cGVvZih0cF9pbnN0Ll9kZWZhdWx0cy5jb250cm9sVHlwZSkgPT09ICdzdHJpbmcnKXsKCQkJCWlmKCQuZm5bdHBfaW5zdC5fZGVmYXVsdHMuY29udHJvbFR5cGVdID09PSB1bmRlZmluZWQpewoJCQkJCXRwX2luc3QuX2RlZmF1bHRzLmNvbnRyb2xUeXBlID0gJ3NlbGVjdCc7CgkJCQl9CgkJCQl0cF9pbnN0LmNvbnRyb2wgPSB0cF9pbnN0Ll9jb250cm9sc1t0cF9pbnN0Ll9kZWZhdWx0cy5jb250cm9sVHlwZV07CgkJCX0KCQkJLy8gY29udHJvbFR5cGUgaXMgYW4gb2JqZWN0IGFuZCBtdXN0IGltcGxlbWVudCBjcmVhdGUsIG9wdGlvbnMsIHZhbHVlIG1ldGhvZHMKCQkJZWxzZXsgCgkJCQl0cF9pbnN0LmNvbnRyb2wgPSB0cF9pbnN0Ll9kZWZhdWx0cy5jb250cm9sVHlwZTsKCQkJfQoKCQkJaWYgKHRwX2luc3QuX2RlZmF1bHRzLnRpbWV6b25lTGlzdCA9PT0gbnVsbCkgewoJCQkJdmFyIHRpbWV6b25lTGlzdCA9IFsnLTEyMDAnLCAnLTExMDAnLCAnLTEwMDAnLCAnLTA5MzAnLCAnLTA5MDAnLCAnLTA4MDAnLCAnLTA3MDAnLCAnLTA2MDAnLCAnLTA1MDAnLCAnLTA0MzAnLCAnLTA0MDAnLCAnLTAzMzAnLCAnLTAzMDAnLCAnLTAyMDAnLCAnLTAxMDAnLCAnKzAwMDAnLCAKCQkJCQkJCQkJJyswMTAwJywgJyswMjAwJywgJyswMzAwJywgJyswMzMwJywgJyswNDAwJywgJyswNDMwJywgJyswNTAwJywgJyswNTMwJywgJyswNTQ1JywgJyswNjAwJywgJyswNjMwJywgJyswNzAwJywgJyswODAwJywgJyswODQ1JywgJyswOTAwJywgJyswOTMwJywgCgkJCQkJCQkJCScrMTAwMCcsICcrMTAzMCcsICcrMTEwMCcsICcrMTEzMCcsICcrMTIwMCcsICcrMTI0NScsICcrMTMwMCcsICcrMTQwMCddOwoKCQkJCWlmICh0cF9pbnN0Ll9kZWZhdWx0cy50aW1lem9uZUlzbzg2MDEpIHsKCQkJCQl0aW1lem9uZUxpc3QgPSAkLm1hcCh0aW1lem9uZUxpc3QsIGZ1bmN0aW9uKHZhbCkgewoJCQkJCQlyZXR1cm4gdmFsID09ICcrMDAwMCcgPyAnWicgOiAodmFsLnN1YnN0cmluZygwLCAzKSArICc6JyArIHZhbC5zdWJzdHJpbmcoMykpOwoJCQkJCX0pOwoJCQkJfQoJCQkJdHBfaW5zdC5fZGVmYXVsdHMudGltZXpvbmVMaXN0ID0gdGltZXpvbmVMaXN0OwoJCQl9CgoJCQl0cF9pbnN0LnRpbWV6b25lID0gdHBfaW5zdC5fZGVmYXVsdHMudGltZXpvbmU7CgkJCXRwX2luc3QuaG91ciA9IHRwX2luc3QuX2RlZmF1bHRzLmhvdXI7CgkJCXRwX2luc3QubWludXRlID0gdHBfaW5zdC5fZGVmYXVsdHMubWludXRlOwoJCQl0cF9pbnN0LnNlY29uZCA9IHRwX2luc3QuX2RlZmF1bHRzLnNlY29uZDsKCQkJdHBfaW5zdC5taWxsaXNlYyA9IHRwX2luc3QuX2RlZmF1bHRzLm1pbGxpc2VjOwoJCQl0cF9pbnN0LmFtcG0gPSAnJzsKCQkJdHBfaW5zdC4kaW5wdXQgPSAkaW5wdXQ7CgoJCQlpZiAoby5hbHRGaWVsZCkgewoJCQkJdHBfaW5zdC4kYWx0SW5wdXQgPSAkKG8uYWx0RmllbGQpLmNzcyh7CgkJCQkJY3Vyc29yOiAncG9pbnRlcicKCQkJCX0pLmZvY3VzKGZ1bmN0aW9uKCkgewoJCQkJCSRpbnB1dC50cmlnZ2VyKCJmb2N1cyIpOwoJCQkJfSk7CgkJCX0KCgkJCWlmICh0cF9pbnN0Ll9kZWZhdWx0cy5taW5EYXRlID09PSAwIHx8IHRwX2luc3QuX2RlZmF1bHRzLm1pbkRhdGVUaW1lID09PSAwKSB7CgkJCQl0cF9pbnN0Ll9kZWZhdWx0cy5taW5EYXRlID0gbmV3IERhdGUoKTsKCQkJfQoJCQlpZiAodHBfaW5zdC5fZGVmYXVsdHMubWF4RGF0ZSA9PT0gMCB8fCB0cF9pbnN0Ll9kZWZhdWx0cy5tYXhEYXRlVGltZSA9PT0gMCkgewoJCQkJdHBfaW5zdC5fZGVmYXVsdHMubWF4RGF0ZSA9IG5ldyBEYXRlKCk7CgkJCX0KCgkJCS8vIGRhdGVwaWNrZXIgbmVlZHMgbWluRGF0ZS9tYXhEYXRlLCB0aW1lcGlja2VyIG5lZWRzIG1pbkRhdGVUaW1lL21heERhdGVUaW1lLi4KCQkJaWYgKHRwX2luc3QuX2RlZmF1bHRzLm1pbkRhdGUgIT09IHVuZGVmaW5lZCAmJiB0cF9pbnN0Ll9kZWZhdWx0cy5taW5EYXRlIGluc3RhbmNlb2YgRGF0ZSkgewoJCQkJdHBfaW5zdC5fZGVmYXVsdHMubWluRGF0ZVRpbWUgPSBuZXcgRGF0ZSh0cF9pbnN0Ll9kZWZhdWx0cy5taW5EYXRlLmdldFRpbWUoKSk7CgkJCX0KCQkJaWYgKHRwX2luc3QuX2RlZmF1bHRzLm1pbkRhdGVUaW1lICE9PSB1bmRlZmluZWQgJiYgdHBfaW5zdC5fZGVmYXVsdHMubWluRGF0ZVRpbWUgaW5zdGFuY2VvZiBEYXRlKSB7CgkJCQl0cF9pbnN0Ll9kZWZhdWx0cy5taW5EYXRlID0gbmV3IERhdGUodHBfaW5zdC5fZGVmYXVsdHMubWluRGF0ZVRpbWUuZ2V0VGltZSgpKTsKCQkJfQoJCQlpZiAodHBfaW5zdC5fZGVmYXVsdHMubWF4RGF0ZSAhPT0gdW5kZWZpbmVkICYmIHRwX2luc3QuX2RlZmF1bHRzLm1heERhdGUgaW5zdGFuY2VvZiBEYXRlKSB7CgkJCQl0cF9pbnN0Ll9kZWZhdWx0cy5tYXhEYXRlVGltZSA9IG5ldyBEYXRlKHRwX2luc3QuX2RlZmF1bHRzLm1heERhdGUuZ2V0VGltZSgpKTsKCQkJfQoJCQlpZiAodHBfaW5zdC5fZGVmYXVsdHMubWF4RGF0ZVRpbWUgIT09IHVuZGVmaW5lZCAmJiB0cF9pbnN0Ll9kZWZhdWx0cy5tYXhEYXRlVGltZSBpbnN0YW5jZW9mIERhdGUpIHsKCQkJCXRwX2luc3QuX2RlZmF1bHRzLm1heERhdGUgPSBuZXcgRGF0ZSh0cF9pbnN0Ll9kZWZhdWx0cy5tYXhEYXRlVGltZS5nZXRUaW1lKCkpOwoJCQl9CgkJCXRwX2luc3QuJGlucHV0LmJpbmQoJ2ZvY3VzJywgZnVuY3Rpb24oKSB7CgkJCQl0cF9pbnN0Ll9vbkZvY3VzKCk7CgkJCX0pOwoKCQkJcmV0dXJuIHRwX2luc3Q7CgkJfSwKCgkJLyoKCQkqIGFkZCBvdXIgc2xpZGVycyB0byB0aGUgY2FsZW5kYXIKCQkqLwoJCV9hZGRUaW1lUGlja2VyOiBmdW5jdGlvbihkcF9pbnN0KSB7CgkJCXZhciBjdXJyRFQgPSAodGhpcy4kYWx0SW5wdXQgJiYgdGhpcy5fZGVmYXVsdHMuYWx0RmllbGRUaW1lT25seSkgPyB0aGlzLiRpbnB1dC52YWwoKSArICcgJyArIHRoaXMuJGFsdElucHV0LnZhbCgpIDogdGhpcy4kaW5wdXQudmFsKCk7CgoJCQl0aGlzLnRpbWVEZWZpbmVkID0gdGhpcy5fcGFyc2VUaW1lKGN1cnJEVCk7CgkJCXRoaXMuX2xpbWl0TWluTWF4RGF0ZVRpbWUoZHBfaW5zdCwgZmFsc2UpOwoJCQl0aGlzLl9pbmplY3RUaW1lUGlja2VyKCk7CgkJfSwKCgkJLyoKCQkqIHBhcnNlIHRoZSB0aW1lIHN0cmluZyBmcm9tIGlucHV0IHZhbHVlIG9yIF9zZXRUaW1lCgkJKi8KCQlfcGFyc2VUaW1lOiBmdW5jdGlvbih0aW1lU3RyaW5nLCB3aXRoRGF0ZSkgewoJCQlpZiAoIXRoaXMuaW5zdCkgewoJCQkJdGhpcy5pbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KHRoaXMuJGlucHV0WzBdKTsKCQkJfQoKCQkJaWYgKHdpdGhEYXRlIHx8ICF0aGlzLl9kZWZhdWx0cy50aW1lT25seSkgewoJCQkJdmFyIGRwX2RhdGVGb3JtYXQgPSAkLmRhdGVwaWNrZXIuX2dldCh0aGlzLmluc3QsICdkYXRlRm9ybWF0Jyk7CgkJCQl0cnkgewoJCQkJCXZhciBwYXJzZVJlcyA9IHBhcnNlRGF0ZVRpbWVJbnRlcm5hbChkcF9kYXRlRm9ybWF0LCB0aGlzLl9kZWZhdWx0cy50aW1lRm9ybWF0LCB0aW1lU3RyaW5nLCAkLmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyh0aGlzLmluc3QpLCB0aGlzLl9kZWZhdWx0cyk7CgkJCQkJaWYgKCFwYXJzZVJlcy50aW1lT2JqKSB7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJJC5leHRlbmQodGhpcywgcGFyc2VSZXMudGltZU9iaik7CgkJCQl9IGNhdGNoIChlcnIpIHsKCQkJCQkkLmRhdGVwaWNrZXIubG9nKCJFcnJvciBwYXJzaW5nIHRoZSBkYXRlL3RpbWUgc3RyaW5nOiAiICsgZXJyICsKCQkJCQkJCQkJIlxuZGF0ZS90aW1lIHN0cmluZyA9ICIgKyB0aW1lU3RyaW5nICsKCQkJCQkJCQkJIlxudGltZUZvcm1hdCA9ICIgKyB0aGlzLl9kZWZhdWx0cy50aW1lRm9ybWF0ICsKCQkJCQkJCQkJIlxuZGF0ZUZvcm1hdCA9ICIgKyBkcF9kYXRlRm9ybWF0KTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCXZhciB0aW1lT2JqID0gJC5kYXRlcGlja2VyLnBhcnNlVGltZSh0aGlzLl9kZWZhdWx0cy50aW1lRm9ybWF0LCB0aW1lU3RyaW5nLCB0aGlzLl9kZWZhdWx0cyk7CgkJCQlpZiAoIXRpbWVPYmopIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQkkLmV4dGVuZCh0aGlzLCB0aW1lT2JqKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfSwKCgkJLyoKCQkqIGdlbmVyYXRlIGFuZCBpbmplY3QgaHRtbCBmb3IgdGltZXBpY2tlciBpbnRvIHVpIGRhdGVwaWNrZXIKCQkqLwoJCV9pbmplY3RUaW1lUGlja2VyOiBmdW5jdGlvbigpIHsKCQkJdmFyICRkcCA9IHRoaXMuaW5zdC5kcERpdiwKCQkJCW8gPSB0aGlzLmluc3Quc2V0dGluZ3MsCgkJCQl0cF9pbnN0ID0gdGhpcywKCQkJCWxpdGVtID0gJycsCgkJCQl1aXRlbSA9ICcnLAoJCQkJbWF4ID0ge30sCgkJCQlncmlkU2l6ZSA9IHt9LAoJCQkJc2l6ZSA9IG51bGw7CgoJCQkvLyBQcmV2ZW50IGRpc3BsYXlpbmcgdHdpY2UKCQkJaWYgKCRkcC5maW5kKCJkaXYudWktdGltZXBpY2tlci1kaXYiKS5sZW5ndGggPT09IDAgJiYgby5zaG93VGltZXBpY2tlcikgewoJCQkJdmFyIG5vRGlzcGxheSA9ICcgc3R5bGU9ImRpc3BsYXk6bm9uZTsiJywKCQkJCQlodG1sID0gJzxkaXYgY2xhc3M9InVpLXRpbWVwaWNrZXItZGl2JysgKG8uaXNSVEw/ICcgdWktdGltZXBpY2tlci1ydGwnIDogJycpICsnIj48ZGw+JyArICc8ZHQgY2xhc3M9InVpX3RwaWNrZXJfdGltZV9sYWJlbCInICsgKChvLnNob3dUaW1lKSA/ICcnIDogbm9EaXNwbGF5KSArICc+JyArIG8udGltZVRleHQgKyAnPC9kdD4nICsgCgkJCQkJCQkJJzxkZCBjbGFzcz0idWlfdHBpY2tlcl90aW1lIicgKyAoKG8uc2hvd1RpbWUpID8gJycgOiBub0Rpc3BsYXkpICsgJz48L2RkPic7CgoJCQkJLy8gQ3JlYXRlIHRoZSBtYXJrdXAKCQkJCWZvcih2YXIgaT0wLGw9dGhpcy51bml0cy5sZW5ndGg7IGk8bDsgaSsrKXsKCQkJCQlsaXRlbSA9IHRoaXMudW5pdHNbaV07CgkJCQkJdWl0ZW0gPSBsaXRlbS5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpICsgbGl0ZW0uc3Vic3RyKDEpOwoJCQkJCS8vIEFkZGVkIGJ5IFBldGVyIE1lZGVpcm9zOgoJCQkJCS8vIC0gRmlndXJlIG91dCB3aGF0IHRoZSBob3VyL21pbnV0ZS9zZWNvbmQgbWF4IHNob3VsZCBiZSBiYXNlZCBvbiB0aGUgc3RlcCB2YWx1ZXMuCgkJCQkJLy8gLSBFeGFtcGxlOiBpZiBzdGVwTWludXRlIGlzIDE1LCB0aGVuIG1pbk1heCBpcyA0NS4KCQkJCQltYXhbbGl0ZW1dID0gcGFyc2VJbnQoKG9bbGl0ZW0rJ01heCddIC0gKChvW2xpdGVtKydNYXgnXSAtIG9bbGl0ZW0rJ01pbiddKSAlIG9bJ3N0ZXAnK3VpdGVtXSkpLCAxMCk7CgkJCQkJZ3JpZFNpemVbbGl0ZW1dID0gMDsKCgkJCQkJaHRtbCArPSAnPGR0IGNsYXNzPSJ1aV90cGlja2VyXycrIGxpdGVtICsnX2xhYmVsIicgKyAoKG9bJ3Nob3cnK3VpdGVtXSkgPyAnJyA6IG5vRGlzcGxheSkgKyAnPicgKyBvW2xpdGVtICsnVGV4dCddICsgJzwvZHQ+JyArIAoJCQkJCQkJCSc8ZGQgY2xhc3M9InVpX3RwaWNrZXJfJysgbGl0ZW0gKyciPjxkaXYgY2xhc3M9InVpX3RwaWNrZXJfJysgbGl0ZW0gKydfc2xpZGVyIicgKyAoKG9bJ3Nob3cnK3VpdGVtXSkgPyAnJyA6IG5vRGlzcGxheSkgKyAnPjwvZGl2Pic7CgoJCQkJCWlmIChvWydzaG93Jyt1aXRlbV0gJiYgb1tsaXRlbSsnR3JpZCddID4gMCkgewoJCQkJCQlodG1sICs9ICc8ZGl2IHN0eWxlPSJwYWRkaW5nLWxlZnQ6IDFweCI+PHRhYmxlIGNsYXNzPSJ1aS10cGlja2VyLWdyaWQtbGFiZWwiPjx0cj4nOwoKCQkJCQkJaWYobGl0ZW0gPT0gJ2hvdXInKXsKCQkJCQkJCWZvciAodmFyIGggPSBvW2xpdGVtKydNaW4nXTsgaCA8PSBtYXhbbGl0ZW1dOyBoICs9IHBhcnNlSW50KG9bbGl0ZW0rJ0dyaWQnXSwgMTApKSB7CgkJCQkJCQkJZ3JpZFNpemVbbGl0ZW1dKys7CgkJCQkJCQkJdmFyIHRtcGggPSAkLmRhdGVwaWNrZXIuZm9ybWF0VGltZSh1c2VBbXBtKG8ucGlja2VyVGltZUZvcm1hdCB8fCBvLnRpbWVGb3JtYXQpPyAnaGh0JzonSEgnLCB7aG91cjpofSwgbyk7CQkJCQkJCQkJCgkJCQkJCQkJaHRtbCArPSAnPHRkIGRhdGEtZm9yPSInK2xpdGVtKyciPicgKyB0bXBoICsgJzwvdGQ+JzsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlewoJCQkJCQkJZm9yICh2YXIgbSA9IG9bbGl0ZW0rJ01pbiddOyBtIDw9IG1heFtsaXRlbV07IG0gKz0gcGFyc2VJbnQob1tsaXRlbSsnR3JpZCddLCAxMCkpIHsKCQkJCQkJCQlncmlkU2l6ZVtsaXRlbV0rKzsKCQkJCQkJCQlodG1sICs9ICc8dGQgZGF0YS1mb3I9IicrbGl0ZW0rJyI+JyArICgobSA8IDEwKSA/ICcwJyA6ICcnKSArIG0gKyAnPC90ZD4nOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlodG1sICs9ICc8L3RyPjwvdGFibGU+PC9kaXY+JzsKCQkJCQl9CgkJCQkJaHRtbCArPSAnPC9kZD4nOwoJCQkJfQoJCQkJCgkJCQkvLyBUaW1lem9uZQoJCQkJaHRtbCArPSAnPGR0IGNsYXNzPSJ1aV90cGlja2VyX3RpbWV6b25lX2xhYmVsIicgKyAoKG8uc2hvd1RpbWV6b25lKSA/ICcnIDogbm9EaXNwbGF5KSArICc+JyArIG8udGltZXpvbmVUZXh0ICsgJzwvZHQ+JzsKCQkJCWh0bWwgKz0gJzxkZCBjbGFzcz0idWlfdHBpY2tlcl90aW1lem9uZSIgJyArICgoby5zaG93VGltZXpvbmUpID8gJycgOiBub0Rpc3BsYXkpICsgJz48L2RkPic7CgoJCQkJLy8gQ3JlYXRlIHRoZSBlbGVtZW50cyBmcm9tIHN0cmluZwoJCQkJaHRtbCArPSAnPC9kbD48L2Rpdj4nOwoJCQkJdmFyICR0cCA9ICQoaHRtbCk7CgoJCQkJLy8gaWYgd2Ugb25seSB3YW50IHRpbWUgcGlja2VyLi4uCgkJCQlpZiAoby50aW1lT25seSA9PT0gdHJ1ZSkgewoJCQkJCSR0cC5wcmVwZW5kKCc8ZGl2IGNsYXNzPSJ1aS13aWRnZXQtaGVhZGVyIHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsIj4nICsgJzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItdGl0bGUiPicgKyBvLnRpbWVPbmx5VGl0bGUgKyAnPC9kaXY+JyArICc8L2Rpdj4nKTsKCQkJCQkkZHAuZmluZCgnLnVpLWRhdGVwaWNrZXItaGVhZGVyLCAudWktZGF0ZXBpY2tlci1jYWxlbmRhcicpLmhpZGUoKTsKCQkJCX0KCQkJCQoJCQkJLy8gYWRkIHNsaWRlcnMsIGFkanVzdCBncmlkcywgYWRkIGV2ZW50cwoJCQkJZm9yKHZhciBpPTAsbD10cF9pbnN0LnVuaXRzLmxlbmd0aDsgaTxsOyBpKyspewoJCQkJCWxpdGVtID0gdHBfaW5zdC51bml0c1tpXTsKCQkJCQl1aXRlbSA9IGxpdGVtLnN1YnN0cigwLDEpLnRvVXBwZXJDYXNlKCkgKyBsaXRlbS5zdWJzdHIoMSk7CgkJCQkJCgkJCQkJLy8gYWRkIHRoZSBzbGlkZXIKCQkJCQl0cF9pbnN0W2xpdGVtKydfc2xpZGVyJ10gPSB0cF9pbnN0LmNvbnRyb2wuY3JlYXRlKHRwX2luc3QsICR0cC5maW5kKCcudWlfdHBpY2tlcl8nK2xpdGVtKydfc2xpZGVyJyksIGxpdGVtLCB0cF9pbnN0W2xpdGVtXSwgb1tsaXRlbSsnTWluJ10sIG1heFtsaXRlbV0sIG9bJ3N0ZXAnK3VpdGVtXSk7CgoJCQkJCS8vIGFkanVzdCB0aGUgZ3JpZCBhbmQgYWRkIGNsaWNrIGV2ZW50CgkJCQkJaWYgKG9bJ3Nob3cnK3VpdGVtXSAmJiBvW2xpdGVtKydHcmlkJ10gPiAwKSB7CgkJCQkJCXNpemUgPSAxMDAgKiBncmlkU2l6ZVtsaXRlbV0gKiBvW2xpdGVtKydHcmlkJ10gLyAobWF4W2xpdGVtXSAtIG9bbGl0ZW0rJ01pbiddKTsKCQkJCQkJJHRwLmZpbmQoJy51aV90cGlja2VyXycrbGl0ZW0rJyB0YWJsZScpLmNzcyh7CgkJCQkJCQl3aWR0aDogc2l6ZSArICIlIiwKCQkJCQkJCW1hcmdpbkxlZnQ6IG8uaXNSVEw/ICcwJyA6ICgoc2l6ZSAvICgtMiAqIGdyaWRTaXplW2xpdGVtXSkpICsgIiUiKSwKCQkJCQkJCW1hcmdpblJpZ2h0OiBvLmlzUlRMPyAoKHNpemUgLyAoLTIgKiBncmlkU2l6ZVtsaXRlbV0pKSArICIlIikgOiAnMCcsCgkJCQkJCQlib3JkZXJDb2xsYXBzZTogJ2NvbGxhcHNlJwoJCQkJCQl9KS5maW5kKCJ0ZCIpLmNsaWNrKGZ1bmN0aW9uKGUpewoJCQkJCQkJCXZhciAkdCA9ICQodGhpcyksCgkJCQkJCQkJCWggPSAkdC5odG1sKCksCgkJCQkJCQkJCW4gPSBwYXJzZUludChoLnJlcGxhY2UoL1teMC05XS9nKSwxMCksCgkJCQkJCQkJCWFwID0gaC5yZXBsYWNlKC9bXmFwbV0vaWcpLAoJCQkJCQkJCQlmID0gJHQuZGF0YSgnZm9yJyk7IC8vIGxvc2VzIHNjb3BlLCBzbyB3ZSB1c2UgZGF0YS1mb3IKCgkJCQkJCQkJaWYoZiA9PSAnaG91cicpewoJCQkJCQkJCQlpZihhcC5pbmRleE9mKCdwJykgIT09IC0xICYmIG4gPCAxMil7CgkJCQkJCQkJCQluICs9IDEyOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWVsc2V7CgkJCQkJCQkJCQlpZihhcC5pbmRleE9mKCdhJykgIT09IC0xICYmIG4gPT09IDEyKXsKCQkJCQkJCQkJCQluID0gMDsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQkKCQkJCQkJCQl0cF9pbnN0LmNvbnRyb2wudmFsdWUodHBfaW5zdCwgdHBfaW5zdFtmKydfc2xpZGVyJ10sIGxpdGVtLCBuKTsKCgkJCQkJCQkJdHBfaW5zdC5fb25UaW1lQ2hhbmdlKCk7CgkJCQkJCQkJdHBfaW5zdC5fb25TZWxlY3RIYW5kbGVyKCk7CgkJCQkJCQl9KQoJCQkJCQkuY3NzKHsKCQkJCQkJCQljdXJzb3I6ICdwb2ludGVyJywKCQkJCQkJCQl3aWR0aDogKDEwMCAvIGdyaWRTaXplW2xpdGVtXSkgKyAnJScsCgkJCQkJCQkJdGV4dEFsaWduOiAnY2VudGVyJywKCQkJCQkJCQlvdmVyZmxvdzogJ2hpZGRlbicKCQkJCQkJCX0pOwoJCQkJCX0gLy8gZW5kIGlmIGdyaWQgPiAwCgkJCQl9IC8vIGVuZCBmb3IgbG9vcAoKCQkJCS8vIEFkZCB0aW1lem9uZSBvcHRpb25zCgkJCQl0aGlzLnRpbWV6b25lX3NlbGVjdCA9ICR0cC5maW5kKCcudWlfdHBpY2tlcl90aW1lem9uZScpLmFwcGVuZCgnPHNlbGVjdD48L3NlbGVjdD4nKS5maW5kKCJzZWxlY3QiKTsKCQkJCSQuZm4uYXBwZW5kLmFwcGx5KHRoaXMudGltZXpvbmVfc2VsZWN0LAoJCQkJJC5tYXAoby50aW1lem9uZUxpc3QsIGZ1bmN0aW9uKHZhbCwgaWR4KSB7CgkJCQkJcmV0dXJuICQoIjxvcHRpb24gLz4iKS52YWwodHlwZW9mIHZhbCA9PSAib2JqZWN0IiA/IHZhbC52YWx1ZSA6IHZhbCkudGV4dCh0eXBlb2YgdmFsID09ICJvYmplY3QiID8gdmFsLmxhYmVsIDogdmFsKTsKCQkJCX0pKTsKCQkJCWlmICh0eXBlb2YodGhpcy50aW1lem9uZSkgIT0gInVuZGVmaW5lZCIgJiYgdGhpcy50aW1lem9uZSAhPT0gbnVsbCAmJiB0aGlzLnRpbWV6b25lICE9PSAiIikgewoJCQkJCXZhciBsb2NhbF9kYXRlID0gbmV3IERhdGUodGhpcy5pbnN0LnNlbGVjdGVkWWVhciwgdGhpcy5pbnN0LnNlbGVjdGVkTW9udGgsIHRoaXMuaW5zdC5zZWxlY3RlZERheSwgMTIpOwoJCQkJCXZhciBsb2NhbF90aW1lem9uZSA9ICQudGltZXBpY2tlci50aW1lWm9uZU9mZnNldFN0cmluZyhsb2NhbF9kYXRlKTsKCQkJCQlpZiAobG9jYWxfdGltZXpvbmUgPT0gdGhpcy50aW1lem9uZSkgewoJCQkJCQlzZWxlY3RMb2NhbFRpbWVab25lKHRwX2luc3QpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXRoaXMudGltZXpvbmVfc2VsZWN0LnZhbCh0aGlzLnRpbWV6b25lKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCWlmICh0eXBlb2YodGhpcy5ob3VyKSAhPSAidW5kZWZpbmVkIiAmJiB0aGlzLmhvdXIgIT09IG51bGwgJiYgdGhpcy5ob3VyICE9PSAiIikgewoJCQkJCQl0aGlzLnRpbWV6b25lX3NlbGVjdC52YWwoby5kZWZhdWx0VGltZXpvbmUpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXNlbGVjdExvY2FsVGltZVpvbmUodHBfaW5zdCk7CgkJCQkJfQoJCQkJfQoJCQkJdGhpcy50aW1lem9uZV9zZWxlY3QuY2hhbmdlKGZ1bmN0aW9uKCkgewoJCQkJCXRwX2luc3QuX2RlZmF1bHRzLnVzZUxvY2FsVGltZXpvbmUgPSBmYWxzZTsKCQkJCQl0cF9pbnN0Ll9vblRpbWVDaGFuZ2UoKTsKCQkJCX0pOwoJCQkJLy8gRW5kIHRpbWV6b25lIG9wdGlvbnMKCQkJCQoJCQkJLy8gaW5qZWN0IHRpbWVwaWNrZXIgaW50byBkYXRlcGlja2VyCgkJCQl2YXIgJGJ1dHRvblBhbmVsID0gJGRwLmZpbmQoJy51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUnKTsKCQkJCWlmICgkYnV0dG9uUGFuZWwubGVuZ3RoKSB7CgkJCQkJJGJ1dHRvblBhbmVsLmJlZm9yZSgkdHApOwoJCQkJfSBlbHNlIHsKCQkJCQkkZHAuYXBwZW5kKCR0cCk7CgkJCQl9CgoJCQkJdGhpcy4kdGltZU9iaiA9ICR0cC5maW5kKCcudWlfdHBpY2tlcl90aW1lJyk7CgoJCQkJaWYgKHRoaXMuaW5zdCAhPT0gbnVsbCkgewoJCQkJCXZhciB0aW1lRGVmaW5lZCA9IHRoaXMudGltZURlZmluZWQ7CgkJCQkJdGhpcy5fb25UaW1lQ2hhbmdlKCk7CgkJCQkJdGhpcy50aW1lRGVmaW5lZCA9IHRpbWVEZWZpbmVkOwoJCQkJfQoKCQkJCS8vIHNsaWRlQWNjZXNzIGludGVncmF0aW9uOiBodHRwOi8vdHJlbnRyaWNoYXJkc29uLmNvbS8yMDExLzExLzExL2pxdWVyeS11aS1zbGlkZXJzLWFuZC10b3VjaC1hY2Nlc3NpYmlsaXR5LwoJCQkJaWYgKHRoaXMuX2RlZmF1bHRzLmFkZFNsaWRlckFjY2VzcykgewoJCQkJCXZhciBzbGlkZXJBY2Nlc3NBcmdzID0gdGhpcy5fZGVmYXVsdHMuc2xpZGVyQWNjZXNzQXJncywKCQkJCQkJcnRsID0gdGhpcy5fZGVmYXVsdHMuaXNSVEw7CgkJCQkJc2xpZGVyQWNjZXNzQXJncy5pc1JUTCA9IHJ0bDsKCQkJCQkJCgkJCQkJc2V0VGltZW91dChmdW5jdGlvbigpIHsgLy8gZml4IGZvciBpbmxpbmUgbW9kZQoJCQkJCQlpZiAoJHRwLmZpbmQoJy51aS1zbGlkZXItYWNjZXNzJykubGVuZ3RoID09PSAwKSB7CgkJCQkJCQkkdHAuZmluZCgnLnVpLXNsaWRlcjp2aXNpYmxlJykuc2xpZGVyQWNjZXNzKHNsaWRlckFjY2Vzc0FyZ3MpOwoKCQkJCQkJCS8vIGZpeCBhbnkgZ3JpZHMgc2luY2Ugc2xpZGVycyBhcmUgc2hvcnRlcgoJCQkJCQkJdmFyIHNsaWRlckFjY2Vzc1dpZHRoID0gJHRwLmZpbmQoJy51aS1zbGlkZXItYWNjZXNzOmVxKDApJykub3V0ZXJXaWR0aCh0cnVlKTsKCQkJCQkJCWlmIChzbGlkZXJBY2Nlc3NXaWR0aCkgewoJCQkJCQkJCSR0cC5maW5kKCd0YWJsZTp2aXNpYmxlJykuZWFjaChmdW5jdGlvbigpIHsKCQkJCQkJCQkJdmFyICRnID0gJCh0aGlzKSwKCQkJCQkJCQkJCW9sZFdpZHRoID0gJGcub3V0ZXJXaWR0aCgpLAoJCQkJCQkJCQkJb2xkTWFyZ2luTGVmdCA9ICRnLmNzcyhydGw/ICdtYXJnaW5SaWdodCc6J21hcmdpbkxlZnQnKS50b1N0cmluZygpLnJlcGxhY2UoJyUnLCAnJyksCgkJCQkJCQkJCQluZXdXaWR0aCA9IG9sZFdpZHRoIC0gc2xpZGVyQWNjZXNzV2lkdGgsCgkJCQkJCQkJCQluZXdNYXJnaW5MZWZ0ID0gKChvbGRNYXJnaW5MZWZ0ICogbmV3V2lkdGgpIC8gb2xkV2lkdGgpICsgJyUnLAoJCQkJCQkJCQkJY3NzID0geyB3aWR0aDogbmV3V2lkdGgsIG1hcmdpblJpZ2h0OiAwLCBtYXJnaW5MZWZ0OiAwIH07CgkJCQkJCQkJCWNzc1tydGw/ICdtYXJnaW5SaWdodCc6J21hcmdpbkxlZnQnXSA9IG5ld01hcmdpbkxlZnQ7CgkJCQkJCQkJCSRnLmNzcyhjc3MpOwoJCQkJCQkJCX0pOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfSwgMTApOwoJCQkJfQoJCQkJLy8gZW5kIHNsaWRlQWNjZXNzIGludGVncmF0aW9uCgoJCQl9CgkJfSwKCgkJLyoKCQkqIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gbGltaXQgdGhlIGFiaWxpdHkgdG8gZ28gb3V0c2lkZSB0aGUKCQkqIG1pbi9tYXggZGF0ZSByYW5nZQoJCSovCgkJX2xpbWl0TWluTWF4RGF0ZVRpbWU6IGZ1bmN0aW9uKGRwX2luc3QsIGFkanVzdFNsaWRlcnMpIHsKCQkJdmFyIG8gPSB0aGlzLl9kZWZhdWx0cywKCQkJCWRwX2RhdGUgPSBuZXcgRGF0ZShkcF9pbnN0LnNlbGVjdGVkWWVhciwgZHBfaW5zdC5zZWxlY3RlZE1vbnRoLCBkcF9pbnN0LnNlbGVjdGVkRGF5KTsKCgkJCWlmICghdGhpcy5fZGVmYXVsdHMuc2hvd1RpbWVwaWNrZXIpIHsKCQkJCXJldHVybjsKCQkJfSAvLyBObyB0aW1lIHNvIG5vdGhpbmcgdG8gY2hlY2sgaGVyZQoKCQkJaWYgKCQuZGF0ZXBpY2tlci5fZ2V0KGRwX2luc3QsICdtaW5EYXRlVGltZScpICE9PSBudWxsICYmICQuZGF0ZXBpY2tlci5fZ2V0KGRwX2luc3QsICdtaW5EYXRlVGltZScpICE9PSB1bmRlZmluZWQgJiYgZHBfZGF0ZSkgewoJCQkJdmFyIG1pbkRhdGVUaW1lID0gJC5kYXRlcGlja2VyLl9nZXQoZHBfaW5zdCwgJ21pbkRhdGVUaW1lJyksCgkJCQkJbWluRGF0ZVRpbWVEYXRlID0gbmV3IERhdGUobWluRGF0ZVRpbWUuZ2V0RnVsbFllYXIoKSwgbWluRGF0ZVRpbWUuZ2V0TW9udGgoKSwgbWluRGF0ZVRpbWUuZ2V0RGF0ZSgpLCAwLCAwLCAwLCAwKTsKCgkJCQlpZiAodGhpcy5ob3VyTWluT3JpZ2luYWwgPT09IG51bGwgfHwgdGhpcy5taW51dGVNaW5PcmlnaW5hbCA9PT0gbnVsbCB8fCB0aGlzLnNlY29uZE1pbk9yaWdpbmFsID09PSBudWxsIHx8IHRoaXMubWlsbGlzZWNNaW5PcmlnaW5hbCA9PT0gbnVsbCkgewoJCQkJCXRoaXMuaG91ck1pbk9yaWdpbmFsID0gby5ob3VyTWluOwoJCQkJCXRoaXMubWludXRlTWluT3JpZ2luYWwgPSBvLm1pbnV0ZU1pbjsKCQkJCQl0aGlzLnNlY29uZE1pbk9yaWdpbmFsID0gby5zZWNvbmRNaW47CgkJCQkJdGhpcy5taWxsaXNlY01pbk9yaWdpbmFsID0gby5taWxsaXNlY01pbjsKCQkJCX0KCgkJCQlpZiAoZHBfaW5zdC5zZXR0aW5ncy50aW1lT25seSB8fCBtaW5EYXRlVGltZURhdGUuZ2V0VGltZSgpID09IGRwX2RhdGUuZ2V0VGltZSgpKSB7CgkJCQkJdGhpcy5fZGVmYXVsdHMuaG91ck1pbiA9IG1pbkRhdGVUaW1lLmdldEhvdXJzKCk7CgkJCQkJaWYgKHRoaXMuaG91ciA8PSB0aGlzLl9kZWZhdWx0cy5ob3VyTWluKSB7CgkJCQkJCXRoaXMuaG91ciA9IHRoaXMuX2RlZmF1bHRzLmhvdXJNaW47CgkJCQkJCXRoaXMuX2RlZmF1bHRzLm1pbnV0ZU1pbiA9IG1pbkRhdGVUaW1lLmdldE1pbnV0ZXMoKTsKCQkJCQkJaWYgKHRoaXMubWludXRlIDw9IHRoaXMuX2RlZmF1bHRzLm1pbnV0ZU1pbikgewoJCQkJCQkJdGhpcy5taW51dGUgPSB0aGlzLl9kZWZhdWx0cy5taW51dGVNaW47CgkJCQkJCQl0aGlzLl9kZWZhdWx0cy5zZWNvbmRNaW4gPSBtaW5EYXRlVGltZS5nZXRTZWNvbmRzKCk7CgkJCQkJCQlpZiAodGhpcy5zZWNvbmQgPD0gdGhpcy5fZGVmYXVsdHMuc2Vjb25kTWluKSB7CgkJCQkJCQkJdGhpcy5zZWNvbmQgPSB0aGlzLl9kZWZhdWx0cy5zZWNvbmRNaW47CgkJCQkJCQkJdGhpcy5fZGVmYXVsdHMubWlsbGlzZWNNaW4gPSBtaW5EYXRlVGltZS5nZXRNaWxsaXNlY29uZHMoKTsKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJaWYgKHRoaXMubWlsbGlzZWMgPCB0aGlzLl9kZWZhdWx0cy5taWxsaXNlY01pbikgewoJCQkJCQkJCQl0aGlzLm1pbGxpc2VjID0gdGhpcy5fZGVmYXVsdHMubWlsbGlzZWNNaW47CgkJCQkJCQkJfQoJCQkJCQkJCXRoaXMuX2RlZmF1bHRzLm1pbGxpc2VjTWluID0gdGhpcy5taWxsaXNlY01pbk9yaWdpbmFsOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJdGhpcy5fZGVmYXVsdHMuc2Vjb25kTWluID0gdGhpcy5zZWNvbmRNaW5PcmlnaW5hbDsKCQkJCQkJCXRoaXMuX2RlZmF1bHRzLm1pbGxpc2VjTWluID0gdGhpcy5taWxsaXNlY01pbk9yaWdpbmFsOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJdGhpcy5fZGVmYXVsdHMubWludXRlTWluID0gdGhpcy5taW51dGVNaW5PcmlnaW5hbDsKCQkJCQkJdGhpcy5fZGVmYXVsdHMuc2Vjb25kTWluID0gdGhpcy5zZWNvbmRNaW5PcmlnaW5hbDsKCQkJCQkJdGhpcy5fZGVmYXVsdHMubWlsbGlzZWNNaW4gPSB0aGlzLm1pbGxpc2VjTWluT3JpZ2luYWw7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQl0aGlzLl9kZWZhdWx0cy5ob3VyTWluID0gdGhpcy5ob3VyTWluT3JpZ2luYWw7CgkJCQkJdGhpcy5fZGVmYXVsdHMubWludXRlTWluID0gdGhpcy5taW51dGVNaW5PcmlnaW5hbDsKCQkJCQl0aGlzLl9kZWZhdWx0cy5zZWNvbmRNaW4gPSB0aGlzLnNlY29uZE1pbk9yaWdpbmFsOwoJCQkJCXRoaXMuX2RlZmF1bHRzLm1pbGxpc2VjTWluID0gdGhpcy5taWxsaXNlY01pbk9yaWdpbmFsOwoJCQkJfQoJCQl9CgoJCQlpZiAoJC5kYXRlcGlja2VyLl9nZXQoZHBfaW5zdCwgJ21heERhdGVUaW1lJykgIT09IG51bGwgJiYgJC5kYXRlcGlja2VyLl9nZXQoZHBfaW5zdCwgJ21heERhdGVUaW1lJykgIT09IHVuZGVmaW5lZCAmJiBkcF9kYXRlKSB7CgkJCQl2YXIgbWF4RGF0ZVRpbWUgPSAkLmRhdGVwaWNrZXIuX2dldChkcF9pbnN0LCAnbWF4RGF0ZVRpbWUnKSwKCQkJCQltYXhEYXRlVGltZURhdGUgPSBuZXcgRGF0ZShtYXhEYXRlVGltZS5nZXRGdWxsWWVhcigpLCBtYXhEYXRlVGltZS5nZXRNb250aCgpLCBtYXhEYXRlVGltZS5nZXREYXRlKCksIDAsIDAsIDAsIDApOwoKCQkJCWlmICh0aGlzLmhvdXJNYXhPcmlnaW5hbCA9PT0gbnVsbCB8fCB0aGlzLm1pbnV0ZU1heE9yaWdpbmFsID09PSBudWxsIHx8IHRoaXMuc2Vjb25kTWF4T3JpZ2luYWwgPT09IG51bGwpIHsKCQkJCQl0aGlzLmhvdXJNYXhPcmlnaW5hbCA9IG8uaG91ck1heDsKCQkJCQl0aGlzLm1pbnV0ZU1heE9yaWdpbmFsID0gby5taW51dGVNYXg7CgkJCQkJdGhpcy5zZWNvbmRNYXhPcmlnaW5hbCA9IG8uc2Vjb25kTWF4OwoJCQkJCXRoaXMubWlsbGlzZWNNYXhPcmlnaW5hbCA9IG8ubWlsbGlzZWNNYXg7CgkJCQl9CgoJCQkJaWYgKGRwX2luc3Quc2V0dGluZ3MudGltZU9ubHkgfHwgbWF4RGF0ZVRpbWVEYXRlLmdldFRpbWUoKSA9PSBkcF9kYXRlLmdldFRpbWUoKSkgewoJCQkJCXRoaXMuX2RlZmF1bHRzLmhvdXJNYXggPSBtYXhEYXRlVGltZS5nZXRIb3VycygpOwoJCQkJCWlmICh0aGlzLmhvdXIgPj0gdGhpcy5fZGVmYXVsdHMuaG91ck1heCkgewoJCQkJCQl0aGlzLmhvdXIgPSB0aGlzLl9kZWZhdWx0cy5ob3VyTWF4OwoJCQkJCQl0aGlzLl9kZWZhdWx0cy5taW51dGVNYXggPSBtYXhEYXRlVGltZS5nZXRNaW51dGVzKCk7CgkJCQkJCWlmICh0aGlzLm1pbnV0ZSA+PSB0aGlzLl9kZWZhdWx0cy5taW51dGVNYXgpIHsKCQkJCQkJCXRoaXMubWludXRlID0gdGhpcy5fZGVmYXVsdHMubWludXRlTWF4OwoJCQkJCQkJdGhpcy5fZGVmYXVsdHMuc2Vjb25kTWF4ID0gbWF4RGF0ZVRpbWUuZ2V0U2Vjb25kcygpOwoJCQkJCQl9IGVsc2UgaWYgKHRoaXMuc2Vjb25kID49IHRoaXMuX2RlZmF1bHRzLnNlY29uZE1heCkgewoJCQkJCQkJdGhpcy5zZWNvbmQgPSB0aGlzLl9kZWZhdWx0cy5zZWNvbmRNYXg7CgkJCQkJCQl0aGlzLl9kZWZhdWx0cy5taWxsaXNlY01heCA9IG1heERhdGVUaW1lLmdldE1pbGxpc2Vjb25kcygpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJaWYgKHRoaXMubWlsbGlzZWMgPiB0aGlzLl9kZWZhdWx0cy5taWxsaXNlY01heCkgewoJCQkJCQkJCXRoaXMubWlsbGlzZWMgPSB0aGlzLl9kZWZhdWx0cy5taWxsaXNlY01heDsKCQkJCQkJCX0KCQkJCQkJCXRoaXMuX2RlZmF1bHRzLm1pbGxpc2VjTWF4ID0gdGhpcy5taWxsaXNlY01heE9yaWdpbmFsOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJdGhpcy5fZGVmYXVsdHMubWludXRlTWF4ID0gdGhpcy5taW51dGVNYXhPcmlnaW5hbDsKCQkJCQkJdGhpcy5fZGVmYXVsdHMuc2Vjb25kTWF4ID0gdGhpcy5zZWNvbmRNYXhPcmlnaW5hbDsKCQkJCQkJdGhpcy5fZGVmYXVsdHMubWlsbGlzZWNNYXggPSB0aGlzLm1pbGxpc2VjTWF4T3JpZ2luYWw7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQl0aGlzLl9kZWZhdWx0cy5ob3VyTWF4ID0gdGhpcy5ob3VyTWF4T3JpZ2luYWw7CgkJCQkJdGhpcy5fZGVmYXVsdHMubWludXRlTWF4ID0gdGhpcy5taW51dGVNYXhPcmlnaW5hbDsKCQkJCQl0aGlzLl9kZWZhdWx0cy5zZWNvbmRNYXggPSB0aGlzLnNlY29uZE1heE9yaWdpbmFsOwoJCQkJCXRoaXMuX2RlZmF1bHRzLm1pbGxpc2VjTWF4ID0gdGhpcy5taWxsaXNlY01heE9yaWdpbmFsOwoJCQkJfQoJCQl9CgoJCQlpZiAoYWRqdXN0U2xpZGVycyAhPT0gdW5kZWZpbmVkICYmIGFkanVzdFNsaWRlcnMgPT09IHRydWUpIHsKCQkJCXZhciBob3VyTWF4ID0gcGFyc2VJbnQoKHRoaXMuX2RlZmF1bHRzLmhvdXJNYXggLSAoKHRoaXMuX2RlZmF1bHRzLmhvdXJNYXggLSB0aGlzLl9kZWZhdWx0cy5ob3VyTWluKSAlIHRoaXMuX2RlZmF1bHRzLnN0ZXBIb3VyKSksIDEwKSwKCQkJCQltaW5NYXggPSBwYXJzZUludCgodGhpcy5fZGVmYXVsdHMubWludXRlTWF4IC0gKCh0aGlzLl9kZWZhdWx0cy5taW51dGVNYXggLSB0aGlzLl9kZWZhdWx0cy5taW51dGVNaW4pICUgdGhpcy5fZGVmYXVsdHMuc3RlcE1pbnV0ZSkpLCAxMCksCgkJCQkJc2VjTWF4ID0gcGFyc2VJbnQoKHRoaXMuX2RlZmF1bHRzLnNlY29uZE1heCAtICgodGhpcy5fZGVmYXVsdHMuc2Vjb25kTWF4IC0gdGhpcy5fZGVmYXVsdHMuc2Vjb25kTWluKSAlIHRoaXMuX2RlZmF1bHRzLnN0ZXBTZWNvbmQpKSwgMTApLAoJCQkJCW1pbGxpc2VjTWF4ID0gcGFyc2VJbnQoKHRoaXMuX2RlZmF1bHRzLm1pbGxpc2VjTWF4IC0gKCh0aGlzLl9kZWZhdWx0cy5taWxsaXNlY01heCAtIHRoaXMuX2RlZmF1bHRzLm1pbGxpc2VjTWluKSAlIHRoaXMuX2RlZmF1bHRzLnN0ZXBNaWxsaXNlYykpLCAxMCk7CgoJCQkJaWYgKHRoaXMuaG91cl9zbGlkZXIpIHsKCQkJCQl0aGlzLmNvbnRyb2wub3B0aW9ucyh0aGlzLCB0aGlzLmhvdXJfc2xpZGVyLCAnaG91cicsIHsgbWluOiB0aGlzLl9kZWZhdWx0cy5ob3VyTWluLCBtYXg6IGhvdXJNYXggfSk7CgkJCQkJdGhpcy5jb250cm9sLnZhbHVlKHRoaXMsIHRoaXMuaG91cl9zbGlkZXIsICdob3VyJywgdGhpcy5ob3VyKTsKCQkJCX0KCQkJCWlmICh0aGlzLm1pbnV0ZV9zbGlkZXIpIHsKCQkJCQl0aGlzLmNvbnRyb2wub3B0aW9ucyh0aGlzLCB0aGlzLm1pbnV0ZV9zbGlkZXIsICdtaW51dGUnLCB7IG1pbjogdGhpcy5fZGVmYXVsdHMubWludXRlTWluLCBtYXg6IG1pbk1heCB9KTsKCQkJCQl0aGlzLmNvbnRyb2wudmFsdWUodGhpcywgdGhpcy5taW51dGVfc2xpZGVyLCAnbWludXRlJywgdGhpcy5taW51dGUpOwoJCQkJfQoJCQkJaWYgKHRoaXMuc2Vjb25kX3NsaWRlcikgewoJCQkJCXRoaXMuY29udHJvbC5vcHRpb25zKHRoaXMsIHRoaXMuc2Vjb25kX3NsaWRlciwgJ3NlY29uZCcsIHsgbWluOiB0aGlzLl9kZWZhdWx0cy5zZWNvbmRNaW4sIG1heDogc2VjTWF4IH0pOwoJCQkJCXRoaXMuY29udHJvbC52YWx1ZSh0aGlzLCB0aGlzLnNlY29uZF9zbGlkZXIsICdzZWNvbmQnLCB0aGlzLnNlY29uZCk7CgkJCQl9CgkJCQlpZiAodGhpcy5taWxsaXNlY19zbGlkZXIpIHsKCQkJCQl0aGlzLmNvbnRyb2wub3B0aW9ucyh0aGlzLCB0aGlzLm1pbGxpc2VjX3NsaWRlciwgJ21pbGxpc2VjJywgeyBtaW46IHRoaXMuX2RlZmF1bHRzLm1pbGxpc2VjTWluLCBtYXg6IG1pbGxpc2VjTWF4IH0pOwoJCQkJCXRoaXMuY29udHJvbC52YWx1ZSh0aGlzLCB0aGlzLm1pbGxpc2VjX3NsaWRlciwgJ21pbGxpc2VjJywgdGhpcy5taWxsaXNlYyk7CgkJCQl9CgkJCX0KCgkJfSwKCgkJLyoKCQkqIHdoZW4gYSBzbGlkZXIgbW92ZXMsIHNldCB0aGUgaW50ZXJuYWwgdGltZS4uLgoJCSogb24gdGltZSBjaGFuZ2UgaXMgYWxzbyBjYWxsZWQgd2hlbiB0aGUgdGltZSBpcyB1cGRhdGVkIGluIHRoZSB0ZXh0IGZpZWxkCgkJKi8KCQlfb25UaW1lQ2hhbmdlOiBmdW5jdGlvbigpIHsKCQkJdmFyIGhvdXIgPSAodGhpcy5ob3VyX3NsaWRlcikgPyB0aGlzLmNvbnRyb2wudmFsdWUodGhpcywgdGhpcy5ob3VyX3NsaWRlciwgJ2hvdXInKSA6IGZhbHNlLAoJCQkJbWludXRlID0gKHRoaXMubWludXRlX3NsaWRlcikgPyB0aGlzLmNvbnRyb2wudmFsdWUodGhpcywgdGhpcy5taW51dGVfc2xpZGVyLCAnbWludXRlJykgOiBmYWxzZSwKCQkJCXNlY29uZCA9ICh0aGlzLnNlY29uZF9zbGlkZXIpID8gdGhpcy5jb250cm9sLnZhbHVlKHRoaXMsIHRoaXMuc2Vjb25kX3NsaWRlciwgJ3NlY29uZCcpIDogZmFsc2UsCgkJCQltaWxsaXNlYyA9ICh0aGlzLm1pbGxpc2VjX3NsaWRlcikgPyB0aGlzLmNvbnRyb2wudmFsdWUodGhpcywgdGhpcy5taWxsaXNlY19zbGlkZXIsICdtaWxsaXNlYycpIDogZmFsc2UsCgkJCQl0aW1lem9uZSA9ICh0aGlzLnRpbWV6b25lX3NlbGVjdCkgPyB0aGlzLnRpbWV6b25lX3NlbGVjdC52YWwoKSA6IGZhbHNlLAoJCQkJbyA9IHRoaXMuX2RlZmF1bHRzLAoJCQkJcGlja2VyVGltZUZvcm1hdCA9IG8ucGlja2VyVGltZUZvcm1hdCB8fCBvLnRpbWVGb3JtYXQsCgkJCQlwaWNrZXJUaW1lU3VmZml4ID0gby5waWNrZXJUaW1lU3VmZml4IHx8IG8udGltZVN1ZmZpeDsKCgkJCWlmICh0eXBlb2YoaG91cikgPT0gJ29iamVjdCcpIHsKCQkJCWhvdXIgPSBmYWxzZTsKCQkJfQoJCQlpZiAodHlwZW9mKG1pbnV0ZSkgPT0gJ29iamVjdCcpIHsKCQkJCW1pbnV0ZSA9IGZhbHNlOwoJCQl9CgkJCWlmICh0eXBlb2Yoc2Vjb25kKSA9PSAnb2JqZWN0JykgewoJCQkJc2Vjb25kID0gZmFsc2U7CgkJCX0KCQkJaWYgKHR5cGVvZihtaWxsaXNlYykgPT0gJ29iamVjdCcpIHsKCQkJCW1pbGxpc2VjID0gZmFsc2U7CgkJCX0KCQkJaWYgKHR5cGVvZih0aW1lem9uZSkgPT0gJ29iamVjdCcpIHsKCQkJCXRpbWV6b25lID0gZmFsc2U7CgkJCX0KCgkJCWlmIChob3VyICE9PSBmYWxzZSkgewoJCQkJaG91ciA9IHBhcnNlSW50KGhvdXIsIDEwKTsKCQkJfQoJCQlpZiAobWludXRlICE9PSBmYWxzZSkgewoJCQkJbWludXRlID0gcGFyc2VJbnQobWludXRlLCAxMCk7CgkJCX0KCQkJaWYgKHNlY29uZCAhPT0gZmFsc2UpIHsKCQkJCXNlY29uZCA9IHBhcnNlSW50KHNlY29uZCwgMTApOwoJCQl9CgkJCWlmIChtaWxsaXNlYyAhPT0gZmFsc2UpIHsKCQkJCW1pbGxpc2VjID0gcGFyc2VJbnQobWlsbGlzZWMsIDEwKTsKCQkJfQoKCQkJdmFyIGFtcG0gPSBvW2hvdXIgPCAxMiA/ICdhbU5hbWVzJyA6ICdwbU5hbWVzJ11bMF07CgoJCQkvLyBJZiB0aGUgdXBkYXRlIHdhcyBkb25lIGluIHRoZSBpbnB1dCBmaWVsZCwgdGhlIGlucHV0IGZpZWxkIHNob3VsZCBub3QgYmUgdXBkYXRlZC4KCQkJLy8gSWYgdGhlIHVwZGF0ZSB3YXMgZG9uZSB1c2luZyB0aGUgc2xpZGVycywgdXBkYXRlIHRoZSBpbnB1dCBmaWVsZC4KCQkJdmFyIGhhc0NoYW5nZWQgPSAoaG91ciAhPSB0aGlzLmhvdXIgfHwgbWludXRlICE9IHRoaXMubWludXRlIHx8IHNlY29uZCAhPSB0aGlzLnNlY29uZCB8fCBtaWxsaXNlYyAhPSB0aGlzLm1pbGxpc2VjIAoJCQkJCQkJCXx8ICh0aGlzLmFtcG0ubGVuZ3RoID4gMCAmJiAoaG91ciA8IDEyKSAhPSAoJC5pbkFycmF5KHRoaXMuYW1wbS50b1VwcGVyQ2FzZSgpLCB0aGlzLmFtTmFtZXMpICE9PSAtMSkpIAoJCQkJCQkJCXx8ICgodGhpcy50aW1lem9uZSA9PT0gbnVsbCAmJiB0aW1lem9uZSAhPSB0aGlzLmRlZmF1bHRUaW1lem9uZSkgfHwgKHRoaXMudGltZXpvbmUgIT09IG51bGwgJiYgdGltZXpvbmUgIT0gdGhpcy50aW1lem9uZSkpKTsKCgkJCWlmIChoYXNDaGFuZ2VkKSB7CgoJCQkJaWYgKGhvdXIgIT09IGZhbHNlKSB7CgkJCQkJdGhpcy5ob3VyID0gaG91cjsKCQkJCX0KCQkJCWlmIChtaW51dGUgIT09IGZhbHNlKSB7CgkJCQkJdGhpcy5taW51dGUgPSBtaW51dGU7CgkJCQl9CgkJCQlpZiAoc2Vjb25kICE9PSBmYWxzZSkgewoJCQkJCXRoaXMuc2Vjb25kID0gc2Vjb25kOwoJCQkJfQoJCQkJaWYgKG1pbGxpc2VjICE9PSBmYWxzZSkgewoJCQkJCXRoaXMubWlsbGlzZWMgPSBtaWxsaXNlYzsKCQkJCX0KCQkJCWlmICh0aW1lem9uZSAhPT0gZmFsc2UpIHsKCQkJCQl0aGlzLnRpbWV6b25lID0gdGltZXpvbmU7CgkJCQl9CgoJCQkJaWYgKCF0aGlzLmluc3QpIHsKCQkJCQl0aGlzLmluc3QgPSAkLmRhdGVwaWNrZXIuX2dldEluc3QodGhpcy4kaW5wdXRbMF0pOwoJCQkJfQoKCQkJCXRoaXMuX2xpbWl0TWluTWF4RGF0ZVRpbWUodGhpcy5pbnN0LCB0cnVlKTsKCQkJfQoJCQlpZiAodXNlQW1wbShvLnRpbWVGb3JtYXQpKSB7CgkJCQl0aGlzLmFtcG0gPSBhbXBtOwoJCQl9CgoJCQkvLyBVcGRhdGVzIHRoZSB0aW1lIHdpdGhpbiB0aGUgdGltZXBpY2tlcgoJCQl0aGlzLmZvcm1hdHRlZFRpbWUgPSAkLmRhdGVwaWNrZXIuZm9ybWF0VGltZShvLnRpbWVGb3JtYXQsIHRoaXMsIG8pOwoJCQlpZiAodGhpcy4kdGltZU9iaikgewoJCQkJaWYocGlja2VyVGltZUZvcm1hdCA9PT0gby50aW1lRm9ybWF0KXsKCQkJCQl0aGlzLiR0aW1lT2JqLnRleHQodGhpcy5mb3JtYXR0ZWRUaW1lICsgcGlja2VyVGltZVN1ZmZpeCk7CgkJCQl9CgkJCQllbHNlewoJCQkJCXRoaXMuJHRpbWVPYmoudGV4dCgkLmRhdGVwaWNrZXIuZm9ybWF0VGltZShwaWNrZXJUaW1lRm9ybWF0LCB0aGlzLCBvKSArIHBpY2tlclRpbWVTdWZmaXgpOwoJCQkJfQoJCQl9CgoJCQl0aGlzLnRpbWVEZWZpbmVkID0gdHJ1ZTsKCQkJaWYgKGhhc0NoYW5nZWQpIHsKCQkJCXRoaXMuX3VwZGF0ZURhdGVUaW1lKCk7CgkJCX0KCQl9LAoKCQkvKgoJCSogY2FsbCBjdXN0b20gb25TZWxlY3QuCgkJKiBiaW5kIHRvIHNsaWRlcnMgc2xpZGVzdG9wLCBhbmQgZ3JpZCBjbGljay4KCQkqLwoJCV9vblNlbGVjdEhhbmRsZXI6IGZ1bmN0aW9uKCkgewoJCQl2YXIgb25TZWxlY3QgPSB0aGlzLl9kZWZhdWx0cy5vblNlbGVjdCB8fCB0aGlzLmluc3Quc2V0dGluZ3Mub25TZWxlY3Q7CgkJCXZhciBpbnB1dEVsID0gdGhpcy4kaW5wdXQgPyB0aGlzLiRpbnB1dFswXSA6IG51bGw7CgkJCWlmIChvblNlbGVjdCAmJiBpbnB1dEVsKSB7CgkJCQlvblNlbGVjdC5hcHBseShpbnB1dEVsLCBbdGhpcy5mb3JtYXR0ZWREYXRlVGltZSwgdGhpc10pOwoJCQl9CgkJfSwKCgkJLyoKCQkqIHVwZGF0ZSBvdXIgaW5wdXQgd2l0aCB0aGUgbmV3IGRhdGUgdGltZS4uCgkJKi8KCQlfdXBkYXRlRGF0ZVRpbWU6IGZ1bmN0aW9uKGRwX2luc3QpIHsKCQkJZHBfaW5zdCA9IHRoaXMuaW5zdCB8fCBkcF9pbnN0OwoJCQl2YXIgZHQgPSAkLmRhdGVwaWNrZXIuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGRwX2luc3Quc2VsZWN0ZWRZZWFyLCBkcF9pbnN0LnNlbGVjdGVkTW9udGgsIGRwX2luc3Quc2VsZWN0ZWREYXkpKSwKCQkJCWRhdGVGbXQgPSAkLmRhdGVwaWNrZXIuX2dldChkcF9pbnN0LCAnZGF0ZUZvcm1hdCcpLAoJCQkJZm9ybWF0Q2ZnID0gJC5kYXRlcGlja2VyLl9nZXRGb3JtYXRDb25maWcoZHBfaW5zdCksCgkJCQl0aW1lQXZhaWxhYmxlID0gZHQgIT09IG51bGwgJiYgdGhpcy50aW1lRGVmaW5lZDsKCQkJdGhpcy5mb3JtYXR0ZWREYXRlID0gJC5kYXRlcGlja2VyLmZvcm1hdERhdGUoZGF0ZUZtdCwgKGR0ID09PSBudWxsID8gbmV3IERhdGUoKSA6IGR0KSwgZm9ybWF0Q2ZnKTsKCQkJdmFyIGZvcm1hdHRlZERhdGVUaW1lID0gdGhpcy5mb3JtYXR0ZWREYXRlOwoKCQkJLyoKCQkJKiByZW1vdmUgZm9sbG93aW5nIGxpbmVzIHRvIGZvcmNlIGV2ZXJ5IGNoYW5nZXMgaW4gZGF0ZSBwaWNrZXIgdG8gY2hhbmdlIHRoZSBpbnB1dCB2YWx1ZQoJCQkqIEJ1ZyBkZXNjcmlwdGlvbnM6IHdoZW4gYW4gaW5wdXQgZmllbGQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYW5kIGNsaWNrIG9uIHRoZSBmaWVsZCB0byBwb3AgdXAgdGhlIGRhdGUgcGlja2VyLiAKCQkJKiBJZiB0aGUgdXNlciBtYW51YWxseSBlbXB0eSB0aGUgdmFsdWUgaW4gdGhlIGlucHV0IGZpZWxkLCB0aGUgZGF0ZSBwaWNrZXIgd2lsbCBuZXZlciBjaGFuZ2Ugc2VsZWN0ZWQgdmFsdWUuCgkJCSovCgkJCS8vaWYgKGRwX2luc3QubGFzdFZhbCAhPT0gdW5kZWZpbmVkICYmIChkcF9pbnN0Lmxhc3RWYWwubGVuZ3RoID4gMCAmJiB0aGlzLiRpbnB1dC52YWwoKS5sZW5ndGggPT09IDApKSB7CgkJCS8vCXJldHVybjsKCQkJLy99CgoJCQlpZiAodGhpcy5fZGVmYXVsdHMudGltZU9ubHkgPT09IHRydWUpIHsKCQkJCWZvcm1hdHRlZERhdGVUaW1lID0gdGhpcy5mb3JtYXR0ZWRUaW1lOwoJCQl9IGVsc2UgaWYgKHRoaXMuX2RlZmF1bHRzLnRpbWVPbmx5ICE9PSB0cnVlICYmICh0aGlzLl9kZWZhdWx0cy5hbHdheXNTZXRUaW1lIHx8IHRpbWVBdmFpbGFibGUpKSB7CgkJCQlmb3JtYXR0ZWREYXRlVGltZSArPSB0aGlzLl9kZWZhdWx0cy5zZXBhcmF0b3IgKyB0aGlzLmZvcm1hdHRlZFRpbWUgKyB0aGlzLl9kZWZhdWx0cy50aW1lU3VmZml4OwoJCQl9CgoJCQl0aGlzLmZvcm1hdHRlZERhdGVUaW1lID0gZm9ybWF0dGVkRGF0ZVRpbWU7CgoJCQlpZiAoIXRoaXMuX2RlZmF1bHRzLnNob3dUaW1lcGlja2VyKSB7CgkJCQl0aGlzLiRpbnB1dC52YWwodGhpcy5mb3JtYXR0ZWREYXRlKTsKCQkJfSBlbHNlIGlmICh0aGlzLiRhbHRJbnB1dCAmJiB0aGlzLl9kZWZhdWx0cy5hbHRGaWVsZFRpbWVPbmx5ID09PSB0cnVlKSB7CgkJCQl0aGlzLiRhbHRJbnB1dC52YWwodGhpcy5mb3JtYXR0ZWRUaW1lKTsKCQkJCXRoaXMuJGlucHV0LnZhbCh0aGlzLmZvcm1hdHRlZERhdGUpOwoJCQl9IGVsc2UgaWYgKHRoaXMuJGFsdElucHV0KSB7CgkJCQl0aGlzLiRpbnB1dC52YWwoZm9ybWF0dGVkRGF0ZVRpbWUpOwoJCQkJdmFyIGFsdEZvcm1hdHRlZERhdGVUaW1lID0gJycsCgkJCQkJYWx0U2VwYXJhdG9yID0gdGhpcy5fZGVmYXVsdHMuYWx0U2VwYXJhdG9yID8gdGhpcy5fZGVmYXVsdHMuYWx0U2VwYXJhdG9yIDogdGhpcy5fZGVmYXVsdHMuc2VwYXJhdG9yLAoJCQkJCWFsdFRpbWVTdWZmaXggPSB0aGlzLl9kZWZhdWx0cy5hbHRUaW1lU3VmZml4ID8gdGhpcy5fZGVmYXVsdHMuYWx0VGltZVN1ZmZpeCA6IHRoaXMuX2RlZmF1bHRzLnRpbWVTdWZmaXg7CgoJCQkJaWYgKHRoaXMuX2RlZmF1bHRzLmFsdEZvcm1hdCkgYWx0Rm9ybWF0dGVkRGF0ZVRpbWUgPSAkLmRhdGVwaWNrZXIuZm9ybWF0RGF0ZSh0aGlzLl9kZWZhdWx0cy5hbHRGb3JtYXQsIChkdCA9PT0gbnVsbCA/IG5ldyBEYXRlKCkgOiBkdCksIGZvcm1hdENmZyk7CgkJCQllbHNlIGFsdEZvcm1hdHRlZERhdGVUaW1lID0gdGhpcy5mb3JtYXR0ZWREYXRlOwoJCQkJaWYgKGFsdEZvcm1hdHRlZERhdGVUaW1lKSBhbHRGb3JtYXR0ZWREYXRlVGltZSArPSBhbHRTZXBhcmF0b3I7CgkJCQlpZiAodGhpcy5fZGVmYXVsdHMuYWx0VGltZUZvcm1hdCkgYWx0Rm9ybWF0dGVkRGF0ZVRpbWUgKz0gJC5kYXRlcGlja2VyLmZvcm1hdFRpbWUodGhpcy5fZGVmYXVsdHMuYWx0VGltZUZvcm1hdCwgdGhpcywgdGhpcy5fZGVmYXVsdHMpICsgYWx0VGltZVN1ZmZpeDsKCQkJCWVsc2UgYWx0Rm9ybWF0dGVkRGF0ZVRpbWUgKz0gdGhpcy5mb3JtYXR0ZWRUaW1lICsgYWx0VGltZVN1ZmZpeDsKCQkJCXRoaXMuJGFsdElucHV0LnZhbChhbHRGb3JtYXR0ZWREYXRlVGltZSk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLiRpbnB1dC52YWwoZm9ybWF0dGVkRGF0ZVRpbWUpOwoJCQl9CgoJCQl0aGlzLiRpbnB1dC50cmlnZ2VyKCJjaGFuZ2UiKTsKCQl9LAoKCQlfb25Gb2N1czogZnVuY3Rpb24oKSB7CgkJCWlmICghdGhpcy4kaW5wdXQudmFsKCkgJiYgdGhpcy5fZGVmYXVsdHMuZGVmYXVsdFZhbHVlKSB7CgkJCQl0aGlzLiRpbnB1dC52YWwodGhpcy5fZGVmYXVsdHMuZGVmYXVsdFZhbHVlKTsKCQkJCXZhciBpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KHRoaXMuJGlucHV0LmdldCgwKSksCgkJCQkJdHBfaW5zdCA9ICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICd0aW1lcGlja2VyJyk7CgkJCQlpZiAodHBfaW5zdCkgewoJCQkJCWlmICh0cF9pbnN0Ll9kZWZhdWx0cy50aW1lT25seSAmJiAoaW5zdC5pbnB1dC52YWwoKSAhPSBpbnN0Lmxhc3RWYWwpKSB7CgkJCQkJCXRyeSB7CgkJCQkJCQkkLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7CgkJCQkJCX0gY2F0Y2ggKGVycikgewoJCQkJCQkJJC5kYXRlcGlja2VyLmxvZyhlcnIpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSwKCgkJLyoKCQkqIFNtYWxsIGFic3RyYWN0aW9uIHRvIGNvbnRyb2wgdHlwZXMKCQkqIFdlIGNhbiBhZGQgbW9yZSwganVzdCBiZSBzdXJlIHRvIGZvbGxvdyB0aGUgcGF0dGVybjogY3JlYXRlLCBvcHRpb25zLCB2YWx1ZQoJCSovCgkJX2NvbnRyb2xzOiB7CgkJCS8vIHNsaWRlciBtZXRob2RzCgkJCXNsaWRlcjogewoJCQkJY3JlYXRlOiBmdW5jdGlvbih0cF9pbnN0LCBvYmosIHVuaXQsIHZhbCwgbWluLCBtYXgsIHN0ZXApewoJCQkJCXZhciBydGwgPSB0cF9pbnN0Ll9kZWZhdWx0cy5pc1JUTDsgLy8gaWYgcnRsIGdvIC02MC0+MCBpbnN0ZWFkIG9mIDAtPjYwCgkJCQkJcmV0dXJuIG9iai5wcm9wKCdzbGlkZScsIG51bGwpLnNsaWRlcih7CgkJCQkJCW9yaWVudGF0aW9uOiAiaG9yaXpvbnRhbCIsCgkJCQkJCXZhbHVlOiBydGw/IHZhbCotMSA6IHZhbCwKCQkJCQkJbWluOiBydGw/IG1heCotMSA6IG1pbiwKCQkJCQkJbWF4OiBydGw/IG1pbiotMSA6IG1heCwKCQkJCQkJc3RlcDogc3RlcCwKCQkJCQkJc2xpZGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewoJCQkJCQkJdHBfaW5zdC5jb250cm9sLnZhbHVlKHRwX2luc3QsICQodGhpcyksIHVuaXQsIHJ0bD8gdWkudmFsdWUqLTE6dWkudmFsdWUpOwoJCQkJCQkJdHBfaW5zdC5fb25UaW1lQ2hhbmdlKCk7CgkJCQkJCX0sCgkJCQkJCXN0b3A6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewoJCQkJCQkJdHBfaW5zdC5fb25TZWxlY3RIYW5kbGVyKCk7CgkJCQkJCX0KCQkJCQl9KTsJCgkJCQl9LAoJCQkJb3B0aW9uczogZnVuY3Rpb24odHBfaW5zdCwgb2JqLCB1bml0LCBvcHRzLCB2YWwpewoJCQkJCWlmKHRwX2luc3QuX2RlZmF1bHRzLmlzUlRMKXsKCQkJCQkJaWYodHlwZW9mKG9wdHMpID09ICdzdHJpbmcnKXsKCQkJCQkJCWlmKG9wdHMgPT0gJ21pbicgfHwgb3B0cyA9PSAnbWF4Jyl7CgkJCQkJCQkJaWYodmFsICE9PSB1bmRlZmluZWQpCgkJCQkJCQkJCXJldHVybiBvYmouc2xpZGVyKG9wdHMsIHZhbCotMSk7CgkJCQkJCQkJcmV0dXJuIE1hdGguYWJzKG9iai5zbGlkZXIob3B0cykpOwoJCQkJCQkJfQoJCQkJCQkJcmV0dXJuIG9iai5zbGlkZXIob3B0cyk7CgkJCQkJCX0KCQkJCQkJdmFyIG1pbiA9IG9wdHMubWluLCAKCQkJCQkJCW1heCA9IG9wdHMubWF4OwoJCQkJCQlvcHRzLm1pbiA9IG9wdHMubWF4ID0gbnVsbDsKCQkJCQkJaWYobWluICE9PSB1bmRlZmluZWQpCgkJCQkJCQlvcHRzLm1heCA9IG1pbiAqIC0xOwoJCQkJCQlpZihtYXggIT09IHVuZGVmaW5lZCkKCQkJCQkJCW9wdHMubWluID0gbWF4ICogLTE7CgkJCQkJCXJldHVybiBvYmouc2xpZGVyKG9wdHMpOwoJCQkJCX0KCQkJCQlpZih0eXBlb2Yob3B0cykgPT0gJ3N0cmluZycgJiYgdmFsICE9PSB1bmRlZmluZWQpCgkJCQkJCQlyZXR1cm4gb2JqLnNsaWRlcihvcHRzLCB2YWwpOwoJCQkJCXJldHVybiBvYmouc2xpZGVyKG9wdHMpOwoJCQkJfSwKCQkJCXZhbHVlOiBmdW5jdGlvbih0cF9pbnN0LCBvYmosIHVuaXQsIHZhbCl7CgkJCQkJaWYodHBfaW5zdC5fZGVmYXVsdHMuaXNSVEwpewoJCQkJCQlpZih2YWwgIT09IHVuZGVmaW5lZCkKCQkJCQkJCXJldHVybiBvYmouc2xpZGVyKCd2YWx1ZScsIHZhbCotMSk7CgkJCQkJCXJldHVybiBNYXRoLmFicyhvYmouc2xpZGVyKCd2YWx1ZScpKTsKCQkJCQl9CgkJCQkJaWYodmFsICE9PSB1bmRlZmluZWQpCgkJCQkJCXJldHVybiBvYmouc2xpZGVyKCd2YWx1ZScsIHZhbCk7CgkJCQkJcmV0dXJuIG9iai5zbGlkZXIoJ3ZhbHVlJyk7CgkJCQl9CgkJCX0sCgkJCS8vIHNlbGVjdCBtZXRob2RzCgkJCXNlbGVjdDogewoJCQkJY3JlYXRlOiBmdW5jdGlvbih0cF9pbnN0LCBvYmosIHVuaXQsIHZhbCwgbWluLCBtYXgsIHN0ZXApewoJCQkJCXZhciBzZWwgPSAnPHNlbGVjdCBjbGFzcz0idWktdGltZXBpY2tlci1zZWxlY3QiIGRhdGEtdW5pdD0iJysgdW5pdCArJyIgZGF0YS1taW49IicrIG1pbiArJyIgZGF0YS1tYXg9IicrIG1heCArJyIgZGF0YS1zdGVwPSInKyBzdGVwICsnIj4nLAoJCQkJCQl1bCA9IHRwX2luc3QuX2RlZmF1bHRzLnRpbWVGb3JtYXQuaW5kZXhPZigndCcpICE9PSAtMT8gJ3RvTG93ZXJDYXNlJzondG9VcHBlckNhc2UnLAoJCQkJCQltID0gMDsKCgkJCQkJZm9yKHZhciBpPW1pbjsgaTw9bWF4OyBpKz1zdGVwKXsJCQkJCQkKCQkJCQkJc2VsICs9ICc8b3B0aW9uIHZhbHVlPSInKyBpICsnIicrIChpPT12YWw/ICcgc2VsZWN0ZWQnOicnKSArJz4nOwoJCQkJCQlpZih1bml0ID09ICdob3VyJyAmJiB1c2VBbXBtKHRwX2luc3QuX2RlZmF1bHRzLnBpY2tlclRpbWVGb3JtYXQgfHwgdHBfaW5zdC5fZGVmYXVsdHMudGltZUZvcm1hdCkpCgkJCQkJCQlzZWwgKz0gJC5kYXRlcGlja2VyLmZvcm1hdFRpbWUoImhoIFRUIiwge2hvdXI6aX0sIHRwX2luc3QuX2RlZmF1bHRzKTsKCQkJCQkJZWxzZSBpZih1bml0ID09ICdtaWxsaXNlYycgfHwgaSA+PSAxMCkgc2VsICs9IGk7CgkJCQkJCWVsc2Ugc2VsICs9ICcwJysgaS50b1N0cmluZygpOwoJCQkJCQlzZWwgKz0gJzwvb3B0aW9uPic7CgkJCQkJfQoJCQkJCXNlbCArPSAnPC9zZWxlY3Q+JzsKCgkJCQkJb2JqLmNoaWxkcmVuKCdzZWxlY3QnKS5yZW1vdmUoKTsKCgkJCQkJJChzZWwpLmFwcGVuZFRvKG9iaikuY2hhbmdlKGZ1bmN0aW9uKGUpewoJCQkJCQl0cF9pbnN0Ll9vblRpbWVDaGFuZ2UoKTsKCQkJCQkJdHBfaW5zdC5fb25TZWxlY3RIYW5kbGVyKCk7CgkJCQkJfSk7CgoJCQkJCXJldHVybiBvYmo7CgkJCQl9LAoJCQkJb3B0aW9uczogZnVuY3Rpb24odHBfaW5zdCwgb2JqLCB1bml0LCBvcHRzLCB2YWwpewoJCQkJCXZhciBvID0ge30sCgkJCQkJCSR0ID0gb2JqLmNoaWxkcmVuKCdzZWxlY3QnKTsKCQkJCQlpZih0eXBlb2Yob3B0cykgPT0gJ3N0cmluZycpewoJCQkJCQlpZih2YWwgPT09IHVuZGVmaW5lZCkKCQkJCQkJCXJldHVybiAkdC5kYXRhKG9wdHMpOwoJCQkJCQlvW29wdHNdID0gdmFsOwkKCQkJCQl9CgkJCQkJZWxzZSBvID0gb3B0czsKCQkJCQlyZXR1cm4gdHBfaW5zdC5jb250cm9sLmNyZWF0ZSh0cF9pbnN0LCBvYmosICR0LmRhdGEoJ3VuaXQnKSwgJHQudmFsKCksIG8ubWluIHx8ICR0LmRhdGEoJ21pbicpLCBvLm1heCB8fCAkdC5kYXRhKCdtYXgnKSwgby5zdGVwIHx8ICR0LmRhdGEoJ3N0ZXAnKSk7CgkJCQl9LAoJCQkJdmFsdWU6IGZ1bmN0aW9uKHRwX2luc3QsIG9iaiwgdW5pdCwgdmFsKXsKCQkJCQl2YXIgJHQgPSBvYmouY2hpbGRyZW4oJ3NlbGVjdCcpOwoJCQkJCWlmKHZhbCAhPT0gdW5kZWZpbmVkKQoJCQkJCQlyZXR1cm4gJHQudmFsKHZhbCk7CgkJCQkJcmV0dXJuICR0LnZhbCgpOwoJCQkJfQoJCQl9CgkJfSAvLyBlbmQgX2NvbnRyb2xzCgoJfSk7CgoJJC5mbi5leHRlbmQoewoJCS8qCgkJKiBzaG9ydGhhbmQganVzdCB0byB1c2UgdGltZXBpY2tlci4uCgkJKi8KCQl0aW1lcGlja2VyOiBmdW5jdGlvbihvKSB7CgkJCW8gPSBvIHx8IHt9OwoJCQl2YXIgdG1wX2FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwoKCQkJaWYgKHR5cGVvZiBvID09ICdvYmplY3QnKSB7CgkJCQl0bXBfYXJnc1swXSA9ICQuZXh0ZW5kKG8sIHsKCQkJCQl0aW1lT25seTogdHJ1ZQoJCQkJfSk7CgkJCX0KCgkJCXJldHVybiAkKHRoaXMpLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkkLmZuLmRhdGV0aW1lcGlja2VyLmFwcGx5KCQodGhpcyksIHRtcF9hcmdzKTsKCQkJfSk7CgkJfSwKCgkJLyoKCQkqIGV4dGVuZCB0aW1lcGlja2VyIHRvIGRhdGVwaWNrZXIKCQkqLwoJCWRhdGV0aW1lcGlja2VyOiBmdW5jdGlvbihvKSB7CgkJCW8gPSBvIHx8IHt9OwoJCQl2YXIgdG1wX2FyZ3MgPSBhcmd1bWVudHM7CgoJCQlpZiAodHlwZW9mKG8pID09ICdzdHJpbmcnKSB7CgkJCQlpZiAobyA9PSAnZ2V0RGF0ZScpIHsKCQkJCQlyZXR1cm4gJC5mbi5kYXRlcGlja2VyLmFwcGx5KCQodGhpc1swXSksIHRtcF9hcmdzKTsKCQkJCX0gZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCQkJdmFyICR0ID0gJCh0aGlzKTsKCQkJCQkJJHQuZGF0ZXBpY2tlci5hcHBseSgkdCwgdG1wX2FyZ3MpOwoJCQkJCX0pOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCQl2YXIgJHQgPSAkKHRoaXMpOwoJCQkJCSR0LmRhdGVwaWNrZXIoJC50aW1lcGlja2VyLl9uZXdJbnN0KCR0LCBvKS5fZGVmYXVsdHMpOwoJCQkJfSk7CgkJCX0KCQl9Cgl9KTsKCgkvKgoJKiBQdWJsaWMgVXRpbGl0eSB0byBwYXJzZSBkYXRlIGFuZCB0aW1lCgkqLwoJJC5kYXRlcGlja2VyLnBhcnNlRGF0ZVRpbWUgPSBmdW5jdGlvbihkYXRlRm9ybWF0LCB0aW1lRm9ybWF0LCBkYXRlVGltZVN0cmluZywgZGF0ZVNldHRpbmdzLCB0aW1lU2V0dGluZ3MpIHsKCQl2YXIgcGFyc2VSZXMgPSBwYXJzZURhdGVUaW1lSW50ZXJuYWwoZGF0ZUZvcm1hdCwgdGltZUZvcm1hdCwgZGF0ZVRpbWVTdHJpbmcsIGRhdGVTZXR0aW5ncywgdGltZVNldHRpbmdzKTsKCQlpZiAocGFyc2VSZXMudGltZU9iaikgewoJCQl2YXIgdCA9IHBhcnNlUmVzLnRpbWVPYmo7CgkJCXBhcnNlUmVzLmRhdGUuc2V0SG91cnModC5ob3VyLCB0Lm1pbnV0ZSwgdC5zZWNvbmQsIHQubWlsbGlzZWMpOwoJCX0KCgkJcmV0dXJuIHBhcnNlUmVzLmRhdGU7Cgl9OwoKCS8qCgkqIFB1YmxpYyB1dGlsaXR5IHRvIHBhcnNlIHRpbWUKCSovCgkkLmRhdGVwaWNrZXIucGFyc2VUaW1lID0gZnVuY3Rpb24odGltZUZvcm1hdCwgdGltZVN0cmluZywgb3B0aW9ucykgewkJCgkJdmFyIG8gPSBleHRlbmRSZW1vdmUoZXh0ZW5kUmVtb3ZlKHt9LCAkLnRpbWVwaWNrZXIuX2RlZmF1bHRzKSwgb3B0aW9ucyB8fCB7fSk7CgoJCS8vIFN0cmljdCBwYXJzZSByZXF1aXJlcyB0aGUgdGltZVN0cmluZyB0byBtYXRjaCB0aGUgdGltZUZvcm1hdCBleGFjdGx5CgkJdmFyIHN0cmljdFBhcnNlID0gZnVuY3Rpb24oZiwgcywgbyl7CgoJCQkvLyBwYXR0ZXJuIGZvciBzdGFuZGFyZCBhbmQgbG9jYWxpemVkIEFNL1BNIG1hcmtlcnMKCQkJdmFyIGdldFBhdHRlcm5BbXBtID0gZnVuY3Rpb24oYW1OYW1lcywgcG1OYW1lcykgewoJCQkJdmFyIG1hcmtlcnMgPSBbXTsKCQkJCWlmIChhbU5hbWVzKSB7CgkJCQkJJC5tZXJnZShtYXJrZXJzLCBhbU5hbWVzKTsKCQkJCX0KCQkJCWlmIChwbU5hbWVzKSB7CgkJCQkJJC5tZXJnZShtYXJrZXJzLCBwbU5hbWVzKTsKCQkJCX0KCQkJCW1hcmtlcnMgPSAkLm1hcChtYXJrZXJzLCBmdW5jdGlvbih2YWwpIHsKCQkJCQlyZXR1cm4gdmFsLnJlcGxhY2UoL1suKis/fCgpXFtcXXt9XFxdL2csICdcXCQmJyk7CgkJCQl9KTsKCQkJCXJldHVybiAnKCcgKyBtYXJrZXJzLmpvaW4oJ3wnKSArICcpPyc7CgkJCX07CgoJCQkvLyBmaWd1cmUgb3V0IHBvc2l0aW9uIG9mIHRpbWUgZWxlbWVudHMuLiBjYXVzZSBqcyBjYW50IGRvIG5hbWVkIGNhcHR1cmVzCgkJCXZhciBnZXRGb3JtYXRQb3NpdGlvbnMgPSBmdW5jdGlvbih0aW1lRm9ybWF0KSB7CgkJCQl2YXIgZmluZHMgPSB0aW1lRm9ybWF0LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhoezEsMn18bXsxLDJ9fHN7MSwyfXxsezF9fHR7MSwyfXx6fCcuKj8nKS9nKSwKCQkJCQlvcmRlcnMgPSB7CgkJCQkJCWg6IC0xLAoJCQkJCQltOiAtMSwKCQkJCQkJczogLTEsCgkJCQkJCWw6IC0xLAoJCQkJCQl0OiAtMSwKCQkJCQkJejogLTEKCQkJCQl9OwoKCQkJCWlmIChmaW5kcykgewoJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZmluZHMubGVuZ3RoOyBpKyspIHsKCQkJCQkJaWYgKG9yZGVyc1tmaW5kc1tpXS50b1N0cmluZygpLmNoYXJBdCgwKV0gPT0gLTEpIHsKCQkJCQkJCW9yZGVyc1tmaW5kc1tpXS50b1N0cmluZygpLmNoYXJBdCgwKV0gPSBpICsgMTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiBvcmRlcnM7CgkJCX07CgoJCQl2YXIgcmVnc3RyID0gJ14nICsgZi50b1N0cmluZygpCgkJCQkJLnJlcGxhY2UoLyhbaEhdezEsMn18bW0/fHNzP3xbdFRdezEsMn18W2x6XXwnLio/JykvZywgZnVuY3Rpb24gKG1hdGNoKSB7CgkJCQkJCQlzd2l0Y2ggKG1hdGNoLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpKSB7CgkJCQkJCQkJY2FzZSAnaCc6IHJldHVybiAnKFxcZD9cXGQpJzsKCQkJCQkJCQljYXNlICdtJzogcmV0dXJuICcoXFxkP1xcZCknOwoJCQkJCQkJCWNhc2UgJ3MnOiByZXR1cm4gJyhcXGQ/XFxkKSc7CgkJCQkJCQkJY2FzZSAnbCc6IHJldHVybiAnKFxcZD9cXGQ/XFxkKSc7CgkJCQkJCQkJY2FzZSAneic6IHJldHVybiAnKHp8Wy0rXVxcZFxcZDo/XFxkXFxkfFxcUyspPyc7CgkJCQkJCQkJY2FzZSAndCc6IHJldHVybiBnZXRQYXR0ZXJuQW1wbShvLmFtTmFtZXMsIG8ucG1OYW1lcyk7CgkJCQkJCQkJZGVmYXVsdDogICAgLy8gbGl0ZXJhbCBlc2NhcGVkIGluIHF1b3RlcwoJCQkJCQkJCQlyZXR1cm4gJygnICsgbWF0Y2gucmVwbGFjZSgvXCcvZywgIiIpLnJlcGxhY2UoLyhcLnxcJHxcXnxcXHxcL3xcKHxcKXxcW3xcXXxcP3xcK3xcKikvZywgZnVuY3Rpb24gKG0pIHsgcmV0dXJuICJcXCIgKyBtOyB9KSArICcpPyc7CgkJCQkJCQl9CgkJCQkJCX0pCgkJCQkJLnJlcGxhY2UoL1xzL2csICdcXHM/JykgKwoJCQkJCW8udGltZVN1ZmZpeCArICckJywKCQkJCW9yZGVyID0gZ2V0Rm9ybWF0UG9zaXRpb25zKGYpLAoJCQkJYW1wbSA9ICcnLAoJCQkJdHJlZzsKCgkJCXRyZWcgPSBzLm1hdGNoKG5ldyBSZWdFeHAocmVnc3RyLCAnaScpKTsKCgkJCXZhciByZXNUaW1lID0gewoJCQkJaG91cjogMCwKCQkJCW1pbnV0ZTogMCwKCQkJCXNlY29uZDogMCwKCQkJCW1pbGxpc2VjOiAwCgkJCX07CgoJCQlpZiAodHJlZykgewoJCQkJaWYgKG9yZGVyLnQgIT09IC0xKSB7CgkJCQkJaWYgKHRyZWdbb3JkZXIudF0gPT09IHVuZGVmaW5lZCB8fCB0cmVnW29yZGVyLnRdLmxlbmd0aCA9PT0gMCkgewoJCQkJCQlhbXBtID0gJyc7CgkJCQkJCXJlc1RpbWUuYW1wbSA9ICcnOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWFtcG0gPSAkLmluQXJyYXkodHJlZ1tvcmRlci50XS50b1VwcGVyQ2FzZSgpLCBvLmFtTmFtZXMpICE9PSAtMSA/ICdBTScgOiAnUE0nOwoJCQkJCQlyZXNUaW1lLmFtcG0gPSBvW2FtcG0gPT0gJ0FNJyA/ICdhbU5hbWVzJyA6ICdwbU5hbWVzJ11bMF07CgkJCQkJfQoJCQkJfQoKCQkJCWlmIChvcmRlci5oICE9PSAtMSkgewoJCQkJCWlmIChhbXBtID09ICdBTScgJiYgdHJlZ1tvcmRlci5oXSA9PSAnMTInKSB7CgkJCQkJCXJlc1RpbWUuaG91ciA9IDA7IC8vIDEyYW0gPSAwIGhvdXIKCQkJCQl9IGVsc2UgewoJCQkJCQlpZiAoYW1wbSA9PSAnUE0nICYmIHRyZWdbb3JkZXIuaF0gIT0gJzEyJykgewoJCQkJCQkJcmVzVGltZS5ob3VyID0gcGFyc2VJbnQodHJlZ1tvcmRlci5oXSwgMTApICsgMTI7IC8vIDEycG0gPSAxMiBob3VyLCBhbnkgb3RoZXIgcG0gPSBob3VyICsgMTIKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXJlc1RpbWUuaG91ciA9IE51bWJlcih0cmVnW29yZGVyLmhdKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlpZiAob3JkZXIubSAhPT0gLTEpIHsKCQkJCQlyZXNUaW1lLm1pbnV0ZSA9IE51bWJlcih0cmVnW29yZGVyLm1dKTsKCQkJCX0KCQkJCWlmIChvcmRlci5zICE9PSAtMSkgewoJCQkJCXJlc1RpbWUuc2Vjb25kID0gTnVtYmVyKHRyZWdbb3JkZXIuc10pOwoJCQkJfQoJCQkJaWYgKG9yZGVyLmwgIT09IC0xKSB7CgkJCQkJcmVzVGltZS5taWxsaXNlYyA9IE51bWJlcih0cmVnW29yZGVyLmxdKTsKCQkJCX0KCQkJCWlmIChvcmRlci56ICE9PSAtMSAmJiB0cmVnW29yZGVyLnpdICE9PSB1bmRlZmluZWQpIHsKCQkJCQl2YXIgdHogPSB0cmVnW29yZGVyLnpdLnRvVXBwZXJDYXNlKCk7CgkJCQkJc3dpdGNoICh0ei5sZW5ndGgpIHsKCQkJCQljYXNlIDE6CgkJCQkJCS8vIFoKCQkJCQkJdHogPSBvLnRpbWV6b25lSXNvODYwMSA/ICdaJyA6ICcrMDAwMCc7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNToKCQkJCQkJLy8gK2hobW0KCQkJCQkJaWYgKG8udGltZXpvbmVJc284NjAxKSB7CgkJCQkJCQl0eiA9IHR6LnN1YnN0cmluZygxKSA9PSAnMDAwMCcgPyAnWicgOiB0ei5zdWJzdHJpbmcoMCwgMykgKyAnOicgKyB0ei5zdWJzdHJpbmcoMyk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA2OgoJCQkJCQkvLyAraGg6bW0KCQkJCQkJaWYgKCFvLnRpbWV6b25lSXNvODYwMSkgewoJCQkJCQkJdHogPSB0eiA9PSAnWicgfHwgdHouc3Vic3RyaW5nKDEpID09ICcwMDowMCcgPyAnKzAwMDAnIDogdHoucmVwbGFjZSgvOi8sICcnKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCWlmICh0ei5zdWJzdHJpbmcoMSkgPT0gJzAwOjAwJykgewoJCQkJCQkJCXR6ID0gJ1onOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCQlyZXNUaW1lLnRpbWV6b25lID0gdHo7CgkJCQl9CgoKCQkJCXJldHVybiByZXNUaW1lOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9Oy8vIGVuZCBzdHJpY3RQYXJzZQoKCQkvLyBGaXJzdCB0cnkgSlMgRGF0ZSwgaWYgdGhhdCBmYWlscywgdXNlIHN0cmljdFBhcnNlCgkJdmFyIGxvb3NlUGFyc2UgPSBmdW5jdGlvbihmLHMsbyl7CgkJCXRyeXsKCQkJCXZhciBkID0gbmV3IERhdGUoJzIwMTItMDEtMDEgJysgcyk7CgkJCQlyZXR1cm4gewoJCQkJCWhvdXI6IGQuZ2V0SG91cnMoKSwKCQkJCQltaW51dGVzOiBkLmdldE1pbnV0ZXMoKSwKCQkJCQlzZWNvbmRzOiBkLmdldFNlY29uZHMoKSwKCQkJCQltaWxsaXNlYzogZC5nZXRNaWxsaXNlY29uZHMoKSwKCQkJCQl0aW1lem9uZTogJC50aW1lcGlja2VyLnRpbWVab25lT2Zmc2V0U3RyaW5nKGQpCgkJCQl9OwoJCQl9CgkJCWNhdGNoKGVycil7CgkJCQl0cnl7CgkJCQkJcmV0dXJuIHN0cmljdFBhcnNlKGYscyxvKTsKCQkJCX0KCQkJCWNhdGNoKGVycjIpewoJCQkJCSQuZGF0ZXBpY2tlci5sb2coIlVuYWJsZSB0byBwYXJzZSBcbnRpbWVTdHJpbmc6ICIrIHMgKyJcbnRpbWVGb3JtYXQ6ICIrIGYpOwoJCQkJfQkJCQkKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfTsgLy8gZW5kIGxvb3NlUGFyc2UKCQkKCQlpZih0eXBlb2Ygby5wYXJzZSA9PT0gImZ1bmN0aW9uIil7CgkJCXJldHVybiBvLnBhcnNlKHRpbWVGb3JtYXQsIHRpbWVTdHJpbmcsIG8pCgkJfQoJCWlmKG8ucGFyc2UgPT09ICdsb29zZScpewoJCQlyZXR1cm4gbG9vc2VQYXJzZSh0aW1lRm9ybWF0LCB0aW1lU3RyaW5nLCBvKTsKCQl9CgkJcmV0dXJuIHN0cmljdFBhcnNlKHRpbWVGb3JtYXQsIHRpbWVTdHJpbmcsIG8pOwoJfTsKCgkvKgoJKiBQdWJsaWMgdXRpbGl0eSB0byBmb3JtYXQgdGhlIHRpbWUKCSogZm9ybWF0ID0gc3RyaW5nIGZvcm1hdCBvZiB0aGUgdGltZQoJKiB0aW1lID0gYSB7fSwgbm90IGEgRGF0ZSgpIGZvciB0aW1lem9uZXMKCSogb3B0aW9ucyA9IGVzc2VudGlhbGx5IHRoZSByZWdpb25hbFtdLi4gYW1OYW1lcywgcG1OYW1lcywgYW1wbQoJKi8KCSQuZGF0ZXBpY2tlci5mb3JtYXRUaW1lID0gZnVuY3Rpb24oZm9ybWF0LCB0aW1lLCBvcHRpb25zKSB7CgkJb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgkJb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLnRpbWVwaWNrZXIuX2RlZmF1bHRzLCBvcHRpb25zKTsKCQl0aW1lID0gJC5leHRlbmQoewoJCQlob3VyOiAwLAoJCQltaW51dGU6IDAsCgkJCXNlY29uZDogMCwKCQkJbWlsbGlzZWM6IDAsCgkJCXRpbWV6b25lOiAnKzAwMDAnCgkJfSwgdGltZSk7CgoJCXZhciB0bXB0aW1lID0gZm9ybWF0LAoJCQlhbXBtTmFtZSA9IG9wdGlvbnMuYW1OYW1lc1swXSwKCQkJaG91ciA9IHBhcnNlSW50KHRpbWUuaG91ciwgMTApOwoKCQlpZiAoaG91ciA+IDExKSB7CgkJCWFtcG1OYW1lID0gb3B0aW9ucy5wbU5hbWVzWzBdOwoJCX0KCgkJdG1wdGltZSA9IHRtcHRpbWUucmVwbGFjZSgvKD86SEg/fGhoP3xtbT98c3M/fFt0VF17MSwyfXxbbHpdfCgnLio/J3wiLio/IikpL2csIGZ1bmN0aW9uKG1hdGNoKSB7CgkJc3dpdGNoIChtYXRjaCkgewoJCQljYXNlICdISCc6CgkJCQlyZXR1cm4gKCcwJyArIGhvdXIpLnNsaWNlKC0yKTsKCQkJY2FzZSAnSCc6CgkJCQlyZXR1cm4gaG91cjsKCQkJY2FzZSAnaGgnOgoJCQkJcmV0dXJuICgnMCcgKyBjb252ZXJ0MjR0bzEyKGhvdXIpKS5zbGljZSgtMik7CgkJCWNhc2UgJ2gnOgoJCQkJcmV0dXJuIGNvbnZlcnQyNHRvMTIoaG91cik7CgkJCWNhc2UgJ21tJzoKCQkJCXJldHVybiAoJzAnICsgdGltZS5taW51dGUpLnNsaWNlKC0yKTsKCQkJY2FzZSAnbSc6CgkJCQlyZXR1cm4gdGltZS5taW51dGU7CgkJCWNhc2UgJ3NzJzoKCQkJCXJldHVybiAoJzAnICsgdGltZS5zZWNvbmQpLnNsaWNlKC0yKTsKCQkJY2FzZSAncyc6CgkJCQlyZXR1cm4gdGltZS5zZWNvbmQ7CgkJCWNhc2UgJ2wnOgoJCQkJcmV0dXJuICgnMDAnICsgdGltZS5taWxsaXNlYykuc2xpY2UoLTMpOwoJCQljYXNlICd6JzoKCQkJCXJldHVybiB0aW1lLnRpbWV6b25lID09PSBudWxsPyBvcHRpb25zLmRlZmF1bHRUaW1lem9uZSA6IHRpbWUudGltZXpvbmU7CgkJCWNhc2UgJ1QnOiAKCQkJCXJldHVybiBhbXBtTmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKTsKCQkJY2FzZSAnVFQnOiAKCQkJCXJldHVybiBhbXBtTmFtZS50b1VwcGVyQ2FzZSgpOwoJCQljYXNlICd0JzoKCQkJCXJldHVybiBhbXBtTmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKTsKCQkJY2FzZSAndHQnOgoJCQkJcmV0dXJuIGFtcG1OYW1lLnRvTG93ZXJDYXNlKCk7CgkJCWRlZmF1bHQ6CgkJCQlyZXR1cm4gbWF0Y2gucmVwbGFjZSgvXCcvZywgIiIpIHx8ICInIjsKCQkJfQoJCX0pOwoKCQl0bXB0aW1lID0gJC50cmltKHRtcHRpbWUpOwoJCXJldHVybiB0bXB0aW1lOwoJfTsKCgkvKgoJKiB0aGUgYmFkIGhhY2sgOi8gb3ZlcnJpZGUgZGF0ZXBpY2tlciBzbyBpdCBkb2VzbnQgY2xvc2Ugb24gc2VsZWN0CgkvLyBpbnNwaXJlZDogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMjUyNTEyL2pxdWVyeS1kYXRlcGlja2VyLXByZXZlbnQtY2xvc2luZy1waWNrZXItd2hlbi1jbGlja2luZy1hLWRhdGUvMTc2MjM3OCMxNzYyMzc4CgkqLwoJJC5kYXRlcGlja2VyLl9iYXNlX3NlbGVjdERhdGUgPSAkLmRhdGVwaWNrZXIuX3NlbGVjdERhdGU7CgkkLmRhdGVwaWNrZXIuX3NlbGVjdERhdGUgPSBmdW5jdGlvbihpZCwgZGF0ZVN0cikgewoJCXZhciBpbnN0ID0gdGhpcy5fZ2V0SW5zdCgkKGlkKVswXSksCgkJCXRwX2luc3QgPSB0aGlzLl9nZXQoaW5zdCwgJ3RpbWVwaWNrZXInKTsKCgkJaWYgKHRwX2luc3QpIHsKCQkJdHBfaW5zdC5fbGltaXRNaW5NYXhEYXRlVGltZShpbnN0LCB0cnVlKTsKCQkJaW5zdC5pbmxpbmUgPSBpbnN0LnN0YXlfb3BlbiA9IHRydWU7CgkJCS8vVGhpcyB3YXkgdGhlIG9uU2VsZWN0IGhhbmRsZXIgY2FsbGVkIGZyb20gY2FsZW5kYXJwaWNrZXIgZ2V0IHRoZSBmdWxsIGRhdGVUaW1lCgkJCXRoaXMuX2Jhc2Vfc2VsZWN0RGF0ZShpZCwgZGF0ZVN0cik7CgkJCWluc3QuaW5saW5lID0gaW5zdC5zdGF5X29wZW4gPSBmYWxzZTsKCQkJdGhpcy5fbm90aWZ5Q2hhbmdlKGluc3QpOwoJCQl0aGlzLl91cGRhdGVEYXRlcGlja2VyKGluc3QpOwoJCX0gZWxzZSB7CgkJCXRoaXMuX2Jhc2Vfc2VsZWN0RGF0ZShpZCwgZGF0ZVN0cik7CgkJfQoJfTsKCgkvKgoJKiBzZWNvbmQgYmFkIGhhY2sgOi8gb3ZlcnJpZGUgZGF0ZXBpY2tlciBzbyBpdCB0cmlnZ2VycyBhbiBldmVudCB3aGVuIGNoYW5naW5nIHRoZSBpbnB1dCBmaWVsZAoJKiBhbmQgZG9lcyBub3QgcmVkcmF3IHRoZSBkYXRlcGlja2VyIG9uIGV2ZXJ5IHNlbGVjdERhdGUgZXZlbnQKCSovCgkkLmRhdGVwaWNrZXIuX2Jhc2VfdXBkYXRlRGF0ZXBpY2tlciA9ICQuZGF0ZXBpY2tlci5fdXBkYXRlRGF0ZXBpY2tlcjsKCSQuZGF0ZXBpY2tlci5fdXBkYXRlRGF0ZXBpY2tlciA9IGZ1bmN0aW9uKGluc3QpIHsKCgkJLy8gZG9uJ3QgcG9wdXAgdGhlIGRhdGVwaWNrZXIgaWYgdGhlcmUgaXMgYW5vdGhlciBpbnN0YW5jZSBhbHJlYWR5IG9wZW5lZAoJCXZhciBpbnB1dCA9IGluc3QuaW5wdXRbMF07CgkJaWYgKCQuZGF0ZXBpY2tlci5fY3VySW5zdCAmJiAkLmRhdGVwaWNrZXIuX2N1ckluc3QgIT0gaW5zdCAmJiAkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nICYmICQuZGF0ZXBpY2tlci5fbGFzdElucHV0ICE9IGlucHV0KSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICh0eXBlb2YoaW5zdC5zdGF5X29wZW4pICE9PSAnYm9vbGVhbicgfHwgaW5zdC5zdGF5X29wZW4gPT09IGZhbHNlKSB7CgoJCQl0aGlzLl9iYXNlX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7CgoJCQkvLyBSZWxvYWQgdGhlIHRpbWUgY29udHJvbCB3aGVuIGNoYW5naW5nIHNvbWV0aGluZyBpbiB0aGUgaW5wdXQgdGV4dCBmaWVsZC4KCQkJdmFyIHRwX2luc3QgPSB0aGlzLl9nZXQoaW5zdCwgJ3RpbWVwaWNrZXInKTsKCQkJaWYgKHRwX2luc3QpIHsKCQkJCXRwX2luc3QuX2FkZFRpbWVQaWNrZXIoaW5zdCk7CgoJCQkJaWYgKHRwX2luc3QuX2RlZmF1bHRzLnVzZUxvY2FsVGltZXpvbmUpIHsgLy9jaGVja3MgZGF5bGlnaHQgc2F2aW5nIHdpdGggdGhlIG5ldyBkYXRlLgoJCQkJCXZhciBkYXRlID0gbmV3IERhdGUoaW5zdC5zZWxlY3RlZFllYXIsIGluc3Quc2VsZWN0ZWRNb250aCwgaW5zdC5zZWxlY3RlZERheSwgMTIpOwoJCQkJCXNlbGVjdExvY2FsVGltZVpvbmUodHBfaW5zdCwgZGF0ZSk7CgkJCQkJdHBfaW5zdC5fb25UaW1lQ2hhbmdlKCk7CgkJCQl9CgkJCX0KCQl9Cgl9OwoKCS8qCgkqIHRoaXJkIGJhZCBoYWNrIDovIG92ZXJyaWRlIGRhdGVwaWNrZXIgc28gaXQgYWxsb3dzIHNwYWNlcyBhbmQgY29sb24gaW4gdGhlIGlucHV0IGZpZWxkCgkqLwoJJC5kYXRlcGlja2VyLl9iYXNlX2RvS2V5UHJlc3MgPSAkLmRhdGVwaWNrZXIuX2RvS2V5UHJlc3M7CgkkLmRhdGVwaWNrZXIuX2RvS2V5UHJlc3MgPSBmdW5jdGlvbihldmVudCkgewoJCXZhciBpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGV2ZW50LnRhcmdldCksCgkJCXRwX2luc3QgPSAkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAndGltZXBpY2tlcicpOwoKCQlpZiAodHBfaW5zdCkgewoJCQlpZiAoJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgJ2NvbnN0cmFpbklucHV0JykpIHsKCQkJCXZhciBhbXBtID0gdXNlQW1wbSh0cF9pbnN0Ll9kZWZhdWx0cy50aW1lRm9ybWF0KSwKCQkJCQlkYXRlQ2hhcnMgPSAkLmRhdGVwaWNrZXIuX3Bvc3NpYmxlQ2hhcnMoJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgJ2RhdGVGb3JtYXQnKSksCgkJCQkJZGF0ZXRpbWVDaGFycyA9IHRwX2luc3QuX2RlZmF1bHRzLnRpbWVGb3JtYXQudG9TdHJpbmcoKQoJCQkJCQkJCQkJCS5yZXBsYWNlKC9baG1zXS9nLCAnJykKCQkJCQkJCQkJCQkucmVwbGFjZSgvVFQvZywgYW1wbSA/ICdBUE0nIDogJycpCgkJCQkJCQkJCQkJLnJlcGxhY2UoL1R0L2csIGFtcG0gPyAnQWFQcE1tJyA6ICcnKQoJCQkJCQkJCQkJCS5yZXBsYWNlKC90VC9nLCBhbXBtID8gJ0FhUHBNbScgOiAnJykKCQkJCQkJCQkJCQkucmVwbGFjZSgvVC9nLCBhbXBtID8gJ0FQJyA6ICcnKQoJCQkJCQkJCQkJCS5yZXBsYWNlKC90dC9nLCBhbXBtID8gJ2FwbScgOiAnJykKCQkJCQkJCQkJCQkucmVwbGFjZSgvdC9nLCBhbXBtID8gJ2FwJyA6ICcnKSArIAoJCQkJCQkJCQkJCSIgIiArIHRwX2luc3QuX2RlZmF1bHRzLnNlcGFyYXRvciArIAoJCQkJCQkJCQkJCXRwX2luc3QuX2RlZmF1bHRzLnRpbWVTdWZmaXggKyAKCQkJCQkJCQkJCQkodHBfaW5zdC5fZGVmYXVsdHMuc2hvd1RpbWV6b25lID8gdHBfaW5zdC5fZGVmYXVsdHMudGltZXpvbmVMaXN0LmpvaW4oJycpIDogJycpICsgCgkJCQkJCQkJCQkJKHRwX2luc3QuX2RlZmF1bHRzLmFtTmFtZXMuam9pbignJykpICsgKHRwX2luc3QuX2RlZmF1bHRzLnBtTmFtZXMuam9pbignJykpICsgCgkJCQkJCQkJCQkJZGF0ZUNoYXJzLAoJCQkJCWNociA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUgPT09IHVuZGVmaW5lZCA/IGV2ZW50LmtleUNvZGUgOiBldmVudC5jaGFyQ29kZSk7CgkJCQlyZXR1cm4gZXZlbnQuY3RybEtleSB8fCAoY2hyIDwgJyAnIHx8ICFkYXRlQ2hhcnMgfHwgZGF0ZXRpbWVDaGFycy5pbmRleE9mKGNocikgPiAtMSk7CgkJCX0KCQl9CgoJCXJldHVybiAkLmRhdGVwaWNrZXIuX2Jhc2VfZG9LZXlQcmVzcyhldmVudCk7Cgl9OwoKCS8qCgkqIEZvdXJ0aCBiYWQgaGFjayA6LyBvdmVycmlkZSBfdXBkYXRlQWx0ZXJuYXRlIGZ1bmN0aW9uIHVzZWQgaW4gaW5saW5lIG1vZGUgdG8gaW5pdCBhbHRGaWVsZAoJKi8KCSQuZGF0ZXBpY2tlci5fYmFzZV91cGRhdGVBbHRlcm5hdGUgPSAkLmRhdGVwaWNrZXIuX3VwZGF0ZUFsdGVybmF0ZTsKCS8qIFVwZGF0ZSBhbnkgYWx0ZXJuYXRlIGZpZWxkIHRvIHN5bmNocm9uaXNlIHdpdGggdGhlIG1haW4gZmllbGQuICovCgkkLmRhdGVwaWNrZXIuX3VwZGF0ZUFsdGVybmF0ZSA9IGZ1bmN0aW9uKGluc3QpIHsKCQl2YXIgdHBfaW5zdCA9IHRoaXMuX2dldChpbnN0LCAndGltZXBpY2tlcicpOwoJCWlmKHRwX2luc3QpewoJCQl2YXIgYWx0RmllbGQgPSB0cF9pbnN0Ll9kZWZhdWx0cy5hbHRGaWVsZDsKCQkJaWYgKGFsdEZpZWxkKSB7IC8vIHVwZGF0ZSBhbHRlcm5hdGUgZmllbGQgdG9vCgkJCQl2YXIgYWx0Rm9ybWF0ID0gdHBfaW5zdC5fZGVmYXVsdHMuYWx0Rm9ybWF0IHx8IHRwX2luc3QuX2RlZmF1bHRzLmRhdGVGb3JtYXQsCgkJCQkJZGF0ZSA9IHRoaXMuX2dldERhdGUoaW5zdCksCgkJCQkJZm9ybWF0Q2ZnID0gJC5kYXRlcGlja2VyLl9nZXRGb3JtYXRDb25maWcoaW5zdCksCgkJCQkJYWx0Rm9ybWF0dGVkRGF0ZVRpbWUgPSAnJywgCgkJCQkJYWx0U2VwYXJhdG9yID0gdHBfaW5zdC5fZGVmYXVsdHMuYWx0U2VwYXJhdG9yID8gdHBfaW5zdC5fZGVmYXVsdHMuYWx0U2VwYXJhdG9yIDogdHBfaW5zdC5fZGVmYXVsdHMuc2VwYXJhdG9yLCAKCQkJCQlhbHRUaW1lU3VmZml4ID0gdHBfaW5zdC5fZGVmYXVsdHMuYWx0VGltZVN1ZmZpeCA/IHRwX2luc3QuX2RlZmF1bHRzLmFsdFRpbWVTdWZmaXggOiB0cF9pbnN0Ll9kZWZhdWx0cy50aW1lU3VmZml4LAoJCQkJCWFsdFRpbWVGb3JtYXQgPSB0cF9pbnN0Ll9kZWZhdWx0cy5hbHRUaW1lRm9ybWF0ICE9PSBudWxsID8gdHBfaW5zdC5fZGVmYXVsdHMuYWx0VGltZUZvcm1hdCA6IHRwX2luc3QuX2RlZmF1bHRzLnRpbWVGb3JtYXQ7CgkJCQkKCQkJCWFsdEZvcm1hdHRlZERhdGVUaW1lICs9ICQuZGF0ZXBpY2tlci5mb3JtYXRUaW1lKGFsdFRpbWVGb3JtYXQsIHRwX2luc3QsIHRwX2luc3QuX2RlZmF1bHRzKSArIGFsdFRpbWVTdWZmaXg7CgkJCQlpZighdHBfaW5zdC5fZGVmYXVsdHMudGltZU9ubHkgJiYgIXRwX2luc3QuX2RlZmF1bHRzLmFsdEZpZWxkVGltZU9ubHkpewoJCQkJCWlmKHRwX2luc3QuX2RlZmF1bHRzLmFsdEZvcm1hdCkKCQkJCQkJYWx0Rm9ybWF0dGVkRGF0ZVRpbWUgPSAkLmRhdGVwaWNrZXIuZm9ybWF0RGF0ZSh0cF9pbnN0Ll9kZWZhdWx0cy5hbHRGb3JtYXQsIChkYXRlID09PSBudWxsID8gbmV3IERhdGUoKSA6IGRhdGUpLCBmb3JtYXRDZmcpICsgYWx0U2VwYXJhdG9yICsgYWx0Rm9ybWF0dGVkRGF0ZVRpbWU7CgkJCQkJZWxzZSBhbHRGb3JtYXR0ZWREYXRlVGltZSA9IHRwX2luc3QuZm9ybWF0dGVkRGF0ZSArIGFsdFNlcGFyYXRvciArIGFsdEZvcm1hdHRlZERhdGVUaW1lOwoJCQkJfQoJCQkJJChhbHRGaWVsZCkudmFsKGFsdEZvcm1hdHRlZERhdGVUaW1lKTsKCQkJfQoJCX0KCQllbHNlewoJCQkkLmRhdGVwaWNrZXIuX2Jhc2VfdXBkYXRlQWx0ZXJuYXRlKGluc3QpOwoJCX0KCX07CgoJLyoKCSogT3ZlcnJpZGUga2V5IHVwIGV2ZW50IHRvIHN5bmMgbWFudWFsIGlucHV0IGNoYW5nZXMuCgkqLwoJJC5kYXRlcGlja2VyLl9iYXNlX2RvS2V5VXAgPSAkLmRhdGVwaWNrZXIuX2RvS2V5VXA7CgkkLmRhdGVwaWNrZXIuX2RvS2V5VXAgPSBmdW5jdGlvbihldmVudCkgewoJCXZhciBpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGV2ZW50LnRhcmdldCksCgkJCXRwX2luc3QgPSAkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAndGltZXBpY2tlcicpOwoKCQlpZiAodHBfaW5zdCkgewoJCQlpZiAodHBfaW5zdC5fZGVmYXVsdHMudGltZU9ubHkgJiYgKGluc3QuaW5wdXQudmFsKCkgIT0gaW5zdC5sYXN0VmFsKSkgewoJCQkJdHJ5IHsKCQkJCQkkLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7CgkJCQl9IGNhdGNoIChlcnIpIHsKCQkJCQkkLmRhdGVwaWNrZXIubG9nKGVycik7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiAkLmRhdGVwaWNrZXIuX2Jhc2VfZG9LZXlVcChldmVudCk7Cgl9OwoKCS8qCgkqIG92ZXJyaWRlICJUb2RheSIgYnV0dG9uIHRvIGFsc28gZ3JhYiB0aGUgdGltZS4KCSovCgkkLmRhdGVwaWNrZXIuX2Jhc2VfZ290b1RvZGF5ID0gJC5kYXRlcGlja2VyLl9nb3RvVG9kYXk7CgkkLmRhdGVwaWNrZXIuX2dvdG9Ub2RheSA9IGZ1bmN0aW9uKGlkKSB7CgkJdmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KCQoaWQpWzBdKSwKCQkJJGRwID0gaW5zdC5kcERpdjsKCQl0aGlzLl9iYXNlX2dvdG9Ub2RheShpZCk7CgkJdmFyIHRwX2luc3QgPSB0aGlzLl9nZXQoaW5zdCwgJ3RpbWVwaWNrZXInKTsKCQlzZWxlY3RMb2NhbFRpbWVab25lKHRwX2luc3QpOwoJCXZhciBub3cgPSBuZXcgRGF0ZSgpOwoJCXRoaXMuX3NldFRpbWUoaW5zdCwgbm93KTsKCQkkKCcudWktZGF0ZXBpY2tlci10b2RheScsICRkcCkuY2xpY2soKTsKCX07CgoJLyoKCSogRGlzYWJsZSAmIGVuYWJsZSB0aGUgVGltZSBpbiB0aGUgZGF0ZXRpbWVwaWNrZXIKCSovCgkkLmRhdGVwaWNrZXIuX2Rpc2FibGVUaW1lcGlja2VyRGF0ZXBpY2tlciA9IGZ1bmN0aW9uKHRhcmdldCkgewoJCXZhciBpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXQpOwoJCWlmICghaW5zdCkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgdHBfaW5zdCA9IHRoaXMuX2dldChpbnN0LCAndGltZXBpY2tlcicpOwoJCSQodGFyZ2V0KS5kYXRlcGlja2VyKCdnZXREYXRlJyk7IC8vIEluaXQgc2VsZWN0ZWRbWWVhcnxNb250aHxEYXldCgkJaWYgKHRwX2luc3QpIHsKCQkJdHBfaW5zdC5fZGVmYXVsdHMuc2hvd1RpbWVwaWNrZXIgPSBmYWxzZTsKCQkJdHBfaW5zdC5fdXBkYXRlRGF0ZVRpbWUoaW5zdCk7CgkJfQoJfTsKCgkkLmRhdGVwaWNrZXIuX2VuYWJsZVRpbWVwaWNrZXJEYXRlcGlja2VyID0gZnVuY3Rpb24odGFyZ2V0KSB7CgkJdmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldCk7CgkJaWYgKCFpbnN0KSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciB0cF9pbnN0ID0gdGhpcy5fZ2V0KGluc3QsICd0aW1lcGlja2VyJyk7CgkJJCh0YXJnZXQpLmRhdGVwaWNrZXIoJ2dldERhdGUnKTsgLy8gSW5pdCBzZWxlY3RlZFtZZWFyfE1vbnRofERheV0KCQlpZiAodHBfaW5zdCkgewoJCQl0cF9pbnN0Ll9kZWZhdWx0cy5zaG93VGltZXBpY2tlciA9IHRydWU7CgkJCXRwX2luc3QuX2FkZFRpbWVQaWNrZXIoaW5zdCk7IC8vIENvdWxkIGJlIGRpc2FibGVkIG9uIHBhZ2UgbG9hZAoJCQl0cF9pbnN0Ll91cGRhdGVEYXRlVGltZShpbnN0KTsKCQl9Cgl9OwoKCS8qCgkqIENyZWF0ZSBvdXIgb3duIHNldCB0aW1lIGZ1bmN0aW9uCgkqLwoJJC5kYXRlcGlja2VyLl9zZXRUaW1lID0gZnVuY3Rpb24oaW5zdCwgZGF0ZSkgewoJCXZhciB0cF9pbnN0ID0gdGhpcy5fZ2V0KGluc3QsICd0aW1lcGlja2VyJyk7CgkJaWYgKHRwX2luc3QpIHsKCQkJdmFyIGRlZmF1bHRzID0gdHBfaW5zdC5fZGVmYXVsdHM7CgoJCQkvLyBjYWxsaW5nIF9zZXRUaW1lIHdpdGggbm8gZGF0ZSBzZXRzIHRpbWUgdG8gZGVmYXVsdHMKCQkJdHBfaW5zdC5ob3VyID0gZGF0ZSA/IGRhdGUuZ2V0SG91cnMoKSA6IGRlZmF1bHRzLmhvdXI7CgkJCXRwX2luc3QubWludXRlID0gZGF0ZSA/IGRhdGUuZ2V0TWludXRlcygpIDogZGVmYXVsdHMubWludXRlOwoJCQl0cF9pbnN0LnNlY29uZCA9IGRhdGUgPyBkYXRlLmdldFNlY29uZHMoKSA6IGRlZmF1bHRzLnNlY29uZDsKCQkJdHBfaW5zdC5taWxsaXNlYyA9IGRhdGUgPyBkYXRlLmdldE1pbGxpc2Vjb25kcygpIDogZGVmYXVsdHMubWlsbGlzZWM7CgoJCQkvL2NoZWNrIGlmIHdpdGhpbiBtaW4vbWF4IHRpbWVzLi4gCgkJCXRwX2luc3QuX2xpbWl0TWluTWF4RGF0ZVRpbWUoaW5zdCwgdHJ1ZSk7CgoJCQl0cF9pbnN0Ll9vblRpbWVDaGFuZ2UoKTsKCQkJdHBfaW5zdC5fdXBkYXRlRGF0ZVRpbWUoaW5zdCk7CgkJfQoJfTsKCgkvKgoJKiBDcmVhdGUgbmV3IHB1YmxpYyBtZXRob2QgdG8gc2V0IG9ubHkgdGltZSwgY2FsbGFibGUgYXMgJCgpLmRhdGVwaWNrZXIoJ3NldFRpbWUnLCBkYXRlKQoJKi8KCSQuZGF0ZXBpY2tlci5fc2V0VGltZURhdGVwaWNrZXIgPSBmdW5jdGlvbih0YXJnZXQsIGRhdGUsIHdpdGhEYXRlKSB7CgkJdmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldCk7CgkJaWYgKCFpbnN0KSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciB0cF9pbnN0ID0gdGhpcy5fZ2V0KGluc3QsICd0aW1lcGlja2VyJyk7CgoJCWlmICh0cF9pbnN0KSB7CgkJCXRoaXMuX3NldERhdGVGcm9tRmllbGQoaW5zdCk7CgkJCXZhciB0cF9kYXRlOwoJCQlpZiAoZGF0ZSkgewoJCQkJaWYgKHR5cGVvZiBkYXRlID09ICJzdHJpbmciKSB7CgkJCQkJdHBfaW5zdC5fcGFyc2VUaW1lKGRhdGUsIHdpdGhEYXRlKTsKCQkJCQl0cF9kYXRlID0gbmV3IERhdGUoKTsKCQkJCQl0cF9kYXRlLnNldEhvdXJzKHRwX2luc3QuaG91ciwgdHBfaW5zdC5taW51dGUsIHRwX2luc3Quc2Vjb25kLCB0cF9pbnN0Lm1pbGxpc2VjKTsKCQkJCX0gZWxzZSB7CgkJCQkJdHBfZGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTsKCQkJCX0KCQkJCWlmICh0cF9kYXRlLnRvU3RyaW5nKCkgPT0gJ0ludmFsaWQgRGF0ZScpIHsKCQkJCQl0cF9kYXRlID0gdW5kZWZpbmVkOwoJCQkJfQoJCQkJdGhpcy5fc2V0VGltZShpbnN0LCB0cF9kYXRlKTsKCQkJfQoJCX0KCgl9OwoKCS8qCgkqIG92ZXJyaWRlIHNldERhdGUoKSB0byBhbGxvdyBzZXR0aW5nIHRpbWUgdG9vIHdpdGhpbiBEYXRlIG9iamVjdAoJKi8KCSQuZGF0ZXBpY2tlci5fYmFzZV9zZXREYXRlRGF0ZXBpY2tlciA9ICQuZGF0ZXBpY2tlci5fc2V0RGF0ZURhdGVwaWNrZXI7CgkkLmRhdGVwaWNrZXIuX3NldERhdGVEYXRlcGlja2VyID0gZnVuY3Rpb24odGFyZ2V0LCBkYXRlKSB7CgkJdmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldCk7CgkJaWYgKCFpbnN0KSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciB0cF9kYXRlID0gKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSA/IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKSA6IGRhdGU7CgoJCXRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7CgkJdGhpcy5fYmFzZV9zZXREYXRlRGF0ZXBpY2tlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwoJCXRoaXMuX3NldFRpbWVEYXRlcGlja2VyKHRhcmdldCwgdHBfZGF0ZSwgdHJ1ZSk7Cgl9OwoKCS8qCgkqIG92ZXJyaWRlIGdldERhdGUoKSB0byBhbGxvdyBnZXR0aW5nIHRpbWUgdG9vIHdpdGhpbiBEYXRlIG9iamVjdAoJKi8KCSQuZGF0ZXBpY2tlci5fYmFzZV9nZXREYXRlRGF0ZXBpY2tlciA9ICQuZGF0ZXBpY2tlci5fZ2V0RGF0ZURhdGVwaWNrZXI7CgkkLmRhdGVwaWNrZXIuX2dldERhdGVEYXRlcGlja2VyID0gZnVuY3Rpb24odGFyZ2V0LCBub0RlZmF1bHQpIHsKCQl2YXIgaW5zdCA9IHRoaXMuX2dldEluc3QodGFyZ2V0KTsKCQlpZiAoIWluc3QpIHsKCQkJcmV0dXJuOwoJCX0KCgkJdmFyIHRwX2luc3QgPSB0aGlzLl9nZXQoaW5zdCwgJ3RpbWVwaWNrZXInKTsKCgkJaWYgKHRwX2luc3QpIHsKCQkJLy8gaWYgaXQgaGFzbid0IHlldCBiZWVuIGRlZmluZWQsIGdyYWIgZnJvbSBmaWVsZAoJCQlpZihpbnN0Lmxhc3RWYWwgPT09IHVuZGVmaW5lZCl7CgkJCQl0aGlzLl9zZXREYXRlRnJvbUZpZWxkKGluc3QsIG5vRGVmYXVsdCk7CgkJCX0KCgkJCXZhciBkYXRlID0gdGhpcy5fZ2V0RGF0ZShpbnN0KTsKCQkJaWYgKGRhdGUgJiYgdHBfaW5zdC5fcGFyc2VUaW1lKCQodGFyZ2V0KS52YWwoKSwgdHBfaW5zdC50aW1lT25seSkpIHsKCQkJCWRhdGUuc2V0SG91cnModHBfaW5zdC5ob3VyLCB0cF9pbnN0Lm1pbnV0ZSwgdHBfaW5zdC5zZWNvbmQsIHRwX2luc3QubWlsbGlzZWMpOwoJCQl9CgkJCXJldHVybiBkYXRlOwoJCX0KCQlyZXR1cm4gdGhpcy5fYmFzZV9nZXREYXRlRGF0ZXBpY2tlcih0YXJnZXQsIG5vRGVmYXVsdCk7Cgl9OwoKCS8qCgkqIG92ZXJyaWRlIHBhcnNlRGF0ZSgpIGJlY2F1c2UgVUkgMS44LjE0IHRocm93cyBhbiBlcnJvciBhYm91dCAiRXh0cmEgY2hhcmFjdGVycyIKCSogQW4gb3B0aW9uIGluIGRhdGFwaWNrZXIgdG8gaWdub3JlIGV4dHJhIGZvcm1hdCBjaGFyYWN0ZXJzIHdvdWxkIGJlIG5pY2VyLgoJKi8KCSQuZGF0ZXBpY2tlci5fYmFzZV9wYXJzZURhdGUgPSAkLmRhdGVwaWNrZXIucGFyc2VEYXRlOwoJJC5kYXRlcGlja2VyLnBhcnNlRGF0ZSA9IGZ1bmN0aW9uKGZvcm1hdCwgdmFsdWUsIHNldHRpbmdzKSB7CgkJdmFyIGRhdGU7CgkJdHJ5IHsKCQkJZGF0ZSA9IHRoaXMuX2Jhc2VfcGFyc2VEYXRlKGZvcm1hdCwgdmFsdWUsIHNldHRpbmdzKTsKCQl9IGNhdGNoIChlcnIpIHsKCQkJLy8gSGFjayEgIFRoZSBlcnJvciBtZXNzYWdlIGVuZHMgd2l0aCBhIGNvbG9uLCBhIHNwYWNlLCBhbmQKCQkJLy8gdGhlICJleHRyYSIgY2hhcmFjdGVycy4gIFdlIHJlbHkgb24gdGhhdCBpbnN0ZWFkIG9mCgkJCS8vIGF0dGVtcHRpbmcgdG8gcGVyZmVjdGx5IHJlcHJvZHVjZSB0aGUgcGFyc2luZyBhbGdvcml0aG0uCgkJCWRhdGUgPSB0aGlzLl9iYXNlX3BhcnNlRGF0ZShmb3JtYXQsIHZhbHVlLnN1YnN0cmluZygwLHZhbHVlLmxlbmd0aC0oZXJyLmxlbmd0aC1lcnIuaW5kZXhPZignOicpLTIpKSwgc2V0dGluZ3MpOwoJCQkkLmRhdGVwaWNrZXIubG9nKCJFcnJvciBwYXJzaW5nIHRoZSBkYXRlIHN0cmluZzogIiArIGVyciArICJcbmRhdGUgc3RyaW5nID0gIiArIHZhbHVlICsgIlxuZGF0ZSBmb3JtYXQgPSAiICsgZm9ybWF0KTsKCQl9CgkJcmV0dXJuIGRhdGU7Cgl9OwoKCS8qCgkqIG92ZXJyaWRlIGZvcm1hdERhdGUgdG8gc2V0IGRhdGUgd2l0aCB0aW1lIHRvIHRoZSBpbnB1dAoJKi8KCSQuZGF0ZXBpY2tlci5fYmFzZV9mb3JtYXREYXRlID0gJC5kYXRlcGlja2VyLl9mb3JtYXREYXRlOwoJJC5kYXRlcGlja2VyLl9mb3JtYXREYXRlID0gZnVuY3Rpb24oaW5zdCwgZGF5LCBtb250aCwgeWVhcikgewoJCXZhciB0cF9pbnN0ID0gdGhpcy5fZ2V0KGluc3QsICd0aW1lcGlja2VyJyk7CgkJaWYgKHRwX2luc3QpIHsKCQkJdHBfaW5zdC5fdXBkYXRlRGF0ZVRpbWUoaW5zdCk7CgkJCXJldHVybiB0cF9pbnN0LiRpbnB1dC52YWwoKTsKCQl9CgkJcmV0dXJuIHRoaXMuX2Jhc2VfZm9ybWF0RGF0ZShpbnN0KTsKCX07CgoJLyoKCSogb3ZlcnJpZGUgb3B0aW9ucyBzZXR0ZXIgdG8gYWRkIHRpbWUgdG8gbWF4RGF0ZShUaW1lKSBhbmQgbWluRGF0ZShUaW1lKS4gTWF4RGF0ZQoJKi8KCSQuZGF0ZXBpY2tlci5fYmFzZV9vcHRpb25EYXRlcGlja2VyID0gJC5kYXRlcGlja2VyLl9vcHRpb25EYXRlcGlja2VyOwoJJC5kYXRlcGlja2VyLl9vcHRpb25EYXRlcGlja2VyID0gZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCB2YWx1ZSkgewoJCXZhciBpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXQpLAoJICAgICAgICBuYW1lX2Nsb25lOwoJCWlmICghaW5zdCkgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgoJCXZhciB0cF9pbnN0ID0gdGhpcy5fZ2V0KGluc3QsICd0aW1lcGlja2VyJyk7CgkJaWYgKHRwX2luc3QpIHsKCQkJdmFyIG1pbiA9IG51bGwsCgkJCQltYXggPSBudWxsLAoJCQkJb25zZWxlY3QgPSBudWxsLAoJCQkJb3ZlcnJpZGVzID0gdHBfaW5zdC5fZGVmYXVsdHMuZXZudHMsCgkJCQlmbnMgPSB7fSwKCQkJCXByb3A7CgkJICAgIGlmICh0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJykgeyAvLyBpZiBtaW4vbWF4IHdhcyBzZXQgd2l0aCB0aGUgc3RyaW5nCgkJICAgICAgICBpZiAobmFtZSA9PT0gJ21pbkRhdGUnIHx8IG5hbWUgPT09ICdtaW5EYXRlVGltZScpIHsKCQkgICAgICAgICAgICBtaW4gPSB2YWx1ZTsKCQkgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ21heERhdGUnIHx8IG5hbWUgPT09ICdtYXhEYXRlVGltZScpIHsKCQkgICAgICAgICAgICBtYXggPSB2YWx1ZTsKCQkgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ29uU2VsZWN0JykgewoJCSAgICAgICAgICAgIG9uc2VsZWN0ID0gdmFsdWU7CgkJICAgICAgICB9IGVsc2UgaWYgKG92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewoJCSAgICAgICAgICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gJ3VuZGVmaW5lZCcpIHsKCQkgICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlc1tuYW1lXTsKCQkgICAgICAgICAgICB9CgkJICAgICAgICAgICAgZm5zW25hbWVdID0gdmFsdWU7CgkJICAgICAgICAgICAgbmFtZV9jbG9uZSA9IHt9OyAvL2VtcHR5IHJlc3VsdHMgaW4gZXhpdGluZyBmdW5jdGlvbiBhZnRlciBvdmVycmlkZXMgdXBkYXRlZAoJCSAgICAgICAgfQoJCSAgICB9IGVsc2UgaWYgKHR5cGVvZiBuYW1lID09ICdvYmplY3QnKSB7IC8vaWYgbWluL21heCB3YXMgc2V0IHdpdGggdGhlIEpTT04KCQkgICAgICAgIGlmIChuYW1lLm1pbkRhdGUpIHsKCQkgICAgICAgICAgICBtaW4gPSBuYW1lLm1pbkRhdGU7CgkJICAgICAgICB9IGVsc2UgaWYgKG5hbWUubWluRGF0ZVRpbWUpIHsKCQkgICAgICAgICAgICBtaW4gPSBuYW1lLm1pbkRhdGVUaW1lOwoJCSAgICAgICAgfSBlbHNlIGlmIChuYW1lLm1heERhdGUpIHsKCQkgICAgICAgICAgICBtYXggPSBuYW1lLm1heERhdGU7CgkJICAgICAgICB9IGVsc2UgaWYgKG5hbWUubWF4RGF0ZVRpbWUpIHsKCQkgICAgICAgICAgICBtYXggPSBuYW1lLm1heERhdGVUaW1lOwoJCSAgICAgICAgfQoJCSAgICAgICAgZm9yIChwcm9wIGluIG92ZXJyaWRlcykgewoJCSAgICAgICAgICAgIGlmIChvdmVycmlkZXMuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgbmFtZVtwcm9wXSkgewoJCSAgICAgICAgICAgICAgICBmbnNbcHJvcF0gPSBuYW1lW3Byb3BdOwoJCSAgICAgICAgICAgIH0KCQkgICAgICAgIH0KCQkgICAgfQoJCSAgICBmb3IgKHByb3AgaW4gZm5zKSB7CgkJICAgICAgICBpZiAoZm5zLmhhc093blByb3BlcnR5KHByb3ApKSB7CgkJICAgICAgICAgICAgb3ZlcnJpZGVzW3Byb3BdID0gZm5zW3Byb3BdOwoJCSAgICAgICAgICAgIGlmICghbmFtZV9jbG9uZSkgeyBuYW1lX2Nsb25lID0gJC5leHRlbmQoe30sIG5hbWUpO30KCQkgICAgICAgICAgICBkZWxldGUgbmFtZV9jbG9uZVtwcm9wXTsKCQkgICAgICAgIH0KCQkgICAgfQoJCSAgICBpZiAobmFtZV9jbG9uZSAmJiBpc0VtcHR5T2JqZWN0KG5hbWVfY2xvbmUpKSB7IHJldHVybjsgfQoJCSAgICBpZiAobWluKSB7IC8vaWYgbWluIHdhcyBzZXQKCQkgICAgICAgIGlmIChtaW4gPT09IDApIHsKCQkgICAgICAgICAgICBtaW4gPSBuZXcgRGF0ZSgpOwoJCSAgICAgICAgfSBlbHNlIHsKCQkgICAgICAgICAgICBtaW4gPSBuZXcgRGF0ZShtaW4pOwoJCSAgICAgICAgfQoJCSAgICAgICAgdHBfaW5zdC5fZGVmYXVsdHMubWluRGF0ZSA9IG1pbjsKCQkgICAgICAgIHRwX2luc3QuX2RlZmF1bHRzLm1pbkRhdGVUaW1lID0gbWluOwoJCSAgICB9IGVsc2UgaWYgKG1heCkgeyAvL2lmIG1heCB3YXMgc2V0CgkJICAgICAgICBpZiAobWF4ID09PSAwKSB7CgkJICAgICAgICAgICAgbWF4ID0gbmV3IERhdGUoKTsKCQkgICAgICAgIH0gZWxzZSB7CgkJICAgICAgICAgICAgbWF4ID0gbmV3IERhdGUobWF4KTsKCQkgICAgICAgIH0KCQkgICAgICAgIHRwX2luc3QuX2RlZmF1bHRzLm1heERhdGUgPSBtYXg7CgkJICAgICAgICB0cF9pbnN0Ll9kZWZhdWx0cy5tYXhEYXRlVGltZSA9IG1heDsKCQkgICAgfSBlbHNlIGlmIChvbnNlbGVjdCkgewoJCSAgICAgICAgdHBfaW5zdC5fZGVmYXVsdHMub25TZWxlY3QgPSBvbnNlbGVjdDsKCQkgICAgfQoJCX0KCQlpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewoJCQlyZXR1cm4gdGhpcy5fYmFzZV9vcHRpb25EYXRlcGlja2VyLmNhbGwoJC5kYXRlcGlja2VyLCB0YXJnZXQsIG5hbWUpOwoJCX0KCQlyZXR1cm4gdGhpcy5fYmFzZV9vcHRpb25EYXRlcGlja2VyLmNhbGwoJC5kYXRlcGlja2VyLCB0YXJnZXQsIG5hbWVfY2xvbmUgfHwgbmFtZSwgdmFsdWUpOwoJfTsKCS8qCgkqIGpRdWVyeSBpc0VtcHR5T2JqZWN0IGRvZXMgbm90IGNoZWNrIGhhc093blByb3BlcnR5IC0gaWYgc29tZW9uZSBoYXMgYWRkZWQgdG8gdGhlIG9iamVjdCBwcm90b3R5cGUsCgkqIGl0IHdpbGwgcmV0dXJuIGZhbHNlIGZvciBhbGwgb2JqZWN0cwoJKi8KCXZhciBpc0VtcHR5T2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7CgkJdmFyIHByb3A7CgkJZm9yIChwcm9wIGluIG9iaikgewoJCQlpZiAob2JqLmhhc093blByb3BlcnR5KG9iaikpIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX07CgoJLyoKCSogalF1ZXJ5IGV4dGVuZCBub3cgaWdub3JlcyBudWxscyEKCSovCgl2YXIgZXh0ZW5kUmVtb3ZlID0gZnVuY3Rpb24odGFyZ2V0LCBwcm9wcykgewoJCSQuZXh0ZW5kKHRhcmdldCwgcHJvcHMpOwoJCWZvciAodmFyIG5hbWUgaW4gcHJvcHMpIHsKCQkJaWYgKHByb3BzW25hbWVdID09PSBudWxsIHx8IHByb3BzW25hbWVdID09PSB1bmRlZmluZWQpIHsKCQkJCXRhcmdldFtuYW1lXSA9IHByb3BzW25hbWVdOwoJCQl9CgkJfQoJCXJldHVybiB0YXJnZXQ7Cgl9OwoKCS8qCgkqIERldGVybWluZSBieSB0aGUgdGltZSBmb3JtYXQgaWYgc2hvdWxkIHVzZSBhbXBtCgkqIFJldHVybnMgdHJ1ZSBpZiBzaG91bGQgdXNlIGFtcG0sIGZhbHNlIGlmIG5vdAoJKi8KCXZhciB1c2VBbXBtID0gZnVuY3Rpb24odGltZUZvcm1hdCl7CgkJcmV0dXJuICh0aW1lRm9ybWF0LmluZGV4T2YoJ3QnKSAhPT0gLTEgJiYgdGltZUZvcm1hdC5pbmRleE9mKCdoJykgIT09IC0xKTsKCX07CgoJLyoKCSogQ29udmVydHMgMjQgaG91ciBmb3JtYXQgaW50byAxMiBob3VyCgkqIFJldHVybnMgMTIgaG91ciB3aXRob3V0IGxlYWRpbmcgMAoJKi8KCXZhciBjb252ZXJ0MjR0bzEyID0gZnVuY3Rpb24oaG91cikgewoJCWlmIChob3VyID4gMTIpIHsKCQkJaG91ciA9IGhvdXIgLSAxMjsKCQl9CgoJCWlmIChob3VyID09IDApIHsKCQkJaG91ciA9IDEyOwoJCX0KCgkJcmV0dXJuIFN0cmluZyhob3VyKTsKCX07CgoJLyoKCSogU3BsaXRzIGRhdGV0aW1lIHN0cmluZyBpbnRvIGRhdGUgYW5zIHRpbWUgc3Vic3RyaW5ncy4KCSogVGhyb3dzIGV4Y2VwdGlvbiB3aGVuIGRhdGUgY2FuJ3QgYmUgcGFyc2VkCgkqIFJldHVybnMgW2RhdGVTdHJpbmcsIHRpbWVTdHJpbmddCgkqLwoJdmFyIHNwbGl0RGF0ZVRpbWUgPSBmdW5jdGlvbihkYXRlRm9ybWF0LCBkYXRlVGltZVN0cmluZywgZGF0ZVNldHRpbmdzLCB0aW1lU2V0dGluZ3MpIHsKCQl0cnkgewoJCQkvLyBUaGUgaWRlYSBpcyB0byBnZXQgdGhlIG51bWJlciBzZXBhcmF0b3Igb2NjdXJhbmNlcyBpbiBkYXRldGltZSBhbmQgdGhlIHRpbWUgZm9ybWF0IHJlcXVlc3RlZCAoc2luY2UgdGltZSBoYXMgCgkJCS8vIGZld2VyIHVua25vd25zLCBtb3N0bHkgbnVtYmVycyBhbmQgYW0vcG0pLiBXZSB3aWxsIHVzZSB0aGUgdGltZSBwYXR0ZXJuIHRvIHNwbGl0LgoJCQl2YXIgc2VwYXJhdG9yID0gdGltZVNldHRpbmdzICYmIHRpbWVTZXR0aW5ncy5zZXBhcmF0b3IgPyB0aW1lU2V0dGluZ3Muc2VwYXJhdG9yIDogJC50aW1lcGlja2VyLl9kZWZhdWx0cy5zZXBhcmF0b3IsCgkJCQlmb3JtYXQgPSB0aW1lU2V0dGluZ3MgJiYgdGltZVNldHRpbmdzLnRpbWVGb3JtYXQgPyB0aW1lU2V0dGluZ3MudGltZUZvcm1hdCA6ICQudGltZXBpY2tlci5fZGVmYXVsdHMudGltZUZvcm1hdCwKCQkJCXRpbWVQYXJ0cyA9IGZvcm1hdC5zcGxpdChzZXBhcmF0b3IpLCAvLyBob3cgbWFueSBvY2N1cmFuY2VzIG9mIHNlcGFyYXRvciBtYXkgYmUgaW4gb3VyIGZvcm1hdD8KCQkJCXRpbWVQYXJ0c0xlbiA9IHRpbWVQYXJ0cy5sZW5ndGgsCgkJCQlhbGxQYXJ0cyA9IGRhdGVUaW1lU3RyaW5nLnNwbGl0KHNlcGFyYXRvciksCgkJCQlhbGxQYXJ0c0xlbiA9IGFsbFBhcnRzLmxlbmd0aDsKCgkJCWlmIChhbGxQYXJ0c0xlbiA+IDEpIHsKCQkJCXJldHVybiBbCgkJCQkJCWFsbFBhcnRzLnNwbGljZSgwLGFsbFBhcnRzTGVuLXRpbWVQYXJ0c0xlbikuam9pbihzZXBhcmF0b3IpLAoJCQkJCQlhbGxQYXJ0cy5zcGxpY2UoMCx0aW1lUGFydHNMZW4pLmpvaW4oc2VwYXJhdG9yKQoJCQkJCV07CgkJCX0KCgkJfSBjYXRjaCAoZXJyKSB7CgkJCSQuZGF0ZXBpY2tlci5sb2coJ0NvdWxkIG5vdCBzcGxpdCB0aGUgZGF0ZSBmcm9tIHRoZSB0aW1lLiBQbGVhc2UgY2hlY2sgdGhlIGZvbGxvd2luZyBkYXRldGltZXBpY2tlciBvcHRpb25zJyArCgkJCQkJIlxudGhyb3duIGVycm9yOiAiICsgZXJyICsKCQkJCQkiXG5kYXRlVGltZVN0cmluZyIgKyBkYXRlVGltZVN0cmluZyArCgkJCQkJIlxuZGF0ZUZvcm1hdCA9ICIgKyBkYXRlRm9ybWF0ICsKCQkJCQkiXG5zZXBhcmF0b3IgPSAiICsgdGltZVNldHRpbmdzLnNlcGFyYXRvciArCgkJCQkJIlxudGltZUZvcm1hdCA9ICIgKyB0aW1lU2V0dGluZ3MudGltZUZvcm1hdCk7CgoJCQlpZiAoZXJyLmluZGV4T2YoIjoiKSA+PSAwKSB7CgkJCQkvLyBIYWNrISAgVGhlIGVycm9yIG1lc3NhZ2UgZW5kcyB3aXRoIGEgY29sb24sIGEgc3BhY2UsIGFuZAoJCQkJLy8gdGhlICJleHRyYSIgY2hhcmFjdGVycy4gIFdlIHJlbHkgb24gdGhhdCBpbnN0ZWFkIG9mCgkJCQkvLyBhdHRlbXB0aW5nIHRvIHBlcmZlY3RseSByZXByb2R1Y2UgdGhlIHBhcnNpbmcgYWxnb3JpdGhtLgoJCQkJdmFyIGRhdGVTdHJpbmdMZW5ndGggPSBkYXRlVGltZVN0cmluZy5sZW5ndGggLSAoZXJyLmxlbmd0aCAtIGVyci5pbmRleE9mKCc6JykgLSAyKSwKCQkJCQl0aW1lU3RyaW5nID0gZGF0ZVRpbWVTdHJpbmcuc3Vic3RyaW5nKGRhdGVTdHJpbmdMZW5ndGgpOwoKCQkJCXJldHVybiBbJC50cmltKGRhdGVUaW1lU3RyaW5nLnN1YnN0cmluZygwLCBkYXRlU3RyaW5nTGVuZ3RoKSksICQudHJpbShkYXRlVGltZVN0cmluZy5zdWJzdHJpbmcoZGF0ZVN0cmluZ0xlbmd0aCkpXTsKCgkJCX0gZWxzZSB7CgkJCQl0aHJvdyBlcnI7CgkJCX0KCQl9CgkJcmV0dXJuIFtkYXRlVGltZVN0cmluZywgJyddOwoJfTsKCgkvKgoJKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBwYXJzZSBkYXRldGltZSBpbnRlcnZhbAoJKiBSZXR1cm5zOiB7ZGF0ZTogRGF0ZSwgdGltZU9iajogT2JqZWN0fSwgd2hlcmUKCSogICBkYXRlIC0gcGFyc2VkIGRhdGUgd2l0aG91dCB0aW1lICh0eXBlIERhdGUpCgkqICAgdGltZU9iaiA9IHtob3VyOiAsIG1pbnV0ZTogLCBzZWNvbmQ6ICwgbWlsbGlzZWM6IH0gLSBwYXJzZWQgdGltZS4gT3B0aW9uYWwKCSovCgl2YXIgcGFyc2VEYXRlVGltZUludGVybmFsID0gZnVuY3Rpb24oZGF0ZUZvcm1hdCwgdGltZUZvcm1hdCwgZGF0ZVRpbWVTdHJpbmcsIGRhdGVTZXR0aW5ncywgdGltZVNldHRpbmdzKSB7CgkJdmFyIGRhdGU7CgkJdmFyIHNwbGl0UmVzID0gc3BsaXREYXRlVGltZShkYXRlRm9ybWF0LCBkYXRlVGltZVN0cmluZywgZGF0ZVNldHRpbmdzLCB0aW1lU2V0dGluZ3MpOwoJCWRhdGUgPSAkLmRhdGVwaWNrZXIuX2Jhc2VfcGFyc2VEYXRlKGRhdGVGb3JtYXQsIHNwbGl0UmVzWzBdLCBkYXRlU2V0dGluZ3MpOwoJCWlmIChzcGxpdFJlc1sxXSAhPT0gJycpIHsKCQkJdmFyIHRpbWVTdHJpbmcgPSBzcGxpdFJlc1sxXSwKCQkJCXBhcnNlZFRpbWUgPSAkLmRhdGVwaWNrZXIucGFyc2VUaW1lKHRpbWVGb3JtYXQsIHRpbWVTdHJpbmcsIHRpbWVTZXR0aW5ncyk7CgoJCQlpZiAocGFyc2VkVGltZSA9PT0gbnVsbCkgewoJCQkJdGhyb3cgJ1dyb25nIHRpbWUgZm9ybWF0JzsKCQkJfQoJCQlyZXR1cm4gewoJCQkJZGF0ZTogZGF0ZSwKCQkJCXRpbWVPYmo6IHBhcnNlZFRpbWUKCQkJfTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gewoJCQkJZGF0ZTogZGF0ZQoJCQl9OwoJCX0KCX07CgoJLyoKCSogSW50ZXJuYWwgZnVuY3Rpb24gdG8gc2V0IHRpbWV6b25lX3NlbGVjdCB0byB0aGUgbG9jYWwgdGltZXpvbmUKCSovCgl2YXIgc2VsZWN0TG9jYWxUaW1lWm9uZSA9IGZ1bmN0aW9uKHRwX2luc3QsIGRhdGUpIHsKCQlpZiAodHBfaW5zdCAmJiB0cF9pbnN0LnRpbWV6b25lX3NlbGVjdCkgewoJCQl0cF9pbnN0Ll9kZWZhdWx0cy51c2VMb2NhbFRpbWV6b25lID0gdHJ1ZTsKCQkJdmFyIG5vdyA9IHR5cGVvZiBkYXRlICE9PSAndW5kZWZpbmVkJyA/IGRhdGUgOiBuZXcgRGF0ZSgpOwoJCQl2YXIgdHpvZmZzZXQgPSAkLnRpbWVwaWNrZXIudGltZVpvbmVPZmZzZXRTdHJpbmcobm93KTsKCQkJaWYgKHRwX2luc3QuX2RlZmF1bHRzLnRpbWV6b25lSXNvODYwMSkgewoJCQkJdHpvZmZzZXQgPSB0em9mZnNldC5zdWJzdHJpbmcoMCwgMykgKyAnOicgKyB0em9mZnNldC5zdWJzdHJpbmcoMyk7CgkJCX0KCQkJdHBfaW5zdC50aW1lem9uZV9zZWxlY3QudmFsKHR6b2Zmc2V0KTsKCQl9Cgl9OwoKCS8qCgkqIENyZWF0ZSBhIFNpbmdsZXRvbiBJbnNhbmNlCgkqLwoJJC50aW1lcGlja2VyID0gbmV3IFRpbWVwaWNrZXIoKTsKCgkvKioKCSAqIEdldCB0aGUgdGltZXpvbmUgb2Zmc2V0IGFzIHN0cmluZyBmcm9tIGEgZGF0ZSBvYmplY3QgKGVnICcrMDUzMCcgZm9yIFVUQys1LjUpCgkgKiBAcGFyYW0gIGRhdGUKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCSQudGltZXBpY2tlci50aW1lWm9uZU9mZnNldFN0cmluZyA9IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgb2ZmID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpICogLTEsCgkJCW1pbnV0ZXMgPSBvZmYgJSA2MCwKCQkJaG91cnMgPSAob2ZmIC0gbWludXRlcykgLyA2MDsKCQlyZXR1cm4gKG9mZiA+PSAwID8gJysnIDogJy0nKSArICgnMCcgKyAoaG91cnMgKiAxMDEpLnRvU3RyaW5nKCkpLnN1YnN0cigtMikgKyAoJzAnICsgKG1pbnV0ZXMgKiAxMDEpLnRvU3RyaW5nKCkpLnN1YnN0cigtMik7Cgl9OwoKCS8qKgoJICogQ2FsbHMgYHRpbWVwaWNrZXIoKWAgb24gdGhlIGBzdGFydFRpbWVgIGFuZCBgZW5kVGltZWAgZWxlbWVudHMsIGFuZCBjb25maWd1cmVzIHRoZW0gdG8KCSAqIGVuZm9yY2UgZGF0ZSByYW5nZSBsaW1pdHMuCgkgKiBuLmIuIFRoZSBpbnB1dCB2YWx1ZSBtdXN0IGJlIGNvcnJlY3RseSBmb3JtYXR0ZWQgKHJlZm9ybWF0dGluZyBpcyBub3Qgc3VwcG9ydGVkKQoJICogQHBhcmFtICBFbGVtZW50IHN0YXJ0VGltZQoJICogQHBhcmFtICBFbGVtZW50IGVuZFRpbWUKCSAqIEBwYXJhbSAgb2JqIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHRpbWVwaWNrZXIoKSBjYWxsCgkgKiBAcmV0dXJuIGpRdWVyeQoJICovCgkkLnRpbWVwaWNrZXIudGltZVJhbmdlID0gZnVuY3Rpb24oc3RhcnRUaW1lLCBlbmRUaW1lLCBvcHRpb25zKSB7CgkJcmV0dXJuICQudGltZXBpY2tlci5oYW5kbGVSYW5nZSgndGltZXBpY2tlcicsIHN0YXJ0VGltZSwgZW5kVGltZSwgb3B0aW9ucyk7Cgl9OwoKCS8qKgoJICogQ2FsbHMgYGRhdGV0aW1lcGlja2VyYCBvbiB0aGUgYHN0YXJ0VGltZWAgYW5kIGBlbmRUaW1lYCBlbGVtZW50cywgYW5kIGNvbmZpZ3VyZXMgdGhlbSB0bwoJICogZW5mb3JjZSBkYXRlIHJhbmdlIGxpbWl0cy4KCSAqIEBwYXJhbSAgRWxlbWVudCBzdGFydFRpbWUKCSAqIEBwYXJhbSAgRWxlbWVudCBlbmRUaW1lCgkgKiBAcGFyYW0gIG9iaiBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBgdGltZXBpY2tlcigpYCBjYWxsLiBBbHNvIHN1cHBvcnRzIGByZWZvcm1hdGAsCgkgKiAgIGEgYm9vbGVhbiB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZm9ybWF0IHRoZSBpbnB1dCB2YWx1ZXMgdG8gdGhlIGBkYXRlRm9ybWF0YC4KCSAqIEBwYXJhbSAgc3RyaW5nIG1ldGhvZCBDYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIHBpY2tlciB0byBiZSBhZGRlZAoJICogQHJldHVybiBqUXVlcnkKCSAqLwoJJC50aW1lcGlja2VyLmRhdGVUaW1lUmFuZ2UgPSBmdW5jdGlvbihzdGFydFRpbWUsIGVuZFRpbWUsIG9wdGlvbnMpIHsKCQkkLnRpbWVwaWNrZXIuZGF0ZVJhbmdlKHN0YXJ0VGltZSwgZW5kVGltZSwgb3B0aW9ucywgJ2RhdGV0aW1lcGlja2VyJyk7Cgl9OwoKCS8qKgoJICogQ2FsbHMgYG1ldGhvZGAgb24gdGhlIGBzdGFydFRpbWVgIGFuZCBgZW5kVGltZWAgZWxlbWVudHMsIGFuZCBjb25maWd1cmVzIHRoZW0gdG8KCSAqIGVuZm9yY2UgZGF0ZSByYW5nZSBsaW1pdHMuCgkgKiBAcGFyYW0gIEVsZW1lbnQgc3RhcnRUaW1lCgkgKiBAcGFyYW0gIEVsZW1lbnQgZW5kVGltZQoJICogQHBhcmFtICBvYmogb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgYHRpbWVwaWNrZXIoKWAgY2FsbC4gQWxzbyBzdXBwb3J0cyBgcmVmb3JtYXRgLAoJICogICBhIGJvb2xlYW4gdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB0byByZWZvcm1hdCB0aGUgaW5wdXQgdmFsdWVzIHRvIHRoZSBgZGF0ZUZvcm1hdGAuCgkgKiBAcGFyYW0gIHN0cmluZyBtZXRob2QgQ2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBwaWNrZXIgdG8gYmUgYWRkZWQKCSAqIEByZXR1cm4galF1ZXJ5CgkgKi8KCSQudGltZXBpY2tlci5kYXRlUmFuZ2UgPSBmdW5jdGlvbihzdGFydFRpbWUsIGVuZFRpbWUsIG9wdGlvbnMsIG1ldGhvZCkgewoJCW1ldGhvZCA9IG1ldGhvZCB8fCAnZGF0ZXBpY2tlcic7CgkJJC50aW1lcGlja2VyLmhhbmRsZVJhbmdlKG1ldGhvZCwgc3RhcnRUaW1lLCBlbmRUaW1lLCBvcHRpb25zKTsKCX07CgoJLyoqCgkgKiBDYWxscyBgbWV0aG9kYCBvbiB0aGUgYHN0YXJ0VGltZWAgYW5kIGBlbmRUaW1lYCBlbGVtZW50cywgYW5kIGNvbmZpZ3VyZXMgdGhlbSB0bwoJICogZW5mb3JjZSBkYXRlIHJhbmdlIGxpbWl0cy4KCSAqIEBwYXJhbSAgc3RyaW5nIG1ldGhvZCBDYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIHBpY2tlciB0byBiZSBhZGRlZAoJICogQHBhcmFtICBFbGVtZW50IHN0YXJ0VGltZQoJICogQHBhcmFtICBFbGVtZW50IGVuZFRpbWUKCSAqIEBwYXJhbSAgb2JqIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGB0aW1lcGlja2VyKClgIGNhbGwuIEFsc28gc3VwcG9ydHMgYHJlZm9ybWF0YCwKCSAqICAgYSBib29sZWFuIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmb3JtYXQgdGhlIGlucHV0IHZhbHVlcyB0byB0aGUgYGRhdGVGb3JtYXRgLgoJICogQHJldHVybiBqUXVlcnkKCSAqLwoJJC50aW1lcGlja2VyLmhhbmRsZVJhbmdlID0gZnVuY3Rpb24obWV0aG9kLCBzdGFydFRpbWUsIGVuZFRpbWUsIG9wdGlvbnMpIHsKCQkkLmZuW21ldGhvZF0uY2FsbChzdGFydFRpbWUsICQuZXh0ZW5kKHsKCQkJb25DbG9zZTogZnVuY3Rpb24oZGF0ZVRleHQsIGluc3QpIHsKCQkJCWNoZWNrRGF0ZXModGhpcywgZW5kVGltZSwgZGF0ZVRleHQpOwoJCQl9LAoJCQlvblNlbGVjdDogZnVuY3Rpb24oc2VsZWN0ZWREYXRlVGltZSkgewoJCQkJc2VsZWN0ZWQodGhpcywgZW5kVGltZSwgJ21pbkRhdGUnKTsKCQkJfQoJCX0sIG9wdGlvbnMsIG9wdGlvbnMuc3RhcnQpKTsKCQkkLmZuW21ldGhvZF0uY2FsbChlbmRUaW1lLCAkLmV4dGVuZCh7CgkJCW9uQ2xvc2U6IGZ1bmN0aW9uKGRhdGVUZXh0LCBpbnN0KSB7CgkJCQljaGVja0RhdGVzKHRoaXMsIHN0YXJ0VGltZSwgZGF0ZVRleHQpOwoJCQl9LAoJCQlvblNlbGVjdDogZnVuY3Rpb24oc2VsZWN0ZWREYXRlVGltZSkgewoJCQkJc2VsZWN0ZWQodGhpcywgc3RhcnRUaW1lLCAnbWF4RGF0ZScpOwoJCQl9CgkJfSwgb3B0aW9ucywgb3B0aW9ucy5lbmQpKTsKCQkvLyB0aW1lcGlja2VyIGRvZXNuJ3QgcHJvdmlkZSBhY2Nlc3MgdG8gaXRzICd0aW1lRm9ybWF0JyBvcHRpb24sIAoJCS8vIG5vciBjb3VsZCBJIGdldCBkYXRlcGlja2VyLmZvcm1hdFRpbWUoKSB0byBiZWhhdmUgd2l0aCB0aW1lcywgc28gSQoJCS8vIGhhdmUgZGlzYWJsZWQgcmVmb3JtYXR0aW5nIGZvciB0aW1lcGlja2VyCgkJaWYgKG1ldGhvZCAhPSAndGltZXBpY2tlcicgJiYgb3B0aW9ucy5yZWZvcm1hdCkgewoJCQkkKFtzdGFydFRpbWUsIGVuZFRpbWVdKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGZvcm1hdCA9ICQodGhpcylbbWV0aG9kXS5jYWxsKCQodGhpcyksICdvcHRpb24nLCAnZGF0ZUZvcm1hdCcpLAoJCQkJCWRhdGUgPSBuZXcgRGF0ZSgkKHRoaXMpLnZhbCgpKTsKCQkJCWlmICgkKHRoaXMpLnZhbCgpICYmIGRhdGUpIHsKCQkJCQkkKHRoaXMpLnZhbCgkLmRhdGVwaWNrZXIuZm9ybWF0RGF0ZShmb3JtYXQsIGRhdGUpKTsKCQkJCX0KCQkJfSk7CgkJfQoJCWNoZWNrRGF0ZXMoc3RhcnRUaW1lLCBlbmRUaW1lLCBzdGFydFRpbWUudmFsKCkpOwoKCQlmdW5jdGlvbiBjaGVja0RhdGVzKGNoYW5nZWQsIG90aGVyLCBkYXRlVGV4dCkgewoJCQlpZiAob3RoZXIudmFsKCkgJiYgKG5ldyBEYXRlKHN0YXJ0VGltZS52YWwoKSkgPiBuZXcgRGF0ZShlbmRUaW1lLnZhbCgpKSkpIHsKCQkJCW90aGVyLnZhbChkYXRlVGV4dCk7CgkJCX0KCQl9CgkJc2VsZWN0ZWQoc3RhcnRUaW1lLCBlbmRUaW1lLCAnbWluRGF0ZScpOwoJCXNlbGVjdGVkKGVuZFRpbWUsIHN0YXJ0VGltZSwgJ21heERhdGUnKTsKCgkJZnVuY3Rpb24gc2VsZWN0ZWQoY2hhbmdlZCwgb3RoZXIsIG9wdGlvbikgewoJCQlpZiAoISQoY2hhbmdlZCkudmFsKCkpIHsKCQkJCXJldHVybjsKCQkJfQoJCQl2YXIgZGF0ZSA9ICQoY2hhbmdlZClbbWV0aG9kXS5jYWxsKCQoY2hhbmdlZCksICdnZXREYXRlJyk7CgkJCS8vIHRpbWVwaWNrZXIgZG9lc24ndCBpbXBsZW1lbnQgJ2dldERhdGUnIGFuZCByZXR1cm5zIGEgalF1ZXJ5CgkJCWlmIChkYXRlLmdldFRpbWUpIHsKCQkJCSQob3RoZXIpW21ldGhvZF0uY2FsbCgkKG90aGVyKSwgJ29wdGlvbicsIG9wdGlvbiwgZGF0ZSk7CgkJCX0KCQl9CgkJcmV0dXJuICQoW3N0YXJ0VGltZS5nZXQoMCksIGVuZFRpbWUuZ2V0KDApXSk7Cgl9OwoKCS8qCgkqIEtlZXAgdXAgd2l0aCB0aGUgdmVyc2lvbgoJKi8KCSQudGltZXBpY2tlci52ZXJzaW9uID0gIjEuMS4xIjsKCn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/lib/js/mColorPicker.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/LyoNCiAgbUNvbG9yUGlja2VyDQogIFZlcnNpb246IDEuMCByMzkNCiAgDQogIENvcHlyaWdodCAoYykgMjAxMCBNZXRhMTAwIExMQy4NCiAgaHR0cDovL3d3dy5tZXRhMTAwLmNvbS8NCiAgDQogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSANCiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAgDQoqLw0KDQooZnVuY3Rpb24oJCl7dmFyIGIsZixoLGwsaj0kKGRvY3VtZW50KSxpPSQoIjxkaXY+Iiksaz0kKCI8ZGl2PiIpLG49JCgiPGRpdj4iKSxvPSQoIjxpbnB1dD4iKSxwPS9ecmdiW2FdP1woKFxkKyksXHMqKFxkKyksXHMqKFxkKykoLFxzKihcZCtcLlxkKykqKT9cKS8scT0vKFthLWYwLTldKShbYS1mMC05XSkoW2EtZjAtOV0pLyxyPS8jW2EtZjAtOV17M30vLHM9LyNbYS1mMC05XXs2fS87JC5mbi5tQ29sb3JQaWNrZXI9ZnVuY3Rpb24oYSl7dmFyIGM9JC5mbi5tQ29sb3JQaWNrZXIuZ2V0Q29va2llKCJzd2F0Y2hlcyIpO2I9JC5leHRlbmQoJC5mbi5tQ29sb3JQaWNrZXIuZGVmYXVsdHMsYSk7JC5mbi5tQ29sb3JQaWNrZXIuZGVmYXVsdHMuc3dhdGNoZXMuY29uY2F0KGIuc3dhdGNoZXMpLnNsaWNlKC0xMCk7Zi5lbmhhbmNlZFN3YXRjaGVzJiZjJiYoYi5zd2F0Y2hlcz1jLnNwbGl0KCJ8fCIpLmNvbmNhdChiLnN3YXRjaGVzKS5zbGljZSgwLDEwKXx8Yi5zd2F0Y2hlcyk7JCgiZGl2I21Db2xvclBpY2tlciIpLmxlbmd0aHx8JC5mbi5tQ29sb3JQaWNrZXIuZHJhd1BpY2tlcigpOyQoIiNjc3NfZGlzYWJsZWRfY29sb3JfcGlja2VyIikubGVuZ3RofHwkKCJoZWFkIikucHJlcGVuZCgnPG1ldGEgZGF0YS1yZW1vdmUtbWU9InRydWUiLz48c3R5bGUgaWQ9ImNzc19kaXNhYmxlZF9jb2xvcl9waWNrZXIiIHR5cGU9InRleHQvY3NzIj4ubUNvbG9yUGlja2VyW2Rpc2FibGVkXSArIHNwYW4sIC5tQ29sb3JQaWNrZXJbZGlzYWJsZWQ9ImRpc2FibGVkIl0gKyBzcGFuLCAubUNvbG9yUGlja2VyW2Rpc2FibGVkPSJ0cnVlIl0gKyBzcGFuIHtmaWx0ZXI6YWxwaGEob3BhY2l0eT01MCk7LW1vei1vcGFjaXR5OjAuNTstd2Via2l0LW9wYWNpdHk6MC41Oy1raHRtbC1vcGFjaXR5OiAwLjU7b3BhY2l0eTogMC41O2N1cnNvcjpkZWZhdWx0O308L3N0eWxlPicpOyQoIm1ldGFbZGF0YS1yZW1vdmUtbWU9dHJ1ZV0iKS5yZW1vdmUoKTt0aGlzLmVhY2goJC5mbi5tQ29sb3JQaWNrZXIuZHJhd1BpY2tlclRyaWdnZXJzKTtyZXR1cm4gdGhpc307JC5mbi5tQ29sb3JQaWNrZXIuaW5pdD17cmVwbGFjZToiW3R5cGU9Y29sb3JdIixpbmRleDowLGVuaGFuY2VkU3dhdGNoZXM6ITAsYWxsb3dUcmFuc3BhcmVuY3k6ITAsc2xvZ2FuOiJNZXRhMTAwIC0gRGVzaWduaW5nIEZ1biIsc2hvd0xvZ286ITB9OyQuZm4ubUNvbG9yUGlja2VyLmRlZmF1bHRzPXtjdXJyZW50SWQ6ITEsY3VycmVudElucHV0OiExLGN1cnJlbnRDb2xvcjohMSxjaGFuZ2VDb2xvcjohMSxjb2xvcjohMSxpbWFnZUZvbGRlcjoiaW1hZ2VzLyIsc3dhdGNoZXM6IiNmZmZmZmYsI2ZmZmYwMCwjMDBmZjAwLCMwMGZmZmYsIzAwMDBmZiwjZmYwMGZmLCNmZjAwMDAsIzRjMmIxMSwjM2IzYjNiLCMwMDAwMDAiLnNwbGl0KCIsIil9OyQuZm4ubUNvbG9yUGlja2VyLnN0YXJ0PWZ1bmN0aW9uKCl7JCgnaW5wdXRbZGF0YS1tY29sb3JwaWNrZXIhPSJ0cnVlIl0nKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4iW3R5cGU9Y29sb3JdIj09Zi5yZXBsYWNlPyJjb2xvciI9PXRoaXMuZ2V0QXR0cmlidXRlKCJ0eXBlIik6JCh0aGlzKS5pcyhmLnJlcGxhY2UpfSkubUNvbG9yUGlja2VyKCl9OyQuZm4ubUNvbG9yUGlja2VyLmV2ZW50cz1mdW5jdGlvbigpeyQoIiNtQ29sb3JQaWNrZXJCZyIpLmxpdmUoImNsaWNrIiwkLmZuLm1Db2xvclBpY2tlci5jbG9zZVBpY2tlcik7JCgiLm1Db2xvclBpY2tlciIpLmxpdmUoImtleXVwIixmdW5jdGlvbigpe3RyeXskKHRoaXMpLmNzcyh7ImJhY2tncm91bmQtY29sb3IiOiQodGhpcykudmFsKCl9KS5jc3Moe2NvbG9yOiQuZm4ubUNvbG9yUGlja2VyLnRleHRDb2xvcigkKHRoaXMpLmNzcygiYmFja2dyb3VuZC1jb2xvciIpKX0pLnRyaWdnZXIoImNoYW5nZSIpfWNhdGNoKGEpe319KTskKCIubUNvbG9yUGlja2VyVHJpZ2dlciIpLmxpdmUoImNsaWNrIiwkLmZuLm1Db2xvclBpY2tlci5jb2xvclNob3cpOyQoIi5tQ29sb3IsIC5tUGFzdENvbG9yIikubGl2ZSgibW91c2Vtb3ZlIixmdW5jdGlvbihhKXtpZighYi5jaGFuZ2VDb2xvcilyZXR1cm4hMTt2YXIgYz0kKHRoaXMpLGc9Yy5vZmZzZXQoKSxkPWIuY3VycmVudElucHV0LGQ9ZC5hdHRyKCJkYXRhLWhleCIpfHxkLmF0dHIoImhleCIpO2IuY29sb3I9Yy5jc3MoImJhY2tncm91bmQtY29sb3IiKTtjLmhhc0NsYXNzKCJtUGFzdENvbG9yIik/Yi5jb2xvcj0kLmZuLm1Db2xvclBpY2tlci5zZXRDb2xvcihiLmNvbG9yLGQpOmMuaGFzQ2xhc3MoIm1Db2xvclRyYW5zcGFyZW50Iik/Yi5jb2xvcj0idHJhbnNwYXJlbnQiOmMuaGFzQ2xhc3MoIm1QYXN0Q29sb3IiKXx8KGIuY29sb3I9JC5mbi5tQ29sb3JQaWNrZXIud2hpY2hDb2xvcihhLnBhZ2VYLWcubGVmdCxhLnBhZ2VZLWcudG9wLGQpKTtiLmN1cnJlbnRJbnB1dC5tU2V0SW5wdXRDb2xvcihiLmNvbG9yKX0pLmxpdmUoImNsaWNrIiwkLmZuLm1Db2xvclBpY2tlci5jb2xvclBpY2tlZCk7JCgiI21Db2xvclBpY2tlcklucHV0IikubGl2ZSgia2V5dXAiLGZ1bmN0aW9uKGEpe3RyeXtiLmNvbG9yPSQodGhpcykudmFsKCksYi5jdXJyZW50SW5wdXQubVNldElucHV0Q29sb3IoYi5jb2xvciksMTM9PWEud2hpY2gmJiQuZm4ubUNvbG9yUGlja2VyLmNvbG9yUGlja2VkKCl9Y2F0Y2goYyl7fX0pLmxpdmUoImJsdXIiLGZ1bmN0aW9uKCl7Yi5jdXJyZW50SW5wdXQubVNldElucHV0Q29sb3IoYi5jb2xvcil9KTskKCIjbUNvbG9yUGlja2VyV3JhcHBlciIpLmxpdmUoIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7aWYoIWIuY2hhbmdlQ29sb3IpcmV0dXJuITE7dmFyIGE9Yi5jdXJyZW50SW5wdXQ7Yi5jdXJyZW50SW5wdXQubVNldElucHV0Q29sb3IoJC5mbi5tQ29sb3JQaWNrZXIuc2V0Q29sb3IoYi5jdXJyZW50Q29sb3IsYS5hdHRyKCJkYXRhLWhleCIpfHxhLmF0dHIoImhleCIpKSl9KX07JC5mbi5tQ29sb3JQaWNrZXIuZHJhd1BpY2tlclRyaWdnZXJzPWZ1bmN0aW9uKCl7dmFyIGE9JCh0aGlzKSxjPWEuYXR0cigiaWQiKXx8ImNvbG9yXyIrZi5pbmRleCsrLGc9ImhpZGRlbiI9PWEuYXR0cigidGV4dCIpfHwiaGlkZGVuIj09YS5hdHRyKCJkYXRhLXRleHQiKT8hMDohMSxkPSQuZm4ubUNvbG9yUGlja2VyLnNldENvbG9yKGEudmFsKCksYS5hdHRyKCJkYXRhLWhleCIpfHxhLmF0dHIoImhleCIpKSxlPWEud2lkdGgoKSxoPWEuaGVpZ2h0KCksaT1hLmNzcygiZmxvYXQiKSxqPSQoIjxzcGFuPiIpLG09JCgiPHNwYW4+Iiksaz0iIjtqLmF0dHIoe2lkOiJjb2xvcl93b3JrX2FyZWEiLCJjbGFzcyI6Im1Db2xvclBpY2tlcklucHV0In0pLmFwcGVuZFRvKGwpO20uYXR0cih7aWQ6Im1jcF8iK2MsImNsYXNzIjoibUNvbG9yUGlja2VyVHJpZ2dlciJ9KS5jc3Moe2Rpc3BsYXk6ImlubGluZS1ibG9jayIsY3Vyc29yOiJwb2ludGVyIn0pLmluc2VydEFmdGVyKGEpOyQoIjxpbWc+IikuYXR0cih7c3JjOmIuaW1hZ2VGb2xkZXIrImNvbG9yLnBuZyJ9KS5jc3Moe2JvcmRlcjowLG1hcmdpbjoiMCAwIDAgM3B4IiwidmVydGljYWwtYWxpZ24iOiJ0ZXh0LWJvdHRvbSJ9KS5hcHBlbmRUbyhtKTtqLmFwcGVuZChhKTtrPWouaHRtbCgpLnJlcGxhY2UoL3R5cGU9W15hLXogXSpjb2xvclteYS16IC8vPl0qL2dpLCd0eXBlPSInKyhnPyJoaWRkZW4iOiJ0ZXh0IikrJyInKTtqLmh0bWwoIiIpLnJlbW92ZSgpO2E9JChrKS5hdHRyKCJpZCIsYykuYWRkQ2xhc3MoIm1Db2xvclBpY2tlciIpLnZhbChkKS5pbnNlcnRCZWZvcmUobSk7ZyYmbS5jc3Moe2JvcmRlcjoiMXB4IHNvbGlkIGJsYWNrIiwiZmxvYXQiOmksd2lkdGg6ZSxoZWlnaHQ6aH0pLmFkZENsYXNzKGEuYXR0cigiY2xhc3MiKSkuaHRtbCgiJm5ic3A7Iik7YS5tU2V0SW5wdXRDb2xvcihkKTtyZXR1cm4gYX07JC5mbi5tQ29sb3JQaWNrZXIuZHJhd1BpY2tlcj1mdW5jdGlvbigpe3ZhciBhPSQoIjxkaXY+IiksYz0kKCI8YT4iKSxnPSQoIjxkaXY+IiksZD0kKCI8ZGl2PiIpO2suYXR0cih7aWQ6Im1Db2xvclBpY2tlckJnIn0pLmNzcyh7ZGlzcGxheToibm9uZSIsYmFja2dyb3VuZDoiYmxhY2siLG9wYWNpdHk6MC4wMSxwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowfSkuYXBwZW5kVG8obCk7aS5hdHRyKHtpZDoibUNvbG9yUGlja2VyIiwiZGF0YS1tY29sb3JwaWNrZXIiOiEwfSkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGJvcmRlcjoiMXB4IHNvbGlkICNjY2MiLGNvbG9yOiIjZmZmIix3aWR0aDoiMTk0cHgiLGhlaWdodDoiMTg0cHgiLCJmb250LXNpemUiOiIxMnB4IiwiZm9udC1mYW1pbHkiOiJ0aW1lcyIsZGlzcGxheToibm9uZSJ9KS5hcHBlbmRUbyhsKTtuLmF0dHIoe2lkOiJtQ29sb3JQaWNrZXJUZXN0In0pLmNzcyh7ZGlzcGxheToibm9uZSJ9KS5hcHBlbmRUbyhsKTtkLmF0dHIoe2lkOiJtQ29sb3JQaWNrZXJXcmFwcGVyIn0pLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIixib3JkZXI6InNvbGlkIDFweCBncmF5In0pLmFwcGVuZFRvKGkpOyQoIjxkaXY+IikuYXR0cih7aWQ6Im1Db2xvclBpY2tlckltZyIsImNsYXNzIjoibUNvbG9yIn0pLmNzcyh7aGVpZ2h0OiIxMzZweCIsd2lkdGg6IjE5MnB4Iixib3JkZXI6MCxjdXJzb3I6ImNyb3NzaGFpciIsImJhY2tncm91bmQtaW1hZ2UiOiJ1cmwoIitiLmltYWdlRm9sZGVyKyJwaWNrZXIucG5nKSJ9KS5hcHBlbmRUbyhkKTthLmF0dHIoe2lkOiJtQ29sb3JQaWNrZXJTd2F0Y2hlcyJ9KS5jc3MoeyJib3JkZXItcmlnaHQiOiIxcHggc29saWQgIzAwMCJ9KS5hcHBlbmRUbyhkKTskKCI8ZGl2PiIpLmFkZENsYXNzKCJtQ2xlYXIiKS5jc3Moe2NsZWFyOiJib3RoIn0pLmFwcGVuZFRvKGEpO2ZvcihoPTk7LTE8aDtoLS0pJCgiPGRpdj4iKS5hdHRyKHtpZDoiY2VsbCIraCwiY2xhc3MiOiJtUGFzdENvbG9yIisoMDxoPyIgbU5vTGVmdEJvcmRlciI6IiIpfSkuY3NzKHsiYmFja2dyb3VuZC1jb2xvciI6Yi5zd2F0Y2hlc1toXS50b0xvd2VyQ2FzZSgpLGhlaWdodDoiMThweCIsd2lkdGg6IjE4cHgiLGJvcmRlcjoiMXB4IHNvbGlkICMwMDAiLCJmbG9hdCI6ImxlZnQifSkuaHRtbCgiJm5ic3A7IikucHJlcGVuZFRvKGEpO2cuYXR0cih7aWQ6Im1Db2xvclBpY2tlckZvb3RlciJ9KS5jc3MoeyJiYWNrZ3JvdW5kLWltYWdlIjoidXJsKCIrYi5pbWFnZUZvbGRlcisiZ3JpZC5naWYpIixwb3NpdGlvbjoicmVsYXRpdmUiLGhlaWdodDoiMjZweCJ9KS5hcHBlbmRUbyhkKTtvLmF0dHIoe2lkOiJtQ29sb3JQaWNrZXJJbnB1dCIsdHlwZToidGV4dCJ9KS5jc3Moe2JvcmRlcjoic29saWQgMXB4IGdyYXkiLCJmb250LXNpemUiOiIxMHB0IixtYXJnaW46IjNweCIsd2lkdGg6IjgwcHgifSkuYXBwZW5kVG8oZyk7Zi5hbGxvd1RyYW5zcGFyZW5jeSYmJCgiPHNwYW4+IikuYXR0cih7aWQ6Im1Db2xvclBpY2tlclRyYW5zcGFyZW50IiwiY2xhc3MiOiJtQ29sb3IgbUNvbG9yVHJhbnNwYXJlbnQifSkuY3NzKHsiZm9udC1zaXplIjoiMTZweCIsY29sb3I6IiMwMDAiLCJwYWRkaW5nLXJpZ2h0IjoiMzBweCIsInBhZGRpbmctdG9wIjoiM3B4IixjdXJzb3I6InBvaW50ZXIiLG92ZXJmbG93OiJoaWRkZW4iLCJmbG9hdCI6InJpZ2h0In0pLnRleHQoInRyYW5zcGFyZW50IikuYXBwZW5kVG8oZyk7Zi5zaG93TG9nbyYmYy5hdHRyKHtocmVmOiJodHRwOi8vbWV0YTEwMC5jb20vIix0aXRsZTpmLnNsb2dhbixhbHQ6Zi5zbG9nYW4sdGFyZ2V0OiJfYmxhbmsifSkuY3NzKHsiZmxvYXQiOiJyaWdodCJ9KS5hcHBlbmRUbyhnKTskKCI8aW1nPiIpLmF0dHIoe3NyYzpiLmltYWdlRm9sZGVyKyJtZXRhMTAwLnBuZyIsdGl0bGU6Zi5zbG9nYW4sYWx0OmYuc2xvZ2FufSkuY3NzKHtib3JkZXI6MCwiYm9yZGVyLWxlZnQiOiIxcHggc29saWQgI2FhYSIscmlnaHQ6MCxwb3NpdGlvbjoiYWJzb2x1dGUifSkuYXBwZW5kVG8oYyk7JCgiLm1Ob0xlZnRCb3JkZXIiKS5jc3MoeyJib3JkZXItbGVmdCI6MH0pfTskLmZuLm1Db2xvclBpY2tlci5jbG9zZVBpY2tlcj1mdW5jdGlvbigpe2suaGlkZSgpO2kuZmFkZU91dCgpfTskLmZuLm1Db2xvclBpY2tlci5jb2xvclNob3c9ZnVuY3Rpb24oKXt2YXIgYT0kKHRoaXMpLGM9YS5hdHRyKCJpZCIpLnJlcGxhY2UoIm1jcF8iLCIiKSxnPWEub2Zmc2V0KCksZD0kKCIjIitjKSxlPWcudG9wK2Eub3V0ZXJIZWlnaHQoKSxmPWcubGVmdDtpZihkLmF0dHIoImRpc2FibGVkIikpcmV0dXJuITE7Yi5jdXJyZW50Q29sb3I9ZC5jc3MoImJhY2tncm91bmQtY29sb3IiKTtiLmNoYW5nZUNvbG9yPSEwO2IuY3VycmVudElucHV0PWQ7Yi5jdXJyZW50SWQ9YztlK2kuaGVpZ2h0KCk+ai5oZWlnaHQoKSYmKGU9Zy50b3AtaS5oZWlnaHQoKSk7ZitpLndpZHRoKCk+ai53aWR0aCgpJiYoZj1nLmxlZnQtaS53aWR0aCgpK2Eub3V0ZXJXaWR0aCgpKTtpLmNzcyh7dG9wOmUrInB4IixsZWZ0OmYrInB4In0pLmZhZGVJbigiZmFzdCIpO2suc2hvdygpO2IuY29sb3I9JCgiIyIrYykuYXR0cigiZGF0YS10ZXh0Iik/YS5jc3MoImJhY2tncm91bmQtY29sb3IiKTpkLmNzcygiYmFja2dyb3VuZC1jb2xvciIpO2IuY29sb3I9JC5mbi5tQ29sb3JQaWNrZXIuc2V0Q29sb3IoYi5jb2xvcixkLmF0dHIoImRhdGEtaGV4Iil8fGQuYXR0cigiaGV4IikpO28udmFsKGIuY29sb3IpfTskLmZuLm1Db2xvclBpY2tlci5zZXRJbnB1dENvbG9yPWZ1bmN0aW9uKGEsYyl7JCgiIyIrYSkubVNldElucHV0Q29sb3IoYyl9OyQuZm4ubVNldElucHV0Q29sb3I9ZnVuY3Rpb24oYSl7dmFyIGM9JCh0aGlzKSxnPXsiYmFja2dyb3VuZC1jb2xvciI6YSwiYmFja2dyb3VuZC1pbWFnZSI6InRyYW5zcGFyZW50Ij09YT8idXJsKCciK2IuaW1hZ2VGb2xkZXIrImdyaWQuZ2lmJykiOiIiLGNvbG9yOiQuZm4ubUNvbG9yUGlja2VyLnRleHRDb2xvcihhKX07KGMuYXR0cigiZGF0YS10ZXh0Iil8fGMuYXR0cigidGV4dCIpKSYmYy5uZXh0KCkuY3NzKGcpO2MudmFsKGEpLmNzcyhnKS50cmlnZ2VyKCJjaGFuZ2UiKTtvLnZhbChhKX07JC5mbi5tQ29sb3JQaWNrZXIudGV4dENvbG9yPWZ1bmN0aW9uKGEpe2E9JC5mbi5tQ29sb3JQaWNrZXIuUkdCdG9IZXgoYSk7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBhfHwidHJhbnNwYXJlbnQiPT1hPyJibGFjayI6NDAwPnBhcnNlSW50KGEuc3Vic3RyKDEsMiksMTYpK3BhcnNlSW50KGEuc3Vic3RyKDMsMiksMTYpK3BhcnNlSW50KGEuc3Vic3RyKDUsMiksMTYpPyJ3aGl0ZSI6ImJsYWNrIn07JC5mbi5tQ29sb3JQaWNrZXIuc2V0Q29va2llPWZ1bmN0aW9uKGEsYyxiKXthPWErIj0iK2VzY2FwZShjKTtjPW5ldyBEYXRlO2Muc2V0RGF0ZShjLmdldERhdGUoKStiKTthKz0iOyBleHBpcmVzPSIrYy50b0dNVFN0cmluZygpO2RvY3VtZW50LmNvb2tpZT1hfTskLmZuLm1Db2xvclBpY2tlci5nZXRDb29raWU9ZnVuY3Rpb24oYSl7cmV0dXJuKGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKCIoXnw7KSA/IithKyI9KFteO10qKSg7fCQpIikpP3VuZXNjYXBlKGFbMl0pOm51bGx9OyQuZm4ubUNvbG9yUGlja2VyLmNvbG9yUGlja2VkPWZ1bmN0aW9uKCl7Yi5jaGFuZ2VDb2xvcj0hMTskLmZuLm1Db2xvclBpY2tlci5jbG9zZVBpY2tlcigpOyQuZm4ubUNvbG9yUGlja2VyLmFkZFRvU3dhdGNoKCk7Yi5jdXJyZW50SW5wdXQudHJpZ2dlcigiY29sb3JwaWNrZWQiKX07JC5mbi5tQ29sb3JQaWNrZXIuYWRkVG9Td2F0Y2g9ZnVuY3Rpb24oYSl7aWYoIWYuZW5oYW5jZWRTd2F0Y2hlcylyZXR1cm4hMTt2YXIgYz1bXTtoPTA7InN0cmluZyI9PXR5cGVvZiBhJiYoYi5jb2xvcj1hKTsidHJhbnNwYXJlbnQiIT1iLmNvbG9yJiYoY1swXT0kLmZuLm1Db2xvclBpY2tlci5oZXhUb1JHQihiLmNvbG9yKSk7JCgiLm1QYXN0Q29sb3IiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGE9JCh0aGlzKTtiLmNvbG9yPSQuZm4ubUNvbG9yUGlja2VyLmhleFRvUkdCKGEuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIikpO2lmKGIuY29sb3IhPWNbMF0mJmMubGVuZ3RoPDEwKWNbYy5sZW5ndGhdPWIuY29sb3I7YS5jc3MoImJhY2tncm91bmQtY29sb3IiLGNbaCsrXSl9KTtmLmVuaGFuY2VkU3dhdGNoZXMmJiQuZm4ubUNvbG9yUGlja2VyLnNldENvb2tpZSgic3dhdGNoZXMiLGMuam9pbigifHwiKSwzNjUpfTskLmZuLm1Db2xvclBpY2tlci53aGljaENvbG9yPWZ1bmN0aW9uKGEsYyxiKXt2YXIgZD1bMjU1LDI1NSwyNTVdOzMyPmE/KGRbMV09OCphLGRbMl09MCk6NjQ+YT8oZFswXT0yNTYtOCooYS0zMiksZFsyXT0wKTo5Nj5hPyhkWzBdPTAsZFsyXT04KihhLTY0KSk6MTI4PmE/KGRbMF09MCxkWzFdPTI1Ni04KihhLTk2KSk6MTYwPmE/KGRbMF09OCooYS0xMjgpLGRbMV09MCk6KGRbMV09MCxkWzJdPTI1Ni04KihhLTE2MCkpO2Zvcih2YXIgZT0wOzM+ZTtlKyspNjQ+Yz9kW2VdKz0oMjU2LWRbZV0pKig2NC1jKS82NDoxMjg+PWM/ZFtlXS09ZFtlXSooYy02NCkvNjQ6MTI4PGMmJihkW2VdPTI1Ni0yNTYqKGEvMTkyKSksZFtlXT1NYXRoLnJvdW5kKE1hdGgubWluKGRbZV0sMjU1KSksInRydWUiPT1iJiYoZFtlXT0kLmZuLm1Db2xvclBpY2tlci5kZWNUb0hleChkW2VdKSk7cmV0dXJuInRydWUiPT1iPyIjIitkLmpvaW4oIiIpOiJyZ2IoIitkLmpvaW4oIiwgIikrIikifTskLmZuLm1Db2xvclBpY2tlci5zZXRDb2xvcj1mdW5jdGlvbihhLGMpe3JldHVybiJ0cnVlIj09Yz8kLmZuLm1Db2xvclBpY2tlci5SR0J0b0hleChhKTokLmZuLm1Db2xvclBpY2tlci5oZXhUb1JHQihhKX07JC5mbi5tQ29sb3JQaWNrZXIuY29sb3JUZXN0PWZ1bmN0aW9uKGEpe24uY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIixhKTtyZXR1cm4gbi5jc3MoImJhY2tncm91bmQtY29sb3IiKX07JC5mbi5tQ29sb3JQaWNrZXIuZGVjVG9IZXg9ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtyZXR1cm4iIisiMDEyMzQ1Njc4OUFCQ0RFRiIuY2hhckF0KE1hdGguZmxvb3IoYS8xNikpKygiIisiMDEyMzQ1Njc4OUFCQ0RFRiIuY2hhckF0KGEtMTYqTWF0aC5mbG9vcihhLzE2KSkpfTskLmZuLm1Db2xvclBpY2tlci5SR0J0b0hleD1mdW5jdGlvbihhKXt2YXIgYz0iIyIsYixhPWE/YS50b0xvd2VyQ2FzZSgpOiExO2lmKCFhKXJldHVybiIiO2lmKHMudGVzdChhKSlyZXR1cm4gYS5zdWJzdHIoMCw3KTtpZihyLnRlc3QoYSkpcmV0dXJuIGEucmVwbGFjZShxLCIkMSQxJDIkMiQzJDMiKS5zdWJzdHIoMCw3KTtpZihiPWEubWF0Y2gocCkpe2ZvcihhPTE7ND5hO2ErKyljKz0kLmZuLm1Db2xvclBpY2tlci5kZWNUb0hleChiW2FdKTtyZXR1cm4gY31yZXR1cm4gJC5mbi5tQ29sb3JQaWNrZXIuY29sb3JUZXN0KGEpfTskLmZuLm1Db2xvclBpY2tlci5oZXhUb1JHQj1mdW5jdGlvbihhKXthPWE/YS50b0xvd2VyQ2FzZSgpOiExO3JldHVybiFhPyIiOnAudGVzdChhKT9hOnIudGVzdChhKT8ocy50ZXN0KGEpfHwoYT1hLnJlcGxhY2UocSwiJDEkMSQyJDIkMyQzIikpLCJyZ2IoIitwYXJzZUludChhLnN1YnN0cigxLDIpLDE2KSsiLCAiK3BhcnNlSW50KGEuc3Vic3RyKDMsMiksMTYpKyIsICIrcGFyc2VJbnQoYS5zdWJzdHIoNSwyKSwxNikrIikiKTokLmZuLm1Db2xvclBpY2tlci5jb2xvclRlc3QoYSl9O2Y9JC5mbi5tQ29sb3JQaWNrZXIuaW5pdDtqLnJlYWR5KGZ1bmN0aW9uKCl7bD0kKCJib2R5Iik7JC5mbi5tQ29sb3JQaWNrZXIuZXZlbnRzKCk7Zi5yZXBsYWNlJiYoImZ1bmN0aW9uIj09dHlwZW9mICQuZm4ubURPTXVwZGF0ZT8kKCJpbnB1dCIpLm1ET011cGRhdGUoJC5mbi5tQ29sb3JQaWNrZXIuc3RhcnQpOiJmdW5jdGlvbiI9PXR5cGVvZiAkLmZuLmxpdmVxdWVyeT8kKCJpbnB1dCIpLmxpdmVxdWVyeSgkLmZuLm1Db2xvclBpY2tlci5zdGFydCk6KCQuZm4ubUNvbG9yUGlja2VyLnN0YXJ0KCksai5saXZlKCJhamF4U3VjY2Vzcy5tQ29sb3JQaWNrZXIiLCQuZm4ubUNvbG9yUGlja2VyLnN0YXJ0KSkpfSl9KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIwojIEVDQjIgLSBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAyCiMKIyBtYWludGFpbmVkIGJ5IENocmlzIFRheWxvciwgPGNocmlzQGJpbm5vdmF0aXZlLmNvLnVrPiwgc2luY2UgMjAxNgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBBIGZvcmsgb2YgbW9kdWxlOiBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAoRUNCKQojIE9yaWdpbmFsIEF1dGhvcjogWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIC8ga3V6bWFueS5iaXogIC8gdHdpdHRlci5jb20va3V6bWFueQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDkgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NrZWxldG9uLwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgppZiAoIWlzc2V0KCRnQ21zKSkKICAgIGV4aXQ7Ci8vIENUIE1PRCAxMUZlYjE2Ci8vIGlmKCB2ZXJzaW9uX2NvbXBhcmUoQ01TX1ZFUlNJT04sJzEuOTknKSA+IDAgKSB7Ci8vICAgcmV0dXJuICJFUlJPUjogVGhpcyBtb2R1bGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIHZlcnNpb24gb2YgQ01TTVMiOwovLyB9CiR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKFVTRV9FQ0IyLCBVU0VfRUNCMik7CgovLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cgLSBub3QgbmVlZGVkIGFueW1vcmUgLSBjb3JlIGRvZXMgdGhpcwovLyAkdGhpcy0+QXVkaXQoMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAkdGhpcy0+TGFuZygnaW5zdGFsbGVkJywgJHRoaXMtPkdldFZlcnNpb24oKSkpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIwojIEVDQjIgLSBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAyCiMKIyBtYWludGFpbmVkIGJ5IENocmlzIFRheWxvciwgPGNocmlzQGJpbm5vdmF0aXZlLmNvLnVrPiwgc2luY2UgMjAxNgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBBIGZvcmsgb2YgbW9kdWxlOiBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAoRUNCKQojIE9yaWdpbmFsIEF1dGhvcjogWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIC8ga3V6bWFueS5iaXogIC8gdHdpdHRlci5jb20va3V6bWFueQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDkgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NrZWxldG9uLwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKCgovLyByZW1vdmUgdGhlIHBlcm1pc3Npb25zCiR0aGlzLT5SZW1vdmVQZXJtaXNzaW9uKFVTRV9FQ0IyKTsKJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoKTsKJHRoaXMtPkRlbGV0ZVRlbXBsYXRlKCk7CgovLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cgLSBub3QgbmVlZGVkIGFueW1vcmUgLSBjb3JlIGRvZXMgdGhpcwovLyR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAkdGhpcy0+TGFuZygndW5pbnN0YWxsZWQnKSk7]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIwojIEVDQjIgLSBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAyCiMKIyBtYWludGFpbmVkIGJ5IENocmlzIFRheWxvciwgPGNocmlzQGJpbm5vdmF0aXZlLmNvLnVrPiwgc2luY2UgMjAxNgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBBIGZvcmsgb2YgbW9kdWxlOiBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAoRUNCKQojIE9yaWdpbmFsIEF1dGhvcjogWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIC8ga3V6bWFueS5iaXogIC8gdHdpdHRlci5jb20va3V6bWFueQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDkgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NrZWxldG9uLwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgppZiAoIWlzc2V0KCRnQ21zKSkKICAgIGV4aXQ7Ci8vIENUIE1PRCAxMUZlYjE2Ci8vIGlmKCB2ZXJzaW9uX2NvbXBhcmUoQ01TX1ZFUlNJT04sJzEuOTknKSA+PSAwICkgewovLyAgIHJldHVybiAiRVJST1I6IFRoaXMgbW9kdWxlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyB2ZXJzaW9uIG9mIENNU01TIjsKLy8gfQoKJGN1cnJlbnRfdmVyc2lvbiA9ICRvbGR2ZXJzaW9uOwokZGIgPSBjbXNtcygpLT5HZXREYigpOwoKLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nCiR0aGlzLT5BdWRpdCgwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCd1cGdyYWRlZCcsICR0aGlzLT5HZXRWZXJzaW9uKCkpKTsKPz4=]]></data>
	</file>
	<file>
	  <filename>/moduleinfo.ini</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[W21vZHVsZV0KbmFtZSA9IEVDQjIKdmVyc2lvbiA9IDEuMApkZXNjcmlwdGlvbiA9IAphdXRob3IgPSBDaHJpcyBUYXlsb3IgKHR3aXR0ZXIuY29tL0tpd2lDaHJpc0JUKQphdXRob3JlbWFpbCA9IGNocmlzQGJpbm5vdmF0aXZlLmNvLnVrCm1pbmNtc3ZlcnNpb24gPSAyLjAKMTFbZGVwZW5kc10KQ0dFeHRlbnNpb25zID0gMS4zOAo=]]></data>
	</file>
</module>
