<?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>CodeMirror</name>
	<version>0.1.1</version>
  <mincmsversion>1.5.3</mincmsversion>
	<help>PHN0cm9uZz5IdmFkIGcmb3NsYXNoO3IgZGV0dGUgbW9kdWw/PC9zdHJvbmc+DQo8YnIvPg0KVGhlIENvZGVNaXJyb3IgbW9kdWxlIGFsbG93cyB5b3UgdG8gZWRpdCBjb250ZW50LCB0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzIHVzaW5nIGEgc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvciBpbnNpZGUgeW91ciBicm93c2VyLg0KSXQgY2FuIGJvdGggcmVwbGFjZSBhIHd5c2l3eWctbW9kdWxlLCBhbmQgYWN0IHN0YW5kYWxvbmUgZm9yIHRlbXBsYXRlL3N0eWxlc2hlZXQgZWRpdGluZyAob25seSBzdXBwb3J0ZWQgaW4gQ01TbXMgMS4xKykNCjxici8+PGJyLz4NCjxzdHJvbmc+SG93IGRvIEkgdXNlIHRoaXMgbW9kdWxlPzwvc3Ryb25nPg0KWW91IHNpbXBseSBpbnN0YWxsIGl0LCBhbmQgY2hvb3NlIGl0IGluIHlvdXIgYWRtaW4gdXNlciBwcmVmZXJlbmNlcy4gTm90ZSwgdGhhdCBpZiB5b3UgdXNlIENNU21zIDEuMSBvciBhYm92ZSB5b3UgY2FuDQpzZWxlY3QgQ29kZU1pcnJvciBib3RoIGFzIGEgV1lTSVdZRyBhbmQgYXMgYSBzeW50YXggaGlnaGxpZ2h0aW5nIGVkaXRvci48aDM+UGFyYW1ldHJlPC9oMz48dWw+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGFuZz0iZW5fVVMiIC0gUGFyYW1ldHJldCBhbmdpdmVyIGh2aWxrZXQgc3Byb2cgZGVyIHNrYWwgYnJ1Z2VzIHRpbCB2aXNuaW5nIGZvciBiZXMmb3NsYXNoO2dlbmRlLiBJa2tlIGFsbGUgbW9kdWxlciB1bmRlcnN0Jm9zbGFzaDt0dGVyIGVsbGVyIGJlaCZvc2xhc2g7dmVyIGRldHRlLjwvbGk+PC91bD4=</help>
	<about>PGJyIC8+TGF2ZXQgYWY6IE1vcnRlbiBQb3Vsc2VuICZsdDsmbHQ7bW9ydGVuQHBvdWxzZW4ub3JnJmd0OyZndDs8YnIgLz48YnIgLz5WZXJzaW9uOiAwLjEuMTxiciAvPjxiciAvPkhpc3RvcmlrIG92ZXIgJmFlbGlnO25kcmluZ2VyOjxiciAvPjx1bD4KPGxpPjAuMS4xIC0gVXBkYXRlZCB0byBDTSAwLjYyLCBmaXhlZCBleGFtcGxlcyBhbmQgcHJvYmFibHkgZnVuY3Rpb25hbGl0eSBhcyB3ZWxsPC9saT4KPGxpPjAuMS4wIC0gSW5pdGlhbCByZWxlYXNlIDwvbGk+Cgo8L3VsPjxiciAvPg==</about>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCgppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKCmlmICghJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkgewogIGVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoJ25lZWRwZXJtaXNzaW9uJywgYXJyYXkoJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykpKTsKICByZXR1cm47Cn0KCmVjaG8gJHRoaXMtPlN0YXJ0VGFiSGVhZGVycygpOwplY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoInNldHRpbmdzIiwkdGhpcy0+TGFuZygic2V0dGluZ3N0YWIiKSk7CgplY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoImh0bWx0ZXN0IiwkdGhpcy0+TGFuZygiaHRtbHRlc3QiKSk7CmVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigiY3NzdGVzdCIsJHRoaXMtPkxhbmcoImNzc3Rlc3QiKSk7CmVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigicGhwdGVzdCIsJHRoaXMtPkxhbmcoInBocHRlc3QiKSk7CgplY2hvICR0aGlzLT5FbmRUYWJIZWFkZXJzKCk7CmVjaG8gJHRoaXMtPlN0YXJ0VGFiQ29udGVudCgpOwoKCmVjaG8gJHRoaXMtPlN0YXJ0VGFiKCJzZXR0aW5ncyIpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCAnc2F2ZXNldHRpbmdzJywgJHJldHVybmlkKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwoKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzaG93bGluZW51bWJlcnN0ZXh0JywgJHRoaXMtPkxhbmcoInNob3dsaW5lbnVtYmVycyIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzaG93bGluZW51bWJlcnNpbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCRpZCwic2hvd2xpbmVudW1iZXJzIiwxLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJzaG93bGluZW51bWJlcnMiLDEpKSk7CgokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3VzZWF1dG9jb21wbGV0ZXRleHQnLCAkdGhpcy0+TGFuZygidXNlYXV0b2NvbXBsZXRlIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3VzZWF1dG9jb21wbGV0ZWlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCJ1c2VhdXRvY29tcGxldGUiLDEsJHRoaXMtPkdldFByZWZlcmVuY2UoInVzZWF1dG9jb21wbGV0ZSIsMSkpKTsKCiR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwgJ3N1Ym1pdCcsICR0aGlzLT5MYW5nKCdzYXZlc2V0dGluZ3MnKSkpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdzZXR0aW5ncy50cGwnKTsKCmVjaG8gJHRoaXMtPkVuZFRhYigpOwoKZWNobyAkdGhpcy0+U3RhcnRUYWIoImh0bWx0ZXN0Iik7CiRjb250ZW50PSIKPGh0bWw+CiAgPGhlYWQ+CiAgICA8dGl0bGU+VGVzdGluZyBodG1sLXN5bnRheDwvdGl0bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgQW5kIGRvaW5nIGFic29sdXRlbHkgbm90aGluZyBlbHNlCiAgPC9ib2R5Pgo8L2h0bWw+IAoiOwplY2hvICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCJkZWZhdWx0YWRtaW4iKTsKZWNobyAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoZmFsc2UsJGlkLCRjb250ZW50LCJ0ZXN0YXJlYTEiLCcnLCcnLCcnLCcnLCc2MCcsJzEwJywnQ29kZU1pcnJvcicsJ2h0bWwnKTsKCmVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKTsKZWNobyAkdGhpcy0+RW5kVGFiKCk7CgplY2hvICR0aGlzLT5TdGFydFRhYigiY3NzdGVzdCIpOwokY29udGVudD0iCi50ZXN0Y3NzIHsKICBmb250LXdlaWdodDpib2xkOwogIGhlaWdodDogMTBweDsKfSAKIjsKZWNobyAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwiZGVmYXVsdGFkbWluIik7CmVjaG8gJHRoaXMtPkNyZWF0ZVRleHRBcmVhKGZhbHNlLCRpZCwkY29udGVudCwidGVzdGFyZWEyIiwnJywnJywnJywnJywnNjAnLCcxMCcsJ0NvZGVNaXJyb3InLCdjc3MnKTsKCmVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKTsKCmVjaG8gJHRoaXMtPkVuZFRhYigpOwoKZWNobyAkdGhpcy0+U3RhcnRUYWIoInBocHRlc3QiKTsKJGNvbnRlbnQ9Igo8P3BocAogIGZ1bmN0aW9uIHRlc3RQSFAoXCRzb21lcGFyYW0pIHsKICAgIGVjaG8gJ0RvIHlvdSB0aGluayB0aGlzIGxvb2tzIG5pY2U/JzsKICB9Cj8+CiI7CmVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsImRlZmF1bHRhZG1pbiIpOwplY2hvICR0aGlzLT5DcmVhdGVUZXh0QXJlYShmYWxzZSwkaWQsJGNvbnRlbnQsInRlc3RhcmVhMyIsJycsJycsJycsJycsJzYwJywnMTAnLCdDb2RlTWlycm9yJywncGhwJyk7CmVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKTsKCmVjaG8gJHRoaXMtPkVuZFRhYkNvbnRlbnQoKTsKCgovKgoKZWNobyAiPGgzPiIuJHRoaXMtPkxhbmcoInRlc3RhcmVhIikuIjo8L2gzPiI7CgokY29udGVudD0iCjxodG1sPgogIDxoZWFkPgogICAgPHRpdGxlPlRlc3RpbmcgaHRtbC1zeW50YXg8L3RpdGxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIEFuZCBkb2luZyBhYnNvbHV0ZWx5IG5vdGhpbmcgZWxzZQogIDwvYm9keT4KPC9odG1sPiAKIjsKZWNobyAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwiZGVmYXVsdGFkbWluIik7CmVjaG8gJHRoaXMtPkNyZWF0ZVRleHRBcmVhKGZhbHNlLCRpZCwkY29udGVudCwidGVzdGFyZWEiLCcnLCcnLCcnLCcnLCcnLCcnLCdDb2RlTWlycm9yJywnaHRtbCcpOwplY2hvICR0aGlzLT5DcmVhdGVGb3JtRW5kKCk7CiAKZWNobyAkdGhpcy0+RW5kVGFiKCk7CiAqLwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.savesettings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKaWYgKCEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpKSB7CiAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbmVlZHBlcm1pc3Npb24nLCBhcnJheSgnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkpOwogIHJldHVybjsKfQoKaWYoaXNzZXQoJHBhcmFtc1sic2hvd2xpbmVudW1iZXJzIl0pKSAKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgic2hvd2xpbmVudW1iZXJzIiwgJHBhcmFtc1sic2hvd2xpbmVudW1iZXJzIl0pOwplbHNlCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInNob3dsaW5lbnVtYmVycyIsICcwJyk7CiAgCi8qaWYoaXNzZXQoJHBhcmFtc1sidXNlYXV0b2NvbXBsZXRlIl0pKQogICR0aGlzLT5TZXRQcmVmZXJlbmNlKCJ1c2VhdXRvY29tcGxldGUiLCAkcGFyYW1zWyJ1c2VhdXRvY29tcGxldGUiXSk7CmVsc2UKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgidXNlYXV0b2NvbXBsZXRlIiwgJzAnKTsKKi8KCiR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAkcmV0dXJuaWQsYXJyYXkoIm1vZHVsZV9tZXNzYWdlIj0+JHRoaXMtPkxhbmcoInNldHRpbmdzc2F2ZWQiKSwidGFiIj0+InNldHRpbmdzIikpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/codemirror.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IC5Db2RlTWlycm9yLWxpbmUtbnVtYmVycyB7CiAgIHdpZHRoOiAyLjJlbTsKICAgY29sb3I6ICNhYWE7CiAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgIHRleHQtYWxpZ246IHJpZ2h0OwogICBwYWRkaW5nLXJpZ2h0OiAuM2VtOwogICBmb250LXNpemU6IDEwcHQ7CiAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgIHBhZGRpbmctdG9wOiAuNGVtOwogfQoK]]></data>
	</file>
	<file>
	  <filename>/CodeMirror.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiNDTVMgLSBDTVMgTWFkZSBTaW1wbGUNCiMoYykyMDA1LTA2IGJ5IE1vcnRlbiBQb3Vsc2VuIChtb3J0ZW5AcG91bHNlbi5vcmcpDQojVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMNCiNUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KI2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIw0KI1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KI2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KI0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiNhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KI0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0ENCg0KDQpjbGFzcyBDb2RlTWlycm9yIGV4dGVuZHMgQ01TTW9kdWxlIHsNCgl2YXIgJG5vZWRpdG9ycz0wOw0KCXZhciAkaGVhZGVyaW5mb3NlbnQ9ZmFsc2U7DQoNCglmdW5jdGlvbiBHZXROYW1lKCkgew0KCQlyZXR1cm4gJ0NvZGVNaXJyb3InOw0KCX0NCg0KCWZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkgew0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KDQoJZnVuY3Rpb24gSGFzQWRtaW4oKSB7DQoJCXJldHVybiB0cnVlOw0KCX0NCg0KCWZ1bmN0aW9uIEdldEhlbHAoKSB7DQoJCXJldHVybiAkdGhpcy0+TGFuZygiaGVscCIpOw0KCX0NCg0KCWZ1bmN0aW9uIEdldEF1dGhvcigpIHsNCgkJcmV0dXJuICdNb3J0ZW4gUG91bHNlbic7DQoJfQ0KDQoJZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKSB7DQoJCXJldHVybiAnJmx0O21vcnRlbkBwb3Vsc2VuLm9yZyZndDsnOw0KCX0NCg0KCWZ1bmN0aW9uIEdldENoYW5nZUxvZygpIHsNCgkJcmV0dXJuICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2NoYW5nZWxvZy50cGwnKTsNCgl9DQoNCglmdW5jdGlvbiBHZXRWZXJzaW9uKCkgew0KCQlyZXR1cm4gJzAuMS4xJzsNCgl9DQoJDQoJZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKSB7DQoJCXJldHVybiAiMS41LjMiOw0KCX0NCg0KICBmdW5jdGlvbiBIYXNDYXBhYmlsaXR5KCRjYXBhYmlsaXR5LCAkcGFyYW1zPWFycmF5KCkpIHsNCiAgICBpZiAoJGNhcGFiaWxpdHk9PSJ3eXNpd3lnIikgcmV0dXJuIHRydWU7DQogICAgaWYgKCRjYXBhYmlsaXR5PT0ic3ludGF4aGlnaGxpZ2h0aW5nIikgcmV0dXJuIHRydWU7DQogICAgcmV0dXJuIGZhbHNlOw0KICB9DQoNCglmdW5jdGlvbiBJc1dZU0lXWUcoKSB7DQoJCXJldHVybiB0cnVlOw0KCX0NCg0KCWZ1bmN0aW9uIElzU3ludGF4SGlnaGxpZ2h0ZXIoKSB7DQoJCXJldHVybiB0cnVlOw0KCX0NCg0KCWZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpIHsNCgkJcmV0dXJuICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJyk7DQoJfQ0KDQoJZnVuY3Rpb24gU3ludGF4UGFnZUZvcm1TdWJtaXQoKSB7DQoJCXJldHVybiAiZm9yICh2YXIgY250RWRpdG9yID0gMDsgY250RWRpdG9yIDwgbnVtQ29kZVByZXNzQXJlYXM7IGNudEVkaXRvcisrKSB7XG4iDQoJCS4gIlx0XHR2YXIgaWQgPSBldmFsKCdjb2RlcHJlc3MnICsgY250RWRpdG9yKTtcbiINCgkJLiAiXHRcdGlkLnRleHRhcmVhLnZhbHVlID0gaWQuZ2V0Q29kZSgpO1xuIg0KCQkuICJcdH1cbiI7DQoJfQ0KCQ0KCWZ1bmN0aW9uIFdZU0lXWUdQYWdlRm9ybVN1Ym1pdCgpIHsNCgkJcmV0dXJuICR0aGlzLT5TeW50YXhQYWdlRm9ybVN1Ym1pdCgpOw0KCX0NCg0KCWZ1bmN0aW9uIFdZU0lXWUdUZXh0QXJlYSgkbmFtZT0ndGV4dGFyZWEnLCRjb2x1bW5zPSc4MCcsJHJvd3M9JzE1JywkZW5jb2Rpbmc9JycsJGNvbnRlbnQ9JycsJHN0eWxlc2hlZXQ9JycpIHsNCgkJJHRoaXMtPnd5c2l3eWdhY3RpdmU9dHJ1ZTsNCgkJcmV0dXJuICR0aGlzLT5TeW50YXhUZXh0YXJlYSgkbmFtZSwiaHRtbCIsJGNvbHVtbnMsJHJvd3MsJGVuY29kaW5nLCRjb250ZW50KTsNCgl9DQoNCglmdW5jdGlvbiBTeW50YXhUZXh0YXJlYSgkbmFtZT0ndGV4dGFyZWEnLCRzeW50YXg9Imh0bWwiLCRjb2x1bW5zPSc4MCcsJHJvd3M9JzE1JywkZW5jb2Rpbmc9JycsJGNvbnRlbnQ9JycpIHsJICANCgkJJHRleHRhcmVhPSIiOw0KCQkkdGhpcy0+c3ludGF4YWN0aXZlPXRydWU7CQ0KCQkvKmlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgidXNlYXV0b2NvbXBsZXRlIiwiMSIpPT0iMCIpICRjbGFzcy49IiBhdXRvY29tcGxldGUtb2ZmIjsNCgkJaWYgKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJzaG93bGluZW51bWJlcnMiLCIxIik9PSIwIikgJGNsYXNzLj0iIGxpbmVudW1iZXJzLW9mZiI7DQoJCSovDQogICAgICAvKmlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgic2hvd3RvZ2dsZXN5bnRheCIsIjEiKT09IjEiKSB7DQogICAgIA0KCQkJJHRleHRhcmVhLj0iPGJyLz48aW5wdXQgdHlwZT0nY2hlY2tib3gnIGNoZWNrZWQ9JzEnIG9uY2xpY2s9J2NvZGVwcmVzcyIuJHRoaXMtPm5vZWRpdG9ycy4iLnRvZ2dsZUVkaXRvcigpOycgY2hlY2tlZD0nY2hlY2tlZCcgaWQ9J2NvZGVwcmVzc2NoZWNrIi4kdGhpcy0+bm9lZGl0b3JzLiInPjxsYWJlbCBmb3I9J2NvZGVwcmVzc2NoZWNrIi4kdGhpcy0+bm9lZGl0b3JzLiInPiIuJHRoaXMtPkxhbmcoInRvZ2dsZXN5bnRheCIpLiI8L2xhYmVsPiI7DQoJCX0qLw0KICAgIGlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgic2hvd2xpbmVudW1iZXJzIiwiMSIpPT0iMSIpew0KICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdsaW5lbnVtYmVycycsICJ0cnVlIik7DQogICAgfQ0KICAgIC8vbGluZU51bWJlcnM6IHRydWUsDQogICAgJGNvbmZpZz0kdGhpcy0+R2V0Q29uZmlnKCk7DQoNCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RleHRhcmVhaWQnLCAiY29kZW1pcnJvcmFyZWEiLiR0aGlzLT5ub2VkaXRvcnMpOw0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndGV4dGFyZWFuYW1lJywgJG5hbWUpOw0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY29udGVudCcsICRjb250ZW50KTsNCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lkJywgJHRoaXMtPm5vZWRpdG9ycyk7DQogICAgJHBhcnNlcmZpbGU9IiI7ICRjc3NmaWxlPSIiOw0KICAgICRjbWRpcj0kY29uZmlnWyJyb290X3VybCJdLicvbW9kdWxlcy9Db2RlTWlycm9yL2NvZGVtaXJyb3InOw0KICAgIHN3aXRjaCgkc3ludGF4KSB7DQogICAgICANCiAgICAgIGNhc2UgImh0bWwiIDogDQogICAgICAgICRwYXJzZXJmaWxlPScicGFyc2V4bWwuanMiJzsgDQogICAgICAgICRjc3NmaWxlPSciJy4kY21kaXIuJy9jc3MveG1sY29sb3JzLmNzcyInOw0KICAgICAgICBicmVhazsNCiAgICAgIGNhc2UgImNzcyIgOg0KICAgICAgICAkcGFyc2VyZmlsZT0nInBhcnNlY3NzLmpzIic7DQogICAgICAgICRjc3NmaWxlPSciJy4kY21kaXIuJy9jc3MvY3NzY29sb3JzLmNzcyInOw0KICAgICAgICBicmVhazsNCiAgICAgIGNhc2UgInBocCIgOg0KICAgICAgICAkcGFyc2VyZmlsZT0nWyJwYXJzZXhtbC5qcyIsICJwYXJzZWNzcy5qcyIsICJ0b2tlbml6ZWphdmFzY3JpcHQuanMiLCAicGFyc2VqYXZhc2NyaXB0LmpzIiwgInBhcnNlaHRtbG1peGVkLmpzIiwiLi4vY29udHJpYi9waHAvanMvdG9rZW5pemVwaHAuanMiLCAiLi4vY29udHJpYi9waHAvanMvcGFyc2VwaHAuanMiLCAgICAgICAgICAgICAgICAgICAgICIuLi9jb250cmliL3BocC9qcy9wYXJzZXBocGh0bWxtaXhlZC5qcyJdJzsNCiAgICAgICAgJGNzc2ZpbGU9J1siJy4kY21kaXIuJy9jc3MveG1sY29sb3JzLmNzcyIsIicuJGNtZGlyLicvY3NzL2pzY29sb3JzLmNzcyIsIicuJGNtZGlyLicvY3NzL2Nzc2NvbG9ycy5jc3MiLCInLiRjbWRpci4nL2NvbnRyaWIvcGhwL2Nzcy9waHBjb2xvcnMuY3NzIl0nOw0KICAgICAgICBicmVhazsNCiAgICB9DQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwYXJzZXJmaWxlJywgJHBhcnNlcmZpbGUpOw0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY3NzZmlsZScsICRjc3NmaWxlKTsNCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Jvb3RfdXJsJywgJGNvbmZpZ1sicm9vdF91cmwiXSk7DQoNCiAgICAkdGV4dGFyZWE9JHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnY29kZW1pcnJvcmFyZWEudHBsJyk7DQoNCgkJJHRoaXMtPm5vZWRpdG9ycysrOw0KDQoJCXJldHVybiAkdGV4dGFyZWE7DQoJfQ0KDQoJZnVuY3Rpb24gV1lTSVdZR0dlbmVyYXRlSGVhZGVyKCRodG1scmVzdWx0PScnKSB7DQoJCXJldHVybiAkdGhpcy0+U3ludGF4R2VuZXJhdGVIZWFkZXIoKTsNCgl9DQoNCglmdW5jdGlvbiBTeW50YXhHZW5lcmF0ZUhlYWRlcigkaHRtbHJlc3VsdD0nJykgew0KCQlpZiAoJHRoaXMtPmhlYWRlcmluZm9zZW50KSByZXR1cm4gIiI7DQoJCWlmICgkdGhpcy0+bm9lZGl0b3JzPT0wKSByZXR1cm4gJyc7DQoJCS8vJEdMT0JBTFNbImNvbmZpZyJdWyJyb290X3BhdGgiXS4NCg0KCQkkc2NyaXB0cGF0aD0kR0xPQkFMU1siY29uZmlnIl1bInJvb3RfdXJsIl0uIi9tb2R1bGVzL0NvZGVNaXJyb3IvY29kZW1pcnJvci9qcy9jb2RlbWlycm9yLmpzIjsNCgkJJGhlYWRlcj0iIjsNCgkJJGhlYWRlci49JzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInLiRzY3JpcHRwYXRoLiciPjwvc2NyaXB0PlxuJzsNCiAgICAkaGVhZGVyLj0nPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJy4kR0xPQkFMU1siY29uZmlnIl1bInJvb3RfdXJsIl0uJy9tb2R1bGVzL0NvZGVNaXJyb3IvY29kZW1pcnJvci5jc3MiLz4nOw0KCQkkdGhpcy0+aGVhZGVyaW5mb3NlbnQ9dHJ1ZTsNCgkJcmV0dXJuICRoZWFkZXI7DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/bigtest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogSmF2YVNjcmlwdCBkZW1vbnN0cmF0aW9uPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9kb2NzLmNzcyIvPgogIDwvaGVhZD4KICA8Ym9keSBzdHlsZT0icGFkZGluZzogMjBweDsiPgoKPHA+VGhpcyBwYWdlIGRlbW9uc3RyYXRlcyA8YSBocmVmPSJpbmRleC5odG1sIj5Db2RlTWlycm9yPC9hPidzCkphdmFTY3JpcHQgcGFyc2VyLiBOb3RlIHRoYXQgdGhlIHVnbHkgYnV0dG9ucyBhdCB0aGUgdG9wIGFyZSBub3QgYXJlCm5vdCBwYXJ0IG9mIENvZGVNaXJyb3IgcHJvcGVyIC0tIHRoZXkgZGVtb25zdHJhdGUgdGhlIHdheSBpdCBjYW4gYmUKZW1iZWRkZWQgaW4gYSB3ZWItYXBwbGljYXRpb24uPC9wPgoKPGRpdiBjbGFzcz0iYm9yZGVyIj4KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjMwIj4KLyogVGhlIEVkaXRvciBvYmplY3QgbWFuYWdlcyB0aGUgY29udGVudCBvZiB0aGUgZWRpdGFibGUgZnJhbWUuIEl0CiAqIGNhdGNoZXMgZXZlbnRzLCBjb2xvdXJzIG5vZGVzLCBhbmQgaW5kZW50cyBsaW5lcy4gVGhpcyBmaWxlIGFsc28KICogaG9sZHMgc29tZSBmdW5jdGlvbnMgZm9yIHRyYW5zZm9ybWluZyBhcmJpdHJhcnkgRE9NIHN0cnVjdHVyZXMgaW50bwogKiBwbGFpbiBzZXF1ZW5jZXMgb2YgJmx0O3NwYW4+IGFuZCAmbHQ7YnI+IGVsZW1lbnRzCiAqLwoKLy8gTWFrZSBzdXJlIGEgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gdHdvIGNvbnNlY3V0aXZlICdjb2xsYXBzZWFibGUnCi8vIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KZnVuY3Rpb24gbWFrZVdoaXRlU3BhY2UobikgewogIHZhciBidWZmZXIgPSBbXSwgbmIgPSB0cnVlOwogIGZvciAoOyBuID4gMDsgbi0tKSB7CiAgICBidWZmZXIucHVzaCgobmIgfHwgbiA9PSAxKSA/IG5ic3AgOiAiICIpOwogICAgbmIgPSAhbmI7CiAgfQogIHJldHVybiBidWZmZXIuam9pbigiIik7Cn0KCi8vIENyZWF0ZSBhIHNldCBvZiB3aGl0ZS1zcGFjZSBjaGFyYWN0ZXJzIHRoYXQgd2lsbCBub3QgYmUgY29sbGFwc2VkCi8vIGJ5IHRoZSBicm93c2VyLCBidXQgd2lsbCBub3QgYnJlYWsgdGV4dC13cmFwcGluZyBlaXRoZXIuCmZ1bmN0aW9uIGZpeFNwYWNlcyhzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmNoYXJBdCgwKSA9PSAiICIpIHN0cmluZyA9IG5ic3AgKyBzdHJpbmcuc2xpY2UoMSk7CiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bXHQgXHUwMGEwXXsyLH0vZywgZnVuY3Rpb24ocykge3JldHVybiBtYWtlV2hpdGVTcGFjZShzLmxlbmd0aCk7fSk7Cn0KCmZ1bmN0aW9uIGNsZWFuVGV4dCh0ZXh0KSB7CiAgcmV0dXJuIHRleHQucmVwbGFjZSgvXHUwMGEwL2csICIgIikucmVwbGFjZSgvXHUyMDBiL2csICIiKTsKfQoKLy8gQ3JlYXRlIGEgU1BBTiBub2RlIHdpdGggdGhlIGV4cGVjdGVkIHByb3BlcnRpZXMgZm9yIGRvY3VtZW50IHBhcnQKLy8gc3BhbnMuCmZ1bmN0aW9uIG1ha2VQYXJ0U3Bhbih2YWx1ZSwgZG9jKSB7CiAgdmFyIHRleHQgPSB2YWx1ZTsKICBpZiAodmFsdWUubm9kZVR5cGUgPT0gMykgdGV4dCA9IHZhbHVlLm5vZGVWYWx1ZTsKICBlbHNlIHZhbHVlID0gZG9jLmNyZWF0ZVRleHROb2RlKHRleHQpOwoKICB2YXIgc3BhbiA9IGRvYy5jcmVhdGVFbGVtZW50KCJTUEFOIik7CiAgc3Bhbi5pc1BhcnQgPSB0cnVlOwogIHNwYW4uYXBwZW5kQ2hpbGQodmFsdWUpOwogIHNwYW4uY3VycmVudFRleHQgPSB0ZXh0OwogIHJldHVybiBzcGFuOwp9CgovLyBPbiB3ZWJraXQsIHdoZW4gdGhlIGxhc3QgQlIgb2YgdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgdGV4dAovLyBiZWhpbmQgaXQsIHRoZSBjdXJzb3IgY2FuIG5vdCBiZSBwdXQgb24gdGhlIGxpbmUgYWZ0ZXIgaXQuIFRoaXMKLy8gbWFrZXMgcHJlc3NpbmcgZW50ZXIgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQgb2NjYXNpb25hbGx5IGRvCi8vIG5vdGhpbmcgKG9yIGF0IGxlYXN0IHNlZW0gdG8gZG8gbm90aGluZykuIFRvIHdvcmsgYXJvdW5kIGl0LCB0aGlzCi8vIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhlIGRvY3VtZW50IGVuZHMgd2l0aCBhIHNwYW4gY29udGFpbmluZyBhCi8vIHplcm8td2lkdGggc3BhY2UgY2hhcmFjdGVyLiBUaGUgdHJhdmVyc2VET00gaXRlcmF0b3IgZmlsdGVycyBzdWNoCi8vIGNoYXJhY3RlciBvdXQgYWdhaW4sIHNvIHRoYXQgdGhlIHBhcnNlcnMgd29uJ3Qgc2VlIHRoZW0uIFRoaXMKLy8gZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYSBmZXcgc3RyYXRlZ2ljIHBsYWNlcyB0byBtYWtlIHN1cmUgdGhlCi8vIHp3c3AgaXMgcmVzdG9yZWQgYWZ0ZXIgdGhlIGhpZ2hsaWdodGluZyBwcm9jZXNzIGVhdHMgaXQuCnZhciB3ZWJraXRMYXN0TGluZUhhY2sgPSB3ZWJraXQgPwogIGZ1bmN0aW9uKGNvbnRhaW5lcikgewogICAgdmFyIGxhc3QgPSBjb250YWluZXIubGFzdENoaWxkOwogICAgaWYgKCFsYXN0IHx8ICFsYXN0LmlzUGFydCB8fCBsYXN0LnRleHRDb250ZW50ICE9ICJcdTIwMGIiKQogICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobWFrZVBhcnRTcGFuKCJcdTIwMGIiLCBjb250YWluZXIub3duZXJEb2N1bWVudCkpOwogIH0gOiBmdW5jdGlvbigpIHt9OwoKdmFyIEVkaXRvciA9IChmdW5jdGlvbigpewogIC8vIFRoZSBIVE1MIGVsZW1lbnRzIHdob3NlIGNvbnRlbnQgc2hvdWxkIGJlIHN1ZmZpeGVkIGJ5IGEgbmV3bGluZQogIC8vIHdoZW4gY29udmVydGluZyB0aGVtIHRvIGZsYXQgdGV4dC4KICB2YXIgbmV3bGluZUVsZW1lbnRzID0geyJQIjogdHJ1ZSwgIkRJViI6IHRydWUsICJMSSI6IHRydWV9OwoKICBmdW5jdGlvbiBhc0VkaXRvckxpbmVzKHN0cmluZykgewogICAgcmV0dXJuIGZpeFNwYWNlcyhzdHJpbmcucmVwbGFjZSgvXHQvZywgIiAgIikucmVwbGFjZSgvXHUwMGEwL2csICIgIikpLnJlcGxhY2UoL1xyXG4/L2csICJcbiIpLnNwbGl0KCJcbiIpOwogIH0KCiAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciB0cmF2ZXJzZURPTS4gRmxhdHRlbnMgYW4gYXJiaXRyYXJ5IERPTSBub2RlCiAgLy8gaW50byBhbiBhcnJheSBvZiB0ZXh0bm9kZXMgYW5kICZsdDticj4gdGFncy4KICBmdW5jdGlvbiBzaW1wbGlmeURPTShyb290KSB7CiAgICB2YXIgZG9jID0gcm9vdC5vd25lckRvY3VtZW50OwogICAgdmFyIHJlc3VsdCA9IFtdOwogICAgdmFyIGxlYXZpbmcgPSB0cnVlOwoKICAgIGZ1bmN0aW9uIHNpbXBsaWZ5Tm9kZShub2RlKSB7CiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHsKICAgICAgICB2YXIgdGV4dCA9IG5vZGUubm9kZVZhbHVlID0gZml4U3BhY2VzKG5vZGUubm9kZVZhbHVlLnJlcGxhY2UoL1tcclx1MjAwYl0vZywgIiIpLnJlcGxhY2UoL1xuL2csICIgIikpOwogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCkgbGVhdmluZyA9IGZhbHNlOwogICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKG5vZGUubm9kZU5hbWUgPT0gIkJSIiAmYW1wOyZhbXA7IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPT0gMCkgewogICAgICAgIGxlYXZpbmcgPSB0cnVlOwogICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGZvckVhY2gobm9kZS5jaGlsZE5vZGVzLCBzaW1wbGlmeU5vZGUpOwogICAgICAgIGlmICghbGVhdmluZyAmYW1wOyZhbXA7IG5ld2xpbmVFbGVtZW50cy5oYXNPd25Qcm9wZXJ0eShub2RlLm5vZGVOYW1lKSkgewogICAgICAgICAgbGVhdmluZyA9IHRydWU7CiAgICAgICAgICByZXN1bHQucHVzaChkb2MuY3JlYXRlRWxlbWVudCgiQlIiKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgc2ltcGxpZnlOb2RlKHJvb3QpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIENyZWF0ZXMgYSBNb2NoaUtpdC1zdHlsZSBpdGVyYXRvciB0aGF0IGdvZXMgb3ZlciBhIHNlcmllcyBvZiBET00KICAvLyBub2Rlcy4gVGhlIHZhbHVlcyBpdCB5aWVsZHMgYXJlIHN0cmluZ3MsIHRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YKICAvLyB0aGUgbm9kZXMuIEl0IG1ha2VzIHN1cmUgdGhhdCBhbGwgbm9kZXMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUKICAvLyBvbmUgd2hvc2UgdGV4dCBpcyBiZWluZyB5aWVsZGVkIGhhdmUgYmVlbiAnbm9ybWFsaXplZCcgdG8gYmUganVzdAogIC8vICZsdDtzcGFuPiBhbmQgJmx0O2JyPiBlbGVtZW50cy4KICAvLyBTZWUgdGhlIHN0b3J5Lmh0bWwgZmlsZSBmb3Igc29tZSBzaG9ydCByZW1hcmtzIGFib3V0IHRoZSB1c2Ugb2YKICAvLyBjb250aW51YXRpb24tcGFzc2luZyBzdHlsZSBpbiB0aGlzIGl0ZXJhdG9yLgogIGZ1bmN0aW9uIHRyYXZlcnNlRE9NKHN0YXJ0KXsKICAgIGZ1bmN0aW9uIHlpZWxkKHZhbHVlLCBjKXtjYyA9IGM7IHJldHVybiB2YWx1ZTt9CiAgICBmdW5jdGlvbiBwdXNoKGZ1biwgYXJnLCBjKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZnVuKGFyZywgYyk7fTt9CiAgICBmdW5jdGlvbiBzdG9wKCl7Y2MgPSBzdG9wOyB0aHJvdyBTdG9wSXRlcmF0aW9uO307CiAgICB2YXIgY2MgPSBwdXNoKHNjYW5Ob2RlLCBzdGFydCwgc3RvcCk7CiAgICB2YXIgb3duZXIgPSBzdGFydC5vd25lckRvY3VtZW50OwogICAgdmFyIG5vZGVRdWV1ZSA9IFtdOwoKICAgIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5zZXJ0IG5vZGVzIGFmdGVyIHRoZQogICAgLy8gb25lIGdpdmVuIGFzIGFyZ3VtZW50LgogICAgZnVuY3Rpb24gcG9pbnRBdChub2RlKXsKICAgICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgdmFyIG5leHQgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICByZXR1cm4gZnVuY3Rpb24obmV3bm9kZSkgewogICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3bm9kZSwgbmV4dCk7CiAgICAgIH07CiAgICB9CiAgICB2YXIgcG9pbnQgPSBudWxsOwoKICAgIC8vIEluc2VydCBhIG5vcm1hbGl6ZWQgbm9kZSBhdCB0aGUgY3VycmVudCBwb2ludC4gSWYgaXQgaXMgYSB0ZXh0CiAgICAvLyBub2RlLCB3cmFwIGl0IGluIGEgJmx0O3NwYW4+LCBhbmQgZ2l2ZSB0aGF0IHNwYW4gYSBjdXJyZW50VGV4dAogICAgLy8gcHJvcGVydHkgLS0gdGhpcyBpcyB1c2VkIHRvIGNhY2hlIHRoZSBub2RlVmFsdWUsIGJlY2F1c2UKICAgIC8vIGRpcmVjdGx5IGFjY2Vzc2luZyBub2RlVmFsdWUgaXMgaG9ycmlibHkgc2xvdyBvbiBzb21lIGJyb3dzZXJzLgogICAgLy8gVGhlIGRpcnR5IHByb3BlcnR5IGlzIHVzZWQgYnkgdGhlIGhpZ2hsaWdodGVyIHRvIGRldGVybWluZQogICAgLy8gd2hpY2ggcGFydHMgb2YgdGhlIGRvY3VtZW50IGhhdmUgdG8gYmUgcmUtaGlnaGxpZ2h0ZWQuCiAgICBmdW5jdGlvbiBpbnNlcnRQYXJ0KHBhcnQpewogICAgICB2YXIgdGV4dCA9ICJcbiI7CiAgICAgIGlmIChwYXJ0Lm5vZGVUeXBlID09IDMpIHsKICAgICAgICBzZWxlY3Quc25hcHNob3RDaGFuZ2VkKCk7CiAgICAgICAgcGFydCA9IG1ha2VQYXJ0U3BhbihwYXJ0LCBvd25lcik7CiAgICAgICAgdGV4dCA9IHBhcnQuY3VycmVudFRleHQ7CiAgICAgIH0KICAgICAgcGFydC5kaXJ0eSA9IHRydWU7CiAgICAgIG5vZGVRdWV1ZS5wdXNoKHBhcnQpOwogICAgICBwb2ludChwYXJ0KTsKICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CgogICAgLy8gRXh0cmFjdCB0aGUgdGV4dCBhbmQgbmV3bGluZXMgZnJvbSBhIERPTSBub2RlLCBpbnNlcnQgdGhlbSBpbnRvCiAgICAvLyB0aGUgZG9jdW1lbnQsIGFuZCB5aWVsZCB0aGUgdGV4dHVhbCBjb250ZW50LiBVc2VkIHRvIHJlcGxhY2UKICAgIC8vIG5vbi1ub3JtYWxpemVkIG5vZGVzLgogICAgZnVuY3Rpb24gd3JpdGVOb2RlKG5vZGUsIGMpewogICAgICB2YXIgdG9ZaWVsZCA9IFtdOwogICAgICBmb3JFYWNoKHNpbXBsaWZ5RE9NKG5vZGUpLCBmdW5jdGlvbihwYXJ0KSB7CiAgICAgICAgdG9ZaWVsZC5wdXNoKGluc2VydFBhcnQocGFydCkpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHlpZWxkKHRvWWllbGQuam9pbigiIiksIGMpOwogICAgfQoKICAgIC8vIENoZWNrIHdoZXRoZXIgYSBub2RlIGlzIGEgbm9ybWFsaXplZCAmbHQ7c3Bhbj4gZWxlbWVudC4KICAgIGZ1bmN0aW9uIHBhcnROb2RlKG5vZGUpewogICAgICBpZiAobm9kZS5pc1BhcnQgJmFtcDsmYW1wOyBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID09IDEgJmFtcDsmYW1wOyBub2RlLmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gMykgewogICAgICAgIG5vZGUuY3VycmVudFRleHQgPSBub2RlLmZpcnN0Q2hpbGQubm9kZVZhbHVlOwogICAgICAgIHJldHVybiAhL1tcblx0XHJdLy50ZXN0KG5vZGUuY3VycmVudFRleHQpOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBIYW5kbGUgYSBub2RlLiBBZGQgaXRzIHN1Y2Nlc3NvciB0byB0aGUgY29udGludWF0aW9uIGlmIHRoZXJlCiAgICAvLyBpcyBvbmUsIGZpbmQgb3V0IHdoZXRoZXIgdGhlIG5vZGUgaXMgbm9ybWFsaXplZC4gSWYgaXQgaXMsCiAgICAvLyB5aWVsZCBpdHMgY29udGVudCwgb3RoZXJ3aXNlLCBub3JtYWxpemUgaXQgKHdyaXRlTm9kZSB3aWxsIHRha2UKICAgIC8vIGNhcmUgb2YgeWllbGRpbmcpLgogICAgZnVuY3Rpb24gc2Nhbk5vZGUobm9kZSwgYyl7CiAgICAgIGlmIChub2RlLm5leHRTaWJsaW5nKQogICAgICAgIGMgPSBwdXNoKHNjYW5Ob2RlLCBub2RlLm5leHRTaWJsaW5nLCBjKTsKCiAgICAgIGlmIChwYXJ0Tm9kZShub2RlKSl7CiAgICAgICAgbm9kZVF1ZXVlLnB1c2gobm9kZSk7CiAgICAgICAgcmV0dXJuIHlpZWxkKG5vZGUuY3VycmVudFRleHQsIGMpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKG5vZGUubm9kZU5hbWUgPT0gIkJSIikgewogICAgICAgIG5vZGVRdWV1ZS5wdXNoKG5vZGUpOwogICAgICAgIHJldHVybiB5aWVsZCgiXG4iLCBjKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBwb2ludCA9IHBvaW50QXQobm9kZSk7CiAgICAgICAgcmVtb3ZlRWxlbWVudChub2RlKTsKICAgICAgICByZXR1cm4gd3JpdGVOb2RlKG5vZGUsIGMpOwogICAgICB9CiAgICB9CgogICAgLy8gTW9jaGlLaXQgaXRlcmF0b3JzIGFyZSBvYmplY3RzIHdpdGggYSBuZXh0IGZ1bmN0aW9uIHRoYXQKICAgIC8vIHJldHVybnMgdGhlIG5leHQgdmFsdWUgb3IgdGhyb3dzIFN0b3BJdGVyYXRpb24gd2hlbiB0aGVyZSBhcmUKICAgIC8vIG5vIG1vcmUgdmFsdWVzLgogICAgcmV0dXJuIHtuZXh0OiBmdW5jdGlvbigpe3JldHVybiBjYygpO30sIG5vZGVzOiBub2RlUXVldWV9OwogIH0KCiAgLy8gRGV0ZXJtaW5lIHRoZSB0ZXh0IHNpemUgb2YgYSBwcm9jZXNzZWQgbm9kZS4KICBmdW5jdGlvbiBub2RlU2l6ZShub2RlKSB7CiAgICBpZiAobm9kZS5ub2RlTmFtZSA9PSAiQlIiKQogICAgICByZXR1cm4gMTsKICAgIGVsc2UKICAgICAgcmV0dXJuIG5vZGUuY3VycmVudFRleHQubGVuZ3RoOwogIH0KCiAgLy8gU2VhcmNoIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0b3AtbGV2ZWwgbm9kZXMgdW50aWwgdGhlIG5leHQgQlIgb3IKICAvLyB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lLgogIGZ1bmN0aW9uIHN0YXJ0T2ZMaW5lKG5vZGUpIHsKICAgIHdoaWxlIChub2RlICZhbXA7JmFtcDsgbm9kZS5ub2RlTmFtZSAhPSAiQlIiKSBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7CiAgICByZXR1cm4gbm9kZTsKICB9CiAgZnVuY3Rpb24gZW5kT2ZMaW5lKG5vZGUsIGNvbnRhaW5lcikgewogICAgaWYgKCFub2RlKSBub2RlID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICBlbHNlIGlmIChub2RlLm5vZGVOYW1lID09ICJCUiIpIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwoKICAgIHdoaWxlIChub2RlICZhbXA7JmFtcDsgbm9kZS5ub2RlTmFtZSAhPSAiQlIiKSBub2RlID0gbm9kZS5uZXh0U2libGluZzsKICAgIHJldHVybiBub2RlOwogIH0KCiAgLy8gUmVwbGFjZSBhbGwgRE9NIG5vZGVzIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB3aXRoIG5ldyBvbmVzLgogIC8vIE5lZWRlZCB0byBwcmV2ZW50IGlzc3VlcyBpbiBJRSB3aGVyZSB0aGUgb2xkIERPTSBub2RlcyBjYW4gYmUKICAvLyBwYXN0ZWQgYmFjayBpbnRvIHRoZSBkb2N1bWVudCwgc3RpbGwgaG9sZGluZyB0aGVpciBvbGQgdW5kbwogIC8vIGluZm9ybWF0aW9uLgogIGZ1bmN0aW9uIHNjcnViUGFzdGVkKGNvbnRhaW5lciwgc3RhcnQsIHN0YXJ0MikgewogICAgdmFyIGVuZCA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKGNvbnRhaW5lciwgdHJ1ZSksCiAgICAgICAgZG9jID0gY29udGFpbmVyLm93bmVyRG9jdW1lbnQ7CiAgICBpZiAoc3RhcnQgIT0gbnVsbCAmYW1wOyZhbXA7IHN0YXJ0LnBhcmVudE5vZGUgIT0gY29udGFpbmVyKSBzdGFydCA9IHN0YXJ0MjsKICAgIGlmIChzdGFydCA9PT0gZmFsc2UpIHN0YXJ0ID0gbnVsbDsKICAgIGlmIChzdGFydCA9PSBlbmQgfHwgIWVuZCB8fCAhY29udGFpbmVyLmZpcnN0Q2hpbGQpIHJldHVybjsKCiAgICB2YXIgY2xlYXIgPSB0cmF2ZXJzZURPTShzdGFydCA/IHN0YXJ0Lm5leHRTaWJsaW5nIDogY29udGFpbmVyLmZpcnN0Q2hpbGQpOwogICAgd2hpbGUgKGVuZC5wYXJlbnROb2RlID09IGNvbnRhaW5lcikgdHJ5e2NsZWFyLm5leHQoKTt9Y2F0Y2goZSl7YnJlYWs7fQogICAgZm9yRWFjaChjbGVhci5ub2RlcywgZnVuY3Rpb24obm9kZSkgewogICAgICB2YXIgbmV3Tm9kZSA9IG5vZGUubm9kZU5hbWUgPT0gIkJSIiA/IGRvYy5jcmVhdGVFbGVtZW50KCJCUiIpIDogbWFrZVBhcnRTcGFuKG5vZGUuY3VycmVudFRleHQsIGRvYyk7CiAgICAgIGNvbnRhaW5lci5yZXBsYWNlQ2hpbGQobmV3Tm9kZSwgbm9kZSk7CiAgICB9KTsKICB9CgogIC8vIENsaWVudCBpbnRlcmZhY2UgZm9yIHNlYXJjaGluZyB0aGUgY29udGVudCBvZiB0aGUgZWRpdG9yLiBDcmVhdGUKICAvLyB0aGVzZSBieSBjYWxsaW5nIENvZGVNaXJyb3IuZ2V0U2VhcmNoQ3Vyc29yLiBUbyB1c2UsIGNhbGwKICAvLyBmaW5kTmV4dCBvbiB0aGUgcmVzdWx0aW5nIG9iamVjdCAtLSB0aGlzIHJldHVybnMgYSBib29sZWFuCiAgLy8gaW5kaWNhdGluZyB3aGV0aGVyIGFueXRoaW5nIHdhcyBmb3VuZCwgYW5kIGNhbiBiZSBjYWxsZWQgYWdhaW4gdG8KICAvLyBza2lwIHRvIHRoZSBuZXh0IGZpbmQuIFVzZSB0aGUgc2VsZWN0IGFuZCByZXBsYWNlIG1ldGhvZHMgdG8KICAvLyBhY3R1YWxseSBkbyBzb21ldGhpbmcgd2l0aCB0aGUgZm91bmQgbG9jYXRpb25zLgogIGZ1bmN0aW9uIFNlYXJjaEN1cnNvcihlZGl0b3IsIHN0cmluZywgZnJvbUN1cnNvcikgewogICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7CiAgICB0aGlzLmhpc3RvcnkgPSBlZGl0b3IuaGlzdG9yeTsKICAgIHRoaXMuaGlzdG9yeS5jb21taXQoKTsKCiAgICAvLyBBcmUgd2UgY3VycmVudGx5IGF0IGFuIG9jY3VycmVuY2Ugb2YgdGhlIHNlYXJjaCBzdHJpbmc/CiAgICB0aGlzLmF0T2NjdXJyZW5jZSA9IGZhbHNlOwogICAgLy8gVGhlIG9iamVjdCBzdG9yZXMgYSBzZXQgb2Ygbm9kZXMgY29taW5nIGFmdGVyIGl0cyBjdXJyZW50CiAgICAvLyBwb3NpdGlvbiwgc28gdGhhdCB3aGVuIHRoZSBjdXJyZW50IHBvaW50IGlzIHRha2VuIG91dCBvZiB0aGUKICAgIC8vIERPTSB0cmVlLCB3ZSBjYW4gc3RpbGwgdHJ5IHRvIGNvbnRpbnVlLgogICAgdGhpcy5mYWxsYmFja1NpemUgPSAxNTsKICAgIHZhciBjdXJzb3I7CiAgICAvLyBTdGFydCBmcm9tIHRoZSBjdXJzb3Igd2hlbiBzcGVjaWZpZWQgYW5kIGEgY3Vyc29yIGNhbiBiZSBmb3VuZC4KICAgIGlmIChmcm9tQ3Vyc29yICZhbXA7JmFtcDsgKGN1cnNvciA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5lZGl0b3IuY29udGFpbmVyKSkpIHsKICAgICAgdGhpcy5saW5lID0gY3Vyc29yLm5vZGU7CiAgICAgIHRoaXMub2Zmc2V0ID0gY3Vyc29yLm9mZnNldDsKICAgIH0KICAgIGVsc2UgewogICAgICB0aGlzLmxpbmUgPSBudWxsOwogICAgICB0aGlzLm9mZnNldCA9IDA7CiAgICB9CiAgICB0aGlzLnZhbGlkID0gISFzdHJpbmc7CgogICAgLy8gQ3JlYXRlIGEgbWF0Y2hlciBmdW5jdGlvbiBiYXNlZCBvbiB0aGUga2luZCBvZiBzdHJpbmcgd2UgaGF2ZS4KICAgIHZhciB0YXJnZXQgPSBzdHJpbmcuc3BsaXQoIlxuIiksIHNlbGYgPSB0aGlzOzsKICAgIHRoaXMubWF0Y2hlcyA9ICh0YXJnZXQubGVuZ3RoID09IDEpID8KICAgICAgLy8gRm9yIG9uZS1saW5lIHN0cmluZ3MsIHNlYXJjaGluZyBjYW4gYmUgZG9uZSBzaW1wbHkgYnkgY2FsbGluZwogICAgICAvLyBpbmRleE9mIG9uIHRoZSBjdXJyZW50IGxpbmUuCiAgICAgIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBtYXRjaCA9IGNsZWFuVGV4dChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKHNlbGYubGluZSkuc2xpY2Uoc2VsZi5vZmZzZXQpKS5pbmRleE9mKHN0cmluZyk7CiAgICAgICAgaWYgKG1hdGNoID4gLTEpCiAgICAgICAgICByZXR1cm4ge2Zyb206IHtub2RlOiBzZWxmLmxpbmUsIG9mZnNldDogc2VsZi5vZmZzZXQgKyBtYXRjaH0sCiAgICAgICAgICAgICAgICAgIHRvOiB7bm9kZTogc2VsZi5saW5lLCBvZmZzZXQ6IHNlbGYub2Zmc2V0ICsgbWF0Y2ggKyBzdHJpbmcubGVuZ3RofX07CiAgICAgIH0gOgogICAgICAvLyBNdWx0aS1saW5lIHN0cmluZ3MgcmVxdWlyZSBpbnRlcm5hbCBpdGVyYXRpb24gb3ZlciBsaW5lcywgYW5kCiAgICAgIC8vIHNvbWUgY2x1bmt5IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIGZpcnN0IG1hdGNoIGVuZHMgYXQgdGhlCiAgICAgIC8vIGVuZCBvZiB0aGUgbGluZSBhbmQgdGhlIGxhc3QgbWF0Y2ggc3RhcnRzIGF0IHRoZSBzdGFydC4KICAgICAgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGZpcnN0TGluZSA9IGNsZWFuVGV4dChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKHNlbGYubGluZSkuc2xpY2Uoc2VsZi5vZmZzZXQpKTsKICAgICAgICB2YXIgbWF0Y2ggPSBmaXJzdExpbmUubGFzdEluZGV4T2YodGFyZ2V0WzBdKTsKICAgICAgICBpZiAobWF0Y2ggPT0gLTEgfHwgbWF0Y2ggIT0gZmlyc3RMaW5lLmxlbmd0aCAtIHRhcmdldFswXS5sZW5ndGgpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgdmFyIHN0YXJ0T2Zmc2V0ID0gc2VsZi5vZmZzZXQgKyBtYXRjaDsKCiAgICAgICAgdmFyIGxpbmUgPSBzZWxmLmhpc3Rvcnkubm9kZUFmdGVyKHNlbGYubGluZSk7CiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgJmx0OyB0YXJnZXQubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICBpZiAoY2xlYW5UZXh0KHNlbGYuaGlzdG9yeS50ZXh0QWZ0ZXIobGluZSkpICE9IHRhcmdldFtpXSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgbGluZSA9IHNlbGYuaGlzdG9yeS5ub2RlQWZ0ZXIobGluZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoY2xlYW5UZXh0KHNlbGYuaGlzdG9yeS50ZXh0QWZ0ZXIobGluZSkpLmluZGV4T2YodGFyZ2V0W3RhcmdldC5sZW5ndGggLSAxXSkgIT0gMCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgcmV0dXJuIHtmcm9tOiB7bm9kZTogc2VsZi5saW5lLCBvZmZzZXQ6IHN0YXJ0T2Zmc2V0fSwKICAgICAgICAgICAgICAgIHRvOiB7bm9kZTogbGluZSwgb2Zmc2V0OiB0YXJnZXRbdGFyZ2V0Lmxlbmd0aCAtIDFdLmxlbmd0aH19OwogICAgICB9OwogIH0KCiAgU2VhcmNoQ3Vyc29yLnByb3RvdHlwZSA9IHsKICAgIGZpbmROZXh0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCF0aGlzLnZhbGlkKSByZXR1cm4gZmFsc2U7CiAgICAgIHRoaXMuYXRPY2N1cnJlbmNlID0gZmFsc2U7CiAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgIC8vIEdvIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudCBpZiB0aGUgY3VycmVudCBsaW5lIGlzCiAgICAgIC8vIG5vIGxvbmdlciBpbiB0aGUgRE9NIHRyZWUuCiAgICAgIGlmICh0aGlzLmxpbmUgJmFtcDsmYW1wOyAhdGhpcy5saW5lLnBhcmVudE5vZGUpIHsKICAgICAgICB0aGlzLmxpbmUgPSBudWxsOwogICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKICAgICAgfQoKICAgICAgLy8gU2V0IHRoZSBjdXJzb3IncyBwb3NpdGlvbiBvbmUgY2hhcmFjdGVyIGFmdGVyIHRoZSBnaXZlbgogICAgICAvLyBwb3NpdGlvbi4KICAgICAgZnVuY3Rpb24gc2F2ZUFmdGVyKHBvcykgewogICAgICAgIGlmIChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKHBvcy5ub2RlKS5sZW5ndGggJmx0OyBwb3Mub2Zmc2V0KSB7CiAgICAgICAgICBzZWxmLmxpbmUgPSBwb3Mubm9kZTsKICAgICAgICAgIHNlbGYub2Zmc2V0ID0gcG9zLm9mZnNldCArIDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgc2VsZi5saW5lID0gc2VsZi5oaXN0b3J5Lm5vZGVBZnRlcihwb3Mubm9kZSk7CiAgICAgICAgICBzZWxmLm9mZnNldCA9IDA7CiAgICAgICAgfQogICAgICB9CgogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIHZhciBtYXRjaCA9IHRoaXMubWF0Y2hlcygpOwogICAgICAgIC8vIEZvdW5kIHRoZSBzZWFyY2ggc3RyaW5nLgogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgdGhpcy5hdE9jY3VycmVuY2UgPSBtYXRjaDsKICAgICAgICAgIHNhdmVBZnRlcihtYXRjaC5mcm9tKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICB0aGlzLmxpbmUgPSB0aGlzLmhpc3Rvcnkubm9kZUFmdGVyKHRoaXMubGluZSk7CiAgICAgICAgdGhpcy5vZmZzZXQgPSAwOwogICAgICAgIC8vIEVuZCBvZiBkb2N1bWVudC4KICAgICAgICBpZiAoIXRoaXMubGluZSkgewogICAgICAgICAgdGhpcy52YWxpZCA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICBzZWxlY3Q6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5hdE9jY3VycmVuY2UpIHsKICAgICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKHRoaXMuZWRpdG9yLmNvbnRhaW5lciwgdGhpcy5hdE9jY3VycmVuY2UuZnJvbSwgdGhpcy5hdE9jY3VycmVuY2UudG8pOwogICAgICAgIHNlbGVjdC5zY3JvbGxUb0N1cnNvcih0aGlzLmVkaXRvci5jb250YWluZXIpOwogICAgICB9CiAgICB9LAoKICAgIHJlcGxhY2U6IGZ1bmN0aW9uKHN0cmluZykgewogICAgICBpZiAodGhpcy5hdE9jY3VycmVuY2UpIHsKICAgICAgICB2YXIgZW5kID0gdGhpcy5lZGl0b3IucmVwbGFjZVJhbmdlKHRoaXMuYXRPY2N1cnJlbmNlLmZyb20sIHRoaXMuYXRPY2N1cnJlbmNlLnRvLCBzdHJpbmcpOwogICAgICAgIHRoaXMubGluZSA9IGVuZC5ub2RlOwogICAgICAgIHRoaXMub2Zmc2V0ID0gZW5kLm9mZnNldDsKICAgICAgICB0aGlzLmF0T2NjdXJyZW5jZSA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgfTsKCiAgLy8gVGhlIEVkaXRvciBvYmplY3QgaXMgdGhlIG1haW4gaW5zaWRlLXRoZS1pZnJhbWUgaW50ZXJmYWNlLgogIGZ1bmN0aW9uIEVkaXRvcihvcHRpb25zKSB7CiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgd2luZG93LmluZGVudFVuaXQgPSBvcHRpb25zLmluZGVudFVuaXQ7CiAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgIHRoaXMuZG9jID0gZG9jdW1lbnQ7CiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jb250YWluZXIgPSB0aGlzLmRvYy5ib2R5OwogICAgdGhpcy53aW4gPSB3aW5kb3c7CiAgICB0aGlzLmhpc3RvcnkgPSBuZXcgSGlzdG9yeShjb250YWluZXIsIG9wdGlvbnMudW5kb0RlcHRoLCBvcHRpb25zLnVuZG9EZWxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG9wdGlvbnMub25DaGFuZ2UpOwogICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgIGlmICghRWRpdG9yLlBhcnNlcikKICAgICAgdGhyb3cgIk5vIHBhcnNlciBsb2FkZWQuIjsKICAgIGlmIChvcHRpb25zLnBhcnNlckNvbmZpZyAmYW1wOyZhbXA7IEVkaXRvci5QYXJzZXIuY29uZmlndXJlKQogICAgICBFZGl0b3IuUGFyc2VyLmNvbmZpZ3VyZShvcHRpb25zLnBhcnNlckNvbmZpZyk7CgogICAgaWYgKCFvcHRpb25zLnJlYWRPbmx5KQogICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKGNvbnRhaW5lciwge25vZGU6IG51bGwsIG9mZnNldDogMH0pOwoKICAgIHRoaXMuZGlydHkgPSBbXTsKICAgIGlmIChvcHRpb25zLmNvbnRlbnQpCiAgICAgIHRoaXMuaW1wb3J0Q29kZShvcHRpb25zLmNvbnRlbnQpOwogICAgZWxzZSAvLyBGRiBhY3RzIHdlaXJkIHdoZW4gdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGNvbXBsZXRlbHkgZW1wdHkKICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoIkJSIikpOwoKICAgIGlmICghb3B0aW9ucy5yZWFkT25seSkgewogICAgICBpZiAob3B0aW9ucy5jb250aW51b3VzU2Nhbm5pbmcgIT09IGZhbHNlKSB7CiAgICAgICAgdGhpcy5zY2FubmVyID0gdGhpcy5kb2N1bWVudFNjYW5uZXIob3B0aW9ucy5saW5lc1BlclBhc3MpOwogICAgICAgIHRoaXMuZGVsYXlTY2FubmluZygpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBzZXRFZGl0YWJsZSgpIHsKICAgICAgICAvLyBJbiBJRSwgZGVzaWduTW9kZSBmcmFtZXMgY2FuIG5vdCBydW4gYW55IHNjcmlwdHMsIHNvIHdlIHVzZQogICAgICAgIC8vIGNvbnRlbnRFZGl0YWJsZSBpbnN0ZWFkLgogICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRlbnRFZGl0YWJsZSAhPSB1bmRlZmluZWQgJmFtcDsmYW1wOyBpbnRlcm5ldEV4cGxvcmVyKQogICAgICAgICAgZG9jdW1lbnQuYm9keS5jb250ZW50RWRpdGFibGUgPSAidHJ1ZSI7CiAgICAgICAgZWxzZQogICAgICAgICAgZG9jdW1lbnQuZGVzaWduTW9kZSA9ICJvbiI7CgogICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5ib3JkZXJXaWR0aCA9ICIwIjsKICAgICAgICBpZiAoIW9wdGlvbnMudGV4dFdyYXBwaW5nKQogICAgICAgICAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSAibm93cmFwIjsKICAgICAgfQoKICAgICAgLy8gSWYgc2V0dGluZyB0aGUgZnJhbWUgZWRpdGFibGUgZmFpbHMsIHRyeSBhZ2FpbiB3aGVuIHRoZSB1c2VyCiAgICAgIC8vIGZvY3VzIGl0IChoYXBwZW5zIHdoZW4gdGhlIGZyYW1lIGlzIG5vdCB2aXNpYmxlIG9uCiAgICAgIC8vIGluaXRpYWxpc2F0aW9uLCBpbiBGaXJlZm94KS4KICAgICAgdHJ5IHsKICAgICAgICBzZXRFZGl0YWJsZSgpOwogICAgICB9CiAgICAgIGNhdGNoKGUpIHsKICAgICAgICB2YXIgZm9jdXNFdmVudCA9IGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudCwgImZvY3VzIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBmb2N1c0V2ZW50KCk7CiAgICAgICAgICBzZXRFZGl0YWJsZSgpOwogICAgICAgIH0sIHRydWUpOwogICAgICB9CgogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQsICJrZXlkb3duIiwgbWV0aG9kKHRoaXMsICJrZXlEb3duIikpOwogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQsICJrZXlwcmVzcyIsIG1ldGhvZCh0aGlzLCAia2V5UHJlc3MiKSk7CiAgICAgIGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudCwgImtleXVwIiwgbWV0aG9kKHRoaXMsICJrZXlVcCIpKTsKCiAgICAgIGZ1bmN0aW9uIGN1cnNvckFjdGl2aXR5KCkge3NlbGYuY3Vyc29yQWN0aXZpdHkoZmFsc2UpO30KICAgICAgYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LmJvZHksICJtb3VzZXVwIiwgY3Vyc29yQWN0aXZpdHkpOwogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQuYm9keSwgInBhc3RlIiwgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBjdXJzb3JBY3Rpdml0eSgpOwogICAgICAgIGlmIChpbnRlcm5ldEV4cGxvcmVyKSB7CiAgICAgICAgICB2YXIgdGV4dCA9IG51bGw7CiAgICAgICAgICB0cnkge3RleHQgPSB3aW5kb3cuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJUZXh0Iik7fWNhdGNoKGUpe30KICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKICAgICAgICAgICAgc2VsZi5yZXBsYWNlU2VsZWN0aW9uKHRleHQpOwogICAgICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUoc2VsZi5jb250YWluZXIsIHRydWUpLAogICAgICAgICAgICAgICAgc3RhcnQyID0gc3RhcnQgJmFtcDsmYW1wOyBzdGFydC5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzY3J1YlBhc3RlZChzZWxmLmNvbnRhaW5lciwgc3RhcnQsIHN0YXJ0Mik7fSwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LmJvZHksICJjdXQiLCBjdXJzb3JBY3Rpdml0eSk7CgogICAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9NYXRjaFBhcmVucykKICAgICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQuYm9keSwgImNsaWNrIiwgbWV0aG9kKHRoaXMsICJzY2hlZHVsZVBhcmVuQmxpbmsiKSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpc1NhZmVLZXkoY29kZSkgewogICAgcmV0dXJuIChjb2RlID49IDE2ICZhbXA7JmFtcDsgY29kZSAmbHQ7PSAxOCkgfHwgLy8gc2hpZnQsIGNvbnRyb2wsIGFsdAogICAgICAgICAgIChjb2RlID49IDMzICZhbXA7JmFtcDsgY29kZSAmbHQ7PSA0MCk7IC8vIGFycm93cywgaG9tZSwgZW5kCiAgfQoKICBFZGl0b3IucHJvdG90eXBlID0gewogICAgLy8gSW1wb3J0IGEgcGllY2Ugb2YgY29kZSBpbnRvIHRoZSBlZGl0b3IuCiAgICBpbXBvcnRDb2RlOiBmdW5jdGlvbihjb2RlKSB7CiAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKG51bGwsIG51bGwsIGFzRWRpdG9yTGluZXMoY29kZSkpOwogICAgICB0aGlzLmhpc3RvcnkucmVzZXQoKTsKICAgIH0sCgogICAgLy8gRXh0cmFjdCB0aGUgY29kZSBmcm9tIHRoZSBlZGl0b3IuCiAgICBnZXRDb2RlOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKQogICAgICAgIHJldHVybiAiIjsKCiAgICAgIHZhciBhY2N1bSA9IFtdOwogICAgICBzZWxlY3QubWFya1NlbGVjdGlvbih0aGlzLndpbik7CiAgICAgIGZvckVhY2godHJhdmVyc2VET00odGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCksIG1ldGhvZChhY2N1bSwgInB1c2giKSk7CiAgICAgIHdlYmtpdExhc3RMaW5lSGFjayh0aGlzLmNvbnRhaW5lcik7CiAgICAgIHNlbGVjdC5zZWxlY3RNYXJrZWQoKTsKICAgICAgcmV0dXJuIGNsZWFuVGV4dChhY2N1bS5qb2luKCIiKSk7CiAgICB9LAoKICAgIGNoZWNrTGluZTogZnVuY3Rpb24obm9kZSkgewogICAgICBpZiAobm9kZSA9PT0gZmFsc2UgfHwgIShub2RlID09IG51bGwgfHwgbm9kZS5wYXJlbnROb2RlID09IHRoaXMuY29udGFpbmVyKSkKICAgICAgICB0aHJvdyBwYXJlbnQuQ29kZU1pcnJvci5JbnZhbGlkTGluZUhhbmRsZTsKICAgIH0sCgogICAgY3Vyc29yUG9zaXRpb246IGZ1bmN0aW9uKHN0YXJ0KSB7CiAgICAgIGlmIChzdGFydCA9PSBudWxsKSBzdGFydCA9IHRydWU7CiAgICAgIHZhciBwb3MgPSBzZWxlY3QuY3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCBzdGFydCk7CiAgICAgIGlmIChwb3MpIHJldHVybiB7bGluZTogcG9zLm5vZGUsIGNoYXJhY3RlcjogcG9zLm9mZnNldH07CiAgICAgIGVsc2UgcmV0dXJuIHtsaW5lOiBudWxsLCBjaGFyYWN0ZXI6IDB9OwogICAgfSwKCiAgICBmaXJzdExpbmU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0sCgogICAgbGFzdExpbmU6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5jb250YWluZXIubGFzdENoaWxkKSByZXR1cm4gc3RhcnRPZkxpbmUodGhpcy5jb250YWluZXIubGFzdENoaWxkKTsKICAgICAgZWxzZSByZXR1cm4gbnVsbDsKICAgIH0sCgogICAgbmV4dExpbmU6IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdGhpcy5jaGVja0xpbmUobGluZSk7CiAgICAgIHZhciBlbmQgPSBlbmRPZkxpbmUobGluZSwgdGhpcy5jb250YWluZXIpOwogICAgICByZXR1cm4gZW5kIHx8IGZhbHNlOwogICAgfSwKCiAgICBwcmV2TGluZTogZnVuY3Rpb24obGluZSkgewogICAgICB0aGlzLmNoZWNrTGluZShsaW5lKTsKICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gc3RhcnRPZkxpbmUobGluZS5wcmV2aW91c1NpYmxpbmcpOwogICAgfSwKCiAgICBzZWxlY3RMaW5lczogZnVuY3Rpb24oc3RhcnRMaW5lLCBzdGFydE9mZnNldCwgZW5kTGluZSwgZW5kT2Zmc2V0KSB7CiAgICAgIHRoaXMuY2hlY2tMaW5lKHN0YXJ0TGluZSk7CiAgICAgIHZhciBzdGFydCA9IHtub2RlOiBzdGFydExpbmUsIG9mZnNldDogc3RhcnRPZmZzZXR9LCBlbmQgPSBudWxsOwogICAgICBpZiAoZW5kT2Zmc2V0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB0aGlzLmNoZWNrTGluZShlbmRMaW5lKTsKICAgICAgICBlbmQgPSB7bm9kZTogZW5kTGluZSwgb2Zmc2V0OiBlbmRPZmZzZXR9OwogICAgICB9CiAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHN0YXJ0LCBlbmQpOwogICAgICBzZWxlY3Quc2Nyb2xsVG9DdXJzb3IodGhpcy5jb250YWluZXIpOwogICAgfSwKCiAgICBsaW5lQ29udGVudDogZnVuY3Rpb24obGluZSkgewogICAgICB0aGlzLmNoZWNrTGluZShsaW5lKTsKICAgICAgdmFyIGFjY3VtID0gW107CiAgICAgIGZvciAobGluZSA9IGxpbmUgPyBsaW5lLm5leHRTaWJsaW5nIDogdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgICAgICBsaW5lICZhbXA7JmFtcDsgbGluZS5ub2RlTmFtZSAhPSAiQlIiOyBsaW5lID0gbGluZS5uZXh0U2libGluZykKICAgICAgICBhY2N1bS5wdXNoKG5vZGVUZXh0KGxpbmUpKTsKICAgICAgcmV0dXJuIGNsZWFuVGV4dChhY2N1bS5qb2luKCIiKSk7CiAgICB9LAoKICAgIHNldExpbmVDb250ZW50OiBmdW5jdGlvbihsaW5lLCBjb250ZW50KSB7CiAgICAgIHRoaXMuaGlzdG9yeS5jb21taXQoKTsKICAgICAgdGhpcy5yZXBsYWNlUmFuZ2Uoe25vZGU6IGxpbmUsIG9mZnNldDogMH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHtub2RlOiBsaW5lLCBvZmZzZXQ6IHRoaXMuaGlzdG9yeS50ZXh0QWZ0ZXIobGluZSkubGVuZ3RofSwKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCk7CiAgICAgIHRoaXMuYWRkRGlydHlOb2RlKGxpbmUpOwogICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICB9LAoKICAgIGluc2VydEludG9MaW5lOiBmdW5jdGlvbihsaW5lLCBwb3NpdGlvbiwgY29udGVudCkgewogICAgICB2YXIgYmVmb3JlID0gbnVsbDsKICAgICAgaWYgKHBvc2l0aW9uID09ICJlbmQiKSB7CiAgICAgICAgYmVmb3JlID0gZW5kT2ZMaW5lKGxpbmUsIHRoaXMuY29udGFpbmVyKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBmb3IgKHZhciBjdXIgPSBsaW5lID8gbGluZS5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7IGN1cjsgY3VyID0gY3VyLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICBpZiAocG9zaXRpb24gPT0gMCkgewogICAgICAgICAgICBiZWZvcmUgPSBjdXI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHRleHQgPSAoY3VyLmlubmVyVGV4dCB8fCBjdXIudGV4dENvbnRlbnQgfHwgY3VyLm5vZGVWYWx1ZSB8fCAiIik7CiAgICAgICAgICBpZiAodGV4dC5sZW5ndGggPiBwb3NpdGlvbikgewogICAgICAgICAgICBiZWZvcmUgPSBjdXIubmV4dFNpYmxpbmc7CiAgICAgICAgICAgIGNvbnRlbnQgPSB0ZXh0LnNsaWNlKDAsIHBvc2l0aW9uKSArIGNvbnRlbnQgKyB0ZXh0LnNsaWNlKHBvc2l0aW9uKTsKICAgICAgICAgICAgcmVtb3ZlRWxlbWVudChjdXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHBvc2l0aW9uIC09IHRleHQubGVuZ3RoOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIGxpbmVzID0gYXNFZGl0b3JMaW5lcyhjb250ZW50KSwgZG9jID0gdGhpcy5jb250YWluZXIub3duZXJEb2N1bWVudDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgJmx0OyBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChpID4gMCkgdGhpcy5jb250YWluZXIuaW5zZXJ0QmVmb3JlKGRvYy5jcmVhdGVFbGVtZW50KCJCUiIpLCBiZWZvcmUpOwogICAgICAgIHRoaXMuY29udGFpbmVyLmluc2VydEJlZm9yZShtYWtlUGFydFNwYW4obGluZXNbaV0sIGRvYyksIGJlZm9yZSk7CiAgICAgIH0KICAgICAgdGhpcy5hZGREaXJ0eU5vZGUobGluZSk7CiAgICAgIHRoaXMuc2NoZWR1bGVIaWdobGlnaHQoKTsKICAgIH0sCgogICAgLy8gUmV0cmlldmUgdGhlIHNlbGVjdGVkIHRleHQuCiAgICBzZWxlY3RlZFRleHQ6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgaCA9IHRoaXMuaGlzdG9yeTsKICAgICAgaC5jb21taXQoKTsKCiAgICAgIHZhciBzdGFydCA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHRydWUpLAogICAgICAgICAgZW5kID0gc2VsZWN0LmN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwgZmFsc2UpOwogICAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHJldHVybiAiIjsKCiAgICAgIGlmIChzdGFydC5ub2RlID09IGVuZC5ub2RlKQogICAgICAgIHJldHVybiBoLnRleHRBZnRlcihzdGFydC5ub2RlKS5zbGljZShzdGFydC5vZmZzZXQsIGVuZC5vZmZzZXQpOwoKICAgICAgdmFyIHRleHQgPSBbaC50ZXh0QWZ0ZXIoc3RhcnQubm9kZSkuc2xpY2Uoc3RhcnQub2Zmc2V0KV07CiAgICAgIGZvciAocG9zID0gaC5ub2RlQWZ0ZXIoc3RhcnQubm9kZSk7IHBvcyAhPSBlbmQubm9kZTsgcG9zID0gaC5ub2RlQWZ0ZXIocG9zKSkKICAgICAgICB0ZXh0LnB1c2goaC50ZXh0QWZ0ZXIocG9zKSk7CiAgICAgIHRleHQucHVzaChoLnRleHRBZnRlcihlbmQubm9kZSkuc2xpY2UoMCwgZW5kLm9mZnNldCkpOwogICAgICByZXR1cm4gY2xlYW5UZXh0KHRleHQuam9pbigiXG4iKSk7CiAgICB9LAoKICAgIC8vIFJlcGxhY2UgdGhlIHNlbGVjdGlvbiB3aXRoIGFub3RoZXIgcGllY2Ugb2YgdGV4dC4KICAgIHJlcGxhY2VTZWxlY3Rpb246IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgdGhpcy5oaXN0b3J5LmNvbW1pdCgpOwogICAgICB2YXIgc3RhcnQgPSBzZWxlY3QuY3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCB0cnVlKSwKICAgICAgICAgIGVuZCA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgaWYgKCFzdGFydCB8fCAhZW5kKSByZXR1cm47CgogICAgICBlbmQgPSB0aGlzLnJlcGxhY2VSYW5nZShzdGFydCwgZW5kLCB0ZXh0KTsKICAgICAgc2VsZWN0LnNldEN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwgc3RhcnQsIGVuZCk7CiAgICB9LAoKICAgIHJlcGxhY2VSYW5nZTogZnVuY3Rpb24oZnJvbSwgdG8sIHRleHQpIHsKICAgICAgdmFyIGxpbmVzID0gYXNFZGl0b3JMaW5lcyh0ZXh0KTsKICAgICAgbGluZXNbMF0gPSB0aGlzLmhpc3RvcnkudGV4dEFmdGVyKGZyb20ubm9kZSkuc2xpY2UoMCwgZnJvbS5vZmZzZXQpICsgbGluZXNbMF07CiAgICAgIHZhciBsYXN0TGluZSA9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdOwogICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9IGxhc3RMaW5lICsgdGhpcy5oaXN0b3J5LnRleHRBZnRlcih0by5ub2RlKS5zbGljZSh0by5vZmZzZXQpOwogICAgICB2YXIgZW5kID0gdGhpcy5oaXN0b3J5Lm5vZGVBZnRlcih0by5ub2RlKTsKICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZnJvbS5ub2RlLCBlbmQsIGxpbmVzKTsKICAgICAgcmV0dXJuIHtub2RlOiB0aGlzLmhpc3Rvcnkubm9kZUJlZm9yZShlbmQpLAogICAgICAgICAgICAgIG9mZnNldDogbGFzdExpbmUubGVuZ3RofTsKICAgIH0sCgogICAgZ2V0U2VhcmNoQ3Vyc29yOiBmdW5jdGlvbihzdHJpbmcsIGZyb21DdXJzb3IpIHsKICAgICAgcmV0dXJuIG5ldyBTZWFyY2hDdXJzb3IodGhpcywgc3RyaW5nLCBmcm9tQ3Vyc29yKTsKICAgIH0sCgogICAgLy8gUmUtaW5kZW50IHRoZSB3aG9sZSBidWZmZXIKICAgIHJlaW5kZW50OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgdGhpcy5pbmRlbnRSZWdpb24obnVsbCwgdGhpcy5jb250YWluZXIubGFzdENoaWxkKTsKICAgIH0sCgogICAgZ3JhYktleXM6IGZ1bmN0aW9uKGV2ZW50SGFuZGxlciwgZmlsdGVyKSB7CiAgICAgIHRoaXMuZnJvemVuID0gZXZlbnRIYW5kbGVyOwogICAgICB0aGlzLmtleUZpbHRlciA9IGZpbHRlcjsKICAgIH0sCiAgICB1bmdyYWJLZXlzOiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5mcm96ZW4gPSAibGVhdmUiOwogICAgICB0aGlzLmtleUZpbHRlciA9IG51bGw7CiAgICB9LAoKICAgIC8vIEludGVyY2VwdCBlbnRlciBhbmQgdGFiLCBhbmQgYXNzaWduIHRoZWlyIG5ldyBmdW5jdGlvbnMuCiAgICBrZXlEb3duOiBmdW5jdGlvbihldmVudCkgewogICAgICBpZiAodGhpcy5mcm96ZW4gPT0gImxlYXZlIikgdGhpcy5mcm96ZW4gPSBudWxsOwogICAgICBpZiAodGhpcy5mcm96ZW4gJmFtcDsmYW1wOyAoIXRoaXMua2V5RmlsdGVyIHx8IHRoaXMua2V5RmlsdGVyKGV2ZW50LmtleUNvZGUpKSkgewogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgICB0aGlzLmZyb3plbihldmVudCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB2YXIgY29kZSA9IGV2ZW50LmtleUNvZGU7CiAgICAgIC8vIERvbid0IHNjYW4gd2hlbiB0aGUgdXNlciBpcyB0eXBpbmcuCiAgICAgIHRoaXMuZGVsYXlTY2FubmluZygpOwogICAgICAvLyBTY2hlZHVsZSBhIHBhcmVuLWhpZ2hsaWdodCBldmVudCwgaWYgY29uZmlndXJlZC4KICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvTWF0Y2hQYXJlbnMpCiAgICAgICAgdGhpcy5zY2hlZHVsZVBhcmVuQmxpbmsoKTsKCiAgICAgIGlmIChjb2RlID09IDEzKSB7IC8vIGVudGVyCiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHsKICAgICAgICAgIHRoaXMucmVwYXJzZUJ1ZmZlcigpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHNlbGVjdC5pbnNlcnROZXdsaW5lQXRDdXJzb3IodGhpcy53aW4pOwogICAgICAgICAgdGhpcy5pbmRlbnRBdEN1cnNvcigpOwogICAgICAgICAgc2VsZWN0LnNjcm9sbFRvQ3Vyc29yKHRoaXMuY29udGFpbmVyKTsKICAgICAgICB9CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gOSAmYW1wOyZhbXA7IHRoaXMub3B0aW9ucy50YWJNb2RlICE9ICJkZWZhdWx0IikgeyAvLyB0YWIKICAgICAgICB0aGlzLmhhbmRsZVRhYighZXZlbnQuY3RybEtleSAmYW1wOyZhbXA7ICFldmVudC5zaGlmdEtleSk7CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMzIgJmFtcDsmYW1wOyBldmVudC5zaGlmdEtleSAmYW1wOyZhbXA7IHRoaXMub3B0aW9ucy50YWJNb2RlID09ICJkZWZhdWx0IikgeyAvLyBzcGFjZQogICAgICAgIHRoaXMuaGFuZGxlVGFiKHRydWUpOwogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmICgoY29kZSA9PSAyMTkgfHwgY29kZSA9PSAyMjEpICZhbXA7JmFtcDsgZXZlbnQuY3RybEtleSkgewogICAgICAgIHRoaXMuYmxpbmtQYXJlbnMoZXZlbnQuc2hpZnRLZXkpOwogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmIChldmVudC5tZXRhS2V5ICZhbXA7JmFtcDsgKGNvZGUgPT0gMzcgfHwgY29kZSA9PSAzOSkpIHsgLy8gTWV0YS1sZWZ0L3JpZ2h0CiAgICAgICAgdmFyIGN1cnNvciA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyKTsKICAgICAgICBpZiAoY3Vyc29yID09PSBmYWxzZSB8fCAhdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCkgcmV0dXJuOwoKICAgICAgICBpZiAoY29kZSA9PSAzNykgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlKHN0YXJ0T2ZMaW5lKGN1cnNvciksIHRoaXMuY29udGFpbmVyKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGVuZCA9IGVuZE9mTGluZShjdXJzb3IsIHRoaXMuY29udGFpbmVyKTsKICAgICAgICAgIHNlbGVjdC5mb2N1c0FmdGVyTm9kZShlbmQgPyBlbmQucHJldmlvdXNTaWJsaW5nIDogdGhpcy5jb250YWluZXIubGFzdENoaWxkLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgfQogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHsKICAgICAgICBpZiAoKGV2ZW50LnNoaWZ0S2V5ICZhbXA7JmFtcDsgY29kZSA9PSA5MCkgfHwgY29kZSA9PSA4OSkgeyAvLyBzaGlmdC1aLCBZCiAgICAgICAgICBzZWxlY3Quc2Nyb2xsVG9Ob2RlKHRoaXMuaGlzdG9yeS5yZWRvKCkpOwogICAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjb2RlID09IDkwIHx8IGNvZGUgPT0gOCkgeyAvLyBaLCBiYWNrc3BhY2UKICAgICAgICAgIHNlbGVjdC5zY3JvbGxUb05vZGUodGhpcy5oaXN0b3J5LnVuZG8oKSk7CiAgICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNvZGUgPT0gODMgJmFtcDsmYW1wOyB0aGlzLm9wdGlvbnMuc2F2ZUZ1bmN0aW9uKSB7IC8vIFMKICAgICAgICAgIHRoaXMub3B0aW9ucy5zYXZlRnVuY3Rpb24oKTsKICAgICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLy8gQ2hlY2sgZm9yIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgcmUtaW5kZW50IHRoZSBjdXJyZW50IGxpbmUsCiAgICAvLyBhbmQgcHJldmVudCBPcGVyYSBmcm9tIGhhbmRsaW5nIGVudGVyIGFuZCB0YWIgYW55d2F5LgogICAga2V5UHJlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIHZhciBlbGVjdHJpYyA9IC9pbmRlbnR8ZGVmYXVsdC8udGVzdCh0aGlzLm9wdGlvbnMudGFiTW9kZSkgJmFtcDsmYW1wOyBFZGl0b3IuUGFyc2VyLmVsZWN0cmljQ2hhcnM7CiAgICAgIC8vIEhhY2sgZm9yIE9wZXJhLCBhbmQgRmlyZWZveCBvbiBPUyBYLCBpbiB3aGljaCBzdG9wcGluZyBhCiAgICAgIC8vIGtleWRvd24gZXZlbnQgZG9lcyBub3QgcHJldmVudCB0aGUgYXNzb2NpYXRlZCBrZXlwcmVzcyBldmVudAogICAgICAvLyBmcm9tIGhhcHBlbmluZywgc28gd2UgaGF2ZSB0byBjYW5jZWwgZW50ZXIgYW5kIHRhYiBhZ2FpbgogICAgICAvLyBoZXJlLgogICAgICBpZiAoKHRoaXMuZnJvemVuICZhbXA7JmFtcDsgKCF0aGlzLmtleUZpbHRlciB8fCB0aGlzLmtleUZpbHRlcihldmVudC5rZXlDb2RlKSkpIHx8CiAgICAgICAgICBldmVudC5jb2RlID09IDEzIHx8IChldmVudC5jb2RlID09IDkgJmFtcDsmYW1wOyB0aGlzLm9wdGlvbnMudGFiTW9kZSAhPSAiZGVmYXVsdCIpIHx8CiAgICAgICAgICAoZXZlbnQua2V5Q29kZSA9PSAzMiAmYW1wOyZhbXA7IGV2ZW50LnNoaWZ0S2V5ICZhbXA7JmFtcDsgdGhpcy5vcHRpb25zLnRhYk1vZGUgPT0gImRlZmF1bHQiKSkKICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgIGVsc2UgaWYgKGVsZWN0cmljICZhbXA7JmFtcDsgZWxlY3RyaWMuaW5kZXhPZihldmVudC5jaGFyYWN0ZXIpICE9IC0xKQogICAgICAgIHRoaXMucGFyZW50LnNldFRpbWVvdXQobWV0aG9kKHRoaXMsICJpbmRlbnRBdEN1cnNvciIpLCAwKTsKICAgIH0sCgogICAgLy8gTWFyayB0aGUgbm9kZSBhdCB0aGUgY3Vyc29yIGRpcnR5IHdoZW4gYSBub24tc2FmZSBrZXkgaXMKICAgIC8vIHJlbGVhc2VkLgogICAga2V5VXA6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIHRoaXMuY3Vyc29yQWN0aXZpdHkoaXNTYWZlS2V5KGV2ZW50LmtleUNvZGUpKTsKICAgIH0sCgogICAgLy8gSW5kZW50IHRoZSBsaW5lIGZvbGxvd2luZyBhIGdpdmVuICZsdDticj4sIG9yIG51bGwgZm9yIHRoZSBmaXJzdAogICAgLy8gbGluZS4gSWYgZ2l2ZW4gYSAmbHQ7YnI+IGVsZW1lbnQsIHRoaXMgbXVzdCBoYXZlIGJlZW4gaGlnaGxpZ2h0ZWQKICAgIC8vIHNvIHRoYXQgaXQgaGFzIGFuIGluZGVudGF0aW9uIG1ldGhvZC4gUmV0dXJucyB0aGUgd2hpdGVzcGFjZQogICAgLy8gZWxlbWVudCB0aGF0IGhhcyBiZWVuIG1vZGlmaWVkIG9yIGNyZWF0ZWQgKGlmIGFueSkuCiAgICBpbmRlbnRMaW5lQWZ0ZXI6IGZ1bmN0aW9uKHN0YXJ0LCBkaXJlY3Rpb24pIHsKICAgICAgLy8gd2hpdGVTcGFjZSBpcyB0aGUgd2hpdGVzcGFjZSBzcGFuIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSwKICAgICAgLy8gb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIG5vZGUuCiAgICAgIHZhciB3aGl0ZVNwYWNlID0gc3RhcnQgPyBzdGFydC5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgIGlmICh3aGl0ZVNwYWNlICZhbXA7JmFtcDsgIWhhc0NsYXNzKHdoaXRlU3BhY2UsICJ3aGl0ZXNwYWNlIikpCiAgICAgICAgd2hpdGVTcGFjZSA9IG51bGw7CgogICAgICAvLyBTb21ldGltZXMgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGNhbiBpbmZsdWVuY2UgdGhlIGNvcnJlY3QKICAgICAgLy8gaW5kZW50YXRpb24sIHNvIHdlIHJldHJpZXZlIGl0LgogICAgICB2YXIgZmlyc3RUZXh0ID0gd2hpdGVTcGFjZSA/IHdoaXRlU3BhY2UubmV4dFNpYmxpbmcgOiAoc3RhcnQgPyBzdGFydC5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpOwogICAgICB2YXIgbmV4dENoYXJzID0gKHN0YXJ0ICZhbXA7JmFtcDsgZmlyc3RUZXh0ICZhbXA7JmFtcDsgZmlyc3RUZXh0LmN1cnJlbnRUZXh0KSA/IGZpcnN0VGV4dC5jdXJyZW50VGV4dCA6ICIiOwoKICAgICAgLy8gQXNrIHRoZSBsZXhpY2FsIGNvbnRleHQgZm9yIHRoZSBjb3JyZWN0IGluZGVudGF0aW9uLCBhbmQKICAgICAgLy8gY29tcHV0ZSBob3cgbXVjaCB0aGlzIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCBpbmRlbnRhdGlvbi4KICAgICAgdmFyIG5ld0luZGVudCA9IDAsIGN1ckluZGVudCA9IHdoaXRlU3BhY2UgPyB3aGl0ZVNwYWNlLmN1cnJlbnRUZXh0Lmxlbmd0aCA6IDA7CiAgICAgIGlmIChkaXJlY3Rpb24gIT0gbnVsbCAmYW1wOyZhbXA7IHRoaXMub3B0aW9ucy50YWJNb2RlID09ICJzaGlmdCIpCiAgICAgICAgbmV3SW5kZW50ID0gZGlyZWN0aW9uID8gY3VySW5kZW50ICsgaW5kZW50VW5pdCA6IE1hdGgubWF4KDAsIGN1ckluZGVudCAtIGluZGVudFVuaXQpCiAgICAgIGVsc2UgaWYgKHN0YXJ0KQogICAgICAgIG5ld0luZGVudCA9IHN0YXJ0LmluZGVudGF0aW9uKG5leHRDaGFycywgY3VySW5kZW50LCBkaXJlY3Rpb24pOwogICAgICBlbHNlIGlmIChFZGl0b3IuUGFyc2VyLmZpcnN0SW5kZW50YXRpb24pCiAgICAgICAgbmV3SW5kZW50ID0gRWRpdG9yLlBhcnNlci5maXJzdEluZGVudGF0aW9uKG5leHRDaGFycywgY3VySW5kZW50LCBkaXJlY3Rpb24pOwogICAgICB2YXIgaW5kZW50RGlmZiA9IG5ld0luZGVudCAtIGN1ckluZGVudDsKCiAgICAgIC8vIElmIHRoZXJlIGlzIHRvbyBtdWNoLCB0aGlzIGlzIGp1c3QgYSBtYXR0ZXIgb2Ygc2hyaW5raW5nIGEgc3Bhbi4KICAgICAgaWYgKGluZGVudERpZmYgJmx0OyAwKSB7CiAgICAgICAgaWYgKG5ld0luZGVudCA9PSAwKSB7CiAgICAgICAgICBpZiAoZmlyc3RUZXh0KSBzZWxlY3Quc25hcHNob3RNb3ZlKHdoaXRlU3BhY2UuZmlyc3RDaGlsZCwgZmlyc3RUZXh0LmZpcnN0Q2hpbGQsIDApOwogICAgICAgICAgcmVtb3ZlRWxlbWVudCh3aGl0ZVNwYWNlKTsKICAgICAgICAgIHdoaXRlU3BhY2UgPSBudWxsOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHNlbGVjdC5zbmFwc2hvdE1vdmUod2hpdGVTcGFjZS5maXJzdENoaWxkLCB3aGl0ZVNwYWNlLmZpcnN0Q2hpbGQsIGluZGVudERpZmYsIHRydWUpOwogICAgICAgICAgd2hpdGVTcGFjZS5jdXJyZW50VGV4dCA9IG1ha2VXaGl0ZVNwYWNlKG5ld0luZGVudCk7CiAgICAgICAgICB3aGl0ZVNwYWNlLmZpcnN0Q2hpbGQubm9kZVZhbHVlID0gd2hpdGVTcGFjZS5jdXJyZW50VGV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gTm90IGVub3VnaC4uLgogICAgICBlbHNlIGlmIChpbmRlbnREaWZmID4gMCkgewogICAgICAgIC8vIElmIHRoZXJlIGlzIHdoaXRlc3BhY2UsIHdlIGdyb3cgaXQuCiAgICAgICAgaWYgKHdoaXRlU3BhY2UpIHsKICAgICAgICAgIHdoaXRlU3BhY2UuY3VycmVudFRleHQgPSBtYWtlV2hpdGVTcGFjZShuZXdJbmRlbnQpOwogICAgICAgICAgd2hpdGVTcGFjZS5maXJzdENoaWxkLm5vZGVWYWx1ZSA9IHdoaXRlU3BhY2UuY3VycmVudFRleHQ7CiAgICAgICAgfQogICAgICAgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBhZGQgYSBuZXcgd2hpdGVzcGFjZSBub2RlLgogICAgICAgIGVsc2UgewogICAgICAgICAgd2hpdGVTcGFjZSA9IG1ha2VQYXJ0U3BhbihtYWtlV2hpdGVTcGFjZShuZXdJbmRlbnQpLCB0aGlzLmRvYyk7CiAgICAgICAgICB3aGl0ZVNwYWNlLmNsYXNzTmFtZSA9ICJ3aGl0ZXNwYWNlIjsKICAgICAgICAgIGlmIChzdGFydCkgaW5zZXJ0QWZ0ZXIod2hpdGVTcGFjZSwgc3RhcnQpOwogICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUod2hpdGVTcGFjZSwgdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCk7CiAgICAgICAgfQogICAgICAgIGlmIChmaXJzdFRleHQpIHNlbGVjdC5zbmFwc2hvdE1vdmUoZmlyc3RUZXh0LmZpcnN0Q2hpbGQsIHdoaXRlU3BhY2UuZmlyc3RDaGlsZCwgY3VySW5kZW50LCBmYWxzZSwgdHJ1ZSk7CiAgICAgIH0KICAgICAgaWYgKGluZGVudERpZmYgIT0gMCkgdGhpcy5hZGREaXJ0eU5vZGUoc3RhcnQpOwogICAgICByZXR1cm4gd2hpdGVTcGFjZTsKICAgIH0sCgogICAgLy8gUmUtaGlnaGxpZ2h0IHRoZSBzZWxlY3RlZCBwYXJ0IG9mIHRoZSBkb2N1bWVudC4KICAgIGhpZ2hsaWdodEF0Q3Vyc29yOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHBvcyA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCB0cnVlKTsKICAgICAgdmFyIHRvID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgaWYgKHBvcyA9PT0gZmFsc2UgfHwgdG8gPT09IGZhbHNlKSByZXR1cm47CgogICAgICBzZWxlY3QubWFya1NlbGVjdGlvbih0aGlzLndpbik7CiAgICAgIGlmICh0aGlzLmhpZ2hsaWdodChwb3MsIGVuZE9mTGluZSh0bywgdGhpcy5jb250YWluZXIpLCB0cnVlLCAyMCkgPT09IGZhbHNlKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgc2VsZWN0LnNlbGVjdE1hcmtlZCgpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0sCgogICAgLy8gV2hlbiB0YWIgaXMgcHJlc3NlZCB3aXRoIHRleHQgc2VsZWN0ZWQsIHRoZSB3aG9sZSBzZWxlY3Rpb24gaXMKICAgIC8vIHJlLWluZGVudGVkLCB3aGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQsIHRoZSBsaW5lIHdpdGggdGhlIGN1cnNvcgogICAgLy8gaXMgcmUtaW5kZW50ZWQuCiAgICBoYW5kbGVUYWI6IGZ1bmN0aW9uKGRpcmVjdGlvbikgewogICAgICBpZiAodGhpcy5vcHRpb25zLnRhYk1vZGUgPT0gInNwYWNlcyIpIHsKICAgICAgICBzZWxlY3QuaW5zZXJ0VGFiQXRDdXJzb3IodGhpcy53aW4pOwogICAgICB9CiAgICAgIGVsc2UgaWYgKCFzZWxlY3Quc29tZXRoaW5nU2VsZWN0ZWQodGhpcy53aW4pKSB7CiAgICAgICAgdGhpcy5pbmRlbnRBdEN1cnNvcihkaXJlY3Rpb24pOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHZhciBzdGFydCA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCB0cnVlKSwKICAgICAgICAgICAgZW5kID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgICBpZiAoc3RhcnQgPT09IGZhbHNlIHx8IGVuZCA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgICB0aGlzLmluZGVudFJlZ2lvbihzdGFydCwgZW5kLCBkaXJlY3Rpb24pOwogICAgICB9CiAgICB9LAoKICAgIC8vIERlbGF5IChvciBpbml0aWF0ZSkgdGhlIG5leHQgcGFyZW4gYmxpbmsgZXZlbnQuCiAgICBzY2hlZHVsZVBhcmVuQmxpbms6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5wYXJlbkV2ZW50KSB0aGlzLnBhcmVudC5jbGVhclRpbWVvdXQodGhpcy5wYXJlbkV2ZW50KTsKICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICB0aGlzLnBhcmVuRXZlbnQgPSB0aGlzLnBhcmVudC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VsZi5ibGlua1BhcmVucygpO30sIDMwMCk7CiAgICB9LAoKICAgIC8vIFRha2UgdGhlIHRva2VuIGJlZm9yZSB0aGUgY3Vyc29yLiBJZiBpdCBjb250YWlucyBhIGNoYXJhY3RlciBpbgogICAgLy8gJygpW117fScsIHNlYXJjaCBmb3IgdGhlIG1hdGNoaW5nIHBhcmVuL2JyYWNlL2JyYWNrZXQsIGFuZAogICAgLy8gaGlnaGxpZ2h0IHRoZW0gaW4gZ3JlZW4gZm9yIGEgbW9tZW50LCBvciByZWQgaWYgbm8gcHJvcGVyIG1hdGNoCiAgICAvLyB3YXMgZm91bmQuCiAgICBibGlua1BhcmVuczogZnVuY3Rpb24oanVtcCkgewogICAgICAvLyBDbGVhciB0aGUgZXZlbnQgcHJvcGVydHkuCiAgICAgIGlmICh0aGlzLnBhcmVuRXZlbnQpIHRoaXMucGFyZW50LmNsZWFyVGltZW91dCh0aGlzLnBhcmVuRXZlbnQpOwogICAgICB0aGlzLnBhcmVuRXZlbnQgPSBudWxsOwoKICAgICAgLy8gRXh0cmFjdCBhICdwYXJlbicgZnJvbSBhIHBpZWNlIG9mIHRleHQuCiAgICAgIGZ1bmN0aW9uIHBhcmVuKG5vZGUpIHsKICAgICAgICBpZiAobm9kZS5jdXJyZW50VGV4dCkgewogICAgICAgICAgdmFyIG1hdGNoID0gbm9kZS5jdXJyZW50VGV4dC5tYXRjaCgvXltcc1x1MDBhMF0qKFtcKFwpXFtcXXt9XSlbXHNcdTAwYTBdKiQvKTsKICAgICAgICAgIHJldHVybiBtYXRjaCAmYW1wOyZhbXA7IG1hdGNoWzFdOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBEZXRlcm1pbmUgdGhlIGRpcmVjdGlvbiBhIHBhcmVuIGlzIGZhY2luZy4KICAgICAgZnVuY3Rpb24gZm9yd2FyZChjaCkgewogICAgICAgIHJldHVybiAvW1woXFtce10vLnRlc3QoY2gpOwogICAgICB9CgogICAgICB2YXIgY2gsIHNlbGYgPSB0aGlzLCBjdXJzb3IgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgdHJ1ZSk7CiAgICAgIGlmICghY3Vyc29yIHx8ICF0aGlzLmhpZ2hsaWdodEF0Q3Vyc29yKCkpIHJldHVybjsKICAgICAgY3Vyc29yID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIHRydWUpOwogICAgICBpZiAoIShjdXJzb3IgJmFtcDsmYW1wOyAoKGNoID0gcGFyZW4oY3Vyc29yKSkgfHwgKGN1cnNvciA9IGN1cnNvci5uZXh0U2libGluZykgJmFtcDsmYW1wOyAoY2ggPSBwYXJlbihjdXJzb3IpKSkpKQogICAgICAgIHJldHVybjsKICAgICAgLy8gV2Ugb25seSBsb29rIGZvciB0b2tlbnMgd2l0aCB0aGUgc2FtZSBjbGFzc05hbWUuCiAgICAgIHZhciBjbGFzc05hbWUgPSBjdXJzb3IuY2xhc3NOYW1lLCBkaXIgPSBmb3J3YXJkKGNoKSwgbWF0Y2ggPSBtYXRjaGluZ1tjaF07CgogICAgICAvLyBTaW5jZSBwYXJ0cyBvZiB0aGUgZG9jdW1lbnQgbWlnaHQgbm90IGhhdmUgYmVlbiBwcm9wZXJseQogICAgICAvLyBoaWdobGlnaHRlZCwgYW5kIGl0IGlzIGhhcmQgdG8ga25vdyBpbiBhZHZhbmNlIHdoaWNoIHBhcnQgd2UKICAgICAgLy8gaGF2ZSB0byBzY2FuLCB3ZSBqdXN0IHRyeSwgYW5kIHdoZW4gd2UgZmluZCBkaXJ0eSBub2RlcyB3ZQogICAgICAvLyBhYm9ydCwgcGFyc2UgdGhlbSwgYW5kIHJlLXRyeS4KICAgICAgZnVuY3Rpb24gdHJ5RmluZE1hdGNoKCkgewogICAgICAgIHZhciBzdGFjayA9IFtdLCBjaCwgb2sgPSB0cnVlOzsKICAgICAgICBmb3IgKHZhciBydW5uZXIgPSBjdXJzb3I7IHJ1bm5lcjsgcnVubmVyID0gZGlyID8gcnVubmVyLm5leHRTaWJsaW5nIDogcnVubmVyLnByZXZpb3VzU2libGluZykgewogICAgICAgICAgaWYgKHJ1bm5lci5jbGFzc05hbWUgPT0gY2xhc3NOYW1lICZhbXA7JmFtcDsgcnVubmVyLm5vZGVOYW1lID09ICJTUEFOIiAmYW1wOyZhbXA7IChjaCA9IHBhcmVuKHJ1bm5lcikpKSB7CiAgICAgICAgICAgIGlmIChmb3J3YXJkKGNoKSA9PSBkaXIpCiAgICAgICAgICAgICAgc3RhY2sucHVzaChjaCk7CiAgICAgICAgICAgIGVsc2UgaWYgKCFzdGFjay5sZW5ndGgpCiAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKICAgICAgICAgICAgZWxzZSBpZiAoc3RhY2sucG9wKCkgIT0gbWF0Y2hpbmdbY2hdKQogICAgICAgICAgICAgIG9rID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKHJ1bm5lci5kaXJ0eSB8fCBydW5uZXIubm9kZU5hbWUgIT0gIlNQQU4iICZhbXA7JmFtcDsgcnVubmVyLm5vZGVOYW1lICE9ICJCUiIpIHsKICAgICAgICAgICAgcmV0dXJuIHtub2RlOiBydW5uZXIsIHN0YXR1czogImRpcnR5In07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7bm9kZTogcnVubmVyLCBzdGF0dXM6IHJ1bm5lciAmYW1wOyZhbXA7IG9rfTsKICAgICAgfQogICAgICAvLyBUZW1wb3JhcmlseSBnaXZlIHRoZSByZWxldmFudCBub2RlcyBhIGNvbG91ci4KICAgICAgZnVuY3Rpb24gYmxpbmsobm9kZSwgb2spIHsKICAgICAgICBub2RlLnN0eWxlLmZvbnRXZWlnaHQgPSAiYm9sZCI7CiAgICAgICAgbm9kZS5zdHlsZS5jb2xvciA9IG9rID8gIiM4RjgiIDogIiNGODgiOwogICAgICAgIHNlbGYucGFyZW50LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7bm9kZS5zdHlsZS5mb250V2VpZ2h0ID0gIiI7IG5vZGUuc3R5bGUuY29sb3IgPSAiIjt9LCA1MDApOwogICAgICB9CgogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIHZhciBmb3VuZCA9IHRyeUZpbmRNYXRjaCgpOwogICAgICAgIGlmIChmb3VuZC5zdGF0dXMgPT0gImRpcnR5IikgewogICAgICAgICAgdGhpcy5oaWdobGlnaHQoZm91bmQubm9kZSwgMSk7CiAgICAgICAgICAvLyBOZWVkZWQgYmVjYXVzZSBpbiBzb21lIGNvcm5lciBjYXNlcyBhIGhpZ2hsaWdodCBkb2VzIG5vdAogICAgICAgICAgLy8gcmVhY2ggYSBub2RlLgogICAgICAgICAgZm91bmQubm9kZS5kaXJ0eSA9IGZhbHNlOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgYmxpbmsoY3Vyc29yLCBmb3VuZC5zdGF0dXMpOwogICAgICAgICAgaWYgKGZvdW5kLm5vZGUpIHsKICAgICAgICAgICAgYmxpbmsoZm91bmQubm9kZSwgZm91bmQuc3RhdHVzKTsKICAgICAgICAgICAgaWYgKGp1bXApIHNlbGVjdC5mb2N1c0FmdGVyTm9kZShmb3VuZC5ub2RlLnByZXZpb3VzU2libGluZywgdGhpcy5jb250YWluZXIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIC8vIEFkanVzdCB0aGUgYW1vdW50IG9mIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIHRoYXQKICAgIC8vIHRoZSBjdXJzb3IgaXMgb24gc28gdGhhdCBpdCBpcyBpbmRlbnRlZCBwcm9wZXJseS4KICAgIGluZGVudEF0Q3Vyc29yOiBmdW5jdGlvbihkaXJlY3Rpb24pIHsKICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKSByZXR1cm47CiAgICAgIC8vIFRoZSBsaW5lIGhhcyB0byBoYXZlIHVwLXRvLWRhdGUgbGV4aWNhbCBpbmZvcm1hdGlvbiwgc28gd2UKICAgICAgLy8gaGlnaGxpZ2h0IGl0IGZpcnN0LgogICAgICBpZiAoIXRoaXMuaGlnaGxpZ2h0QXRDdXJzb3IoKSkgcmV0dXJuOwogICAgICB2YXIgY3Vyc29yID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgLy8gSWYgd2UgY291bGRuJ3QgZGV0ZXJtaW5lIHRoZSBwbGFjZSBvZiB0aGUgY3Vyc29yLAogICAgICAvLyB0aGVyZSdzIG5vdGhpbmcgdG8gaW5kZW50LgogICAgICBpZiAoY3Vyc29yID09PSBmYWxzZSkKICAgICAgICByZXR1cm47CiAgICAgIHZhciBsaW5lU3RhcnQgPSBzdGFydE9mTGluZShjdXJzb3IpOwogICAgICB2YXIgd2hpdGVTcGFjZSA9IHRoaXMuaW5kZW50TGluZUFmdGVyKGxpbmVTdGFydCwgZGlyZWN0aW9uKTsKICAgICAgaWYgKGN1cnNvciA9PSBsaW5lU3RhcnQgJmFtcDsmYW1wOyB3aGl0ZVNwYWNlKQogICAgICAgICAgY3Vyc29yID0gd2hpdGVTcGFjZTsKICAgICAgLy8gVGhpcyBtZWFucyB0aGUgaW5kZW50YXRpb24gaGFzIHByb2JhYmx5IG1lc3NlZCB1cCB0aGUgY3Vyc29yLgogICAgICBpZiAoY3Vyc29yID09IHdoaXRlU3BhY2UpCiAgICAgICAgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlKGN1cnNvciwgdGhpcy5jb250YWluZXIpOwogICAgfSwKCiAgICAvLyBJbmRlbnQgYWxsIGxpbmVzIHdob3NlIHN0YXJ0IGZhbGxzIGluc2lkZSBvZiB0aGUgY3VycmVudAogICAgLy8gc2VsZWN0aW9uLgogICAgaW5kZW50UmVnaW9uOiBmdW5jdGlvbihzdGFydCwgZW5kLCBkaXJlY3Rpb24pIHsKICAgICAgdmFyIGN1cnJlbnQgPSAoc3RhcnQgPSBzdGFydE9mTGluZShzdGFydCkpLCBiZWZvcmUgPSBzdGFydCAmYW1wOyZhbXA7IHN0YXJ0T2ZMaW5lKHN0YXJ0LnByZXZpb3VzU2libGluZyk7CiAgICAgIGlmIChlbmQubm9kZU5hbWUgIT0gIkJSIikgZW5kID0gZW5kT2ZMaW5lKGVuZCwgdGhpcy5jb250YWluZXIpOwoKICAgICAgZG8gewogICAgICAgIGlmIChjdXJyZW50KSB0aGlzLmhpZ2hsaWdodChiZWZvcmUsIGN1cnJlbnQsIHRydWUpOwogICAgICAgIHRoaXMuaW5kZW50TGluZUFmdGVyKGN1cnJlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgYmVmb3JlID0gY3VycmVudDsKICAgICAgICBjdXJyZW50ID0gZW5kT2ZMaW5lKGN1cnJlbnQsIHRoaXMuY29udGFpbmVyKTsKICAgICAgfSB3aGlsZSAoY3VycmVudCAhPSBlbmQpOwogICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCB7bm9kZTogc3RhcnQsIG9mZnNldDogMH0sIHtub2RlOiBlbmQsIG9mZnNldDogMH0pOwogICAgfSwKCiAgICAvLyBGaW5kIHRoZSBub2RlIHRoYXQgdGhlIGN1cnNvciBpcyBpbiwgbWFyayBpdCBhcyBkaXJ0eSwgYW5kIG1ha2UKICAgIC8vIHN1cmUgYSBoaWdobGlnaHQgcGFzcyBpcyBzY2hlZHVsZWQuCiAgICBjdXJzb3JBY3Rpdml0eTogZnVuY3Rpb24oc2FmZSkgewogICAgICBpZiAoaW50ZXJuZXRFeHBsb3JlcikgewogICAgICAgIHRoaXMuY29udGFpbmVyLmNyZWF0ZVRleHRSYW5nZSgpLmV4ZWNDb21tYW5kKCJ1bmxpbmsiKTsKICAgICAgICB0aGlzLnNlbGVjdGlvblNuYXBzaG90ID0gc2VsZWN0LnNlbGVjdGlvbkNvb3Jkcyh0aGlzLndpbik7CiAgICAgIH0KCiAgICAgIHZhciBhY3Rpdml0eSA9IHRoaXMub3B0aW9ucy5jdXJzb3JBY3Rpdml0eTsKICAgICAgaWYgKCFzYWZlIHx8IGFjdGl2aXR5KSB7CiAgICAgICAgdmFyIGN1cnNvciA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCBmYWxzZSk7CiAgICAgICAgaWYgKGN1cnNvciA9PT0gZmFsc2UgfHwgIXRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpIHJldHVybjsKICAgICAgICBjdXJzb3IgPSBjdXJzb3IgfHwgdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgICBpZiAoYWN0aXZpdHkpIGFjdGl2aXR5KGN1cnNvcik7CiAgICAgICAgaWYgKCFzYWZlKSB7CiAgICAgICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICAgICAgICB0aGlzLmFkZERpcnR5Tm9kZShjdXJzb3IpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICByZXBhcnNlQnVmZmVyOiBmdW5jdGlvbigpIHsKICAgICAgZm9yRWFjaCh0aGlzLmNvbnRhaW5lci5jaGlsZE5vZGVzLCBmdW5jdGlvbihub2RlKSB7bm9kZS5kaXJ0eSA9IHRydWU7fSk7CiAgICAgIGlmICh0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKQogICAgICAgIHRoaXMuYWRkRGlydHlOb2RlKHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpOwogICAgfSwKCiAgICAvLyBBZGQgYSBub2RlIHRvIHRoZSBzZXQgb2YgZGlydHkgbm9kZXMsIGlmIGl0IGlzbid0IGFscmVhZHkgaW4KICAgIC8vIHRoZXJlLgogICAgYWRkRGlydHlOb2RlOiBmdW5jdGlvbihub2RlKSB7CiAgICAgIG5vZGUgPSBub2RlIHx8IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgIGlmICghbm9kZSkgcmV0dXJuOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgJmx0OyB0aGlzLmRpcnR5Lmxlbmd0aDsgaSsrKQogICAgICAgIGlmICh0aGlzLmRpcnR5W2ldID09IG5vZGUpIHJldHVybjsKCiAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDMpCiAgICAgICAgbm9kZS5kaXJ0eSA9IHRydWU7CiAgICAgIHRoaXMuZGlydHkucHVzaChub2RlKTsKICAgIH0sCgogICAgLy8gQ2F1c2UgYSBoaWdobGlnaHQgcGFzcyB0byBoYXBwZW4gaW4gb3B0aW9ucy5wYXNzRGVsYXkKICAgIC8vIG1pbGxpc2Vjb25kcy4gQ2xlYXIgdGhlIGV4aXN0aW5nIHRpbWVvdXQsIGlmIG9uZSBleGlzdHMuIFRoaXMKICAgIC8vIHdheSwgdGhlIHBhc3NlcyBkbyBub3QgaGFwcGVuIHdoaWxlIHRoZSB1c2VyIGlzIHR5cGluZywgYW5kCiAgICAvLyBzaG91bGQgYXMgdW5vYnRydXNpdmUgYXMgcG9zc2libGUuCiAgICBzY2hlZHVsZUhpZ2hsaWdodDogZnVuY3Rpb24oKSB7CiAgICAgIC8vIFRpbWVvdXRzIGFyZSByb3V0ZWQgdGhyb3VnaCB0aGUgcGFyZW50IHdpbmRvdywgYmVjYXVzZSBvbgogICAgICAvLyBzb21lIGJyb3dzZXJzIGRlc2lnbk1vZGUgd2luZG93cyBkbyBub3QgZmlyZSB0aW1lb3V0cy4KICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICB0aGlzLnBhcmVudC5jbGVhclRpbWVvdXQodGhpcy5oaWdobGlnaHRUaW1lb3V0KTsKICAgICAgdGhpcy5oaWdobGlnaHRUaW1lb3V0ID0gdGhpcy5wYXJlbnQuc2V0VGltZW91dChmdW5jdGlvbigpe3NlbGYuaGlnaGxpZ2h0RGlydHkoKTt9LCB0aGlzLm9wdGlvbnMucGFzc0RlbGF5KTsKICAgIH0sCgogICAgLy8gRmV0Y2ggb25lIGRpcnR5IG5vZGUsIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZGlydHkgc2V0LgogICAgZ2V0RGlydHlOb2RlOiBmdW5jdGlvbigpIHsKICAgICAgd2hpbGUgKHRoaXMuZGlydHkubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBmb3VuZCA9IHRoaXMuZGlydHkucG9wKCk7CiAgICAgICAgLy8gSUU4IHNvbWV0aW1lcyB0aHJvd3MgYW4gdW5leHBsYWluYWJsZSAnaW52YWxpZCBhcmd1bWVudCcKICAgICAgICAvLyBleGNlcHRpb24gZm9yIGZvdW5kLnBhcmVudE5vZGUKICAgICAgICB0cnkgewogICAgICAgICAgLy8gSWYgdGhlIG5vZGUgaGFzIGJlZW4gY29sb3VyZWQgaW4gdGhlIG1lYW50aW1lLCBvciBpcyBubwogICAgICAgICAgLy8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCwgaXQgc2hvdWxkIG5vdCBiZSByZXR1cm5lZC4KICAgICAgICAgIHdoaWxlIChmb3VuZCAmYW1wOyZhbXA7IGZvdW5kLnBhcmVudE5vZGUgIT0gdGhpcy5jb250YWluZXIpCiAgICAgICAgICAgIGZvdW5kID0gZm91bmQucGFyZW50Tm9kZQogICAgICAgICAgaWYgKGZvdW5kICZhbXA7JmFtcDsgKGZvdW5kLmRpcnR5IHx8IGZvdW5kLm5vZGVUeXBlID09IDMpKQogICAgICAgICAgICByZXR1cm4gZm91bmQ7CiAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0sCgogICAgLy8gUGljayBkaXJ0eSBub2RlcywgYW5kIGhpZ2hsaWdodCB0aGVtLCB1bnRpbAogICAgLy8gb3B0aW9ucy5saW5lc1BlclBhc3MgbGluZXMgaGF2ZSBiZWVuIGhpZ2hsaWdodGVkLiBUaGUgaGlnaGxpZ2h0CiAgICAvLyBtZXRob2Qgd2lsbCBjb250aW51ZSB0byBuZXh0IGxpbmVzIGFzIGxvbmcgYXMgaXQgZmluZHMgZGlydHkKICAgIC8vIG5vZGVzLiBJdCByZXR1cm5zIGFuIG9iamVjdCBpbmRpY2F0aW5nIHRoZSBhbW91bnQgb2YgbGluZXMKICAgIC8vIGxlZnQsIGFuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGxhY2Ugd2hlcmUgaXQgc3RvcHBlZC4gSWYKICAgIC8vIHRoZXJlIGFyZSBkaXJ0eSBub2RlcyBsZWZ0IGFmdGVyIHRoaXMgZnVuY3Rpb24gaGFzIHNwZW50IGFsbAogICAgLy8gaXRzIGxpbmVzLCBpdCBzaGVkdWxlcyBhbm90aGVyIGhpZ2hsaWdodCB0byBmaW5pc2ggdGhlIGpvYi4KICAgIGhpZ2hsaWdodERpcnR5OiBmdW5jdGlvbihmb3JjZSkgewogICAgICAvLyBQcmV2ZW50IEZGIGZyb20gcmFpc2luZyBhbiBlcnJvciB3aGVuIGl0IGlzIGZpcmluZyB0aW1lb3V0cwogICAgICAvLyBvbiBhIHBhZ2UgdGhhdCdzIG5vIGxvbmdlciBsb2FkZWQuCiAgICAgIGlmICghd2luZG93LnNlbGVjdCkgcmV0dXJuOwoKICAgICAgdmFyIGxpbmVzID0gZm9yY2UgPyBJbmZpbml0eSA6IHRoaXMub3B0aW9ucy5saW5lc1BlclBhc3M7CiAgICAgIGlmICghdGhpcy5vcHRpb25zLnJlYWRPbmx5KSBzZWxlY3QubWFya1NlbGVjdGlvbih0aGlzLndpbik7CiAgICAgIHZhciBzdGFydDsKICAgICAgd2hpbGUgKGxpbmVzID4gMCAmYW1wOyZhbXA7IChzdGFydCA9IHRoaXMuZ2V0RGlydHlOb2RlKCkpKXsKICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5oaWdobGlnaHQoc3RhcnQsIGxpbmVzKTsKICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICBsaW5lcyA9IHJlc3VsdC5sZWZ0OwogICAgICAgICAgaWYgKHJlc3VsdC5ub2RlICZhbXA7JmFtcDsgcmVzdWx0LmRpcnR5KQogICAgICAgICAgICB0aGlzLmFkZERpcnR5Tm9kZShyZXN1bHQubm9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdGhpcy5vcHRpb25zLnJlYWRPbmx5KSBzZWxlY3Quc2VsZWN0TWFya2VkKCk7CiAgICAgIGlmIChzdGFydCkKICAgICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICAgIHJldHVybiB0aGlzLmRpcnR5Lmxlbmd0aCA9PSAwOwogICAgfSwKCiAgICAvLyBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQgdGhyb3VnaCBhIHRpbWVvdXQsIHdpbGwKICAgIC8vIGNvbnRpbnVvdXNseSByZS1wYXJzZSB0aGUgZG9jdW1lbnQuCiAgICBkb2N1bWVudFNjYW5uZXI6IGZ1bmN0aW9uKGxpbmVzUGVyKSB7CiAgICAgIHZhciBzZWxmID0gdGhpcywgcG9zID0gbnVsbDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIC8vIElmIHRoZSBjdXJyZW50IG5vZGUgaXMgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudC4uLiBvaAogICAgICAgIC8vIHdlbGwsIHdlIHN0YXJ0IG92ZXIuCiAgICAgICAgaWYgKHBvcyAmYW1wOyZhbXA7IHBvcy5wYXJlbnROb2RlICE9IHNlbGYuY29udGFpbmVyKQogICAgICAgICAgcG9zID0gbnVsbDsKICAgICAgICBzZWxlY3QubWFya1NlbGVjdGlvbihzZWxmLndpbik7CiAgICAgICAgdmFyIHJlc3VsdCA9IHNlbGYuaGlnaGxpZ2h0KHBvcywgbGluZXNQZXIsIHRydWUpOwogICAgICAgIHNlbGVjdC5zZWxlY3RNYXJrZWQoKTsKICAgICAgICB2YXIgbmV3UG9zID0gcmVzdWx0ID8gKHJlc3VsdC5ub2RlICZhbXA7JmFtcDsgcmVzdWx0Lm5vZGUubmV4dFNpYmxpbmcpIDogbnVsbDsKICAgICAgICBwb3MgPSAocG9zID09IG5ld1BvcykgPyBudWxsIDogbmV3UG9zOwogICAgICAgIHNlbGYuZGVsYXlTY2FubmluZygpOwogICAgICB9OwogICAgfSwKCiAgICAvLyBTdGFydHMgdGhlIGNvbnRpbnVvdXMgc2Nhbm5pbmcgcHJvY2VzcyBmb3IgdGhpcyBkb2N1bWVudCBhZnRlcgogICAgLy8gYSBnaXZlbiBpbnRlcnZhbC4KICAgIGRlbGF5U2Nhbm5pbmc6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5zY2FubmVyKSB7CiAgICAgICAgdGhpcy5wYXJlbnQuY2xlYXJUaW1lb3V0KHRoaXMuZG9jdW1lbnRTY2FuKTsKICAgICAgICB0aGlzLmRvY3VtZW50U2NhbiA9IHRoaXMucGFyZW50LnNldFRpbWVvdXQodGhpcy5zY2FubmVyLCB0aGlzLm9wdGlvbnMuY29udGludW91c1NjYW5uaW5nKTsKICAgICAgfQogICAgfSwKCiAgICAvLyBUaGUgZnVuY3Rpb24gdGhhdCBkb2VzIHRoZSBhY3R1YWwgaGlnaGxpZ2h0aW5nL2NvbG91cmluZyAod2l0aAogICAgLy8gaGVscCBmcm9tIHRoZSBwYXJzZXIgYW5kIHRoZSBET00gbm9ybWFsaXplcikuIEl0cyBpbnRlcmZhY2UgaXMKICAgIC8vIHJhdGhlciBvdmVyY29tcGxpY2F0ZWQsIGJlY2F1c2UgaXQgaXMgdXNlZCBpbiBkaWZmZXJlbnQKICAgIC8vIHNpdHVhdGlvbnM6IGVuc3VyaW5nIHRoYXQgYSBjZXJ0YWluIGxpbmUgaXMgaGlnaGxpZ2h0ZWQsIG9yCiAgICAvLyBoaWdobGlnaHRpbmcgdXAgdG8gWCBsaW5lcyBzdGFydGluZyBmcm9tIGEgY2VydGFpbiBwb2ludC4gVGhlCiAgICAvLyAnZnJvbScgYXJndW1lbnQgZ2l2ZXMgdGhlIG5vZGUgYXQgd2hpY2ggaXQgc2hvdWxkIHN0YXJ0LiBJZgogICAgLy8gdGhpcyBpcyBudWxsLCBpdCB3aWxsIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50LgogICAgLy8gV2hlbiBhIG51bWJlciBvZiBsaW5lcyBpcyBnaXZlbiB3aXRoIHRoZSAndGFyZ2V0JyBhcmd1bWVudCwgaXQKICAgIC8vIHdpbGwgaGlnaGxpZ2h0IG5vIG1vcmUgdGhhbiB0aGF0IGFtb3VudCBvZiBsaW5lcy4gSWYgdGhpcwogICAgLy8gYXJndW1lbnQgaG9sZHMgYSBET00gbm9kZSwgaXQgd2lsbCBoaWdobGlnaHQgdW50aWwgaXQgcmVhY2hlcwogICAgLy8gdGhhdCBub2RlLiBJZiBhdCBhbnkgdGltZSBpdCBjb21lcyBhY3Jvc3MgYSAnY2xlYW4nIGxpbmUgKG5vCiAgICAvLyBkaXJ0eSBub2RlcyksIGl0IHdpbGwgc3RvcCwgZXhjZXB0IHdoZW4gJ2NsZWFuTGluZXMnIGlzIHRydWUuCiAgICBoaWdobGlnaHQ6IGZ1bmN0aW9uKGZyb20sIHRhcmdldCwgY2xlYW5MaW5lcywgbWF4QmFja3RyYWNrKXsKICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLCBzZWxmID0gdGhpcywgYWN0aXZlID0gdGhpcy5vcHRpb25zLmFjdGl2ZVRva2VuczsKICAgICAgdmFyIGxpbmVzID0gKHR5cGVvZiB0YXJnZXQgPT0gIm51bWJlciIgPyB0YXJnZXQgOiBudWxsKTsKCiAgICAgIGlmICghY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgcmV0dXJuOwogICAgICAvLyBCYWNrdHJhY2sgdG8gdGhlIGZpcnN0IG5vZGUgYmVmb3JlIGZyb20gdGhhdCBoYXMgYSBwYXJ0aWFsCiAgICAgIC8vIHBhcnNlIHN0b3JlZC4KICAgICAgd2hpbGUgKGZyb20gJmFtcDsmYW1wOyAoIWZyb20ucGFyc2VyRnJvbUhlcmUgfHwgZnJvbS5kaXJ0eSkpIHsKICAgICAgICBmcm9tID0gZnJvbS5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgaWYgKG1heEJhY2t0cmFjayAhPSBudWxsICZhbXA7JmFtcDsgZnJvbS5ub2RlTmFtZSA9PSAiQlIiICZhbXA7JmFtcDsgKC0tbWF4QmFja3RyYWNrKSAmbHQ7IDApCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgLy8gSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LCBkbyBub3RoaW5nLgogICAgICBpZiAoZnJvbSAmYW1wOyZhbXA7ICFmcm9tLm5leHRTaWJsaW5nKQogICAgICAgIHJldHVybjsKCiAgICAgIC8vIENoZWNrIHdoZXRoZXIgYSBwYXJ0ICgmbHQ7c3Bhbj4gbm9kZSkgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHRva2VuCiAgICAgIC8vIG1hdGNoLgogICAgICBmdW5jdGlvbiBjb3JyZWN0UGFydCh0b2tlbiwgcGFydCl7CiAgICAgICAgcmV0dXJuICFwYXJ0LnJlZHVjZWQgJmFtcDsmYW1wOyBwYXJ0LmN1cnJlbnRUZXh0ID09IHRva2VuLnZhbHVlICZhbXA7JmFtcDsgcGFydC5jbGFzc05hbWUgPT0gdG9rZW4uc3R5bGU7CiAgICAgIH0KICAgICAgLy8gU2hvcnRlbiB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0IGJ5IGNob3BwaW5nIG9mZgogICAgICAvLyBjaGFyYWN0ZXJzIGZyb20gdGhlIGZyb250LiBOb3RlIHRoYXQgb25seSB0aGUgY3VycmVudFRleHQKICAgICAgLy8gcHJvcGVydHkgZ2V0cyBjaGFuZ2VkLiBGb3IgZWZmaWNpZW5jeSByZWFzb25zLCB3ZSBsZWF2ZSB0aGUKICAgICAgLy8gbm9kZVZhbHVlIGFsb25lIC0tIHdlIHNldCB0aGUgcmVkdWNlZCBmbGFnIHRvIGluZGljYXRlIHRoYXQKICAgICAgLy8gdGhpcyBwYXJ0IG11c3QgYmUgcmVwbGFjZWQuCiAgICAgIGZ1bmN0aW9uIHNob3J0ZW5QYXJ0KHBhcnQsIG1pbnVzKXsKICAgICAgICBwYXJ0LmN1cnJlbnRUZXh0ID0gcGFydC5jdXJyZW50VGV4dC5zdWJzdHJpbmcobWludXMpOwogICAgICAgIHBhcnQucmVkdWNlZCA9IHRydWU7CiAgICAgIH0KICAgICAgLy8gQ3JlYXRlIGEgcGFydCBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gdG9rZW4uCiAgICAgIGZ1bmN0aW9uIHRva2VuUGFydCh0b2tlbil7CiAgICAgICAgdmFyIHBhcnQgPSBtYWtlUGFydFNwYW4odG9rZW4udmFsdWUsIHNlbGYuZG9jKTsKICAgICAgICBwYXJ0LmNsYXNzTmFtZSA9IHRva2VuLnN0eWxlOwogICAgICAgIHJldHVybiBwYXJ0OwogICAgICB9CgogICAgICBmdW5jdGlvbiBtYXliZVRvdWNoKG5vZGUpIHsKICAgICAgICBpZiAobm9kZSkgewogICAgICAgICAgaWYgKG5vZGUubmV4dFNpYmxpbmcgIT0gbm9kZS5vbGROZXh0U2libGluZykgewogICAgICAgICAgICBzZWxmLmhpc3RvcnkudG91Y2gobm9kZSk7CiAgICAgICAgICAgIG5vZGUub2xkTmV4dFNpYmxpbmcgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGlmIChzZWxmLmNvbnRhaW5lci5maXJzdENoaWxkICE9IHNlbGYuY29udGFpbmVyLm9sZEZpcnN0Q2hpbGQpIHsKICAgICAgICAgICAgc2VsZi5oaXN0b3J5LnRvdWNoKG5vZGUpOwogICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5vbGRGaXJzdENoaWxkID0gc2VsZi5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIEdldCB0aGUgdG9rZW4gc3RyZWFtLiBJZiBmcm9tIGlzIG51bGwsIHdlIHN0YXJ0IHdpdGggYSBuZXcKICAgICAgLy8gcGFyc2VyIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZSwgb3RoZXJ3aXNlIGEgcGFydGlhbCBwYXJzZQogICAgICAvLyBpcyByZXN1bWVkLgogICAgICB2YXIgdHJhdmVyc2FsID0gdHJhdmVyc2VET00oZnJvbSA/IGZyb20ubmV4dFNpYmxpbmcgOiBjb250YWluZXIuZmlyc3RDaGlsZCksCiAgICAgICAgICBzdHJlYW0gPSBzdHJpbmdTdHJlYW0odHJhdmVyc2FsKSwKICAgICAgICAgIHBhcnNlZCA9IGZyb20gPyBmcm9tLnBhcnNlckZyb21IZXJlKHN0cmVhbSkgOiBFZGl0b3IuUGFyc2VyLm1ha2Uoc3RyZWFtKTsKCiAgICAgIC8vIHBhcnRzIGlzIGFuIGludGVyZmFjZSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvICdkZWxheScgZmV0Y2hpbmcKICAgICAgLy8gdGhlIG5leHQgRE9NIG5vZGUgdW50aWwgd2UgYXJlIGNvbXBsZXRlbHkgZG9uZSB3aXRoIHRoZSBvbmUKICAgICAgLy8gYmVmb3JlIGl0LiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9mdGVuIHRoZSBuZXh0IG5vZGUgaXMKICAgICAgLy8gbm90IHlldCBhdmFpbGFibGUgd2hlbiB3ZSB3YW50IHRvIHByb2NlZWQgcGFzdCB0aGUgY3VycmVudAogICAgICAvLyBvbmUuCiAgICAgIHZhciBwYXJ0cyA9IHsKICAgICAgICBjdXJyZW50OiBudWxsLAogICAgICAgIC8vIEZldGNoIGN1cnJlbnQgbm9kZS4KICAgICAgICBnZXQ6IGZ1bmN0aW9uKCl7CiAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudCkKICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdHJhdmVyc2FsLm5vZGVzLnNoaWZ0KCk7CiAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50OwogICAgICAgIH0sCiAgICAgICAgLy8gQWR2YW5jZSB0byB0aGUgbmV4dCBwYXJ0IChkbyBub3QgZmV0Y2ggaXQgeWV0KS4KICAgICAgICBuZXh0OiBmdW5jdGlvbigpewogICAgICAgICAgdGhpcy5jdXJyZW50ID0gbnVsbDsKICAgICAgICB9LAogICAgICAgIC8vIFJlbW92ZSB0aGUgY3VycmVudCBwYXJ0IGZyb20gdGhlIERPTSB0cmVlLCBhbmQgbW92ZSB0byB0aGUKICAgICAgICAvLyBuZXh0LgogICAgICAgIHJlbW92ZTogZnVuY3Rpb24oKXsKICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLmdldCgpKTsKICAgICAgICAgIHRoaXMuY3VycmVudCA9IG51bGw7CiAgICAgICAgfSwKICAgICAgICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHBhcnQgdGhhdCBpcyBub3QgZW1wdHksIGRpc2NhcmRpbmcgZW1wdHkKICAgICAgICAvLyBwYXJ0cy4KICAgICAgICBnZXROb25FbXB0eTogZnVuY3Rpb24oKXsKICAgICAgICAgIHZhciBwYXJ0ID0gdGhpcy5nZXQoKTsKICAgICAgICAgIC8vIEFsbG93IGVtcHR5IG5vZGVzIHdoZW4gdGhleSBhcmUgYWxvbmUgb24gYSBsaW5lLCBuZWVkZWQKICAgICAgICAgIC8vIGZvciB0aGUgRkYgY3Vyc29yIGJ1ZyB3b3JrYXJvdW5kIChzZWUgc2VsZWN0LmpzLAogICAgICAgICAgLy8gaW5zZXJ0TmV3bGluZUF0Q3Vyc29yKS4KICAgICAgICAgIHdoaWxlIChwYXJ0ICZhbXA7JmFtcDsgcGFydC5ub2RlTmFtZSA9PSAiU1BBTiIgJmFtcDsmYW1wOyBwYXJ0LmN1cnJlbnRUZXh0ID09ICIiKSB7CiAgICAgICAgICAgIHZhciBvbGQgPSBwYXJ0OwogICAgICAgICAgICB0aGlzLnJlbW92ZSgpOwogICAgICAgICAgICBwYXJ0ID0gdGhpcy5nZXQoKTsKICAgICAgICAgICAgLy8gQWRqdXN0IHNlbGVjdGlvbiBpbmZvcm1hdGlvbiwgaWYgYW55LiBTZWUgc2VsZWN0LmpzIGZvciBkZXRhaWxzLgogICAgICAgICAgICBzZWxlY3Quc25hcHNob3RNb3ZlKG9sZC5maXJzdENoaWxkLCBwYXJ0ICZhbXA7JmFtcDsgKHBhcnQuZmlyc3RDaGlsZCB8fCBwYXJ0KSwgMCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcGFydDsKICAgICAgICB9CiAgICAgIH07CgogICAgICB2YXIgbGluZURpcnR5ID0gZmFsc2UsIHByZXZMaW5lRGlydHkgPSB0cnVlLCBsaW5lTm9kZXMgPSAwOwoKICAgICAgLy8gVGhpcyBmb3JFYWNoIGxvb3BzIG92ZXIgdGhlIHRva2VucyBmcm9tIHRoZSBwYXJzZWQgc3RyZWFtLCBhbmQKICAgICAgLy8gYXQgdGhlIHNhbWUgdGltZSB1c2VzIHRoZSBwYXJ0cyBvYmplY3QgdG8gcHJvY2VlZCB0aHJvdWdoIHRoZQogICAgICAvLyBjb3JyZXNwb25kaW5nIERPTSBub2Rlcy4KICAgICAgZm9yRWFjaChwYXJzZWQsIGZ1bmN0aW9uKHRva2VuKXsKICAgICAgICB2YXIgcGFydCA9IHBhcnRzLmdldE5vbkVtcHR5KCk7CgogICAgICAgIGlmICh0b2tlbi52YWx1ZSA9PSAiXG4iKXsKICAgICAgICAgIC8vIFRoZSBpZGVhIG9mIHRoZSB0d28gc3RyZWFtcyBhY3R1YWxseSBzdGF5aW5nIHN5bmNocm9uaXplZAogICAgICAgICAgLy8gaXMgc3VjaCBhIGxvbmcgc2hvdCB0aGF0IHdlIGV4cGxpY2l0bHkgY2hlY2suCiAgICAgICAgICBpZiAocGFydC5ub2RlTmFtZSAhPSAiQlIiKQogICAgICAgICAgICB0aHJvdyAiUGFyc2VyIG91dCBvZiBzeW5jLiBFeHBlY3RlZCBCUi4iOwoKICAgICAgICAgIGlmIChwYXJ0LmRpcnR5IHx8ICFwYXJ0LmluZGVudGF0aW9uKSBsaW5lRGlydHkgPSB0cnVlOwogICAgICAgICAgbWF5YmVUb3VjaChmcm9tKTsKICAgICAgICAgIGZyb20gPSBwYXJ0OwoKICAgICAgICAgIC8vIEV2ZXJ5ICZsdDticj4gZ2V0cyBhIGNvcHkgb2YgdGhlIHBhcnNlciBzdGF0ZSBhbmQgYSBsZXhpY2FsCiAgICAgICAgICAvLyBjb250ZXh0IGFzc2lnbmVkIHRvIGl0LiBUaGUgZmlyc3QgaXMgdXNlZCB0byBiZSBhYmxlIHRvCiAgICAgICAgICAvLyBsYXRlciByZXN1bWUgcGFyc2luZyBmcm9tIHRoaXMgcG9pbnQsIHRoZSBzZWNvbmQgaXMgdXNlZAogICAgICAgICAgLy8gZm9yIGluZGVudGF0aW9uLgogICAgICAgICAgcGFydC5wYXJzZXJGcm9tSGVyZSA9IHBhcnNlZC5jb3B5KCk7CiAgICAgICAgICBwYXJ0LmluZGVudGF0aW9uID0gdG9rZW4uaW5kZW50YXRpb247CiAgICAgICAgICBwYXJ0LmRpcnR5ID0gZmFsc2U7CgogICAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBhcmd1bWVudCB3YXNuJ3QgYW4gaW50ZWdlciwgZ28gYXQgbGVhc3QKICAgICAgICAgIC8vIHVudGlsIHRoYXQgbm9kZS4KICAgICAgICAgIGlmIChsaW5lcyA9PSBudWxsICZhbXA7JmFtcDsgcGFydCA9PSB0YXJnZXQpIHRocm93IFN0b3BJdGVyYXRpb247CgogICAgICAgICAgLy8gQSBjbGVhbiBsaW5lIHdpdGggbW9yZSB0aGFuIG9uZSBub2RlIG1lYW5zIHdlIGFyZSBkb25lLgogICAgICAgICAgLy8gVGhyb3dpbmcgYSBTdG9wSXRlcmF0aW9uIGlzIHRoZSB3YXkgdG8gYnJlYWsgb3V0IG9mIGEKICAgICAgICAgIC8vIE1vY2hpS2l0IGZvckVhY2ggbG9vcC4KICAgICAgICAgIGlmICgobGluZXMgIT0gbnVsbCAmYW1wOyZhbXA7IC0tbGluZXMgJmx0Oz0gMCkgfHwgKCFsaW5lRGlydHkgJmFtcDsmYW1wOyAhcHJldkxpbmVEaXJ0eSAmYW1wOyZhbXA7IGxpbmVOb2RlcyA+IDEgJmFtcDsmYW1wOyAhY2xlYW5MaW5lcykpCiAgICAgICAgICAgIHRocm93IFN0b3BJdGVyYXRpb247CiAgICAgICAgICBwcmV2TGluZURpcnR5ID0gbGluZURpcnR5OyBsaW5lRGlydHkgPSBmYWxzZTsgbGluZU5vZGVzID0gMDsKICAgICAgICAgIHBhcnRzLm5leHQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBpZiAocGFydC5ub2RlTmFtZSAhPSAiU1BBTiIpCiAgICAgICAgICAgIHRocm93ICJQYXJzZXIgb3V0IG9mIHN5bmMuIEV4cGVjdGVkIFNQQU4uIjsKICAgICAgICAgIGlmIChwYXJ0LmRpcnR5KQogICAgICAgICAgICBsaW5lRGlydHkgPSB0cnVlOwogICAgICAgICAgbGluZU5vZGVzKys7CgogICAgICAgICAgLy8gSWYgdGhlIHBhcnQgbWF0Y2hlcyB0aGUgdG9rZW4sIHdlIGNhbiBsZWF2ZSBpdCBhbG9uZS4KICAgICAgICAgIGlmIChjb3JyZWN0UGFydCh0b2tlbiwgcGFydCkpewogICAgICAgICAgICBwYXJ0LmRpcnR5ID0gZmFsc2U7CiAgICAgICAgICAgIHBhcnRzLm5leHQoKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBmaXggaXQuCiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbGluZURpcnR5ID0gdHJ1ZTsKICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBjb3JyZWN0IHBhcnQuCiAgICAgICAgICAgIHZhciBuZXdQYXJ0ID0gdG9rZW5QYXJ0KHRva2VuKTsKICAgICAgICAgICAgY29udGFpbmVyLmluc2VydEJlZm9yZShuZXdQYXJ0LCBwYXJ0KTsKICAgICAgICAgICAgaWYgKGFjdGl2ZSkgYWN0aXZlKG5ld1BhcnQsIHRva2VuLCBzZWxmKTsKICAgICAgICAgICAgdmFyIHRva2Vuc2l6ZSA9IHRva2VuLnZhbHVlLmxlbmd0aDsKICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7CiAgICAgICAgICAgIC8vIEVhdCB1cCBwYXJ0cyB1bnRpbCB0aGUgdGV4dCBmb3IgdGhpcyB0b2tlbiBoYXMgYmVlbgogICAgICAgICAgICAvLyByZW1vdmVkLCBhZGp1c3RpbmcgdGhlIHN0b3JlZCBzZWxlY3Rpb24gaW5mbyAoc2VlCiAgICAgICAgICAgIC8vIHNlbGVjdC5qcykgaW4gdGhlIHByb2Nlc3MuCiAgICAgICAgICAgIHdoaWxlICh0b2tlbnNpemUgPiAwKSB7CiAgICAgICAgICAgICAgcGFydCA9IHBhcnRzLmdldCgpOwogICAgICAgICAgICAgIHZhciBwYXJ0c2l6ZSA9IHBhcnQuY3VycmVudFRleHQubGVuZ3RoOwogICAgICAgICAgICAgIHNlbGVjdC5zbmFwc2hvdFJlcGxhY2VOb2RlKHBhcnQuZmlyc3RDaGlsZCwgbmV3UGFydC5maXJzdENoaWxkLCB0b2tlbnNpemUsIG9mZnNldCk7CiAgICAgICAgICAgICAgaWYgKHBhcnRzaXplID4gdG9rZW5zaXplKXsKICAgICAgICAgICAgICAgIHNob3J0ZW5QYXJ0KHBhcnQsIHRva2Vuc2l6ZSk7CiAgICAgICAgICAgICAgICB0b2tlbnNpemUgPSAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRva2Vuc2l6ZSAtPSBwYXJ0c2l6ZTsKICAgICAgICAgICAgICAgIG9mZnNldCArPSBwYXJ0c2l6ZTsKICAgICAgICAgICAgICAgIHBhcnRzLnJlbW92ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIG1heWJlVG91Y2goZnJvbSk7CiAgICAgIHdlYmtpdExhc3RMaW5lSGFjayh0aGlzLmNvbnRhaW5lcik7CgogICAgICAvLyBUaGUgZnVuY3Rpb24gcmV0dXJucyBzb21lIHN0YXR1cyBpbmZvcm1hdGlvbiB0aGF0IGlzIHVzZWQgYnkKICAgICAgLy8gaGlnaHRsaWdodERpcnR5IHRvIGRldGVybWluZSB3aGV0aGVyIGFuZCB3aGVyZSBpdCBoYXMgdG8KICAgICAgLy8gY29udGludWUuCiAgICAgIHJldHVybiB7bGVmdDogbGluZXMsCiAgICAgICAgICAgICAgbm9kZTogcGFydHMuZ2V0Tm9uRW1wdHkoKSwKICAgICAgICAgICAgICBkaXJ0eTogbGluZURpcnR5fTsKICAgIH0KICB9OwoKICByZXR1cm4gRWRpdG9yOwp9KSgpOwoKICBhZGRFdmVudEhhbmRsZXIod2luZG93LCAibG9hZCIsIGZ1bmN0aW9uKCkgewogICAgICB2YXIgQ29kZU1pcnJvciA9IHdpbmRvdy5mcmFtZUVsZW1lbnQuQ29kZU1pcnJvcjsKICAgICAgQ29kZU1pcnJvci5lZGl0b3IgPSBuZXcgRWRpdG9yKENvZGVNaXJyb3Iub3B0aW9ucyk7CiAgICAgIHRoaXMucGFyZW50LnNldFRpbWVvdXQobWV0aG9kKENvZGVNaXJyb3IsICJpbml0IiksIDApOwogIH0pOwo8L3RleHRhcmVhPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICB2YXIgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29kZScpOwogIHZhciBlZGl0b3IgPSBuZXcgQ29kZU1pcnJvcihDb2RlTWlycm9yLnJlcGxhY2UodGV4dGFyZWEpLCB7CiAgICBoZWlnaHQ6ICI3NTBweCIsCiAgICB3aWR0aDogIjEwMCUiLAogICAgY29udGVudDogdGV4dGFyZWEudmFsdWUsCiAgICBwYXJzZXJmaWxlOiBbInRva2VuaXplamF2YXNjcmlwdC5qcyIsICJwYXJzZWphdmFzY3JpcHQuanMiXSwKICAgIHN0eWxlc2hlZXQ6ICJjc3MvanNjb2xvcnMuY3NzIiwKICAgIHBhdGg6ICJqcy8iLAogICAgYXV0b01hdGNoUGFyZW5zOiB0cnVlLAogICAgaW5pdENhbGxiYWNrOiBmdW5jdGlvbihlZGl0b3Ipe2VkaXRvci53aW4uZG9jdW1lbnQuYm9keS5sYXN0Q2hpbGQuc2Nyb2xsSW50b1ZpZXcoKTt9CiAgfSk7Cjwvc2NyaXB0PgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/css/luacolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmVkaXRib3ggewogIG1hcmdpbjogLjRlbTsKICBwYWRkaW5nOiAwOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxMHB0OwogIGNvbG9yOiBibGFjazsKfQoKcHJlLmNvZGUsIC5lZGl0Ym94IHsKICBjb2xvcjogIzY2NjY2NjsKfQoKLmVkaXRib3ggcCB7CiAgbWFyZ2luOiAwOwp9CgpzcGFuLmx1YS1jb21tZW50IHsKICBjb2xvcjogI0JCOTk3NzsKfQoKc3Bhbi5sdWEta2V5d29yZCB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgY29sb3I6IGJsdWU7Cn0KCnNwYW4ubHVhLXN0cmluZyB7CiAgY29sb3I6ICNBQTIyMjI7Cn0KCnNwYW4ubHVhLXN0ZGZ1bmMgewogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGNvbG9yOiAjMDc3Owp9CnNwYW4ubHVhLWN1c3RvbWZ1bmMgewogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGNvbG9yOiAjMEFBOwp9CgoKc3Bhbi5sdWEtaWRlbnRpZmllciB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLmx1YS1udW1iZXIgewogIGNvbG9yOiAjM0EzOwp9CgpzcGFuLmx1YS10b2tlbiB7CiAgY29sb3I6ICMxNTE7Cn0KCnNwYW4ubHVhLWVycm9yIHsKICBjb2xvcjogI0ZGRjsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjAwOwp9CgoKCgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2pzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogTHVhIGRlbW9uc3RyYXRpb248L3RpdGxlPgogIDwvaGVhZD4KICA8Ym9keSBzdHlsZT0icGFkZGluZzogMjBweDsiPgoKPHA+VGhpcyBwYWdlIGRlbW9uc3RyYXRlcyA8YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Db2RlTWlycm9yPC9hPidzCkx1YSBwYXJzZXIuIFdyaXR0ZW4gYnkgPGEgaHJlZj0iaHR0cDovL2ZyYW5jaW8ucGwvIj5GcmFuY2lzemVrCldhd3J6YWs8L2E+LCByZWxlYXNlZCB1bmRlciBhIEJTRC1zdHlsZSA8YQpocmVmPSJMSUNFTlNFIj5saWNlbnNlPC9hPi48L3A+Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsgcGFkZGluZzogMHB4OyI+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgY29scz0iMTIwIiByb3dzPSIzMCI+Ci0tW1sKZXhhbXBsZSB1c2VsZXNzIGNvZGUgdG8gc2hvdyBsdWEgc3ludGF4IGhpZ2hsaWdodGluZwp0aGlzIGlzIG11bHRpbGluZSBjb21tZW50Cl1dCgpmdW5jdGlvbiBibGFoYmxhaGJsYWgoeCkKCiAgbG9jYWwgdGFibGUgPSB7CiAgICAiYXNkIiA9IDEyMywKICAgICJ4IiA9IDAuMzQsICAKICB9CiAgaWYgeCB+PSAzIHRoZW4KICAgIHByaW50KCB4ICkKICBlbHNlaWYgeCA9PSAic3RyaW5nIgogICAgbXlfY3VzdG9tX2Z1bmN0aW9uKCAweDM0ICkKICBlbHNlCiAgICB1bmtub3duX2Z1bmN0aW9uKCAic29tZSBzdHJpbmciICkKICBlbmQKCiAgLS1zaW5nbGUgbGluZSBjb21tZW50CiAgCmVuZAoKZnVuY3Rpb24gYmxhYmxhYmxhMygpCgogIGZvciBrLHYgaW4gaXBhaXJzKCB0YWJsZSApIGRvCiAgICAtLWFiY2RlLi4KICAgIHk9Wz1bCiAgeD1bWwogICAgICB4IGlzIGEgbXVsdGkgbGluZSBzdHJpbmcKICAgXV0KICBidXQgaXRzIGRlZmluaXRpb24gaXMgaXNpZGUgYSBoaWdoZXN0IGxldmVsIHN0cmluZyEKICBdPV0KICAgIHByaW50KCIgXCJcIiAiKQogIC0tdGhpcyBtYXJrcyBhIHBhcnNlciBlcnJvcjoKICBzID0gWz09IGFzZGFzZGFzZF1dCgogICAgcyA9IG1hdGguc2luKCB4ICkKICBlbmQKCmVuZAo8L3RleHRhcmVhPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoJ2NvZGUnLCB7CiAgICBoZWlnaHQ6ICIzNTBweCIsCiAgICBwYXJzZXJmaWxlOiAiLi4vY29udHJpYi9sdWEvanMvcGFyc2VsdWEuanMiLAogICAgc3R5bGVzaGVldDogImNzcy9sdWFjb2xvcnMuY3NzIiwKICAgIHBhdGg6ICIuLi8uLi9qcy8iCiAgfSk7Cjwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/js/parselua.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogCiBTaW1wbGUgcGFyc2VyIGZvciBMVUEgCiBXcml0dGVuIGZvciBMdWEgNS4xLCBiYXNlZCBvbiBwYXJzZWNzcyBhbmQgb3RoZXIgcGFyc2Vycy4gCiBmZWF0dXJlczogaGlnaGxpZ2h0cyBrZXl3b3Jkcywgc3RyaW5ncywgY29tbWVudHMgKG5vIGxldmVsaW5nIHN1cHBvcnRlZCEgKCJbPT1bIikpLHRva2VucywgYmFzaWMgaW5kZW50aW5nCgogdG8gbWFrZSB0aGlzIHBhcnNlciBoaWdobGlnaHQgeW91ciBzcGVjaWFsIGZ1bmN0aW9ucyBwYXNzIHRhYmxlIHdpdGggdGhpcyBmdW5jdGlvbnMgbmFtZXMgdG8gcGFyc2VyQ29uZmlnIGFyZ3VtZW50IG9mIGNyZWF0b3IsCgkKIHBhcnNlckNvbmZpZzogWyJteWZ1bmN0aW9uMSIsIm15ZnVuY3Rpb24yIl0sCiAqLwoKIApmdW5jdGlvbiBmaW5kRmlyc3RSZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKD86IiArIHdvcmRzLmpvaW4oInwiKSArICIpIiwgImkiKTsKfQoKZnVuY3Rpb24gbWF0Y2hSZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKD86IiArIHdvcmRzLmpvaW4oInwiKSArICIpJCIsICJpIik7Cn0KCgogCnZhciBsdWFDdXN0b21GdW5jdGlvbnM9IG1hdGNoUmVnZXhwKFtdKTsKIApmdW5jdGlvbiBjb25maWd1cmVMVUEocGFyc2VyQ29uZmlnKXsKCWlmKHBhcnNlckNvbmZpZykKCWx1YUN1c3RvbUZ1bmN0aW9ucz0gbWF0Y2hSZWdleHAocGFyc2VyQ29uZmlnKTsKfQoKCi8vbG9uZyBsaXN0IG9mIHN0YW5kYXJkIGZ1bmN0aW9ucyBmcm9tIGx1YSBtYW51YWwKdmFyIGx1YVN0ZEZ1bmN0aW9ucyA9IG1hdGNoUmVnZXhwKFsKIl9HIiwiX1ZFUlNJT04iLCJhc3NlcnQiLCJjb2xsZWN0Z2FyYmFnZSIsImRvZmlsZSIsImVycm9yIiwiZ2V0ZmVudiIsImdldG1ldGF0YWJsZSIsImlwYWlycyIsImxvYWQiLCJsb2FkZmlsZSIsImxvYWRzdHJpbmciLCJtb2R1bGUiLCJuZXh0IiwicGFpcnMiLCJwY2FsbCIsInByaW50IiwicmF3ZXF1YWwiLCJyYXdnZXQiLCJyYXdzZXQiLCJyZXF1aXJlIiwic2VsZWN0Iiwic2V0ZmVudiIsInNldG1ldGF0YWJsZSIsInRvbnVtYmVyIiwidG9zdHJpbmciLCJ0eXBlIiwidW5wYWNrIiwieHBjYWxsIiwKCiJjb3JvdXRpbmUuY3JlYXRlIiwiY29yb3V0aW5lLnJlc3VtZSIsImNvcm91dGluZS5ydW5uaW5nIiwiY29yb3V0aW5lLnN0YXR1cyIsImNvcm91dGluZS53cmFwIiwiY29yb3V0aW5lLnlpZWxkIiwKCiJkZWJ1Zy5kZWJ1ZyIsImRlYnVnLmdldGZlbnYiLCJkZWJ1Zy5nZXRob29rIiwiZGVidWcuZ2V0aW5mbyIsImRlYnVnLmdldGxvY2FsIiwiZGVidWcuZ2V0bWV0YXRhYmxlIiwiZGVidWcuZ2V0cmVnaXN0cnkiLCJkZWJ1Zy5nZXR1cHZhbHVlIiwiZGVidWcuc2V0ZmVudiIsImRlYnVnLnNldGhvb2siLCJkZWJ1Zy5zZXRsb2NhbCIsImRlYnVnLnNldG1ldGF0YWJsZSIsImRlYnVnLnNldHVwdmFsdWUiLCJkZWJ1Zy50cmFjZWJhY2siLAoKImNsb3NlIiwiZmx1c2giLCJsaW5lcyIsInJlYWQiLCJzZWVrIiwic2V0dmJ1ZiIsIndyaXRlIiwKCiJpby5jbG9zZSIsImlvLmZsdXNoIiwiaW8uaW5wdXQiLCJpby5saW5lcyIsImlvLm9wZW4iLCJpby5vdXRwdXQiLCJpby5wb3BlbiIsImlvLnJlYWQiLCJpby5zdGRlcnIiLCJpby5zdGRpbiIsImlvLnN0ZG91dCIsImlvLnRtcGZpbGUiLCJpby50eXBlIiwiaW8ud3JpdGUiLAoKIm1hdGguYWJzIiwibWF0aC5hY29zIiwibWF0aC5hc2luIiwibWF0aC5hdGFuIiwibWF0aC5hdGFuMiIsIm1hdGguY2VpbCIsIm1hdGguY29zIiwibWF0aC5jb3NoIiwibWF0aC5kZWciLCJtYXRoLmV4cCIsIm1hdGguZmxvb3IiLCJtYXRoLmZtb2QiLCJtYXRoLmZyZXhwIiwibWF0aC5odWdlIiwibWF0aC5sZGV4cCIsIm1hdGgubG9nIiwibWF0aC5sb2cxMCIsIm1hdGgubWF4IiwibWF0aC5taW4iLCJtYXRoLm1vZGYiLCJtYXRoLnBpIiwibWF0aC5wb3ciLCJtYXRoLnJhZCIsIm1hdGgucmFuZG9tIiwibWF0aC5yYW5kb21zZWVkIiwibWF0aC5zaW4iLCJtYXRoLnNpbmgiLCJtYXRoLnNxcnQiLCJtYXRoLnRhbiIsIm1hdGgudGFuaCIsCgoib3MuY2xvY2siLCJvcy5kYXRlIiwib3MuZGlmZnRpbWUiLCJvcy5leGVjdXRlIiwib3MuZXhpdCIsIm9zLmdldGVudiIsIm9zLnJlbW92ZSIsIm9zLnJlbmFtZSIsIm9zLnNldGxvY2FsZSIsIm9zLnRpbWUiLCJvcy50bXBuYW1lIiwKCiJwYWNrYWdlLmNwYXRoIiwicGFja2FnZS5sb2FkZWQiLCJwYWNrYWdlLmxvYWRlcnMiLCJwYWNrYWdlLmxvYWRsaWIiLCJwYWNrYWdlLnBhdGgiLCJwYWNrYWdlLnByZWxvYWQiLCJwYWNrYWdlLnNlZWFsbCIsCgoic3RyaW5nLmJ5dGUiLCJzdHJpbmcuY2hhciIsInN0cmluZy5kdW1wIiwic3RyaW5nLmZpbmQiLCJzdHJpbmcuZm9ybWF0Iiwic3RyaW5nLmdtYXRjaCIsInN0cmluZy5nc3ViIiwic3RyaW5nLmxlbiIsInN0cmluZy5sb3dlciIsInN0cmluZy5tYXRjaCIsInN0cmluZy5yZXAiLCJzdHJpbmcucmV2ZXJzZSIsInN0cmluZy5zdWIiLCJzdHJpbmcudXBwZXIiLAoKInRhYmxlLmNvbmNhdCIsInRhYmxlLmluc2VydCIsInRhYmxlLm1heG4iLCJ0YWJsZS5yZW1vdmUiLCJ0YWJsZS5zb3J0IgpdKTsKCgoKIHZhciBsdWFLZXl3b3JkcyA9IG1hdGNoUmVnZXhwKFsiYW5kIiwiYnJlYWsiLCJlbHNlaWYiLCJmYWxzZSIsIm5pbCIsIm5vdCIsIm9yIiwicmV0dXJuIiwKCQkJCSJ0cnVlIiwiZnVuY3Rpb24iLCAiZW5kIiwgImlmIiwgInRoZW4iLCAiZWxzZSIsICJkbyIsIAoJCQkJIndoaWxlIiwgInJlcGVhdCIsICJ1bnRpbCIsICJmb3IiLCAiaW4iLCAibG9jYWwiIF0pOwoKIHZhciBsdWFJbmRlbnRLZXlzID0gbWF0Y2hSZWdleHAoWyJmdW5jdGlvbiIsICJpZiIsInJlcGVhdCIsImZvciIsIndoaWxlIiwgIltcKF0iLCAieyJdKTsKIHZhciBsdWFVbmluZGVudEtleXMgPSBtYXRjaFJlZ2V4cChbImVuZCIsICJ1bnRpbCIsICJbXCldIiwgIn0iXSk7CgogdmFyIGx1YVVuaW5kZW50S2V5czIgPSBmaW5kRmlyc3RSZWdleHAoWyJlbmQiLCAidW50aWwiLCAiW1wpXSIsICJ9Il0pOwogdmFyIGx1YU1pZGRsZUtleXMgPSBmaW5kRmlyc3RSZWdleHAoWyJlbHNlIiwiZWxzZWlmIl0pOwoKCgp2YXIgTFVBUGFyc2VyID0gRWRpdG9yLlBhcnNlciA9IChmdW5jdGlvbigpIHsKICB2YXIgdG9rZW5pemVMVUEgPSAoZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBub3JtYWwoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwoKICAgaWYgKGNoID09ICItIiAmJiBzb3VyY2UuZXF1YWxzKCItIikpIHsKICAgICAgICBzb3VyY2UubmV4dCgpOwogCQlzZXRTdGF0ZShpblNMQ29tbWVudCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0gCgllbHNlIGlmIChjaCA9PSAiXCIiIHx8IGNoID09ICInIikgewogICAgICAgIHNldFN0YXRlKGluU3RyaW5nKGNoKSk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIGlmIChjaCA9PSAiWyIgJiYgKHNvdXJjZS5lcXVhbHMoIlsiKSB8fCBzb3VyY2UuZXF1YWxzKCI9IikpKSB7CiAgICAgICAgdmFyIGxldmVsID0gMDsKCQl3aGlsZShzb3VyY2UuZXF1YWxzKCI9IikpewoJCQlsZXZlbCArKzsKCQkJc291cmNlLm5leHQoKTsKCQl9CgkJaWYoISBzb3VyY2UuZXF1YWxzKCJbIikgKQoJCQlyZXR1cm4gImx1YS1lcnJvciI7CQkKCQlzZXRTdGF0ZShpbk1MU29tZXRoaW5nKGxldmVsLCJsdWEtc3RyaW5nIikpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9IAoJICAgIAogICAgICBlbHNlIGlmIChjaCA9PSAiPSIpIHsKCWlmIChzb3VyY2UuZXF1YWxzKCI9IikpCgkJc291cmNlLm5leHQoKTsKICAgICAgICByZXR1cm4gImx1YS10b2tlbiI7CiAgICAgIH0KICAJCiAgICAgIGVsc2UgaWYgKGNoID09ICIuIikgewoJaWYgKHNvdXJjZS5lcXVhbHMoIi4iKSkKCQlzb3VyY2UubmV4dCgpOwoJaWYgKHNvdXJjZS5lcXVhbHMoIi4iKSkKCQlzb3VyY2UubmV4dCgpOwogICAgICAgIHJldHVybiAibHVhLXRva2VuIjsKICAgICAgfQogICAgIAogICAgICBlbHNlIGlmIChjaCA9PSAiKyIgfHwgY2ggPT0gIi0iIHx8IGNoID09ICIqIiB8fCBjaCA9PSAiLyIgfHwgY2ggPT0gIiUiIHx8IGNoID09ICJeIiB8fCBjaCA9PSAiIyIgKSB7CiAgICAgICAgcmV0dXJuICJsdWEtdG9rZW4iOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICI+IiB8fCBjaCA9PSAiPCIgfHwgY2ggPT0gIigiIHx8IGNoID09ICIpIiB8fCBjaCA9PSAieyIgfHwgY2ggPT0gIn0iIHx8IGNoID09ICJbIiApIHsKICAgICAgICByZXR1cm4gImx1YS10b2tlbiI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIl0iIHx8IGNoID09ICI7IiB8fCBjaCA9PSAiOiIgfHwgY2ggPT0gIiwiKSB7CiAgICAgICAgcmV0dXJuICJsdWEtdG9rZW4iOwogICAgICB9CiAgICAgIGVsc2UgaWYgKHNvdXJjZS5lcXVhbHMoIj0iKSAmJiAoY2ggPT0gIn4iIHx8IGNoID09ICI8IiB8fCBjaCA9PSAiPiIpKSB7CiAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICByZXR1cm4gImx1YS10b2tlbiI7CiAgICAgIH0KCiAgICAgZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHcuJV0vKTsKICAgICAgICByZXR1cm4gImx1YS1udW1iZXIiOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHdcXFwtXy5dLyk7CiAgICAgICAgcmV0dXJuICJsdWEtaWRlbnRpZmllciI7CiAgICAgIH0KICAgIH0KIApmdW5jdGlvbiBpblNMQ29tbWVudChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBzdGFydCA9IHRydWU7Cgl2YXIgY291bnQ9MDsKICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKCSAJdmFyIGNoID0gc291cmNlLm5leHQoKTsKCQl2YXIgbGV2ZWwgPSAwOwoJCWlmICgoY2ggPT0iWyIpICYmIHN0YXJ0KQoJCQl3aGlsZShzb3VyY2UuZXF1YWxzKCI9IikpewoJCQlzb3VyY2UubmV4dCgpOwoJCQlsZXZlbCsrOwoJCQl9CgkJCWlmIChzb3VyY2UuZXF1YWxzKCJbIikpewogICAgICAgCQkJCXNldFN0YXRlKGluTUxTb21ldGhpbmcobGV2ZWwsImx1YS1jb21tZW50IikpOwogICAgICAgIAkJCXJldHVybiBudWxsOwogIAkJCQl9CgkJIHN0YXJ0ID0gZmFsc2U7CQoJfQoJc2V0U3RhdGUobm9ybWFsKTsgICAgICAJCQogICAgIHJldHVybiAibHVhLWNvbW1lbnQiOwoJCiAgICB9CgogICAgZnVuY3Rpb24gaW5NTFNvbWV0aGluZyhsZXZlbCx3aGF0KSB7CgkvL3dhdCBzaG9sdWQgYmUgImx1YS1zdHJpbmciIG9yICJsdWEtY29tbWVudCIsIGxldmVsIGlzIHRoZSBudW1iZXIgb2YgIj0iIGluIG9wZW5pbmcgbWFyay4KCXJldHVybiBmdW5jdGlvbihzb3VyY2UsIHNldFN0YXRlKXsKICAgICAgdmFyIGRhc2hlcyA9IDA7CiAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAoZGFzaGVzID09IGxldmVsKzEgJiYgY2ggPT0gIl0iICkgewogICAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCQlpZiAoZGFzaGVzID09IDApIAoJCQlkYXNoZXMgPSAoY2ggPT0gIl0iKSA/IDE6MDsKCQllbHNlCiAJCQlkYXNoZXMgPSAoY2ggPT0gIj0iKSA/IGRhc2hlcyArIDEgOiAwOwogICAgICAgIH0KICAgICAgcmV0dXJuIHdoYXQ7CgkgfQogICAgfQoKCiAgICBmdW5jdGlvbiBpblN0cmluZyhxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIGNoID09ICJcXCI7CiAgICAgICAgfQogICAgICAgIGlmICghZXNjYXBlZCkKICAgICAgICAgIHNldFN0YXRlKG5vcm1hbCk7CiAgICAgICAgcmV0dXJuICJsdWEtc3RyaW5nIjsKICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzdGFydFN0YXRlKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZXIoc291cmNlLCBzdGFydFN0YXRlIHx8IG5vcm1hbCk7CiAgICB9OwogIH0pKCk7CgogIGZ1bmN0aW9uIGluZGVudExVQShpbmRlbnREZXB0aCwgYmFzZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKG5leHRDaGFycykgewoKICAgICAgdmFyIGNsb3NpbmcgPSAobHVhVW5pbmRlbnRLZXlzMi50ZXN0KG5leHRDaGFycykgfHwgbHVhTWlkZGxlS2V5cy50ZXN0KG5leHRDaGFycykpOwoKIAkKCXJldHVybiBiYXNlICsgKCBpbmRlbnRVbml0ICogKGluZGVudERlcHRoIC0gKGNsb3Npbmc/MTowKSkgKTsKICAgIH07CiAgfQoKICAKZnVuY3Rpb24gcGFyc2VMVUEoc291cmNlLGJhc2Vjb2x1bW4pIHsKICAgICBiYXNlY29sdW1uID0gYmFzZWNvbHVtbiB8fCAwOwogICAgCgl2YXIgdG9rZW5zID0gdG9rZW5pemVMVUEoc291cmNlKTsKICAgIHZhciBpbmRlbnREZXB0aCA9IDA7CgogICAgdmFyIGl0ZXIgPSB7CiAgICAgIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB0b2tlbiA9IHRva2Vucy5uZXh0KCksIHN0eWxlID0gdG9rZW4uc3R5bGUsIGNvbnRlbnQgPSB0b2tlbi5jb250ZW50OwoKIAoJCglpZiAoc3R5bGUgPT0gImx1YS1pZGVudGlmaWVyIiAmJiBsdWFLZXl3b3Jkcy50ZXN0KGNvbnRlbnQpKXsKCSAgdG9rZW4uc3R5bGUgPSAibHVhLWtleXdvcmQiOwoJfQkKCWlmIChzdHlsZSA9PSAibHVhLWlkZW50aWZpZXIiICYmIGx1YVN0ZEZ1bmN0aW9ucy50ZXN0KGNvbnRlbnQpKXsKCSAgdG9rZW4uc3R5bGUgPSAibHVhLXN0ZGZ1bmMiOwoJfQoJaWYgKHN0eWxlID09ICJsdWEtaWRlbnRpZmllciIgJiYgbHVhQ3VzdG9tRnVuY3Rpb25zLnRlc3QoY29udGVudCkpewoJICB0b2tlbi5zdHlsZSA9ICJsdWEtY3VzdG9tZnVuYyI7Cgl9CgoJaWYgKGx1YUluZGVudEtleXMudGVzdChjb250ZW50KSkKICAgIAlpbmRlbnREZXB0aCsrOwoJZWxzZSBpZiAobHVhVW5pbmRlbnRLZXlzLnRlc3QoY29udGVudCkpCgkJaW5kZW50RGVwdGgtLTsKICAgICAgICAKCiAgICAgICAgaWYgKGNvbnRlbnQgPT0gIlxuIikKICAgICAgICAgIHRva2VuLmluZGVudGF0aW9uID0gaW5kZW50TFVBKCBpbmRlbnREZXB0aCwgYmFzZWNvbHVtbik7CgogICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgfSwKCiAgICAgIGNvcHk6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAgX3Rva2VuU3RhdGUgPSB0b2tlbnMuc3RhdGUsIF9pbmRlbnREZXB0aCA9IGluZGVudERlcHRoOwogICAgICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICAgIHRva2VucyA9IHRva2VuaXplTFVBKHNvdXJjZSwgX3Rva2VuU3RhdGUpOwogICAgICAKCSAgaW5kZW50RGVwdGggPSBfaW5kZW50RGVwdGg7CiAgICAgICAgICByZXR1cm4gaXRlcjsKICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGl0ZXI7CiAgfQoKICByZXR1cm4ge21ha2U6IHBhcnNlTFVBLCBjb25maWd1cmU6Y29uZmlndXJlTFVBLCBlbGVjdHJpY0NoYXJzOiAiZGVsZn0pIn07ICAgLy9lbltkXSBlbHNbZV0gdW50aVtsXSBlbHNlaVtmXSAgLy8gdGhpcyBzaG91bGQgYmUgdGFrZW4gZnJvbSBLZXlzIGtleXdvcmRzCn0pKCk7Cgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDA5LCBGcmFuY2lzemVrIFdhd3J6YWsKQWxsIHJpZ2h0cyByZXNlcnZlZC4KClRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgZm9yIHVzZSBpbiBjb25uZWN0aW9uIHdpdGggdGhlCkNvZGVNaXJyb3Igc3VpdGUgb2YgbW9kdWxlcyBhbmQgdXRpbGl0aWVzLCBob3N0ZWQgYW5kIG1haW50YWluZWQKYXQgaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci8uCgpSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsCndpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUKZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKCiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQogIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKICBmb2xsb3dpbmcgZGlzY2xhaW1lci4KCiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQogIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwoiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVApMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwpGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCklOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCkJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgpDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFClBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/css/phpcolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhlIGNvcHlyaWdodHMgZW1ib2RpZWQgaW4gdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGFyZSBsaWNlbnNlZCBieQpZYWhvbyEgSW5jLiB1bmRlciB0aGUgQlNEIChyZXZpc2VkKSBvcGVuIHNvdXJjZSBsaWNlbnNlCgpAYXV0aG9yIERhbiBWbGFkIERhc2NhbGVzY3UgPGRhbmR2QHlhaG9vLWluYy5jb20+CiovCgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7Cn0KCi8qV2Ugc2hvdWxkIGRlZmluZSBzcGVjaWZpYyBzdHlsZXMgZm9yIGV2ZXJ5IGVsZW1lbnQgb2YgdGhlIHN5bnRheC4KICB0aGUgc2V0dGluZyBiZWxvdyB3aWxsIGNhdXNlIHNvbWUgYW5ub3lpbmcgY29sb3IgdG8gc2hvdyB0aHJvdWdoIGlmIHdlIG1pc3NlZAogIGRlZmluaW5nIGEgc3R5bGUgZm9yIGEgdG9rZW4uIFRoaXMgaXMgYWxzbyB0aGUgImNvbG9yIiBvZiB0aGUgd2hpdGVzcGFjZSBhbmQKICBvZiB0aGUgY3Vyc29yLgoqLwpwcmUuY29kZSwgLmVkaXRib3ggewogIGNvbG9yOiByZWQ7Cn0KCi5lZGl0Ym94IHAgewogIG1hcmdpbjogMDsKfQoKc3Bhbi5waHAtcHVuY3R1YXRpb24gewogIGNvbG9yOiBibHVlOwp9CgpzcGFuLnBocC1rZXl3b3JkIHsKICBjb2xvcjogIzc3MDA4ODsKICBmb250LXdlaWdodDogYm9sZDsKfQoKc3Bhbi5waHAtb3BlcmF0b3IgewogIGNvbG9yOiBibHVlOwp9CgovKiBfX0ZJTEVfXyBldGMuOyBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQucGhwICovCnNwYW4ucGhwLWNvbXBpbGUtdGltZS1jb25zdGFudCB7CiAgY29sb3I6ICM3NzYwODg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi8qIG91dHB1dCBvZiBnZXRfZGVmaW5lZF9jb25zdGFudHMoKS4gRGlmZmVycyBmcm9tIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5jb25zdGFudHMucGhwICovCnNwYW4ucGhwLXByZWRlZmluZWQtY29uc3RhbnQgewogIGNvbG9yOiBkYXJrZ3JlZW47CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi8qIFBIUCByZXNlcnZlZCAibGFuZ3VhZ2UgY29uc3RydWN0cyIuLi4gZWNobygpIGV0Yy47IGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5waHAgKi8Kc3Bhbi5waHAtcmVzZXJ2ZWQtbGFuZ3VhZ2UtY29uc3RydWN0IHsKICBjb2xvcjogZ3JlZW47CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi8qIFBIUCBidWlsdC1pbiBmdW5jdGlvbnM6IGdsb2IoKSwgY2hyKCkgZXRjLjsgb3V0cHV0IG9mIGdldF9kZWZpbmVkX2Z1bmN0aW9ucygpWyJpbnRlcm5hbCJdICovCnNwYW4ucGhwLXByZWRlZmluZWQtZnVuY3Rpb24gewogIGNvbG9yOiBncmVlbjsKfQoKLyogUEhQIHByZWRlZmluZWQgY2xhc3NlczogUERPLCBFeGNlcHRpb24gZXRjLjsgb3V0cHV0IG9mIGdldF9kZWNsYXJlZF9jbGFzc2VzKCkgYW5kIGRpZmZlcmVudCBmcm9tIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5jbGFzc2VzLnBocCAqLwpzcGFuLnBocC1wcmVkZWZpbmVkLWNsYXNzIHsKICBjb2xvcjogZ3JlZW47Cn0KCnNwYW4ucGhwLWF0b20gewogIGNvbG9yOiAjMjI4ODExOwp9CgovKiBjbGFzcywgaW50ZXJmYWNlLCBuYW1lc3BhY2Ugb3IgZnVuY3Rpb24gbmFtZXMsIGJ1dCBub3QgJHZhcmlhYmxlcyAqLwpzcGFuLnBocC10X3N0cmluZyB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLnBocC12YXJpYWJsZSB7CiAgY29sb3I6IGJsYWNrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoKc3Bhbi5qcy1sb2NhbHZhcmlhYmxlIHsKICBjb2xvcjogIzAwNDQ5OTsKfQoKc3Bhbi5waHAtY29tbWVudCB7CiAgY29sb3I6ICNBQTc3MDA7CiAgZm9udC1zdHJldGNoOiBjb25kZW5zZWQ7Ci8qICBmb250LXN0eWxlOiBpdGFsaWM7ICBUaGlzIGNhdXNlcyBsaW5lIGhlaWdodCB0byBzbGlnaHRseSBjaGFuZ2UsIGdldHRpbmcgbGluZSBudW1iZXJzIG91dCBvZiBzeW5jICovCn0KCnNwYW4ucGhwLXN0cmluZy1zaW5nbGUtcXVvdGVkIHsKICBjb2xvcjogI0FBMjIyMjsKfQovKiBkb3VibGUgcXVvdGVkIHN0cmluZ3MgYWxsb3cgaW50ZXJwb2xhdGlvbiAqLwpzcGFuLnBocC1zdHJpbmctZG91YmxlLXF1b3RlZCB7CiAgY29sb3I6ICNBQTIyMjI7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCnNwYW4uc3ludGF4LWVycm9yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7Cn0KCnNwYW4uZGVwcmVjYXRlZCB7CiAgZm9udC1zaXplOiBzbWFsbGVyOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLQpDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpUaGUgY29weXJpZ2h0cyBlbWJvZGllZCBpbiB0aGUgY29udGVudCBvZiB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkIGJ5CllhaG9vISBJbmMuIHVuZGVyIHRoZSBCU0QgKHJldmlzZWQpIG9wZW4gc291cmNlIGxpY2Vuc2UKCkBhdXRob3IgRGFuIFZsYWQgRGFzY2FsZXNjdSA8ZGFuZHZAeWFob28taW5jLmNvbT4KCi0tPgoKCjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KICA8aGVhZD4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9qcy9jb2RlbWlycm9yLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFBIUCtIVE1MK0phdmFTY3JpcHQrQ1NTIG1peGVkLW1vZGUgZGVtb25zdHJhdGlvbjwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9jc3MvZG9jcy5jc3MiLz4KICA8L2hlYWQ+CiAgPGJvZHkgc3R5bGU9InBhZGRpbmc6IDIwcHg7Ij4KCiAgICA8cD5UaGlzIGlzIGEgY29tcGxleCBkZW1vbnN0cmF0aW9uIG9mIHRoZSA8Yj5QSFArSFRNTCtKYXZhU2NyaXB0K0NTUyBtaXhlZC1tb2RlCiAgICBzeW50YXggaGlnaGxpZ2h0PC9iPiBjYXBhYmlsaXRpZXMgb2YgPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+Q29kZU1pcnJvcjwvYT4uCiAgICAmbHQ7P3BocCAuLi4gPz4gdGFncyB1c2UgdGhlIFBIUCBwYXJzZXIsICZsdDtzY3JpcHQ+IHRhZ3MgdXNlIHRoZSBKYXZhU2NyaXB0CiAgICBwYXJzZXIsIGFuZCAmbHQ7c3R5bGU+IHRhZ3MgdXNlIHRoZSBDU1MgcGFyc2VyLiBUaGUgcmVzdCBvZiB0aGUgY29udGVudCBpcwogICAgcGFyc2VkIHVzaW5nIHRoZSBYTUwgcGFyc2VyIGluIEhUTUwgbW9kZS48L3A+CgogICAgPHA+RmVhdHVyZXMgb2YgdGhlIFBIUCBwYXJzZXI6CiAgICA8dWw+CiAgICAgIDxsaT5zcGVjaWFsICJkZXByZWNhdGVkIiBzdHlsZSBmb3IgUEhQNCBrZXl3b3JkcyBsaWtlICd2YXInCiAgICAgIDxsaT5zdXBwb3J0IGZvciBQSFAgNS4zIGtleXdvcmRzOiAnbmFtZXNwYWNlJywgJ3VzZScKICAgICAgPGxpPjkxMSBwcmVkZWZpbmVkIGNvbnN0YW50cywgMTMwMSBwcmVkZWZpbmVkIGZ1bmN0aW9ucywgMTA1IHByZWRlY2xhcmVkIGNsYXNzZXMKICAgICAgICBmcm9tIGEgdHlwaWNhbCBQSFAgaW5zdGFsbGF0aW9uIGluIGEgTEFNUCBlbnZpcm9ubWVudAogICAgICA8bGk+bmV3IGZlYXR1cmU6IHN5bnRheCBlcnJvciBmbGFnZ2luZywgdGh1cyBlbmFibGluZyBzdHJpY3QgcGFyc2luZyBvZjoKICAgICAgICA8b2w+CiAgICAgICAgICA8bGk+ZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2l0aCBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkgdHlwZWQgYXJndW1lbnRzIGFuZCBkZWZhdWx0IHZhbHVlcwogICAgICAgICAgPGxpPm1vZGlmaWVycyAocHVibGljLCBzdGF0aWMgZXRjLikgYXBwbGllZCB0byBtZXRob2QgYW5kIG1lbWJlciBkZWZpbml0aW9ucwogICAgICAgICAgPGxpPmZvcmVhY2goYXJyYXlfZXhwcmVzc2lvbiBhcyAka2V5IFs9PiAkdmFsdWVdKSBsb29wcwogICAgICAgIDwvb2w+CiAgICAgIDxsaT5kaWZmZXJlbnRpYXRpb24gYmV0d2VlbiBzaW5nbGUtcXVvdGVkIHN0cmluZ3MgYW5kIGRvdWJsZS1xdW90ZWQgaW50ZXJwb2xhdGluZyBzdHJpbmdzCiAgICA8L3VsPgogICAgPC9wPgoKICAgIDxkaXYgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nOiAzcHg7IGJhY2tncm91bmQtY29sb3I6ICNGOEY4RjgiPgogICAgPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjMwIj4KVGhlICJyb290IiBwYXJzZXIgaXMgWE1MIGluIEhUTUwgbW9kZS4KTmV4dCwgd2UgY2FuIHN3aXRjaCBpbnRvIFBIUCBtb2RlLCBmb3IgZXhhbXBsZS4gVGhpcyBpcwo8P3BocCBlY2hvICd0ZXh0IG91dHB1dCBieSc7Cj8+ClBIUC4gPC9iPgpPbiB0aGUgbGluZSBhYm92ZSwgd2UganVzdCBoYWQgYW4gWE1MIHN5bnRheCBlcnJvciBkdWUgdG8gdGhlIDwvYj4gdGFnIG5vdCBiZWluZyBvcGVuZWQuCgo8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgc3RhbmRhbG9uZT0neWVzJz8+ICAgSFRNTCB0ZXh0IHdpbGwgZm9sbG93CjxodG1sPgogIDxoZWFkPgogICAgPHRpdGxlPlNpbWlsYXJseSwgdGhlICdzY3JpcHQnIHRhZyB3aWxsIHN3aXRjaCB0byB0aGUgSmF2YVNjcmlwdCBwYXJzZXI6PC90aXRsZT4KICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgIC8vIFByZXNzIGVudGVyIGluc2lkZSB0aGUgb2JqZWN0IGFuZCB5b3VyIG5ldyBsaW5lIHdpbGwgYmUgc3VpdGFibHkKICAgICAgIC8vIGluZGVudGVkLgogICAgICAgdmFyIGtleUJpbmRpbmdzID0gewogICAgICAgICBlbnRlcjogIm5ld2xpbmUtYW5kLWluZGVudCIsCiAgICAgICAgIHRhYjogInJlaW5kZW50LXNlbGVjdGlvbiIsCiAgICAgICAgIGN0cmxfZW50ZXI6ICJyZXBhcnNlLWJ1ZmZlciIsCiAgICAgICAgIGN0cmxfejogInVuZG8iLAogICAgICAgICBjdHJsX3k6ICJyZWRvIiwKICAgICAgICAgY3RybF9iYWNrc3BhY2U6ICJ1bmRvLWZvci1zYWZhcmktd2hpY2gtc3R1cGlkbHktZW5vdWdoLWJsb2Nrcy1jdHJsLXoiCiAgICAgICB9OwoKICAgICAgIC8vIFByZXNzIHRhYiBvbiB0aGUgbmV4dCBsaW5lIGFuZCB0aGUgd3JvbmcgaW5kZW50YXRpb24gd2lsbCBiZSBmaXhlZC4KICAgICAgICAgICAgIHZhciByZWdleCA9IC9mb298YmFyL2k7CgogICAgICAgZnVuY3Rpb24gZXhhbXBsZSh4KSB7CiAgICAgICAgIC8vIExvY2FsIHZhcmlhYmxlcyBnZXQgYSBkaWZmZXJlbnQgY29sb3VyIHRoYW4gZ2xvYmFsIG9uZXMuCiAgICAgICAgIHZhciB5ID0gNDQuNDsKICAgICAgICAgcmV0dXJuIHggKyB5IC0gejsKICAgICAgIH0KICAgIDwvc2NyaXB0PgogICAgPHN0eWxlPgogICAgICAvKiBTb21lIGV4YW1wbGUgQ1NTICovCgogICAgICBAaW1wb3J0IHVybCgic29tZXRoaW5nLmNzcyIpOwoKICAgICAgYm9keSB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDNlbSA2ZW07CiAgICAgICAgZm9udC1mYW1pbHk6IHRhaG9tYSwgYXJpYWwsIHNhbnMtc2VyaWY7CiAgICAgICAgY29sb3I6ICMwMDA7CiAgICAgIH0KCiAgICAgICNuYXZpZ2F0aW9uIGEgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBoMSB7CiAgICAgICAgZm9udC1zaXplOiAyLjVlbTsKICAgICAgfQoKICAgICAgaDE6YmVmb3JlLCBoMjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICI6OiI7CiAgICAgIH0KCiAgICAgIGNvZGUgewogICAgICAgIGZvbnQtZmFtaWx5OiBjb3VyaWVyLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiA4MCU7CiAgICAgICAgY29sb3I6ICM0MThBOEE7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgoKICA8Ym9keT4KCiAgVGhlIFBIUCBjb2RlIGJlbG93IGNvbnRhaW5zIHNvbWUgZGVsaWJlcmF0ZSBlcnJvcnMuIFBsYXkgd2l0aCB0aGUgZWRpdG9yIGJ5IGZpeGluZyB0aGVtCiAgYW5kIG9ic2VydmluZyBob3cgdGhlIGhpZ2hsaWdodCBjaGFuZ2VzLgoKICAgIDw/cGhwCiAgICBuYW1lc3BhY2UgQTsKICAgIG5hbWVzcGFjZSBBOjpCOjpDOwogICAgbmFtZXNwYWNlIEE6Ojo6QjsKICAgIG5hbWVzcGFjZSBBOjpCOjpDOjo7CiAgICBuYW1lc3BhY2UgQTo6Qjo6Qzo6RCB4OwogICAgc2VsZjo6cmFuZ2UoJHJvd1snbGZ0J10sICRyb3dbJ3JndCddKSk7ICAvLyBlcnJvcjogZXh0cmEgJyknCiAgICAkYSA9IChiKCkgKyA0KSA1IGZvbzsgIC8vIGVycm9yOiBtaXNzaW5nIG9wZXJhdG9ycwogICAgc2VsZjo6JHZhcjsKICAgICRwYXJlbnQgPSBzZWxmOjpyYW5nZSgkbWF4ICsgMSwgJG1heCArIDEpOwogICAgJHJvd1thdHRyaWJ1dGVzXVskYXR0cmlidXRlX25hbWVdID0gJGF0dHJpYnV0ZV92YWx1ZTsKICAgICRyb3dbYXR0cmlidXRlcygpXVskYXR0cmlidXRlX25hbWVdID0gJGF0dHJpYnV0ZV92YWx1ZTsKICAgICRyb3dbYXR0cmlidXRlcyg1KV1bJGF0dHJpYnV0ZV9uYW1lXSA9ICRhdHRyaWJ1dGVfdmFsdWU7CiAgICAkcm93WyRhdHRyaWJ1dGVzKCldWyRhdHRyaWJ1dGVfbmFtZV0gPSAkYXR0cmlidXRlX3ZhbHVlOwogICAgYWJzdHJhY3QgY2xhc3MgNSBleHRlbmRzIGZvbyBpbXBsZW1lbnRzIGVjaG8gewogICAgICAgIHByaXZhdGUgZnVuY3Rpb24gZG9tYWluT2JqZWN0QnVpbGRlcigpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT51c2VfZG9tYWluX29iamVjdF9idWlsZGVyCiAgICAgICAgICAgICAgICAgICA/ICR0aGlzLT5kb21haW4oKS0+b2JqZWN0QnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICA6IG51bGw7CiAgICAgICAgfQoKICAgICAgICBjb25zdCAkbXljb25zdCA9ICdzb21lIHN0cmluZyc7CiAgICAgICAgJGFycmF5W215Y29uc3RdID0gNDsKICAgICAgICAvLyB0aGlzIGlzIGEgc2luZ2xlLWxpbmUgQysrLXN0eWxlIGNvbW1lbnQKICAgICAgICAjIHRoaXMgaXMgYSBzaW5nbGUtbGluZSBzaGVsbC1zdHlsZSBjb21tZW50CiAgICAgICAgcHJpdmF0ZSB2YXIgJGEgPSBfX0ZJTEVfXzsKICAgICAgICBwcm90ZWN0ZWQgc3RhdGljICRiID0gdGltZXpvbmVfdHJhbnNpdGlvbnNfZ2V0KCdzb21lIHBhcmFtZXRlciBoZXJlJyk7CiAgICAgICAgZ2xvYmFsICRnID0gaXNzZXQoInN0cmluZyIpOwogICAgICAgIHN0YXRpYyAkcyA9IGhhc2hfdXBkYXRlX2ZpbGU7ICAvLyB3YXJuaW5nOiBwcmVkZWZpbmVkIGZ1bmN0aW9uIG5vbi1jYWxsCiAgICAgICAgZnVuY3Rpb24gbWlrZSAoJHZhcikgJGZvbzsKICAgICAgICBtaWtlKEE6OmZ1bmMocGFyYW0pKTsKICAgICAgICBmdW5jKCRiICRjKTsgIC8vIGVycm9yOiBmdW5jdGlvbiBwYXJhbWV0ZXJzIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkCiAgICAgICAgZm9vIGJhcjsgIC8vIGVycm9yOiBubyBvcGVyYXRvcgogICAgICAgICRiYXogJHF1dXg7ICAvLyBlcnJvcjogbm8gb3BlcmF0b3IKICAgICAgICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gbG9hZFBhZ2VYTUwodXRpbF9GaWxlUGF0aCAkZmlsZW5hbWUsICRtZXJnZT0wKyRmb28sICR4LCAkeT0zKSB7CiAgICAgICAgICAgICRuZXdyb3dbJGtleV0gPSAkdmFsOwogICAgICAgICAgICAkbmV3cmVzdWx0W10gPSAkcm93OwogICAgICAgICAgICAkc3RhdGUgPSAkcm93WydjJ10gPT0gMTsKICAgICAgICAgICAgJGF0dHJpYnV0ZV92YWx1ZXNbJGF0dHJpYnV0ZV9uYW1lXSA9IG51bGw7CiAgICAgICAgICAgICRyb3dbJ2F0dHJpYnV0ZXMnXVskYXR0cmlidXRlX25hbWVdID0gJGF0dHJpYnV0ZV92YWx1ZTsKICAgICAgICAgICAgJHJlc3VsdFskcm93WydlbGVtZW50J11dWyRyb3dbJ2F0dHJpYnV0ZSddXSA9ICRyb3dbJ3ZhbHVlJ107CiAgICAgICAgICAgICRzcWwgPSAibXVsdGlsaW5lIHN0cmluZwpsaW5lMiBpcyBzcGVjaWFsIC0gaXQnbGwgaW50ZXJwb2xhdGUgdmFyaWFibGVzIGxpa2UgJHN0YXRlIGFuZCBtZXRob2QgY2FsbHMKeyR0aGlzLT5jYWNoZS0+YWRkKCRrZXksIDUpfSBhbmQgbWF5YmUgXCJtb3JlXCIKCmxpbmU1IjsKICAgICAgICAgICAgJHNxbCA9ICdtdWx0aWxpbmUgc3RyaW5nCnNpbmdsZSBxdW90aW5nIG1lYW5zIG5vIFwnaW50ZXJwb2xhdGlvblwnIGxpa2UgIiRzdGFydCIgb3IgbWV0aG9kIGNhbGwKeyR0aGlzLT5jYWNoZS0+YWRkKCRrZXksIDUpfSB3aWxsIGhhcHBlbgoKbGluZTUnOwogICAgICAgICAgICAkYml0cGF0dGVybiA9IDEgPDwgMjsKICAgICAgICAgICAgJGJpdHBhdHRlcm4gPDw9IDM7CiAgICAgICAgICAgICRpbmNvcnJlY3QgPSA8PDwgNSBFT1NUUklORyAgLy8gRklYTUU6IENvZGVNaXJyb3IgdXBkYXRlIGJ1ZzogYWRkIGEgbGV0dGVyIGJlZm9yZSA1IGFuZCBub3RpY2UgdGhhdCBzeW50YXggaXMgbm90IHVwZGF0ZWQgdW50aWwgRU9GLCBldmVuIHdpdGggY29udGludW91c1NjYW5uaW5nOiA1MDAKZXJyb3I6IHRoZSBpZGVudGlmaWVyIG11c3QgY29uZm9ybSB0byB0aGUgaWRlbnRpZmllciBydWxlcwpFT1NUUklORzsKICAgICAgICAgICAgJHNxbCA9IDw8PCBFT1NRTAogICAgICAgICAgICAgICAgU0VMRUNUIGF0dHJpYnV0ZSwgZWxlbWVudCwgdmFsdWUKICAgICAgICAgICAgICAgIEZST00gYXR0cmlidXRlX3ZhbHVlcwogICAgICAgICAgICAgICAgV0hFUkUgZGltZW5zaW9uID0gPwpFT1NRTDsKICAgICAgICAgICAgJHRoaXMtPmxyX2NhY2hlLT5hZGQoJGtleSwgc2VsZjo6cmFuZ2UoJHJvd1snbGZ0J10sICRyb3dbJ3JndCddKSk7CiAgICAgICAgICAgICRjb21wb3NpdGVfc3RyaW5nID0gPDw8RU9TVFJJTkcKc29tZSBsaW5lcyBoZXJlCkVPU1RSSU5HCi4gJ3NvbWV0aGluZyBleHRyYSc7CiAgICAgICAgICAgICRwYWdlX2xmdCA9ICgkZG9tYWluLT5uYW1lKCkgPT0gJ3BhZ2UnKSA/ICRzdGFydCArIDEgOiAkcGFnZV9zdGFydCArIDE7CiAgICAgICAgICAgIGVjaG8gIlRoaXMgaXMgY2xhc3MgZm9vIjsKICAgICAgICAgICAgZWNobyAiYSA9ICIuJHRoaXMgLT5hWzIrMyokYXJyYXlbImZvbyJdXS4iIjsKICAgICAgICAgICAgZWNobyAiYiA9IHskdGhpcy0+Yn0iOyAgLy8gRklYTUU6IGhpZ2hsaWdodCBpbnRlcnBvbGF0aW9uIGluIHN0cmluZ3MKICAgICAgICB9CiAgICAgICAgZmluYWwgZnVuY3Rpb24gbWFrZWNvZmZlZSBlcnJvcigkdHlwZXMgPSBhcnJheSgiY2FwcHVjY2lubyIpLCAkY29mZmVlTWFrZXIgPSBOVUxMKSB7CiAgICAgICAgICAgICRvdXRfb2Zfd2F5X2Ftb3VudCA9ICRtYXggLSAkY2hpbGQtPmxlZnQoKSArIDE7CiAgICAgICAgICAgICRhYnNvbHV0ZV9wb3MgPSAkY2hpbGQtPmxlZnQoKSAtICRtb3ZlLT53aWR0aCgpOwogICAgICAgICAgICAkdmFyZnVuYygxLCAneCcpOwogICAgICAgICAgICAkdmFyZnVuYygxLCAneCcpICsgZm9vKCkgLSA1OwogICAgICAgICAgICAkZnVuY2FycmF5WyRpXSgncGFyYW0xJywgJHBhcmFtMik7CiAgICAgICAgICAgICAgICAkbHJbJGRvbWFpbl9uYW1lXSA9ICR0aGlzLT5nZXRfbGVmdF9hbmRfcmlnaHQoJGRvbWFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGltZW5zaW9uX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsZW1lbnRfbmFtZSk7CiAgICAgICAgICAgICRkb21haW5fbGlzdCA9IGlzX251bGwoJGRvbWFpbikgPwogICAgICAgICAgICAgICAgICAgICAgICAgICByM19Eb21haW46Om5hbWVzKCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgkZG9tYWluLT5uYW1lKCkpOwogICAgICAgICAgICBmb3JlYWNoIChyM19Eb21haW46Om5hbWVzKCkgYXMgJGRvbWFpbl9uYW1lKSB7CiAgICAgICAgICAgICAgICAkcGxhY2Vob2xkZXJzID0gJ2Rpc3RhbmNlIExJS0UgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiBpbXBsb2RlKGFycmF5X2ZpbGwoMSwgJG51bV9kaXN0YW5jZXMsICc/JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBPUiBkaXN0YW5jZSBMSUtFICcpOwoKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnRhcmdldCokdGhpcy0+dHJhbnMrbXlmdW5jKF9fTUVUSE9EX18pOwogICAgICAgICAgICAvKgogICAgICAgICAgICBlY2hvICdUaGlzIGlzIGEgdGVzdCc7IC8qIFRoaXMgY29tbWVudCB3aWxsIGNhdXNlIGEgcHJvYmxlbSAqLwogICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgICBzd2l0Y2goICR0eXBlICkgewogICAgICAgICAgICBjYXNlICJyM2NvcmVfQWRkVGVtcGxhdGVUb1RhcmdldEV2ZW50IjoKICAgICAgICAgICAgICAgICR0aGlzLT5ub3RpZnlBZGRUZW1wbGF0ZVRvVGFyZ2V0KCAkZ2VuZXZlbnQgKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJyM2NvcmVfR2VuZXJhdGVUYXJnZXRFdmVudCIgJHRoaXM6CiAgICAgICAgICAgICAgICBmb3IoJGk9MDsgJGk8PXRoaXMtPm1ldGhvZCgpOyAkaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgZWNobyAnU3ludGF4ICJoaWdobGlnaHRpbmciJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkYXJyYXkgeG9yICRsb2FkZXItPnBhcnNlX2ZuKCRmaWxlbmFtZSkgYXMgJGtleSA9PiB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgcjM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uICRlICkgewogICAgICAgICAgICAgICAgICAgIC8qKiByZXN0b3JlIHRoZSBiYWNrdXAKICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5sb2FkQWxsKCR0bXAsICRldmVudCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgLy8gYHBocCAtbGAgZG9lc24ndCBjb21wbGFpbiBhdCBhbGwgYXQgdGhpcyAoaXQgYXNzdW1lcyBzdHJpbmcgY29uc3RhbnRzKToKICAgICAgICAgICAgICAgICAgICB0aGlzICsgbWFrZXMgKiBubyAtIHNlbnNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdCBtb286CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcjNfdXRpbF9FeGNlcHRpb24oIGdldF9jbGFzcyggJGdlbmV2ZW50ICkgLiAiIGRvZXMgbm90IG1hcCIgKTsKICAgICAgICB9CgoKICAgIH07CgogICAgPz4KCiAgICA8cjM6Y3BocD4KICAgICAgICBwaHAoIndvcmtzIiwgJGhlcmUsIDIpOwogICAgPC9yMzpjcGhwPgoKICAgIDxyNDpjcGhwPgogICAgY2xhc3MgZm9vIHsKICAgICAgICAvLyBhIGNvbW1lbnQKICAgICAgICB2YXIgJGE7CiAgICAgICAgdmFyICRiOwogICAgfTsKICAgIDwvcjQ6Y3BocD4KCiAgPGgxPlRoaXMgaXMgYW4gPD9waHAgIyBlY2hvICdzaW1wbGUnOz8+IGV4YW1wbGUuPC9oMT4KICA8cD5UaGUgaGVhZGVyIGFib3ZlIHdpbGwgc2F5ICdUaGlzIGlzIGFuICBleGFtcGxlJy48L3A+CiAgPGgxPlRoaXMgaXMgYW4gPD9waHAgLy8gZWNobyAnc2ltcGxlJzs/PiBleGFtcGxlLjwvaDE+CgogIDw/cGhwIGVjaG87ID8+CiAgICA8Ym9keT4KCjw/cGhwIGVjaG8gIjxodG1sPgogIDxoZWFkPgogICAgPHNjcmlwdD4KICAgIHZhciBmb28gPSAnYmFyJzsKICAgIDwvc2NyaXB0PgogICAgPHN0eWxlPgogICAgICBzcGFuLnRlc3Qge2ZvbnQtZmFtaWx5OiBhcmlhbCwgJ2x1Y2lkYSBjb25zb2xlJywgc2Fucy1zZXJpZn0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPCEtLSBjb21tZW50IC0tPgogIDwvYm9keT4KPC9odG1sPiI7ID8+Cgo8L2JvZHk+CjwvaHRtbD4KCgogICAgPC90ZXh0YXJlYT4KICAgIDwvZGl2PgoKICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKCdjb2RlJywgewogICAgICAgIGhlaWdodDogIjM1MHB4IiwKICAgICAgICBwYXJzZXJmaWxlOiBbInBhcnNleG1sLmpzIiwgInBhcnNlY3NzLmpzIiwgInRva2VuaXplamF2YXNjcmlwdC5qcyIsICJwYXJzZWphdmFzY3JpcHQuanMiLAogICAgICAgICAgICAgICAgICAgICAiLi4vY29udHJpYi9waHAvanMvdG9rZW5pemVwaHAuanMiLCAiLi4vY29udHJpYi9waHAvanMvcGFyc2VwaHAuanMiLAogICAgICAgICAgICAgICAgICAgICAiLi4vY29udHJpYi9waHAvanMvcGFyc2VwaHBodG1sbWl4ZWQuanMiXSwKICAgICAgICBzdHlsZXNoZWV0OiBbIi4uLy4uL2Nzcy94bWxjb2xvcnMuY3NzIiwgIi4uLy4uL2Nzcy9qc2NvbG9ycy5jc3MiLCAiLi4vLi4vY3NzL2Nzc2NvbG9ycy5jc3MiLCAiY3NzL3BocGNvbG9ycy5jc3MiXSwKICAgICAgICBwYXRoOiAiLi4vLi4vanMvIiwKICAgICAgICBjb250aW51b3VzU2Nhbm5pbmc6IDUwMAogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/js/parsephp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhlIGNvcHlyaWdodHMgZW1ib2RpZWQgaW4gdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGFyZSBsaWNlbnNlZCBieQpZYWhvbyEgSW5jLiB1bmRlciB0aGUgQlNEIChyZXZpc2VkKSBvcGVuIHNvdXJjZSBsaWNlbnNlCgpAYXV0aG9yIERhbiBWbGFkIERhc2NhbGVzY3UgPGRhbmR2QHlhaG9vLWluYy5jb20+CgoKUGFyc2UgZnVuY3Rpb24gZm9yIFBIUC4gTWFrZXMgdXNlIG9mIHRoZSB0b2tlbml6ZXIgZnJvbSB0b2tlbml6ZXBocC5qcy4KQmFzZWQgb24gcGFyc2VqYXZhc2NyaXB0LmpzIGJ5IE1hcmlqbiBIYXZlcmJla2UuCgoKRmVhdHVyZXM6CiArIHNwZWNpYWwgImRlcHJlY2F0ZWQiIHN0eWxlIGZvciBQSFA0IGtleXdvcmRzIGxpa2UgJ3ZhcicKICsgc3VwcG9ydCBmb3IgUEhQIDUuMyBrZXl3b3JkczogJ25hbWVzcGFjZScsICd1c2UnCiArIDkxMSBwcmVkZWZpbmVkIGNvbnN0YW50cywgMTMwMSBwcmVkZWZpbmVkIGZ1bmN0aW9ucywgMTA1IHByZWRlY2xhcmVkIGNsYXNzZXMKICAgZnJvbSBhIHR5cGljYWwgUEhQIGluc3RhbGxhdGlvbiBpbiBhIExBTVAgZW52aXJvbm1lbnQKICsgbmV3IGZlYXR1cmU6IHN5bnRheCBlcnJvciBmbGFnZ2luZywgdGh1cyBlbmFibGluZyBzdHJpY3QgcGFyc2luZyBvZjoKICAgKyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aXRoIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSB0eXBlZCBhcmd1bWVudHMgYW5kIGRlZmF1bHQgdmFsdWVzCiAgICsgbW9kaWZpZXJzIChwdWJsaWMsIHN0YXRpYyBldGMuKSBhcHBsaWVkIHRvIG1ldGhvZCBhbmQgbWVtYmVyIGRlZmluaXRpb25zCiAgICsgZm9yZWFjaChhcnJheV9leHByZXNzaW9uIGFzICRrZXkgWz0+ICR2YWx1ZV0pIGxvb3BzCiArIGRpZmZlcmVudGlhdGlvbiBiZXR3ZWVuIHNpbmdsZS1xdW90ZWQgc3RyaW5ncyBhbmQgZG91YmxlLXF1b3RlZCBpbnRlcnBvbGF0aW5nIHN0cmluZ3MKCiovCgoKLy8gYWRkIHRoZSBBcnJheS5pbmRleE9mIG1ldGhvZCBmb3IgSlMgZW5naW5lcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQgKGUuZy4gSUUpCi8vIGNvZGUgZnJvbSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9Fbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9JbmRleE9mCmlmICghQXJyYXkucHJvdG90eXBlLmluZGV4T2YpCnsKICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uKGVsdCAvKiwgZnJvbSovKQogIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKCiAgICB2YXIgZnJvbSA9IE51bWJlcihhcmd1bWVudHNbMV0pIHx8IDA7CiAgICBmcm9tID0gKGZyb20gPCAwKQogICAgICAgICA/IE1hdGguY2VpbChmcm9tKQogICAgICAgICA6IE1hdGguZmxvb3IoZnJvbSk7CiAgICBpZiAoZnJvbSA8IDApCiAgICAgIGZyb20gKz0gbGVuOwoKICAgIGZvciAoOyBmcm9tIDwgbGVuOyBmcm9tKyspCiAgICB7CiAgICAgIGlmIChmcm9tIGluIHRoaXMgJiYKICAgICAgICAgIHRoaXNbZnJvbV0gPT09IGVsdCkKICAgICAgICByZXR1cm4gZnJvbTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9Owp9OwoKCnZhciBQSFBQYXJzZXIgPSBFZGl0b3IuUGFyc2VyID0gKGZ1bmN0aW9uKCkgewogIC8vIFRva2VuIHR5cGVzIHRoYXQgY2FuIGJlIGNvbnNpZGVyZWQgdG8gYmUgYXRvbXMsIHBhcnQgb2Ygb3BlcmF0b3IgZXhwcmVzc2lvbnMKICB2YXIgYXRvbWljVHlwZXMgPSB7CiAgICAiYXRvbSI6IHRydWUsICJudW1iZXIiOiB0cnVlLCAidmFyaWFibGUiOiB0cnVlLCAic3RyaW5nIjogdHJ1ZQogIH07CiAgLy8gQ29uc3RydWN0b3IgZm9yIHRoZSBsZXhpY2FsIGNvbnRleHQgb2JqZWN0cy4KICBmdW5jdGlvbiBQSFBMZXhpY2FsKGluZGVudGVkLCBjb2x1bW4sIHR5cGUsIGFsaWduLCBwcmV2LCBpbmZvKSB7CiAgICAvLyBpbmRlbnRhdGlvbiBhdCBzdGFydCBvZiB0aGlzIGxpbmUKICAgIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDsKICAgIC8vIGNvbHVtbiBhdCB3aGljaCB0aGlzIHNjb3BlIHdhcyBvcGVuZWQKICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwogICAgLy8gdHlwZSBvZiBzY29wZSAoJ3N0YXQnIChzdGF0ZW1lbnQpLCAnZm9ybScgKHNwZWNpYWwgZm9ybSksICdbJywgJ3snLCBvciAnKCcpCiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgLy8gJ1snLCAneycsIG9yICcoJyBibG9ja3MgdGhhdCBoYXZlIGFueSB0ZXh0IGFmdGVyIHRoZWlyIG9wZW5pbmcKICAgIC8vIGNoYXJhY3RlciBhcmUgc2FpZCB0byBiZSAnYWxpZ25lZCcgLS0gYW55IGxpbmVzIGJlbG93IGFyZQogICAgLy8gaW5kZW50ZWQgYWxsIHRoZSB3YXkgdG8gdGhlIG9wZW5pbmcgY2hhcmFjdGVyLgogICAgaWYgKGFsaWduICE9IG51bGwpCiAgICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKICAgIC8vIFBhcmVudCBzY29wZSwgaWYgYW55LgogICAgdGhpcy5wcmV2ID0gcHJldjsKICAgIHRoaXMuaW5mbyA9IGluZm87CiAgfTsKCiAgLy8gUEhQIGluZGVudGF0aW9uIHJ1bGVzCiAgZnVuY3Rpb24gaW5kZW50UEhQKGxleGljYWwpIHsKICAgIHJldHVybiBmdW5jdGlvbihmaXJzdENoYXJzKSB7CiAgICAgIHZhciBmaXJzdENoYXIgPSBmaXJzdENoYXJzICYmIGZpcnN0Q2hhcnMuY2hhckF0KDApLCB0eXBlID0gbGV4aWNhbC50eXBlOwogICAgICB2YXIgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSB0eXBlOwogICAgICBpZiAodHlwZSA9PSAiZm9ybSIgJiYgZmlyc3RDaGFyID09ICJ7IikKICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZDsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAic3RhdCIgfHwgdHlwZSA9PSAiZm9ybSIpCiAgICAgICAgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyBpbmRlbnRVbml0OwogICAgICBlbHNlIGlmIChsZXhpY2FsLmluZm8gPT0gInN3aXRjaCIgJiYgIWNsb3NpbmcpCiAgICAgICAgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyAoL14oPzpjYXNlfGRlZmF1bHQpXGIvLnRlc3QoZmlyc3RDaGFycykgPyBpbmRlbnRVbml0IDogMiAqIGluZGVudFVuaXQpOwogICAgICBlbHNlIGlmIChsZXhpY2FsLmFsaWduKQogICAgICAgIHJldHVybiBsZXhpY2FsLmNvbHVtbiAtIChjbG9zaW5nID8gMSA6IDApOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyAoY2xvc2luZyA/IDAgOiBpbmRlbnRVbml0KTsKICAgIH07CiAgfTsKCiAgLy8gVGhlIHBhcnNlci1pdGVyYXRvci1wcm9kdWNpbmcgZnVuY3Rpb24gaXRzZWxmLgogIGZ1bmN0aW9uIHBhcnNlUEhQKGlucHV0LCBiYXNlY29sdW1uKSB7CiAgICAvLyBXcmFwIHRoZSBpbnB1dCBpbiBhIHRva2VuIHN0cmVhbQogICAgdmFyIHRva2VucyA9IHRva2VuaXplUEhQKGlucHV0KTsKICAgIC8vIFRoZSBwYXJzZXIgc3RhdGUuIGNjIGlzIGEgc3RhY2sgb2YgYWN0aW9ucyB0aGF0IGhhdmUgdG8gYmUKICAgIC8vIHBlcmZvcm1lZCB0byBmaW5pc2ggdGhlIGN1cnJlbnQgc3RhdGVtZW50LiBGb3IgZXhhbXBsZSB3ZSBtaWdodAogICAgLy8ga25vdyB0aGF0IHdlIHN0aWxsIG5lZWQgdG8gZmluZCBhIGNsb3NpbmcgcGFyZW50aGVzaXMgYW5kIGEKICAgIC8vIHNlbWljb2xvbi4gQWN0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBzdGFjayBnbyBmaXJzdC4gSXQgaXMKICAgIC8vIGluaXRpYWxpemVkIHdpdGggYW4gaW5maW5pdGVseSBsb29waW5nIGFjdGlvbiB0aGF0IGNvbnN1bWVzCiAgICAvLyB3aG9sZSBzdGF0ZW1lbnRzLgogICAgdmFyIGNjID0gW3N0YXRlbWVudHNdOwogICAgLy8gVGhlIGxleGljYWwgc2NvcGUsIHVzZWQgbW9zdGx5IGZvciBpbmRlbnRhdGlvbi4KICAgIHZhciBsZXhpY2FsID0gbmV3IFBIUExleGljYWwoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAiYmxvY2siLCBmYWxzZSk7CiAgICAvLyBDdXJyZW50IGNvbHVtbiwgYW5kIHRoZSBpbmRlbnRhdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQKICAgIC8vIGxpbmUuIFVzZWQgdG8gY3JlYXRlIGxleGljYWwgc2NvcGUgb2JqZWN0cy4KICAgIHZhciBjb2x1bW4gPSAwOwogICAgdmFyIGluZGVudGVkID0gMDsKICAgIC8vIFZhcmlhYmxlcyB3aGljaCBhcmUgdXNlZCBieSB0aGUgbWFyaywgY29udCwgYW5kIHBhc3MgZnVuY3Rpb25zCiAgICAvLyBiZWxvdyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBkcml2ZXIgbG9vcCBpbiB0aGUgJ25leHQnIGZ1bmN0aW9uLgogICAgdmFyIGNvbnN1bWUsIG1hcmtlZDsKCiAgICAvLyBUaGUgaXRlcmF0b3Igb2JqZWN0LgogICAgdmFyIHBhcnNlciA9IHtuZXh0OiBuZXh0LCBjb3B5OiBjb3B5fTsKCiAgICAvLyBwYXJzaW5nIGlzIGFjY29tcGxpc2hlZCBieSBjYWxsaW5nIG5leHQoKSByZXBlYXRlZGx5CiAgICBmdW5jdGlvbiBuZXh0KCl7CiAgICAgIC8vIFN0YXJ0IGJ5IHBlcmZvcm1pbmcgYW55ICdsZXhpY2FsJyBhY3Rpb25zIChhZGp1c3RpbmcgdGhlCiAgICAgIC8vIGxleGljYWwgdmFyaWFibGUpLCBvciB0aGUgb3BlcmF0aW9ucyBiZWxvdyB3aWxsIGJlIHdvcmtpbmcKICAgICAgLy8gd2l0aCB0aGUgd3JvbmcgbGV4aWNhbCBzdGF0ZS4KICAgICAgd2hpbGUoY2NbY2MubGVuZ3RoIC0gMV0ubGV4KQogICAgICAgIGNjLnBvcCgpKCk7CgogICAgICAvLyBGZXRjaCB0aGUgbmV4dCB0b2tlbi4KICAgICAgdmFyIHRva2VuID0gdG9rZW5zLm5leHQoKTsKCiAgICAgIC8vIEFkanVzdCBjb2x1bW4gYW5kIGluZGVudGVkLgogICAgICBpZiAodG9rZW4udHlwZSA9PSAid2hpdGVzcGFjZSIgJiYgY29sdW1uID09IDApCiAgICAgICAgaW5kZW50ZWQgPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgIGNvbHVtbiArPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgIGlmICh0b2tlbi5jb250ZW50ID09ICJcbiIpewogICAgICAgIGluZGVudGVkID0gY29sdW1uID0gMDsKICAgICAgICAvLyBJZiB0aGUgbGV4aWNhbCBzY29wZSdzIGFsaWduIHByb3BlcnR5IGlzIHN0aWxsIHVuZGVmaW5lZCBhdAogICAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIGxpbmUsIGl0IGlzIGFuIHVuLWFsaWduZWQgc2NvcGUuCiAgICAgICAgaWYgKCEoImFsaWduIiBpbiBsZXhpY2FsKSkKICAgICAgICAgIGxleGljYWwuYWxpZ24gPSBmYWxzZTsKICAgICAgICAvLyBOZXdsaW5lIHRva2VucyBnZXQgYW4gaW5kZW50YXRpb24gZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoCiAgICAgICAgLy8gdGhlbS4KICAgICAgICB0b2tlbi5pbmRlbnRhdGlvbiA9IGluZGVudFBIUChsZXhpY2FsKTsKICAgICAgfQogICAgICAvLyBObyBtb3JlIHByb2Nlc3NpbmcgZm9yIG1lYW5pbmdsZXNzIHRva2Vucy4KICAgICAgaWYgKHRva2VuLnR5cGUgPT0gIndoaXRlc3BhY2UiIHx8IHRva2VuLnR5cGUgPT0gImNvbW1lbnQiCiAgICAgICAgfHwgdG9rZW4udHlwZSA9PSAic3RyaW5nX25vdF90ZXJtaW5hdGVkIiApCiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAvLyBXaGVuIGEgbWVhbmluZ2Z1bCB0b2tlbiBpcyBmb3VuZCBhbmQgdGhlIGxleGljYWwgc2NvcGUncwogICAgICAvLyBhbGlnbiBpcyB1bmRlZmluZWQsIGl0IGlzIGFuIGFsaWduZWQgc2NvcGUuCiAgICAgIGlmICghKCJhbGlnbiIgaW4gbGV4aWNhbCkpCiAgICAgICAgbGV4aWNhbC5hbGlnbiA9IHRydWU7CgogICAgICAvLyBFeGVjdXRlIGFjdGlvbnMgdW50aWwgb25lICdjb25zdW1lcycgdGhlIHRva2VuIGFuZCB3ZSBjYW4KICAgICAgLy8gcmV0dXJuIGl0LiAnbWFya2VkJyBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgc3R5bGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4uCiAgICAgIHdoaWxlKHRydWUpIHsKICAgICAgICBjb25zdW1lID0gbWFya2VkID0gZmFsc2U7CiAgICAgICAgLy8gVGFrZSBhbmQgZXhlY3V0ZSB0aGUgdG9wbW9zdCBhY3Rpb24uCiAgICAgICAgdmFyIGFjdGlvbiA9IGNjLnBvcCgpOwogICAgICAgIGFjdGlvbih0b2tlbik7CgogICAgICAgIGlmIChjb25zdW1lKXsKICAgICAgICAgIGlmIChtYXJrZWQpCiAgICAgICAgICAgIHRva2VuLnN0eWxlID0gbWFya2VkOwogICAgICAgICAgLy8gSGVyZSB3ZSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbG9jYWwgYW5kIGdsb2JhbCB2YXJpYWJsZXMuCiAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAxOyAvLyBGaXJlYnVnIHdvcmthcm91bmQgZm9yIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9mYnVnL2lzc3Vlcy9kZXRhaWw/aWQ9MTIzOSNjMQogICAgfQoKICAgIC8vIFRoaXMgbWFrZXMgYSBjb3B5IG9mIHRoZSBwYXJzZXIgc3RhdGUuIEl0IHN0b3JlcyBhbGwgdGhlCiAgICAvLyBzdGF0ZWZ1bCB2YXJpYWJsZXMgaW4gYSBjbG9zdXJlLCBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQKICAgIC8vIHdpbGwgcmVzdG9yZSB0aGVtIHdoZW4gY2FsbGVkIHdpdGggYSBuZXcgaW5wdXQgc3RyZWFtLiBOb3RlCiAgICAvLyB0aGF0IHRoZSBjYyBhcnJheSBoYXMgdG8gYmUgY29waWVkLCBiZWNhdXNlIGl0IGlzIGNvbnRhbnRseQogICAgLy8gYmVpbmcgbW9kaWZpZWQuIExleGljYWwgb2JqZWN0cyBhcmUgbm90IG11dGF0ZWQsIHNvIHRoZXkgY2FuCiAgICAvLyBiZSBzaGFyZWQgYmV0d2VlbiBydW5zIG9mIHRoZSBwYXJzZXIuCiAgICBmdW5jdGlvbiBjb3B5KCl7CiAgICAgIHZhciBfbGV4aWNhbCA9IGxleGljYWwsIF9jYyA9IGNjLmNvbmNhdChbXSksIF90b2tlblN0YXRlID0gdG9rZW5zLnN0YXRlOwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvcHlQYXJzZXIoaW5wdXQpewogICAgICAgIGxleGljYWwgPSBfbGV4aWNhbDsKICAgICAgICBjYyA9IF9jYy5jb25jYXQoW10pOyAvLyBjb3BpZXMgdGhlIGFycmF5CiAgICAgICAgY29sdW1uID0gaW5kZW50ZWQgPSAwOwogICAgICAgIHRva2VucyA9IHRva2VuaXplUEhQKGlucHV0LCBfdG9rZW5TdGF0ZSk7CiAgICAgICAgcmV0dXJuIHBhcnNlcjsKICAgICAgfTsKICAgIH0KCiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHB1c2hpbmcgYSBudW1iZXIgb2YgYWN0aW9ucyBvbnRvIHRoZSBjYwogICAgLy8gc3RhY2sgaW4gcmV2ZXJzZSBvcmRlci4KICAgIGZ1bmN0aW9uIHB1c2goZnMpewogICAgICBmb3IgKHZhciBpID0gZnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgICAgY2MucHVzaChmc1tpXSk7CiAgICB9CiAgICAvLyBjb250IGFuZCBwYXNzIGFyZSB1c2VkIGJ5IHRoZSBhY3Rpb24gZnVuY3Rpb25zIHRvIGFkZCBvdGhlcgogICAgLy8gYWN0aW9ucyB0byB0aGUgc3RhY2suIGNvbnQgd2lsbCBjYXVzZSB0aGUgY3VycmVudCB0b2tlbiB0byBiZQogICAgLy8gY29uc3VtZWQsIHBhc3Mgd2lsbCBsZWF2ZSBpdCBmb3IgdGhlIG5leHQgYWN0aW9uLgogICAgZnVuY3Rpb24gY29udCgpewogICAgICBwdXNoKGFyZ3VtZW50cyk7CiAgICAgIGNvbnN1bWUgPSB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gcGFzcygpewogICAgICBwdXNoKGFyZ3VtZW50cyk7CiAgICAgIGNvbnN1bWUgPSBmYWxzZTsKICAgIH0KICAgIC8vIFVzZWQgdG8gY2hhbmdlIHRoZSBzdHlsZSBvZiB0aGUgY3VycmVudCB0b2tlbi4KICAgIGZ1bmN0aW9uIG1hcmsoc3R5bGUpewogICAgICBtYXJrZWQgPSBzdHlsZTsKICAgIH0KICAgIC8vIEFkZCBhIGx5ZXIgb2Ygc3R5bGUgdG8gdGhlIGN1cnJlbnQgdG9rZW4sIGZvciBleGFtcGxlIHN5bnRheC1lcnJvcgogICAgZnVuY3Rpb24gbWFya19hZGQoc3R5bGUpewogICAgICBtYXJrZWQgPSBtYXJrZWQgKyAnICcgKyBzdHlsZTsKICAgIH0KCiAgICAvLyBQdXNoIGEgbmV3IGxleGljYWwgY29udGV4dCBvZiB0aGUgZ2l2ZW4gdHlwZS4KICAgIGZ1bmN0aW9uIHB1c2hsZXgodHlwZSwgaW5mbykgewogICAgICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24gcHVzaGxleGluZygpIHsKICAgICAgICBsZXhpY2FsID0gbmV3IFBIUExleGljYWwoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgbnVsbCwgbGV4aWNhbCwgaW5mbykKICAgICAgfTsKICAgICAgcmVzdWx0LmxleCA9IHRydWU7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvLyBQb3Agb2ZmIHRoZSBjdXJyZW50IGxleGljYWwgY29udGV4dC4KICAgIGZ1bmN0aW9uIHBvcGxleCgpewogICAgICBsZXhpY2FsID0gbGV4aWNhbC5wcmV2OwogICAgfQogICAgcG9wbGV4LmxleCA9IHRydWU7CiAgICAvLyBUaGUgJ2xleCcgZmxhZyBvbiB0aGVzZSBhY3Rpb25zIGlzIHVzZWQgYnkgdGhlICduZXh0JyBmdW5jdGlvbgogICAgLy8gdG8ga25vdyB0aGV5IGNhbiAoYW5kIGhhdmUgdG8pIGJlIHJhbiBiZWZvcmUgbW92aW5nIG9uIHRvIHRoZQogICAgLy8gbmV4dCB0b2tlbi4KCiAgICAvLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGRpc2NhcmRzIHRva2VucyB1bnRpbCBpdCBmaW5kcyBvbmUgb2YKICAgIC8vIHRoZSBnaXZlbiB0eXBlLiBUaGlzIHdpbGwgaWdub3JlIChhbmQgcmVjb3ZlciBmcm9tKSBzeW50YXggZXJyb3JzLgogICAgZnVuY3Rpb24gZXhwZWN0KHdhbnRlZCl7CiAgICAgIHJldHVybiBmdW5jdGlvbiBleHBlY3RpbmcodG9rZW4pewogICAgICAgIGlmICh0b2tlbi50eXBlID09IHdhbnRlZCkgY29udCgpOyAgLy8gY29uc3VtZSB0aGUgdG9rZW4KICAgICAgICBlbHNlIHsKICAgICAgICAgIGNvbnQoYXJndW1lbnRzLmNhbGxlZSk7ICAvLyBjb250aW51ZSBleHBlY3RpbmcoKSAtIGNhbGwgaXRzZWxmCiAgICAgICAgfQogICAgICB9OwogICAgfQoKICAgIC8vIFJlcXVpcmUgYSBzcGVjaWZpYyB0b2tlbiB0eXBlLCBvciBvbmUgb2YgdGhlIHRva2VucyBwYXNzZWQgaW4gdGhlICd3YW50ZWQnIGFycmF5CiAgICAvLyBVc2VkIHRvIGRldGVjdCBibGF0YW50IHN5bnRheCBlcnJvcnMuICdleGVjdXRlJyBpcyB1c2VkIHRvIHBhc3MgZXh0cmEgY29kZQogICAgLy8gdG8gYmUgZXhlY3V0ZWQgaWYgdGhlIHRva2VuIGlzIG1hdGNoZWQuIEZvciBleGFtcGxlLCBhICcoJyBtYXRjaCBjb3VsZAogICAgLy8gJ2V4ZWN1dGUnIGEgY29udCggY29tcGFzZXAoZnVuY2FyZyksIHJlcXVpcmUoIikiKSApCiAgICBmdW5jdGlvbiByZXF1aXJlKHdhbnRlZCwgZXhlY3V0ZSl7CiAgICAgIHJldHVybiBmdW5jdGlvbiByZXF1aXJpbmcodG9rZW4pewogICAgICAgIHZhciBvazsKICAgICAgICB2YXIgdHlwZSA9IHRva2VuLnR5cGU7CiAgICAgICAgaWYgKHR5cGVvZih3YW50ZWQpID09ICJzdHJpbmciKQogICAgICAgICAgb2sgPSAodHlwZSA9PSB3YW50ZWQpIC0xOwogICAgICAgIGVsc2UKICAgICAgICAgIG9rID0gd2FudGVkLmluZGV4T2YodHlwZSk7CiAgICAgICAgaWYgKG9rID49IDApIHsKICAgICAgICAgIGlmIChleGVjdXRlICYmIHR5cGVvZihleGVjdXRlW29rXSkgPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgZXhlY3V0ZVtva10odG9rZW4pOwogICAgICAgICAgICBjb250KCk7ICAvLyBqdXN0IGNvbnN1bWUgdGhlIHRva2VuCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgaWYgKCFtYXJrZWQpIG1hcmsodG9rZW4uc3R5bGUpOwogICAgICAgICAgbWFya19hZGQoInN5bnRheC1lcnJvciIpOwogICAgICAgICAgY29udChhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgLy8gTG9va3MgZm9yIGEgc3RhdGVtZW50LCBhbmQgdGhlbiBjYWxscyBpdHNlbGYuCiAgICBmdW5jdGlvbiBzdGF0ZW1lbnRzKHRva2VuKXsKICAgICAgcmV0dXJuIHBhc3Moc3RhdGVtZW50LCBzdGF0ZW1lbnRzKTsKICAgIH0KICAgIC8vIERpc3BhdGNoZXMgdmFyaW91cyB0eXBlcyBvZiBzdGF0ZW1lbnRzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IHRva2VuLgogICAgZnVuY3Rpb24gc3RhdGVtZW50KHRva2VuKXsKICAgICAgdmFyIHR5cGUgPSB0b2tlbi50eXBlOwogICAgICBpZiAodHlwZSA9PSAia2V5d29yZCBhIikgY29udChwdXNobGV4KCJmb3JtIiksIGV4cHJlc3Npb24sIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAia2V5d29yZCBiIikgY29udChwdXNobGV4KCJmb3JtIiksIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAieyIpIGNvbnQocHVzaGxleCgifSIpLCBibG9jaywgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZnVuY3Rpb24iKSBmdW5jZGVmKCk7CiAgICAgIC8vIHRlY2huaWNhbGx5LCAiY2xhc3MgaW1wbG9kZSB7Li4ufSIgaXMgY29ycmVjdCwgYnV0IHdlJ2xsIGZsYWcgdGhhdCBhcyBhbiBlcnJvciBiZWNhdXNlIGl0IG92ZXJyaWRlcyBhIHByZWRlZmluZWQgZnVuY3Rpb24KICAgICAgZWxzZSBpZiAodHlwZSA9PSAiY2xhc3MiKSBjb250KHJlcXVpcmUoInRfc3RyaW5nIiksIGV4cGVjdCgieyIpLCBwdXNobGV4KCJ9IiksIGJsb2NrLCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmb3JlYWNoIikgY29udChwdXNobGV4KCJmb3JtIiksIHJlcXVpcmUoIigiKSwgcHVzaGxleCgiKSIpLCBleHByZXNzaW9uLCByZXF1aXJlKCJhcyIpLCByZXF1aXJlKCJ2YXJpYWJsZSIpLCAvKiA9PiAkdmFsdWUgKi8gZXhwZWN0KCIpIiksIHBvcGxleCwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmb3IiKSBjb250KHB1c2hsZXgoImZvcm0iKSwgcmVxdWlyZSgiKCIpLCBwdXNobGV4KCIpIiksIGV4cHJlc3Npb24sIHJlcXVpcmUoIjsiKSwgZXhwcmVzc2lvbiwgcmVxdWlyZSgiOyIpLCBleHByZXNzaW9uLCByZXF1aXJlKCIpIiksIHBvcGxleCwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICAvLyBwdWJsaWMgZmluYWwgZnVuY3Rpb24gZm9vKCksIHByb3RlY3RlZCBzdGF0aWMgJGJhcjsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAibW9kaWZpZXIiKSBjb250KHJlcXVpcmUoWyJtb2RpZmllciIsICJ2YXJpYWJsZSIsICJmdW5jdGlvbiJdLCBbbnVsbCwgbnVsbCwgZnVuY2RlZl0pKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAic3dpdGNoIikgY29udChwdXNobGV4KCJmb3JtIiksIHJlcXVpcmUoIigiKSwgZXhwcmVzc2lvbiwgcmVxdWlyZSgiKSIpLCBwdXNobGV4KCJ9IiwgInN3aXRjaCIpLCByZXF1aXJlKFsiOiIsICJ7Il0pLCBibG9jaywgcG9wbGV4LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJjYXNlIikgY29udChleHByZXNzaW9uLCByZXF1aXJlKCI6IikpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJkZWZhdWx0IikgY29udChyZXF1aXJlKCI6IikpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJjYXRjaCIpIGNvbnQocHVzaGxleCgiZm9ybSIpLCByZXF1aXJlKCIoIiksIHJlcXVpcmUoInRfc3RyaW5nIiksIHJlcXVpcmUoInZhcmlhYmxlIiksIHJlcXVpcmUoIikiKSwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJjb25zdCIpIGNvbnQocmVxdWlyZSgidF9zdHJpbmciKSk7ICAvLyAnY29uc3Qgc3RhdGljIHg9NScgaXMgYSBzeW50YXggZXJyb3IKICAgICAgLy8gdGVjaG5pY2FsbHksICJuYW1lc3BhY2UgaW1wbG9kZSB7Li4ufSIgaXMgY29ycmVjdCwgYnV0IHdlJ2xsIGZsYWcgdGhhdCBhcyBhbiBlcnJvciBiZWNhdXNlIGl0IG92ZXJyaWRlcyBhIHByZWRlZmluZWQgZnVuY3Rpb24KICAgICAgZWxzZSBpZiAodHlwZSA9PSAibmFtZXNwYWNlIikgY29udChuYW1lc3BhY2VkZWYsIHJlcXVpcmUoIjsiKSk7CiAgICAgIC8vICR2YXJpYWJsZXMgbWF5IGJlIGZvbGxvd2VkIGJ5IG9wZXJhdG9ycywgKCkgZm9yIHZhcmlhYmxlIGZ1bmN0aW9uIGNhbGxzLCBvciBbXSBzdWJzY3JpcHRzCiAgICAgIGVsc2UgcGFzcyhwdXNobGV4KCJzdGF0IiksIGV4cHJlc3Npb24sIHJlcXVpcmUoIjsiKSwgcG9wbGV4KTsKICAgIH0KICAgIC8vIERpc3BhdGNoIGV4cHJlc3Npb24gdHlwZXMuCiAgICBmdW5jdGlvbiBleHByZXNzaW9uKHRva2VuKXsKICAgICAgdmFyIHR5cGUgPSB0b2tlbi50eXBlOwogICAgICBpZiAoYXRvbWljVHlwZXMuaGFzT3duUHJvcGVydHkodHlwZSkpIGNvbnQobWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIjw8PCIpIGNvbnQocmVxdWlyZSgic3RyaW5nIiksIG1heWJlb3BlcmF0b3IpOyAgLy8gaGVyZWRvYy9ub3dkb2MKICAgICAgZWxzZSBpZiAodHlwZSA9PSAidF9zdHJpbmciKSBjb250KG1heWJlX2RvdWJsZV9jb2xvbiwgbWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImtleXdvcmQgYyIpIGNvbnQoZXhwcmVzc2lvbik7CiAgICAgIC8vIGZ1bmN0aW9uIGNhbGwgb3IgcGFyZW50aGVzaXplZCBleHByZXNzaW9uOiAkYSA9ICgkYiArIDEpICogMjsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiKCIpIGNvbnQocHVzaGxleCgiKSIpLCBjb21tYXNlcChleHByZXNzaW9uKSwgcmVxdWlyZSgiKSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJvcGVyYXRvciIpIGNvbnQoZXhwcmVzc2lvbik7CiAgICB9CiAgICAvLyBDYWxsZWQgZm9yIHBsYWNlcyB3aGVyZSBvcGVyYXRvcnMsIGZ1bmN0aW9uIGNhbGxzLCBvciBzdWJzY3JpcHRzIGFyZQogICAgLy8gdmFsaWQuIFdpbGwgc2tpcCBvbiB0byB0aGUgbmV4dCBhY3Rpb24gaWYgbm9uZSBpcyBmb3VuZC4KICAgIGZ1bmN0aW9uIG1heWJlb3BlcmF0b3IodG9rZW4pewogICAgICB2YXIgdHlwZSA9IHRva2VuLnR5cGU7CiAgICAgIGlmICh0eXBlID09ICJvcGVyYXRvciIpIHsKICAgICAgICBpZiAodG9rZW4uY29udGVudCA9PSAiPyIpIGNvbnQoZXhwcmVzc2lvbiwgcmVxdWlyZSgiOiIpLCBleHByZXNzaW9uKTsgIC8vIHRlcm5hcnkgb3BlcmF0b3IKICAgICAgICBlbHNlIGNvbnQoZXhwcmVzc2lvbik7CiAgICAgIH0KICAgICAgZWxzZSBpZiAodHlwZSA9PSAiKCIpIGNvbnQocHVzaGxleCgiKSIpLCBleHByZXNzaW9uLCBjb21tYXNlcChleHByZXNzaW9uKSwgcmVxdWlyZSgiKSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IgLyogJHZhcmZ1bmMoKSArIDMgKi8pOwogICAgICBlbHNlIGlmICh0eXBlID09ICJbIikgY29udChwdXNobGV4KCJdIiksIGV4cHJlc3Npb24sIHJlcXVpcmUoIl0iKSwgbWF5YmVvcGVyYXRvciAvKiBmb3IgbXVsdGlkaW1lbnNpb25hbCBhcnJheXMsIG9yICRmdW5jWyRpXSgpICovLCBwb3BsZXgpOwogICAgfQogICAgLy8gQSByZWd1bGFyIHVzZSBvZiB0aGUgZG91YmxlIGNvbG9uIHRvIHNwZWNpZnkgYSBjbGFzcywgYXMgaW4gc2VsZjo6ZnVuYygpIG9yIG15Y2xhc3M6OiR2YXI7CiAgICAvLyBEaWZmZXJzIGZyb20gYG5hbWVzcGFjZWAgb3IgYHVzZWAgaW4gdGhhdCBvbmx5IG9uZSBjbGFzcyBjYW4gYmUgdGhlIHBhcmVudDsgY2hhaW5zIChBOjpCOjokdmFyKSBhcmUgYSBzeW50YXggZXJyb3IuCiAgICBmdW5jdGlvbiBtYXliZV9kb3VibGVfY29sb24odG9rZW4pIHsKICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInRfZG91YmxlX2NvbG9uIikKICAgICAgICAvLyBBOjokdmFyLCBBOjpmdW5jKCksIEE6OmNvbnN0CiAgICAgICAgY29udChyZXF1aXJlKFsidF9zdHJpbmciLCAidmFyaWFibGUiXSksIG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIHsKICAgICAgICAvLyBhIHRfc3RyaW5nIHdhc24ndCBmb2xsb3dlZCBieSA6Oiwgc3VjaCBhcyBpbiBhIGZ1bmN0aW9uIGNhbGw6IGZvbygpCiAgICAgICAgcGFzcyhleHByZXNzaW9uKQogICAgICB9CiAgICB9CiAgICAvLyB0aGUgZGVjbGFyYXRpb24gb3IgZGVmaW5pdGlvbiBvZiBhIGZ1bmN0aW9uCiAgICBmdW5jdGlvbiBmdW5jZGVmKCkgewogICAgICBjb250KHJlcXVpcmUoInRfc3RyaW5nIiksIHJlcXVpcmUoIigiKSwgcHVzaGxleCgiKSIpLCBjb21tYXNlcChmdW5jYXJnKSwgcmVxdWlyZSgiKSIpLCBwb3BsZXgsIGJsb2NrKTsKICAgIH0KICAgIC8vIFBhcnNlcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSB0aGluZ3MgdGhhdCBhcmUgcmVjb2duaXplZAogICAgLy8gYnkgdGhlICd3aGF0JyBhcmd1bWVudC4KICAgIGZ1bmN0aW9uIGNvbW1hc2VwKHdoYXQpewogICAgICBmdW5jdGlvbiBwcm9jZWVkKHRva2VuKSB7CiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gIiwiKSBjb250KHdoYXQsIHByb2NlZWQpOwogICAgICB9OwogICAgICByZXR1cm4gZnVuY3Rpb24gY29tbWFTZXBhcmF0ZWQoKSB7CiAgICAgICAgcGFzcyh3aGF0LCBwcm9jZWVkKTsKICAgICAgfTsKICAgIH0KICAgIC8vIExvb2sgZm9yIHN0YXRlbWVudHMgdW50aWwgYSBjbG9zaW5nIGJyYWNlIGlzIGZvdW5kLgogICAgZnVuY3Rpb24gYmxvY2sodG9rZW4pIHsKICAgICAgaWYgKHRva2VuLnR5cGUgPT0gIn0iKSBjb250KCk7CiAgICAgIGVsc2UgcGFzcyhzdGF0ZW1lbnQsIGJsb2NrKTsKICAgIH0KICAgIGZ1bmN0aW9uIG1heWJlZGVmYXVsdHBhcmFtZXRlcih0b2tlbil7CiAgICAgIGlmICh0b2tlbi5jb250ZW50ID09ICI9IikgY29udChleHByZXNzaW9uKTsKICAgIH0KICAgIC8vIHN1cHBvcnQgZm9yIGRlZmF1bHQgYXJndW1lbnRzOiBodHRwOi8vdXMucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb25zLmFyZ3VtZW50cy5waHAjZnVuY3Rpb25zLmFyZ3VtZW50cy5kZWZhdWx0CiAgICBmdW5jdGlvbiBmdW5jYXJnKHRva2VuKXsKICAgICAgLy8gZnVuY3Rpb24gZm9vKG15Y2xhc3MgJG9iaikgey4uLn0KICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInRfc3RyaW5nIikgY29udChyZXF1aXJlKCJ2YXJpYWJsZSIpLCBtYXliZWRlZmF1bHRwYXJhbWV0ZXIpOwogICAgICAvLyBmdW5jdGlvbiBmb28oJHN0cmluZykgey4uLn0KICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAidmFyaWFibGUiKSBjb250KG1heWJlZGVmYXVsdHBhcmFtZXRlcik7CiAgICB9CgogICAgLy8gQSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBvciB1c2UKICAgIGZ1bmN0aW9uIG1heWJlX2RvdWJsZV9jb2xvbl9kZWYodG9rZW4pIHsKICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInRfZG91YmxlX2NvbG9uIikKICAgICAgICBjb250KG5hbWVzcGFjZWRlZik7CiAgICB9CiAgICBmdW5jdGlvbiBuYW1lc3BhY2VkZWYodG9rZW4pIHsKICAgICAgcGFzcyhyZXF1aXJlKCJ0X3N0cmluZyIpLCBtYXliZV9kb3VibGVfY29sb25fZGVmKTsKICAgIH0KCiAgICByZXR1cm4gcGFyc2VyOwogIH0KCiAgcmV0dXJuIHttYWtlOiBwYXJzZVBIUCwgZWxlY3RyaWNDaGFyczogInt9OiJ9OwoKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/js/parsephphtmlmixed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhlIGNvcHlyaWdodHMgZW1ib2RpZWQgaW4gdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGFyZSBsaWNlbnNlZCBieQpZYWhvbyEgSW5jLiB1bmRlciB0aGUgQlNEIChyZXZpc2VkKSBvcGVuIHNvdXJjZSBsaWNlbnNlCgpAYXV0aG9yIERhbiBWbGFkIERhc2NhbGVzY3UgPGRhbmR2QHlhaG9vLWluYy5jb20+CgpCYXNlZCBvbiBwYXJzZWh0bWxtaXhlZC5qcyBieSBNYXJpam4gSGF2ZXJiZWtlLgoqLwoKdmFyIFBIUEhUTUxNaXhlZFBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgaWYgKCEoUEhQUGFyc2VyICYmIENTU1BhcnNlciAmJiBKU1BhcnNlciAmJiBYTUxQYXJzZXIpKQogICAgdGhyb3cgbmV3IEVycm9yKCJQSFAsIENTUywgSlMsIGFuZCBYTUwgcGFyc2VycyBtdXN0IGJlIGxvYWRlZCBmb3IgUEhQK0hUTUwgbWl4ZWQgbW9kZSB0byB3b3JrLiIpOwogIFhNTFBhcnNlci5jb25maWd1cmUoe3VzZUhUTUxLbHVkZ2VzOiB0cnVlfSk7CgogIGZ1bmN0aW9uIHBhcnNlTWl4ZWQoc3RyZWFtKSB7CiAgICB2YXIgaHRtbFBhcnNlciA9IFhNTFBhcnNlci5tYWtlKHN0cmVhbSksIGxvY2FsUGFyc2VyID0gbnVsbCwgaW5UYWcgPSBmYWxzZTsKICAgIHZhciBpdGVyID0ge25leHQ6IHRvcCwgY29weTogY29weX07CgogICAgZnVuY3Rpb24gdG9wKCkgewogICAgICB2YXIgdG9rZW4gPSBodG1sUGFyc2VyLm5leHQoKTsKICAgICAgaWYgKHRva2VuLmNvbnRlbnQgPT0gIjwiKQogICAgICAgIGluVGFnID0gdHJ1ZTsKICAgICAgZWxzZSBpZiAodG9rZW4uc3R5bGUgPT0gInhtbC10YWduYW1lIiAmJiBpblRhZyA9PT0gdHJ1ZSkKICAgICAgICBpblRhZyA9IHRva2VuLmNvbnRlbnQudG9Mb3dlckNhc2UoKTsKICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAieG1sLXByb2Nlc3NpbmciKSB7CiAgICAgICAgLy8gZGlzcGF0Y2ggb24gUEhQCiAgICAgICAgaWYgKHRva2VuLmNvbnRlbnQgPT0gIjw/cGhwIikKICAgICAgICAgIGl0ZXIubmV4dCA9IGxvY2FsKFBIUFBhcnNlciwgIj8+Iik7CiAgICAgIH0KICAgICAgLy8gInhtbC1wcm9jZXNzaW5nIiB0b2tlbnMgYXJlIGlnbm9yZWQsIGJlY2F1c2UgdGhleSBzaG91bGQgYmUgaGFuZGxlZCBieSBhIHNwZWNpZmljIGxvY2FsIHBhcnNlcgogICAgICBlbHNlIGlmICh0b2tlbi5jb250ZW50ID09ICI+IikgewogICAgICAgIGlmIChpblRhZyA9PSAic2NyaXB0IikKICAgICAgICAgIGl0ZXIubmV4dCA9IGxvY2FsKEpTUGFyc2VyLCAiPC9zY3JpcHQiKTsKICAgICAgICBlbHNlIGlmIChpblRhZyA9PSAic3R5bGUiKQogICAgICAgICAgaXRlci5uZXh0ID0gbG9jYWwoQ1NTUGFyc2VyLCAiPC9zdHlsZSIpOwogICAgICAgIGluVGFnID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRva2VuOwogICAgfQogICAgZnVuY3Rpb24gbG9jYWwocGFyc2VyLCB0YWcpIHsKICAgICAgdmFyIGJhc2VJbmRlbnQgPSBodG1sUGFyc2VyLmluZGVudGF0aW9uKCk7CiAgICAgIGxvY2FsUGFyc2VyID0gcGFyc2VyLm1ha2Uoc3RyZWFtLCBiYXNlSW5kZW50ICsgaW5kZW50VW5pdCk7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoc3RyZWFtLmxvb2tBaGVhZCh0YWcsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpIHsKICAgICAgICAgIGxvY2FsUGFyc2VyID0gbnVsbDsKICAgICAgICAgIGl0ZXIubmV4dCA9IHRvcDsKICAgICAgICAgIHJldHVybiB0b3AoKTsgIC8vIHBhc3MgdGhlIGVuZGluZyB0YWcgdG8gdGhlIGVuY2xvc2luZyBwYXJzZXIKICAgICAgICB9CgogICAgICAgIHZhciB0b2tlbiA9IGxvY2FsUGFyc2VyLm5leHQoKTsKICAgICAgICB2YXIgbHQgPSB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZigiPCIpLCBzeiA9IE1hdGgubWluKHRva2VuLnZhbHVlLmxlbmd0aCAtIGx0LCB0YWcubGVuZ3RoKTsKICAgICAgICBpZiAobHQgIT0gLTEgJiYgdG9rZW4udmFsdWUuc2xpY2UobHQsIGx0ICsgc3opLnRvTG93ZXJDYXNlKCkgPT0gdGFnLnNsaWNlKDAsIHN6KSAmJgogICAgICAgICAgICBzdHJlYW0ubG9va0FoZWFkKHRhZy5zbGljZShzeiksIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpIHsKICAgICAgICAgIHN0cmVhbS5wdXNoKHRva2VuLnZhbHVlLnNsaWNlKGx0KSk7CiAgICAgICAgICB0b2tlbi52YWx1ZSA9IHRva2VuLnZhbHVlLnNsaWNlKDAsIGx0KTsKICAgICAgICB9CgogICAgICAgIGlmICh0b2tlbi5pbmRlbnRhdGlvbikgewogICAgICAgICAgdmFyIG9sZEluZGVudCA9IHRva2VuLmluZGVudGF0aW9uOwogICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBmdW5jdGlvbihjaGFycykgewogICAgICAgICAgICBpZiAoY2hhcnMgPT0gIjwvIikKICAgICAgICAgICAgICByZXR1cm4gYmFzZUluZGVudDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHJldHVybiBvbGRJbmRlbnQoY2hhcnMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvcHkoKSB7CiAgICAgIHZhciBfaHRtbCA9IGh0bWxQYXJzZXIuY29weSgpLCBfbG9jYWwgPSBsb2NhbFBhcnNlciAmJiBsb2NhbFBhcnNlci5jb3B5KCksCiAgICAgICAgICBfbmV4dCA9IGl0ZXIubmV4dCwgX2luVGFnID0gaW5UYWc7CiAgICAgIHJldHVybiBmdW5jdGlvbihfc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtID0gX3N0cmVhbTsKICAgICAgICBodG1sUGFyc2VyID0gX2h0bWwoX3N0cmVhbSk7CiAgICAgICAgbG9jYWxQYXJzZXIgPSBfbG9jYWwgJiYgX2xvY2FsKF9zdHJlYW0pOwogICAgICAgIGl0ZXIubmV4dCA9IF9uZXh0OwogICAgICAgIGluVGFnID0gX2luVGFnOwogICAgICAgIHJldHVybiBpdGVyOwogICAgICB9OwogICAgfQogICAgcmV0dXJuIGl0ZXI7CiAgfQoKICByZXR1cm4ge21ha2U6IHBhcnNlTWl4ZWQsIGVsZWN0cmljQ2hhcnM6ICJ7fS86In07Cgp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/js/tokenizephp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgWWFob28hIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoZSBjb3B5cmlnaHRzIGVtYm9kaWVkIGluIHRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBhcmUgbGljZW5zZWQgYnkKWWFob28hIEluYy4gdW5kZXIgdGhlIEJTRCAocmV2aXNlZCkgb3BlbiBzb3VyY2UgbGljZW5zZQoKQGF1dGhvciBWbGFkIERhbiBEYXNjYWxlc2N1IDxkYW5kdkB5YWhvby1pbmMuY29tPgoKClRva2VuaXplciBmb3IgUEhQIGNvZGUKClJlZmVyZW5jZXM6CiAgKyBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQucGhwCiAgKyBodHRwOi8vcGhwLm5ldC90b2tlbnMKICArIGdldF9kZWZpbmVkX2NvbnN0YW50cygpLCBnZXRfZGVmaW5lZF9mdW5jdGlvbnMoKSwgZ2V0X2RlY2xhcmVkX2NsYXNzZXMoKQogICAgICBleGVjdXRlZCBvbiBhIHJlYWxpc3RpYyAobm90IHZhbmlsbGEpIFBIUCBpbnN0YWxsYXRpb24gd2l0aCB0eXBpY2FsIExBTVAgbW9kdWxlcy4KICAgICAgU3BlY2lmaWNhbGx5LCB0aGUgUEhQIGJ1bmRsZWQgd2l0aCB0aGUgVW5pZm9ybSBXZWIgU2VydmVyICh3d3cudW5pZm9ybXNlcnZlci5jb20pLgoKKi8KCgovLyBhZGQgdGhlIGZvckVhY2ggbWV0aG9kIGZvciBKUyBlbmdpbmVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCAoZS5nLiBJRSkKLy8gY29kZSBmcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL0VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlOk9iamVjdHM6QXJyYXk6Zm9yRWFjaAppZiAoIUFycmF5LnByb3RvdHlwZS5mb3JFYWNoKQp7CiAgQXJyYXkucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihmdW4gLyosIHRoaXNwKi8pCiAgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgaWYgKHR5cGVvZiBmdW4gIT0gImZ1bmN0aW9uIikKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOwoKICAgIHZhciB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspCiAgICB7CiAgICAgIGlmIChpIGluIHRoaXMpCiAgICAgICAgZnVuLmNhbGwodGhpc3AsIHRoaXNbaV0sIGksIHRoaXMpOwogICAgfQogIH07Cn0KCgp2YXIgdG9rZW5pemVQSFAgPSAoZnVuY3Rpb24oKSB7CiAgLyogQSBtYXAgb2YgUEhQJ3MgcmVzZXJ2ZWQgd29yZHMgKGtleXdvcmRzLCBwcmVkZWZpbmVkIGNsYXNzZXMsIGZ1bmN0aW9ucyBhbmQKICAgICBjb25zdGFudHMuIEVhY2ggdG9rZW4gaGFzIGEgdHlwZSAoJ2tleXdvcmQnLCAnb3BlcmF0b3InIGV0Yy4pIGFuZCBhIHN0eWxlLgogICAgIFRoZSBzdHlsZSBjb3JyZXNwb25kcyB0byB0aGUgQ1NTIHNwYW4gY2xhc3MgaW4gcGhwY29sb3JzLmNzcy4KCiAgICAgS2V5d29yZHMgY2FuIGJlIG9mIHRocmVlIHR5cGVzOgogICAgIGEgLSB0YWtlcyBhbiBleHByZXNzaW9uIGFuZCBmb3JtcyBhIHN0YXRlbWVudCAtIGUuZy4gaWYKICAgICBiIC0gdGFrZXMganVzdCBhIHN0YXRlbWVudCAtIGUuZy4gZWxzZQogICAgIGMgLSB0YWtlcyBhbiBvcHRpbm9hbCBleHByZXNzaW9uLCBidXQgbm8gc3RhdGVtZW50IC0gZS5nLiByZXR1cm4KICAgICBUaGlzIGRpc3RpbmN0aW9uIGdpdmVzIHRoZSBwYXJzZXIgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHBhcnNlCiAgICAgY29ycmVjdCBjb2RlIGNvcnJlY3RseSAod2UgZG9uJ3QgY2FyZSB0aGF0IG11Y2ggaG93IHdlIHBhcnNlCiAgICAgaW5jb3JyZWN0IGNvZGUpLgoKICAgICBSZWZlcmVuY2U6IGh0dHA6Ly91cy5waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5waHAKICAqLwogIHZhciBrZXl3b3JkcyA9IGZ1bmN0aW9uKCl7CiAgICBmdW5jdGlvbiB0b2tlbih0eXBlLCBzdHlsZSl7CiAgICAgIHJldHVybiB7dHlwZTogdHlwZSwgc3R5bGU6IHN0eWxlfTsKICAgIH0KICAgIHZhciByZXN1bHQgPSB7fTsKCiAgICAvLyBmb3IgZWFjaCh2YXIgZWxlbWVudCBpbiBbIi4uLiIsICIuLi4iXSkgY2FuIHBpY2sgdXAgZWxlbWVudHMgYWRkZWQgdG8KICAgIC8vIEFycmF5LnByb3RvdHlwZSwgc28gd2UnbGwgdXNlIHRoZSBsb29wIHN0cnVjdHVyZSBiZWxvdy4gU2VlIGFsc28KICAgIC8vIGh0dHA6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2UvU3RhdGVtZW50cy9mb3JfZWFjaC4uLmluCgogICAgLy8ga2V5d29yZHMgdGhhdCB0YWtlIGFuIGV4cHJlc3Npb24gYW5kIGZvcm0gYSBzdGF0ZW1lbnQKICAgIFsiaWYiLCAiZWxzZWlmIiwgIndoaWxlIiwgImRlY2xhcmUiXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigia2V5d29yZCBhIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICAvLyBrZXl3b3JkcyB0aGF0IHRha2UganVzdCBhIHN0YXRlbWVudAogICAgWyJkbyIsICJlbHNlIiwgInRyeSIgXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigia2V5d29yZCBiIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICAvLyBrZXl3b3JkcyB0aGF0IHRha2UgYW4gb3B0aW9uYWwgZXhwcmVzc2lvbiwgYnV0IG5vIHN0YXRlbWVudAogICAgWyJyZXR1cm4iLCAiYnJlYWsiLCAiY29udGludWUiLCAgLy8gdGhlIGV4cHJlc3Npb24gaXMgb3B0aW9uYWwKICAgICAgIm5ldyIsICJjbG9uZSIsICJ0aHJvdyIgIC8vIHRoZSBleHByZXNzaW9uIGlzIG1hbmRhdG9yeQogICAgXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigia2V5d29yZCBjIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICBbIl9fQ0xBU1NfXyIsICJfX0RJUl9fIiwgIl9fRklMRV9fIiwgIl9fRlVOQ1RJT05fXyIsICJfX01FVEhPRF9fIiwgIl9fTkFNRVNQQUNFX18iXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigiYXRvbSIsICJwaHAtY29tcGlsZS10aW1lLWNvbnN0YW50Iik7CiAgICB9KTsKCiAgICBbInRydWUiLCAiZmFsc2UiLCAibnVsbCJdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJhdG9tIiwgInBocC1hdG9tIik7CiAgICB9KTsKCiAgICBbImFuZCIsICJvciIsICJ4b3IiLCAiaW5zdGFuY2VvZiJdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJvcGVyYXRvciIsICJwaHAta2V5d29yZCBwaHAtb3BlcmF0b3IiKTsKICAgIH0pOwoKICAgIFsiY2xhc3MiLCAiaW50ZXJmYWNlIl0uZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCwgYXJyYXkpIHsKICAgICAgcmVzdWx0W2VsZW1lbnRdID0gdG9rZW4oImNsYXNzIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKICAgIFsibmFtZXNwYWNlIiwgInVzZSIsICJleHRlbmRzIiwgImltcGxlbWVudHMiXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigibmFtZXNwYWNlIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICAvLyByZXNlcnZlZCAibGFuZ3VhZ2UgY29uc3RydWN0cyIuLi4gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLnBocAogICAgWyAiZGllIiwgImVjaG8iLCAiZW1wdHkiLCAiZXhpdCIsICJldmFsIiwgImluY2x1ZGUiLCAiaW5jbHVkZV9vbmNlIiwgImlzc2V0IiwKICAgICAgImxpc3QiLCAicmVxdWlyZSIsICJyZXF1aXJlX29uY2UiLCAicmV0dXJuIiwgInByaW50IiwgInVuc2V0IiwKICAgICAgImFycmF5IiAvLyBhIGtleXdvcmQgcmF0aGVyLCBidXQgbWFuZGF0ZXMgYSBwYXJlbnRoZXNpemVkIHBhcmFtZXRlciBsaXN0CiAgICBdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJ0X3N0cmluZyIsICJwaHAtcmVzZXJ2ZWQtbGFuZ3VhZ2UtY29uc3RydWN0Iik7CiAgICB9KTsKCiAgICByZXN1bHRbInN3aXRjaCJdID0gdG9rZW4oInN3aXRjaCIsICJwaHAta2V5d29yZCIpOwogICAgcmVzdWx0WyJjYXNlIl0gPSB0b2tlbigiY2FzZSIsICJwaHAta2V5d29yZCIpOwogICAgcmVzdWx0WyJkZWZhdWx0Il0gPSB0b2tlbigiZGVmYXVsdCIsICJwaHAta2V5d29yZCIpOwogICAgcmVzdWx0WyJjYXRjaCJdID0gdG9rZW4oImNhdGNoIiwgInBocC1rZXl3b3JkIik7CiAgICByZXN1bHRbImZ1bmN0aW9uIl0gPSB0b2tlbigiZnVuY3Rpb24iLCAicGhwLWtleXdvcmQiKTsKCiAgICAvLyBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vY29udHJvbC1zdHJ1Y3R1cmVzLmFsdGVybmF0aXZlLXN5bnRheC5waHAgbXVzdCBiZSBmb2xsb3dlZCBieSBhICc6JwogICAgWyJlbmRpZiIsICJlbmR3aGlsZSIsICJlbmRmb3IiLCAiZW5kZm9yZWFjaCIsICJlbmRzd2l0Y2giLCAiZW5kZGVjbGFyZSJdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJkZWZhdWx0IiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICByZXN1bHRbImNvbnN0Il0gPSB0b2tlbigiY29uc3QiLCAicGhwLWtleXdvcmQiKTsKCiAgICBbImFic3RyYWN0IiwgImZpbmFsIiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInB1YmxpYyIsICJnbG9iYWwiLCAic3RhdGljIl0uZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCwgYXJyYXkpIHsKICAgICAgcmVzdWx0W2VsZW1lbnRdID0gdG9rZW4oIm1vZGlmaWVyIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKICAgIHJlc3VsdFsidmFyIl0gPSB0b2tlbigibW9kaWZpZXIiLCAicGhwLWtleXdvcmQgZGVwcmVjYXRlZCIpOwoKICAgIHJlc3VsdFsiZm9yZWFjaCJdID0gdG9rZW4oImZvcmVhY2giLCAicGhwLWtleXdvcmQiKTsKICAgIHJlc3VsdFsiYXMiXSA9IHRva2VuKCJhcyIsICJwaHAta2V5d29yZCIpOwogICAgcmVzdWx0WyJmb3IiXSA9IHRva2VuKCJmb3IiLCAicGhwLWtleXdvcmQiKTsKCiAgICAvLyBQSFAgYnVpbHQtaW4gZnVuY3Rpb25zIC0gb3V0cHV0IG9mIGdldF9kZWZpbmVkX2Z1bmN0aW9ucygpWyJpbnRlcm5hbCJdCiAgICBbICJ6ZW5kX3ZlcnNpb24iLCAiZnVuY19udW1fYXJncyIsICJmdW5jX2dldF9hcmciLCAiZnVuY19nZXRfYXJncyIsICJzdHJsZW4iLAogICAgICAic3RyY21wIiwgInN0cm5jbXAiLCAic3RyY2FzZWNtcCIsICJzdHJuY2FzZWNtcCIsICJlYWNoIiwgImVycm9yX3JlcG9ydGluZyIsCiAgICAgICJkZWZpbmUiLCAiZGVmaW5lZCIsICJnZXRfY2xhc3MiLCAiZ2V0X3BhcmVudF9jbGFzcyIsICJtZXRob2RfZXhpc3RzIiwKICAgICAgInByb3BlcnR5X2V4aXN0cyIsICJjbGFzc19leGlzdHMiLCAiaW50ZXJmYWNlX2V4aXN0cyIsICJmdW5jdGlvbl9leGlzdHMiLAogICAgICAiZ2V0X2luY2x1ZGVkX2ZpbGVzIiwgImdldF9yZXF1aXJlZF9maWxlcyIsICJpc19zdWJjbGFzc19vZiIsICJpc19hIiwKICAgICAgImdldF9jbGFzc192YXJzIiwgImdldF9vYmplY3RfdmFycyIsICJnZXRfY2xhc3NfbWV0aG9kcyIsICJ0cmlnZ2VyX2Vycm9yIiwKICAgICAgInVzZXJfZXJyb3IiLCAic2V0X2Vycm9yX2hhbmRsZXIiLCAicmVzdG9yZV9lcnJvcl9oYW5kbGVyIiwKICAgICAgInNldF9leGNlcHRpb25faGFuZGxlciIsICJyZXN0b3JlX2V4Y2VwdGlvbl9oYW5kbGVyIiwgImdldF9kZWNsYXJlZF9jbGFzc2VzIiwKICAgICAgImdldF9kZWNsYXJlZF9pbnRlcmZhY2VzIiwgImdldF9kZWZpbmVkX2Z1bmN0aW9ucyIsICJnZXRfZGVmaW5lZF92YXJzIiwKICAgICAgImNyZWF0ZV9mdW5jdGlvbiIsICJnZXRfcmVzb3VyY2VfdHlwZSIsICJnZXRfbG9hZGVkX2V4dGVuc2lvbnMiLAogICAgICAiZXh0ZW5zaW9uX2xvYWRlZCIsICJnZXRfZXh0ZW5zaW9uX2Z1bmNzIiwgImdldF9kZWZpbmVkX2NvbnN0YW50cyIsCiAgICAgICJkZWJ1Z19iYWNrdHJhY2UiLCAiZGVidWdfcHJpbnRfYmFja3RyYWNlIiwgImJjYWRkIiwgImJjc3ViIiwgImJjbXVsIiwgImJjZGl2IiwKICAgICAgImJjbW9kIiwgImJjcG93IiwgImJjc3FydCIsICJiY3NjYWxlIiwgImJjY29tcCIsICJiY3Bvd21vZCIsICJqZHRvZ3JlZ29yaWFuIiwKICAgICAgImdyZWdvcmlhbnRvamQiLCAiamR0b2p1bGlhbiIsICJqdWxpYW50b2pkIiwgImpkdG9qZXdpc2giLCAiamV3aXNodG9qZCIsCiAgICAgICJqZHRvZnJlbmNoIiwgImZyZW5jaHRvamQiLCAiamRkYXlvZndlZWsiLCAiamRtb250aG5hbWUiLCAiZWFzdGVyX2RhdGUiLAogICAgICAiZWFzdGVyX2RheXMiLCAidW5peHRvamQiLCAiamR0b3VuaXgiLCAiY2FsX3RvX2pkIiwgImNhbF9mcm9tX2pkIiwKICAgICAgImNhbF9kYXlzX2luX21vbnRoIiwgImNhbF9pbmZvIiwgInZhcmlhbnRfc2V0IiwgInZhcmlhbnRfYWRkIiwgInZhcmlhbnRfY2F0IiwKICAgICAgInZhcmlhbnRfc3ViIiwgInZhcmlhbnRfbXVsIiwgInZhcmlhbnRfYW5kIiwgInZhcmlhbnRfZGl2IiwgInZhcmlhbnRfZXF2IiwKICAgICAgInZhcmlhbnRfaWRpdiIsICJ2YXJpYW50X2ltcCIsICJ2YXJpYW50X21vZCIsICJ2YXJpYW50X29yIiwgInZhcmlhbnRfcG93IiwKICAgICAgInZhcmlhbnRfeG9yIiwgInZhcmlhbnRfYWJzIiwgInZhcmlhbnRfZml4IiwgInZhcmlhbnRfaW50IiwgInZhcmlhbnRfbmVnIiwKICAgICAgInZhcmlhbnRfbm90IiwgInZhcmlhbnRfcm91bmQiLCAidmFyaWFudF9jbXAiLCAidmFyaWFudF9kYXRlX3RvX3RpbWVzdGFtcCIsCiAgICAgICJ2YXJpYW50X2RhdGVfZnJvbV90aW1lc3RhbXAiLCAidmFyaWFudF9nZXRfdHlwZSIsICJ2YXJpYW50X3NldF90eXBlIiwKICAgICAgInZhcmlhbnRfY2FzdCIsICJjb21fY3JlYXRlX2d1aWQiLCAiY29tX2V2ZW50X3NpbmsiLCAiY29tX3ByaW50X3R5cGVpbmZvIiwKICAgICAgImNvbV9tZXNzYWdlX3B1bXAiLCAiY29tX2xvYWRfdHlwZWxpYiIsICJjb21fZ2V0X2FjdGl2ZV9vYmplY3QiLCAiY3R5cGVfYWxudW0iLAogICAgICAiY3R5cGVfYWxwaGEiLCAiY3R5cGVfY250cmwiLCAiY3R5cGVfZGlnaXQiLCAiY3R5cGVfbG93ZXIiLCAiY3R5cGVfZ3JhcGgiLAogICAgICAiY3R5cGVfcHJpbnQiLCAiY3R5cGVfcHVuY3QiLCAiY3R5cGVfc3BhY2UiLCAiY3R5cGVfdXBwZXIiLCAiY3R5cGVfeGRpZ2l0IiwKICAgICAgInN0cnRvdGltZSIsICJkYXRlIiwgImlkYXRlIiwgImdtZGF0ZSIsICJta3RpbWUiLCAiZ21ta3RpbWUiLCAiY2hlY2tkYXRlIiwKICAgICAgInN0cmZ0aW1lIiwgImdtc3RyZnRpbWUiLCAidGltZSIsICJsb2NhbHRpbWUiLCAiZ2V0ZGF0ZSIsICJkYXRlX2NyZWF0ZSIsCiAgICAgICJkYXRlX3BhcnNlIiwgImRhdGVfZm9ybWF0IiwgImRhdGVfbW9kaWZ5IiwgImRhdGVfdGltZXpvbmVfZ2V0IiwKICAgICAgImRhdGVfdGltZXpvbmVfc2V0IiwgImRhdGVfb2Zmc2V0X2dldCIsICJkYXRlX3RpbWVfc2V0IiwgImRhdGVfZGF0ZV9zZXQiLAogICAgICAiZGF0ZV9pc29kYXRlX3NldCIsICJ0aW1lem9uZV9vcGVuIiwgInRpbWV6b25lX25hbWVfZ2V0IiwKICAgICAgInRpbWV6b25lX25hbWVfZnJvbV9hYmJyIiwgInRpbWV6b25lX29mZnNldF9nZXQiLCAidGltZXpvbmVfdHJhbnNpdGlvbnNfZ2V0IiwKICAgICAgInRpbWV6b25lX2lkZW50aWZpZXJzX2xpc3QiLCAidGltZXpvbmVfYWJicmV2aWF0aW9uc19saXN0IiwKICAgICAgImRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQiLCAiZGF0ZV9kZWZhdWx0X3RpbWV6b25lX2dldCIsICJkYXRlX3N1bnJpc2UiLAogICAgICAiZGF0ZV9zdW5zZXQiLCAiZGF0ZV9zdW5faW5mbyIsICJmaWx0ZXJfaW5wdXQiLCAiZmlsdGVyX3ZhciIsCiAgICAgICJmaWx0ZXJfaW5wdXRfYXJyYXkiLCAiZmlsdGVyX3Zhcl9hcnJheSIsICJmaWx0ZXJfbGlzdCIsICJmaWx0ZXJfaGFzX3ZhciIsCiAgICAgICJmaWx0ZXJfaWQiLCAiZnRwX2Nvbm5lY3QiLCAiZnRwX2xvZ2luIiwgImZ0cF9wd2QiLCAiZnRwX2NkdXAiLCAiZnRwX2NoZGlyIiwKICAgICAgImZ0cF9leGVjIiwgImZ0cF9yYXciLCAiZnRwX21rZGlyIiwgImZ0cF9ybWRpciIsICJmdHBfY2htb2QiLCAiZnRwX2FsbG9jIiwKICAgICAgImZ0cF9ubGlzdCIsICJmdHBfcmF3bGlzdCIsICJmdHBfc3lzdHlwZSIsICJmdHBfcGFzdiIsICJmdHBfZ2V0IiwgImZ0cF9mZ2V0IiwKICAgICAgImZ0cF9wdXQiLCAiZnRwX2ZwdXQiLCAiZnRwX3NpemUiLCAiZnRwX21kdG0iLCAiZnRwX3JlbmFtZSIsICJmdHBfZGVsZXRlIiwKICAgICAgImZ0cF9zaXRlIiwgImZ0cF9jbG9zZSIsICJmdHBfc2V0X29wdGlvbiIsICJmdHBfZ2V0X29wdGlvbiIsICJmdHBfbmJfZmdldCIsCiAgICAgICJmdHBfbmJfZ2V0IiwgImZ0cF9uYl9jb250aW51ZSIsICJmdHBfbmJfcHV0IiwgImZ0cF9uYl9mcHV0IiwgImZ0cF9xdWl0IiwKICAgICAgImhhc2giLCAiaGFzaF9maWxlIiwgImhhc2hfaG1hYyIsICJoYXNoX2htYWNfZmlsZSIsICJoYXNoX2luaXQiLCAiaGFzaF91cGRhdGUiLAogICAgICAiaGFzaF91cGRhdGVfc3RyZWFtIiwgImhhc2hfdXBkYXRlX2ZpbGUiLCAiaGFzaF9maW5hbCIsICJoYXNoX2FsZ29zIiwgImljb252IiwKICAgICAgIm9iX2ljb252X2hhbmRsZXIiLCAiaWNvbnZfZ2V0X2VuY29kaW5nIiwgImljb252X3NldF9lbmNvZGluZyIsICJpY29udl9zdHJsZW4iLAogICAgICAiaWNvbnZfc3Vic3RyIiwgImljb252X3N0cnBvcyIsICJpY29udl9zdHJycG9zIiwgImljb252X21pbWVfZW5jb2RlIiwKICAgICAgImljb252X21pbWVfZGVjb2RlIiwgImljb252X21pbWVfZGVjb2RlX2hlYWRlcnMiLCAianNvbl9lbmNvZGUiLCAianNvbl9kZWNvZGUiLAogICAgICAib2RiY19hdXRvY29tbWl0IiwgIm9kYmNfYmlubW9kZSIsICJvZGJjX2Nsb3NlIiwgIm9kYmNfY2xvc2VfYWxsIiwKICAgICAgIm9kYmNfY29sdW1ucyIsICJvZGJjX2NvbW1pdCIsICJvZGJjX2Nvbm5lY3QiLCAib2RiY19jdXJzb3IiLAogICAgICAib2RiY19kYXRhX3NvdXJjZSIsICJvZGJjX2V4ZWN1dGUiLCAib2RiY19lcnJvciIsICJvZGJjX2Vycm9ybXNnIiwgIm9kYmNfZXhlYyIsCiAgICAgICJvZGJjX2ZldGNoX2FycmF5IiwgIm9kYmNfZmV0Y2hfb2JqZWN0IiwgIm9kYmNfZmV0Y2hfcm93IiwgIm9kYmNfZmV0Y2hfaW50byIsCiAgICAgICJvZGJjX2ZpZWxkX2xlbiIsICJvZGJjX2ZpZWxkX3NjYWxlIiwgIm9kYmNfZmllbGRfbmFtZSIsICJvZGJjX2ZpZWxkX3R5cGUiLAogICAgICAib2RiY19maWVsZF9udW0iLCAib2RiY19mcmVlX3Jlc3VsdCIsICJvZGJjX2dldHR5cGVpbmZvIiwgIm9kYmNfbG9uZ3JlYWRsZW4iLAogICAgICAib2RiY19uZXh0X3Jlc3VsdCIsICJvZGJjX251bV9maWVsZHMiLCAib2RiY19udW1fcm93cyIsICJvZGJjX3Bjb25uZWN0IiwKICAgICAgIm9kYmNfcHJlcGFyZSIsICJvZGJjX3Jlc3VsdCIsICJvZGJjX3Jlc3VsdF9hbGwiLCAib2RiY19yb2xsYmFjayIsCiAgICAgICJvZGJjX3NldG9wdGlvbiIsICJvZGJjX3NwZWNpYWxjb2x1bW5zIiwgIm9kYmNfc3RhdGlzdGljcyIsICJvZGJjX3RhYmxlcyIsCiAgICAgICJvZGJjX3ByaW1hcnlrZXlzIiwgIm9kYmNfY29sdW1ucHJpdmlsZWdlcyIsICJvZGJjX3RhYmxlcHJpdmlsZWdlcyIsCiAgICAgICJvZGJjX2ZvcmVpZ25rZXlzIiwgIm9kYmNfcHJvY2VkdXJlcyIsICJvZGJjX3Byb2NlZHVyZWNvbHVtbnMiLCAib2RiY19kbyIsCiAgICAgICJvZGJjX2ZpZWxkX3ByZWNpc2lvbiIsICJwcmVnX21hdGNoIiwgInByZWdfbWF0Y2hfYWxsIiwgInByZWdfcmVwbGFjZSIsCiAgICAgICJwcmVnX3JlcGxhY2VfY2FsbGJhY2siLCAicHJlZ19zcGxpdCIsICJwcmVnX3F1b3RlIiwgInByZWdfZ3JlcCIsCiAgICAgICJwcmVnX2xhc3RfZXJyb3IiLCAic2Vzc2lvbl9uYW1lIiwgInNlc3Npb25fbW9kdWxlX25hbWUiLCAic2Vzc2lvbl9zYXZlX3BhdGgiLAogICAgICAic2Vzc2lvbl9pZCIsICJzZXNzaW9uX3JlZ2VuZXJhdGVfaWQiLCAic2Vzc2lvbl9kZWNvZGUiLCAic2Vzc2lvbl9yZWdpc3RlciIsCiAgICAgICJzZXNzaW9uX3VucmVnaXN0ZXIiLCAic2Vzc2lvbl9pc19yZWdpc3RlcmVkIiwgInNlc3Npb25fZW5jb2RlIiwKICAgICAgInNlc3Npb25fc3RhcnQiLCAic2Vzc2lvbl9kZXN0cm95IiwgInNlc3Npb25fdW5zZXQiLAogICAgICAic2Vzc2lvbl9zZXRfc2F2ZV9oYW5kbGVyIiwgInNlc3Npb25fY2FjaGVfbGltaXRlciIsICJzZXNzaW9uX2NhY2hlX2V4cGlyZSIsCiAgICAgICJzZXNzaW9uX3NldF9jb29raWVfcGFyYW1zIiwgInNlc3Npb25fZ2V0X2Nvb2tpZV9wYXJhbXMiLAogICAgICAic2Vzc2lvbl93cml0ZV9jbG9zZSIsICJzZXNzaW9uX2NvbW1pdCIsICJzcGxfY2xhc3NlcyIsICJzcGxfYXV0b2xvYWQiLAogICAgICAic3BsX2F1dG9sb2FkX2V4dGVuc2lvbnMiLCAic3BsX2F1dG9sb2FkX3JlZ2lzdGVyIiwgInNwbF9hdXRvbG9hZF91bnJlZ2lzdGVyIiwKICAgICAgInNwbF9hdXRvbG9hZF9mdW5jdGlvbnMiLCAic3BsX2F1dG9sb2FkX2NhbGwiLCAiY2xhc3NfcGFyZW50cyIsCiAgICAgICJjbGFzc19pbXBsZW1lbnRzIiwgInNwbF9vYmplY3RfaGFzaCIsICJpdGVyYXRvcl90b19hcnJheSIsICJpdGVyYXRvcl9jb3VudCIsCiAgICAgICJpdGVyYXRvcl9hcHBseSIsICJjb25zdGFudCIsICJiaW4yaGV4IiwgInNsZWVwIiwgInVzbGVlcCIsICJmbHVzaCIsCiAgICAgICJ3b3Jkd3JhcCIsICJodG1sc3BlY2lhbGNoYXJzIiwgImh0bWxlbnRpdGllcyIsICJodG1sX2VudGl0eV9kZWNvZGUiLAogICAgICAiaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUiLCAiZ2V0X2h0bWxfdHJhbnNsYXRpb25fdGFibGUiLCAic2hhMSIsICJzaGExX2ZpbGUiLAogICAgICAibWQ1IiwgIm1kNV9maWxlIiwgImNyYzMyIiwgImlwdGNwYXJzZSIsICJpcHRjZW1iZWQiLCAiZ2V0aW1hZ2VzaXplIiwKICAgICAgImltYWdlX3R5cGVfdG9fbWltZV90eXBlIiwgImltYWdlX3R5cGVfdG9fZXh0ZW5zaW9uIiwgInBocGluZm8iLCAicGhwdmVyc2lvbiIsCiAgICAgICJwaHBjcmVkaXRzIiwgInBocF9sb2dvX2d1aWQiLCAicGhwX3JlYWxfbG9nb19ndWlkIiwgInBocF9lZ2dfbG9nb19ndWlkIiwKICAgICAgInplbmRfbG9nb19ndWlkIiwgInBocF9zYXBpX25hbWUiLCAicGhwX3VuYW1lIiwgInBocF9pbmlfc2Nhbm5lZF9maWxlcyIsCiAgICAgICJzdHJuYXRjbXAiLCAic3RybmF0Y2FzZWNtcCIsICJzdWJzdHJfY291bnQiLCAic3Ryc3BuIiwgInN0cmNzcG4iLCAic3RydG9rIiwKICAgICAgInN0cnRvdXBwZXIiLCAic3RydG9sb3dlciIsICJzdHJwb3MiLCAic3RyaXBvcyIsICJzdHJycG9zIiwgInN0cnJpcG9zIiwKICAgICAgInN0cnJldiIsICJoZWJyZXYiLCAiaGVicmV2YyIsICJubDJiciIsICJiYXNlbmFtZSIsICJkaXJuYW1lIiwgInBhdGhpbmZvIiwKICAgICAgInN0cmlwc2xhc2hlcyIsICJzdHJpcGNzbGFzaGVzIiwgInN0cnN0ciIsICJzdHJpc3RyIiwgInN0cnJjaHIiLCAic3RyX3NodWZmbGUiLAogICAgICAic3RyX3dvcmRfY291bnQiLCAic3RyX3NwbGl0IiwgInN0cnBicmsiLCAic3Vic3RyX2NvbXBhcmUiLCAic3RyY29sbCIsCiAgICAgICJzdWJzdHIiLCAic3Vic3RyX3JlcGxhY2UiLCAicXVvdGVtZXRhIiwgInVjZmlyc3QiLCAidWN3b3JkcyIsICJzdHJ0ciIsCiAgICAgICJhZGRzbGFzaGVzIiwgImFkZGNzbGFzaGVzIiwgInJ0cmltIiwgInN0cl9yZXBsYWNlIiwgInN0cl9pcmVwbGFjZSIsCiAgICAgICJzdHJfcmVwZWF0IiwgImNvdW50X2NoYXJzIiwgImNodW5rX3NwbGl0IiwgInRyaW0iLCAibHRyaW0iLCAic3RyaXBfdGFncyIsCiAgICAgICJzaW1pbGFyX3RleHQiLCAiZXhwbG9kZSIsICJpbXBsb2RlIiwgInNldGxvY2FsZSIsICJsb2NhbGVjb252IiwgInNvdW5kZXgiLAogICAgICAibGV2ZW5zaHRlaW4iLCAiY2hyIiwgIm9yZCIsICJwYXJzZV9zdHIiLCAic3RyX3BhZCIsICJjaG9wIiwgInN0cmNociIsCiAgICAgICJzcHJpbnRmIiwgInByaW50ZiIsICJ2cHJpbnRmIiwgInZzcHJpbnRmIiwgImZwcmludGYiLCAidmZwcmludGYiLCAic3NjYW5mIiwKICAgICAgImZzY2FuZiIsICJwYXJzZV91cmwiLCAidXJsZW5jb2RlIiwgInVybGRlY29kZSIsICJyYXd1cmxlbmNvZGUiLAogICAgICAicmF3dXJsZGVjb2RlIiwgImh0dHBfYnVpbGRfcXVlcnkiLCAidW5saW5rIiwgImV4ZWMiLCAic3lzdGVtIiwKICAgICAgImVzY2FwZXNoZWxsY21kIiwgImVzY2FwZXNoZWxsYXJnIiwgInBhc3N0aHJ1IiwgInNoZWxsX2V4ZWMiLCAicHJvY19vcGVuIiwKICAgICAgInByb2NfY2xvc2UiLCAicHJvY190ZXJtaW5hdGUiLCAicHJvY19nZXRfc3RhdHVzIiwgInJhbmQiLCAic3JhbmQiLAogICAgICAiZ2V0cmFuZG1heCIsICJtdF9yYW5kIiwgIm10X3NyYW5kIiwgIm10X2dldHJhbmRtYXgiLCAiZ2V0c2VydmJ5bmFtZSIsCiAgICAgICJnZXRzZXJ2Ynlwb3J0IiwgImdldHByb3RvYnluYW1lIiwgImdldHByb3RvYnludW1iZXIiLCAiZ2V0bXl1aWQiLCAiZ2V0bXlnaWQiLAogICAgICAiZ2V0bXlwaWQiLCAiZ2V0bXlpbm9kZSIsICJnZXRsYXN0bW9kIiwgImJhc2U2NF9kZWNvZGUiLCAiYmFzZTY0X2VuY29kZSIsCiAgICAgICJjb252ZXJ0X3V1ZW5jb2RlIiwgImNvbnZlcnRfdXVkZWNvZGUiLCAiYWJzIiwgImNlaWwiLCAiZmxvb3IiLCAicm91bmQiLCAic2luIiwKICAgICAgImNvcyIsICJ0YW4iLCAiYXNpbiIsICJhY29zIiwgImF0YW4iLCAiYXRhbjIiLCAic2luaCIsICJjb3NoIiwgInRhbmgiLCAicGkiLAogICAgICAiaXNfZmluaXRlIiwgImlzX25hbiIsICJpc19pbmZpbml0ZSIsICJwb3ciLCAiZXhwIiwgImxvZyIsICJsb2cxMCIsICJzcXJ0IiwKICAgICAgImh5cG90IiwgImRlZzJyYWQiLCAicmFkMmRlZyIsICJiaW5kZWMiLCAiaGV4ZGVjIiwgIm9jdGRlYyIsICJkZWNiaW4iLAogICAgICAiZGVjb2N0IiwgImRlY2hleCIsICJiYXNlX2NvbnZlcnQiLCAibnVtYmVyX2Zvcm1hdCIsICJmbW9kIiwgImlwMmxvbmciLAogICAgICAibG9uZzJpcCIsICJnZXRlbnYiLCAicHV0ZW52IiwgIm1pY3JvdGltZSIsICJnZXR0aW1lb2ZkYXkiLCAidW5pcWlkIiwKICAgICAgInF1b3RlZF9wcmludGFibGVfZGVjb2RlIiwgImNvbnZlcnRfY3lyX3N0cmluZyIsICJnZXRfY3VycmVudF91c2VyIiwKICAgICAgInNldF90aW1lX2xpbWl0IiwgImdldF9jZmdfdmFyIiwgIm1hZ2ljX3F1b3Rlc19ydW50aW1lIiwKICAgICAgInNldF9tYWdpY19xdW90ZXNfcnVudGltZSIsICJnZXRfbWFnaWNfcXVvdGVzX2dwYyIsICJnZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUiLAogICAgICAiaW1wb3J0X3JlcXVlc3RfdmFyaWFibGVzIiwgImVycm9yX2xvZyIsICJlcnJvcl9nZXRfbGFzdCIsICJjYWxsX3VzZXJfZnVuYyIsCiAgICAgICJjYWxsX3VzZXJfZnVuY19hcnJheSIsICJjYWxsX3VzZXJfbWV0aG9kIiwgImNhbGxfdXNlcl9tZXRob2RfYXJyYXkiLAogICAgICAic2VyaWFsaXplIiwgInVuc2VyaWFsaXplIiwgInZhcl9kdW1wIiwgInZhcl9leHBvcnQiLCAiZGVidWdfenZhbF9kdW1wIiwKICAgICAgInByaW50X3IiLCAibWVtb3J5X2dldF91c2FnZSIsICJtZW1vcnlfZ2V0X3BlYWtfdXNhZ2UiLAogICAgICAicmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24iLCAicmVnaXN0ZXJfdGlja19mdW5jdGlvbiIsCiAgICAgICJ1bnJlZ2lzdGVyX3RpY2tfZnVuY3Rpb24iLCAiaGlnaGxpZ2h0X2ZpbGUiLCAic2hvd19zb3VyY2UiLAogICAgICAiaGlnaGxpZ2h0X3N0cmluZyIsICJwaHBfc3RyaXBfd2hpdGVzcGFjZSIsICJpbmlfZ2V0IiwgImluaV9nZXRfYWxsIiwKICAgICAgImluaV9zZXQiLCAiaW5pX2FsdGVyIiwgImluaV9yZXN0b3JlIiwgImdldF9pbmNsdWRlX3BhdGgiLCAic2V0X2luY2x1ZGVfcGF0aCIsCiAgICAgICJyZXN0b3JlX2luY2x1ZGVfcGF0aCIsICJzZXRjb29raWUiLCAic2V0cmF3Y29va2llIiwgImhlYWRlciIsICJoZWFkZXJzX3NlbnQiLAogICAgICAiaGVhZGVyc19saXN0IiwgImNvbm5lY3Rpb25fYWJvcnRlZCIsICJjb25uZWN0aW9uX3N0YXR1cyIsICJpZ25vcmVfdXNlcl9hYm9ydCIsCiAgICAgICJwYXJzZV9pbmlfZmlsZSIsICJpc191cGxvYWRlZF9maWxlIiwgIm1vdmVfdXBsb2FkZWRfZmlsZSIsICJnZXRob3N0YnlhZGRyIiwKICAgICAgImdldGhvc3RieW5hbWUiLCAiZ2V0aG9zdGJ5bmFtZWwiLCAiaW50dmFsIiwgImZsb2F0dmFsIiwgImRvdWJsZXZhbCIsICJzdHJ2YWwiLAogICAgICAiZ2V0dHlwZSIsICJzZXR0eXBlIiwgImlzX251bGwiLCAiaXNfcmVzb3VyY2UiLCAiaXNfYm9vbCIsICJpc19sb25nIiwKICAgICAgImlzX2Zsb2F0IiwgImlzX2ludCIsICJpc19pbnRlZ2VyIiwgImlzX2RvdWJsZSIsICJpc19yZWFsIiwgImlzX251bWVyaWMiLAogICAgICAiaXNfc3RyaW5nIiwgImlzX2FycmF5IiwgImlzX29iamVjdCIsICJpc19zY2FsYXIiLCAiaXNfY2FsbGFibGUiLCAiZXJlZyIsCiAgICAgICJlcmVnX3JlcGxhY2UiLCAiZXJlZ2kiLCAiZXJlZ2lfcmVwbGFjZSIsICJzcGxpdCIsICJzcGxpdGkiLCAiam9pbiIsCiAgICAgICJzcWxfcmVnY2FzZSIsICJkbCIsICJwY2xvc2UiLCAicG9wZW4iLCAicmVhZGZpbGUiLCAicmV3aW5kIiwgInJtZGlyIiwgInVtYXNrIiwKICAgICAgImZjbG9zZSIsICJmZW9mIiwgImZnZXRjIiwgImZnZXRzIiwgImZnZXRzcyIsICJmcmVhZCIsICJmb3BlbiIsICJmcGFzc3RocnUiLAogICAgICAiZnRydW5jYXRlIiwgImZzdGF0IiwgImZzZWVrIiwgImZ0ZWxsIiwgImZmbHVzaCIsICJmd3JpdGUiLCAiZnB1dHMiLCAibWtkaXIiLAogICAgICAicmVuYW1lIiwgImNvcHkiLCAidGVtcG5hbSIsICJ0bXBmaWxlIiwgImZpbGUiLCAiZmlsZV9nZXRfY29udGVudHMiLAogICAgICAiZmlsZV9wdXRfY29udGVudHMiLCAic3RyZWFtX3NlbGVjdCIsICJzdHJlYW1fY29udGV4dF9jcmVhdGUiLAogICAgICAic3RyZWFtX2NvbnRleHRfc2V0X3BhcmFtcyIsICJzdHJlYW1fY29udGV4dF9zZXRfb3B0aW9uIiwKICAgICAgInN0cmVhbV9jb250ZXh0X2dldF9vcHRpb25zIiwgInN0cmVhbV9jb250ZXh0X2dldF9kZWZhdWx0IiwKICAgICAgInN0cmVhbV9maWx0ZXJfcHJlcGVuZCIsICJzdHJlYW1fZmlsdGVyX2FwcGVuZCIsICJzdHJlYW1fZmlsdGVyX3JlbW92ZSIsCiAgICAgICJzdHJlYW1fc29ja2V0X2NsaWVudCIsICJzdHJlYW1fc29ja2V0X3NlcnZlciIsICJzdHJlYW1fc29ja2V0X2FjY2VwdCIsCiAgICAgICJzdHJlYW1fc29ja2V0X2dldF9uYW1lIiwgInN0cmVhbV9zb2NrZXRfcmVjdmZyb20iLCAic3RyZWFtX3NvY2tldF9zZW5kdG8iLAogICAgICAic3RyZWFtX3NvY2tldF9lbmFibGVfY3J5cHRvIiwgInN0cmVhbV9zb2NrZXRfc2h1dGRvd24iLAogICAgICAic3RyZWFtX2NvcHlfdG9fc3RyZWFtIiwgInN0cmVhbV9nZXRfY29udGVudHMiLCAiZmdldGNzdiIsICJmcHV0Y3N2IiwgImZsb2NrIiwKICAgICAgImdldF9tZXRhX3RhZ3MiLCAic3RyZWFtX3NldF93cml0ZV9idWZmZXIiLCAic2V0X2ZpbGVfYnVmZmVyIiwKICAgICAgInNldF9zb2NrZXRfYmxvY2tpbmciLCAic3RyZWFtX3NldF9ibG9ja2luZyIsICJzb2NrZXRfc2V0X2Jsb2NraW5nIiwKICAgICAgInN0cmVhbV9nZXRfbWV0YV9kYXRhIiwgInN0cmVhbV9nZXRfbGluZSIsICJzdHJlYW1fd3JhcHBlcl9yZWdpc3RlciIsCiAgICAgICJzdHJlYW1fcmVnaXN0ZXJfd3JhcHBlciIsICJzdHJlYW1fd3JhcHBlcl91bnJlZ2lzdGVyIiwKICAgICAgInN0cmVhbV93cmFwcGVyX3Jlc3RvcmUiLCAic3RyZWFtX2dldF93cmFwcGVycyIsICJzdHJlYW1fZ2V0X3RyYW5zcG9ydHMiLAogICAgICAiZ2V0X2hlYWRlcnMiLCAic3RyZWFtX3NldF90aW1lb3V0IiwgInNvY2tldF9zZXRfdGltZW91dCIsICJzb2NrZXRfZ2V0X3N0YXR1cyIsCiAgICAgICJyZWFscGF0aCIsICJmc29ja29wZW4iLCAicGZzb2Nrb3BlbiIsICJwYWNrIiwgInVucGFjayIsICJnZXRfYnJvd3NlciIsCiAgICAgICJjcnlwdCIsICJvcGVuZGlyIiwgImNsb3NlZGlyIiwgImNoZGlyIiwgImdldGN3ZCIsICJyZXdpbmRkaXIiLCAicmVhZGRpciIsCiAgICAgICJkaXIiLCAic2NhbmRpciIsICJnbG9iIiwgImZpbGVhdGltZSIsICJmaWxlY3RpbWUiLCAiZmlsZWdyb3VwIiwgImZpbGVpbm9kZSIsCiAgICAgICJmaWxlbXRpbWUiLCAiZmlsZW93bmVyIiwgImZpbGVwZXJtcyIsICJmaWxlc2l6ZSIsICJmaWxldHlwZSIsICJmaWxlX2V4aXN0cyIsCiAgICAgICJpc193cml0YWJsZSIsICJpc193cml0ZWFibGUiLCAiaXNfcmVhZGFibGUiLCAiaXNfZXhlY3V0YWJsZSIsICJpc19maWxlIiwKICAgICAgImlzX2RpciIsICJpc19saW5rIiwgInN0YXQiLCAibHN0YXQiLCAiY2hvd24iLCAiY2hncnAiLCAiY2htb2QiLCAidG91Y2giLAogICAgICAiY2xlYXJzdGF0Y2FjaGUiLCAiZGlza190b3RhbF9zcGFjZSIsICJkaXNrX2ZyZWVfc3BhY2UiLCAiZGlza2ZyZWVzcGFjZSIsCiAgICAgICJtYWlsIiwgImV6bWxtX2hhc2giLCAib3BlbmxvZyIsICJzeXNsb2ciLCAiY2xvc2Vsb2ciLAogICAgICAiZGVmaW5lX3N5c2xvZ192YXJpYWJsZXMiLCAibGNnX3ZhbHVlIiwgIm1ldGFwaG9uZSIsICJvYl9zdGFydCIsICJvYl9mbHVzaCIsCiAgICAgICJvYl9jbGVhbiIsICJvYl9lbmRfZmx1c2giLCAib2JfZW5kX2NsZWFuIiwgIm9iX2dldF9mbHVzaCIsICJvYl9nZXRfY2xlYW4iLAogICAgICAib2JfZ2V0X2xlbmd0aCIsICJvYl9nZXRfbGV2ZWwiLCAib2JfZ2V0X3N0YXR1cyIsICJvYl9nZXRfY29udGVudHMiLAogICAgICAib2JfaW1wbGljaXRfZmx1c2giLCAib2JfbGlzdF9oYW5kbGVycyIsICJrc29ydCIsICJrcnNvcnQiLCAibmF0c29ydCIsCiAgICAgICJuYXRjYXNlc29ydCIsICJhc29ydCIsICJhcnNvcnQiLCAic29ydCIsICJyc29ydCIsICJ1c29ydCIsICJ1YXNvcnQiLCAidWtzb3J0IiwKICAgICAgInNodWZmbGUiLCAiYXJyYXlfd2FsayIsICJhcnJheV93YWxrX3JlY3Vyc2l2ZSIsICJjb3VudCIsICJlbmQiLCAicHJldiIsCiAgICAgICJuZXh0IiwgInJlc2V0IiwgImN1cnJlbnQiLCAia2V5IiwgIm1pbiIsICJtYXgiLCAiaW5fYXJyYXkiLCAiYXJyYXlfc2VhcmNoIiwKICAgICAgImV4dHJhY3QiLCAiY29tcGFjdCIsICJhcnJheV9maWxsIiwgImFycmF5X2ZpbGxfa2V5cyIsICJyYW5nZSIsCiAgICAgICJhcnJheV9tdWx0aXNvcnQiLCAiYXJyYXlfcHVzaCIsICJhcnJheV9wb3AiLCAiYXJyYXlfc2hpZnQiLCAiYXJyYXlfdW5zaGlmdCIsCiAgICAgICJhcnJheV9zcGxpY2UiLCAiYXJyYXlfc2xpY2UiLCAiYXJyYXlfbWVyZ2UiLCAiYXJyYXlfbWVyZ2VfcmVjdXJzaXZlIiwKICAgICAgImFycmF5X2tleXMiLCAiYXJyYXlfdmFsdWVzIiwgImFycmF5X2NvdW50X3ZhbHVlcyIsICJhcnJheV9yZXZlcnNlIiwKICAgICAgImFycmF5X3JlZHVjZSIsICJhcnJheV9wYWQiLCAiYXJyYXlfZmxpcCIsICJhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UiLAogICAgICAiYXJyYXlfcmFuZCIsICJhcnJheV91bmlxdWUiLCAiYXJyYXlfaW50ZXJzZWN0IiwgImFycmF5X2ludGVyc2VjdF9rZXkiLAogICAgICAiYXJyYXlfaW50ZXJzZWN0X3VrZXkiLCAiYXJyYXlfdWludGVyc2VjdCIsICJhcnJheV9pbnRlcnNlY3RfYXNzb2MiLAogICAgICAiYXJyYXlfdWludGVyc2VjdF9hc3NvYyIsICJhcnJheV9pbnRlcnNlY3RfdWFzc29jIiwgImFycmF5X3VpbnRlcnNlY3RfdWFzc29jIiwKICAgICAgImFycmF5X2RpZmYiLCAiYXJyYXlfZGlmZl9rZXkiLCAiYXJyYXlfZGlmZl91a2V5IiwgImFycmF5X3VkaWZmIiwKICAgICAgImFycmF5X2RpZmZfYXNzb2MiLCAiYXJyYXlfdWRpZmZfYXNzb2MiLCAiYXJyYXlfZGlmZl91YXNzb2MiLAogICAgICAiYXJyYXlfdWRpZmZfdWFzc29jIiwgImFycmF5X3N1bSIsICJhcnJheV9wcm9kdWN0IiwgImFycmF5X2ZpbHRlciIsCiAgICAgICJhcnJheV9tYXAiLCAiYXJyYXlfY2h1bmsiLCAiYXJyYXlfY29tYmluZSIsICJhcnJheV9rZXlfZXhpc3RzIiwgInBvcyIsCiAgICAgICJzaXplb2YiLCAia2V5X2V4aXN0cyIsICJhc3NlcnQiLCAiYXNzZXJ0X29wdGlvbnMiLCAidmVyc2lvbl9jb21wYXJlIiwKICAgICAgInN0cl9yb3QxMyIsICJzdHJlYW1fZ2V0X2ZpbHRlcnMiLCAic3RyZWFtX2ZpbHRlcl9yZWdpc3RlciIsCiAgICAgICJzdHJlYW1fYnVja2V0X21ha2Vfd3JpdGVhYmxlIiwgInN0cmVhbV9idWNrZXRfcHJlcGVuZCIsCiAgICAgICJzdHJlYW1fYnVja2V0X2FwcGVuZCIsICJzdHJlYW1fYnVja2V0X25ldyIsICJvdXRwdXRfYWRkX3Jld3JpdGVfdmFyIiwKICAgICAgIm91dHB1dF9yZXNldF9yZXdyaXRlX3ZhcnMiLCAic3lzX2dldF90ZW1wX2RpciIsICJ0b2tlbl9nZXRfYWxsIiwgInRva2VuX25hbWUiLAogICAgICAicmVhZGd6ZmlsZSIsICJnenJld2luZCIsICJnemNsb3NlIiwgImd6ZW9mIiwgImd6Z2V0YyIsICJnemdldHMiLCAiZ3pnZXRzcyIsCiAgICAgICJnenJlYWQiLCAiZ3pvcGVuIiwgImd6cGFzc3RocnUiLCAiZ3pzZWVrIiwgImd6dGVsbCIsICJnendyaXRlIiwgImd6cHV0cyIsCiAgICAgICJnemZpbGUiLCAiZ3pjb21wcmVzcyIsICJnenVuY29tcHJlc3MiLCAiZ3pkZWZsYXRlIiwgImd6aW5mbGF0ZSIsICJnemVuY29kZSIsCiAgICAgICJvYl9nemhhbmRsZXIiLCAiemxpYl9nZXRfY29kaW5nX3R5cGUiLCAibGlieG1sX3NldF9zdHJlYW1zX2NvbnRleHQiLAogICAgICAibGlieG1sX3VzZV9pbnRlcm5hbF9lcnJvcnMiLCAibGlieG1sX2dldF9sYXN0X2Vycm9yIiwgImxpYnhtbF9jbGVhcl9lcnJvcnMiLAogICAgICAibGlieG1sX2dldF9lcnJvcnMiLCAiZG9tX2ltcG9ydF9zaW1wbGV4bWwiLCAic2ltcGxleG1sX2xvYWRfZmlsZSIsCiAgICAgICJzaW1wbGV4bWxfbG9hZF9zdHJpbmciLCAic2ltcGxleG1sX2ltcG9ydF9kb20iLCAid2RkeF9zZXJpYWxpemVfdmFsdWUiLAogICAgICAid2RkeF9zZXJpYWxpemVfdmFycyIsICJ3ZGR4X3BhY2tldF9zdGFydCIsICJ3ZGR4X3BhY2tldF9lbmQiLCAid2RkeF9hZGRfdmFycyIsCiAgICAgICJ3ZGR4X2Rlc2VyaWFsaXplIiwgInhtbF9wYXJzZXJfY3JlYXRlIiwgInhtbF9wYXJzZXJfY3JlYXRlX25zIiwKICAgICAgInhtbF9zZXRfb2JqZWN0IiwgInhtbF9zZXRfZWxlbWVudF9oYW5kbGVyIiwgInhtbF9zZXRfY2hhcmFjdGVyX2RhdGFfaGFuZGxlciIsCiAgICAgICJ4bWxfc2V0X3Byb2Nlc3NpbmdfaW5zdHJ1Y3Rpb25faGFuZGxlciIsICJ4bWxfc2V0X2RlZmF1bHRfaGFuZGxlciIsCiAgICAgICJ4bWxfc2V0X3VucGFyc2VkX2VudGl0eV9kZWNsX2hhbmRsZXIiLCAieG1sX3NldF9ub3RhdGlvbl9kZWNsX2hhbmRsZXIiLAogICAgICAieG1sX3NldF9leHRlcm5hbF9lbnRpdHlfcmVmX2hhbmRsZXIiLCAieG1sX3NldF9zdGFydF9uYW1lc3BhY2VfZGVjbF9oYW5kbGVyIiwKICAgICAgInhtbF9zZXRfZW5kX25hbWVzcGFjZV9kZWNsX2hhbmRsZXIiLCAieG1sX3BhcnNlIiwgInhtbF9wYXJzZV9pbnRvX3N0cnVjdCIsCiAgICAgICJ4bWxfZ2V0X2Vycm9yX2NvZGUiLCAieG1sX2Vycm9yX3N0cmluZyIsICJ4bWxfZ2V0X2N1cnJlbnRfbGluZV9udW1iZXIiLAogICAgICAieG1sX2dldF9jdXJyZW50X2NvbHVtbl9udW1iZXIiLCAieG1sX2dldF9jdXJyZW50X2J5dGVfaW5kZXgiLAogICAgICAieG1sX3BhcnNlcl9mcmVlIiwgInhtbF9wYXJzZXJfc2V0X29wdGlvbiIsICJ4bWxfcGFyc2VyX2dldF9vcHRpb24iLAogICAgICAidXRmOF9lbmNvZGUiLCAidXRmOF9kZWNvZGUiLCAieG1sd3JpdGVyX29wZW5fdXJpIiwgInhtbHdyaXRlcl9vcGVuX21lbW9yeSIsCiAgICAgICJ4bWx3cml0ZXJfc2V0X2luZGVudCIsICJ4bWx3cml0ZXJfc2V0X2luZGVudF9zdHJpbmciLAogICAgICAieG1sd3JpdGVyX3N0YXJ0X2NvbW1lbnQiLCAieG1sd3JpdGVyX2VuZF9jb21tZW50IiwKICAgICAgInhtbHdyaXRlcl9zdGFydF9hdHRyaWJ1dGUiLCAieG1sd3JpdGVyX2VuZF9hdHRyaWJ1dGUiLAogICAgICAieG1sd3JpdGVyX3dyaXRlX2F0dHJpYnV0ZSIsICJ4bWx3cml0ZXJfc3RhcnRfYXR0cmlidXRlX25zIiwKICAgICAgInhtbHdyaXRlcl93cml0ZV9hdHRyaWJ1dGVfbnMiLCAieG1sd3JpdGVyX3N0YXJ0X2VsZW1lbnQiLAogICAgICAieG1sd3JpdGVyX2VuZF9lbGVtZW50IiwgInhtbHdyaXRlcl9mdWxsX2VuZF9lbGVtZW50IiwKICAgICAgInhtbHdyaXRlcl9zdGFydF9lbGVtZW50X25zIiwgInhtbHdyaXRlcl93cml0ZV9lbGVtZW50IiwKICAgICAgInhtbHdyaXRlcl93cml0ZV9lbGVtZW50X25zIiwgInhtbHdyaXRlcl9zdGFydF9waSIsICJ4bWx3cml0ZXJfZW5kX3BpIiwKICAgICAgInhtbHdyaXRlcl93cml0ZV9waSIsICJ4bWx3cml0ZXJfc3RhcnRfY2RhdGEiLCAieG1sd3JpdGVyX2VuZF9jZGF0YSIsCiAgICAgICJ4bWx3cml0ZXJfd3JpdGVfY2RhdGEiLCAieG1sd3JpdGVyX3RleHQiLCAieG1sd3JpdGVyX3dyaXRlX3JhdyIsCiAgICAgICJ4bWx3cml0ZXJfc3RhcnRfZG9jdW1lbnQiLCAieG1sd3JpdGVyX2VuZF9kb2N1bWVudCIsCiAgICAgICJ4bWx3cml0ZXJfd3JpdGVfY29tbWVudCIsICJ4bWx3cml0ZXJfc3RhcnRfZHRkIiwgInhtbHdyaXRlcl9lbmRfZHRkIiwKICAgICAgInhtbHdyaXRlcl93cml0ZV9kdGQiLCAieG1sd3JpdGVyX3N0YXJ0X2R0ZF9lbGVtZW50IiwKICAgICAgInhtbHdyaXRlcl9lbmRfZHRkX2VsZW1lbnQiLCAieG1sd3JpdGVyX3dyaXRlX2R0ZF9lbGVtZW50IiwKICAgICAgInhtbHdyaXRlcl9zdGFydF9kdGRfYXR0bGlzdCIsICJ4bWx3cml0ZXJfZW5kX2R0ZF9hdHRsaXN0IiwKICAgICAgInhtbHdyaXRlcl93cml0ZV9kdGRfYXR0bGlzdCIsICJ4bWx3cml0ZXJfc3RhcnRfZHRkX2VudGl0eSIsCiAgICAgICJ4bWx3cml0ZXJfZW5kX2R0ZF9lbnRpdHkiLCAieG1sd3JpdGVyX3dyaXRlX2R0ZF9lbnRpdHkiLAogICAgICAieG1sd3JpdGVyX291dHB1dF9tZW1vcnkiLCAieG1sd3JpdGVyX2ZsdXNoIiwgImdkX2luZm8iLCAiaW1hZ2VhcmMiLAogICAgICAiaW1hZ2VlbGxpcHNlIiwgImltYWdlY2hhciIsICJpbWFnZWNoYXJ1cCIsICJpbWFnZWNvbG9yYXQiLAogICAgICAiaW1hZ2Vjb2xvcmFsbG9jYXRlIiwgImltYWdlcGFsZXR0ZWNvcHkiLCAiaW1hZ2VjcmVhdGVmcm9tc3RyaW5nIiwKICAgICAgImltYWdlY29sb3JjbG9zZXN0IiwgImltYWdlY29sb3JkZWFsbG9jYXRlIiwgImltYWdlY29sb3JyZXNvbHZlIiwKICAgICAgImltYWdlY29sb3JleGFjdCIsICJpbWFnZWNvbG9yc2V0IiwgImltYWdlY29sb3J0cmFuc3BhcmVudCIsCiAgICAgICJpbWFnZWNvbG9yc3RvdGFsIiwgImltYWdlY29sb3JzZm9yaW5kZXgiLCAiaW1hZ2Vjb3B5IiwgImltYWdlY29weW1lcmdlIiwKICAgICAgImltYWdlY29weW1lcmdlZ3JheSIsICJpbWFnZWNvcHlyZXNpemVkIiwgImltYWdlY3JlYXRlIiwKICAgICAgImltYWdlY3JlYXRldHJ1ZWNvbG9yIiwgImltYWdlaXN0cnVlY29sb3IiLCAiaW1hZ2V0cnVlY29sb3J0b3BhbGV0dGUiLAogICAgICAiaW1hZ2VzZXR0aGlja25lc3MiLCAiaW1hZ2VmaWxsZWRhcmMiLCAiaW1hZ2VmaWxsZWRlbGxpcHNlIiwKICAgICAgImltYWdlYWxwaGFibGVuZGluZyIsICJpbWFnZXNhdmVhbHBoYSIsICJpbWFnZWNvbG9yYWxsb2NhdGVhbHBoYSIsCiAgICAgICJpbWFnZWNvbG9ycmVzb2x2ZWFscGhhIiwgImltYWdlY29sb3JjbG9zZXN0YWxwaGEiLCAiaW1hZ2Vjb2xvcmV4YWN0YWxwaGEiLAogICAgICAiaW1hZ2Vjb3B5cmVzYW1wbGVkIiwgImltYWdlZ3JhYndpbmRvdyIsICJpbWFnZWdyYWJzY3JlZW4iLCAiaW1hZ2Vyb3RhdGUiLAogICAgICAiaW1hZ2VhbnRpYWxpYXMiLCAiaW1hZ2VzZXR0aWxlIiwgImltYWdlc2V0YnJ1c2giLCAiaW1hZ2VzZXRzdHlsZSIsCiAgICAgICJpbWFnZWNyZWF0ZWZyb21wbmciLCAiaW1hZ2VjcmVhdGVmcm9tZ2lmIiwgImltYWdlY3JlYXRlZnJvbWpwZWciLAogICAgICAiaW1hZ2VjcmVhdGVmcm9td2JtcCIsICJpbWFnZWNyZWF0ZWZyb214Ym0iLCAiaW1hZ2VjcmVhdGVmcm9tZ2QiLAogICAgICAiaW1hZ2VjcmVhdGVmcm9tZ2QyIiwgImltYWdlY3JlYXRlZnJvbWdkMnBhcnQiLCAiaW1hZ2VwbmciLCAiaW1hZ2VnaWYiLAogICAgICAiaW1hZ2VqcGVnIiwgImltYWdld2JtcCIsICJpbWFnZWdkIiwgImltYWdlZ2QyIiwgImltYWdlZGVzdHJveSIsCiAgICAgICJpbWFnZWdhbW1hY29ycmVjdCIsICJpbWFnZWZpbGwiLCAiaW1hZ2VmaWxsZWRwb2x5Z29uIiwgImltYWdlZmlsbGVkcmVjdGFuZ2xlIiwKICAgICAgImltYWdlZmlsbHRvYm9yZGVyIiwgImltYWdlZm9udHdpZHRoIiwgImltYWdlZm9udGhlaWdodCIsICJpbWFnZWludGVybGFjZSIsCiAgICAgICJpbWFnZWxpbmUiLCAiaW1hZ2Vsb2FkZm9udCIsICJpbWFnZXBvbHlnb24iLCAiaW1hZ2VyZWN0YW5nbGUiLAogICAgICAiaW1hZ2VzZXRwaXhlbCIsICJpbWFnZXN0cmluZyIsICJpbWFnZXN0cmluZ3VwIiwgImltYWdlc3giLCAiaW1hZ2VzeSIsCiAgICAgICJpbWFnZWRhc2hlZGxpbmUiLCAiaW1hZ2V0dGZiYm94IiwgImltYWdldHRmdGV4dCIsICJpbWFnZWZ0YmJveCIsCiAgICAgICJpbWFnZWZ0dGV4dCIsICJpbWFnZXBzbG9hZGZvbnQiLCAiaW1hZ2Vwc2ZyZWVmb250IiwgImltYWdlcHNlbmNvZGVmb250IiwKICAgICAgImltYWdlcHNleHRlbmRmb250IiwgImltYWdlcHNzbGFudGZvbnQiLCAiaW1hZ2Vwc3RleHQiLCAiaW1hZ2Vwc2Jib3giLAogICAgICAiaW1hZ2V0eXBlcyIsICJqcGVnMndibXAiLCAicG5nMndibXAiLCAiaW1hZ2Uyd2JtcCIsICJpbWFnZWxheWVyZWZmZWN0IiwKICAgICAgImltYWdlY29sb3JtYXRjaCIsICJpbWFnZXhibSIsICJpbWFnZWZpbHRlciIsICJpbWFnZWNvbnZvbHV0aW9uIiwKICAgICAgIm1iX2NvbnZlcnRfY2FzZSIsICJtYl9zdHJ0b3VwcGVyIiwgIm1iX3N0cnRvbG93ZXIiLCAibWJfbGFuZ3VhZ2UiLAogICAgICAibWJfaW50ZXJuYWxfZW5jb2RpbmciLCAibWJfaHR0cF9pbnB1dCIsICJtYl9odHRwX291dHB1dCIsICJtYl9kZXRlY3Rfb3JkZXIiLAogICAgICAibWJfc3Vic3RpdHV0ZV9jaGFyYWN0ZXIiLCAibWJfcGFyc2Vfc3RyIiwgIm1iX291dHB1dF9oYW5kbGVyIiwKICAgICAgIm1iX3ByZWZlcnJlZF9taW1lX25hbWUiLCAibWJfc3RybGVuIiwgIm1iX3N0cnBvcyIsICJtYl9zdHJycG9zIiwgIm1iX3N0cmlwb3MiLAogICAgICAibWJfc3Rycmlwb3MiLCAibWJfc3Ryc3RyIiwgIm1iX3N0cnJjaHIiLCAibWJfc3RyaXN0ciIsICJtYl9zdHJyaWNociIsCiAgICAgICJtYl9zdWJzdHJfY291bnQiLCAibWJfc3Vic3RyIiwgIm1iX3N0cmN1dCIsICJtYl9zdHJ3aWR0aCIsICJtYl9zdHJpbXdpZHRoIiwKICAgICAgIm1iX2NvbnZlcnRfZW5jb2RpbmciLCAibWJfZGV0ZWN0X2VuY29kaW5nIiwgIm1iX2xpc3RfZW5jb2RpbmdzIiwKICAgICAgIm1iX2NvbnZlcnRfa2FuYSIsICJtYl9lbmNvZGVfbWltZWhlYWRlciIsICJtYl9kZWNvZGVfbWltZWhlYWRlciIsCiAgICAgICJtYl9jb252ZXJ0X3ZhcmlhYmxlcyIsICJtYl9lbmNvZGVfbnVtZXJpY2VudGl0eSIsICJtYl9kZWNvZGVfbnVtZXJpY2VudGl0eSIsCiAgICAgICJtYl9zZW5kX21haWwiLCAibWJfZ2V0X2luZm8iLCAibWJfY2hlY2tfZW5jb2RpbmciLCAibWJfcmVnZXhfZW5jb2RpbmciLAogICAgICAibWJfcmVnZXhfc2V0X29wdGlvbnMiLCAibWJfZXJlZyIsICJtYl9lcmVnaSIsICJtYl9lcmVnX3JlcGxhY2UiLAogICAgICAibWJfZXJlZ2lfcmVwbGFjZSIsICJtYl9zcGxpdCIsICJtYl9lcmVnX21hdGNoIiwgIm1iX2VyZWdfc2VhcmNoIiwKICAgICAgIm1iX2VyZWdfc2VhcmNoX3BvcyIsICJtYl9lcmVnX3NlYXJjaF9yZWdzIiwgIm1iX2VyZWdfc2VhcmNoX2luaXQiLAogICAgICAibWJfZXJlZ19zZWFyY2hfZ2V0cmVncyIsICJtYl9lcmVnX3NlYXJjaF9nZXRwb3MiLCAibWJfZXJlZ19zZWFyY2hfc2V0cG9zIiwKICAgICAgIm1icmVnZXhfZW5jb2RpbmciLCAibWJlcmVnIiwgIm1iZXJlZ2kiLCAibWJlcmVnX3JlcGxhY2UiLCAibWJlcmVnaV9yZXBsYWNlIiwKICAgICAgIm1ic3BsaXQiLCAibWJlcmVnX21hdGNoIiwgIm1iZXJlZ19zZWFyY2giLCAibWJlcmVnX3NlYXJjaF9wb3MiLAogICAgICAibWJlcmVnX3NlYXJjaF9yZWdzIiwgIm1iZXJlZ19zZWFyY2hfaW5pdCIsICJtYmVyZWdfc2VhcmNoX2dldHJlZ3MiLAogICAgICAibWJlcmVnX3NlYXJjaF9nZXRwb3MiLCAibWJlcmVnX3NlYXJjaF9zZXRwb3MiLCAibXlzcWxfY29ubmVjdCIsCiAgICAgICJteXNxbF9wY29ubmVjdCIsICJteXNxbF9jbG9zZSIsICJteXNxbF9zZWxlY3RfZGIiLCAibXlzcWxfcXVlcnkiLAogICAgICAibXlzcWxfdW5idWZmZXJlZF9xdWVyeSIsICJteXNxbF9kYl9xdWVyeSIsICJteXNxbF9saXN0X2RicyIsCiAgICAgICJteXNxbF9saXN0X3RhYmxlcyIsICJteXNxbF9saXN0X2ZpZWxkcyIsICJteXNxbF9saXN0X3Byb2Nlc3NlcyIsCiAgICAgICJteXNxbF9lcnJvciIsICJteXNxbF9lcnJubyIsICJteXNxbF9hZmZlY3RlZF9yb3dzIiwgIm15c3FsX2luc2VydF9pZCIsCiAgICAgICJteXNxbF9yZXN1bHQiLCAibXlzcWxfbnVtX3Jvd3MiLCAibXlzcWxfbnVtX2ZpZWxkcyIsICJteXNxbF9mZXRjaF9yb3ciLAogICAgICAibXlzcWxfZmV0Y2hfYXJyYXkiLCAibXlzcWxfZmV0Y2hfYXNzb2MiLCAibXlzcWxfZmV0Y2hfb2JqZWN0IiwKICAgICAgIm15c3FsX2RhdGFfc2VlayIsICJteXNxbF9mZXRjaF9sZW5ndGhzIiwgIm15c3FsX2ZldGNoX2ZpZWxkIiwKICAgICAgIm15c3FsX2ZpZWxkX3NlZWsiLCAibXlzcWxfZnJlZV9yZXN1bHQiLCAibXlzcWxfZmllbGRfbmFtZSIsCiAgICAgICJteXNxbF9maWVsZF90YWJsZSIsICJteXNxbF9maWVsZF9sZW4iLCAibXlzcWxfZmllbGRfdHlwZSIsCiAgICAgICJteXNxbF9maWVsZF9mbGFncyIsICJteXNxbF9lc2NhcGVfc3RyaW5nIiwgIm15c3FsX3JlYWxfZXNjYXBlX3N0cmluZyIsCiAgICAgICJteXNxbF9zdGF0IiwgIm15c3FsX3RocmVhZF9pZCIsICJteXNxbF9jbGllbnRfZW5jb2RpbmciLCAibXlzcWxfcGluZyIsCiAgICAgICJteXNxbF9nZXRfY2xpZW50X2luZm8iLCAibXlzcWxfZ2V0X2hvc3RfaW5mbyIsICJteXNxbF9nZXRfcHJvdG9faW5mbyIsCiAgICAgICJteXNxbF9nZXRfc2VydmVyX2luZm8iLCAibXlzcWxfaW5mbyIsICJteXNxbF9zZXRfY2hhcnNldCIsICJteXNxbCIsCiAgICAgICJteXNxbF9maWVsZG5hbWUiLCAibXlzcWxfZmllbGR0YWJsZSIsICJteXNxbF9maWVsZGxlbiIsICJteXNxbF9maWVsZHR5cGUiLAogICAgICAibXlzcWxfZmllbGRmbGFncyIsICJteXNxbF9zZWxlY3RkYiIsICJteXNxbF9mcmVlcmVzdWx0IiwgIm15c3FsX251bWZpZWxkcyIsCiAgICAgICJteXNxbF9udW1yb3dzIiwgIm15c3FsX2xpc3RkYnMiLCAibXlzcWxfbGlzdHRhYmxlcyIsICJteXNxbF9saXN0ZmllbGRzIiwKICAgICAgIm15c3FsX2RiX25hbWUiLCAibXlzcWxfZGJuYW1lIiwgIm15c3FsX3RhYmxlbmFtZSIsICJteXNxbF90YWJsZV9uYW1lIiwKICAgICAgIm15c3FsaV9hZmZlY3RlZF9yb3dzIiwgIm15c3FsaV9hdXRvY29tbWl0IiwgIm15c3FsaV9jaGFuZ2VfdXNlciIsCiAgICAgICJteXNxbGlfY2hhcmFjdGVyX3NldF9uYW1lIiwgIm15c3FsaV9jbG9zZSIsICJteXNxbGlfY29tbWl0IiwgIm15c3FsaV9jb25uZWN0IiwKICAgICAgIm15c3FsaV9jb25uZWN0X2Vycm5vIiwgIm15c3FsaV9jb25uZWN0X2Vycm9yIiwgIm15c3FsaV9kYXRhX3NlZWsiLAogICAgICAibXlzcWxpX2RlYnVnIiwgIm15c3FsaV9kaXNhYmxlX3JlYWRzX2Zyb21fbWFzdGVyIiwgIm15c3FsaV9kaXNhYmxlX3JwbF9wYXJzZSIsCiAgICAgICJteXNxbGlfZHVtcF9kZWJ1Z19pbmZvIiwgIm15c3FsaV9lbmFibGVfcmVhZHNfZnJvbV9tYXN0ZXIiLAogICAgICAibXlzcWxpX2VuYWJsZV9ycGxfcGFyc2UiLCAibXlzcWxpX2VtYmVkZGVkX3NlcnZlcl9lbmQiLAogICAgICAibXlzcWxpX2VtYmVkZGVkX3NlcnZlcl9zdGFydCIsICJteXNxbGlfZXJybm8iLCAibXlzcWxpX2Vycm9yIiwKICAgICAgIm15c3FsaV9zdG10X2V4ZWN1dGUiLCAibXlzcWxpX2V4ZWN1dGUiLCAibXlzcWxpX2ZldGNoX2ZpZWxkIiwKICAgICAgIm15c3FsaV9mZXRjaF9maWVsZHMiLCAibXlzcWxpX2ZldGNoX2ZpZWxkX2RpcmVjdCIsICJteXNxbGlfZmV0Y2hfbGVuZ3RocyIsCiAgICAgICJteXNxbGlfZmV0Y2hfYXJyYXkiLCAibXlzcWxpX2ZldGNoX2Fzc29jIiwgIm15c3FsaV9mZXRjaF9vYmplY3QiLAogICAgICAibXlzcWxpX2ZldGNoX3JvdyIsICJteXNxbGlfZmllbGRfY291bnQiLCAibXlzcWxpX2ZpZWxkX3NlZWsiLAogICAgICAibXlzcWxpX2ZpZWxkX3RlbGwiLCAibXlzcWxpX2ZyZWVfcmVzdWx0IiwgIm15c3FsaV9nZXRfY2hhcnNldCIsCiAgICAgICJteXNxbGlfZ2V0X2NsaWVudF9pbmZvIiwgIm15c3FsaV9nZXRfY2xpZW50X3ZlcnNpb24iLCAibXlzcWxpX2dldF9ob3N0X2luZm8iLAogICAgICAibXlzcWxpX2dldF9wcm90b19pbmZvIiwgIm15c3FsaV9nZXRfc2VydmVyX2luZm8iLCAibXlzcWxpX2dldF9zZXJ2ZXJfdmVyc2lvbiIsCiAgICAgICJteXNxbGlfZ2V0X3dhcm5pbmdzIiwgIm15c3FsaV9pbml0IiwgIm15c3FsaV9pbmZvIiwgIm15c3FsaV9pbnNlcnRfaWQiLAogICAgICAibXlzcWxpX2tpbGwiLCAibXlzcWxpX3NldF9sb2NhbF9pbmZpbGVfZGVmYXVsdCIsCiAgICAgICJteXNxbGlfc2V0X2xvY2FsX2luZmlsZV9oYW5kbGVyIiwgIm15c3FsaV9tYXN0ZXJfcXVlcnkiLAogICAgICAibXlzcWxpX21vcmVfcmVzdWx0cyIsICJteXNxbGlfbXVsdGlfcXVlcnkiLCAibXlzcWxpX25leHRfcmVzdWx0IiwKICAgICAgIm15c3FsaV9udW1fZmllbGRzIiwgIm15c3FsaV9udW1fcm93cyIsICJteXNxbGlfb3B0aW9ucyIsICJteXNxbGlfcGluZyIsCiAgICAgICJteXNxbGlfcHJlcGFyZSIsICJteXNxbGlfcmVwb3J0IiwgIm15c3FsaV9xdWVyeSIsICJteXNxbGlfcmVhbF9jb25uZWN0IiwKICAgICAgIm15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmciLCAibXlzcWxpX3JlYWxfcXVlcnkiLCAibXlzcWxpX3JvbGxiYWNrIiwKICAgICAgIm15c3FsaV9ycGxfcGFyc2VfZW5hYmxlZCIsICJteXNxbGlfcnBsX3Byb2JlIiwgIm15c3FsaV9ycGxfcXVlcnlfdHlwZSIsCiAgICAgICJteXNxbGlfc2VsZWN0X2RiIiwgIm15c3FsaV9zZXRfY2hhcnNldCIsICJteXNxbGlfc3RtdF9hdHRyX2dldCIsCiAgICAgICJteXNxbGlfc3RtdF9hdHRyX3NldCIsICJteXNxbGlfc3RtdF9maWVsZF9jb3VudCIsICJteXNxbGlfc3RtdF9pbml0IiwKICAgICAgIm15c3FsaV9zdG10X3ByZXBhcmUiLCAibXlzcWxpX3N0bXRfcmVzdWx0X21ldGFkYXRhIiwKICAgICAgIm15c3FsaV9zdG10X3NlbmRfbG9uZ19kYXRhIiwgIm15c3FsaV9zdG10X2JpbmRfcGFyYW0iLAogICAgICAibXlzcWxpX3N0bXRfYmluZF9yZXN1bHQiLCAibXlzcWxpX3N0bXRfZmV0Y2giLCAibXlzcWxpX3N0bXRfZnJlZV9yZXN1bHQiLAogICAgICAibXlzcWxpX3N0bXRfZ2V0X3dhcm5pbmdzIiwgIm15c3FsaV9zdG10X2luc2VydF9pZCIsICJteXNxbGlfc3RtdF9yZXNldCIsCiAgICAgICJteXNxbGlfc3RtdF9wYXJhbV9jb3VudCIsICJteXNxbGlfc2VuZF9xdWVyeSIsICJteXNxbGlfc2xhdmVfcXVlcnkiLAogICAgICAibXlzcWxpX3NxbHN0YXRlIiwgIm15c3FsaV9zc2xfc2V0IiwgIm15c3FsaV9zdGF0IiwKICAgICAgIm15c3FsaV9zdG10X2FmZmVjdGVkX3Jvd3MiLCAibXlzcWxpX3N0bXRfY2xvc2UiLCAibXlzcWxpX3N0bXRfZGF0YV9zZWVrIiwKICAgICAgIm15c3FsaV9zdG10X2Vycm5vIiwgIm15c3FsaV9zdG10X2Vycm9yIiwgIm15c3FsaV9zdG10X251bV9yb3dzIiwKICAgICAgIm15c3FsaV9zdG10X3NxbHN0YXRlIiwgIm15c3FsaV9zdG9yZV9yZXN1bHQiLCAibXlzcWxpX3N0bXRfc3RvcmVfcmVzdWx0IiwKICAgICAgIm15c3FsaV90aHJlYWRfaWQiLCAibXlzcWxpX3RocmVhZF9zYWZlIiwgIm15c3FsaV91c2VfcmVzdWx0IiwKICAgICAgIm15c3FsaV93YXJuaW5nX2NvdW50IiwgIm15c3FsaV9iaW5kX3BhcmFtIiwgIm15c3FsaV9iaW5kX3Jlc3VsdCIsCiAgICAgICJteXNxbGlfY2xpZW50X2VuY29kaW5nIiwgIm15c3FsaV9lc2NhcGVfc3RyaW5nIiwgIm15c3FsaV9mZXRjaCIsCiAgICAgICJteXNxbGlfcGFyYW1fY291bnQiLCAibXlzcWxpX2dldF9tZXRhZGF0YSIsICJteXNxbGlfc2VuZF9sb25nX2RhdGEiLAogICAgICAibXlzcWxpX3NldF9vcHQiLCAicGRvX2RyaXZlcnMiLCAic29ja2V0X3NlbGVjdCIsICJzb2NrZXRfY3JlYXRlIiwKICAgICAgInNvY2tldF9jcmVhdGVfbGlzdGVuIiwgInNvY2tldF9hY2NlcHQiLCAic29ja2V0X3NldF9ub25ibG9jayIsCiAgICAgICJzb2NrZXRfc2V0X2Jsb2NrIiwgInNvY2tldF9saXN0ZW4iLCAic29ja2V0X2Nsb3NlIiwgInNvY2tldF93cml0ZSIsCiAgICAgICJzb2NrZXRfcmVhZCIsICJzb2NrZXRfZ2V0c29ja25hbWUiLCAic29ja2V0X2dldHBlZXJuYW1lIiwgInNvY2tldF9jb25uZWN0IiwKICAgICAgInNvY2tldF9zdHJlcnJvciIsICJzb2NrZXRfYmluZCIsICJzb2NrZXRfcmVjdiIsICJzb2NrZXRfc2VuZCIsCiAgICAgICJzb2NrZXRfcmVjdmZyb20iLCAic29ja2V0X3NlbmR0byIsICJzb2NrZXRfZ2V0X29wdGlvbiIsICJzb2NrZXRfc2V0X29wdGlvbiIsCiAgICAgICJzb2NrZXRfc2h1dGRvd24iLCAic29ja2V0X2xhc3RfZXJyb3IiLCAic29ja2V0X2NsZWFyX2Vycm9yIiwgInNvY2tldF9nZXRvcHQiLAogICAgICAic29ja2V0X3NldG9wdCIsICJlYWNjZWxlcmF0b3JfcHV0IiwgImVhY2NlbGVyYXRvcl9nZXQiLCAiZWFjY2VsZXJhdG9yX3JtIiwKICAgICAgImVhY2NlbGVyYXRvcl9nYyIsICJlYWNjZWxlcmF0b3JfbG9jayIsICJlYWNjZWxlcmF0b3JfdW5sb2NrIiwKICAgICAgImVhY2NlbGVyYXRvcl9jYWNoaW5nIiwgImVhY2NlbGVyYXRvcl9vcHRpbWl6ZXIiLCAiZWFjY2VsZXJhdG9yX2NsZWFyIiwKICAgICAgImVhY2NlbGVyYXRvcl9jbGVhbiIsICJlYWNjZWxlcmF0b3JfaW5mbyIsICJlYWNjZWxlcmF0b3JfcHVyZ2UiLAogICAgICAiZWFjY2VsZXJhdG9yX2NhY2hlZF9zY3JpcHRzIiwgImVhY2NlbGVyYXRvcl9yZW1vdmVkX3NjcmlwdHMiLAogICAgICAiZWFjY2VsZXJhdG9yX2xpc3Rfa2V5cyIsICJlYWNjZWxlcmF0b3JfZW5jb2RlIiwgImVhY2NlbGVyYXRvcl9sb2FkIiwKICAgICAgIl9lYWNjZWxlcmF0b3JfbG9hZGVyX2ZpbGUiLCAiX2VhY2NlbGVyYXRvcl9sb2FkZXJfbGluZSIsCiAgICAgICJlYWNjZWxlcmF0b3Jfc2V0X3Nlc3Npb25faGFuZGxlcnMiLCAiX2VhY2NlbGVyYXRvcl9vdXRwdXRfaGFuZGxlciIsCiAgICAgICJlYWNjZWxlcmF0b3JfY2FjaGVfcGFnZSIsICJlYWNjZWxlcmF0b3Jfcm1fcGFnZSIsICJlYWNjZWxlcmF0b3JfY2FjaGVfb3V0cHV0IiwKICAgICAgImVhY2NlbGVyYXRvcl9jYWNoZV9yZXN1bHQiLCAieGRlYnVnX2dldF9zdGFja19kZXB0aCIsCiAgICAgICJ4ZGVidWdfZ2V0X2Z1bmN0aW9uX3N0YWNrIiwgInhkZWJ1Z19wcmludF9mdW5jdGlvbl9zdGFjayIsCiAgICAgICJ4ZGVidWdfZ2V0X2RlY2xhcmVkX3ZhcnMiLCAieGRlYnVnX2NhbGxfY2xhc3MiLCAieGRlYnVnX2NhbGxfZnVuY3Rpb24iLAogICAgICAieGRlYnVnX2NhbGxfZmlsZSIsICJ4ZGVidWdfY2FsbF9saW5lIiwgInhkZWJ1Z192YXJfZHVtcCIsICJ4ZGVidWdfZGVidWdfenZhbCIsCiAgICAgICJ4ZGVidWdfZGVidWdfenZhbF9zdGRvdXQiLCAieGRlYnVnX2VuYWJsZSIsICJ4ZGVidWdfZGlzYWJsZSIsCiAgICAgICJ4ZGVidWdfaXNfZW5hYmxlZCIsICJ4ZGVidWdfYnJlYWsiLCAieGRlYnVnX3N0YXJ0X3RyYWNlIiwgInhkZWJ1Z19zdG9wX3RyYWNlIiwKICAgICAgInhkZWJ1Z19nZXRfdHJhY2VmaWxlX25hbWUiLCAieGRlYnVnX2dldF9wcm9maWxlcl9maWxlbmFtZSIsCiAgICAgICJ4ZGVidWdfZHVtcF9hZ2dyX3Byb2ZpbGluZ19kYXRhIiwgInhkZWJ1Z19jbGVhcl9hZ2dyX3Byb2ZpbGluZ19kYXRhIiwKICAgICAgInhkZWJ1Z19tZW1vcnlfdXNhZ2UiLCAieGRlYnVnX3BlYWtfbWVtb3J5X3VzYWdlIiwgInhkZWJ1Z190aW1lX2luZGV4IiwKICAgICAgInhkZWJ1Z19zdGFydF9lcnJvcl9jb2xsZWN0aW9uIiwgInhkZWJ1Z19zdG9wX2Vycm9yX2NvbGxlY3Rpb24iLAogICAgICAieGRlYnVnX2dldF9jb2xsZWN0ZWRfZXJyb3JzIiwgInhkZWJ1Z19zdGFydF9jb2RlX2NvdmVyYWdlIiwKICAgICAgInhkZWJ1Z19zdG9wX2NvZGVfY292ZXJhZ2UiLCAieGRlYnVnX2dldF9jb2RlX2NvdmVyYWdlIiwKICAgICAgInhkZWJ1Z19nZXRfZnVuY3Rpb25fY291bnQiLCAieGRlYnVnX2R1bXBfc3VwZXJnbG9iYWxzIiwKICAgICAgIl8iIC8vIGFsaWFzIGZvciBnZXR0ZXh0KCkKICAgIF0uZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCwgYXJyYXkpIHsKICAgICAgcmVzdWx0W2VsZW1lbnRdID0gdG9rZW4oInRfc3RyaW5nIiwgInBocC1wcmVkZWZpbmVkLWZ1bmN0aW9uIik7CiAgICB9KTsKCiAgICAvLyBvdXRwdXQgb2YgZ2V0X2RlZmluZWRfY29uc3RhbnRzKCkuIERpZmZlcnMgc2lnbmlmaWNhbnRseSBmcm9tIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5jb25zdGFudHMucGhwCiAgICBbICJFX0VSUk9SIiwgIkVfUkVDT1ZFUkFCTEVfRVJST1IiLCAiRV9XQVJOSU5HIiwgIkVfUEFSU0UiLCAiRV9OT1RJQ0UiLAogICAgICAiRV9TVFJJQ1QiLCAiRV9DT1JFX0VSUk9SIiwgIkVfQ09SRV9XQVJOSU5HIiwgIkVfQ09NUElMRV9FUlJPUiIsCiAgICAgICJFX0NPTVBJTEVfV0FSTklORyIsICJFX1VTRVJfRVJST1IiLCAiRV9VU0VSX1dBUk5JTkciLCAiRV9VU0VSX05PVElDRSIsCiAgICAgICJFX0FMTCIsICJUUlVFIiwgIkZBTFNFIiwgIk5VTEwiLCAiWkVORF9USFJFQURfU0FGRSIsICJQSFBfVkVSU0lPTiIsICJQSFBfT1MiLAogICAgICAiUEhQX1NBUEkiLCAiREVGQVVMVF9JTkNMVURFX1BBVEgiLCAiUEVBUl9JTlNUQUxMX0RJUiIsICJQRUFSX0VYVEVOU0lPTl9ESVIiLAogICAgICAiUEhQX0VYVEVOU0lPTl9ESVIiLCAiUEhQX1BSRUZJWCIsICJQSFBfQklORElSIiwgIlBIUF9MSUJESVIiLCAiUEhQX0RBVEFESVIiLAogICAgICAiUEhQX1NZU0NPTkZESVIiLCAiUEhQX0xPQ0FMU1RBVEVESVIiLCAiUEhQX0NPTkZJR19GSUxFX1BBVEgiLAogICAgICAiUEhQX0NPTkZJR19GSUxFX1NDQU5fRElSIiwgIlBIUF9TSExJQl9TVUZGSVgiLCAiUEhQX0VPTCIsICJQSFBfRU9MIiwKICAgICAgIlBIUF9JTlRfTUFYIiwgIlBIUF9JTlRfU0laRSIsICJQSFBfT1VUUFVUX0hBTkRMRVJfU1RBUlQiLAogICAgICAiUEhQX09VVFBVVF9IQU5ETEVSX0NPTlQiLCAiUEhQX09VVFBVVF9IQU5ETEVSX0VORCIsICJVUExPQURfRVJSX09LIiwKICAgICAgIlVQTE9BRF9FUlJfSU5JX1NJWkUiLCAiVVBMT0FEX0VSUl9GT1JNX1NJWkUiLCAiVVBMT0FEX0VSUl9QQVJUSUFMIiwKICAgICAgIlVQTE9BRF9FUlJfTk9fRklMRSIsICJVUExPQURfRVJSX05PX1RNUF9ESVIiLCAiVVBMT0FEX0VSUl9DQU5UX1dSSVRFIiwKICAgICAgIlVQTE9BRF9FUlJfRVhURU5TSU9OIiwgIkNBTF9HUkVHT1JJQU4iLCAiQ0FMX0pVTElBTiIsICJDQUxfSkVXSVNIIiwKICAgICAgIkNBTF9GUkVOQ0giLCAiQ0FMX05VTV9DQUxTIiwgIkNBTF9ET1dfREFZTk8iLCAiQ0FMX0RPV19TSE9SVCIsICJDQUxfRE9XX0xPTkciLAogICAgICAiQ0FMX01PTlRIX0dSRUdPUklBTl9TSE9SVCIsICJDQUxfTU9OVEhfR1JFR09SSUFOX0xPTkciLAogICAgICAiQ0FMX01PTlRIX0pVTElBTl9TSE9SVCIsICJDQUxfTU9OVEhfSlVMSUFOX0xPTkciLCAiQ0FMX01PTlRIX0pFV0lTSCIsCiAgICAgICJDQUxfTU9OVEhfRlJFTkNIIiwgIkNBTF9FQVNURVJfREVGQVVMVCIsICJDQUxfRUFTVEVSX1JPTUFOIiwKICAgICAgIkNBTF9FQVNURVJfQUxXQVlTX0dSRUdPUklBTiIsICJDQUxfRUFTVEVSX0FMV0FZU19KVUxJQU4iLAogICAgICAiQ0FMX0pFV0lTSF9BRERfQUxBRklNX0dFUkVTSCIsICJDQUxfSkVXSVNIX0FERF9BTEFGSU0iLAogICAgICAiQ0FMX0pFV0lTSF9BRERfR0VSRVNIQVlJTSIsICJDTFNDVFhfSU5QUk9DX1NFUlZFUiIsICJDTFNDVFhfSU5QUk9DX0hBTkRMRVIiLAogICAgICAiQ0xTQ1RYX0xPQ0FMX1NFUlZFUiIsICJDTFNDVFhfUkVNT1RFX1NFUlZFUiIsICJDTFNDVFhfU0VSVkVSIiwgIkNMU0NUWF9BTEwiLAogICAgICAiVlRfTlVMTCIsICJWVF9FTVBUWSIsICJWVF9VSTEiLCAiVlRfSTEiLCAiVlRfVUkyIiwgIlZUX0kyIiwgIlZUX1VJNCIsICJWVF9JNCIsCiAgICAgICJWVF9SNCIsICJWVF9SOCIsICJWVF9CT09MIiwgIlZUX0VSUk9SIiwgIlZUX0NZIiwgIlZUX0RBVEUiLCAiVlRfQlNUUiIsCiAgICAgICJWVF9ERUNJTUFMIiwgIlZUX1VOS05PV04iLCAiVlRfRElTUEFUQ0giLCAiVlRfVkFSSUFOVCIsICJWVF9JTlQiLCAiVlRfVUlOVCIsCiAgICAgICJWVF9BUlJBWSIsICJWVF9CWVJFRiIsICJDUF9BQ1AiLCAiQ1BfTUFDQ1AiLCAiQ1BfT0VNQ1AiLCAiQ1BfVVRGNyIsICJDUF9VVEY4IiwKICAgICAgIkNQX1NZTUJPTCIsICJDUF9USFJFQURfQUNQIiwgIlZBUkNNUF9MVCIsICJWQVJDTVBfRVEiLCAiVkFSQ01QX0dUIiwKICAgICAgIlZBUkNNUF9OVUxMIiwgIk5PUk1fSUdOT1JFQ0FTRSIsICJOT1JNX0lHTk9SRU5PTlNQQUNFIiwgIk5PUk1fSUdOT1JFU1lNQk9MUyIsCiAgICAgICJOT1JNX0lHTk9SRVdJRFRIIiwgIk5PUk1fSUdOT1JFS0FOQVRZUEUiLCAiRElTUF9FX0RJVkJZWkVSTyIsCiAgICAgICJESVNQX0VfT1ZFUkZMT1ciLCAiRElTUF9FX0JBRElOREVYIiwgIk1LX0VfVU5BVkFJTEFCTEUiLCAiSU5QVVRfUE9TVCIsCiAgICAgICJJTlBVVF9HRVQiLCAiSU5QVVRfQ09PS0lFIiwgIklOUFVUX0VOViIsICJJTlBVVF9TRVJWRVIiLCAiSU5QVVRfU0VTU0lPTiIsCiAgICAgICJJTlBVVF9SRVFVRVNUIiwgIkZJTFRFUl9GTEFHX05PTkUiLCAiRklMVEVSX1JFUVVJUkVfU0NBTEFSIiwKICAgICAgIkZJTFRFUl9SRVFVSVJFX0FSUkFZIiwgIkZJTFRFUl9GT1JDRV9BUlJBWSIsICJGSUxURVJfTlVMTF9PTl9GQUlMVVJFIiwKICAgICAgIkZJTFRFUl9WQUxJREFURV9JTlQiLCAiRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4iLCAiRklMVEVSX1ZBTElEQVRFX0ZMT0FUIiwKICAgICAgIkZJTFRFUl9WQUxJREFURV9SRUdFWFAiLCAiRklMVEVSX1ZBTElEQVRFX1VSTCIsICJGSUxURVJfVkFMSURBVEVfRU1BSUwiLAogICAgICAiRklMVEVSX1ZBTElEQVRFX0lQIiwgIkZJTFRFUl9ERUZBVUxUIiwgIkZJTFRFUl9VTlNBRkVfUkFXIiwKICAgICAgIkZJTFRFUl9TQU5JVElaRV9TVFJJTkciLCAiRklMVEVSX1NBTklUSVpFX1NUUklQUEVEIiwKICAgICAgIkZJTFRFUl9TQU5JVElaRV9FTkNPREVEIiwgIkZJTFRFUl9TQU5JVElaRV9TUEVDSUFMX0NIQVJTIiwKICAgICAgIkZJTFRFUl9TQU5JVElaRV9FTUFJTCIsICJGSUxURVJfU0FOSVRJWkVfVVJMIiwgIkZJTFRFUl9TQU5JVElaRV9OVU1CRVJfSU5UIiwKICAgICAgIkZJTFRFUl9TQU5JVElaRV9OVU1CRVJfRkxPQVQiLCAiRklMVEVSX1NBTklUSVpFX01BR0lDX1FVT1RFUyIsCiAgICAgICJGSUxURVJfQ0FMTEJBQ0siLCAiRklMVEVSX0ZMQUdfQUxMT1dfT0NUQUwiLCAiRklMVEVSX0ZMQUdfQUxMT1dfSEVYIiwKICAgICAgIkZJTFRFUl9GTEFHX1NUUklQX0xPVyIsICJGSUxURVJfRkxBR19TVFJJUF9ISUdIIiwgIkZJTFRFUl9GTEFHX0VOQ09ERV9MT1ciLAogICAgICAiRklMVEVSX0ZMQUdfRU5DT0RFX0hJR0giLCAiRklMVEVSX0ZMQUdfRU5DT0RFX0FNUCIsCiAgICAgICJGSUxURVJfRkxBR19OT19FTkNPREVfUVVPVEVTIiwgIkZJTFRFUl9GTEFHX0VNUFRZX1NUUklOR19OVUxMIiwKICAgICAgIkZJTFRFUl9GTEFHX0FMTE9XX0ZSQUNUSU9OIiwgIkZJTFRFUl9GTEFHX0FMTE9XX1RIT1VTQU5EIiwKICAgICAgIkZJTFRFUl9GTEFHX0FMTE9XX1NDSUVOVElGSUMiLCAiRklMVEVSX0ZMQUdfU0NIRU1FX1JFUVVJUkVEIiwKICAgICAgIkZJTFRFUl9GTEFHX0hPU1RfUkVRVUlSRUQiLCAiRklMVEVSX0ZMQUdfUEFUSF9SRVFVSVJFRCIsCiAgICAgICJGSUxURVJfRkxBR19RVUVSWV9SRVFVSVJFRCIsICJGSUxURVJfRkxBR19JUFY0IiwgIkZJTFRFUl9GTEFHX0lQVjYiLAogICAgICAiRklMVEVSX0ZMQUdfTk9fUkVTX1JBTkdFIiwgIkZJTFRFUl9GTEFHX05PX1BSSVZfUkFOR0UiLCAiRlRQX0FTQ0lJIiwKICAgICAgIkZUUF9URVhUIiwgIkZUUF9CSU5BUlkiLCAiRlRQX0lNQUdFIiwgIkZUUF9BVVRPUkVTVU1FIiwgIkZUUF9USU1FT1VUX1NFQyIsCiAgICAgICJGVFBfQVVUT1NFRUsiLCAiRlRQX0ZBSUxFRCIsICJGVFBfRklOSVNIRUQiLCAiRlRQX01PUkVEQVRBIiwgIkhBU0hfSE1BQyIsCiAgICAgICJJQ09OVl9JTVBMIiwgIklDT05WX1ZFUlNJT04iLCAiSUNPTlZfTUlNRV9ERUNPREVfU1RSSUNUIiwKICAgICAgIklDT05WX01JTUVfREVDT0RFX0NPTlRJTlVFX09OX0VSUk9SIiwgIk9EQkNfVFlQRSIsICJPREJDX0JJTk1PREVfUEFTU1RIUlUiLAogICAgICAiT0RCQ19CSU5NT0RFX1JFVFVSTiIsICJPREJDX0JJTk1PREVfQ09OVkVSVCIsICJTUUxfT0RCQ19DVVJTT1JTIiwKICAgICAgIlNRTF9DVVJfVVNFX0RSSVZFUiIsICJTUUxfQ1VSX1VTRV9JRl9ORUVERUQiLCAiU1FMX0NVUl9VU0VfT0RCQyIsCiAgICAgICJTUUxfQ09OQ1VSUkVOQ1kiLCAiU1FMX0NPTkNVUl9SRUFEX09OTFkiLCAiU1FMX0NPTkNVUl9MT0NLIiwKICAgICAgIlNRTF9DT05DVVJfUk9XVkVSIiwgIlNRTF9DT05DVVJfVkFMVUVTIiwgIlNRTF9DVVJTT1JfVFlQRSIsCiAgICAgICJTUUxfQ1VSU09SX0ZPUldBUkRfT05MWSIsICJTUUxfQ1VSU09SX0tFWVNFVF9EUklWRU4iLCAiU1FMX0NVUlNPUl9EWU5BTUlDIiwKICAgICAgIlNRTF9DVVJTT1JfU1RBVElDIiwgIlNRTF9LRVlTRVRfU0laRSIsICJTUUxfRkVUQ0hfRklSU1QiLCAiU1FMX0ZFVENIX05FWFQiLAogICAgICAiU1FMX0NIQVIiLCAiU1FMX1ZBUkNIQVIiLCAiU1FMX0xPTkdWQVJDSEFSIiwgIlNRTF9ERUNJTUFMIiwgIlNRTF9OVU1FUklDIiwKICAgICAgIlNRTF9CSVQiLCAiU1FMX1RJTllJTlQiLCAiU1FMX1NNQUxMSU5UIiwgIlNRTF9JTlRFR0VSIiwgIlNRTF9CSUdJTlQiLAogICAgICAiU1FMX1JFQUwiLCAiU1FMX0ZMT0FUIiwgIlNRTF9ET1VCTEUiLCAiU1FMX0JJTkFSWSIsICJTUUxfVkFSQklOQVJZIiwKICAgICAgIlNRTF9MT05HVkFSQklOQVJZIiwgIlNRTF9EQVRFIiwgIlNRTF9USU1FIiwgIlNRTF9USU1FU1RBTVAiLAogICAgICAiUFJFR19QQVRURVJOX09SREVSIiwgIlBSRUdfU0VUX09SREVSIiwgIlBSRUdfT0ZGU0VUX0NBUFRVUkUiLAogICAgICAiUFJFR19TUExJVF9OT19FTVBUWSIsICJQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUiLCAiUFJFR19TUExJVF9PRkZTRVRfQ0FQVFVSRSIsCiAgICAgICJQUkVHX0dSRVBfSU5WRVJUIiwgIlBSRUdfTk9fRVJST1IiLCAiUFJFR19JTlRFUk5BTF9FUlJPUiIsCiAgICAgICJQUkVHX0JBQ0tUUkFDS19MSU1JVF9FUlJPUiIsICJQUkVHX1JFQ1VSU0lPTl9MSU1JVF9FUlJPUiIsCiAgICAgICJQUkVHX0JBRF9VVEY4X0VSUk9SIiwgIkRBVEVfQVRPTSIsICJEQVRFX0NPT0tJRSIsICJEQVRFX0lTTzg2MDEiLAogICAgICAiREFURV9SRkM4MjIiLCAiREFURV9SRkM4NTAiLCAiREFURV9SRkMxMDM2IiwgIkRBVEVfUkZDMTEyMyIsICJEQVRFX1JGQzI4MjIiLAogICAgICAiREFURV9SRkMzMzM5IiwgIkRBVEVfUlNTIiwgIkRBVEVfVzNDIiwgIlNVTkZVTkNTX1JFVF9USU1FU1RBTVAiLAogICAgICAiU1VORlVOQ1NfUkVUX1NUUklORyIsICJTVU5GVU5DU19SRVRfRE9VQkxFIiwgIkxJQlhNTF9WRVJTSU9OIiwKICAgICAgIkxJQlhNTF9ET1RURURfVkVSU0lPTiIsICJMSUJYTUxfTk9FTlQiLCAiTElCWE1MX0RURExPQUQiLCAiTElCWE1MX0RUREFUVFIiLAogICAgICAiTElCWE1MX0RURFZBTElEIiwgIkxJQlhNTF9OT0VSUk9SIiwgIkxJQlhNTF9OT1dBUk5JTkciLCAiTElCWE1MX05PQkxBTktTIiwKICAgICAgIkxJQlhNTF9YSU5DTFVERSIsICJMSUJYTUxfTlNDTEVBTiIsICJMSUJYTUxfTk9DREFUQSIsICJMSUJYTUxfTk9ORVQiLAogICAgICAiTElCWE1MX0NPTVBBQ1QiLCAiTElCWE1MX05PWE1MREVDTCIsICJMSUJYTUxfTk9FTVBUWVRBRyIsICJMSUJYTUxfRVJSX05PTkUiLAogICAgICAiTElCWE1MX0VSUl9XQVJOSU5HIiwgIkxJQlhNTF9FUlJfRVJST1IiLCAiTElCWE1MX0VSUl9GQVRBTCIsCiAgICAgICJDT05ORUNUSU9OX0FCT1JURUQiLCAiQ09OTkVDVElPTl9OT1JNQUwiLCAiQ09OTkVDVElPTl9USU1FT1VUIiwgIklOSV9VU0VSIiwKICAgICAgIklOSV9QRVJESVIiLCAiSU5JX1NZU1RFTSIsICJJTklfQUxMIiwgIlBIUF9VUkxfU0NIRU1FIiwgIlBIUF9VUkxfSE9TVCIsCiAgICAgICJQSFBfVVJMX1BPUlQiLCAiUEhQX1VSTF9VU0VSIiwgIlBIUF9VUkxfUEFTUyIsICJQSFBfVVJMX1BBVEgiLAogICAgICAiUEhQX1VSTF9RVUVSWSIsICJQSFBfVVJMX0ZSQUdNRU5UIiwgIk1fRSIsICJNX0xPRzJFIiwgIk1fTE9HMTBFIiwgIk1fTE4yIiwKICAgICAgIk1fTE4xMCIsICJNX1BJIiwgIk1fUElfMiIsICJNX1BJXzQiLCAiTV8xX1BJIiwgIk1fMl9QSSIsICJNX1NRUlRQSSIsCiAgICAgICJNXzJfU1FSVFBJIiwgIk1fTE5QSSIsICJNX0VVTEVSIiwgIk1fU1FSVDIiLCAiTV9TUVJUMV8yIiwgIk1fU1FSVDMiLCAiSU5GIiwKICAgICAgIk5BTiIsICJJTkZPX0dFTkVSQUwiLCAiSU5GT19DUkVESVRTIiwgIklORk9fQ09ORklHVVJBVElPTiIsICJJTkZPX01PRFVMRVMiLAogICAgICAiSU5GT19FTlZJUk9OTUVOVCIsICJJTkZPX1ZBUklBQkxFUyIsICJJTkZPX0xJQ0VOU0UiLCAiSU5GT19BTEwiLAogICAgICAiQ1JFRElUU19HUk9VUCIsICJDUkVESVRTX0dFTkVSQUwiLCAiQ1JFRElUU19TQVBJIiwgIkNSRURJVFNfTU9EVUxFUyIsCiAgICAgICJDUkVESVRTX0RPQ1MiLCAiQ1JFRElUU19GVUxMUEFHRSIsICJDUkVESVRTX1FBIiwgIkNSRURJVFNfQUxMIiwKICAgICAgIkhUTUxfU1BFQ0lBTENIQVJTIiwgIkhUTUxfRU5USVRJRVMiLCAiRU5UX0NPTVBBVCIsICJFTlRfUVVPVEVTIiwKICAgICAgIkVOVF9OT1FVT1RFUyIsICJTVFJfUEFEX0xFRlQiLCAiU1RSX1BBRF9SSUdIVCIsICJTVFJfUEFEX0JPVEgiLAogICAgICAiUEFUSElORk9fRElSTkFNRSIsICJQQVRISU5GT19CQVNFTkFNRSIsICJQQVRISU5GT19FWFRFTlNJT04iLAogICAgICAiUEFUSElORk9fRklMRU5BTUUiLCAiQ0hBUl9NQVgiLCAiTENfQ1RZUEUiLCAiTENfTlVNRVJJQyIsICJMQ19USU1FIiwKICAgICAgIkxDX0NPTExBVEUiLCAiTENfTU9ORVRBUlkiLCAiTENfQUxMIiwgIlNFRUtfU0VUIiwgIlNFRUtfQ1VSIiwgIlNFRUtfRU5EIiwKICAgICAgIkxPQ0tfU0giLCAiTE9DS19FWCIsICJMT0NLX1VOIiwgIkxPQ0tfTkIiLCAiU1RSRUFNX05PVElGWV9DT05ORUNUIiwKICAgICAgIlNUUkVBTV9OT1RJRllfQVVUSF9SRVFVSVJFRCIsICJTVFJFQU1fTk9USUZZX0FVVEhfUkVTVUxUIiwKICAgICAgIlNUUkVBTV9OT1RJRllfTUlNRV9UWVBFX0lTIiwgIlNUUkVBTV9OT1RJRllfRklMRV9TSVpFX0lTIiwKICAgICAgIlNUUkVBTV9OT1RJRllfUkVESVJFQ1RFRCIsICJTVFJFQU1fTk9USUZZX1BST0dSRVNTIiwgIlNUUkVBTV9OT1RJRllfRkFJTFVSRSIsCiAgICAgICJTVFJFQU1fTk9USUZZX0NPTVBMRVRFRCIsICJTVFJFQU1fTk9USUZZX1JFU09MVkUiLAogICAgICAiU1RSRUFNX05PVElGWV9TRVZFUklUWV9JTkZPIiwgIlNUUkVBTV9OT1RJRllfU0VWRVJJVFlfV0FSTiIsCiAgICAgICJTVFJFQU1fTk9USUZZX1NFVkVSSVRZX0VSUiIsICJTVFJFQU1fRklMVEVSX1JFQUQiLCAiU1RSRUFNX0ZJTFRFUl9XUklURSIsCiAgICAgICJTVFJFQU1fRklMVEVSX0FMTCIsICJTVFJFQU1fQ0xJRU5UX1BFUlNJU1RFTlQiLCAiU1RSRUFNX0NMSUVOVF9BU1lOQ19DT05ORUNUIiwKICAgICAgIlNUUkVBTV9DTElFTlRfQ09OTkVDVCIsICJTVFJFQU1fQ1JZUFRPX01FVEhPRF9TU0x2Ml9DTElFTlQiLAogICAgICAiU1RSRUFNX0NSWVBUT19NRVRIT0RfU1NMdjNfQ0xJRU5UIiwgIlNUUkVBTV9DUllQVE9fTUVUSE9EX1NTTHYyM19DTElFTlQiLAogICAgICAiU1RSRUFNX0NSWVBUT19NRVRIT0RfVExTX0NMSUVOVCIsICJTVFJFQU1fQ1JZUFRPX01FVEhPRF9TU0x2Ml9TRVJWRVIiLAogICAgICAiU1RSRUFNX0NSWVBUT19NRVRIT0RfU1NMdjNfU0VSVkVSIiwgIlNUUkVBTV9DUllQVE9fTUVUSE9EX1NTTHYyM19TRVJWRVIiLAogICAgICAiU1RSRUFNX0NSWVBUT19NRVRIT0RfVExTX1NFUlZFUiIsICJTVFJFQU1fU0hVVF9SRCIsICJTVFJFQU1fU0hVVF9XUiIsCiAgICAgICJTVFJFQU1fU0hVVF9SRFdSIiwgIlNUUkVBTV9QRl9JTkVUIiwgIlNUUkVBTV9QRl9JTkVUNiIsICJTVFJFQU1fUEZfVU5JWCIsCiAgICAgICJTVFJFQU1fSVBQUk9UT19JUCIsICJTVFJFQU1fSVBQUk9UT19UQ1AiLCAiU1RSRUFNX0lQUFJPVE9fVURQIiwKICAgICAgIlNUUkVBTV9JUFBST1RPX0lDTVAiLCAiU1RSRUFNX0lQUFJPVE9fUkFXIiwgIlNUUkVBTV9TT0NLX1NUUkVBTSIsCiAgICAgICJTVFJFQU1fU09DS19ER1JBTSIsICJTVFJFQU1fU09DS19SQVciLCAiU1RSRUFNX1NPQ0tfU0VRUEFDS0VUIiwKICAgICAgIlNUUkVBTV9TT0NLX1JETSIsICJTVFJFQU1fUEVFSyIsICJTVFJFQU1fT09CIiwgIlNUUkVBTV9TRVJWRVJfQklORCIsCiAgICAgICJTVFJFQU1fU0VSVkVSX0xJU1RFTiIsICJGSUxFX1VTRV9JTkNMVURFX1BBVEgiLCAiRklMRV9JR05PUkVfTkVXX0xJTkVTIiwKICAgICAgIkZJTEVfU0tJUF9FTVBUWV9MSU5FUyIsICJGSUxFX0FQUEVORCIsICJGSUxFX05PX0RFRkFVTFRfQ09OVEVYVCIsCiAgICAgICJQU0ZTX1BBU1NfT04iLCAiUFNGU19GRUVEX01FIiwgIlBTRlNfRVJSX0ZBVEFMIiwgIlBTRlNfRkxBR19OT1JNQUwiLAogICAgICAiUFNGU19GTEFHX0ZMVVNIX0lOQyIsICJQU0ZTX0ZMQUdfRkxVU0hfQ0xPU0UiLCAiQ1JZUFRfU0FMVF9MRU5HVEgiLAogICAgICAiQ1JZUFRfU1REX0RFUyIsICJDUllQVF9FWFRfREVTIiwgIkNSWVBUX01ENSIsICJDUllQVF9CTE9XRklTSCIsCiAgICAgICJESVJFQ1RPUllfU0VQQVJBVE9SIiwgIlBBVEhfU0VQQVJBVE9SIiwgIkdMT0JfQlJBQ0UiLCAiR0xPQl9NQVJLIiwKICAgICAgIkdMT0JfTk9TT1JUIiwgIkdMT0JfTk9DSEVDSyIsICJHTE9CX05PRVNDQVBFIiwgIkdMT0JfRVJSIiwgIkdMT0JfT05MWURJUiIsCiAgICAgICJMT0dfRU1FUkciLCAiTE9HX0FMRVJUIiwgIkxPR19DUklUIiwgIkxPR19FUlIiLCAiTE9HX1dBUk5JTkciLCAiTE9HX05PVElDRSIsCiAgICAgICJMT0dfSU5GTyIsICJMT0dfREVCVUciLCAiTE9HX0tFUk4iLCAiTE9HX1VTRVIiLCAiTE9HX01BSUwiLCAiTE9HX0RBRU1PTiIsCiAgICAgICJMT0dfQVVUSCIsICJMT0dfU1lTTE9HIiwgIkxPR19MUFIiLCAiTE9HX05FV1MiLCAiTE9HX1VVQ1AiLCAiTE9HX0NST04iLAogICAgICAiTE9HX0FVVEhQUklWIiwgIkxPR19QSUQiLCAiTE9HX0NPTlMiLCAiTE9HX09ERUxBWSIsICJMT0dfTkRFTEFZIiwKICAgICAgIkxPR19OT1dBSVQiLCAiTE9HX1BFUlJPUiIsICJFWFRSX09WRVJXUklURSIsICJFWFRSX1NLSVAiLCAiRVhUUl9QUkVGSVhfU0FNRSIsCiAgICAgICJFWFRSX1BSRUZJWF9BTEwiLCAiRVhUUl9QUkVGSVhfSU5WQUxJRCIsICJFWFRSX1BSRUZJWF9JRl9FWElTVFMiLAogICAgICAiRVhUUl9JRl9FWElTVFMiLCAiRVhUUl9SRUZTIiwgIlNPUlRfQVNDIiwgIlNPUlRfREVTQyIsICJTT1JUX1JFR1VMQVIiLAogICAgICAiU09SVF9OVU1FUklDIiwgIlNPUlRfU1RSSU5HIiwgIlNPUlRfTE9DQUxFX1NUUklORyIsICJDQVNFX0xPV0VSIiwKICAgICAgIkNBU0VfVVBQRVIiLCAiQ09VTlRfTk9STUFMIiwgIkNPVU5UX1JFQ1VSU0lWRSIsICJBU1NFUlRfQUNUSVZFIiwKICAgICAgIkFTU0VSVF9DQUxMQkFDSyIsICJBU1NFUlRfQkFJTCIsICJBU1NFUlRfV0FSTklORyIsICJBU1NFUlRfUVVJRVRfRVZBTCIsCiAgICAgICJTVFJFQU1fVVNFX1BBVEgiLCAiU1RSRUFNX0lHTk9SRV9VUkwiLCAiU1RSRUFNX0VORk9SQ0VfU0FGRV9NT0RFIiwKICAgICAgIlNUUkVBTV9SRVBPUlRfRVJST1JTIiwgIlNUUkVBTV9NVVNUX1NFRUsiLCAiU1RSRUFNX1VSTF9TVEFUX0xJTksiLAogICAgICAiU1RSRUFNX1VSTF9TVEFUX1FVSUVUIiwgIlNUUkVBTV9NS0RJUl9SRUNVUlNJVkUiLCAiSU1BR0VUWVBFX0dJRiIsCiAgICAgICJJTUFHRVRZUEVfSlBFRyIsICJJTUFHRVRZUEVfUE5HIiwgIklNQUdFVFlQRV9TV0YiLCAiSU1BR0VUWVBFX1BTRCIsCiAgICAgICJJTUFHRVRZUEVfQk1QIiwgIklNQUdFVFlQRV9USUZGX0lJIiwgIklNQUdFVFlQRV9USUZGX01NIiwgIklNQUdFVFlQRV9KUEMiLAogICAgICAiSU1BR0VUWVBFX0pQMiIsICJJTUFHRVRZUEVfSlBYIiwgIklNQUdFVFlQRV9KQjIiLCAiSU1BR0VUWVBFX1NXQyIsCiAgICAgICJJTUFHRVRZUEVfSUZGIiwgIklNQUdFVFlQRV9XQk1QIiwgIklNQUdFVFlQRV9KUEVHMjAwMCIsICJJTUFHRVRZUEVfWEJNIiwKICAgICAgIlRfSU5DTFVERSIsICJUX0lOQ0xVREVfT05DRSIsICJUX0VWQUwiLCAiVF9SRVFVSVJFIiwgIlRfUkVRVUlSRV9PTkNFIiwKICAgICAgIlRfTE9HSUNBTF9PUiIsICJUX0xPR0lDQUxfWE9SIiwgIlRfTE9HSUNBTF9BTkQiLCAiVF9QUklOVCIsICJUX1BMVVNfRVFVQUwiLAogICAgICAiVF9NSU5VU19FUVVBTCIsICJUX01VTF9FUVVBTCIsICJUX0RJVl9FUVVBTCIsICJUX0NPTkNBVF9FUVVBTCIsICJUX01PRF9FUVVBTCIsCiAgICAgICJUX0FORF9FUVVBTCIsICJUX09SX0VRVUFMIiwgIlRfWE9SX0VRVUFMIiwgIlRfU0xfRVFVQUwiLCAiVF9TUl9FUVVBTCIsCiAgICAgICJUX0JPT0xFQU5fT1IiLCAiVF9CT09MRUFOX0FORCIsICJUX0lTX0VRVUFMIiwgIlRfSVNfTk9UX0VRVUFMIiwKICAgICAgIlRfSVNfSURFTlRJQ0FMIiwgIlRfSVNfTk9UX0lERU5USUNBTCIsICJUX0lTX1NNQUxMRVJfT1JfRVFVQUwiLAogICAgICAiVF9JU19HUkVBVEVSX09SX0VRVUFMIiwgIlRfU0wiLCAiVF9TUiIsICJUX0lOQyIsICJUX0RFQyIsICJUX0lOVF9DQVNUIiwKICAgICAgIlRfRE9VQkxFX0NBU1QiLCAiVF9TVFJJTkdfQ0FTVCIsICJUX0FSUkFZX0NBU1QiLCAiVF9PQkpFQ1RfQ0FTVCIsCiAgICAgICJUX0JPT0xfQ0FTVCIsICJUX1VOU0VUX0NBU1QiLCAiVF9ORVciLCAiVF9FWElUIiwgIlRfSUYiLCAiVF9FTFNFSUYiLCAiVF9FTFNFIiwKICAgICAgIlRfRU5ESUYiLCAiVF9MTlVNQkVSIiwgIlRfRE5VTUJFUiIsICJUX1NUUklORyIsICJUX1NUUklOR19WQVJOQU1FIiwKICAgICAgIlRfVkFSSUFCTEUiLCAiVF9OVU1fU1RSSU5HIiwgIlRfSU5MSU5FX0hUTUwiLCAiVF9DSEFSQUNURVIiLAogICAgICAiVF9CQURfQ0hBUkFDVEVSIiwgIlRfRU5DQVBTRURfQU5EX1dISVRFU1BBQ0UiLCAiVF9DT05TVEFOVF9FTkNBUFNFRF9TVFJJTkciLAogICAgICAiVF9FQ0hPIiwgIlRfRE8iLCAiVF9XSElMRSIsICJUX0VORFdISUxFIiwgIlRfRk9SIiwgIlRfRU5ERk9SIiwgIlRfRk9SRUFDSCIsCiAgICAgICJUX0VOREZPUkVBQ0giLCAiVF9ERUNMQVJFIiwgIlRfRU5EREVDTEFSRSIsICJUX0FTIiwgIlRfU1dJVENIIiwgIlRfRU5EU1dJVENIIiwKICAgICAgIlRfQ0FTRSIsICJUX0RFRkFVTFQiLCAiVF9CUkVBSyIsICJUX0NPTlRJTlVFIiwgIlRfRlVOQ1RJT04iLCAiVF9DT05TVCIsCiAgICAgICJUX1JFVFVSTiIsICJUX1VTRSIsICJUX0dMT0JBTCIsICJUX1NUQVRJQyIsICJUX1ZBUiIsICJUX1VOU0VUIiwgIlRfSVNTRVQiLAogICAgICAiVF9FTVBUWSIsICJUX0NMQVNTIiwgIlRfRVhURU5EUyIsICJUX0lOVEVSRkFDRSIsICJUX0lNUExFTUVOVFMiLAogICAgICAiVF9PQkpFQ1RfT1BFUkFUT1IiLCAiVF9ET1VCTEVfQVJST1ciLCAiVF9MSVNUIiwgIlRfQVJSQVkiLCAiVF9DTEFTU19DIiwKICAgICAgIlRfRlVOQ19DIiwgIlRfTUVUSE9EX0MiLCAiVF9MSU5FIiwgIlRfRklMRSIsICJUX0NPTU1FTlQiLCAiVF9ET0NfQ09NTUVOVCIsCiAgICAgICJUX09QRU5fVEFHIiwgIlRfT1BFTl9UQUdfV0lUSF9FQ0hPIiwgIlRfQ0xPU0VfVEFHIiwgIlRfV0hJVEVTUEFDRSIsCiAgICAgICJUX1NUQVJUX0hFUkVET0MiLCAiVF9FTkRfSEVSRURPQyIsICJUX0RPTExBUl9PUEVOX0NVUkxZX0JSQUNFUyIsCiAgICAgICJUX0NVUkxZX09QRU4iLCAiVF9QQUFNQVlJTV9ORUtVRE9UQVlJTSIsICJUX0RPVUJMRV9DT0xPTiIsICJUX0FCU1RSQUNUIiwKICAgICAgIlRfQ0FUQ0giLCAiVF9GSU5BTCIsICJUX0lOU1RBTkNFT0YiLCAiVF9QUklWQVRFIiwgIlRfUFJPVEVDVEVEIiwgIlRfUFVCTElDIiwKICAgICAgIlRfVEhST1ciLCAiVF9UUlkiLCAiVF9DTE9ORSIsICJUX0hBTFRfQ09NUElMRVIiLCAiRk9SQ0VfR1pJUCIsCiAgICAgICJGT1JDRV9ERUZMQVRFIiwgIlhNTF9FTEVNRU5UX05PREUiLCAiWE1MX0FUVFJJQlVURV9OT0RFIiwgIlhNTF9URVhUX05PREUiLAogICAgICAiWE1MX0NEQVRBX1NFQ1RJT05fTk9ERSIsICJYTUxfRU5USVRZX1JFRl9OT0RFIiwgIlhNTF9FTlRJVFlfTk9ERSIsCiAgICAgICJYTUxfUElfTk9ERSIsICJYTUxfQ09NTUVOVF9OT0RFIiwgIlhNTF9ET0NVTUVOVF9OT0RFIiwKICAgICAgIlhNTF9ET0NVTUVOVF9UWVBFX05PREUiLCAiWE1MX0RPQ1VNRU5UX0ZSQUdfTk9ERSIsICJYTUxfTk9UQVRJT05fTk9ERSIsCiAgICAgICJYTUxfSFRNTF9ET0NVTUVOVF9OT0RFIiwgIlhNTF9EVERfTk9ERSIsICJYTUxfRUxFTUVOVF9ERUNMX05PREUiLAogICAgICAiWE1MX0FUVFJJQlVURV9ERUNMX05PREUiLCAiWE1MX0VOVElUWV9ERUNMX05PREUiLCAiWE1MX05BTUVTUEFDRV9ERUNMX05PREUiLAogICAgICAiWE1MX0xPQ0FMX05BTUVTUEFDRSIsICJYTUxfQVRUUklCVVRFX0NEQVRBIiwgIlhNTF9BVFRSSUJVVEVfSUQiLAogICAgICAiWE1MX0FUVFJJQlVURV9JRFJFRiIsICJYTUxfQVRUUklCVVRFX0lEUkVGUyIsICJYTUxfQVRUUklCVVRFX0VOVElUWSIsCiAgICAgICJYTUxfQVRUUklCVVRFX05NVE9LRU4iLCAiWE1MX0FUVFJJQlVURV9OTVRPS0VOUyIsICJYTUxfQVRUUklCVVRFX0VOVU1FUkFUSU9OIiwKICAgICAgIlhNTF9BVFRSSUJVVEVfTk9UQVRJT04iLCAiRE9NX1BIUF9FUlIiLCAiRE9NX0lOREVYX1NJWkVfRVJSIiwKICAgICAgIkRPTVNUUklOR19TSVpFX0VSUiIsICJET01fSElFUkFSQ0hZX1JFUVVFU1RfRVJSIiwgIkRPTV9XUk9OR19ET0NVTUVOVF9FUlIiLAogICAgICAiRE9NX0lOVkFMSURfQ0hBUkFDVEVSX0VSUiIsICJET01fTk9fREFUQV9BTExPV0VEX0VSUiIsCiAgICAgICJET01fTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSIiwgIkRPTV9OT1RfRk9VTkRfRVJSIiwKICAgICAgIkRPTV9OT1RfU1VQUE9SVEVEX0VSUiIsICJET01fSU5VU0VfQVRUUklCVVRFX0VSUiIsICJET01fSU5WQUxJRF9TVEFURV9FUlIiLAogICAgICAiRE9NX1NZTlRBWF9FUlIiLCAiRE9NX0lOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiIsICJET01fTkFNRVNQQUNFX0VSUiIsCiAgICAgICJET01fSU5WQUxJRF9BQ0NFU1NfRVJSIiwgIkRPTV9WQUxJREFUSU9OX0VSUiIsICJYTUxfRVJST1JfTk9ORSIsCiAgICAgICJYTUxfRVJST1JfTk9fTUVNT1JZIiwgIlhNTF9FUlJPUl9TWU5UQVgiLCAiWE1MX0VSUk9SX05PX0VMRU1FTlRTIiwKICAgICAgIlhNTF9FUlJPUl9JTlZBTElEX1RPS0VOIiwgIlhNTF9FUlJPUl9VTkNMT1NFRF9UT0tFTiIsCiAgICAgICJYTUxfRVJST1JfUEFSVElBTF9DSEFSIiwgIlhNTF9FUlJPUl9UQUdfTUlTTUFUQ0giLAogICAgICAiWE1MX0VSUk9SX0RVUExJQ0FURV9BVFRSSUJVVEUiLCAiWE1MX0VSUk9SX0pVTktfQUZURVJfRE9DX0VMRU1FTlQiLAogICAgICAiWE1MX0VSUk9SX1BBUkFNX0VOVElUWV9SRUYiLCAiWE1MX0VSUk9SX1VOREVGSU5FRF9FTlRJVFkiLAogICAgICAiWE1MX0VSUk9SX1JFQ1VSU0lWRV9FTlRJVFlfUkVGIiwgIlhNTF9FUlJPUl9BU1lOQ19FTlRJVFkiLAogICAgICAiWE1MX0VSUk9SX0JBRF9DSEFSX1JFRiIsICJYTUxfRVJST1JfQklOQVJZX0VOVElUWV9SRUYiLAogICAgICAiWE1MX0VSUk9SX0FUVFJJQlVURV9FWFRFUk5BTF9FTlRJVFlfUkVGIiwgIlhNTF9FUlJPUl9NSVNQTEFDRURfWE1MX1BJIiwKICAgICAgIlhNTF9FUlJPUl9VTktOT1dOX0VOQ09ESU5HIiwgIlhNTF9FUlJPUl9JTkNPUlJFQ1RfRU5DT0RJTkciLAogICAgICAiWE1MX0VSUk9SX1VOQ0xPU0VEX0NEQVRBX1NFQ1RJT04iLCAiWE1MX0VSUk9SX0VYVEVSTkFMX0VOVElUWV9IQU5ETElORyIsCiAgICAgICJYTUxfT1BUSU9OX0NBU0VfRk9MRElORyIsICJYTUxfT1BUSU9OX1RBUkdFVF9FTkNPRElORyIsCiAgICAgICJYTUxfT1BUSU9OX1NLSVBfVEFHU1RBUlQiLCAiWE1MX09QVElPTl9TS0lQX1dISVRFIiwgIlhNTF9TQVhfSU1QTCIsICJJTUdfR0lGIiwKICAgICAgIklNR19KUEciLCAiSU1HX0pQRUciLCAiSU1HX1BORyIsICJJTUdfV0JNUCIsICJJTUdfWFBNIiwgIklNR19DT0xPUl9USUxFRCIsCiAgICAgICJJTUdfQ09MT1JfU1RZTEVEIiwgIklNR19DT0xPUl9CUlVTSEVEIiwgIklNR19DT0xPUl9TVFlMRURCUlVTSEVEIiwKICAgICAgIklNR19DT0xPUl9UUkFOU1BBUkVOVCIsICJJTUdfQVJDX1JPVU5ERUQiLCAiSU1HX0FSQ19QSUUiLCAiSU1HX0FSQ19DSE9SRCIsCiAgICAgICJJTUdfQVJDX05PRklMTCIsICJJTUdfQVJDX0VER0VEIiwgIklNR19HRDJfUkFXIiwgIklNR19HRDJfQ09NUFJFU1NFRCIsCiAgICAgICJJTUdfRUZGRUNUX1JFUExBQ0UiLCAiSU1HX0VGRkVDVF9BTFBIQUJMRU5EIiwgIklNR19FRkZFQ1RfTk9STUFMIiwKICAgICAgIklNR19FRkZFQ1RfT1ZFUkxBWSIsICJHRF9CVU5ETEVEIiwgIklNR19GSUxURVJfTkVHQVRFIiwKICAgICAgIklNR19GSUxURVJfR1JBWVNDQUxFIiwgIklNR19GSUxURVJfQlJJR0hUTkVTUyIsICJJTUdfRklMVEVSX0NPTlRSQVNUIiwKICAgICAgIklNR19GSUxURVJfQ09MT1JJWkUiLCAiSU1HX0ZJTFRFUl9FREdFREVURUNUIiwgIklNR19GSUxURVJfR0FVU1NJQU5fQkxVUiIsCiAgICAgICJJTUdfRklMVEVSX1NFTEVDVElWRV9CTFVSIiwgIklNR19GSUxURVJfRU1CT1NTIiwgIklNR19GSUxURVJfTUVBTl9SRU1PVkFMIiwKICAgICAgIklNR19GSUxURVJfU01PT1RIIiwgIlBOR19OT19GSUxURVIiLCAiUE5HX0ZJTFRFUl9OT05FIiwgIlBOR19GSUxURVJfU1VCIiwKICAgICAgIlBOR19GSUxURVJfVVAiLCAiUE5HX0ZJTFRFUl9BVkciLCAiUE5HX0ZJTFRFUl9QQUVUSCIsICJQTkdfQUxMX0ZJTFRFUlMiLAogICAgICAiTUJfT1ZFUkxPQURfTUFJTCIsICJNQl9PVkVSTE9BRF9TVFJJTkciLCAiTUJfT1ZFUkxPQURfUkVHRVgiLCAiTUJfQ0FTRV9VUFBFUiIsCiAgICAgICJNQl9DQVNFX0xPV0VSIiwgIk1CX0NBU0VfVElUTEUiLCAiTVlTUUxfQVNTT0MiLCAiTVlTUUxfTlVNIiwgIk1ZU1FMX0JPVEgiLAogICAgICAiTVlTUUxfQ0xJRU5UX0NPTVBSRVNTIiwgIk1ZU1FMX0NMSUVOVF9TU0wiLCAiTVlTUUxfQ0xJRU5UX0lOVEVSQUNUSVZFIiwKICAgICAgIk1ZU1FMX0NMSUVOVF9JR05PUkVfU1BBQ0UiLCAiTVlTUUxJX1JFQURfREVGQVVMVF9HUk9VUCIsCiAgICAgICJNWVNRTElfUkVBRF9ERUZBVUxUX0ZJTEUiLCAiTVlTUUxJX09QVF9DT05ORUNUX1RJTUVPVVQiLAogICAgICAiTVlTUUxJX09QVF9MT0NBTF9JTkZJTEUiLCAiTVlTUUxJX0lOSVRfQ09NTUFORCIsICJNWVNRTElfQ0xJRU5UX1NTTCIsCiAgICAgICJNWVNRTElfQ0xJRU5UX0NPTVBSRVNTIiwgIk1ZU1FMSV9DTElFTlRfSU5URVJBQ1RJVkUiLAogICAgICAiTVlTUUxJX0NMSUVOVF9JR05PUkVfU1BBQ0UiLCAiTVlTUUxJX0NMSUVOVF9OT19TQ0hFTUEiLAogICAgICAiTVlTUUxJX0NMSUVOVF9GT1VORF9ST1dTIiwgIk1ZU1FMSV9TVE9SRV9SRVNVTFQiLCAiTVlTUUxJX1VTRV9SRVNVTFQiLAogICAgICAiTVlTUUxJX0FTU09DIiwgIk1ZU1FMSV9OVU0iLCAiTVlTUUxJX0JPVEgiLAogICAgICAiTVlTUUxJX1NUTVRfQVRUUl9VUERBVEVfTUFYX0xFTkdUSCIsICJNWVNRTElfU1RNVF9BVFRSX0NVUlNPUl9UWVBFIiwKICAgICAgIk1ZU1FMSV9DVVJTT1JfVFlQRV9OT19DVVJTT1IiLCAiTVlTUUxJX0NVUlNPUl9UWVBFX1JFQURfT05MWSIsCiAgICAgICJNWVNRTElfQ1VSU09SX1RZUEVfRk9SX1VQREFURSIsICJNWVNRTElfQ1VSU09SX1RZUEVfU0NST0xMQUJMRSIsCiAgICAgICJNWVNRTElfU1RNVF9BVFRSX1BSRUZFVENIX1JPV1MiLCAiTVlTUUxJX05PVF9OVUxMX0ZMQUciLAogICAgICAiTVlTUUxJX1BSSV9LRVlfRkxBRyIsICJNWVNRTElfVU5JUVVFX0tFWV9GTEFHIiwgIk1ZU1FMSV9NVUxUSVBMRV9LRVlfRkxBRyIsCiAgICAgICJNWVNRTElfQkxPQl9GTEFHIiwgIk1ZU1FMSV9VTlNJR05FRF9GTEFHIiwgIk1ZU1FMSV9aRVJPRklMTF9GTEFHIiwKICAgICAgIk1ZU1FMSV9BVVRPX0lOQ1JFTUVOVF9GTEFHIiwgIk1ZU1FMSV9USU1FU1RBTVBfRkxBRyIsICJNWVNRTElfU0VUX0ZMQUciLAogICAgICAiTVlTUUxJX05VTV9GTEFHIiwgIk1ZU1FMSV9QQVJUX0tFWV9GTEFHIiwgIk1ZU1FMSV9HUk9VUF9GTEFHIiwKICAgICAgIk1ZU1FMSV9UWVBFX0RFQ0lNQUwiLCAiTVlTUUxJX1RZUEVfVElOWSIsICJNWVNRTElfVFlQRV9TSE9SVCIsCiAgICAgICJNWVNRTElfVFlQRV9MT05HIiwgIk1ZU1FMSV9UWVBFX0ZMT0FUIiwgIk1ZU1FMSV9UWVBFX0RPVUJMRSIsCiAgICAgICJNWVNRTElfVFlQRV9OVUxMIiwgIk1ZU1FMSV9UWVBFX1RJTUVTVEFNUCIsICJNWVNRTElfVFlQRV9MT05HTE9ORyIsCiAgICAgICJNWVNRTElfVFlQRV9JTlQyNCIsICJNWVNRTElfVFlQRV9EQVRFIiwgIk1ZU1FMSV9UWVBFX1RJTUUiLAogICAgICAiTVlTUUxJX1RZUEVfREFURVRJTUUiLCAiTVlTUUxJX1RZUEVfWUVBUiIsICJNWVNRTElfVFlQRV9ORVdEQVRFIiwKICAgICAgIk1ZU1FMSV9UWVBFX0VOVU0iLCAiTVlTUUxJX1RZUEVfU0VUIiwgIk1ZU1FMSV9UWVBFX1RJTllfQkxPQiIsCiAgICAgICJNWVNRTElfVFlQRV9NRURJVU1fQkxPQiIsICJNWVNRTElfVFlQRV9MT05HX0JMT0IiLCAiTVlTUUxJX1RZUEVfQkxPQiIsCiAgICAgICJNWVNRTElfVFlQRV9WQVJfU1RSSU5HIiwgIk1ZU1FMSV9UWVBFX1NUUklORyIsICJNWVNRTElfVFlQRV9DSEFSIiwKICAgICAgIk1ZU1FMSV9UWVBFX0lOVEVSVkFMIiwgIk1ZU1FMSV9UWVBFX0dFT01FVFJZIiwgIk1ZU1FMSV9UWVBFX05FV0RFQ0lNQUwiLAogICAgICAiTVlTUUxJX1RZUEVfQklUIiwgIk1ZU1FMSV9SUExfTUFTVEVSIiwgIk1ZU1FMSV9SUExfU0xBVkUiLCAiTVlTUUxJX1JQTF9BRE1JTiIsCiAgICAgICJNWVNRTElfTk9fREFUQSIsICJNWVNRTElfREFUQV9UUlVOQ0FURUQiLCAiTVlTUUxJX1JFUE9SVF9JTkRFWCIsCiAgICAgICJNWVNRTElfUkVQT1JUX0VSUk9SIiwgIk1ZU1FMSV9SRVBPUlRfU1RSSUNUIiwgIk1ZU1FMSV9SRVBPUlRfQUxMIiwKICAgICAgIk1ZU1FMSV9SRVBPUlRfT0ZGIiwgIkFGX1VOSVgiLCAiQUZfSU5FVCIsICJBRl9JTkVUNiIsICJTT0NLX1NUUkVBTSIsCiAgICAgICJTT0NLX0RHUkFNIiwgIlNPQ0tfUkFXIiwgIlNPQ0tfU0VRUEFDS0VUIiwgIlNPQ0tfUkRNIiwgIk1TR19PT0IiLAogICAgICAiTVNHX1dBSVRBTEwiLCAiTVNHX1BFRUsiLCAiTVNHX0RPTlRST1VURSIsICJTT19ERUJVRyIsICJTT19SRVVTRUFERFIiLAogICAgICAiU09fS0VFUEFMSVZFIiwgIlNPX0RPTlRST1VURSIsICJTT19MSU5HRVIiLCAiU09fQlJPQURDQVNUIiwgIlNPX09PQklOTElORSIsCiAgICAgICJTT19TTkRCVUYiLCAiU09fUkNWQlVGIiwgIlNPX1NORExPV0FUIiwgIlNPX1JDVkxPV0FUIiwgIlNPX1NORFRJTUVPIiwKICAgICAgIlNPX1JDVlRJTUVPIiwgIlNPX1RZUEUiLCAiU09fRVJST1IiLCAiU09MX1NPQ0tFVCIsICJTT01BWENPTk4iLAogICAgICAiUEhQX05PUk1BTF9SRUFEIiwgIlBIUF9CSU5BUllfUkVBRCIsICJTT0NLRVRfRUlOVFIiLCAiU09DS0VUX0VCQURGIiwKICAgICAgIlNPQ0tFVF9FQUNDRVMiLCAiU09DS0VUX0VGQVVMVCIsICJTT0NLRVRfRUlOVkFMIiwgIlNPQ0tFVF9FTUZJTEUiLAogICAgICAiU09DS0VUX0VXT1VMREJMT0NLIiwgIlNPQ0tFVF9FSU5QUk9HUkVTUyIsICJTT0NLRVRfRUFMUkVBRFkiLAogICAgICAiU09DS0VUX0VOT1RTT0NLIiwgIlNPQ0tFVF9FREVTVEFERFJSRVEiLCAiU09DS0VUX0VNU0dTSVpFIiwKICAgICAgIlNPQ0tFVF9FUFJPVE9UWVBFIiwgIlNPQ0tFVF9FTk9QUk9UT09QVCIsICJTT0NLRVRfRVBST1RPTk9TVVBQT1JUIiwKICAgICAgIlNPQ0tFVF9FU09DS1ROT1NVUFBPUlQiLCAiU09DS0VUX0VPUE5PVFNVUFAiLCAiU09DS0VUX0VQRk5PU1VQUE9SVCIsCiAgICAgICJTT0NLRVRfRUFGTk9TVVBQT1JUIiwgIlNPQ0tFVF9FQUREUklOVVNFIiwgIlNPQ0tFVF9FQUREUk5PVEFWQUlMIiwKICAgICAgIlNPQ0tFVF9FTkVURE9XTiIsICJTT0NLRVRfRU5FVFVOUkVBQ0giLCAiU09DS0VUX0VORVRSRVNFVCIsCiAgICAgICJTT0NLRVRfRUNPTk5BQk9SVEVEIiwgIlNPQ0tFVF9FQ09OTlJFU0VUIiwgIlNPQ0tFVF9FTk9CVUZTIiwgIlNPQ0tFVF9FSVNDT05OIiwKICAgICAgIlNPQ0tFVF9FTk9UQ09OTiIsICJTT0NLRVRfRVNIVVRET1dOIiwgIlNPQ0tFVF9FVE9PTUFOWVJFRlMiLAogICAgICAiU09DS0VUX0VUSU1FRE9VVCIsICJTT0NLRVRfRUNPTk5SRUZVU0VEIiwgIlNPQ0tFVF9FTE9PUCIsCiAgICAgICJTT0NLRVRfRU5BTUVUT09MT05HIiwgIlNPQ0tFVF9FSE9TVERPV04iLCAiU09DS0VUX0VIT1NUVU5SRUFDSCIsCiAgICAgICJTT0NLRVRfRU5PVEVNUFRZIiwgIlNPQ0tFVF9FUFJPQ0xJTSIsICJTT0NLRVRfRVVTRVJTIiwgIlNPQ0tFVF9FRFFVT1QiLAogICAgICAiU09DS0VUX0VTVEFMRSIsICJTT0NLRVRfRVJFTU9URSIsICJTT0NLRVRfRURJU0NPTiIsICJTT0NLRVRfU1lTTk9UUkVBRFkiLAogICAgICAiU09DS0VUX1ZFUk5PVFNVUFBPUlRFRCIsICJTT0NLRVRfTk9USU5JVElBTElTRUQiLCAiU09DS0VUX0hPU1RfTk9UX0ZPVU5EIiwKICAgICAgIlNPQ0tFVF9UUllfQUdBSU4iLCAiU09DS0VUX05PX1JFQ09WRVJZIiwgIlNPQ0tFVF9OT19EQVRBIiwKICAgICAgIlNPQ0tFVF9OT19BRERSRVNTIiwgIlNPTF9UQ1AiLCAiU09MX1VEUCIsICJFQUNDRUxFUkFUT1JfVkVSU0lPTiIsCiAgICAgICJFQUNDRUxFUkFUT1JfU0hNX0FORF9ESVNLIiwgIkVBQ0NFTEVSQVRPUl9TSE0iLCAiRUFDQ0VMRVJBVE9SX1NITV9PTkxZIiwKICAgICAgIkVBQ0NFTEVSQVRPUl9ESVNLX09OTFkiLCAiRUFDQ0VMRVJBVE9SX05PTkUiLCAiWERFQlVHX1RSQUNFX0FQUEVORCIsCiAgICAgICJYREVCVUdfVFJBQ0VfQ09NUFVURVJJWkVEIiwgIlhERUJVR19UUkFDRV9IVE1MIiwgIlhERUJVR19DQ19VTlVTRUQiLAogICAgICAiWERFQlVHX0NDX0RFQURfQ09ERSIsICJTVERJTiIsICJTVERPVVQiLCAiU1RERVJSIiwKICAgIF0uZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCwgYXJyYXkpIHsKICAgICAgcmVzdWx0W2VsZW1lbnRdID0gdG9rZW4oImF0b20iLCAicGhwLXByZWRlZmluZWQtY29uc3RhbnQiKTsKICAgIH0pOwoKICAgIC8vIFBIUCBkZWNsYXJlZCBjbGFzc2VzIC0gb3V0cHV0IG9mIGdldF9kZWNsYXJlZF9jbGFzc2VzKCkuIERpZmZlcnMgZnJvbSBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQuY2xhc3Nlcy5waHAKICAgIFsgICJzdGRDbGFzcyIsICJFeGNlcHRpb24iLCAiRXJyb3JFeGNlcHRpb24iLCAiQ09NUGVyc2lzdEhlbHBlciIsICJjb21fZXhjZXB0aW9uIiwKICAgICAgImNvbV9zYWZlYXJyYXlfcHJveHkiLCAidmFyaWFudCIsICJjb20iLCAiZG90bmV0IiwgIlJlZmxlY3Rpb25FeGNlcHRpb24iLAogICAgICAiUmVmbGVjdGlvbiIsICJSZWZsZWN0aW9uRnVuY3Rpb25BYnN0cmFjdCIsICJSZWZsZWN0aW9uRnVuY3Rpb24iLAogICAgICAiUmVmbGVjdGlvblBhcmFtZXRlciIsICJSZWZsZWN0aW9uTWV0aG9kIiwgIlJlZmxlY3Rpb25DbGFzcyIsCiAgICAgICJSZWZsZWN0aW9uT2JqZWN0IiwgIlJlZmxlY3Rpb25Qcm9wZXJ0eSIsICJSZWZsZWN0aW9uRXh0ZW5zaW9uIiwgIkRhdGVUaW1lIiwKICAgICAgIkRhdGVUaW1lWm9uZSIsICJMaWJYTUxFcnJvciIsICJfX1BIUF9JbmNvbXBsZXRlX0NsYXNzIiwgInBocF91c2VyX2ZpbHRlciIsCiAgICAgICJEaXJlY3RvcnkiLCAiU2ltcGxlWE1MRWxlbWVudCIsICJET01FeGNlcHRpb24iLCAiRE9NU3RyaW5nTGlzdCIsCiAgICAgICJET01OYW1lTGlzdCIsICJET01JbXBsZW1lbnRhdGlvbkxpc3QiLCAiRE9NSW1wbGVtZW50YXRpb25Tb3VyY2UiLAogICAgICAiRE9NSW1wbGVtZW50YXRpb24iLCAiRE9NTm9kZSIsICJET01OYW1lU3BhY2VOb2RlIiwgIkRPTURvY3VtZW50RnJhZ21lbnQiLAogICAgICAiRE9NRG9jdW1lbnQiLCAiRE9NTm9kZUxpc3QiLCAiRE9NTmFtZWROb2RlTWFwIiwgIkRPTUNoYXJhY3RlckRhdGEiLCAiRE9NQXR0ciIsCiAgICAgICJET01FbGVtZW50IiwgIkRPTVRleHQiLCAiRE9NQ29tbWVudCIsICJET01UeXBlaW5mbyIsICJET01Vc2VyRGF0YUhhbmRsZXIiLAogICAgICAiRE9NRG9tRXJyb3IiLCAiRE9NRXJyb3JIYW5kbGVyIiwgIkRPTUxvY2F0b3IiLCAiRE9NQ29uZmlndXJhdGlvbiIsCiAgICAgICJET01DZGF0YVNlY3Rpb24iLCAiRE9NRG9jdW1lbnRUeXBlIiwgIkRPTU5vdGF0aW9uIiwgIkRPTUVudGl0eSIsCiAgICAgICJET01FbnRpdHlSZWZlcmVuY2UiLCAiRE9NUHJvY2Vzc2luZ0luc3RydWN0aW9uIiwgIkRPTVN0cmluZ0V4dGVuZCIsCiAgICAgICJET01YUGF0aCIsICJSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yIiwgIkl0ZXJhdG9ySXRlcmF0b3IiLCAiRmlsdGVySXRlcmF0b3IiLAogICAgICAiUmVjdXJzaXZlRmlsdGVySXRlcmF0b3IiLCAiUGFyZW50SXRlcmF0b3IiLCAiTGltaXRJdGVyYXRvciIsCiAgICAgICJDYWNoaW5nSXRlcmF0b3IiLCAiUmVjdXJzaXZlQ2FjaGluZ0l0ZXJhdG9yIiwgIk5vUmV3aW5kSXRlcmF0b3IiLAogICAgICAiQXBwZW5kSXRlcmF0b3IiLCAiSW5maW5pdGVJdGVyYXRvciIsICJSZWdleEl0ZXJhdG9yIiwKICAgICAgIlJlY3Vyc2l2ZVJlZ2V4SXRlcmF0b3IiLCAiRW1wdHlJdGVyYXRvciIsICJBcnJheU9iamVjdCIsICJBcnJheUl0ZXJhdG9yIiwKICAgICAgIlJlY3Vyc2l2ZUFycmF5SXRlcmF0b3IiLCAiU3BsRmlsZUluZm8iLCAiRGlyZWN0b3J5SXRlcmF0b3IiLAogICAgICAiUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IiLCAiU3BsRmlsZU9iamVjdCIsICJTcGxUZW1wRmlsZU9iamVjdCIsCiAgICAgICJTaW1wbGVYTUxJdGVyYXRvciIsICJMb2dpY0V4Y2VwdGlvbiIsICJCYWRGdW5jdGlvbkNhbGxFeGNlcHRpb24iLAogICAgICAiQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbiIsICJEb21haW5FeGNlcHRpb24iLCAiSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIiwKICAgICAgIkxlbmd0aEV4Y2VwdGlvbiIsICJPdXRPZlJhbmdlRXhjZXB0aW9uIiwgIlJ1bnRpbWVFeGNlcHRpb24iLAogICAgICAiT3V0T2ZCb3VuZHNFeGNlcHRpb24iLCAiT3ZlcmZsb3dFeGNlcHRpb24iLCAiUmFuZ2VFeGNlcHRpb24iLAogICAgICAiVW5kZXJmbG93RXhjZXB0aW9uIiwgIlVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiIsICJTcGxPYmplY3RTdG9yYWdlIiwKICAgICAgIlhNTFJlYWRlciIsICJYTUxXcml0ZXIiLCAibXlzcWxpX3NxbF9leGNlcHRpb24iLCAibXlzcWxpX2RyaXZlciIsICJteXNxbGkiLAogICAgICAibXlzcWxpX3dhcm5pbmciLCAibXlzcWxpX3Jlc3VsdCIsICJteXNxbGlfc3RtdCIsICJQRE9FeGNlcHRpb24iLCAiUERPIiwKICAgICAgIlBET1N0YXRlbWVudCIsICJQRE9Sb3ciCiAgICBdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJ0X3N0cmluZyIsICJwaHAtcHJlZGVmaW5lZC1jbGFzcyIpOwogICAgfSk7CgogICAgcmV0dXJuIHJlc3VsdDsKCiAgfSgpOwoKICAvLyBIZWxwZXIgcmVnZXhwcwogIHZhciBpc09wZXJhdG9yQ2hhciA9IC9bKyomJVwvPTw+IT8ufC1dLzsKICB2YXIgaXNIZXhEaWdpdCA9IC9bMC05QS1GYS1mXS87CiAgdmFyIGlzV29yZENoYXIgPSAvW1x3XCRfXS87CgogIC8vIFdyYXBwZXIgYXJvdW5kIHBocFRva2VuIHRoYXQgaGVscHMgbWFpbnRhaW4gcGFyc2VyIHN0YXRlICh3aGV0aGVyCiAgLy8gd2UgYXJlIGluc2lkZSBvZiBhIG11bHRpLWxpbmUgY29tbWVudCkKICBmdW5jdGlvbiBwaHBUb2tlblN0YXRlKGluc2lkZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgdmFyIG5ld0luc2lkZSA9IGluc2lkZTsKICAgICAgdmFyIHR5cGUgPSBwaHBUb2tlbihpbnNpZGUsIHNvdXJjZSwgZnVuY3Rpb24oYykge25ld0luc2lkZSA9IGM7fSk7CiAgICAgIGlmIChuZXdJbnNpZGUgIT0gaW5zaWRlKQogICAgICAgIHNldFN0YXRlKHBocFRva2VuU3RhdGUobmV3SW5zaWRlKSk7CiAgICAgIHJldHVybiB0eXBlOwogICAgfTsKICB9CgogIC8vIFRoZSB0b2tlbiByZWFkZXIsIGludGVkZWQgdG8gYmUgdXNlZCBieSB0aGUgdG9rZW5pemVyIGZyb20KICAvLyB0b2tlbml6ZS5qcyAodGhyb3VnaCBwaHBUb2tlblN0YXRlKS4gQWR2YW5jZXMgdGhlIHNvdXJjZSBzdHJlYW0KICAvLyBvdmVyIGEgdG9rZW4sIGFuZCByZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0eXBlIGFuZCBzdHlsZQogIC8vIG9mIHRoYXQgdG9rZW4uCiAgZnVuY3Rpb24gcGhwVG9rZW4oaW5zaWRlLCBzb3VyY2UsIHNldEluc2lkZSkgewogICAgZnVuY3Rpb24gcmVhZEhleE51bWJlcigpewogICAgICBzb3VyY2UubmV4dCgpOyAgLy8gc2tpcCB0aGUgJ3gnCiAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKGlzSGV4RGlnaXQpOwogICAgICByZXR1cm4ge3R5cGU6ICJudW1iZXIiLCBzdHlsZTogInBocC1hdG9tIn07CiAgICB9CgogICAgZnVuY3Rpb24gcmVhZE51bWJlcigpIHsKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTldLyk7CiAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCIuIikpewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTldLyk7CiAgICAgIH0KICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoImUiKSB8fCBzb3VyY2UuZXF1YWxzKCJFIikpewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIi0iKSkKICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTldLyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHt0eXBlOiAibnVtYmVyIiwgc3R5bGU6ICJwaHAtYXRvbSJ9OwogICAgfQogICAgLy8gUmVhZCBhIHdvcmQgYW5kIGxvb2sgaXQgdXAgaW4gdGhlIGtleXdvcmRzIGFycmF5LiBJZiBmb3VuZCwgaXQncyBhCiAgICAvLyBrZXl3b3JkIG9mIHRoYXQgdHlwZTsgb3RoZXJ3aXNlIGl0J3MgYSBQSFAgVF9TVFJJTkcuCiAgICBmdW5jdGlvbiByZWFkV29yZCgpIHsKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoaXNXb3JkQ2hhcik7CiAgICAgIHZhciB3b3JkID0gc291cmNlLmdldCgpOwogICAgICB2YXIga25vd24gPSBrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSAmJiBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSAmJiBrZXl3b3Jkc1t3b3JkXTsKICAgICAgLy8gc2luY2Ugd2UgY2FsbGVkIGdldCgpLCB0b2tlbml6ZTo6dGFrZSB3b24ndCBnZXQoKSBhbnl0aGluZy4gVGh1cywgd2UgbXVzdCBzZXQgdG9rZW4uY29udGVudAogICAgICByZXR1cm4ga25vd24gPyB7dHlwZToga25vd24udHlwZSwgc3R5bGU6IGtub3duLnN0eWxlLCBjb250ZW50OiB3b3JkfSA6CiAgICAgIHt0eXBlOiAidF9zdHJpbmciLCBzdHlsZTogInBocC10X3N0cmluZyIsIGNvbnRlbnQ6IHdvcmR9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZFZhcmlhYmxlKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc1dvcmRDaGFyKTsKICAgICAgdmFyIHdvcmQgPSBzb3VyY2UuZ2V0KCk7CiAgICAgIC8vIGluIFBIUCwgJyR0aGlzJyBpcyBhIHJlc2VydmVkIHdvcmQsIGJ1dCAndGhpcycgaXNuJ3QuIFlvdSBjYW4gaGF2ZSBmdW5jdGlvbiB0aGlzKCkgey4uLn0KICAgICAgaWYgKHdvcmQgPT0gIiR0aGlzIikKICAgICAgICByZXR1cm4ge3R5cGU6ICJ2YXJpYWJsZSIsIHN0eWxlOiAicGhwLWtleXdvcmQiLCBjb250ZW50OiB3b3JkfTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiB7dHlwZTogInZhcmlhYmxlIiwgc3R5bGU6ICJwaHAtdmFyaWFibGUiLCBjb250ZW50OiB3b3JkfTsKICAgIH0KCiAgICAvLyBBZHZhbmNlIHRoZSBzdHJlYW0gdW50aWwgdGhlIGdpdmVuIGNoYXJhY3RlciAobm90IHByZWNlZGVkIGJ5IGEKICAgIC8vIGJhY2tzbGFzaCkgaXMgZW5jb3VudGVyZWQsIG9yIHRoZSBlbmQgb2YgdGhlIGxpbmUgaXMgcmVhY2hlZC4KICAgIGZ1bmN0aW9uIG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsIGVuZCkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlOwogICAgICB2YXIgbmV4dDsKICAgICAgd2hpbGUoIXNvdXJjZS5lbmRPZkxpbmUoKSl7CiAgICAgICAgdmFyIG5leHQgPSBzb3VyY2UubmV4dCgpOwogICAgICAgIGlmIChuZXh0ID09IGVuZCAmJiAhZXNjYXBlZCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBlc2NhcGVkID0gbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIHJldHVybiBlc2NhcGVkOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlYWRTaW5nbGVMaW5lQ29tbWVudCgpIHsKICAgICAgLy8gcmVhZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5lIG9yIHVudGlsID8+LCB3aGljaCB0ZXJtaW5hdGVzIHNpbmdsZS1saW5lIGNvbW1lbnRzCiAgICAgIC8vIGA8P3BocCBlY2hvIDE7IC8vIGNvbW1lbnQgPz4gZm9vYCB3aWxsIGRpc3BsYXkgIjEgZm9vIgogICAgICB3aGlsZSghc291cmNlLmxvb2tBaGVhZCgiPz4iKSAmJiAhc291cmNlLmVuZE9mTGluZSgpKQogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgIHJldHVybiB7dHlwZTogImNvbW1lbnQiLCBzdHlsZTogInBocC1jb21tZW50In07CiAgICB9CiAgICAvKiBGb3IgbXVsdGktbGluZSBjb21tZW50cywgd2Ugd2FudCB0byByZXR1cm4gYSBjb21tZW50IHRva2VuIGZvcgogICAgICAgZXZlcnkgbGluZSBvZiB0aGUgY29tbWVudCwgYnV0IHdlIGFsc28gd2FudCB0byByZXR1cm4gdGhlIG5ld2xpbmVzCiAgICAgICBpbiB0aGVtIGFzIHJlZ3VsYXIgbmV3bGluZSB0b2tlbnMuIFdlIHRoZXJlZm9yZSBuZWVkIHRvIHNhdmUgYQogICAgICAgc3RhdGUgdmFyaWFibGUgKCJpbnNpZGUiKSB0byBpbmRpY2F0ZSB3aGV0aGVyIHdlIGFyZSBpbnNpZGUgYQogICAgICAgbXVsdGktbGluZSBjb21tZW50LgogICAgKi8KCiAgICBmdW5jdGlvbiByZWFkTXVsdGlsaW5lQ29tbWVudChzdGFydCl7CiAgICAgIHZhciBuZXdJbnNpZGUgPSAiLyoiOwogICAgICB2YXIgbWF5YmVFbmQgPSAoc3RhcnQgPT0gIioiKTsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBpZiAoc291cmNlLmVuZE9mTGluZSgpKQogICAgICAgICAgYnJlYWs7CiAgICAgICAgdmFyIG5leHQgPSBzb3VyY2UubmV4dCgpOwogICAgICAgIGlmIChuZXh0ID09ICIvIiAmJiBtYXliZUVuZCl7CiAgICAgICAgICBuZXdJbnNpZGUgPSBudWxsOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG1heWJlRW5kID0gKG5leHQgPT0gIioiKTsKICAgICAgfQogICAgICBzZXRJbnNpZGUobmV3SW5zaWRlKTsKICAgICAgcmV0dXJuIHt0eXBlOiAiY29tbWVudCIsIHN0eWxlOiAicGhwLWNvbW1lbnQifTsKICAgIH0KCiAgICAvLyBzaW1pbGFyIHRvIHJlYWRNdWx0aWxpbmVDb21tZW50IGFuZCBuZXh0VW50aWxVbmVzY2FwZWQKICAgIC8vIHVubGlrZSBjb21tZW50cywgc3RyaW5ncyBhcmUgbm90IHN0b3BwZWQgYnkgPz4KICAgIGZ1bmN0aW9uIHJlYWRNdWx0aWxpbmVTdHJpbmcoc3RhcnQpewogICAgICB2YXIgbmV3SW5zaWRlID0gc3RhcnQ7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5lbmRPZkxpbmUoKSkKICAgICAgICAgIGJyZWFrOwogICAgICAgIHZhciBuZXh0ID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAobmV4dCA9PSBzdGFydCAmJiAhZXNjYXBlZCl7CiAgICAgICAgICBuZXdJbnNpZGUgPSBudWxsOyAgLy8gd2UncmUgb3V0c2lkZSBvZiB0aGUgc3RyaW5nIG5vdwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVzY2FwZWQgPSAobmV4dCA9PSAiXFwiKTsKICAgICAgfQogICAgICBzZXRJbnNpZGUobmV3SW5zaWRlKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB0eXBlOiBuZXdJbnNpZGUgPT0gbnVsbD8gInN0cmluZyIgOiAic3RyaW5nX25vdF90ZXJtaW5hdGVkIiwKICAgICAgICBzdHlsZTogKHN0YXJ0ID09ICInIj8gInBocC1zdHJpbmctc2luZ2xlLXF1b3RlZCIgOiAicGhwLXN0cmluZy1kb3VibGUtcXVvdGVkIikKICAgICAgfTsKICAgIH0KCiAgICAvLyBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2UudHlwZXMuc3RyaW5nLnBocCNsYW5ndWFnZS50eXBlcy5zdHJpbmcuc3ludGF4LmhlcmVkb2MKICAgIC8vIFNlZSBhbHNvICdub3dkb2MnIG9uIHRoZSBwYWdlLiBIZXJlZG9jcyBhcmUgbm90IGludGVycnVwdGVkIGJ5IHRoZSAnPz4nIHRva2VuLgogICAgZnVuY3Rpb24gcmVhZEhlcmVkb2MoaWRlbnRpZmllcil7CiAgICAgIHZhciB0b2tlbiA9IHt9OwogICAgICBpZiAoaWRlbnRpZmllciA9PSAiPDw8IikgewogICAgICAgIC8vIG9uIG91ciBmaXJzdCBpbnZvY2F0aW9uIGFmdGVyIHJlYWRpbmcgdGhlIDw8PCwgd2UgbXVzdCBkZXRlcm1pbmUgdGhlIGNsb3NpbmcgaWRlbnRpZmllcgogICAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCInIikpIHsKICAgICAgICAgIC8vIG5vd2RvYwogICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoaXNXb3JkQ2hhcik7CiAgICAgICAgICBpZGVudGlmaWVyID0gIiciICsgc291cmNlLmdldCgpICsgIiciOwogICAgICAgICAgc291cmNlLm5leHQoKTsgIC8vIGNvbnN1bWUgdGhlIGNsb3NpbmcgIiciCiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UubWF0Y2hlcygvW0EtWmEtel9dLykpIHsKICAgICAgICAgIC8vIGhlcmVkb2MKICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKGlzV29yZENoYXIpOwogICAgICAgICAgaWRlbnRpZmllciA9IHNvdXJjZS5nZXQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gc3ludGF4IGVycm9yCiAgICAgICAgICBzZXRJbnNpZGUobnVsbCk7CiAgICAgICAgICByZXR1cm4geyB0eXBlOiAiZXJyb3IiLCBzdHlsZTogInN5bnRheC1lcnJvciIgfTsKICAgICAgICB9CiAgICAgICAgc2V0SW5zaWRlKGlkZW50aWZpZXIpOwogICAgICAgIHRva2VuLnR5cGUgPSAic3RyaW5nX25vdF90ZXJtaW5hdGVkIjsKICAgICAgICB0b2tlbi5zdHlsZSA9IGlkZW50aWZpZXIuY2hhckF0KDApID09ICInIj8gInBocC1zdHJpbmctc2luZ2xlLXF1b3RlZCIgOiAicGhwLXN0cmluZy1kb3VibGUtcXVvdGVkIjsKICAgICAgICB0b2tlbi5jb250ZW50ID0gaWRlbnRpZmllcjsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbi5zdHlsZSA9IGlkZW50aWZpZXIuY2hhckF0KDApID09ICInIj8gInBocC1zdHJpbmctc2luZ2xlLXF1b3RlZCIgOiAicGhwLXN0cmluZy1kb3VibGUtcXVvdGVkIjsKICAgICAgICAvLyBjb25zdW1lIGEgbGluZSBvZiBoZXJlZG9jIGFuZCBjaGVjayBpZiBpdCBlcXVhbHMgdGhlIGNsb3NpbmcgaWRlbnRpZmllciBwbHVzIGFuIG9wdGlvbmFsIHNlbWljb2xvbgogICAgICAgIGlmIChzb3VyY2UubG9va0FoZWFkKGlkZW50aWZpZXIsIHRydWUpICYmIChzb3VyY2UubG9va0FoZWFkKCI7XG4iKSB8fCBzb3VyY2UuZW5kT2ZMaW5lKCkpKSB7CiAgICAgICAgICAvLyB0aGUgY2xvc2luZyBpZGVudGlmaWVyIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lCiAgICAgICAgICAvLyBub3RlIHRoYXQgZXZlbiB3aGl0ZXNwYWNlIGFmdGVyIHRoZSAiOyIgaXMgZm9yYmlkZGVuIGJ5IHRoZSBQSFAgaGVyZWRvYyBzeW50YXgKICAgICAgICAgIHRva2VuLnR5cGUgPSAic3RyaW5nIjsKICAgICAgICAgIHRva2VuLmNvbnRlbnQgPSBzb3VyY2UuZ2V0KCk7ICAvLyBkb24ndCBnZXQgdGhlICI7IiBpZiB0aGVyZSBpcyBvbmUKICAgICAgICAgIHNldEluc2lkZShudWxsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdG9rZW4udHlwZSA9ICJzdHJpbmdfbm90X3Rlcm1pbmF0ZWQiOwogICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1teXG5dLyk7CiAgICAgICAgICB0b2tlbi5jb250ZW50ID0gc291cmNlLmdldCgpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdG9rZW47CiAgICB9CgogICAgZnVuY3Rpb24gcmVhZE9wZXJhdG9yKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc09wZXJhdG9yQ2hhcik7CiAgICAgIHJldHVybiB7dHlwZTogIm9wZXJhdG9yIiwgc3R5bGU6ICJwaHAtb3BlcmF0b3IifTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRTdHJpbmdTaW5nbGVRdW90ZWQoKSB7CiAgICAgIHZhciBlbmRCYWNrU2xhc2ggPSBuZXh0VW50aWxVbmVzY2FwZWQoc291cmNlLCAiJyIsIGZhbHNlKTsKICAgICAgc2V0SW5zaWRlKGVuZEJhY2tTbGFzaCA/ICInIiA6IG51bGwpOwogICAgICByZXR1cm4ge3R5cGU6ICJzdHJpbmciLCBzdHlsZTogInBocC1zdHJpbmctc2luZ2xlLXF1b3RlZCJ9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZFN0cmluZ0RvdWJsZVF1b3RlZCgpIHsKICAgICAgdmFyIGVuZEJhY2tTbGFzaCA9IG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsICJcIiIsIGZhbHNlKTsKICAgICAgc2V0SW5zaWRlKGVuZEJhY2tTbGFzaCA/ICJcIiI6IG51bGwpOwogICAgICByZXR1cm4ge3R5cGU6ICJzdHJpbmciLCBzdHlsZTogInBocC1zdHJpbmctZG91YmxlLXF1b3RlZCJ9OwogICAgfQoKICAgIC8vIEZldGNoIHRoZSBuZXh0IHRva2VuLiBEaXNwYXRjaGVzIG9uIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUKICAgIC8vIHN0cmVhbSwgb3IgZmlyc3QgdHdvIGNoYXJhY3RlcnMgd2hlbiB0aGUgZmlyc3QgaXMgYSBzbGFzaC4KICAgIHN3aXRjaCAoaW5zaWRlKSB7CiAgICAgIGNhc2UgbnVsbDoKICAgICAgY2FzZSBmYWxzZTogYnJlYWs7CiAgICAgIGNhc2UgIiciOgogICAgICBjYXNlICJcIiI6IHJldHVybiByZWFkTXVsdGlsaW5lU3RyaW5nKGluc2lkZSk7CiAgICAgIGNhc2UgIi8qIjogcmV0dXJuIHJlYWRNdWx0aWxpbmVDb21tZW50KHNvdXJjZS5uZXh0KCkpOwogICAgICBkZWZhdWx0OiByZXR1cm4gcmVhZEhlcmVkb2MoaW5zaWRlKTsKICAgIH0KICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICBpZiAoY2ggPT0gIiciIHx8IGNoID09ICJcIiIpCiAgICAgIHJldHVybiByZWFkTXVsdGlsaW5lU3RyaW5nKGNoKQogICAgZWxzZSBpZiAoY2ggPT0gIiMiKQogICAgICByZXR1cm4gcmVhZFNpbmdsZUxpbmVDb21tZW50KCk7CiAgICBlbHNlIGlmIChjaCA9PSAiJCIpCiAgICAgIHJldHVybiByZWFkVmFyaWFibGUoKTsKICAgIGVsc2UgaWYgKGNoID09ICI6IiAmJiBzb3VyY2UuZXF1YWxzKCI6IikpIHsKICAgICAgc291cmNlLm5leHQoKTsKICAgICAgLy8gdGhlIFRfRE9VQkxFX0NPTE9OIGNhbiBvbmx5IGZvbGxvdyBhIFRfU1RSSU5HIChjbGFzcyBuYW1lKQogICAgICByZXR1cm4ge3R5cGU6ICJ0X2RvdWJsZV9jb2xvbiIsIHN0eWxlOiAicGhwLW9wZXJhdG9yIn0KICAgIH0KICAgIC8vIHdpdGggcHVuY3R1YXRpb24sIHRoZSB0eXBlIG9mIHRoZSB0b2tlbiBpcyB0aGUgc3ltYm9sIGl0c2VsZgogICAgZWxzZSBpZiAoL1tcW1xde31cKFwpLDs6XS8udGVzdChjaCkpIHsKICAgICAgcmV0dXJuIHt0eXBlOiBjaCwgc3R5bGU6ICJwaHAtcHVuY3R1YXRpb24ifTsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICIwIiAmJiAoc291cmNlLmVxdWFscygieCIpIHx8IHNvdXJjZS5lcXVhbHMoIlgiKSkpCiAgICAgIHJldHVybiByZWFkSGV4TnVtYmVyKCk7CiAgICBlbHNlIGlmICgvWzAtOV0vLnRlc3QoY2gpKQogICAgICByZXR1cm4gcmVhZE51bWJlcigpOwogICAgZWxzZSBpZiAoY2ggPT0gIi8iKSB7CiAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCIqIikpCiAgICAgIHsgc291cmNlLm5leHQoKTsgcmV0dXJuIHJlYWRNdWx0aWxpbmVDb21tZW50KGNoKTsgfQogICAgICBlbHNlIGlmIChzb3VyY2UuZXF1YWxzKCIvIikpCiAgICAgICAgcmV0dXJuIHJlYWRTaW5nbGVMaW5lQ29tbWVudCgpOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIHJlYWRPcGVyYXRvcigpOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIjwiKSB7CiAgICAgIGlmIChzb3VyY2UubG9va0FoZWFkKCI8PCIsIHRydWUpKSB7CiAgICAgICAgc2V0SW5zaWRlKCI8PDwiKTsKICAgICAgICByZXR1cm4ge3R5cGU6ICI8PDwiLCBzdHlsZTogInBocC1wdW5jdHVhdGlvbiJ9OwogICAgICB9CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gcmVhZE9wZXJhdG9yKCk7CiAgICB9CiAgICBlbHNlIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkKICAgICAgcmV0dXJuIHJlYWRPcGVyYXRvcigpOwogICAgZWxzZQogICAgICByZXR1cm4gcmVhZFdvcmQoKTsKICB9CgogIC8vIFRoZSBleHRlcm5hbCBpbnRlcmZhY2UgdG8gdGhlIHRva2VuaXplci4KICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzdGFydFN0YXRlKSB7CiAgICByZXR1cm4gdG9rZW5pemVyKHNvdXJjZSwgc3RhcnRTdGF0ZSB8fCBwaHBUb2tlblN0YXRlKGZhbHNlLCB0cnVlKSk7CiAgfTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDA4LTIwMDksIFlhaG9vISBJbmMuCkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGZvciB1c2UgaW4gY29ubmVjdGlvbiB3aXRoIHRoZQpDb2RlTWlycm9yIHN1aXRlIG9mIG1vZHVsZXMgYW5kIHV0aWxpdGllcywgaG9zdGVkIGFuZCBtYWludGFpbmVkCmF0IGh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLAp3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCmZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CgoqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCiAgZm9sbG93aW5nIGRpc2NsYWltZXIuCgoqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCiAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCiAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KCiogTmVpdGhlciB0aGUgbmFtZSBvZiBZYWhvbyEgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwogIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCiAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFlhaG9vISBJbmMuCgpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCkxJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkNPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwpMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCkNBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVApMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgpBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/license.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDA4LTIwMDksIFlhaG9vISBJbmMuCkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGZvciB1c2UgaW4gY29ubmVjdGlvbiB3aXRoIHRoZQpDb2RlTWlycm9yIHN1aXRlIG9mIG1vZHVsZXMgYW5kIHV0aWxpdGllcywgaG9zdGVkIGFuZCBtYWludGFpbmVkCmF0IGh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLAp3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCmZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CgoqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCiAgZm9sbG93aW5nIGRpc2NsYWltZXIuCgoqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCiAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCiAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KCiogTmVpdGhlciB0aGUgbmFtZSBvZiBZYWhvbyEgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwogIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCiAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFlhaG9vISBJbmMuCgpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCkxJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkNPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwpMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCkNBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVApMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgpBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/css/pythoncolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmVkaXRib3ggewogIHBhZGRpbmc6IC40ZW07CiAgbWFyZ2luOiAwOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxMHB0OwogIGxpbmUtaGVpZ2h0OiAxLjFlbTsKICBjb2xvcjogYmxhY2s7Cn0KCnByZS5jb2RlLCAuZWRpdGJveCB7CiAgY29sb3I6ICM2NjY2NjY7Cn0KCi5lZGl0Ym94IHAgewogIG1hcmdpbjogMDsKfQoKc3Bhbi5weS1kZWxpbWl0ZXIsIHNwYW4ucHktc3BlY2lhbCB7CiAgY29sb3I6ICM2NjY2NjY7Cn0KCnNwYW4ucHktb3BlcmF0b3IgewogIGNvbG9yOiAjNjY2NjY2Owp9CgpzcGFuLnB5LWVycm9yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjYwMDAwOwogIGNvbG9yOiAjRkZGRkZGOwp9CgpzcGFuLnB5LWtleXdvcmQgewogIGNvbG9yOiAjNzcwMDg4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgpzcGFuLnB5LWxpdGVyYWwgewogIGNvbG9yOiAjMjI4ODExOwp9CgpzcGFuLnB5LWlkZW50aWZpZXIsIHNwYW4ucHktZnVuYyAgewogIGNvbG9yOiBibGFjazsKfQoKc3Bhbi5weS10eXBlLCBzcGFuLnB5LWRlY29yYXRvciB7CiAgY29sb3I6ICMwMDAwRkY7Cn0KCnNwYW4ucHktY29tbWVudCB7CiAgY29sb3I6ICNBQTc3MDA7Cn0KCnNwYW4ucHktc3RyaW5nLCBzcGFuLnB5LWJ5dGVzLCBzcGFuLnB5LXJhdywgc3Bhbi5weS11bmljb2RlIHsKICBjb2xvcjogI0FBMjIyMjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgo8aGVhZD4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9qcy9jb2RlbWlycm9yLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFB5dGhvbiBkZW1vbnN0cmF0aW9uPC90aXRsZT4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yLWxpbmUtbnVtYmVycyB7CiAgICAgICAgd2lkdGg6IDIuMmVtOwogICAgICAgIGNvbG9yOiAjYWFhOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZzogLjRlbTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDEwcHQ7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMWVtOwogICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+CjxwPgogICAgVGhpcyBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIHRoZSBQeXRob24gc3ludGF4IGhpZ2hsaWdodGluZyBtb2R1bGUKICAgIGZvciA8YSBocmVmPSJpbmRleC5odG1sIj5Db2RlTWlycm9yPC9hPi4KPC9wPgo8cD4KICAgIEZlYXR1cmVzIG9mIHRoaXMgcGFyc2VyIGluY2x1ZGU6CjwvcD4KPHVsPgogICAgPGxpPlRva2VuLWJhc2VkIHN5bnRheCBoaWdobGlnaHRpbmcgLSBjdXJyZW50bHkgdmVyeSBsaXR0bGUgbGV4aWNhbCBhbmFseXNpcyBoYXBwZW5zLiAgRmV3IGxleGljYWwgZXJyb3JzIHdpbGwgYmUgZGV0ZWN0ZWQuPC9saT4KICAgIDxsaT5Vc2UgdGhlIG5vcm1hbCBpbmRlbnRhdGlvbiBtb2RlIHRvIGVuZm9yY2UgcmVndWxhciBpbmRlbnRhdGlvbiwgb3RoZXJ3aXNlIHRoZSAic2hpZnQiIGluZGVudGF0aW9uIG1vZGUgd2lsbCBnaXZlIHlvdSBtb3JlIGZsZXhpYmlsaXR5LjwvbGk+CiAgICA8bGk+UGFyc2VyIE9wdGlvbnM6CiAgICAgICAgPHVsPgogICAgICAgICAgICA8bGk+cHl0aG9uVmVyc2lvbiAoSW50ZWdlcikgLSAyIG9yIDMgdG8gaW5kaWNhdGUgd2hpY2ggdmVyc2lvbiBvZiBQeXRob24gdG8gcGFyc2UuICBEZWZhdWx0ID0gMjwvbGk+CiAgICAgICAgICAgIDxsaT5zdHJpY3RFcnJvcnMgKEJvb2wpIC0gdHJ1ZSB0byBoaWdobGlnaHQgZXJyb3JzIHRoYXQgbWF5IG5vdCBiZSBQeXRob24gZXJyb3JzIGJ1dCBjYXVzZSBjb25mdXNpb24gZm9yIHRoaXMgcGFyc2VyLiBEZWZhdWx0ID0gdHJ1ZTwvbGk+CiAgICAgICAgPC91bD4KICAgIDwvbGk+CjwvdWw+CjxwPldyaXR0ZW4gYnkgVGltb3RoeSBGYXJyZWxsICg8YSBocmVmPSJMSUNFTlNFIj5saWNlbnNlPC9hPikuIFNwZWNpYWwKdGhhbmtzIHRvIEFkYW0gQnJhbmQgYW5kIE1hcmlqbiBIYXZlcmJla2UgZm9yIHRoZWlyIGhlbHAgaW4gZGVidWdnaW5nCmFuZCBwcm92aWRpbmcgZm9yIHRoaXMgcGFyc2VyLjwvcD4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nOiAwcHg7Ij4KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMDAiIHJvd3M9IjIwIiBzdHlsZT0id2lkdGg6MTAwJSI+CiMgTGl0ZXJhbHMKMTIzNAowLjBlMTAxCi4xMjMKMGIwMTAxMDAxMTEwMAowbzAxMjM0NTY3CjB4MDk4NzY1NDMyMWFiY2RlZgojIEVycm9yIExpdGVyYWxzCi4wYjAwMAowLjBlCjBlCgojIFN0cmluZyBMaXRlcmFscwonRm9yXCcnCiJHb2RcIiIKIiIic28gbG92ZWQKdGhlIHdvcmxkIiIiCicnJ3RoYXQgaGUgZ2F2ZQpoaXMgb25seSBiZWdvdHRlblwnICcnJwondGhhdCB3aG9zb2V2ZXIgYmVsaWV2ZXRoIFwKaW4gaGltJwonJwoKIyBJZGVudGlmaWVycwpfX2FfXwphLmIKYS5iLmMKIyBFcnJvciBJZGVudGlmaWVycwphLgoKIyBPcGVyYXRvcnMKKyAtICogLyAlICYgfCBeIH4gPCA+Cj09ICE9IDw9ID49IDw+IDw8ID4+IC8vICoqCmFuZCBvciBub3QgaW4gaXMKCiMgRGVsaW1pdGVycwooKSBbXSB7fSAsIDogYCA9IDsgQCAuICMgQXQtc2lnbnMgYW5kIHBlcmlvZHMgcmVxdWlyZSBjb250ZXh0Cis9IC09ICo9IC89ICU9ICY9IHw9IF49Ci8vPSA+Pj0gPDw9ICoqPQoKIyBLZXl3b3JkcwphcyBhc3NlcnQgYnJlYWsgY2xhc3MgY29udGludWUgZGVmIGRlbCBlbGlmIGVsc2UgZXhjZXB0CmZpbmFsbHkgZm9yIGZyb20gZ2xvYmFsIGlmIGltcG9ydCBsYW1iZGEgcGFzcyByYWlzZQpyZXR1cm4gdHJ5IHdoaWxlIHdpdGggeWllbGQKCiMgUHl0aG9uIDIgS2V5d29yZHMgKG90aGVyd2lzZSBJZGVudGlmaWVycykKZXhlYyBwcmludAoKIyBQeXRob24gMyBLZXl3b3JkcyAob3RoZXJ3aXNlIElkZW50aWZpZXJzKQpub25sb2NhbAoKIyBUeXBlcwpib29sIGNsYXNzbWV0aG9kIGNvbXBsZXggZGljdCBlbnVtZXJhdGUgZmxvYXQgZnJvemVuc2V0IGludCBsaXN0IG9iamVjdApwcm9wZXJ0eSByZXZlcnNlZCBzZXQgc2xpY2Ugc3RhdGljbWV0aG9kIHN0ciBzdXBlciB0dXBsZSB0eXBlCgojIFB5dGhvbiAyIFR5cGVzIChvdGhlcndpc2UgSWRlbnRpZmllcnMpCmJhc2VzdHJpbmcgYnVmZmVyIGZpbGUgbG9uZyB1bmljb2RlIHhyYW5nZQoKIyBQeXRob24gMyBUeXBlcyAob3RoZXJ3aXNlIElkZW50aWZpZXJzKQpieXRlYXJyYXkgYnl0ZXMgZmlsdGVyIG1hcCBtZW1vcnl2aWV3IG9wZW4gcmFuZ2UgemlwCgojIEV4YW1wbGUgU3RyaWN0IEVycm9ycwpkZWYgZG9lc05vdGhpbmcoKToKICAgcGFzcyAjIGluZGVudFVuaXQgaXMgc2V0IHRvIDQgYnV0IHRoaXMgbGluZSBpcyBpbmRlbnRlZCAzCgojIFNvbWUgRXhhbXBsZSBjb2RlCmltcG9ydCBvcwpmcm9tIHBhY2thZ2UgaW1wb3J0IFBhcmVudENsYXNzCgpAbm9uc2Vuc2VEZWNvcmF0b3IKZGVmIGRvZXNOb3RoaW5nKCk6CiAgICBwYXNzCgpjbGFzcyBFeGFtcGxlQ2xhc3MoUGFyZW50Q2xhc3MpOgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGV4YW1wbGUoaW5wdXRTdHIpOgogICAgICAgIGEgPSBsaXN0KGlucHV0U3RyKQogICAgICAgIGEucmV2ZXJzZSgpCiAgICAgICAgcmV0dXJuICcnLmpvaW4oYSkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWl4aW4gPSAnSGVsbG8nKToKICAgICAgICBzZWxmLm1peGluID0gbWl4aW4KCjwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKCdjb2RlJywgewogICAgICAgIHBhcnNlcmZpbGU6IFsiLi4vY29udHJpYi9weXRob24vanMvcGFyc2VweXRob24uanMiXSwKICAgICAgICBzdHlsZXNoZWV0OiAiY3NzL3B5dGhvbmNvbG9ycy5jc3MiLAogICAgICAgIHBhdGg6ICIuLi8uLi9qcy8iLAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIHRleHRXcmFwcGluZzogZmFsc2UsCiAgICAgICAgaW5kZW50VW5pdDogNCwKICAgICAgICBwYXJzZXJDb25maWc6IHsncHl0aG9uVmVyc2lvbic6IDIsICdzdHJpY3RFcnJvcnMnOiB0cnVlfQogICAgfSk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/js/parsepython.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIFB5dGhvblBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgd29yZHMuam9pbigifCIpICsgIikkIik7CiAgICB9CiAgICB2YXIgREVMSU1JVEVSQ0xBU1MgPSAncHktZGVsaW1pdGVyJzsKICAgIHZhciBMSVRFUkFMQ0xBU1MgPSAncHktbGl0ZXJhbCc7CiAgICB2YXIgRVJST1JDTEFTUyA9ICdweS1lcnJvcic7CiAgICB2YXIgT1BFUkFUT1JDTEFTUyA9ICdweS1vcGVyYXRvcic7CiAgICB2YXIgSURFTlRJRklFUkNMQVNTID0gJ3B5LWlkZW50aWZpZXInOwogICAgdmFyIFNUUklOR0NMQVNTID0gJ3B5LXN0cmluZyc7CiAgICB2YXIgQllURVNDTEFTUyA9ICdweS1ieXRlcyc7CiAgICB2YXIgVU5JQ09ERUNMQVNTID0gJ3B5LXVuaWNvZGUnOwogICAgdmFyIFJBV0NMQVNTID0gJ3B5LXJhdyc7CiAgICB2YXIgTk9STUFMQ09OVEVYVCA9ICdub3JtYWwnOwogICAgdmFyIFNUUklOR0NPTlRFWFQgPSAnc3RyaW5nJzsKICAgIHZhciBzaW5nbGVPcGVyYXRvcnMgPSAnKy0qLyUmfF5+PD4nOwogICAgdmFyIGRvdWJsZU9wZXJhdG9ycyA9IHdvcmRSZWdleHAoWyc9PScsICchPScsICdcXDw9JywgJ1xcPj0nLCAnXFw8XFw+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFw8XFw8JywgJ1xcPlxcPicsICdcXC9cXC8nLCAnXFwqXFwqJ10pOwogICAgdmFyIHNpbmdsZURlbGltaXRlcnMgPSAnKClbXXt9QCw6LmA9Oyc7CiAgICB2YXIgZG91YmxlRGVsaW1pdGVycyA9IFsnXFwrPScsICdcXC09JywgJ1xcKj0nLCAnLz0nLCAnJT0nLCAnJj0nLCAnXFx8PScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFxePSddOwogICAgdmFyIHRyaXBsZURlbGltaXRlcnMgPSB3b3JkUmVnZXhwKFsnLy89JywnXFw+XFw+PScsJ1xcPFxcPD0nLCdcXCpcXCo9J10pOwogICAgdmFyIHNpbmdsZVN0YXJ0ZXJzID0gc2luZ2xlT3BlcmF0b3JzICsgc2luZ2xlRGVsaW1pdGVycyArICc9ISc7CiAgICB2YXIgZG91YmxlU3RhcnRlcnMgPSAnPTw+Ki8nOwogICAgdmFyIGlkZW50aWZpZXJTdGFydGVycyA9IC9bX0EtWmEtel0vOwoKICAgIHZhciB3b3JkT3BlcmF0b3JzID0gd29yZFJlZ2V4cChbJ2FuZCcsICdvcicsICdub3QnLCAnaXMnLCAnaW4nXSk7CiAgICB2YXIgY29tbW9ua2V5d29yZHMgPSBbJ2FzJywgJ2Fzc2VydCcsICdicmVhaycsICdjbGFzcycsICdjb250aW51ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZicsICdkZWwnLCAnZWxpZicsICdlbHNlJywgJ2V4Y2VwdCcsICdmaW5hbGx5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yJywgJ2Zyb20nLCAnZ2xvYmFsJywgJ2lmJywgJ2ltcG9ydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbWJkYScsICdwYXNzJywgJ3JhaXNlJywgJ3JldHVybicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyeScsICd3aGlsZScsICd3aXRoJywgJ3lpZWxkJ107CiAgICB2YXIgY29tbW9udHlwZXMgPSBbJ2Jvb2wnLCAnY2xhc3NtZXRob2QnLCAnY29tcGxleCcsICdkaWN0JywgJ2VudW1lcmF0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgJ2Zsb2F0JywgJ2Zyb3plbnNldCcsICdpbnQnLCAnbGlzdCcsICdvYmplY3QnLAogICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eScsICdyZXZlcnNlZCcsICdzZXQnLCAnc2xpY2UnLCAnc3RhdGljbWV0aG9kJywKICAgICAgICAgICAgICAgICAgICAgICAnc3RyJywgJ3N1cGVyJywgJ3R1cGxlJywgJ3R5cGUnXTsKICAgIHZhciBweTIgPSB7J3R5cGVzJzogWydiYXNlc3RyaW5nJywgJ2J1ZmZlcicsICdmaWxlJywgJ2xvbmcnLCAndW5pY29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAneHJhbmdlJ10sCiAgICAgICAgICAgICAgICdrZXl3b3Jkcyc6IFsnZXhlYycsICdwcmludCddLAogICAgICAgICAgICAgICAndmVyc2lvbic6IDIgfTsKICAgIHZhciBweTMgPSB7J3R5cGVzJzogWydieXRlYXJyYXknLCAnYnl0ZXMnLCAnZmlsdGVyJywgJ21hcCcsICdtZW1vcnl2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgICdvcGVuJywgJ3JhbmdlJywgJ3ppcCddLAogICAgICAgICAgICAgICAna2V5d29yZHMnOiBbJ25vbmxvY2FsJ10sCiAgICAgICAgICAgICAgICd2ZXJzaW9uJzogM307CgogICAgdmFyIHB5LCBrZXl3b3JkcywgdHlwZXMsIHN0cmluZ1N0YXJ0ZXJzLCBzdHJpbmdUeXBlcywgY29uZmlnOwoKICAgIGZ1bmN0aW9uIGNvbmZpZ3VyZShjb25mKSB7CiAgICAgICAgaWYgKCFjb25mLmhhc093blByb3BlcnR5KCdweXRob25WZXJzaW9uJykpIHsKICAgICAgICAgICAgY29uZi5weXRob25WZXJzaW9uID0gMjsKICAgICAgICB9CiAgICAgICAgaWYgKCFjb25mLmhhc093blByb3BlcnR5KCdzdHJpY3RFcnJvcnMnKSkgewogICAgICAgICAgICBjb25mLnN0cmljdEVycm9ycyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChjb25mLnB5dGhvblZlcnNpb24gIT0gMiAmJiBjb25mLnB5dGhvblZlcnNpb24gIT0gMykgewogICAgICAgICAgICBhbGVydCgnQ29kZU1pcnJvcjogVW5rbm93biBQeXRob24gVmVyc2lvbiAiJyArCiAgICAgICAgICAgICAgICAgIGNvbmYucHl0aG9uVmVyc2lvbiArCiAgICAgICAgICAgICAgICAgICciLCBkZWZhdWx0aW5nIHRvIFB5dGhvbiAyLnguJyk7CiAgICAgICAgICAgIGNvbmYucHl0aG9uVmVyc2lvbiA9IDI7CiAgICAgICAgfQogICAgICAgIGlmIChjb25mLnB5dGhvblZlcnNpb24gPT0gMykgewogICAgICAgICAgICBweSA9IHB5MzsKICAgICAgICAgICAgc3RyaW5nU3RhcnRlcnMgPSAvW1wnXCJyYlJCXS87CiAgICAgICAgICAgIHN0cmluZ1R5cGVzID0gL1tyYl0vOwogICAgICAgICAgICBkb3VibGVEZWxpbWl0ZXJzLnB1c2goJ1xcLVxcPicpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHB5ID0gcHkyOwogICAgICAgICAgICBzdHJpbmdTdGFydGVycyA9IC9bJyJSVXJ1XS87CiAgICAgICAgICAgIHN0cmluZ1R5cGVzID0gL1tydV0vOwogICAgICAgIH0KICAgICAgICBjb25maWcgPSBjb25mOwogICAgICAgIGtleXdvcmRzID0gd29yZFJlZ2V4cChjb21tb25rZXl3b3Jkcy5jb25jYXQocHkua2V5d29yZHMpKTsKICAgICAgICB0eXBlcyA9IHdvcmRSZWdleHAoY29tbW9udHlwZXMuY29uY2F0KHB5LnR5cGVzKSk7CiAgICAgICAgZG91YmxlRGVsaW1pdGVycyA9IHdvcmRSZWdleHAoZG91YmxlRGVsaW1pdGVycyk7CiAgICB9CgogICAgdmFyIHRva2VuaXplUHl0aG9uID0gKGZ1bmN0aW9uKCkgewogICAgICAgIGZ1bmN0aW9uIG5vcm1hbChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgICAgICAgIHZhciBzdHJpbmdEZWxpbSwgdGhyZWVTdHIsIHRlbXAsIHR5cGUsIHdvcmQsIHBvc3NpYmxlID0ge307CiAgICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBmdW5jdGlvbiBmaWx0ZXJQb3NzaWJsZSh0b2tlbiwgc3R5bGVJZlBvc3NpYmxlKSB7CiAgICAgICAgICAgICAgICBpZiAoIXBvc3NpYmxlLnN0eWxlICYmICFwb3NzaWJsZS5jb250ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YodG9rZW4pID09IFNUUklOR0NPTlRFWFQpIHsKICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHtjb250ZW50OiBzb3VyY2UuZ2V0KCksIHN0eWxlOiB0b2tlbn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocG9zc2libGUuc3R5bGUgfHwgc3R5bGVJZlBvc3NpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4uc3R5bGUgPSBzdHlsZUlmUG9zc2libGUgPyBzdHlsZUlmUG9zc2libGUgOiBwb3NzaWJsZS5zdHlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChwb3NzaWJsZS5jb250ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4uY29udGVudCA9IHBvc3NpYmxlLmNvbnRlbnQgKyB0b2tlbi5jb250ZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcG9zc2libGUgPSB7fTsKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSGFuZGxlIGNvbW1lbnRzCiAgICAgICAgICAgIGlmIChjaCA9PSAnIycpIHsKICAgICAgICAgICAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAncHktY29tbWVudCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSGFuZGxlIHNwZWNpYWwgY2hhcnMKICAgICAgICAgICAgaWYgKGNoID09ICdcXCcpIHsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpICE9ICdcbicpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd2hpdGVzcGFjZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoISgvXHMvLnRlc3Qoc291cmNlLm5leHQoKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aGl0ZXNwYWNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUkNMQVNTOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAncHktc3BlY2lhbCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSGFuZGxlIG9wZXJhdG9ycyBhbmQgZGVsaW1pdGVycwogICAgICAgICAgICBpZiAoc2luZ2xlU3RhcnRlcnMuaW5kZXhPZihjaCkgIT0gLTEpIHsKICAgICAgICAgICAgICAgIGlmIChkb3VibGVTdGFydGVycy5pbmRleE9mKHNvdXJjZS5wZWVrKCkpICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGNoICsgc291cmNlLnBlZWsoKTsKICAgICAgICAgICAgICAgICAgICAvLyBJdCBtdXN0IGJlIGEgZG91YmxlIGRlbGltaXRlciBvciBvcGVyYXRvciBvciB0cmlwbGUgZGVsaW1pdGVyCiAgICAgICAgICAgICAgICAgICAgaWYgKGRvdWJsZU9wZXJhdG9ycy50ZXN0KHRlbXApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmlwbGVEZWxpbWl0ZXJzLnRlc3QodGVtcCArIHNvdXJjZS5wZWVrKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFTElNSVRFUkNMQVNTOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QRVJBVE9SQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRvdWJsZURlbGltaXRlcnMudGVzdCh0ZW1wKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVMSU1JVEVSQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSXQgbXVzdCBiZSBhIHNpbmdsZSBkZWxpbWl0ZXIgb3Igb3BlcmF0b3IKICAgICAgICAgICAgICAgIGlmIChzaW5nbGVPcGVyYXRvcnMuaW5kZXhPZihjaCkgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BFUkFUT1JDTEFTUzsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2luZ2xlRGVsaW1pdGVycy5pbmRleE9mKGNoKSAhPSAtMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnQCcgJiYgL1x3Ly50ZXN0KHNvdXJjZS5wZWVrKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlID0ge3N0eWxlOidweS1kZWNvcmF0b3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBzb3VyY2UuZ2V0KCl9OwogICAgICAgICAgICAgICAgICAgICAgICBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLicgJiYgL1xkLy50ZXN0KHNvdXJjZS5wZWVrKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlID0ge3N0eWxlOkxJVEVSQUxDTEFTUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogc291cmNlLmdldCgpfTsKICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBERUxJTUlURVJDTEFTUzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUkNMQVNTOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEhhbmRsZSBudW1iZXIgbGl0ZXJhbHMKICAgICAgICAgICAgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJzAnICYmICFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNvdXJjZS5wZWVrKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbyc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ08nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bMC03XS8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlclBvc3NpYmxlKExJVEVSQUxDTEFTUywgRVJST1JDTEFTUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdYJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvWzAtOUEtRmEtZl0vKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJQb3NzaWJsZShMSVRFUkFMQ0xBU1MsIEVSUk9SQ0xBU1MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swMV0vKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJQb3NzaWJsZShMSVRFUkFMQ0xBU1MsIEVSUk9SQ0xBU1MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9cZC8pOwogICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5wZWVrKCkgPT0gJy4nKSB7CiAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEdyYWIgYW4gZXhwb25lbnQKICAgICAgICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpLnRvTG93ZXJDYXNlKCkgPT0gJ2UnKSB7CiAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLnBlZWsoKSA9PSAnKycgfHwgc291cmNlLnBlZWsoKSA9PSAnLScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKC9cZC8udGVzdChzb3VyY2UucGVlaygpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyUG9zc2libGUoRVJST1JDTEFTUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gR3JhYiBhIGNvbXBsZXggbnVtYmVyCiAgICAgICAgICAgICAgICBpZiAoc291cmNlLnBlZWsoKS50b0xvd2VyQ2FzZSgpID09ICdqJykgewogICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlclBvc3NpYmxlKExJVEVSQUxDTEFTUyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSGFuZGxlIHN0cmluZ3MKICAgICAgICAgICAgaWYgKHN0cmluZ1N0YXJ0ZXJzLnRlc3QoY2gpKSB7CiAgICAgICAgICAgICAgICB2YXIgcGVlayA9IHNvdXJjZS5wZWVrKCk7CiAgICAgICAgICAgICAgICB2YXIgc3RyaW5nVHlwZSA9IFNUUklOR0NMQVNTOwogICAgICAgICAgICAgICAgaWYgKChzdHJpbmdUeXBlcy50ZXN0KGNoKSkgJiYgKHBlZWsgPT0gJyInIHx8IHBlZWsgPT0gIiciKSkgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY2gudG9Mb3dlckNhc2UoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1R5cGUgPSBCWVRFU0NMQVNTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVHlwZSA9IFJBV0NMQVNTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3UnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVHlwZSA9IFVOSUNPREVDTEFTUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgc3RyaW5nRGVsaW0gPSBjaDsKICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLnBlZWsoKSAhPSBzdHJpbmdEZWxpbSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShpblN0cmluZyhzdHJpbmdUeXBlLCBzdHJpbmdEZWxpbSkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLnBlZWsoKSA9PSBzdHJpbmdEZWxpbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVlU3RyID0gc3RyaW5nRGVsaW0gKyBzdHJpbmdEZWxpbSArIHN0cmluZ0RlbGltOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoaW5TdHJpbmcoc3RyaW5nVHlwZSwgdGhyZWVTdHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1R5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICInIiB8fCBjaCA9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICBzdHJpbmdEZWxpbSA9IGNoOwogICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpICE9IHN0cmluZ0RlbGltKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKGluU3RyaW5nKHN0cmluZ1R5cGUsIHN0cmluZ0RlbGltKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpID09IHN0cmluZ0RlbGltKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWVTdHIgPSBzdHJpbmdEZWxpbSArIHN0cmluZ0RlbGltICsgc3RyaW5nRGVsaW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShpblN0cmluZyhzdHJpbmdUeXBlLCB0aHJlZVN0cikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBIYW5kbGUgSWRlbnRpZmllcgogICAgICAgICAgICBpZiAoaWRlbnRpZmllclN0YXJ0ZXJzLnRlc3QoY2gpKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW1x3XGRdLyk7CiAgICAgICAgICAgICAgICB3b3JkID0gc291cmNlLmdldCgpOwogICAgICAgICAgICAgICAgaWYgKHdvcmRPcGVyYXRvcnMudGVzdCh3b3JkKSkgewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBPUEVSQVRPUkNMQVNTOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXl3b3Jkcy50ZXN0KHdvcmQpKSB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdweS1rZXl3b3JkJzsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZXMudGVzdCh3b3JkKSkgewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSAncHktdHlwZSc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBJREVOVElGSUVSQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNvdXJjZS5wZWVrKCkgPT0gJy4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZGVudGlmaWVyU3RhcnRlcnMudGVzdChzb3VyY2UucGVlaygpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tcd1xkXS8pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVSUk9SQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3b3JkID0gd29yZCArIHNvdXJjZS5nZXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJQb3NzaWJsZSh7c3R5bGU6IHR5cGUsIGNvbnRlbnQ6IHdvcmR9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUmVnaXN0ZXIgRG9sbGFyIHNpZ24gYW5kIFF1ZXN0aW9uIG1hcmsgYXMgZXJyb3JzLiBBbHdheXMhCiAgICAgICAgICAgIGlmICgvXCRcPy8udGVzdChjaCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJQb3NzaWJsZShFUlJPUkNMQVNTKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGZpbHRlclBvc3NpYmxlKEVSUk9SQ0xBU1MpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaW5TdHJpbmcoc3R5bGUsIHRlcm1pbmF0b3IpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzID0gW107CiAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHdoaWxlICghZm91bmQgJiYgIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCksIG5ld01hdGNoZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGVzY2FwZWQgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpID09ICdcbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gdGVybWluYXRvci5jaGFyQXQoMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHRlcm1pbmF0b3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gbWF0Y2hlc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmNoYXJBdCgwKSA9PSBjaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01hdGNoZXMucHVzaChtYXRjaC5zbGljZSgxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyA9IG5ld01hdGNoZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzdGFydFN0YXRlKSB7CiAgICAgICAgICAgIHJldHVybiB0b2tlbml6ZXIoc291cmNlLCBzdGFydFN0YXRlIHx8IG5vcm1hbCk7CiAgICAgICAgfTsKICAgIH0pKCk7CgogICAgZnVuY3Rpb24gcGFyc2VQeXRob24oc291cmNlKSB7CiAgICAgICAgaWYgKCFrZXl3b3JkcykgewogICAgICAgICAgICBjb25maWd1cmUoe30pOwogICAgICAgIH0KCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplUHl0aG9uKHNvdXJjZSk7CiAgICAgICAgdmFyIGxhc3RUb2tlbiA9IG51bGw7CiAgICAgICAgdmFyIGNvbHVtbiA9IDA7CiAgICAgICAgdmFyIGNvbnRleHQgPSB7cHJldjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICBlbmRPZlNjb3BlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICBzdGFydE5ld1Njb3BlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogMCwKICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE5PUk1BTENPTlRFWFQKICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBwdXNoQ29udGV4dChsZXZlbCwgdHlwZSkgewogICAgICAgICAgICB0eXBlID0gdHlwZSA/IHR5cGUgOiBOT1JNQUxDT05URVhUOwogICAgICAgICAgICBjb250ZXh0ID0ge3ByZXY6IGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgZW5kT2ZTY29wZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgc3RhcnROZXdTY29wZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGxldmVsLAogICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZQogICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBwb3BDb250ZXh0KHJlbW92ZSkgewogICAgICAgICAgICByZW1vdmUgPSByZW1vdmUgPyByZW1vdmUgOiBmYWxzZTsKICAgICAgICAgICAgaWYgKGNvbnRleHQucHJldikgewogICAgICAgICAgICAgICAgaWYgKHJlbW92ZSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5uZXh0ID0gbnVsbDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wcmV2Lm5leHQgPSBjb250ZXh0OwogICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGluZGVudFB5dGhvbihjb250ZXh0KSB7CiAgICAgICAgICAgIHZhciB0ZW1wOwogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24obmV4dENoYXJzLCBjdXJyZW50TGV2ZWwsIGRpcmVjdGlvbikgewogICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gbnVsbCB8fCBkaXJlY3Rpb24gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvbnRleHQubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQubmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5sZXZlbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGV2ZWwgPT0gY29udGV4dC5sZXZlbCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5uZXh0LmxldmVsOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQubGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gY29udGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRlbXAucHJldiAmJiB0ZW1wLnByZXYubGV2ZWwgPiBjdXJyZW50TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wLnByZXY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXAubGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMZXZlbCA+IGNvbnRleHQubGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQubGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0LnByZXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGNvbnRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0ZW1wLnByZXYgJiYgdGVtcC5wcmV2LmxldmVsID49IGN1cnJlbnRMZXZlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAucHJldjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcC5wcmV2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcC5wcmV2LmxldmVsOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXAubGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5sZXZlbDsKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIHZhciBpdGVyID0gewogICAgICAgICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vucy5uZXh0KCk7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IHRva2VuLnN0eWxlOwogICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSB0b2tlbi5jb250ZW50OwoKICAgICAgICAgICAgICAgIGlmIChsYXN0VG9rZW4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFRva2VuLmNvbnRlbnQgPT0gJ2RlZicgJiYgdHlwZSA9PSBJREVOVElGSUVSQ0xBU1MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uc3R5bGUgPSAncHktZnVuYyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0VG9rZW4uY29udGVudCA9PSAnXG4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wQ3R4ID0gY29udGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgZGlmZmVyZW50IHNjb3BlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09ICd3aGl0ZXNwYWNlJyAmJiBjb250ZXh0LnR5cGUgPT0gTk9STUFMQ09OVEVYVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnZhbHVlLmxlbmd0aCA8IGNvbnRleHQubGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodG9rZW4udmFsdWUubGVuZ3RoIDwgY29udGV4dC5sZXZlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BDb250ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udmFsdWUubGVuZ3RoICE9IGNvbnRleHQubGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IHRlbXBDdHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuc3RyaWN0RXJyb3JzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5zdHlsZSA9IEVSUk9SQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm5leHQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0LmxldmVsICE9PSAwICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC50eXBlID09IE5PUk1BTENPTlRFWFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgwICE9PSBjb250ZXh0LmxldmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wQ29udGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmxldmVsICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IHRlbXBDdHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5zdHJpY3RFcnJvcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uc3R5bGUgPSBFUlJPUkNMQVNTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgU2NvcGUgQ2hhbmdlcwogICAgICAgICAgICAgICAgc3dpdGNoKHR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIFNUUklOR0NMQVNTOgogICAgICAgICAgICAgICAgICAgIGNhc2UgQllURVNDTEFTUzoKICAgICAgICAgICAgICAgICAgICBjYXNlIFJBV0NMQVNTOgogICAgICAgICAgICAgICAgICAgIGNhc2UgVU5JQ09ERUNMQVNTOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC50eXBlICE9PSBTVFJJTkdDT05URVhUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoQ29udGV4dChjb250ZXh0LmxldmVsICsgMSwgU1RSSU5HQ09OVEVYVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudHlwZSA9PT0gU1RSSU5HQ09OVEVYVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wQ29udGV4dCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaChjb250ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnLic6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnQCc6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGRlbGltaXRlcnMgZG9uJ3QgYXBwZWFyIGJ5IHRoZW1zZWx2ZXMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgIT09IHRva2VuLnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5zdHlsZSA9IEVSUk9SQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnOic6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbG9ucyBvbmx5IGRlbGltaXQgc2NvcGUgaW5zaWRlIGEgbm9ybWFsIHNjb3BlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LnR5cGUgPT09IE5PUk1BTENPTlRFWFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnROZXdTY29wZSA9IGNvbnRleHQubGV2ZWwraW5kZW50VW5pdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICcoJzoKICAgICAgICAgICAgICAgICAgICBjYXNlICdbJzoKICAgICAgICAgICAgICAgICAgICBjYXNlICd7JzoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2Ugc3RhcnQgYSBzZXF1ZW5jZSBzY29wZQogICAgICAgICAgICAgICAgICAgICAgICBwdXNoQ29udGV4dChjb2x1bW4gKyBjb250ZW50Lmxlbmd0aCwgJ3NlcXVlbmNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJyknOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ10nOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ30nOgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBlbmQgYSBzZXF1ZW5jZSBzY29wZQogICAgICAgICAgICAgICAgICAgICAgICBwb3BDb250ZXh0KHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdwYXNzJzoKICAgICAgICAgICAgICAgICAgICBjYXNlICdyZXR1cm4nOgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBlbmQgYSBub3JtYWwgc2NvcGUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudHlwZSA9PT0gTk9STUFMQ09OVEVYVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lbmRPZlNjb3BlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IG91ciBjb2x1bW4KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBhbnkgc2NvcGUgY2hhbmdlcwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5lbmRPZlNjb3BlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVuZE9mU2NvcGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcENvbnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0LnN0YXJ0TmV3U2NvcGUgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IGNvbnRleHQuc3RhcnROZXdTY29wZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnROZXdTY29wZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaENvbnRleHQodGVtcCwgTk9STUFMQ09OVEVYVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3bGluZXMgcmVxdWlyZSBhbiBpbmRlbnRhdGlvbiBmdW5jdGlvbiB3cmFwcGVkIGluIGEgY2xvc3VyZSBmb3IgcHJvcGVyIGNvbnRleHQuCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmluZGVudGF0aW9uID0gaW5kZW50UHl0aG9uKGNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIGN1cnJlbnQgY29sdW1uIGZvciBjZXJ0YWluIHNjb3Blcy4KICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICE9ICdcbicpIHsKICAgICAgICAgICAgICAgICAgICBjb2x1bW4gKz0gdG9rZW4udmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxhc3RUb2tlbiA9IHRva2VuOwogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgY29weTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgX2NvbnRleHQgPSBjb250ZXh0LCBfdG9rZW5TdGF0ZSA9IHRva2Vucy5zdGF0ZTsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZVB5dGhvbihzb3VyY2UsIF90b2tlblN0YXRlKTsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gX2NvbnRleHQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gaXRlcjsKICAgIH0KCiAgICByZXR1cm4ge21ha2U6IHBhcnNlUHl0aG9uLAogICAgICAgICAgICBlbGVjdHJpY0NoYXJzOiAiIiwKICAgICAgICAgICAgY29uZmlndXJlOiBjb25maWd1cmV9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDA5LCBUaW1vdGh5IEZhcnJlbGwNCkFsbCByaWdodHMgcmVzZXJ2ZWQuDQoNClRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgZm9yIHVzZSBpbiBjb25uZWN0aW9uIHdpdGggdGhlDQpDb2RlTWlycm9yIHN1aXRlIG9mIG1vZHVsZXMgYW5kIHV0aWxpdGllcywgaG9zdGVkIGFuZCBtYWludGFpbmVkDQphdCBodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yLy4NCg0KUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLA0Kd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZQ0KZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCg0KKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlDQogIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUNCiAgZm9sbG93aW5nIGRpc2NsYWltZXIuDQoNCiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlDQogIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcg0KICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0KDQpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQoiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MNCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFDQpDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsDQpJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLA0KQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOw0KTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUg0KQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUDQpMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTg0KQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFDQpQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/css/csscolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmVkaXRib3ggewogIG1hcmdpbjogLjRlbTsKICBwYWRkaW5nOiAwOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxMHB0OwogIGNvbG9yOiBibGFjazsKfQoKcHJlLmNvZGUsIC5lZGl0Ym94IHsKICBjb2xvcjogIzY2NjY2NjsKfQoKLmVkaXRib3ggcCB7CiAgbWFyZ2luOiAwOwp9CgpzcGFuLmNzcy1hdCB7CiAgY29sb3I6ICM3NzAwODg7Cn0KCnNwYW4uY3NzLXVuaXQgewogIGNvbG9yOiAjMjI4ODExOwp9CgpzcGFuLmNzcy12YWx1ZSB7CiAgY29sb3I6ICM3NzAwODg7Cn0KCnNwYW4uY3NzLWlkZW50aWZpZXIgewogIGNvbG9yOiBibGFjazsKfQoKc3Bhbi5jc3MtaW1wb3J0YW50IHsKICBjb2xvcjogIzAwMDBGRjsKfQoKc3Bhbi5jc3MtY29sb3Jjb2RlIHsKICBjb2xvcjogIzAwNDQ5OTsKfQoKc3Bhbi5jc3MtY29tbWVudCB7CiAgY29sb3I6ICNBQTc3MDA7Cn0KCnNwYW4uY3NzLXN0cmluZyB7CiAgY29sb3I6ICNBQTIyMjI7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/docs.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ym9keSB7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmc6IDNlbSA2ZW07CiAgY29sb3I6IGJsYWNrOwogIG1heC13aWR0aDogNTBlbTsKfQoKaDEgewogIGZvbnQtc2l6ZTogMjJwdDsKfQoKLnVuZGVybGluZSB7CiAgYm9yZGVyLWJvdHRvbTogM3B4IHNvbGlkICNDNDQ7Cn0KCmgyIHsKICBmb250LXNpemU6IDE0cHQ7Cn0KCnAucmVsIHsKICBwYWRkaW5nLWxlZnQ6IDJlbTsKICB0ZXh0LWluZGVudDogLTJlbTsKfQoKZGl2LmJvcmRlciB7CiAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgcGFkZGluZzogM3B4Owp9Cgpjb2RlIHsKICBmb250LWZhbWlseTogY291cmllciwgbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogOTAlOwogIGNvbG9yOiAjMTQ0Owp9CgpwcmUuY29kZSB7CiAgbWFyZ2luOiAxLjFlbSAxMnB4OwogIGJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7CiAgY29sb3I6IGJsYWNrOwogIHBhZGRpbmc6IC40ZW07CiAgZm9udC1mYW1pbHk6IGNvdXJpZXIsIG1vbm9zcGFjZTsKfQoKLndhcm4gewogIGNvbG9yOiAjQzAwOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/jscolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmVkaXRib3ggewogIG1hcmdpbjogLjRlbTsKICBwYWRkaW5nOiAwOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxMHB0OwogIGNvbG9yOiBibGFjazsKfQoKcHJlLmNvZGUsIC5lZGl0Ym94IHsKICBjb2xvcjogIzY2NjY2NjsKfQoKLmVkaXRib3ggcCB7CiAgbWFyZ2luOiAwOwp9CgpzcGFuLmpzLXB1bmN0dWF0aW9uIHsKICBjb2xvcjogIzY2NjY2NjsKfQoKc3Bhbi5qcy1vcGVyYXRvciB7CiAgY29sb3I6ICM2NjY2NjY7Cn0KCnNwYW4uanMta2V5d29yZCB7CiAgY29sb3I6ICM3NzAwODg7Cn0KCnNwYW4uanMtYXRvbSB7CiAgY29sb3I6ICMyMjg4MTE7Cn0KCnNwYW4uanMtdmFyaWFibGUgewogIGNvbG9yOiBibGFjazsKfQoKc3Bhbi5qcy12YXJpYWJsZWRlZiB7CiAgY29sb3I6ICMwMDAwRkY7Cn0KCnNwYW4uanMtbG9jYWx2YXJpYWJsZSB7CiAgY29sb3I6ICMwMDQ0OTk7Cn0KCnNwYW4uanMtcHJvcGVydHkgewogIGNvbG9yOiBibGFjazsKfQoKc3Bhbi5qcy1jb21tZW50IHsKICBjb2xvcjogI0FBNzcwMDsKfQoKc3Bhbi5qcy1zdHJpbmcgewogIGNvbG9yOiAjQUEyMjIyOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/people.jpg</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAD0AK8DASIAAhEBAxEB/8QAHAAAAAcBAQAAAAAAAAAAAAAAAAIEBQYHCAMB/8QARxAAAQMDAwEFBQUDCQcEAwAAAQIDBAAFEQYSITEHEyJBURQyYXGBFUKRobEWI8EIM1JicpKistEkNENTc4LhFzXC8VSDk//EABsBAAEFAQEAAAAAAAAAAAAAAAYBAgMEBQcA/8QAOBEAAQMCBAMGAwgCAgMAAAAAAQACAwQRBRIhMQZBURNhcYGhwRQikRUWMkJSsdHwB+EjQzNT8f/aAAwDAQACEQMRAD8A2A9K7jaXTgH4Ub2tjPvc+lM2r7g1Btbk57PcspUp3A5CQM8Vm1zW2rg4dt9lhOeOQB+lUK3EI6QgPF79Fs4Tgk2JhzoyAB1Wp3JcdKtyia8NxijqVD6Vl0az1XsBXfJfP9elFs1JqmW/uOoJ+1PhUO89f4VSGPQk2yn0/lazuDqpouZB6/wtLKu0JKiNyiR6CiLvcJP/ADP7hrLrV5urd4kzIlxksuSHCHHO88Sk58yevlTmvVV7bcU2m9SlpI+8rkfOkZj8RHzNKWTg6dp+WQH6/wC1pEXqBjO9X92iJvtvzhTpB/smszr1PqRKSpN7kH5KApN+1OplnH21LGT5OUv29B+k+n8r33Nqv1j1/hahXe7fkbXT9EmjC9QCnPen5bTWYJGqdRFrYLvK3jg+PPFFb1TqAnx3eZtPlvpDj8P6T6L33Nqv1j1/hagN7gBSBudO444bJxxnn8KKq/21PvKcH/Yay9+0+o0P5+2JWwE8BzqCMV6jUupFL3C8SgT6rzXvt+Dk0+i8ODao/nHr/C09+0VszjvVj/8AWaMnUFtV7rqifTYazAvVF/WnCrpI6YyFYNERqO/oQUovEwZ55dJpv3giv+Apw4Mqrf8AkHqtSIvkBSsBxWf7NdBd4ZGQtWPlWWBqXUqVf++zAR6OGui9U6iDYUi+T9+fJ0077fh/SfRJ9zKr/wBjfX+FqRF0jKJG5QI+FepucVStqVkn5VlqNqvUqR+8vc7zz+9NHOr9R4wi8zkceTxr32/B+kpDwbVj84WpROZPQq/CjplNqPRX5VlRWrdUHOL/AHBOfR08UdrVWqggrOop/p/PGk+8EPJpTvuXVH/sb6/wtTuy2mgCtKhnpgda6NvoWgKGRnPUelZZterdTuXWKld+nuDvkZSXSQeRWm7StbsBpwYVkE5PrnmtCirmVYJaLWWHiuDyYa5rXuBv0SLVTaHI6G3EJW2sLCkKTkKGPMVmrRxs67043dVstJLCxHLydzSXfulQ80jng1prUoPsydqNxwv9DWZG3F21T0+I1HfjSkFl5p1vI2lQO0+fVIORg1hcTMMjABvYoh4SBdHMwG17e6kK7MwTCZv7MF2JKkhtm52lxttKVYPhUkI2kE4PQEYPJ6Uig2OBCuvsU5qe06/c/YWe7kpGGyQCo5bO7G5PPGc+WKajc03Blm1OKjWm3JcU9+6bWtPebSApWSpR8hwTjOcUrvWpXpGo4VzHdS1QW20oKwoIccSMleAQfe5HToMjyoLbHODlB5HqPDuueYCKhDPfL1B7vDuueYBXW62G2pt9/cguzEu2eSlpRdWlQdSpZRwAkYII9Tn4V01vGt++yNW+A6zIk21hwFC0kL3bhhSQgFSyceLPPpSB7UzzrF2Z+zYKRdVhyQR3mQoHIKfHxhWVefJ9MAc3dSTHGoWY0P2iE220zJ7slxKW1bkjk7evmBnHGeac2KfMHHl39w97qRkNRmDna27+oHvdOty0xb41tuE9puYyLe60HGHprLji0LVt5CAe6V/aB+uKLqKxWS3Whu5xjOcYmNIMIqeTnvOd+8bOAOOh5/HCI6sfWLi05abYpu4rSuUna6N6kqKgcheRyc8HH50JmqpMq2ybe9boBYfUFhOHP3RCQlJR4/DgD+ByOKRsdUCM3XrysO/rfy08GtjqwW5uvXlYd/W/lp4KeylxxGuoKUOKSlxLqVgHAUO7UcH1GQD8wKSybZbP2bYvkb2wtpn+yPNOOJysbN+5JCfDkeRCsfGkOnbu9Y7oi4xmGHn20qCO+CiEkjBOEkc4JHPHPyrv9vH7F+yPsuB7L7V7VjLud/pnf02+H5fHmpZIpO3zt20H0vf9wppIpe37Rmxyj6Zr/uFINTWOP9v6hlzZcx+PbUMFe0oS66pxKQkZCcAfHb5UW3QLfAlaTuttXOQ9cZ2Fb3k4QhLgQpGAkE5CsZz0zxzwjZ1Gu6Xa4Srg7boSZcZKHm1surZkKSQEhQSSpJA+8n+j8c0a8aiitCwot7UWQq0lxzhDiWStSgpISCQshOAcnqeueaqhk9mxOvtr0tl26fiVMR1FmxOvtY9LZNun4l01Ja4EtWp7lHVJRJt8797vUkoc7x1SeABkYPxOae0tm4az0umRIlJefsbag+haSsL2OEqO9KgrIyPrnPFRF3Uz7jF2ZNugAXVYckEd5kKByCnx8YVlXnyfTAChvWEtu5wbi3bLcl+BH9mj8O4SjGBkFfJAKhn+sc54wrqacsy25EDbm0D97pX0s5ZltsCBtzaB+9/JJ02u3RNPwLncTKcVcHHEtJYWlIbSghJUcg7jk9OPnUpgW+HZdR6ns0Z2Z7G3ZXFO73AorO1J3YAA4CyBnPnzzimC13CI9aUMTJdsaQ1KWtmNIjvr7hJwctqTnIzkbVk+7znNdLpq0HU94uMKCw8zcGhHPtAXnutoSR4VDG7aD6jyxzSysmlcW68/DcW+gullZPK5zLHn4fiFvoLo8K0Wtq4aWuCGn3IlzkFC47y0qIUhwI5O3BSSQcY5GRkZyFVniwHu1R2DEblQkh+QhKmnGzsWnfkpBbwE4BATjjPXimBeopJhWqK3FiNfZTneRnEBe7dncc5UQcqAJ48uMDiu8fVcli+pvLVstqJSVOLyELwVue8o+PJOMjGcDJwM8058E7g7qQ4DXvNvSykfBO5rupDgNe82v5WRodss40ei9y0z1Oif7KtDTyAlQ2bsjKDt4+fTyzwouelolvuN+MmRIchWlLRKWyEuOl3GwZIIHXk4PTpTb9vH7F+yPsuB7L7V7VjLud/pnf02+H5fHml6NRrul3uEq4O26EmZGCHm3GXlsyFJKdoUEkqSQOik/wBH45pzm1DXF2ttfpcbeV/qnObUtcXC9te/S428sw8/oqh2m0Q7fZbvEMzvJ61kh9xJDYQ4EYACRk5I5z5dOeNG2PP2WyT1xWb7ndYctiyW2GWlCCFBSmUKQ2St1BwkL8WAB1PJrR1gIVa2yM43KHP9o0ZcKlxhfn3ud+lzb0sgfinP/wAZde/zb9L6ei5aiSVRRj0V+hrKn2g4Yb0NxO5KlZCs88f/AFWsLyncwR5bVE/SslPDuXV90oOJUVeXQZPWpcf0LD4q/wAGNa7tAe73XAdM0KW6af06jVNub1g8uPaZKVlGxKtrpBKfEpPKQFDHxqc3t3sd3pbOnJ0RlCu775SJUdRI9FDg8EdaowYPJLH2hcGg9Vq1nFNNTzmGNpfbp7dVXDqu5QXF+EJG7n0oraJaYcOVKbaaRNC1MJSslRSnbkkEDHvAdT0NT+Dp7shmy0SHb/cFwkncuM5PSUHHO1X3znHTPNC8R4vaHa2JVqSzZJNoedaiNPjKX2FYJDhT7isgHPPWrLMGsx7SQX8gCqMvFOaaN7WlsQNnEjrsFAAcrwEnNHqRPaB1gwwXmbQm4N596FJbd/LIV+VR+S2/FmOQpkZ+LKb99l9soWPoax5qSeHWRpCKKbEqWq0hkDvAqVWW3WdjRxvs9uNLcM3ue5dceQNoQVbAUD3z5E5SARk5yKb/ANmJ/eez99F9v7nvvYtyu927d3ptzjnGc/CvftO3/sN9i7pXtnt3tee6T3fu7Nu7dnpznHXjHnTl+1ED9oP2m7qV9p9zt7janue87vu927OcY527frWKe3aXFtzcn0tYdwOtyoD8Q1zy25uTa/dbKO4HW59U3s6ZfXAt8tV0tjLFw3d0pxaxhSTgpV4OMHPPTjr0y3adhs3K+QYL73ctSH0NqVznBOMDg8noOMZIzxS+8XOBJ0vZrbHVK9pgd73hW0lKFd4rccEKJ4Ix0568dKa7JKTAu8OapBWI0hDpSOp2qBx+VWGdqY3EnXW31NvSysx9q6N5J11tp3m3pZSexWO1jtFNif7q4Q1Leb95xKm9m4gEjb4htGcZTycfBlk2GW1AYmsPR5bT0j2YdwpRKXcZ2HIHPxGR8aebdfbFD1sNQJ+0lJU6+8tBZRnLmQEgb+g3KJVnngYHWk8S926DptmDFXLclx7qme0pxhKUK2jaEnCyRwM9Dzx8arB07XAi50bv11v4clVa6oa8EXOjd+vzX8OSQSdOy2Uy9kqI+/CSVSo7SlFbQBAJOUgHBODtJxTPUrvWpW5iprzVxvahKSsCG48Qy0VdeQvxJGThO0DpnjgxSrVM6Vzf+Qf3+/0q5TOlc28g/v8Af6UKFChVlWUVRwlXOPSuaSd4zXRYyMnoK5qzwcceVLa6eLWS62HFyinOMPIOf+4VrPTyVJtiQrr3jn+c1kqD/vrH/UT+ta4soIgoBIPjX/mNEnD2ufyXP+NRrCfH2RLwf3XzQv8Aymso2aA9eL7DtTCyhcp/uwsI3bBySrHngAmtYXVIUzz1CFkfhWXNF3SFYtYQLrNU4mMy6rvVp+4lSVJJPw8QJ+AqfFg0zxB+yqcNvkjpKl0f4gBb1T12vtOacmadtFpvdohsR4hbRCuLHed+Qr30qKVBJ+OU/OmrW7yZt0taWg8w+mEl+QlBSqM54W0lSfPJJA+hp27ZdV6VvV2jR4uq4UCTbHT3pXAEttwKSD6Hgeo9ajV7uES56kjS4LrEiMzb0NLfZbUlC1KUg4AOMABOQMedaFTlNM7NsAh/DnO+PiLL3JCSBsBwAJSOR5UeM0thxclqW/FfSnCVtOKQVDzBKTz8q9c5eO0jrXJ5xSjtJ4FAschbq02IXZJYmStLHAEJdE1JqeIlSI97WoH3Q+yhWPqAFH8aVXC+XjU3Z2Jt7jsmXCuyG2JKeu0laVtg9SMAKwf4UzEh1IwnCkDp8PWvC/c0WpiyKnBVrZlKmJY7tOe8Vv53gZI/eK4Pw9K1afE39m9kziQQbeKHazAYe2hmpGBrmuBNtNEWhQouFZHPFZCJlIYel3ZVgcvabrbkQ2lBDyld9ltR2+EgNnJ8Q6ZHxrhc9OzYVrbuqHo0yCtW3v4yypKT6EEAj6ipPptMdXZDeUynXWmfbk7lNNhahyzjCSpIPPxFN7V1gP2OPo+zIkhE6Wjv5MoJB3FSRwkE4HCfPy+NZbaiYvdbUB1jppawN79f7ZZLamcvdbUNdY6aZbA3v1/tlD9wzjkfE9K9qxJWnLDE1GuzymYTEFLWFTXbkhMhKyjduKCvGMnGNnx6U0WqwQGdPXq+SymemA/7Oy2hwhtw7kjeSk5I8QIwfWpm18Tm3F9bW777f0qduIwuaHAHW1ttb7f0qJpxnxZx8K8qVP2iBP0K9qKLGEJ+LI7l1pC1KbWDt5G4kg+MefkaX6shWK02OxT2LIwp+fH71xCn3u7HhQTgb89Vcc/PNO+NYXBoBuSRy3Av16J3x7C4MDTckjluBfr0UQtMJVxuUeA280yuQsNoU5nbuPABwCeTgdPOul/tciy3Z+2SltLeZ27lNklJykKGMgHofSpZMskK26k0ncIAW2xcnWHgypW7uzuQSAeuPEOvoaXXKxMag7XLjDlOKSw20h1YScFQDbYwD8yKg+Pbnzfkyk99wbKv9otz5/yZSe+4ICrZXTFOytNTv2UGo/aIvsgXs7vervM7tvTGPj16U+O2e0S7Hc3nU262S4ye8ipj3JDxeSASUkb1c8DkYznpSRuao9lvsJQ9u+0857pWzZsz72Nud3lnNSuqHPAMf6gD4Kc1bngdlp8wB8O62ij8EZmsD1cT+ta4sgSm3gI6BavPP3jWSrSkLusRCuin0A/3hWtrNkQikpxhxY/xGjPh4H5z4IP41cM0I8fZEupG1OR/w1856cCsiqK1rUoqA+nFa6ueMDcMju1/wrJKikOkpUCM9RTeITbIncFC5l8vdR2LZWrZC1bc2oja22beJDK1EEtrU6lBxk9PF/8AVS7T4TK7N2nUIAIc79ZJAyMAZz58EDHwqB6j1fKtk28WdMVpxifb/ZlleQRlQUFpweoKRSuDfp180hB0XYYpMlTZakPO7QkNg+XoPzrWo43T0WSXciyG8TnbSYqZoBo11+nipIycKPBGRXJR5yBmmrT7Mu3SJ9pfkplJgPBlDmCM+EE9eeCeM07g5IAHJ9BQZPAaeQxHkur4fVNraZlQBYOF0VC1IJUBg4NAkHlIwMdK4PTIzboaXJaStRwElYyfpXdstqZICVd4lXiO4EY8uPWoi0jkpzJGXaHVChRkIKs48hmjym+7cKc8A9PSkTr62T1D1Q7GsDljTarcuG6oLeSrvsuKG3xEhwYPhHTA+FMLa1NuJcQopWkgpUDggjzryhUbImMvlG+6jZCyO+Ub7qQO6rmvTm7i9Ct7txbACZam1b8gcKwFbCR6lNJLdf7hDRMaJbksTTmSy+CpLhznJwQQfiCKaqFMFNEBbLomCmiAy5dP428E6z77Kk2tFraaYhwUr7zuGArCleqiolR+pqW60uURvTOnY6BabkY0cNyGjICy2sIQB/NrCscK6HHTPlVe0KjfSMc5pGliT43UT6NjnMcNMpJ8bi26epGpbhIvUO6SG47ioW32djaUtN7fdwEkHg4PXyGcjijydVXN3Un7QMpYizSkJX3QVtXgY5CifLA+g8+aYVEBJ458q9eWyUrVylZV4U7cJ21KKWLSzRtby6KX4WEW+Xlby6J5dvzpjy2osKFA9rSUyFx0q3LT1KfEo7QT5DFczqa4/swNOfufYyvcTs8fvbsZz0zz0zTSC0YxSFL7zIx4Rt+PPX0rmEgrGSd3w86d8NFYXHf58intpoju3Y38+qX2j/3aHn/no/zCtcQvC0pISffUevqayPZ8fa8PPT2hH+YVrmBwyQMnxq5Pzor4d2f5ID42/HF4H2XG5jwdf+Ev69KyApSd5yNvPStf3MgJBIzhtf6Csf7dylZI6mmcRD8HmpOCTczeXuq37TEJY1Bv4UHI6SAeqcEilWgry1Zb3MuCN6kogvKGOmRyB+IFJO04hWokpCyrawkc+XJP8ajLTziQsE+8naflWzhmlMw9yFsescQmHK6svQ0l962TbhNUpJflOOlajweBuP60gu98l3m8MWK1pdjh11CC8TtJCsDn0HPnS6JdIVo7L7O2l9pq4vuuqQD4sJKjkqx0GAMUp7DxJvWt4sNaYjUJ1SkSe7KUuykkng5yojnJ8gB8qrNwsfGPlkFxuFoS8QP+y46aA5SNCoo1py6B+aW7ZPeEEKXKXswG0pPKgvkfjXsSUtMJp+JKmMyinckEEh4ZAwD5knPGD7prTfa5f9M2DTLdgdgpaipWloJVG/2VI64UkAbxnkgAj1INVK3dNF27UzF8m3dq5ynFhuM3CjBliMB4QdileEgdCceZrSETHg3CHfiJYXfKdVw0zLXMsXtzpHtKVltxvBCkcdVZ+NOcte6TvJJ3oCqsWLCsV30zOu1qyEz4x9occCTucaSDvBSSP6PIJqt3VBSWSfNsfqaDsWpWQTXZsV1PhjEH1tKe1N3NNvdeUKFCspEiFA9eOlCvD06Zry8vaFeqxk7QQPLNFJwM15eQUSBkHBFSbs3isSpd2nzihxmFCCQ2obipSyQD8MbVfiKi6yCkgGrH0NbWonZhLujqwF3KSQCkY3NoVtQM/MLP1rWwenEs9zyQ7xTWmkoTY2JP/wBVbqKGysnOxKsDPn6VYGmtMw7FaV6h1aG2chPcx3leFpKiEhawOhyoYHl+kS0Tf2tNakkxVWWPcFOzg3GkPAqdZO8A4JyANpPQA5qQ64vQasq3rmoy413Q9bpZJ39ysM72ClPllY5+QxitmnwgQOMkmpQpifE0tW1tPDdoNvEps1H7CjXqWLa0huM3KbQEo6EhYya1TEG1ojJPiNY4sjjyrhbXJHLpca7z+1kVsSE4FtLIB4WRXsGLXPlLdrp/FMbo46Zrjc5db9dFzuWO6Of+WusfHhxSR0ya2BdMBo/2F4/CsglGXTng5NVOIdcnmr/BI1l8vdVd2jKJ1KvJ6NN/LB4qPymTHcSkqSslO7jy56VKe0uG41e48vG5t9KUj5pPI/Oo7cT3j4Kk7Vbc4HzrZw1wdSsI6IUx1pbiEwd1/dJCtagkEkgDABPTp/4q/wD+SXabe+5KvBbQ7ObmNxjvcUO7aUMg7R1yoDrxxVDQ3UNupK0hQByc/T/SrV0dqGVonUkTV8CM25bpMdDcyNnaNpwM/MEZB/1qeadrHNYfzbKrBSOmifI38tr+HVaG13onR13uv2pebY9NmrTkAKccIbQOQE5wPj6/OqCuQYvt/wBTW6LaXY6pcxuTDY9m2raCBt2Og/zeR6+dalvMBq/WRxhE1+KZCE4kR17XEZIOM+h8x51R+oLOoanlWqVEkRwyjiamG2wp8AjH7wLKlZ+X4U+EZjlKrz6fMpN2aKtCNCyIDFrTAAkKRJadBGwFGHFcccpH6VW76QQ13fujISfhnipffrw7bLK7bIoSDOTh5ZO47UnGB9RioWlZCNo4HWhfHpmOmEY/KukcGU0rKUzv0D9h4X1XuSFYNGrl5811rARk4IUKFCvJqFFUfu48jRq5OImTZkW02mKZdxlna2hPISPNavRI9amgidK8NaFBU1EdNGZJDYBce+K5zFtjp7+fKOyOwk+Jaj0+nnn0Bqfa4vDPZ9pGy6QkH7QmbFynSlWAhZUSE48kkqVg/wBWmftIFv7KU6dlWhxq4XmK689JDwyt3e2UBxWAdrYUeB8fnVeWRq53efIvN9lOvzJRLjpdzlKfr09AKMqDD2UjS7c81y7GcYfikoZl+UGwHjopjadPl0/aF3kBYdX3wQ2spAJOc5/DpXe+PwU2aPZIkdgx25HfrJbBJUEgA7upPX8ab5ElyVnJKG0ABtvOQkY6VxSAlYJJx6ZrMxDGu0uyEWHVEeDcKdjIJ6l1yNm8vNKbMgOXSKTnwvNngf1hWv7cnDLmcfzqv1rJNhQTeWC2tSU94gkA8KG9JwfxrW8EAB4D/mZ/wipOH9GvVPjU3li8D7JPdnEo27jjKVgfhWRSdyzg4561rPUCkpLW4ZG1zHz21khKyFk48+lRcQ/kU/BP/YfD3UL7TnE+02xg+JQcKvmMgfwqMavS23PbQ2hCB3KcgHzGc09dpIc+24bqz4O6wkgcjB5+vSmLULivakEEEbTyoDOd6h/CtbCxalYAhjiNxdiMl+Vv2TPtz6VYGiYUnWDjdiamoZTGYQtEQjK5e1QKwk9AQnJANQMrSQSrGfWnqxT5Vg1FDucJa0PxFIeHl5cj5HJH1q6+JryC4bbLJiqJI2ua02zaFah7TIt/dgwtZ9mdwkCVGCYsyC14u8A4G5s5G5HQ5HQg1T69T3idqm5yNQS7jGuTEdSpTaorbRQE7QEBXUbiUgYHn1q29CzpN/t7uptHS2rddkrIuEOWP9lmddu4DlKsffT9c1W+v+/l9qzH2nbFWx+4OMuTlrcSphQaHRtY4Ujwg5ODnAOMUsd8yhlN2pfPchsQrJZ3pbbd2TB7xyOsEKdK1rWSkn3iOQR14pF4cZHNN0qEnW/agh21rWqLDj92uWhJ2JWkLKVZ6EbinjzxTDqHUGotOXV61XaFEXJQQrvEIUkKSckFPOMH5Vh4nhEk0pli57o04c4qipqdtPU302I6KXp65rok5+dMNi1FGucUuPbYzqQCtClAcH7wJ8qc2ZkR5pTrUllbaDhSkrBA+ZoclppGGzgugQV0FQwPY8EFKt2CQeflRnihC9oVu4H44pjumoLbCYDxkoeGcBDKwpRNRe/6xVMhqjwm3GAr31qxux8MVYp8Nmn2bYKhXY7RUTSXvueg5qfxvbZ9zatNnjGbdH890wn7gBwVrPkkfGpxeLvpzsYsbjClNXTV05oqWrAKueQFH7rYPQDk4rPum9a6h06EmyzjEeLoccdCQpbuOiVKOcp/q9D55rpGRdtY6jlXK5SVyFqIfmPqHOM4ASB5nolIx5UVUeHtpW2bqeq5vi2NyYjJcizeQ/lIJsi86gvRlS3pMudMOcqJUpeT0Hw/0qSQdO6vjuNKmMSY8RDqS4HnQAcHOACeanuldMtWIuXy8d2JxThttr3WE44QnPn8f/NGuU6Rc17lZSlsZQjPT/zUeIV8dOwsvdx5Kxw/gstbMJjowHU+HJNwSkEnGMjyoAZr3rg5JzRsBPnQXuuuW1S/T2PtuID/AE0jj+0DWuLerIeOD/OfwFZCtfgvEIAEOd+kH+8K1zaOW3/+sf0FE3D+rXjwXOuNhaSK3Q+yR6lGEMn4LH+E/wClZLCOevnWtNTZU2zgdCvP9w1koJ5yrPB6VHj5sWX71LwYbCXy91D+0+OgwIsk53NvbPoR/wCKiup2GWVR1NJUAtKiCrz8ajU07Ro7rtgUpKSpKHApWPujBH8aadXWxb1qs89CCGX2nA4ojhCknn9avYLJmpgOhWJxYy2Ik2tcBQttsuJO0c9BmltxVtua0o6JCUk/IDP51zcQUlKm8pSkjaT5/GivsubtxJUVc59a2ENAWUwserrtb7Qu1217uEuq3rUgeJRxjA9KeHYU11mLA1HJeetdxKFRZnJVGfPTOemRkYquEv7AkpQUlJ6/EVZelrqdVaKuVikHE1hje0T94J5BHxyB+NSxWOirzXDdE63K16glOuWbTbn2HZYayxyVIVIcABK+OTnOMk1DtaNSJ2noS50SY1NtCTAeeUO8bf8AGVAlYOQrC/PqB1qyNFXRV505EmLVvdSnu3DjopPUfp+NOdwtzFxtsuE+gKRKb2r9cjofpgfhU/Ytc26rNncx1iFnaU+2tphDUVLK2wd7m9Siv8TgD5V7GbkSHURIyVqceUEBCc+Ik+lOtmsUi46gdsqmiJDbb6fgFIBI/MY+tSCPaE6W0p9tyw4LxO/cQW+P3IPClYHJOOPrVQRA6ELQMpaNCVDmLVJkXgWqOEPye9LWG+RkdTn0Hma4XBhEac9HZfTJQ2opDqUkJXjqRnyzViWvTcjTnZ9c73MR3E+Qx3SCoZLaVnGPgpWfyHxpl7OdHS9Q3FuRJZULa2crUrPjx90fxpxYAbJgkJBPJRSLFfky2orDZW+6oIQgdVE9BWh9F6Sh6asLTUoocmFwPvuHhIUBgfRIJx8Tmu1s0barffF3liKEPLSlCOmxsBOCQP1NItS3EyXRGju7mUe8oH3z/pVWvnbSR5ideS1MGoJMUqRE0WbuT0Se83L7QkfuwUspJ2A9VfE0jYUpD6VISVKB4A865JGK9yQ14ffzkUBSyulcXO3K7PT0sVLEIoxYBdXo7rC1pU2pIScc1wPvDOQAec0ollzv1hLiykY6mi5WdpJBI9RUV1P+Vd4Km1XyM8nke1IUB6+MGtc2tISh8Dp3p/yprI9qSkXKIAlP+8Nc454VWuoZKQ6APvjP90UT8P6h9u5c841/HF4H2SW/kFpHHTd/kNZIPiWQOMHmta6lKG4YJJ53D/Cay23AckPn2dvvCtRASDyfl61FxALlnmn8HSNaJST0902vQvbWXIhPhdQUH05HU/KpH2a2ODrPS8/RU4tARGkvwJH/ABEuhIQpfxBwjim25sOQZHsxwFbQo4+NeaZuD2k9f2W7tkJhzHvZ5AUcJDbm1Jz8ikGo8BlyudGpeL4GyRR1A5G3kq31FpiXZbpNtVxaIfiOltw48J5wCPgeoppkx21T2o7PiwjJyeB0rd8u2W6U8XpUCI+4Ud2VraSoqTnODnqM881nDtp7Mbn+3Mp/SFnUuK7DEp1tkABCt21QSPPPBx86Jg++65+5tjoqQLCXIdzWSAph1soAHGCVA/wo+l7suy3uNPRkJQcOD1Qeop30pAdkjUcMIUt1m2vOrG3kFGM/hn8qiIG1IKTxnH1qVrrWIUDm6aq6+z0NQpN6gtOBTaZgeQP6i0JINSwrPeYSSkKP4VU3ZrdHF6giMuHl+GqOSTjcUHKSfjg4+gqzlrWADnk1oROBbcLPlb82qTWvT6Y3aa3fWUqDMqM73oI4S4NoyPmP40+OaWbm6j+2J6++VG4iND3Gh6gevxrtZ5O1te8btg3dPhz+lIZOrnFZESK0hBHCnMrPzx0/Ksytro6W2c7rawzCarEiRA29tzfZLdR6cYv6IzE54ot0VfeOMpICXFj3dyvQen51ykXe0WyOWYTSZDjY2oSkbWk/XqfypgnXadNQUPzHljPKQrCfwFIaG6zH3uNoRbvKO8M4Kijs6sOYjkNv9pXdbzcbgr/aZCtgGAhI2pA9BikCQTn8qOODkE/jXtYMk75Dd5uUbQwRQNyxNDR3Iu0cUZGEqCsZwc0KFQ3UqO4UqUtfQqOcfjmiUKFeXkqs6FOXeIhHXvkH5c1riGtOHf7Q/QCsm2khE+GNwRueRzjn3hWr7fhYUTzhWM/QGinh/RjyO5c+40IMkfcD7Ju1ipSYCB13OKA/uKrLUWS/GklxhwoGcn485rU+sEFcNjHk6T/gVWUW3CB0GKi4gJBZZScFtBbLfu90pny35bvfSFlXOE5GAkdcU2doNxkRNDsPMJQosvd2FKSCQDuP6gU7Qtjm87ApQHGfL40j1JC9v0Vco4bLi0oWpIH9JJQQfzrJw6Ux1DXIjxqlbPRPjaNlpPQs1V10fZrg8sLXJgsuLV18RQM/nTsppPebsJJBHOOSKrH+TDcXpfZXDhSVI9ptzi2FpC9xSkncjOOh2mrQ4HXJJ/KjR2jjZcoFrBZm7KdOtvau7T1tNkiPHmQmVdBucUvj54QPxqh4UFb9puElIwmIhLqyPPLiEAfma3FoXS0ax268uYK3bxPfmP8Ax3KO0D5JI/E1jdLDrGltSbElDbkyKyB81Oqx/h/Spm7lVnNNrleaFaMjWFmioAQG3t5UB1G3Jq5nEpUvanOM45qoNHvC39ocYKSAS6WMHyy3j9cVcG4tuBSDg+Rq9AdLLNqdHhSZhuEhgtMNu7tgTuUMbiRUAWhtJUFFQUjO5J81DyqVWqSoMukqKlo8WSc54NQ0rU4AtZypRKlfEmhbiUgFnXX2XRf8fZnGYcvl910TjaMDFe15nDe7HGcUEkkdKEzuukW5r2hQoUiRCjpACCVA88A0Shk4xk4pQbJCujrqlp2/dByPWghQJAKQCT1xXOhXrk7r1kthgG8xfEDiSjryPeFassW4sKKjnx/ltFZMt4xcYpBx+/R/mFaw06sLjOEeTmPwAoo4fPyPt1C59xmLOiHcfZF1WtDcBKl8DeR/gVWTdyQ1swOvWtV62O6zpwf+KP0NZVcZ2nepeVjqPX1+tR8Qi2RT8EOsJR4e6PHdSg5T6YNO1tdYTZZ5kr2NpQVKUTzjaT/8RTIFeqab7/LUppMJK9mUlwkdDgFI48+orFoI+1naxE+OT/DUb5VPf5H8KQw1qOR3hEN9bJbR5bgV5/7gMcehq/1JCutRvstssaw6FtUCNGSwTGQ48PNTigFKJPrk1JsUbOIvYLkLbnU81yVwknaVYGdoPJ+A+NZc7QLND/8AS2HIZCIjlw1Cp9SO72lxLSFoyfTzrU/AOSKz9/KFtS2LbpXTsFZS8p2Q5gqJyVqSk/m6akh3AUcoFrlZ8QHkT7Vc1fzj1xWrPxC04/WrzfA75QR0BIFU3gRtOaceeHiFxUpWPPChn9KszUU82+6Wx0uLDD8lTLqc/wBJPB+hFakRygnwWLUXc4DxUm0+gKLqDwTwPrUSKCh5baxhaCQoehBxUvsqVBTqsHhQ58hzUZuiSi6ywoYJfWefIZzQvxOy7GP8V0L/AB5L88zOoHof9rhQoUKDl05ChQoV5eQoU92axfaNinT0vbHI7yG0pI4O5Kic/QUwNOtPth6M8iQyfdcR0UPhn48VM6nkawSEaHZVYq2CWZ0DXfM3cLpR2WH3yQww46UgqVsTnaB1JPQAepp8tulZUtmQZcyPbXW46nwy+oJdKB97B90ZxyrA5psuUO9GKWFx3o1pIRvbjOFxt8gAb3HB72eu3hPwqeOkdlzyaD1VeTEWuf2cFnHrewHn7BKLRCiOx2pT1ya75MppCmmUFYSVHIBV0zxzjODWntKf7k8OeHj1+QrMVhjuuQVlhClkXKKEpQnOOF5xitRafASw9xgFzP8AhFEeDsAa7KLDRBHFrnZow52Yi/skOvsJsIIzkOjGPkazFc2nG3vGpPPv+qT6fOtNdoqj+z2U9Q+j+NZjLi32thwAD4/RWOlVeIdcnmrfBd7yeSTHHln5GozMf7ztFtEFHJcCEhJ6FReH+lSRxIOCOmKi1kSzM7dbFHkbVNmUw2UkcHJzg/iKoYE29VfoCtfjCXLhtuZcFtZkbUhOAMJAwPLijg4oYIWrOPoK8opO65sgrkGqw7Q7S7du1PSyQEFlmLJeWCeTsKSBj03FHNWWpSQeVCm+VAYVeEXbq+iKqMjzwCsKJ/FIpzSQdEyRuZtisUahiLToG3ykkYiTnFH4hSiB+dP/AGry9mn7e+0oFS5CSF/9meK7XlmMvQkxhx1r3nTsKwDw6T09abNbOx5mgbU9vQlS+52pz08JBrXcPlJB5LCBJe3Tn6K1tJz2pdmZKgAHUIcSr5gE0g1pD7uSxNTyl5PdrPQ70/D5EUz9lLiX9HR0g7u63NcfA8VK7k8yqwzG5YIabSHdxGdoT1/LNZuLU3xNKQNxqFucN15oMSY47E2PmocFDO09fSvcjz4rs3Ek3dRd05DcnNZ/nSQ0yM+iz1x6YzTZLTa4DvcX6/rflg4Vb7MkrI+BVjP4baDocHqZRmIyjvXU6vimgg+VpL3dG6pakJcUG0SY4eV7jKnAlxfH3Qev0robZdXLHMuH2c/HQylJQZCdu8lWD4fexjnJxSK2O3J2YmNpPTMW3qdOEvzEl+Uo+uM8fUkVKLpYZUG2ORdYSkXJ9xYUr7RfTHjMqHkkJw44f6qePia1oMPoGak5iN+iHa3G8YlBDGiMHa/4rev7J40U1Cj6KueL/EmI9uaDkgAJbQQhQwnBJV8hk1E9PSdPWvS8VNluxjLJU0J9xj7SohXVvG4N5O4eIbuPKpXZpkV2wTe6jP3UNrbQ24EojMxxhXhR4QQk/wBVsfM9aZdU3m4WLsq0wqB7BAS9cRHRB9nRI9nGXDkrd3Er88gDgitCaJskALNGjzWBTVctPWu7U5nusDra9yN9NQnDS2nbk41c7glxh2O9DdSuWqR4VLOCMrUc5PrTVGXAtJ7xWoHXXk8Fq0J7459C5kIH4mmic4u4O7p8mROWkk7n3VOAc+QJIT9AKMg5UlCeSRhKB1PoBQu+aO4DATbqulR4fUkHO4NB5NHTvOnopDD1tcvaY8WJa4bLTryUOPSSHX3BnGVbQlOcE+taVsC9zDqcDhzbwf6qazDGsqIT8aRepBiqW4lTUZACnlcjBIHuDPrzWltJulyJIUfJ/wD+IrewmV7w4OFtkFcT00EJZ2JJve5+myS6/SRYHM+6HkEk/OswqWltIbAUMnJH6VqDXqwuxLbKCQXEAn/urONyhrbXlLCjuGQcZ6np+FV8dhe9rXtF7KXhKriic9j3WLrel0jmKadYQlI5IB6Y2nzHxqJdj8RF4/lFQCv3GJi3iNwH82klI5+ITUsfhvIaS45lsKHh3JPJ9OPOq70sTP7brW00paUi9NBICjnh0Z/Sq+BxPjqHh4sbK9xdPFLRxmJ2YZj6BbnPXzpFeXp0e3uO22GiZKSMtsre7oKPpuwcUuc4WaIryreO6CBss2dr+re2VKA4qyzNO2+OFFbkF3vARkcrcBPA58hVLTda6ukqKX9T3dzBPWYv1+day/lJXAW3siu+xzu1ye7jp2kjO5fP5A1izaWVlC0bSPI+VWGkEbKvK4tdZGkPF1DZWpRWCStSjkrUeck0nUSo55GPKnt+1qhacTc31FDktW1hBHVA6n8f0pk6mnuaRuoQU/WPVN+tDfdQ7pIaQkk90TlJ+GDVlaO7THHDi/WhQSjAW6wgjcD1O08fnQ7KIVndtSLgxCbXJWCHHHAFKSv05HT/AFqwZ0Fq5WiTDXGbcWUhxtO0A7k8jH51LLnhjc+97BQQ5J5mxnS5tdQZSZk9K3595nTGXcKbZXhtoo+6ChPB4x1pY5crK0pxqTFTA3qSe97pSEFOB0Vj/WiOOqWtS1JJJ8umK7N61mQx7JN01JfipASFsPJcyAMZKTigykc2vkeKmSw5arq+IxHCKeN9FAHHmR4b/VSO1OOROzPWMm0zkoUIQUzIaUkKSonBwtOfT/xTJbLY1JZakPpS248hKlSUqCVOKKRknqFflTNqC76Iuenrg5bX0Qrq42UJQpK4y9wPQ4wkjr1NPjdnuK3vtCwX+JNQDw0/hYAxwneg9B0HH41tnDXtibHEQ4DyQizHmPqZJpwWuI33sVIdOsiHp64xil5aVyWVJUEEJSAFdT05z5GorqFSrb2S9nrRYZEpyetmSHG0lSkpKyArPPpz1pdYb9dLQy7ab3CkNGUveytkJfQruwVK93C8geWK66anWW5o0zZN6S66ZHesyu7LjJS6NhVwFAnco+uKtwx5aYRgZd1n1tW2XEDMXdoNNdr7IyLLHumkZSnA3b2nso9ocBOzke71UrnyA4zUh09apFkjxTaYiBHZYUl2ZMQEvOK2KwfFwlJOMbSfiaZblqK5XrSk1t+/vxkp7xoPQnV4CQrAUB1HxBximy2R5DNpZjLuC5oCAUyA6Fd5wOTk81SrouxgZ8tz1AWtg1UayslGfKDqA4kjwTm1Agybi0/cnItvkl0Ky1LDveKz5pySCf7VX7oPd9mvdVAyFc/QYrNEBlkXNjdhKw8jOxI5O4dQDitJ9njp+ypAKTkSD+gqPC7HNbuVriZpHZNPQ+HLZedo7y06ZfW5+7QFt+L/ALhVe6Sg2e+6QlXhLinw0pwIUFEDhI8qsfXsWXcdOOxozPfuKWghCOuAeagGg9J3fTmlnbGzDkOMPuLdUXQQpJUAMcfKtg3tohNwzEKDYZksJS6AQpYOQSCOKrHsSgtS/wCUBEQ0D3TU998HrgI3qA/ECr9/YSXHSN7EpSWzzsQcn8qYdA9mKtIawXqWK3cpT6g6A25FUEgrPJ4HoSPrSuYC7PbVV4hI0dmT8o28VejygkDJrmFbqj71yvDiQfsiRj/or/0oqbreUowLPI//AIOf6VD2ZV4PFlVn8rB5+bE0/p6EFPvyZKnjHB4XgBKc/VeKzjNtDkrVz9nYWqQ6ZKmlrHmQcKI+Fa3u2n5F01lD1PLt89UmG2ENMGMooBBUd3u9cnP0FQW0djiLRenbrGF5kPLUo5XHIGScnoKnjZa11UlubkKlu1p1tOoGbTHUO5gMpZSPIEdfr5/WoWsjvVeQx51o+/8AYam53aVcHF3sKkLK8CL0JxjyorH8n6P36FvKvDiB1SY2Mj6Cnvu43TGss2yrXsQu6Yd+Xb33QGpQ8AWeN4GRj4mr2iOIYnMPY3I3eKog32CJiz2pbDt93NO94jbF93B46irEj6Wuq43cC13AjqFKaKT+lP3bYqN8Rz5mqC3SyOJ1C9HZZcUyolaDjgg89elIlWG6qJT7OlPP3nEj+NWZcdNageCEItk1koRgrDfebqbk6C1XKadCLjc4oI//AA2kkfLKSawvsGmJJcSi9nF+INYI2BoAFuaj9403Zbb2F6gkKtMBF0MV9xchLaSv30/e+tcdB9ndgf09PfuEJPtTcNt1p5hSmltnaTnKTz9amh0deHtFTdKzk3WUJLDjTktbY7whSgrIxxxjFItMdn1+04ZZYu19l+1IS2sSY3e4Sn08h9K0WQNbl7tlhzVUshcTb5t9P26KEWLSeof2cF3c1E+J8Ve1LM1pEhtO4lPB4UAUgdD50zwrvebqLWzO0mzdzcY6n2kwiVLQlLpbKilWdvKT51ddt0zckW6RbTGnLDqkLKywU42/Pim3RvZ5O05OivxzcHDHhmIkOMDGwvl4+XXKttWjcbLOZDfdUohmyjSTbEm63S0x5SXW3CWstL8ZznhQBBwCcg0vsrMkQO4t7kK5xmEoabcYcCF4CE4IySM9QRx0q0B2RuI0rJsPfXAsvl1ZWGBlHeKCjjHXBFNbnYRb2rchtt26tyEJCA+xHwvI+9xjJqCoYJAGubmV6gc+me57JMh5X1uoE9cZMfVbTMuO81ESiKkB5oZDp9/xDPn0PnWpOz1LibQ9lBwp8kZ8uAKpy0dmt4t7qdk3VEkAoJ7+KhW7b5ZIJH4+dXZomJNYtG2XFUysuqIS4MKx5ZpGwCNxPX0T5KqSeNrHgaX18VIwhKTkCvT79ChT1CvFe+KMOTzQoUvJLyXvShgHrQoUiRFVQCQBwKFClOyaN14oZIzRhQoV7kvHdDNDNChTU9DNAUKFKF5e15QoV4pEM17QoV4JSiq4rzqTQoUwk3TSgCdwFHoUKelGwX//2Q==]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/sparqlcolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmVkaXRib3ggewogIG1hcmdpbjogLjRlbTsKICBwYWRkaW5nOiAwOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxMHB0OwogIGNvbG9yOiBibGFjazsKfQoKLmVkaXRib3ggcCB7CiAgbWFyZ2luOiAwOwp9CgpzcGFuLnNwLWtleXdvcmQgewogIGNvbG9yOiAjNzA4Owp9CgpzcGFuLnNwLXByZWZpeGVkIHsKICBjb2xvcjogIzVkMTsKfQoKc3Bhbi5zcC12YXIgewogIGNvbG9yOiAjMDBjOwp9CgpzcGFuLnNwLWNvbW1lbnQgewogIGNvbG9yOiAjYTcwOwp9CgpzcGFuLnNwLWxpdGVyYWwgewogIGNvbG9yOiAjYTIyOwp9CgpzcGFuLnNwLXVyaSB7CiAgY29sb3I6ICMyOTI7Cn0KCnNwYW4uc3Atb3BlcmF0b3IgewogIGNvbG9yOiAjMDg4Owp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/xmlcolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmVkaXRib3ggewogIG1hcmdpbjogLjRlbTsKICBwYWRkaW5nOiAwOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxMHB0OwogIGNvbG9yOiBibGFjazsKfQoKLmVkaXRib3ggcCB7CiAgbWFyZ2luOiAwOwp9CgpzcGFuLnhtbC10YWduYW1lIHsKICBjb2xvcjogI0EwQjsKfQoKc3Bhbi54bWwtYXR0cmlidXRlIHsKICBjb2xvcjogIzI4MTsKfQoKc3Bhbi54bWwtcHVuY3R1YXRpb24gewogIGNvbG9yOiBibGFjazsKfQoKc3Bhbi54bWwtYXR0bmFtZSB7CiAgY29sb3I6ICMwMEY7Cn0KCnNwYW4ueG1sLWNvbW1lbnQgewogIGNvbG9yOiAjQTcwOwp9CgpzcGFuLnhtbC1jZGF0YSB7CiAgY29sb3I6ICM0OEE7Cn0KCnNwYW4ueG1sLXByb2Nlc3NpbmcgewogIGNvbG9yOiAjOTk5Owp9CgpzcGFuLnhtbC1lbnRpdHkgewogIGNvbG9yOiAjQTIyOwp9CgpzcGFuLnhtbC1lcnJvciB7CiAgY29sb3I6ICNGMDA7Cn0KCnNwYW4ueG1sLXRleHQgewogIGNvbG9yOiBibGFjazsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/csstest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogQ1NTIGRlbW9uc3RyYXRpb248L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2RvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+Cgo8cD5EZW1vbnN0cmF0aW9uIG9mIDxhIGhyZWY9ImluZGV4Lmh0bWwiPkNvZGVNaXJyb3I8L2E+J3MgQ1NTCmhpZ2hsaWdodGVyLjwvcD4KCjxkaXYgY2xhc3M9ImJvcmRlciI+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgY29scz0iMTIwIiByb3dzPSIzMCI+Ci8qIFNvbWUgZXhhbXBsZSBDU1MgKi8KCkBpbXBvcnQgdXJsKCJzb21ldGhpbmcuY3NzIik7Cgpib2R5IHsKICBtYXJnaW46IDA7CiAgcGFkZGluZzogM2VtIDZlbTsKICBmb250LWZhbWlseTogdGFob21hLCBhcmlhbCwgc2Fucy1zZXJpZjsKICBjb2xvcjogIzAwMDsKfQoKI25hdmlnYXRpb24gYSB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7Cn0KCmgxIHsKICBmb250LXNpemU6IDIuNWVtOwp9CgpoMiB7CiAgZm9udC1zaXplOiAxLjdlbTsKfQoKaDE6YmVmb3JlLCBoMjpiZWZvcmUgewogIGNvbnRlbnQ6ICI6OiI7Cn0KCmNvZGUgewogIGZvbnQtZmFtaWx5OiBjb3VyaWVyLCBtb25vc3BhY2U7CiAgZm9udC1zaXplOiA4MCU7CiAgY29sb3I6ICM0MThBOEE7Cn0KPC90ZXh0YXJlYT4KPC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKCdjb2RlJywgewogICAgaGVpZ2h0OiAiMzUwcHgiLAogICAgcGFyc2VyZmlsZTogInBhcnNlY3NzLmpzIiwKICAgIHN0eWxlc2hlZXQ6ICJjc3MvY3NzY29sb3JzLmNzcyIsCiAgICBwYXRoOiAianMvIgogIH0pOwo8L3NjcmlwdD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/highlight.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2hpZ2hsaWdodC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJqcy9zdHJpbmdzdHJlYW0uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ianMvdG9rZW5pemUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ianMvdG9rZW5pemVqYXZhc2NyaXB0LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImpzL3BhcnNlamF2YXNjcmlwdC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KICAgIDx0aXRsZT5Db2RlTWlycm9yOiBTdHJpbmcgaGlnaGxpZ2h0IGRlbW9uc3RyYXRpb248L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2pzY29sb3JzLmNzcyIvPgogIDwvaGVhZD4KICA8Ym9keSBzdHlsZT0icGFkZGluZzogMjBweDsiPgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IHBhZGRpbmc6IC40ZW07Ij4KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjIwIiBzdHlsZT0iYm9yZGVyLXdpZHRoOiAwIj4KLy8gRGVtbyBmb3IgcnVubmluZyBhIENvZGVNaXJyb3IgcGFyc2VyIG92ZXIgYSBwaWVjZSBvZiBjb2RlIHdpdGhvdXQKLy8gY3JlYXRpbmcgYW4gYWN0dWFsIGVkaXRvci4KCihmdW5jdGlvbigpewogIGZ1bmN0aW9uIG5vcm1hbGlzZVN0cmluZyhzdHJpbmcpIHsKICAgIHZhciB0YWIgPSAiIjsKICAgIGZvciAodmFyIGkgPSAwOyBpICZsdDsgaW5kZW50VW5pdDsgaSsrKSB0YWIgKz0gIiAiOwoKICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cdC9nLCB0YWIpLnJlcGxhY2UoL1x1MDBhMC9nLCAiICIpLnJlcGxhY2UoL1xyXG4/L2csICJcbiIpOwogICAgdmFyIHBvcyA9IDAsIHBhcnRzID0gW10sIGxpbmVzID0gc3RyaW5nLnNwbGl0KCJcbiIpOwogICAgZm9yICh2YXIgbGluZSA9IDA7IGxpbmUgJmx0OyBsaW5lcy5sZW5ndGg7IGxpbmUrKykgewogICAgICBpZiAobGluZSAhPSAwKSBwYXJ0cy5wdXNoKCJcbiIpOwogICAgICBwYXJ0cy5wdXNoKGxpbmVzW2xpbmVdKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAocG9zICZsdDsgcGFydHMubGVuZ3RoKSByZXR1cm4gcGFydHNbcG9zKytdOwogICAgICAgIGVsc2UgdGhyb3cgU3RvcEl0ZXJhdGlvbjsKICAgICAgfQogICAgfTsKICB9CgogIHdpbmRvdy5oaWdobGlnaHRUZXh0ID0gZnVuY3Rpb24oc3RyaW5nLCBvdXRwdXQsIHBhcnNlcikgewogICAgdmFyIHBhcnNlciA9IChwYXJzZXIgfHwgRWRpdG9yLlBhcnNlcikubWFrZShzdHJpbmdTdHJlYW0obm9ybWFsaXNlU3RyaW5nKHN0cmluZykpKTsKICAgIHRyeSB7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdmFyIHRva2VuID0gcGFyc2VyLm5leHQoKTsKICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlNQQU4iKTsKICAgICAgICBzcGFuLmNsYXNzTmFtZSA9IHRva2VuLnN0eWxlOwogICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodG9rZW4udmFsdWUpKTsKICAgICAgICBvdXRwdXQuYXBwZW5kQ2hpbGQoc3Bhbik7CiAgICAgIH0KICAgIH0KICAgIGNhdGNoIChlKSB7CiAgICAgIGlmIChlICE9IFN0b3BJdGVyYXRpb24pIHRocm93IGU7CiAgICB9CiAgfQp9KSgpOwo8L3RleHRhcmVhPgo8L2Rpdj4KCjxidXR0b24gb25jbGljaz0iaGlnaGxpZ2h0KCkiPlJ1biBoaWdobGlnaHRlcjwvYnV0dG9uPgoKPGRpdj4KPGRpdiBpZD0ibnVtYmVycyIgc3R5bGU9ImZsb2F0OiBsZWZ0OyB3aWR0aDogMmVtOyBtYXJnaW4tcmlnaHQ6IC41ZW07IHRleHQtYWxpZ246IHJpZ2h0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogI0NDQzsiPjwvZGl2Pgo8cHJlIGlkPSJvdXRwdXQiIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlIj48L3ByZT4KPC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgLy8gU2ltcGxlIGhhY2sgdG8gZGVtb25zdHJhdGUgYWRkaW5nIGxpbmUgbnVtYmVycy4gSnVzdCBwYXNzIHRoZSBET00gbm9kZSBhcwogIC8vIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gaGlnaGxpZ2h0VGV4dCB3aGVuIHlvdSBkb24ndCBuZWVkIHRob3NlCiAgZnVuY3Rpb24gaGlnaGxpZ2h0KCkgewogICAgdmFyIGxpbmVObyA9IDEsIG91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKSwgbnVtYmVycyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJudW1iZXJzIik7CiAgICBvdXRwdXQuaW5uZXJIVE1MID0gbnVtYmVycy5pbm5lckhUTUwgPSAiIjsKCiAgICBmdW5jdGlvbiBhZGRMaW5lKGxpbmUpIHsKICAgICAgbnVtYmVycy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcobGluZU5vKyspKSk7CiAgICAgIG51bWJlcnMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiQlIiKSk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKykgb3V0cHV0LmFwcGVuZENoaWxkKGxpbmVbaV0pOwogICAgICBvdXRwdXQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiQlIiKSk7CiAgICB9CiAgICBoaWdobGlnaHRUZXh0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIikudmFsdWUsIGFkZExpbmUpOwogIH0KPC9zY3JpcHQ+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/htmltest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogSFRNTC9YTUwgZGVtb25zdHJhdGlvbjwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjc3MvZG9jcy5jc3MiLz4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yLWxpbmUtbnVtYmVycyB7CiAgICAgICAgd2lkdGg6IDIuMmVtOwogICAgICAgIGNvbG9yOiAjYWFhOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogLjNlbTsKICAgICAgICBmb250LXNpemU6IDEwcHQ7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBwYWRkaW5nLXRvcDogLjRlbTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHkgc3R5bGU9InBhZGRpbmc6IDIwcHg7Ij4KCjxwPlRoaXMgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiB0aGUgWE1ML0hUTUwgaW5kZW50YXRpb24gbW9kdWxlCmZvciA8YSBocmVmPSJpbmRleC5odG1sIj5Db2RlTWlycm9yPC9hPi4gVGhlIDxhCmhyZWY9ImpzL3BhcnNleG1sLmpzIj5qYXZhc2NyaXB0PC9hPiBmaWxlIGNvbnRhaW5zIHNvbWUgY29tbWVudHMgd2l0aAptb3JlIGluZm9ybWF0aW9uLjwvcD4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nOiAwcHg7Ij4KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjMwIj4KJmx0O2h0bWwgc3R5bGU9ImNvbG9yOiBncmVlbiImZ3Q7CiAgJmx0OyEtLSB0aGlzIGlzIGEgY29tbWVudCAtLSZndDsKICAmbHQ7aGVhZCZndDsKICAgICZsdDt0aXRsZSZndDtIVE1MIEV4YW1wbGUmbHQ7L3RpdGxlJmd0OwogICZsdDsvaGVhZCZndDsKICAmbHQ7Ym9keSZndDsKICAgIFRoZSBpbmRlbnRhdGlvbiB0cmllcyB0byBiZSAmbHQ7ZW0mZ3Q7c29tZXdoYXQgJmFtcDtxdW90O2RvIHdoYXQKICAgIEkgbWVhbiZhbXA7cXVvdDsmbHQ7L2VtJmd0Oy4uLiBidXQgbWlnaHQgbm90IG1hdGNoIHlvdXIgc3R5bGUuCiAgJmx0Oy9ib2R5Jmd0OwombHQ7L2h0bWwmZ3Q7CjwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSgnY29kZScsIHsKICAgIGhlaWdodDogIjM1MHB4IiwKICAgIHBhcnNlcmZpbGU6ICJwYXJzZXhtbC5qcyIsCiAgICBzdHlsZXNoZWV0OiAiY3NzL3htbGNvbG9ycy5jc3MiLAogICAgcGF0aDogImpzLyIsCiAgICBjb250aW51b3VzU2Nhbm5pbmc6IDUwMCwKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgdGV4dFdyYXBwaW5nOiBmYWxzZQogIH0pOwo8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEluLWJyb3dzZXIgY29kZSBlZGl0aW5nPC90aXRsZT4KCiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjc3MvZG9jcy5jc3MiLz4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIGRpdi50b3Age3RleHQtYWxpZ246IGNlbnRlcjt9CiAgICAgIGRpdi50b3AgaDEge21hcmdpbi1ib3R0b206IDA7fQogICAgICBkaXYudG9wIGgyIHttYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAxLjVlbTt9CiAgICAgIGRpdi5kb25hdGUgc3BhbiB7Y3Vyc29yOiBwb2ludGVyOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTt9CiAgICAgIGRpdi5kb25hdGUge2ZvbnQtc2l6ZTogNzAlOyBtYXJnaW4tdG9wOiAxZW07IHdpZHRoOiAxNTVweDsgcGFkZGluZzogMTBweDsgYm9yZGVyOiAxcHggc29saWQgI2M0NDt9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KCjxkaXYgY2xhc3M9InRvcCI+CiAgPGgxPkNvZGVNaXJyb3I8L2gxPgogIDxoMiBjbGFzcz0idW5kZXJsaW5lIj5Jbi1icm93c2VyIGNvZGUgZWRpdGluZyBtYWRlIGFsbW9zdCBiZWFyYWJsZTwvaDI+CjwvZGl2Pgo8ZGl2IHN0eWxlPSJmbG9hdDogcmlnaHQ7IHBhZGRpbmctbGVmdDogMTBweDsiPgogIDxmb3JtIGFjdGlvbj0iaHR0cHM6Ly93d3cucGF5cGFsLmNvbS9jZ2ktYmluL3dlYnNjciIgbWV0aG9kPSJwb3N0IiBpZD0icGF5cGFsIj4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhjbGljayIvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaG9zdGVkX2J1dHRvbl9pZCIgdmFsdWU9IjM3MDE1NDQiLz4KICA8L2Zvcm0+CiAgPGltZyBzcmM9ImNzcy9wZW9wbGUuanBnIiBhbHQ9IiIvPjxici8+CiAgPGRpdiBjbGFzcz0iZG9uYXRlIj4KICAgIE1ha2UgYSBkb25hdGlvbjoKICAgIDx1bCBzdHlsZT0ibWFyZ2luOiAwIDJlbTsgcGFkZGluZzogMCI+CiAgICAgIDxsaT48c3BhbiBvbmNsaWNrPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGF5cGFsJykuc3VibWl0KCk7Ij5QYXlwYWw8L3NwYW4+PC9saT4KICAgICAgPGxpPjxzcGFuIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYW5raW5mbycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOyI+QmFuazwvc3Bhbj48L2xpPgogICAgPC91bD4KICAgIDxkaXYgaWQ9ImJhbmtpbmZvIiBzdHlsZT0iZGlzcGxheTogbm9uZTsgZm9udC1zaXplOiA4MCU7Ij4KICAgICAgQmFuazogPGk+UmFib2Jhbms8L2k+PGJyLz4KICAgICAgQ291bnRyeTogPGk+TmV0aGVybGFuZHM8L2k+PGJyLz4KICAgICAgU1dJRlQ6IDxpPlJBQk9OTDJVPC9pPjxici8+CiAgICAgIEFjY291bnQ6IDxpPjE0Nzg1MDc3MDwvaT48YnIvPgogICAgICBOYW1lOiA8aT5NYXJpam4gSGF2ZXJiZWtlPC9pPjxici8+CiAgICAgIElCQU46IDxpPk5MMjYgUkFCTyAwMTQ3IDg1MDcgNzA8L2k+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC9kaXY+Cgo8cD5Db2RlTWlycm9yIGlzIGEgSmF2YVNjcmlwdCBsaWJyYXJ5IHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEKcmVsYXRpdmVseSBwbGVhc2FudCBlZGl0b3IgaW50ZXJmYWNlIGZvciBjb2RlLWxpa2UgY29udGVudCAmI3gyMDE1Owpjb21wdXRlciBwcm9ncmFtcywgSFRNTCBtYXJrdXAsIGFuZCBzaW1pbGFyLiBJZiBhIHBhcnNlciBoYXMgYmVlbgp3cml0dGVuIGZvciB0aGUgbGFuZ3VhZ2UgeW91IGFyZSBlZGl0aW5nIChzZWUgYmVsb3cgZm9yIGEgbGlzdCBvZgpzdXBwb3J0ZWQgbGFuZ3VhZ2VzKSwgdGhlIGNvZGUgd2lsbCBiZSBjb2xvdXJlZCwgYW5kIHRoZSBlZGl0b3Igd2lsbApoZWxwIHlvdSB3aXRoIGluZGVudGF0aW9uLjwvcD4KCjxwPlRvIGdldCBhIGxvb2sgYXQgQ29kZU1pcnJvciwgc2VlIHRoZSB0ZXN0IHBhZ2VzIGZvciB0aGUgdmFyaW91cwpwYXJzZXJzLi4uPC9wPgoKPHVsPgogIDxsaT48YSBocmVmPSJqc3Rlc3QuaHRtbCI+SmF2YVNjcmlwdDwvYT48L2xpPgogIDxsaT48YSBocmVmPSJodG1sdGVzdC5odG1sIj5YTUwvSFRNTDwvYT48L2xpPgogIDxsaT48YSBocmVmPSJjc3N0ZXN0Lmh0bWwiPkNTUzwvYT48L2xpPgogIDxsaT48YSBocmVmPSJzcGFycWx0ZXN0Lmh0bWwiPlNQQVJRTDwvYT48L2xpPgogIDxsaT48YSBocmVmPSJtaXhlZHRlc3QuaHRtbCI+SFRNTCBtaXhlZC1tb2RlPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9ImNvbnRyaWIvcGhwL2luZGV4Lmh0bWwiPkhUTUwrUEhQIG1peGVkLW1vZGU8L2E+IChjb3VydGVzeSBvZiA8YSBocmVmPSJjb250cmliL3BocC9MSUNFTlNFIj5ZYWhvbyE8L2E+KTwvbGk+CiAgPGxpPjxhIGhyZWY9ImNvbnRyaWIvcHl0aG9uL2luZGV4Lmh0bWwiPlB5dGhvbjwvYT4gKGNvdXJ0ZXN5IG9mIDxhIGhyZWY9ImNvbnRyaWIvcHl0aG9uL0xJQ0VOU0UiPlRpbW90aHkgRmFycmVsbDwvYT4pPC9saT4KICA8bGk+PGEgaHJlZj0iY29udHJpYi9sdWEvaW5kZXguaHRtbCI+THVhPC9hPiAoY291cnRlc3kgb2YgPGEgaHJlZj0iaHR0cDovL2ZyYW5jaW8ucGwvIj5GcmFuY2lzemVrIFdhd3J6YWs8L2E+KTwvbGk+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdHVmZi5oYW50bC5jei9ydWJ5LWluLWNvZGVtaXJyb3IvIj5SdWJ5PC9hPiAoYnkgTWljaGFsIEhhbnRsLCA8YSBocmVmPSJodHRwOi8vZ2l0aHViLmNvbS9oYWt1bmluL3J1YnktaW4tY29kZW1pcnJvci90cmVlL21hc3RlciI+dW5maW5pc2hlZDwvYT4pPC9saT4KPC91bD4KCjxwPk9yIHRha2UgYSBsb29rIGF0IHNvbWUgcmVhbC13b3JsZCB1c2VzIG9mIHRoZSBzeXN0ZW0uLi48L3A+Cgo8dWw+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9naXRodWIuY29tL2Rhcndpbi9maXJlcmFpbmJvdyI+RmlyZVJhaW5ib3c6IHN5bnRheCBjb2xvdXJpbmcgZm9yIEZpcmVidWc8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iaHR0cDovL2Rldi5mcmVlYmFzZWFwcHMuY29tLyI+RnJlZWJhc2UncyBBY3JlIElERTwvYT48L2xpPgogIDxsaT48YSBocmVmPSJodHRwOi8va21sLXNhbXBsZXMuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rL2ludGVyYWN0aXZlL2luZGV4Lmh0bWwiPkdvb2dsZSBFYXJ0aCBLTUwgc2FtcGxlcjwvYT48L2xpPgogIDxsaT48YSBocmVmPSJodHRwOi8vZWxvcXVlbnRqYXZhc2NyaXB0Lm5ldC9jaGFwdGVyMS5odG1sIj5FbG9xdWVudCBKYXZhU2NyaXB0J3MgY29uc29sZTwvYT48L2xpPgogIDxsaT48YSBocmVmPSJodHRwOi8vZGVtby5xb294ZG9vLm9yZy9jdXJyZW50L3BsYXlncm91bmQvI0hlbGxvX1dvcmxkIj5UaGUgcW9veGRvbyBwbGF5Z3JvdW5kPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9iaWxsbWlsbC5vcmcvc3RhdGljL2NhbnZhc3R1dG9yaWFsL2luZGV4Lmh0bWwiPkEgY29vbCB0dXRvcmlhbCBhYm91dCB0aGUgJmx0O2NhbnZhcz4gZWxlbWVudDwvYT48L2xpPgogIDxsaT48YSBocmVmPSJodHRwOi8vb3JjLmNzcmVzLnV0ZXhhcy5lZHUvdHJ5b3JjLnNodG1sIj5BbiBvbmxpbmUgSURFIGZvciB0aGUgT3JjIHByb2dyYW1taW5nIGxhbmd1YWdlPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYXBpcy9hamF4L3BsYXlncm91bmQiPkdvb2dsZSdzIEFQSSBwbGF5Z3JvdW5kPC9hPjwvbGk+CjwvdWw+Cgo8aDI+UmVsZWFzZXM8L2gyPgoKPHAgY2xhc3M9InJlbCI+PGVtPjMwLTA1LTIwMDk8L2VtPjogPGEKaHJlZj0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9jb2RlbWlycm9yLTAuNjIuemlwIj5WZXJzaW9uCjAuNjI8L2E+OiBJbnRyb2R1Y2VzIDxhIGhyZWY9ImNvbnRyaWIvcHl0aG9uL2luZGV4Lmh0bWwiPlB5dGhvbjwvYT4KYW5kIDxhIGhyZWY9ImNvbnRyaWIvbHVhL2luZGV4Lmh0bWwiPkx1YTwvYT4gcGFyc2Vycy4gQWRkCjxjb2RlPnNldFBhcnNlcjwvY29kZT4gKG9uLXRoZS1mbHkgbW9kZSBjaGFuZ2luZykgYW5kCjxjb2RlPmNsZWFySGlzdG9yeTwvY29kZT4gbWV0aG9kcy4gTWFrZSBwYXJzaW5nIHBhc3NlcyB0aW1lLWJhc2VkCmluc3RlYWQgb2YgbGluZXMtYmFzZWQgKHNlZSB0aGUgPGNvZGU+cGFzc1RpbWU8L2NvZGU+IG9wdGlvbikuPC9wPgoKPHAgY2xhc3M9InJlbCI+PGVtPjA0LTAzLTIwMDk8L2VtPjogPGEKaHJlZj0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9jb2RlbWlycm9yLTAuNjEuemlwIj5WZXJzaW9uCjAuNjE8L2E+OiBBZGQgbGluZSBudW1iZXJzIHN1cHBvcnQgKHNlZSA8Y29kZT5saW5lTnVtYmVyczwvY29kZT4Kb3B0aW9uIGluIDxhIGhyZWY9Im1hbnVhbC5odG1sIj5tYW51YWw8L2E+KS4gU3VwcG9ydCBhIG1vZGUgd2hlcmUgdGFiCidzaGlmdHMnIGluZGVudGF0aW9uIGluc3RlYWQgb2YgcmVzZXR0aW5nIGl0IChzZWUKPGNvZGU+dGFiTW9kZT0ic2hpZnQiPC9jb2RlPikuIEFkZCA8Y29kZT5pbmRlbnRVbml0PC9jb2RlPiBvcHRpb24gdG8KY29uZmlndXJlIGluZGVudGF0aW9uIGRlcHRocy4gTWFrZSBpdCBwb3NzaWJsZSB0byBncmFiIHRoZSBlZGl0b3IncwprZXlib2FyZCBpbnB1dCwgd2hpY2ggaXMgdXNlZnVsIHdoZW4gcG9wcGluZyB1cCBkaWFsb2dzIChzZWUKPGNvZGU+Z3JhYktleXM8L2NvZGU+Lzxjb2RlPnVuZ3JhYktleXM8L2NvZGU+KS4gRml4IGEgbG90IG9mIHNtYWxsCmJ1Z3MsIGFtb25nIHdoaWNoIHRoZSB2YXJpb3VzIGlzc3VlcyByZWxhdGVkIHRvIHBhc3RpbmcgaW4gSW50ZXJuZXQKRXhwbG9yZXIuPC9wPgoKPHAgY2xhc3M9InJlbCI+PGVtPjI5LTEyLTIwMDg8L2VtPjogPGEKaHJlZj0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9jb2RlbWlycm9yLTAuNjAuemlwIj5WZXJzaW9uCjAuNjA8L2E+OiBUaGlzIHJlbGVhc2UgbWFrZXMgbG90cyBvZiBpbnRlcm5hbCBjaGFuZ2VzLCBzbyB0ZXN0IGJlZm9yZQp5b3UgdXBncmFkZS4gTW9yZSByb2J1c3Qgc2VsZWN0aW9uLXByZXNlcnZhdGlvbiBvbiBJRSwgYWxsb3dpbmcgc3R5bGVzCndpdGggZGlmZmVyZW50IGZvbnQgc2l6ZXMuIE5ldyA8Y29kZT5hY3RpdmVUb2tlbnM8L2NvZGU+IGFuZAo8Y29kZT5jdXJzb3JBY3Rpdml0eTwvY29kZT4gY2FsbGJhY2tzLCBhbmQgYSBtb3JlIHBvd2VyZnVsLCBsaW5lLWJhc2VkCmludGVyZmFjZSBmb3IgaW5zcGVjdGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZSBjb250ZW50IG9mIHRoZSBlZGl0b3IKKHNlZSA8YSBocmVmPSJtYW51YWwuaHRtbCI+bWFudWFsPC9hPikuIEZpeGVzIHRoZQo8Y29kZT5yZXBsYWNlU2VsZWN0aW9uPC9jb2RlPiBwcm9ibGVtIGluIElFLCBhbmQgYSBsb3Qgb2Ygb3RoZXIsCnNtYWxsZXIgaXNzdWVzLjwvcD4KCjxwIGNsYXNzPSJyZWwiPjxlbT4yOC0wOS0yMDA4PC9lbT46IDxhCmhyZWY9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29kZW1pcnJvci0wLjU4LnppcCI+VmVyc2lvbgowLjU4PC9hPjogQWRkIHBhcnNlcnMgZm9yIFNQQVJRTCBhbmQgSFRNTC1taXhlZC1tb2RlIChuZXN0cyBDU1MgYW5kIEpTCnBhcnNlcnMpLiBBbHNvOiBicmFja2V0IGhpZ2hsaWdodGluZywgYSAnZHVtYiB0YWJzJyBtb2RlLCBhbgo8Y29kZT5vbkNoYW5nZTwvY29kZT4gY2FsbGJhY2ssIGFuZCBoZWFwcyBvZiBidWdmaXhlcy4gU2VlIHRoZSBtYW51YWwKZm9yIGRldGFpbHMgb24gdGhlIG5ldyBmZWF0dXJlcy48L3A+Cgo8cCBjbGFzcz0icmVsIj48ZW0+MDQtMDctMjAwODwvZW0+OiA8YQpocmVmPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2NvZGVtaXJyb3ItMC41Ny56aXAiPlZlcnNpb24KMC41NzwvYT46IEEgQ1NTIHBhcnNlciBhbmQgYSBuaWNlIHRva2VuaXplciBmcmFtZXdvcmssIGJ1Z2ZpeGVzIGluIHRoZQpYTUwgcGFyc2VyLCBhIGZldyBicm93c2VyLWlzc3VlIHdvcmthcm91bmRzLCBvbmUgb2Ygd2hpY2ggc2hvdWxkIGZpeAp0aGUgYWdlLW9sZCBGaXJlZm94IGN1cnNvci1zaG93aW5nLW9uLXdyb25nIGxpbmUgYnVnLjwvcD4KCjxoMiBpZD0ic3VwcG9ydGVkIj5TdXBwb3J0ZWQgYnJvd3NlcnM8L2gyPgoKPHA+QXQgdGhpcyB0aW1lLCB0aGUgZm9sbG93aW5nIGJyb3dzZXJzIGFyZSBzdXBwb3J0ZWQ6PC9wPgoKPHVsPgogIDxsaT5GaXJlZm94IDEuNSBvciBoaWdoZXI8L2xpPgogIDxsaT5JbnRlcm5ldCBFeHBsb3JlciA2IG9yIGhpZ2hlcjwvbGk+CiAgPGxpPlNhZmFyaSAzIG9yIGhpZ2hlcjwvbGk+CiAgPGxpPk9wZXJhIDkuNTIgb3IgaGlnaGVyPC9saT4KICA8bGk+Q2hyb21lPC9saT4KPC91bD4KCjxwPk1ha2luZyBpdCB3b3JrIG9uIG90aGVyIGJyb3dzZXJzIHRoYXQgaGF2ZSBkZWNlbnQgc3VwcG9ydCBmb3IgdGhlClczQyBET00gbW9kZWwgc2hvdWxkIG5vdCBiZSB0b28gaGFyZCwgYnV0IEkgYW0gbm90IGFjdGl2ZWx5IHRlc3RpbmcKYWdhaW5zdCB0aG9zZS48L3A+Cgo8aDI+R2V0dGluZyB0aGUgY29kZTwvaDI+Cgo8cD5BbGwgb2YgQ29kZU1pcnJvciBpcyByZWxlYXNlZCB1bmRlciBhIDxhCmhyZWY9IkxJQ0VOU0UiPnpsaWItc3R5bGU8L2E+IGxpY2Vuc2UuIFRvIGdldCBpdCwgeW91IGNhbiBkb3dubG9hZCB0aGUKPGEgaHJlZj0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9jb2RlbWlycm9yLnppcCI+bGF0ZXN0CnJlbGVhc2U8L2E+IG9yIHRoZSBjdXJyZW50IDxhCmhyZWY9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29kZW1pcnJvci1sYXRlc3QuemlwIj5kZXZlbG9wbWVudApzbmFwc2hvdDwvYT4gYXMgemlwIGZpbGVzLCBvciB1c2UgdGhlIDxhCmhyZWY9Imh0dHA6Ly93d3cuZGFyY3MubmV0LyI+ZGFyY3M8L2E+IHZlcnNpb24gY29udHJvbCBzeXN0ZW0gdG8gZ2V0CnRoZSByZXBvc2l0b3J5OjwvcD4KCjxwcmUgY2xhc3M9ImNvZGUiPmRhcmNzIGdldCBodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yPC9wcmU+Cgo8cD5UaGlzIHNlY29uZCBtZXRob2QgaXMgcmVjb21tZW5kZWQgaWYgeW91IGFyZSBwbGFubmluZyB0byBoYWNrIG9uCkNvZGVNaXJyb3IgJiN4MjAxNTsgaXQgbWFrZXMgaXQgZWFzeSB0byByZWNvcmQgeW91ciBwYXRjaGVzIGFuZCBzaGFyZSB0aGVtCndpdGggbWUuIFRvIHNlZSB0aGUgcmVwb3NpdG9yeSBvbmxpbmUsIHZpc2l0IHRoZSA8YQpocmVmPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9kYXJjc3dlYi5jZ2k/cj1Db2RlTWlycm9yIj5Db2RlTWlycm9yCmRhcmNzd2ViPC9hPi48L3A+Cgo8aDI+U3VwcG9ydDwvaDI+Cgo8cD5UaGVyZSBpcyBhIDxhCmhyZWY9Imh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9jb2RlbWlycm9yIj5Hb29nbGUgZ3JvdXA8L2E+IChhCnNvcnQgb2YgbWFpbGluZyBsaXN0L25ld3Nncm91cCB0aGluZ3kpIGZvciBkaXNjdXNzaW9uIGFuZCBuZXdzIHJlbGF0ZWQKdG8gQ29kZU1pcnJvci4gWW91IGNhbiBhbHNvIGUtbWFpbCBtZSBkaXJlY3RseTogPGEKaHJlZj0ibWFpbHRvOm1hcmlqbmhAZ21haWwuY29tIj5NYXJpam4gSGF2ZXJiZWtlPC9hPi48L3A+Cgo8aDI+RG9jdW1lbnRhdGlvbjwvaDI+Cgo8dWw+CiAgPGxpPlRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCI+bWFudWFsPC9hPiBpcyBhbGwgbW9zdCB1c2VycyB3aWxsIG5lZWQKICB0byByZWFkIChvciBza2ltKS48L2xpPgogIDxsaT5JZiB5b3UncmUgaW50ZXJlc3RlZCBpbiB3b3JraW5nIG9uIHRoZSBjb2RlLCA8YQogIGhyZWY9InN0b3J5Lmh0bWwiPnRoaXMgZG9jdW1lbnQ8L2E+IGFib3V0IENvZGVNaXJyb3IncyBhcmNoaXRlY3R1cmUKICB3aWxsIGJlIHVzZWZ1bC48L2xpPgogIDxsaT5UaGUgPGEKICBocmVmPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9kYXJjc3dlYi5jZ2k/cj1Db2RlTWlycm9yO2E9dHJlZSI+c291cmNlCiAgY29kZTwvYT4gaXMsIGZvciB0aGUgbW9zdCBwYXJ0LCByYXRoZXIgd2VsbCBjb21tZW50ZWQsIHNvIGlmIGFsbAogIGVsc2UgZmFpbHMsIHlvdSBjYW4gdHJ5IHJlYWRpbmcgaXQuPC9saT4KPC91bD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/js/codemirror.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQ29kZU1pcnJvciBtYWluIG1vZHVsZQogKgogKiBJbXBsZW1lbnRzIHRoZSBDb2RlTWlycm9yIGNvbnN0cnVjdG9yIGFuZCBwcm90b3R5cGUsIHdoaWNoIHRha2UgY2FyZQogKiBvZiBpbml0aWFsaXppbmcgdGhlIGVkaXRvciBmcmFtZSwgYW5kIHByb3ZpZGluZyB0aGUgb3V0c2lkZSBpbnRlcmZhY2UuCiAqLwoKLy8gVGhlIENvZGVNaXJyb3JDb25maWcgb2JqZWN0IGlzIHVzZWQgdG8gc3BlY2lmeSBhIGRlZmF1bHQKLy8gY29uZmlndXJhdGlvbi4gSWYgeW91IHNwZWNpZnkgc3VjaCBhbiBvYmplY3QgYmVmb3JlIGxvYWRpbmcgdGhpcwovLyBmaWxlLCB0aGUgdmFsdWVzIHlvdSBwdXQgaW50byBpdCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyBnaXZlbgovLyBiZWxvdy4gWW91IGNhbiBhbHNvIGFzc2lnbiB0byBpdCBhZnRlciBsb2FkaW5nLgp2YXIgQ29kZU1pcnJvckNvbmZpZyA9IHdpbmRvdy5Db2RlTWlycm9yQ29uZmlnIHx8IHt9OwoKdmFyIENvZGVNaXJyb3IgPSAoZnVuY3Rpb24oKXsKICBmdW5jdGlvbiBzZXREZWZhdWx0cyhvYmplY3QsIGRlZmF1bHRzKSB7CiAgICBmb3IgKHZhciBvcHRpb24gaW4gZGVmYXVsdHMpIHsKICAgICAgaWYgKCFvYmplY3QuaGFzT3duUHJvcGVydHkob3B0aW9uKSkKICAgICAgICBvYmplY3Rbb3B0aW9uXSA9IGRlZmF1bHRzW29wdGlvbl07CiAgICB9CiAgfQogIGZ1bmN0aW9uIGZvckVhY2goYXJyYXksIGFjdGlvbikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKICAgICAgYWN0aW9uKGFycmF5W2ldKTsKICB9CgogIC8vIFRoZXNlIGRlZmF1bHQgb3B0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwYXNzaW5nIGEgc2V0IG9mCiAgLy8gb3B0aW9ucyB0byBhIHNwZWNpZmljIENvZGVNaXJyb3IgY29uc3RydWN0b3IuIFNlZSBtYW51YWwuaHRtbCBmb3IKICAvLyB0aGVpciBtZWFuaW5nLgogIHNldERlZmF1bHRzKENvZGVNaXJyb3JDb25maWcsIHsKICAgIHN0eWxlc2hlZXQ6ICIiLAogICAgcGF0aDogIiIsCiAgICBwYXJzZXJmaWxlOiBbXSwKICAgIGJhc2VmaWxlczogWyJ1dGlsLmpzIiwgInN0cmluZ3N0cmVhbS5qcyIsICJzZWxlY3QuanMiLCAidW5kby5qcyIsICJlZGl0b3IuanMiLCAidG9rZW5pemUuanMiXSwKICAgIGlmcmFtZUNsYXNzOiBudWxsLAogICAgcGFzc0RlbGF5OiAyMDAsCiAgICBwYXNzVGltZTogNTAsCiAgICBjb250aW51b3VzU2Nhbm5pbmc6IGZhbHNlLAogICAgc2F2ZUZ1bmN0aW9uOiBudWxsLAogICAgb25DaGFuZ2U6IG51bGwsCiAgICB1bmRvRGVwdGg6IDUwLAogICAgdW5kb0RlbGF5OiA4MDAsCiAgICBkaXNhYmxlU3BlbGxjaGVjazogdHJ1ZSwKICAgIHRleHRXcmFwcGluZzogdHJ1ZSwKICAgIHJlYWRPbmx5OiBmYWxzZSwKICAgIHdpZHRoOiAiMTAwJSIsCiAgICBoZWlnaHQ6ICIzMDBweCIsCiAgICBhdXRvTWF0Y2hQYXJlbnM6IGZhbHNlLAogICAgcGFyc2VyQ29uZmlnOiBudWxsLAogICAgdGFiTW9kZTogImluZGVudCIsIC8vIG9yICJzcGFjZXMiLCAiZGVmYXVsdCIsICJzaGlmdCIKICAgIHJlaW5kZW50T25Mb2FkOiBmYWxzZSwKICAgIGFjdGl2ZVRva2VuczogbnVsbCwKICAgIGN1cnNvckFjdGl2aXR5OiBudWxsLAogICAgbGluZU51bWJlcnM6IGZhbHNlLAogICAgaW5kZW50VW5pdDogMgogIH0pOwoKICBmdW5jdGlvbiB3cmFwTGluZU51bWJlckRpdihwbGFjZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLAogICAgICAgICAgbnVtcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLAogICAgICAgICAgc2Nyb2xsZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKTsKICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKICAgICAgbnVtcy5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICAgIG51bXMuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBpZiAobnVtcy5zdHlsZS5zZXRFeHByZXNzaW9uKSB7CiAgICAgICAgdHJ5IHtudW1zLnN0eWxlLnNldEV4cHJlc3Npb24oImhlaWdodCIsICJ0aGlzLnByZXZpb3VzU2libGluZy5vZmZzZXRIZWlnaHQgKyAncHgnIik7fQogICAgICAgIGNhdGNoKGUpIHt9IC8vIFNlZW1zIHRvIHRocm93ICdOb3QgSW1wbGVtZW50ZWQnIG9uIHNvbWUgSUU4IHZlcnNpb25zCiAgICAgIH0KICAgICAgbnVtcy5zdHlsZS50b3AgPSAiMHB4IjsKICAgICAgbnVtcy5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOwogICAgICBwbGFjZShjb250YWluZXIpOwogICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChudW1zKTsKICAgICAgc2Nyb2xsZXIuY2xhc3NOYW1lID0gIkNvZGVNaXJyb3ItbGluZS1udW1iZXJzIjsKICAgICAgbnVtcy5hcHBlbmRDaGlsZChzY3JvbGxlcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhcHBseUxpbmVOdW1iZXJzKGZyYW1lKSB7CiAgICB2YXIgd2luID0gZnJhbWUuY29udGVudFdpbmRvdywgZG9jID0gd2luLmRvY3VtZW50LAogICAgICAgIG51bXMgPSBmcmFtZS5uZXh0U2libGluZywgc2Nyb2xsZXIgPSBudW1zLmZpcnN0Q2hpbGQ7CgogICAgdmFyIG5leHROdW0gPSAxLCBiYXJXaWR0aCA9IG51bGw7CiAgICBmdW5jdGlvbiBzaXplQmFyKCkgewogICAgICBpZiAobnVtcy5vZmZzZXRXaWR0aCAhPSBiYXJXaWR0aCkgewogICAgICAgIGJhcldpZHRoID0gbnVtcy5vZmZzZXRXaWR0aDsKICAgICAgICBudW1zLnN0eWxlLmxlZnQgPSAiLSIgKyAoZnJhbWUucGFyZW50Tm9kZS5zdHlsZS5tYXJnaW5MZWZ0ID0gYmFyV2lkdGggKyAicHgiKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlKCkgewogICAgICB2YXIgZGlmZiA9IDIwICsgTWF0aC5tYXgoZG9jLmJvZHkub2Zmc2V0SGVpZ2h0LCBmcmFtZS5vZmZzZXRIZWlnaHQpIC0gc2Nyb2xsZXIub2Zmc2V0SGVpZ2h0OwogICAgICBmb3IgKHZhciBuID0gTWF0aC5jZWlsKGRpZmYgLyAxMCk7IG4gPiAwOyBuLS0pIHsKICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIik7CiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5leHROdW0rKykpOwogICAgICAgIHNjcm9sbGVyLmFwcGVuZENoaWxkKGRpdik7CiAgICAgIH0KICAgICAgbnVtcy5zY3JvbGxUb3AgPSBkb2MuYm9keS5zY3JvbGxUb3AgfHwgZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgMDsKICAgIH0KICAgIHNpemVCYXIoKTsKICAgIHVwZGF0ZSgpOwogICAgd2luLmFkZEV2ZW50SGFuZGxlcih3aW4sICJzY3JvbGwiLCB1cGRhdGUpOwogICAgc2V0SW50ZXJ2YWwoc2l6ZUJhciwgNTAwKTsKICB9CgogIGZ1bmN0aW9uIENvZGVNaXJyb3IocGxhY2UsIG9wdGlvbnMpIHsKICAgIC8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIGRlcHJlY2F0ZWQgb3B0aW9ucy4KICAgIGlmIChvcHRpb25zLmR1bWJUYWJzKSBvcHRpb25zLnRhYk1vZGUgPSAic3BhY2VzIjsKICAgIGVsc2UgaWYgKG9wdGlvbnMubm9ybWFsVGFiKSBvcHRpb25zLnRhYk1vZGUgPSAiZGVmYXVsdCI7CgogICAgLy8gVXNlIHBhc3NlZCBvcHRpb25zLCBpZiBhbnksIHRvIG92ZXJyaWRlIGRlZmF1bHRzLgogICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICBzZXREZWZhdWx0cyhvcHRpb25zLCBDb2RlTWlycm9yQ29uZmlnKTsKCiAgICB2YXIgZnJhbWUgPSB0aGlzLmZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiSUZSQU1FIik7CiAgICBpZiAob3B0aW9ucy5pZnJhbWVDbGFzcykgZnJhbWUuY2xhc3NOYW1lID0gb3B0aW9ucy5pZnJhbWVDbGFzczsKICAgIGZyYW1lLmZyYW1lQm9yZGVyID0gMDsKICAgIGZyYW1lLnNyYyA9ICJqYXZhc2NyaXB0OmZhbHNlOyI7CiAgICBmcmFtZS5zdHlsZS5ib3JkZXIgPSAiMCI7CiAgICBmcmFtZS5zdHlsZS53aWR0aCA9IG9wdGlvbnMud2lkdGg7CiAgICBmcmFtZS5zdHlsZS5oZWlnaHQgPSBvcHRpb25zLmhlaWdodDsKICAgIC8vIGRpc3BsYXk6IGJsb2NrIG9jY2FzaW9uYWxseSBzdXBwcmVzc2VzIHNvbWUgRmlyZWZveCBidWdzLCBzbyB3ZQogICAgLy8gYWx3YXlzIGFkZCBpdCwgcmVkdW5kYW50IGFzIGl0IHNvdW5kcy4KICAgIGZyYW1lLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwoKICAgIGlmIChwbGFjZS5hcHBlbmRDaGlsZCkgewogICAgICB2YXIgbm9kZSA9IHBsYWNlOwogICAgICBwbGFjZSA9IGZ1bmN0aW9uKG4pe25vZGUuYXBwZW5kQ2hpbGQobik7fTsKICAgIH0KICAgIGlmIChvcHRpb25zLmxpbmVOdW1iZXJzKSBwbGFjZSA9IHdyYXBMaW5lTnVtYmVyRGl2KHBsYWNlKTsKICAgIHBsYWNlKGZyYW1lKTsKCiAgICAvLyBMaW5rIGJhY2sgdG8gdGhpcyBvYmplY3QsIHNvIHRoYXQgdGhlIGVkaXRvciBjYW4gZmV0Y2ggb3B0aW9ucwogICAgLy8gYW5kIGFkZCBhIHJlZmVyZW5jZSB0byBpdHNlbGYuCiAgICBmcmFtZS5Db2RlTWlycm9yID0gdGhpczsKICAgIHRoaXMud2luID0gZnJhbWUuY29udGVudFdpbmRvdzsKCiAgICBpZiAodHlwZW9mIG9wdGlvbnMucGFyc2VyZmlsZSA9PSAic3RyaW5nIikKICAgICAgb3B0aW9ucy5wYXJzZXJmaWxlID0gW29wdGlvbnMucGFyc2VyZmlsZV07CiAgICBpZiAodHlwZW9mIG9wdGlvbnMuc3R5bGVzaGVldCA9PSAic3RyaW5nIikKICAgICAgb3B0aW9ucy5zdHlsZXNoZWV0ID0gW29wdGlvbnMuc3R5bGVzaGVldF07CgogICAgdmFyIGh0bWwgPSBbIjwhRE9DVFlQRSBIVE1MIFBVQkxJQyBcIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZFwiPjxodG1sPjxoZWFkPiJdOwogICAgZm9yRWFjaChvcHRpb25zLnN0eWxlc2hlZXQsIGZ1bmN0aW9uKGZpbGUpIHsKICAgICAgaHRtbC5wdXNoKCI8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgaHJlZj1cIiIgKyBmaWxlICsgIlwiLz4iKTsKICAgIH0pOwogICAgZm9yRWFjaChvcHRpb25zLmJhc2VmaWxlcy5jb25jYXQob3B0aW9ucy5wYXJzZXJmaWxlKSwgZnVuY3Rpb24oZmlsZSkgewogICAgICBodG1sLnB1c2goIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cIiIgKyBvcHRpb25zLnBhdGggKyBmaWxlICsgIlwiPjwvc2NyaXB0PiIpOwogICAgfSk7CiAgICBodG1sLnB1c2goIjwvaGVhZD48Ym9keSBzdHlsZT1cImJvcmRlci13aWR0aDogMDtcIiBjbGFzcz1cImVkaXRib3hcIiBzcGVsbGNoZWNrPVwiIiArCiAgICAgICAgICAgICAgKG9wdGlvbnMuZGlzYWJsZVNwZWxsY2hlY2sgPyAiZmFsc2UiIDogInRydWUiKSArICJcIj48L2JvZHk+PC9odG1sPiIpOwoKICAgIHZhciBkb2MgPSB0aGlzLndpbi5kb2N1bWVudDsKICAgIGRvYy5vcGVuKCk7CiAgICBkb2Mud3JpdGUoaHRtbC5qb2luKCIiKSk7CiAgICBkb2MuY2xvc2UoKTsKICB9CgogIENvZGVNaXJyb3IucHJvdG90eXBlID0gewogICAgaW5pdDogZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW5pdENhbGxiYWNrKSB0aGlzLm9wdGlvbnMuaW5pdENhbGxiYWNrKHRoaXMpOwogICAgICBpZiAodGhpcy5vcHRpb25zLmxpbmVOdW1iZXJzKSBhcHBseUxpbmVOdW1iZXJzKHRoaXMuZnJhbWUpOwogICAgICBpZiAodGhpcy5vcHRpb25zLnJlaW5kZW50T25Mb2FkKSB0aGlzLnJlaW5kZW50KCk7CiAgICB9LAoKICAgIGdldENvZGU6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmVkaXRvci5nZXRDb2RlKCk7fSwKICAgIHNldENvZGU6IGZ1bmN0aW9uKGNvZGUpIHt0aGlzLmVkaXRvci5pbXBvcnRDb2RlKGNvZGUpO30sCiAgICBzZWxlY3Rpb246IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmVkaXRvci5zZWxlY3RlZFRleHQoKTt9LAogICAgcmVpbmRlbnQ6IGZ1bmN0aW9uKCkge3RoaXMuZWRpdG9yLnJlaW5kZW50KCk7fSwKICAgIHJlaW5kZW50U2VsZWN0aW9uOiBmdW5jdGlvbigpIHt0aGlzLmVkaXRvci5yZWluZGVudFNlbGVjdGlvbihudWxsKTt9LAoKICAgIGZvY3VzOiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy53aW4uZm9jdXMoKTsKICAgICAgaWYgKHRoaXMuZWRpdG9yLnNlbGVjdGlvblNuYXBzaG90KSAvLyBJRSBoYWNrCiAgICAgICAgdGhpcy53aW4uc2VsZWN0LnNlbGVjdENvb3Jkcyh0aGlzLndpbiwgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uU25hcHNob3QpOwogICAgfSwKICAgIHJlcGxhY2VTZWxlY3Rpb246IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgdGhpcy5mb2N1cygpOwogICAgICB0aGlzLmVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKHRleHQpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0sCiAgICByZXBsYWNlQ2hhcnM6IGZ1bmN0aW9uKHRleHQsIHN0YXJ0LCBlbmQpIHsKICAgICAgdGhpcy5lZGl0b3IucmVwbGFjZUNoYXJzKHRleHQsIHN0YXJ0LCBlbmQpOwogICAgfSwKICAgIGdldFNlYXJjaEN1cnNvcjogZnVuY3Rpb24oc3RyaW5nLCBmcm9tQ3Vyc29yKSB7CiAgICAgIHJldHVybiB0aGlzLmVkaXRvci5nZXRTZWFyY2hDdXJzb3Ioc3RyaW5nLCBmcm9tQ3Vyc29yKTsKICAgIH0sCgogICAgdW5kbzogZnVuY3Rpb24oKSB7dGhpcy5lZGl0b3IuaGlzdG9yeS51bmRvKCk7fSwKICAgIHJlZG86IGZ1bmN0aW9uKCkge3RoaXMuZWRpdG9yLmhpc3RvcnkucmVkbygpO30sCiAgICBoaXN0b3J5U2l6ZTogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuZWRpdG9yLmhpc3RvcnkuaGlzdG9yeVNpemUoKTt9LAogICAgY2xlYXJIaXN0b3J5OiBmdW5jdGlvbigpIHt0aGlzLmVkaXRvci5oaXN0b3J5LmNsZWFyKCk7fSwKCiAgICBncmFiS2V5czogZnVuY3Rpb24oY2FsbGJhY2ssIGZpbHRlcikge3RoaXMuZWRpdG9yLmdyYWJLZXlzKGNhbGxiYWNrLCBmaWx0ZXIpO30sCiAgICB1bmdyYWJLZXlzOiBmdW5jdGlvbigpIHt0aGlzLmVkaXRvci51bmdyYWJLZXlzKCk7fSwKCiAgICBzZXRQYXJzZXI6IGZ1bmN0aW9uKG5hbWUpIHt0aGlzLmVkaXRvci5zZXRQYXJzZXIobmFtZSk7fSwKCiAgICBjdXJzb3JQb3NpdGlvbjogZnVuY3Rpb24oc3RhcnQpIHsKICAgICAgaWYgKHRoaXMud2luLnNlbGVjdC5pZV9zZWxlY3Rpb24pIHRoaXMuZm9jdXMoKTsKICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLmN1cnNvclBvc2l0aW9uKHN0YXJ0KTsKICAgIH0sCiAgICBmaXJzdExpbmU6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmVkaXRvci5maXJzdExpbmUoKTt9LAogICAgbGFzdExpbmU6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmVkaXRvci5sYXN0TGluZSgpO30sCiAgICBuZXh0TGluZTogZnVuY3Rpb24obGluZSkge3JldHVybiB0aGlzLmVkaXRvci5uZXh0TGluZShsaW5lKTt9LAogICAgcHJldkxpbmU6IGZ1bmN0aW9uKGxpbmUpIHtyZXR1cm4gdGhpcy5lZGl0b3IucHJldkxpbmUobGluZSk7fSwKICAgIGxpbmVDb250ZW50OiBmdW5jdGlvbihsaW5lKSB7cmV0dXJuIHRoaXMuZWRpdG9yLmxpbmVDb250ZW50KGxpbmUpO30sCiAgICBzZXRMaW5lQ29udGVudDogZnVuY3Rpb24obGluZSwgY29udGVudCkge3RoaXMuZWRpdG9yLnNldExpbmVDb250ZW50KGxpbmUsIGNvbnRlbnQpO30sCiAgICBpbnNlcnRJbnRvTGluZTogZnVuY3Rpb24obGluZSwgcG9zaXRpb24sIGNvbnRlbnQpIHt0aGlzLmVkaXRvci5pbnNlcnRJbnRvTGluZShsaW5lLCBwb3NpdGlvbiwgY29udGVudCk7fSwKICAgIHNlbGVjdExpbmVzOiBmdW5jdGlvbihzdGFydExpbmUsIHN0YXJ0T2Zmc2V0LCBlbmRMaW5lLCBlbmRPZmZzZXQpIHsKICAgICAgdGhpcy53aW4uZm9jdXMoKTsKICAgICAgdGhpcy5lZGl0b3Iuc2VsZWN0TGluZXMoc3RhcnRMaW5lLCBzdGFydE9mZnNldCwgZW5kTGluZSwgZW5kT2Zmc2V0KTsKICAgIH0sCiAgICBudGhMaW5lOiBmdW5jdGlvbihuKSB7CiAgICAgIHZhciBsaW5lID0gdGhpcy5maXJzdExpbmUoKTsKICAgICAgZm9yICg7IG4gPiAxICYmIGxpbmUgIT09IGZhbHNlOyBuLS0pCiAgICAgICAgbGluZSA9IHRoaXMubmV4dExpbmUobGluZSk7CiAgICAgIHJldHVybiBsaW5lOwogICAgfSwKICAgIGxpbmVOdW1iZXI6IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdmFyIG51bSA9IDA7CiAgICAgIHdoaWxlIChsaW5lICE9PSBmYWxzZSkgewogICAgICAgIG51bSsrOwogICAgICAgIGxpbmUgPSB0aGlzLnByZXZMaW5lKGxpbmUpOwogICAgICB9CiAgICAgIHJldHVybiBudW07CiAgICB9LAoKICAgIC8vIE9sZCBudW1iZXItYmFzZWQgbGluZSBpbnRlcmZhY2UKICAgIGp1bXBUb0xpbmU6IGZ1bmN0aW9uKG4pIHsKICAgICAgdGhpcy5zZWxlY3RMaW5lcyh0aGlzLm50aExpbmUobiksIDApOwogICAgICB0aGlzLndpbi5mb2N1cygpOwogICAgfSwKICAgIGN1cnJlbnRMaW5lOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMubGluZU51bWJlcih0aGlzLmN1cnNvclBvc2l0aW9uKCkubGluZSk7CiAgICB9CiAgfTsKCiAgQ29kZU1pcnJvci5JbnZhbGlkTGluZUhhbmRsZSA9IHt0b1N0cmluZzogZnVuY3Rpb24oKXtyZXR1cm4gIkNvZGVNaXJyb3IuSW52YWxpZExpbmVIYW5kbGUiO319OwoKICBDb2RlTWlycm9yLnJlcGxhY2UgPSBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT0gInN0cmluZyIpCiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50KTsKICAgIHJldHVybiBmdW5jdGlvbihuZXdFbGVtZW50KSB7CiAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3RWxlbWVudCwgZWxlbWVudCk7CiAgICB9OwogIH07CgogIENvZGVNaXJyb3IuZnJvbVRleHRBcmVhID0gZnVuY3Rpb24oYXJlYSwgb3B0aW9ucykgewogICAgaWYgKHR5cGVvZiBhcmVhID09ICJzdHJpbmciKQogICAgICBhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYXJlYSk7CgogICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICBpZiAoYXJlYS5zdHlsZS53aWR0aCAmJiBvcHRpb25zLndpZHRoID09IG51bGwpCiAgICAgIG9wdGlvbnMud2lkdGggPSBhcmVhLnN0eWxlLndpZHRoOwogICAgaWYgKGFyZWEuc3R5bGUuaGVpZ2h0ICYmIG9wdGlvbnMuaGVpZ2h0ID09IG51bGwpCiAgICAgIG9wdGlvbnMuaGVpZ2h0ID0gYXJlYS5zdHlsZS5oZWlnaHQ7CiAgICBpZiAob3B0aW9ucy5jb250ZW50ID09IG51bGwpIG9wdGlvbnMuY29udGVudCA9IGFyZWEudmFsdWU7CgogICAgaWYgKGFyZWEuZm9ybSkgewogICAgICBmdW5jdGlvbiB1cGRhdGVGaWVsZCgpIHsKICAgICAgICBhcmVhLnZhbHVlID0gbWlycm9yLmdldENvZGUoKTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIGFyZWEuZm9ybS5hZGRFdmVudExpc3RlbmVyID09ICJmdW5jdGlvbiIpCiAgICAgICAgYXJlYS5mb3JtLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIHVwZGF0ZUZpZWxkLCBmYWxzZSk7CiAgICAgIGVsc2UKICAgICAgICBhcmVhLmZvcm0uYXR0YWNoRXZlbnQoIm9uc3VibWl0IiwgdXBkYXRlRmllbGQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGluc2VydChmcmFtZSkgewogICAgICBpZiAoYXJlYS5uZXh0U2libGluZykKICAgICAgICBhcmVhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZyYW1lLCBhcmVhLm5leHRTaWJsaW5nKTsKICAgICAgZWxzZQogICAgICAgIGFyZWEucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChmcmFtZSk7CiAgICB9CgogICAgYXJlYS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgdmFyIG1pcnJvciA9IG5ldyBDb2RlTWlycm9yKGluc2VydCwgb3B0aW9ucyk7CiAgICByZXR1cm4gbWlycm9yOwogIH07CgogIENvZGVNaXJyb3IuaXNQcm9iYWJseVN1cHBvcnRlZCA9IGZ1bmN0aW9uKCkgewogICAgLy8gVGhpcyBpcyByYXRoZXIgYXdmdWwsIGJ1dCBjYW4gYmUgdXNlZnVsLgogICAgdmFyIG1hdGNoOwogICAgaWYgKHdpbmRvdy5vcGVyYSkKICAgICAgcmV0dXJuIE51bWJlcih3aW5kb3cub3BlcmEudmVyc2lvbigpKSA+PSA5LjUyOwogICAgZWxzZSBpZiAoL0FwcGxlIENvbXB1dGVycywgSW5jLy50ZXN0KG5hdmlnYXRvci52ZW5kb3IpICYmIChtYXRjaCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1ZlcnNpb25cLyhcZCsoPzpcLlxkKyk/KVwuLykpKQogICAgICByZXR1cm4gTnVtYmVyKG1hdGNoWzFdKSA+PSAzOwogICAgZWxzZSBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uICYmIHdpbmRvdy5BY3RpdmVYT2JqZWN0ICYmIChtYXRjaCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01TSUUgKFxkKyg/OlwuXGQqKT8pXGIvKSkpCiAgICAgIHJldHVybiBOdW1iZXIobWF0Y2hbMV0pID49IDY7CiAgICBlbHNlIGlmIChtYXRjaCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2dlY2tvXC8oXGR7OH0pL2kpKQogICAgICByZXR1cm4gTnVtYmVyKG1hdGNoWzFdKSA+PSAyMDA1MDkwMTsKICAgIGVsc2UgaWYgKG1hdGNoID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQXBwbGVXZWJLaXRcLyhcZCspLykpCiAgICAgIHJldHVybiBOdW1iZXIobWF0Y2hbMV0pID49IDUyNTsKICAgIGVsc2UKICAgICAgcmV0dXJuIG51bGw7CiAgfTsKCiAgcmV0dXJuIENvZGVNaXJyb3I7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/editor.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVGhlIEVkaXRvciBvYmplY3QgbWFuYWdlcyB0aGUgY29udGVudCBvZiB0aGUgZWRpdGFibGUgZnJhbWUuIEl0CiAqIGNhdGNoZXMgZXZlbnRzLCBjb2xvdXJzIG5vZGVzLCBhbmQgaW5kZW50cyBsaW5lcy4gVGhpcyBmaWxlIGFsc28KICogaG9sZHMgc29tZSBmdW5jdGlvbnMgZm9yIHRyYW5zZm9ybWluZyBhcmJpdHJhcnkgRE9NIHN0cnVjdHVyZXMgaW50bwogKiBwbGFpbiBzZXF1ZW5jZXMgb2YgPHNwYW4+IGFuZCA8YnI+IGVsZW1lbnRzCiAqLwoKLy8gTWFrZSBzdXJlIGEgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gdHdvIGNvbnNlY3V0aXZlICdjb2xsYXBzZWFibGUnCi8vIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KZnVuY3Rpb24gbWFrZVdoaXRlU3BhY2UobikgewogIHZhciBidWZmZXIgPSBbXSwgbmIgPSB0cnVlOwogIGZvciAoOyBuID4gMDsgbi0tKSB7CiAgICBidWZmZXIucHVzaCgobmIgfHwgbiA9PSAxKSA/IG5ic3AgOiAiICIpOwogICAgbmIgPSAhbmI7CiAgfQogIHJldHVybiBidWZmZXIuam9pbigiIik7Cn0KCi8vIENyZWF0ZSBhIHNldCBvZiB3aGl0ZS1zcGFjZSBjaGFyYWN0ZXJzIHRoYXQgd2lsbCBub3QgYmUgY29sbGFwc2VkCi8vIGJ5IHRoZSBicm93c2VyLCBidXQgd2lsbCBub3QgYnJlYWsgdGV4dC13cmFwcGluZyBlaXRoZXIuCmZ1bmN0aW9uIGZpeFNwYWNlcyhzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmNoYXJBdCgwKSA9PSAiICIpIHN0cmluZyA9IG5ic3AgKyBzdHJpbmcuc2xpY2UoMSk7CiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cdC9nLCBmdW5jdGlvbigpe3JldHVybiBtYWtlV2hpdGVTcGFjZShpbmRlbnRVbml0KTt9KQogICAgLnJlcGxhY2UoL1sgXHUwMGEwXXsyLH0vZywgZnVuY3Rpb24ocykge3JldHVybiBtYWtlV2hpdGVTcGFjZShzLmxlbmd0aCk7fSk7Cn0KCmZ1bmN0aW9uIGNsZWFuVGV4dCh0ZXh0KSB7CiAgcmV0dXJuIHRleHQucmVwbGFjZSgvXHUwMGEwL2csICIgIikucmVwbGFjZSgvXHUyMDBiL2csICIiKTsKfQoKLy8gQ3JlYXRlIGEgU1BBTiBub2RlIHdpdGggdGhlIGV4cGVjdGVkIHByb3BlcnRpZXMgZm9yIGRvY3VtZW50IHBhcnQKLy8gc3BhbnMuCmZ1bmN0aW9uIG1ha2VQYXJ0U3Bhbih2YWx1ZSwgZG9jKSB7CiAgdmFyIHRleHQgPSB2YWx1ZTsKICBpZiAodmFsdWUubm9kZVR5cGUgPT0gMykgdGV4dCA9IHZhbHVlLm5vZGVWYWx1ZTsKICBlbHNlIHZhbHVlID0gZG9jLmNyZWF0ZVRleHROb2RlKHRleHQpOwoKICB2YXIgc3BhbiA9IGRvYy5jcmVhdGVFbGVtZW50KCJTUEFOIik7CiAgc3Bhbi5pc1BhcnQgPSB0cnVlOwogIHNwYW4uYXBwZW5kQ2hpbGQodmFsdWUpOwogIHNwYW4uY3VycmVudFRleHQgPSB0ZXh0OwogIHJldHVybiBzcGFuOwp9CgovLyBPbiB3ZWJraXQsIHdoZW4gdGhlIGxhc3QgQlIgb2YgdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgdGV4dAovLyBiZWhpbmQgaXQsIHRoZSBjdXJzb3IgY2FuIG5vdCBiZSBwdXQgb24gdGhlIGxpbmUgYWZ0ZXIgaXQuIFRoaXMKLy8gbWFrZXMgcHJlc3NpbmcgZW50ZXIgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQgb2NjYXNpb25hbGx5IGRvCi8vIG5vdGhpbmcgKG9yIGF0IGxlYXN0IHNlZW0gdG8gZG8gbm90aGluZykuIFRvIHdvcmsgYXJvdW5kIGl0LCB0aGlzCi8vIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhlIGRvY3VtZW50IGVuZHMgd2l0aCBhIHNwYW4gY29udGFpbmluZyBhCi8vIHplcm8td2lkdGggc3BhY2UgY2hhcmFjdGVyLiBUaGUgdHJhdmVyc2VET00gaXRlcmF0b3IgZmlsdGVycyBzdWNoCi8vIGNoYXJhY3RlciBvdXQgYWdhaW4sIHNvIHRoYXQgdGhlIHBhcnNlcnMgd29uJ3Qgc2VlIHRoZW0uIFRoaXMKLy8gZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYSBmZXcgc3RyYXRlZ2ljIHBsYWNlcyB0byBtYWtlIHN1cmUgdGhlCi8vIHp3c3AgaXMgcmVzdG9yZWQgYWZ0ZXIgdGhlIGhpZ2hsaWdodGluZyBwcm9jZXNzIGVhdHMgaXQuCnZhciB3ZWJraXRMYXN0TGluZUhhY2sgPSB3ZWJraXQgPwogIGZ1bmN0aW9uKGNvbnRhaW5lcikgewogICAgdmFyIGxhc3QgPSBjb250YWluZXIubGFzdENoaWxkOwogICAgaWYgKCFsYXN0IHx8ICFsYXN0LmlzUGFydCB8fCBsYXN0LnRleHRDb250ZW50ICE9ICJcdTIwMGIiKQogICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobWFrZVBhcnRTcGFuKCJcdTIwMGIiLCBjb250YWluZXIub3duZXJEb2N1bWVudCkpOwogIH0gOiBmdW5jdGlvbigpIHt9OwoKdmFyIEVkaXRvciA9IChmdW5jdGlvbigpewogIC8vIFRoZSBIVE1MIGVsZW1lbnRzIHdob3NlIGNvbnRlbnQgc2hvdWxkIGJlIHN1ZmZpeGVkIGJ5IGEgbmV3bGluZQogIC8vIHdoZW4gY29udmVydGluZyB0aGVtIHRvIGZsYXQgdGV4dC4KICB2YXIgbmV3bGluZUVsZW1lbnRzID0geyJQIjogdHJ1ZSwgIkRJViI6IHRydWUsICJMSSI6IHRydWV9OwoKICBmdW5jdGlvbiBhc0VkaXRvckxpbmVzKHN0cmluZykgewogICAgdmFyIHRhYiA9IG1ha2VXaGl0ZVNwYWNlKGluZGVudFVuaXQpOwogICAgcmV0dXJuIG1hcChzdHJpbmcucmVwbGFjZSgvXHQvZywgdGFiKS5yZXBsYWNlKC9cdTAwYTAvZywgIiAiKS5yZXBsYWNlKC9cclxuPy9nLCAiXG4iKS5zcGxpdCgiXG4iKSwgZml4U3BhY2VzKTsKICB9CgogIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgdHJhdmVyc2VET00uIEZsYXR0ZW5zIGFuIGFyYml0cmFyeSBET00gbm9kZQogIC8vIGludG8gYW4gYXJyYXkgb2YgdGV4dG5vZGVzIGFuZCA8YnI+IHRhZ3MuCiAgZnVuY3Rpb24gc2ltcGxpZnlET00ocm9vdCkgewogICAgdmFyIGRvYyA9IHJvb3Qub3duZXJEb2N1bWVudDsKICAgIHZhciByZXN1bHQgPSBbXTsKICAgIHZhciBsZWF2aW5nID0gdHJ1ZTsKCiAgICBmdW5jdGlvbiBzaW1wbGlmeU5vZGUobm9kZSkgewogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7CiAgICAgICAgdmFyIHRleHQgPSBub2RlLm5vZGVWYWx1ZSA9IGZpeFNwYWNlcyhub2RlLm5vZGVWYWx1ZS5yZXBsYWNlKC9bXHJcdTIwMGJdL2csICIiKS5yZXBsYWNlKC9cbi9nLCAiICIpKTsKICAgICAgICBpZiAodGV4dC5sZW5ndGgpIGxlYXZpbmcgPSBmYWxzZTsKICAgICAgICByZXN1bHQucHVzaChub2RlKTsKICAgICAgfQogICAgICBlbHNlIGlmIChub2RlLm5vZGVOYW1lID09ICJCUiIgJiYgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgbGVhdmluZyA9IHRydWU7CiAgICAgICAgcmVzdWx0LnB1c2gobm9kZSk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgZm9yRWFjaChub2RlLmNoaWxkTm9kZXMsIHNpbXBsaWZ5Tm9kZSk7CiAgICAgICAgaWYgKCFsZWF2aW5nICYmIG5ld2xpbmVFbGVtZW50cy5oYXNPd25Qcm9wZXJ0eShub2RlLm5vZGVOYW1lKSkgewogICAgICAgICAgbGVhdmluZyA9IHRydWU7CiAgICAgICAgICByZXN1bHQucHVzaChkb2MuY3JlYXRlRWxlbWVudCgiQlIiKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgc2ltcGxpZnlOb2RlKHJvb3QpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIENyZWF0ZXMgYSBNb2NoaUtpdC1zdHlsZSBpdGVyYXRvciB0aGF0IGdvZXMgb3ZlciBhIHNlcmllcyBvZiBET00KICAvLyBub2Rlcy4gVGhlIHZhbHVlcyBpdCB5aWVsZHMgYXJlIHN0cmluZ3MsIHRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YKICAvLyB0aGUgbm9kZXMuIEl0IG1ha2VzIHN1cmUgdGhhdCBhbGwgbm9kZXMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUKICAvLyBvbmUgd2hvc2UgdGV4dCBpcyBiZWluZyB5aWVsZGVkIGhhdmUgYmVlbiAnbm9ybWFsaXplZCcgdG8gYmUganVzdAogIC8vIDxzcGFuPiBhbmQgPGJyPiBlbGVtZW50cy4KICAvLyBTZWUgdGhlIHN0b3J5Lmh0bWwgZmlsZSBmb3Igc29tZSBzaG9ydCByZW1hcmtzIGFib3V0IHRoZSB1c2Ugb2YKICAvLyBjb250aW51YXRpb24tcGFzc2luZyBzdHlsZSBpbiB0aGlzIGl0ZXJhdG9yLgogIGZ1bmN0aW9uIHRyYXZlcnNlRE9NKHN0YXJ0KXsKICAgIGZ1bmN0aW9uIHlpZWxkKHZhbHVlLCBjKXtjYyA9IGM7IHJldHVybiB2YWx1ZTt9CiAgICBmdW5jdGlvbiBwdXNoKGZ1biwgYXJnLCBjKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZnVuKGFyZywgYyk7fTt9CiAgICBmdW5jdGlvbiBzdG9wKCl7Y2MgPSBzdG9wOyB0aHJvdyBTdG9wSXRlcmF0aW9uO307CiAgICB2YXIgY2MgPSBwdXNoKHNjYW5Ob2RlLCBzdGFydCwgc3RvcCk7CiAgICB2YXIgb3duZXIgPSBzdGFydC5vd25lckRvY3VtZW50OwogICAgdmFyIG5vZGVRdWV1ZSA9IFtdOwoKICAgIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5zZXJ0IG5vZGVzIGFmdGVyIHRoZQogICAgLy8gb25lIGdpdmVuIGFzIGFyZ3VtZW50LgogICAgZnVuY3Rpb24gcG9pbnRBdChub2RlKXsKICAgICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgdmFyIG5leHQgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICByZXR1cm4gZnVuY3Rpb24obmV3bm9kZSkgewogICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3bm9kZSwgbmV4dCk7CiAgICAgIH07CiAgICB9CiAgICB2YXIgcG9pbnQgPSBudWxsOwoKICAgIC8vIEluc2VydCBhIG5vcm1hbGl6ZWQgbm9kZSBhdCB0aGUgY3VycmVudCBwb2ludC4gSWYgaXQgaXMgYSB0ZXh0CiAgICAvLyBub2RlLCB3cmFwIGl0IGluIGEgPHNwYW4+LCBhbmQgZ2l2ZSB0aGF0IHNwYW4gYSBjdXJyZW50VGV4dAogICAgLy8gcHJvcGVydHkgLS0gdGhpcyBpcyB1c2VkIHRvIGNhY2hlIHRoZSBub2RlVmFsdWUsIGJlY2F1c2UKICAgIC8vIGRpcmVjdGx5IGFjY2Vzc2luZyBub2RlVmFsdWUgaXMgaG9ycmlibHkgc2xvdyBvbiBzb21lIGJyb3dzZXJzLgogICAgLy8gVGhlIGRpcnR5IHByb3BlcnR5IGlzIHVzZWQgYnkgdGhlIGhpZ2hsaWdodGVyIHRvIGRldGVybWluZQogICAgLy8gd2hpY2ggcGFydHMgb2YgdGhlIGRvY3VtZW50IGhhdmUgdG8gYmUgcmUtaGlnaGxpZ2h0ZWQuCiAgICBmdW5jdGlvbiBpbnNlcnRQYXJ0KHBhcnQpewogICAgICB2YXIgdGV4dCA9ICJcbiI7CiAgICAgIGlmIChwYXJ0Lm5vZGVUeXBlID09IDMpIHsKICAgICAgICBzZWxlY3Quc25hcHNob3RDaGFuZ2VkKCk7CiAgICAgICAgcGFydCA9IG1ha2VQYXJ0U3BhbihwYXJ0LCBvd25lcik7CiAgICAgICAgdGV4dCA9IHBhcnQuY3VycmVudFRleHQ7CiAgICAgIH0KICAgICAgcGFydC5kaXJ0eSA9IHRydWU7CiAgICAgIG5vZGVRdWV1ZS5wdXNoKHBhcnQpOwogICAgICBwb2ludChwYXJ0KTsKICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CgogICAgLy8gRXh0cmFjdCB0aGUgdGV4dCBhbmQgbmV3bGluZXMgZnJvbSBhIERPTSBub2RlLCBpbnNlcnQgdGhlbSBpbnRvCiAgICAvLyB0aGUgZG9jdW1lbnQsIGFuZCB5aWVsZCB0aGUgdGV4dHVhbCBjb250ZW50LiBVc2VkIHRvIHJlcGxhY2UKICAgIC8vIG5vbi1ub3JtYWxpemVkIG5vZGVzLgogICAgZnVuY3Rpb24gd3JpdGVOb2RlKG5vZGUsIGMpewogICAgICB2YXIgdG9ZaWVsZCA9IFtdOwogICAgICBmb3JFYWNoKHNpbXBsaWZ5RE9NKG5vZGUpLCBmdW5jdGlvbihwYXJ0KSB7CiAgICAgICAgdG9ZaWVsZC5wdXNoKGluc2VydFBhcnQocGFydCkpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHlpZWxkKHRvWWllbGQuam9pbigiIiksIGMpOwogICAgfQoKICAgIC8vIENoZWNrIHdoZXRoZXIgYSBub2RlIGlzIGEgbm9ybWFsaXplZCA8c3Bhbj4gZWxlbWVudC4KICAgIGZ1bmN0aW9uIHBhcnROb2RlKG5vZGUpewogICAgICBpZiAobm9kZS5pc1BhcnQgJiYgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxICYmIG5vZGUuZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSAzKSB7CiAgICAgICAgbm9kZS5jdXJyZW50VGV4dCA9IG5vZGUuZmlyc3RDaGlsZC5ub2RlVmFsdWU7CiAgICAgICAgcmV0dXJuICEvW1xuXHRccl0vLnRlc3Qobm9kZS5jdXJyZW50VGV4dCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIEhhbmRsZSBhIG5vZGUuIEFkZCBpdHMgc3VjY2Vzc29yIHRvIHRoZSBjb250aW51YXRpb24gaWYgdGhlcmUKICAgIC8vIGlzIG9uZSwgZmluZCBvdXQgd2hldGhlciB0aGUgbm9kZSBpcyBub3JtYWxpemVkLiBJZiBpdCBpcywKICAgIC8vIHlpZWxkIGl0cyBjb250ZW50LCBvdGhlcndpc2UsIG5vcm1hbGl6ZSBpdCAod3JpdGVOb2RlIHdpbGwgdGFrZQogICAgLy8gY2FyZSBvZiB5aWVsZGluZykuCiAgICBmdW5jdGlvbiBzY2FuTm9kZShub2RlLCBjKXsKICAgICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpCiAgICAgICAgYyA9IHB1c2goc2Nhbk5vZGUsIG5vZGUubmV4dFNpYmxpbmcsIGMpOwoKICAgICAgaWYgKHBhcnROb2RlKG5vZGUpKXsKICAgICAgICBub2RlUXVldWUucHVzaChub2RlKTsKICAgICAgICByZXR1cm4geWllbGQobm9kZS5jdXJyZW50VGV4dCwgYyk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAobm9kZS5ub2RlTmFtZSA9PSAiQlIiKSB7CiAgICAgICAgbm9kZVF1ZXVlLnB1c2gobm9kZSk7CiAgICAgICAgcmV0dXJuIHlpZWxkKCJcbiIsIGMpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHBvaW50ID0gcG9pbnRBdChub2RlKTsKICAgICAgICByZW1vdmVFbGVtZW50KG5vZGUpOwogICAgICAgIHJldHVybiB3cml0ZU5vZGUobm9kZSwgYyk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBNb2NoaUtpdCBpdGVyYXRvcnMgYXJlIG9iamVjdHMgd2l0aCBhIG5leHQgZnVuY3Rpb24gdGhhdAogICAgLy8gcmV0dXJucyB0aGUgbmV4dCB2YWx1ZSBvciB0aHJvd3MgU3RvcEl0ZXJhdGlvbiB3aGVuIHRoZXJlIGFyZQogICAgLy8gbm8gbW9yZSB2YWx1ZXMuCiAgICByZXR1cm4ge25leHQ6IGZ1bmN0aW9uKCl7cmV0dXJuIGNjKCk7fSwgbm9kZXM6IG5vZGVRdWV1ZX07CiAgfQoKICAvLyBEZXRlcm1pbmUgdGhlIHRleHQgc2l6ZSBvZiBhIHByb2Nlc3NlZCBub2RlLgogIGZ1bmN0aW9uIG5vZGVTaXplKG5vZGUpIHsKICAgIGlmIChub2RlLm5vZGVOYW1lID09ICJCUiIpCiAgICAgIHJldHVybiAxOwogICAgZWxzZQogICAgICByZXR1cm4gbm9kZS5jdXJyZW50VGV4dC5sZW5ndGg7CiAgfQoKICAvLyBTZWFyY2ggYmFja3dhcmRzIHRocm91Z2ggdGhlIHRvcC1sZXZlbCBub2RlcyB1bnRpbCB0aGUgbmV4dCBCUiBvcgogIC8vIHRoZSBzdGFydCBvZiB0aGUgZnJhbWUuCiAgZnVuY3Rpb24gc3RhcnRPZkxpbmUobm9kZSkgewogICAgd2hpbGUgKG5vZGUgJiYgbm9kZS5ub2RlTmFtZSAhPSAiQlIiKSBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7CiAgICByZXR1cm4gbm9kZTsKICB9CiAgZnVuY3Rpb24gZW5kT2ZMaW5lKG5vZGUsIGNvbnRhaW5lcikgewogICAgaWYgKCFub2RlKSBub2RlID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICBlbHNlIGlmIChub2RlLm5vZGVOYW1lID09ICJCUiIpIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwoKICAgIHdoaWxlIChub2RlICYmIG5vZGUubm9kZU5hbWUgIT0gIkJSIikgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIHRpbWUoKSB7cmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpO30KCiAgLy8gUmVwbGFjZSBhbGwgRE9NIG5vZGVzIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB3aXRoIG5ldyBvbmVzLgogIC8vIE5lZWRlZCB0byBwcmV2ZW50IGlzc3VlcyBpbiBJRSB3aGVyZSB0aGUgb2xkIERPTSBub2RlcyBjYW4gYmUKICAvLyBwYXN0ZWQgYmFjayBpbnRvIHRoZSBkb2N1bWVudCwgc3RpbGwgaG9sZGluZyB0aGVpciBvbGQgdW5kbwogIC8vIGluZm9ybWF0aW9uLgogIGZ1bmN0aW9uIHNjcnViUGFzdGVkKGNvbnRhaW5lciwgc3RhcnQsIHN0YXJ0MikgewogICAgdmFyIGVuZCA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKGNvbnRhaW5lciwgdHJ1ZSksCiAgICAgICAgZG9jID0gY29udGFpbmVyLm93bmVyRG9jdW1lbnQ7CiAgICBpZiAoc3RhcnQgIT0gbnVsbCAmJiBzdGFydC5wYXJlbnROb2RlICE9IGNvbnRhaW5lcikgc3RhcnQgPSBzdGFydDI7CiAgICBpZiAoc3RhcnQgPT09IGZhbHNlKSBzdGFydCA9IG51bGw7CiAgICBpZiAoc3RhcnQgPT0gZW5kIHx8ICFlbmQgfHwgIWNvbnRhaW5lci5maXJzdENoaWxkKSByZXR1cm47CgogICAgdmFyIGNsZWFyID0gdHJhdmVyc2VET00oc3RhcnQgPyBzdGFydC5uZXh0U2libGluZyA6IGNvbnRhaW5lci5maXJzdENoaWxkKTsKICAgIHdoaWxlIChlbmQucGFyZW50Tm9kZSA9PSBjb250YWluZXIpIHRyeXtjbGVhci5uZXh0KCk7fWNhdGNoKGUpe2JyZWFrO30KICAgIGZvckVhY2goY2xlYXIubm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgdmFyIG5ld05vZGUgPSBub2RlLm5vZGVOYW1lID09ICJCUiIgPyBkb2MuY3JlYXRlRWxlbWVudCgiQlIiKSA6IG1ha2VQYXJ0U3Bhbihub2RlLmN1cnJlbnRUZXh0LCBkb2MpOwogICAgICBjb250YWluZXIucmVwbGFjZUNoaWxkKG5ld05vZGUsIG5vZGUpOwogICAgfSk7CiAgfQoKICAvLyBDbGllbnQgaW50ZXJmYWNlIGZvciBzZWFyY2hpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGVkaXRvci4gQ3JlYXRlCiAgLy8gdGhlc2UgYnkgY2FsbGluZyBDb2RlTWlycm9yLmdldFNlYXJjaEN1cnNvci4gVG8gdXNlLCBjYWxsCiAgLy8gZmluZE5leHQgb24gdGhlIHJlc3VsdGluZyBvYmplY3QgLS0gdGhpcyByZXR1cm5zIGEgYm9vbGVhbgogIC8vIGluZGljYXRpbmcgd2hldGhlciBhbnl0aGluZyB3YXMgZm91bmQsIGFuZCBjYW4gYmUgY2FsbGVkIGFnYWluIHRvCiAgLy8gc2tpcCB0byB0aGUgbmV4dCBmaW5kLiBVc2UgdGhlIHNlbGVjdCBhbmQgcmVwbGFjZSBtZXRob2RzIHRvCiAgLy8gYWN0dWFsbHkgZG8gc29tZXRoaW5nIHdpdGggdGhlIGZvdW5kIGxvY2F0aW9ucy4KICBmdW5jdGlvbiBTZWFyY2hDdXJzb3IoZWRpdG9yLCBzdHJpbmcsIGZyb21DdXJzb3IpIHsKICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOwogICAgdGhpcy5oaXN0b3J5ID0gZWRpdG9yLmhpc3Rvcnk7CiAgICB0aGlzLmhpc3RvcnkuY29tbWl0KCk7CgogICAgLy8gQXJlIHdlIGN1cnJlbnRseSBhdCBhbiBvY2N1cnJlbmNlIG9mIHRoZSBzZWFyY2ggc3RyaW5nPwogICAgdGhpcy5hdE9jY3VycmVuY2UgPSBmYWxzZTsKICAgIC8vIFRoZSBvYmplY3Qgc3RvcmVzIGEgc2V0IG9mIG5vZGVzIGNvbWluZyBhZnRlciBpdHMgY3VycmVudAogICAgLy8gcG9zaXRpb24sIHNvIHRoYXQgd2hlbiB0aGUgY3VycmVudCBwb2ludCBpcyB0YWtlbiBvdXQgb2YgdGhlCiAgICAvLyBET00gdHJlZSwgd2UgY2FuIHN0aWxsIHRyeSB0byBjb250aW51ZS4KICAgIHRoaXMuZmFsbGJhY2tTaXplID0gMTU7CiAgICB2YXIgY3Vyc29yOwogICAgLy8gU3RhcnQgZnJvbSB0aGUgY3Vyc29yIHdoZW4gc3BlY2lmaWVkIGFuZCBhIGN1cnNvciBjYW4gYmUgZm91bmQuCiAgICBpZiAoZnJvbUN1cnNvciAmJiAoY3Vyc29yID0gc2VsZWN0LmN1cnNvclBvcyh0aGlzLmVkaXRvci5jb250YWluZXIpKSkgewogICAgICB0aGlzLmxpbmUgPSBjdXJzb3Iubm9kZTsKICAgICAgdGhpcy5vZmZzZXQgPSBjdXJzb3Iub2Zmc2V0OwogICAgfQogICAgZWxzZSB7CiAgICAgIHRoaXMubGluZSA9IG51bGw7CiAgICAgIHRoaXMub2Zmc2V0ID0gMDsKICAgIH0KICAgIHRoaXMudmFsaWQgPSAhIXN0cmluZzsKCiAgICAvLyBDcmVhdGUgYSBtYXRjaGVyIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSBraW5kIG9mIHN0cmluZyB3ZSBoYXZlLgogICAgdmFyIHRhcmdldCA9IHN0cmluZy5zcGxpdCgiXG4iKSwgc2VsZiA9IHRoaXM7CiAgICB0aGlzLm1hdGNoZXMgPSAodGFyZ2V0Lmxlbmd0aCA9PSAxKSA/CiAgICAgIC8vIEZvciBvbmUtbGluZSBzdHJpbmdzLCBzZWFyY2hpbmcgY2FuIGJlIGRvbmUgc2ltcGx5IGJ5IGNhbGxpbmcKICAgICAgLy8gaW5kZXhPZiBvbiB0aGUgY3VycmVudCBsaW5lLgogICAgICBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbWF0Y2ggPSBjbGVhblRleHQoc2VsZi5oaXN0b3J5LnRleHRBZnRlcihzZWxmLmxpbmUpLnNsaWNlKHNlbGYub2Zmc2V0KSkuaW5kZXhPZihzdHJpbmcpOwogICAgICAgIGlmIChtYXRjaCA+IC0xKQogICAgICAgICAgcmV0dXJuIHtmcm9tOiB7bm9kZTogc2VsZi5saW5lLCBvZmZzZXQ6IHNlbGYub2Zmc2V0ICsgbWF0Y2h9LAogICAgICAgICAgICAgICAgICB0bzoge25vZGU6IHNlbGYubGluZSwgb2Zmc2V0OiBzZWxmLm9mZnNldCArIG1hdGNoICsgc3RyaW5nLmxlbmd0aH19OwogICAgICB9IDoKICAgICAgLy8gTXVsdGktbGluZSBzdHJpbmdzIHJlcXVpcmUgaW50ZXJuYWwgaXRlcmF0aW9uIG92ZXIgbGluZXMsIGFuZAogICAgICAvLyBzb21lIGNsdW5reSBjaGVja3MgdG8gbWFrZSBzdXJlIHRoZSBmaXJzdCBtYXRjaCBlbmRzIGF0IHRoZQogICAgICAvLyBlbmQgb2YgdGhlIGxpbmUgYW5kIHRoZSBsYXN0IG1hdGNoIHN0YXJ0cyBhdCB0aGUgc3RhcnQuCiAgICAgIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBmaXJzdExpbmUgPSBjbGVhblRleHQoc2VsZi5oaXN0b3J5LnRleHRBZnRlcihzZWxmLmxpbmUpLnNsaWNlKHNlbGYub2Zmc2V0KSk7CiAgICAgICAgdmFyIG1hdGNoID0gZmlyc3RMaW5lLmxhc3RJbmRleE9mKHRhcmdldFswXSk7CiAgICAgICAgaWYgKG1hdGNoID09IC0xIHx8IG1hdGNoICE9IGZpcnN0TGluZS5sZW5ndGggLSB0YXJnZXRbMF0ubGVuZ3RoKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHZhciBzdGFydE9mZnNldCA9IHNlbGYub2Zmc2V0ICsgbWF0Y2g7CgogICAgICAgIHZhciBsaW5lID0gc2VsZi5oaXN0b3J5Lm5vZGVBZnRlcihzZWxmLmxpbmUpOwogICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdGFyZ2V0Lmxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgaWYgKGNsZWFuVGV4dChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKGxpbmUpKSAhPSB0YXJnZXRbaV0pCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIGxpbmUgPSBzZWxmLmhpc3Rvcnkubm9kZUFmdGVyKGxpbmUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNsZWFuVGV4dChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKGxpbmUpKS5pbmRleE9mKHRhcmdldFt0YXJnZXQubGVuZ3RoIC0gMV0pICE9IDApCiAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIHJldHVybiB7ZnJvbToge25vZGU6IHNlbGYubGluZSwgb2Zmc2V0OiBzdGFydE9mZnNldH0sCiAgICAgICAgICAgICAgICB0bzoge25vZGU6IGxpbmUsIG9mZnNldDogdGFyZ2V0W3RhcmdldC5sZW5ndGggLSAxXS5sZW5ndGh9fTsKICAgICAgfTsKICB9CgogIFNlYXJjaEN1cnNvci5wcm90b3R5cGUgPSB7CiAgICBmaW5kTmV4dDogZnVuY3Rpb24oKSB7CiAgICAgIGlmICghdGhpcy52YWxpZCkgcmV0dXJuIGZhbHNlOwogICAgICB0aGlzLmF0T2NjdXJyZW5jZSA9IGZhbHNlOwogICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAvLyBHbyBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQgaWYgdGhlIGN1cnJlbnQgbGluZSBpcwogICAgICAvLyBubyBsb25nZXIgaW4gdGhlIERPTSB0cmVlLgogICAgICBpZiAodGhpcy5saW5lICYmICF0aGlzLmxpbmUucGFyZW50Tm9kZSkgewogICAgICAgIHRoaXMubGluZSA9IG51bGw7CiAgICAgICAgdGhpcy5vZmZzZXQgPSAwOwogICAgICB9CgogICAgICAvLyBTZXQgdGhlIGN1cnNvcidzIHBvc2l0aW9uIG9uZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGdpdmVuCiAgICAgIC8vIHBvc2l0aW9uLgogICAgICBmdW5jdGlvbiBzYXZlQWZ0ZXIocG9zKSB7CiAgICAgICAgaWYgKHNlbGYuaGlzdG9yeS50ZXh0QWZ0ZXIocG9zLm5vZGUpLmxlbmd0aCA8IHBvcy5vZmZzZXQpIHsKICAgICAgICAgIHNlbGYubGluZSA9IHBvcy5ub2RlOwogICAgICAgICAgc2VsZi5vZmZzZXQgPSBwb3Mub2Zmc2V0ICsgMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBzZWxmLmxpbmUgPSBzZWxmLmhpc3Rvcnkubm9kZUFmdGVyKHBvcy5ub2RlKTsKICAgICAgICAgIHNlbGYub2Zmc2V0ID0gMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdmFyIG1hdGNoID0gdGhpcy5tYXRjaGVzKCk7CiAgICAgICAgLy8gRm91bmQgdGhlIHNlYXJjaCBzdHJpbmcuCiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICB0aGlzLmF0T2NjdXJyZW5jZSA9IG1hdGNoOwogICAgICAgICAgc2F2ZUFmdGVyKG1hdGNoLmZyb20pOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHRoaXMubGluZSA9IHRoaXMuaGlzdG9yeS5ub2RlQWZ0ZXIodGhpcy5saW5lKTsKICAgICAgICB0aGlzLm9mZnNldCA9IDA7CiAgICAgICAgLy8gRW5kIG9mIGRvY3VtZW50LgogICAgICAgIGlmICghdGhpcy5saW5lKSB7CiAgICAgICAgICB0aGlzLnZhbGlkID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIHNlbGVjdDogZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLmF0T2NjdXJyZW5jZSkgewogICAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3ModGhpcy5lZGl0b3IuY29udGFpbmVyLCB0aGlzLmF0T2NjdXJyZW5jZS5mcm9tLCB0aGlzLmF0T2NjdXJyZW5jZS50byk7CiAgICAgICAgc2VsZWN0LnNjcm9sbFRvQ3Vyc29yKHRoaXMuZWRpdG9yLmNvbnRhaW5lcik7CiAgICAgIH0KICAgIH0sCgogICAgcmVwbGFjZTogZnVuY3Rpb24oc3RyaW5nKSB7CiAgICAgIGlmICh0aGlzLmF0T2NjdXJyZW5jZSkgewogICAgICAgIHZhciBlbmQgPSB0aGlzLmVkaXRvci5yZXBsYWNlUmFuZ2UodGhpcy5hdE9jY3VycmVuY2UuZnJvbSwgdGhpcy5hdE9jY3VycmVuY2UudG8sIHN0cmluZyk7CiAgICAgICAgdGhpcy5saW5lID0gZW5kLm5vZGU7CiAgICAgICAgdGhpcy5vZmZzZXQgPSBlbmQub2Zmc2V0OwogICAgICAgIHRoaXMuYXRPY2N1cnJlbmNlID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICB9OwoKICAvLyBUaGUgRWRpdG9yIG9iamVjdCBpcyB0aGUgbWFpbiBpbnNpZGUtdGhlLWlmcmFtZSBpbnRlcmZhY2UuCiAgZnVuY3Rpb24gRWRpdG9yKG9wdGlvbnMpIHsKICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICB3aW5kb3cuaW5kZW50VW5pdCA9IG9wdGlvbnMuaW5kZW50VW5pdDsKICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwogICAgdGhpcy5kb2MgPSBkb2N1bWVudDsKICAgIHZhciBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lciA9IHRoaXMuZG9jLmJvZHk7CiAgICB0aGlzLndpbiA9IHdpbmRvdzsKICAgIHRoaXMuaGlzdG9yeSA9IG5ldyBIaXN0b3J5KGNvbnRhaW5lciwgb3B0aW9ucy51bmRvRGVwdGgsIG9wdGlvbnMudW5kb0RlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgb3B0aW9ucy5vbkNoYW5nZSk7CiAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgaWYgKCFFZGl0b3IuUGFyc2VyKQogICAgICB0aHJvdyAiTm8gcGFyc2VyIGxvYWRlZC4iOwogICAgaWYgKG9wdGlvbnMucGFyc2VyQ29uZmlnICYmIEVkaXRvci5QYXJzZXIuY29uZmlndXJlKQogICAgICBFZGl0b3IuUGFyc2VyLmNvbmZpZ3VyZShvcHRpb25zLnBhcnNlckNvbmZpZyk7CgogICAgaWYgKCFvcHRpb25zLnJlYWRPbmx5KQogICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKGNvbnRhaW5lciwge25vZGU6IG51bGwsIG9mZnNldDogMH0pOwoKICAgIHRoaXMuZGlydHkgPSBbXTsKICAgIGlmIChvcHRpb25zLmNvbnRlbnQpCiAgICAgIHRoaXMuaW1wb3J0Q29kZShvcHRpb25zLmNvbnRlbnQpOwogICAgZWxzZSAvLyBGRiBhY3RzIHdlaXJkIHdoZW4gdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGNvbXBsZXRlbHkgZW1wdHkKICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoIkJSIikpOwoKICAgIGlmICghb3B0aW9ucy5yZWFkT25seSkgewogICAgICBpZiAob3B0aW9ucy5jb250aW51b3VzU2Nhbm5pbmcgIT09IGZhbHNlKSB7CiAgICAgICAgdGhpcy5zY2FubmVyID0gdGhpcy5kb2N1bWVudFNjYW5uZXIob3B0aW9ucy5wYXNzVGltZSk7CiAgICAgICAgdGhpcy5kZWxheVNjYW5uaW5nKCk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNldEVkaXRhYmxlKCkgewogICAgICAgIC8vIEluIElFLCBkZXNpZ25Nb2RlIGZyYW1lcyBjYW4gbm90IHJ1biBhbnkgc2NyaXB0cywgc28gd2UgdXNlCiAgICAgICAgLy8gY29udGVudEVkaXRhYmxlIGluc3RlYWQuCiAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkuY29udGVudEVkaXRhYmxlICE9IHVuZGVmaW5lZCAmJiBpbnRlcm5ldEV4cGxvcmVyKQogICAgICAgICAgZG9jdW1lbnQuYm9keS5jb250ZW50RWRpdGFibGUgPSAidHJ1ZSI7CiAgICAgICAgZWxzZQogICAgICAgICAgZG9jdW1lbnQuZGVzaWduTW9kZSA9ICJvbiI7CgogICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5ib3JkZXJXaWR0aCA9ICIwIjsKICAgICAgICBpZiAoIW9wdGlvbnMudGV4dFdyYXBwaW5nKQogICAgICAgICAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSAibm93cmFwIjsKICAgICAgfQoKICAgICAgLy8gSWYgc2V0dGluZyB0aGUgZnJhbWUgZWRpdGFibGUgZmFpbHMsIHRyeSBhZ2FpbiB3aGVuIHRoZSB1c2VyCiAgICAgIC8vIGZvY3VzIGl0IChoYXBwZW5zIHdoZW4gdGhlIGZyYW1lIGlzIG5vdCB2aXNpYmxlIG9uCiAgICAgIC8vIGluaXRpYWxpc2F0aW9uLCBpbiBGaXJlZm94KS4KICAgICAgdHJ5IHsKICAgICAgICBzZXRFZGl0YWJsZSgpOwogICAgICB9CiAgICAgIGNhdGNoKGUpIHsKICAgICAgICB2YXIgZm9jdXNFdmVudCA9IGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudCwgImZvY3VzIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBmb2N1c0V2ZW50KCk7CiAgICAgICAgICBzZXRFZGl0YWJsZSgpOwogICAgICAgIH0sIHRydWUpOwogICAgICB9CgogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQsICJrZXlkb3duIiwgbWV0aG9kKHRoaXMsICJrZXlEb3duIikpOwogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQsICJrZXlwcmVzcyIsIG1ldGhvZCh0aGlzLCAia2V5UHJlc3MiKSk7CiAgICAgIGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudCwgImtleXVwIiwgbWV0aG9kKHRoaXMsICJrZXlVcCIpKTsKCiAgICAgIGZ1bmN0aW9uIGN1cnNvckFjdGl2aXR5KCkge3NlbGYuY3Vyc29yQWN0aXZpdHkoZmFsc2UpO30KICAgICAgYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LmJvZHksICJtb3VzZXVwIiwgY3Vyc29yQWN0aXZpdHkpOwogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQuYm9keSwgInBhc3RlIiwgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBjdXJzb3JBY3Rpdml0eSgpOwogICAgICAgIGlmIChpbnRlcm5ldEV4cGxvcmVyKSB7CiAgICAgICAgICB2YXIgdGV4dCA9IG51bGw7CiAgICAgICAgICB0cnkge3RleHQgPSB3aW5kb3cuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJUZXh0Iik7fWNhdGNoKGUpe30KICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKICAgICAgICAgICAgc2VsZi5yZXBsYWNlU2VsZWN0aW9uKHRleHQpOwogICAgICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUoc2VsZi5jb250YWluZXIsIHRydWUpLAogICAgICAgICAgICAgICAgc3RhcnQyID0gc3RhcnQgJiYgc3RhcnQucHJldmlvdXNTaWJsaW5nOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2NydWJQYXN0ZWQoc2VsZi5jb250YWluZXIsIHN0YXJ0LCBzdGFydDIpO30sIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudC5ib2R5LCAiY3V0IiwgY3Vyc29yQWN0aXZpdHkpOwoKICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvTWF0Y2hQYXJlbnMpCiAgICAgICAgYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LmJvZHksICJjbGljayIsIG1ldGhvZCh0aGlzLCAic2NoZWR1bGVQYXJlbkJsaW5rIikpOwogICAgfQogICAgZWxzZSBpZiAoIW9wdGlvbnMudGV4dFdyYXBwaW5nKSB7CiAgICAgIGNvbnRhaW5lci5zdHlsZS53aGl0ZVNwYWNlID0gIm5vd3JhcCI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpc1NhZmVLZXkoY29kZSkgewogICAgcmV0dXJuIChjb2RlID49IDE2ICYmIGNvZGUgPD0gMTgpIHx8IC8vIHNoaWZ0LCBjb250cm9sLCBhbHQKICAgICAgICAgICAoY29kZSA+PSAzMyAmJiBjb2RlIDw9IDQwKTsgLy8gYXJyb3dzLCBob21lLCBlbmQKICB9CgogIEVkaXRvci5wcm90b3R5cGUgPSB7CiAgICAvLyBJbXBvcnQgYSBwaWVjZSBvZiBjb2RlIGludG8gdGhlIGVkaXRvci4KICAgIGltcG9ydENvZGU6IGZ1bmN0aW9uKGNvZGUpIHsKICAgICAgdGhpcy5oaXN0b3J5LnB1c2gobnVsbCwgbnVsbCwgYXNFZGl0b3JMaW5lcyhjb2RlKSk7CiAgICAgIHRoaXMuaGlzdG9yeS5yZXNldCgpOwogICAgfSwKCiAgICAvLyBFeHRyYWN0IHRoZSBjb2RlIGZyb20gdGhlIGVkaXRvci4KICAgIGdldENvZGU6IGZ1bmN0aW9uKCkgewogICAgICBpZiAoIXRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgcmV0dXJuICIiOwoKICAgICAgdmFyIGFjY3VtID0gW107CiAgICAgIHNlbGVjdC5tYXJrU2VsZWN0aW9uKHRoaXMud2luKTsKICAgICAgZm9yRWFjaCh0cmF2ZXJzZURPTSh0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKSwgbWV0aG9kKGFjY3VtLCAicHVzaCIpKTsKICAgICAgd2Via2l0TGFzdExpbmVIYWNrKHRoaXMuY29udGFpbmVyKTsKICAgICAgc2VsZWN0LnNlbGVjdE1hcmtlZCgpOwogICAgICByZXR1cm4gY2xlYW5UZXh0KGFjY3VtLmpvaW4oIiIpKTsKICAgIH0sCgogICAgY2hlY2tMaW5lOiBmdW5jdGlvbihub2RlKSB7CiAgICAgIGlmIChub2RlID09PSBmYWxzZSB8fCAhKG5vZGUgPT0gbnVsbCB8fCBub2RlLnBhcmVudE5vZGUgPT0gdGhpcy5jb250YWluZXIpKQogICAgICAgIHRocm93IHBhcmVudC5Db2RlTWlycm9yLkludmFsaWRMaW5lSGFuZGxlOwogICAgfSwKCiAgICBjdXJzb3JQb3NpdGlvbjogZnVuY3Rpb24oc3RhcnQpIHsKICAgICAgaWYgKHN0YXJ0ID09IG51bGwpIHN0YXJ0ID0gdHJ1ZTsKICAgICAgdmFyIHBvcyA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHN0YXJ0KTsKICAgICAgaWYgKHBvcykgcmV0dXJuIHtsaW5lOiBwb3Mubm9kZSwgY2hhcmFjdGVyOiBwb3Mub2Zmc2V0fTsKICAgICAgZWxzZSByZXR1cm4ge2xpbmU6IG51bGwsIGNoYXJhY3RlcjogMH07CiAgICB9LAoKICAgIGZpcnN0TGluZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSwKCiAgICBsYXN0TGluZTogZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLmNvbnRhaW5lci5sYXN0Q2hpbGQpIHJldHVybiBzdGFydE9mTGluZSh0aGlzLmNvbnRhaW5lci5sYXN0Q2hpbGQpOwogICAgICBlbHNlIHJldHVybiBudWxsOwogICAgfSwKCiAgICBuZXh0TGluZTogZnVuY3Rpb24obGluZSkgewogICAgICB0aGlzLmNoZWNrTGluZShsaW5lKTsKICAgICAgdmFyIGVuZCA9IGVuZE9mTGluZShsaW5lLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgIHJldHVybiBlbmQgfHwgZmFsc2U7CiAgICB9LAoKICAgIHByZXZMaW5lOiBmdW5jdGlvbihsaW5lKSB7CiAgICAgIHRoaXMuY2hlY2tMaW5lKGxpbmUpOwogICAgICBpZiAobGluZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIHJldHVybiBzdGFydE9mTGluZShsaW5lLnByZXZpb3VzU2libGluZyk7CiAgICB9LAoKICAgIHNlbGVjdExpbmVzOiBmdW5jdGlvbihzdGFydExpbmUsIHN0YXJ0T2Zmc2V0LCBlbmRMaW5lLCBlbmRPZmZzZXQpIHsKICAgICAgdGhpcy5jaGVja0xpbmUoc3RhcnRMaW5lKTsKICAgICAgdmFyIHN0YXJ0ID0ge25vZGU6IHN0YXJ0TGluZSwgb2Zmc2V0OiBzdGFydE9mZnNldH0sIGVuZCA9IG51bGw7CiAgICAgIGlmIChlbmRPZmZzZXQgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRoaXMuY2hlY2tMaW5lKGVuZExpbmUpOwogICAgICAgIGVuZCA9IHtub2RlOiBlbmRMaW5lLCBvZmZzZXQ6IGVuZE9mZnNldH07CiAgICAgIH0KICAgICAgc2VsZWN0LnNldEN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwgc3RhcnQsIGVuZCk7CiAgICAgIHNlbGVjdC5zY3JvbGxUb0N1cnNvcih0aGlzLmNvbnRhaW5lcik7CiAgICB9LAoKICAgIGxpbmVDb250ZW50OiBmdW5jdGlvbihsaW5lKSB7CiAgICAgIHRoaXMuY2hlY2tMaW5lKGxpbmUpOwogICAgICB2YXIgYWNjdW0gPSBbXTsKICAgICAgZm9yIChsaW5lID0gbGluZSA/IGxpbmUubmV4dFNpYmxpbmcgOiB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkOwogICAgICAgICAgIGxpbmUgJiYgbGluZS5ub2RlTmFtZSAhPSAiQlIiOyBsaW5lID0gbGluZS5uZXh0U2libGluZykKICAgICAgICBhY2N1bS5wdXNoKG5vZGVUZXh0KGxpbmUpKTsKICAgICAgcmV0dXJuIGNsZWFuVGV4dChhY2N1bS5qb2luKCIiKSk7CiAgICB9LAoKICAgIHNldExpbmVDb250ZW50OiBmdW5jdGlvbihsaW5lLCBjb250ZW50KSB7CiAgICAgIHRoaXMuaGlzdG9yeS5jb21taXQoKTsKICAgICAgdGhpcy5yZXBsYWNlUmFuZ2Uoe25vZGU6IGxpbmUsIG9mZnNldDogMH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHtub2RlOiBsaW5lLCBvZmZzZXQ6IHRoaXMuaGlzdG9yeS50ZXh0QWZ0ZXIobGluZSkubGVuZ3RofSwKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCk7CiAgICAgIHRoaXMuYWRkRGlydHlOb2RlKGxpbmUpOwogICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICB9LAoKICAgIGluc2VydEludG9MaW5lOiBmdW5jdGlvbihsaW5lLCBwb3NpdGlvbiwgY29udGVudCkgewogICAgICB2YXIgYmVmb3JlID0gbnVsbDsKICAgICAgaWYgKHBvc2l0aW9uID09ICJlbmQiKSB7CiAgICAgICAgYmVmb3JlID0gZW5kT2ZMaW5lKGxpbmUsIHRoaXMuY29udGFpbmVyKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBmb3IgKHZhciBjdXIgPSBsaW5lID8gbGluZS5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7IGN1cjsgY3VyID0gY3VyLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICBpZiAocG9zaXRpb24gPT0gMCkgewogICAgICAgICAgICBiZWZvcmUgPSBjdXI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHRleHQgPSAoY3VyLmlubmVyVGV4dCB8fCBjdXIudGV4dENvbnRlbnQgfHwgY3VyLm5vZGVWYWx1ZSB8fCAiIik7CiAgICAgICAgICBpZiAodGV4dC5sZW5ndGggPiBwb3NpdGlvbikgewogICAgICAgICAgICBiZWZvcmUgPSBjdXIubmV4dFNpYmxpbmc7CiAgICAgICAgICAgIGNvbnRlbnQgPSB0ZXh0LnNsaWNlKDAsIHBvc2l0aW9uKSArIGNvbnRlbnQgKyB0ZXh0LnNsaWNlKHBvc2l0aW9uKTsKICAgICAgICAgICAgcmVtb3ZlRWxlbWVudChjdXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHBvc2l0aW9uIC09IHRleHQubGVuZ3RoOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIGxpbmVzID0gYXNFZGl0b3JMaW5lcyhjb250ZW50KSwgZG9jID0gdGhpcy5jb250YWluZXIub3duZXJEb2N1bWVudDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChpID4gMCkgdGhpcy5jb250YWluZXIuaW5zZXJ0QmVmb3JlKGRvYy5jcmVhdGVFbGVtZW50KCJCUiIpLCBiZWZvcmUpOwogICAgICAgIHRoaXMuY29udGFpbmVyLmluc2VydEJlZm9yZShtYWtlUGFydFNwYW4obGluZXNbaV0sIGRvYyksIGJlZm9yZSk7CiAgICAgIH0KICAgICAgdGhpcy5hZGREaXJ0eU5vZGUobGluZSk7CiAgICAgIHRoaXMuc2NoZWR1bGVIaWdobGlnaHQoKTsKICAgIH0sCgogICAgLy8gUmV0cmlldmUgdGhlIHNlbGVjdGVkIHRleHQuCiAgICBzZWxlY3RlZFRleHQ6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgaCA9IHRoaXMuaGlzdG9yeTsKICAgICAgaC5jb21taXQoKTsKCiAgICAgIHZhciBzdGFydCA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHRydWUpLAogICAgICAgICAgZW5kID0gc2VsZWN0LmN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwgZmFsc2UpOwogICAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHJldHVybiAiIjsKCiAgICAgIGlmIChzdGFydC5ub2RlID09IGVuZC5ub2RlKQogICAgICAgIHJldHVybiBoLnRleHRBZnRlcihzdGFydC5ub2RlKS5zbGljZShzdGFydC5vZmZzZXQsIGVuZC5vZmZzZXQpOwoKICAgICAgdmFyIHRleHQgPSBbaC50ZXh0QWZ0ZXIoc3RhcnQubm9kZSkuc2xpY2Uoc3RhcnQub2Zmc2V0KV07CiAgICAgIGZvciAodmFyIHBvcyA9IGgubm9kZUFmdGVyKHN0YXJ0Lm5vZGUpOyBwb3MgIT0gZW5kLm5vZGU7IHBvcyA9IGgubm9kZUFmdGVyKHBvcykpCiAgICAgICAgdGV4dC5wdXNoKGgudGV4dEFmdGVyKHBvcykpOwogICAgICB0ZXh0LnB1c2goaC50ZXh0QWZ0ZXIoZW5kLm5vZGUpLnNsaWNlKDAsIGVuZC5vZmZzZXQpKTsKICAgICAgcmV0dXJuIGNsZWFuVGV4dCh0ZXh0LmpvaW4oIlxuIikpOwogICAgfSwKCiAgICAvLyBSZXBsYWNlIHRoZSBzZWxlY3Rpb24gd2l0aCBhbm90aGVyIHBpZWNlIG9mIHRleHQuCiAgICByZXBsYWNlU2VsZWN0aW9uOiBmdW5jdGlvbih0ZXh0KSB7CiAgICAgIHRoaXMuaGlzdG9yeS5jb21taXQoKTsKICAgICAgdmFyIHN0YXJ0ID0gc2VsZWN0LmN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwgdHJ1ZSksCiAgICAgICAgICBlbmQgPSBzZWxlY3QuY3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCBmYWxzZSk7CiAgICAgIGlmICghc3RhcnQgfHwgIWVuZCkgcmV0dXJuOwoKICAgICAgZW5kID0gdGhpcy5yZXBsYWNlUmFuZ2Uoc3RhcnQsIGVuZCwgdGV4dCk7CiAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHN0YXJ0LCBlbmQpOwogICAgfSwKCiAgICByZXBsYWNlUmFuZ2U6IGZ1bmN0aW9uKGZyb20sIHRvLCB0ZXh0KSB7CiAgICAgIHZhciBsaW5lcyA9IGFzRWRpdG9yTGluZXModGV4dCk7CiAgICAgIGxpbmVzWzBdID0gdGhpcy5oaXN0b3J5LnRleHRBZnRlcihmcm9tLm5vZGUpLnNsaWNlKDAsIGZyb20ub2Zmc2V0KSArIGxpbmVzWzBdOwogICAgICB2YXIgbGFzdExpbmUgPSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXTsKICAgICAgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPSBsYXN0TGluZSArIHRoaXMuaGlzdG9yeS50ZXh0QWZ0ZXIodG8ubm9kZSkuc2xpY2UodG8ub2Zmc2V0KTsKICAgICAgdmFyIGVuZCA9IHRoaXMuaGlzdG9yeS5ub2RlQWZ0ZXIodG8ubm9kZSk7CiAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZyb20ubm9kZSwgZW5kLCBsaW5lcyk7CiAgICAgIHJldHVybiB7bm9kZTogdGhpcy5oaXN0b3J5Lm5vZGVCZWZvcmUoZW5kKSwKICAgICAgICAgICAgICBvZmZzZXQ6IGxhc3RMaW5lLmxlbmd0aH07CiAgICB9LAoKICAgIGdldFNlYXJjaEN1cnNvcjogZnVuY3Rpb24oc3RyaW5nLCBmcm9tQ3Vyc29yKSB7CiAgICAgIHJldHVybiBuZXcgU2VhcmNoQ3Vyc29yKHRoaXMsIHN0cmluZywgZnJvbUN1cnNvcik7CiAgICB9LAoKICAgIC8vIFJlLWluZGVudCB0aGUgd2hvbGUgYnVmZmVyCiAgICByZWluZGVudDogZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKQogICAgICAgIHRoaXMuaW5kZW50UmVnaW9uKG51bGwsIHRoaXMuY29udGFpbmVyLmxhc3RDaGlsZCk7CiAgICB9LAoKICAgIHJlaW5kZW50U2VsZWN0aW9uOiBmdW5jdGlvbihkaXJlY3Rpb24pIHsKICAgICAgaWYgKCFzZWxlY3Quc29tZXRoaW5nU2VsZWN0ZWQodGhpcy53aW4pKSB7CiAgICAgICAgdGhpcy5pbmRlbnRBdEN1cnNvcihkaXJlY3Rpb24pOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHZhciBzdGFydCA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCB0cnVlKSwKICAgICAgICAgICAgZW5kID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgICBpZiAoc3RhcnQgPT09IGZhbHNlIHx8IGVuZCA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgICB0aGlzLmluZGVudFJlZ2lvbihzdGFydCwgZW5kLCBkaXJlY3Rpb24pOwogICAgICB9CiAgICB9LAoKICAgIGdyYWJLZXlzOiBmdW5jdGlvbihldmVudEhhbmRsZXIsIGZpbHRlcikgewogICAgICB0aGlzLmZyb3plbiA9IGV2ZW50SGFuZGxlcjsKICAgICAgdGhpcy5rZXlGaWx0ZXIgPSBmaWx0ZXI7CiAgICB9LAogICAgdW5ncmFiS2V5czogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuZnJvemVuID0gImxlYXZlIjsKICAgICAgdGhpcy5rZXlGaWx0ZXIgPSBudWxsOwogICAgfSwKCiAgICBzZXRQYXJzZXI6IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgRWRpdG9yLlBhcnNlciA9IHdpbmRvd1tuYW1lXTsKICAgICAgaWYgKHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpIHsKICAgICAgICBmb3JFYWNoKHRoaXMuY29udGFpbmVyLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKG4pIHsKICAgICAgICAgIGlmIChuLm5vZGVUeXBlICE9IDMpIG4uZGlydHkgPSB0cnVlOwogICAgICAgIH0pOwogICAgICAgIHRoaXMuYWRkRGlydHlOb2RlKHRoaXMuZmlyc3RDaGlsZCk7CiAgICAgICAgdGhpcy5zY2hlZHVsZUhpZ2hsaWdodCgpOwogICAgICB9CiAgICB9LAoKICAgIC8vIEludGVyY2VwdCBlbnRlciBhbmQgdGFiLCBhbmQgYXNzaWduIHRoZWlyIG5ldyBmdW5jdGlvbnMuCiAgICBrZXlEb3duOiBmdW5jdGlvbihldmVudCkgewogICAgICBpZiAodGhpcy5mcm96ZW4gPT0gImxlYXZlIikgdGhpcy5mcm96ZW4gPSBudWxsOwogICAgICBpZiAodGhpcy5mcm96ZW4gJiYgKCF0aGlzLmtleUZpbHRlciB8fCB0aGlzLmtleUZpbHRlcihldmVudC5rZXlDb2RlKSkpIHsKICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgICAgdGhpcy5mcm96ZW4oZXZlbnQpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdmFyIGNvZGUgPSBldmVudC5rZXlDb2RlOwogICAgICAvLyBEb24ndCBzY2FuIHdoZW4gdGhlIHVzZXIgaXMgdHlwaW5nLgogICAgICB0aGlzLmRlbGF5U2Nhbm5pbmcoKTsKICAgICAgLy8gU2NoZWR1bGUgYSBwYXJlbi1oaWdobGlnaHQgZXZlbnQsIGlmIGNvbmZpZ3VyZWQuCiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b01hdGNoUGFyZW5zKQogICAgICAgIHRoaXMuc2NoZWR1bGVQYXJlbkJsaW5rKCk7CgogICAgICAvLyBUaGUgdmFyaW91c2NoZWNrcyBmb3IgIWFsdEtleSBhcmUgdGhlcmUgYmVjYXVzZSBBbHRHciBzZXRzIGJvdGgKICAgICAgLy8gY3RybEtleSBhbmQgYWx0S2V5IHRvIHRydWUsIGFuZCBzaG91bGQgbm90IGJlIHJlY29nbmlzZWQgYXMKICAgICAgLy8gQ29udHJvbC4KICAgICAgaWYgKGNvZGUgPT0gMTMpIHsgLy8gZW50ZXIKICAgICAgICBpZiAoZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7CiAgICAgICAgICB0aGlzLnJlcGFyc2VCdWZmZXIoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBzZWxlY3QuaW5zZXJ0TmV3bGluZUF0Q3Vyc29yKHRoaXMud2luKTsKICAgICAgICAgIHRoaXMuaW5kZW50QXRDdXJzb3IoKTsKICAgICAgICAgIHNlbGVjdC5zY3JvbGxUb0N1cnNvcih0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgfQogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjb2RlID09IDkgJiYgdGhpcy5vcHRpb25zLnRhYk1vZGUgIT0gImRlZmF1bHQiKSB7IC8vIHRhYgogICAgICAgIHRoaXMuaGFuZGxlVGFiKCFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSk7CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMzIgJiYgZXZlbnQuc2hpZnRLZXkgJiYgdGhpcy5vcHRpb25zLnRhYk1vZGUgPT0gImRlZmF1bHQiKSB7IC8vIHNwYWNlCiAgICAgICAgdGhpcy5oYW5kbGVUYWIodHJ1ZSk7CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMzYgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7IC8vIGhvbWUKICAgICAgICBpZiAodGhpcy5ob21lKCkpCiAgICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoKGNvZGUgPT0gMjE5IHx8IGNvZGUgPT0gMjIxKSAmJiBldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkpIHsgLy8gWywgXQogICAgICAgIHRoaXMuYmxpbmtQYXJlbnMoZXZlbnQuc2hpZnRLZXkpOwogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmIChldmVudC5tZXRhS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAoY29kZSA9PSAzNyB8fCBjb2RlID09IDM5KSkgeyAvLyBNZXRhLWxlZnQvcmlnaHQKICAgICAgICB2YXIgY3Vyc29yID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIpOwogICAgICAgIGlmIChjdXJzb3IgPT09IGZhbHNlIHx8ICF0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKSByZXR1cm47CgogICAgICAgIGlmIChjb2RlID09IDM3KSBzZWxlY3QuZm9jdXNBZnRlck5vZGUoc3RhcnRPZkxpbmUoY3Vyc29yKSwgdGhpcy5jb250YWluZXIpOwogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIGVuZCA9IGVuZE9mTGluZShjdXJzb3IsIHRoaXMuY29udGFpbmVyKTsKICAgICAgICAgIHNlbGVjdC5mb2N1c0FmdGVyTm9kZShlbmQgPyBlbmQucHJldmlvdXNTaWJsaW5nIDogdGhpcy5jb250YWluZXIubGFzdENoaWxkLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgfQogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiAhZXZlbnQuYWx0S2V5KSB7CiAgICAgICAgaWYgKChldmVudC5zaGlmdEtleSAmJiBjb2RlID09IDkwKSB8fCBjb2RlID09IDg5KSB7IC8vIHNoaWZ0LVosIFkKICAgICAgICAgIHNlbGVjdC5zY3JvbGxUb05vZGUodGhpcy5oaXN0b3J5LnJlZG8oKSk7CiAgICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNvZGUgPT0gOTAgfHwgY29kZSA9PSA4KSB7IC8vIFosIGJhY2tzcGFjZQogICAgICAgICAgc2VsZWN0LnNjcm9sbFRvTm9kZSh0aGlzLmhpc3RvcnkudW5kbygpKTsKICAgICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY29kZSA9PSA4MyAmJiB0aGlzLm9wdGlvbnMuc2F2ZUZ1bmN0aW9uKSB7IC8vIFMKICAgICAgICAgIHRoaXMub3B0aW9ucy5zYXZlRnVuY3Rpb24oKTsKICAgICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLy8gQ2hlY2sgZm9yIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgcmUtaW5kZW50IHRoZSBjdXJyZW50IGxpbmUsCiAgICAvLyBhbmQgcHJldmVudCBPcGVyYSBmcm9tIGhhbmRsaW5nIGVudGVyIGFuZCB0YWIgYW55d2F5LgogICAga2V5UHJlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIHZhciBlbGVjdHJpYyA9IC9pbmRlbnR8ZGVmYXVsdC8udGVzdCh0aGlzLm9wdGlvbnMudGFiTW9kZSkgJiYgRWRpdG9yLlBhcnNlci5lbGVjdHJpY0NoYXJzOwogICAgICAvLyBIYWNrIGZvciBPcGVyYSwgYW5kIEZpcmVmb3ggb24gT1MgWCwgaW4gd2hpY2ggc3RvcHBpbmcgYQogICAgICAvLyBrZXlkb3duIGV2ZW50IGRvZXMgbm90IHByZXZlbnQgdGhlIGFzc29jaWF0ZWQga2V5cHJlc3MgZXZlbnQKICAgICAgLy8gZnJvbSBoYXBwZW5pbmcsIHNvIHdlIGhhdmUgdG8gY2FuY2VsIGVudGVyIGFuZCB0YWIgYWdhaW4KICAgICAgLy8gaGVyZS4KICAgICAgaWYgKCh0aGlzLmZyb3plbiAmJiAoIXRoaXMua2V5RmlsdGVyIHx8IHRoaXMua2V5RmlsdGVyKGV2ZW50LmtleUNvZGUpKSkgfHwKICAgICAgICAgIGV2ZW50LmNvZGUgPT0gMTMgfHwgKGV2ZW50LmNvZGUgPT0gOSAmJiB0aGlzLm9wdGlvbnMudGFiTW9kZSAhPSAiZGVmYXVsdCIpIHx8CiAgICAgICAgICAoZXZlbnQua2V5Q29kZSA9PSAzMiAmJiBldmVudC5zaGlmdEtleSAmJiB0aGlzLm9wdGlvbnMudGFiTW9kZSA9PSAiZGVmYXVsdCIpKQogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgZWxzZSBpZiAoZWxlY3RyaWMgJiYgZWxlY3RyaWMuaW5kZXhPZihldmVudC5jaGFyYWN0ZXIpICE9IC0xKQogICAgICAgIHRoaXMucGFyZW50LnNldFRpbWVvdXQobWV0aG9kKHRoaXMsICJpbmRlbnRBdEN1cnNvciIpLCAwKTsKICAgIH0sCgogICAgLy8gTWFyayB0aGUgbm9kZSBhdCB0aGUgY3Vyc29yIGRpcnR5IHdoZW4gYSBub24tc2FmZSBrZXkgaXMKICAgIC8vIHJlbGVhc2VkLgogICAga2V5VXA6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIHRoaXMuY3Vyc29yQWN0aXZpdHkoaXNTYWZlS2V5KGV2ZW50LmtleUNvZGUpKTsKICAgIH0sCgogICAgLy8gSW5kZW50IHRoZSBsaW5lIGZvbGxvd2luZyBhIGdpdmVuIDxicj4sIG9yIG51bGwgZm9yIHRoZSBmaXJzdAogICAgLy8gbGluZS4gSWYgZ2l2ZW4gYSA8YnI+IGVsZW1lbnQsIHRoaXMgbXVzdCBoYXZlIGJlZW4gaGlnaGxpZ2h0ZWQKICAgIC8vIHNvIHRoYXQgaXQgaGFzIGFuIGluZGVudGF0aW9uIG1ldGhvZC4gUmV0dXJucyB0aGUgd2hpdGVzcGFjZQogICAgLy8gZWxlbWVudCB0aGF0IGhhcyBiZWVuIG1vZGlmaWVkIG9yIGNyZWF0ZWQgKGlmIGFueSkuCiAgICBpbmRlbnRMaW5lQWZ0ZXI6IGZ1bmN0aW9uKHN0YXJ0LCBkaXJlY3Rpb24pIHsKICAgICAgLy8gd2hpdGVTcGFjZSBpcyB0aGUgd2hpdGVzcGFjZSBzcGFuIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSwKICAgICAgLy8gb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIG5vZGUuCiAgICAgIHZhciB3aGl0ZVNwYWNlID0gc3RhcnQgPyBzdGFydC5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgIGlmICh3aGl0ZVNwYWNlICYmICFoYXNDbGFzcyh3aGl0ZVNwYWNlLCAid2hpdGVzcGFjZSIpKQogICAgICAgIHdoaXRlU3BhY2UgPSBudWxsOwoKICAgICAgLy8gU29tZXRpbWVzIHRoZSBzdGFydCBvZiB0aGUgbGluZSBjYW4gaW5mbHVlbmNlIHRoZSBjb3JyZWN0CiAgICAgIC8vIGluZGVudGF0aW9uLCBzbyB3ZSByZXRyaWV2ZSBpdC4KICAgICAgdmFyIGZpcnN0VGV4dCA9IHdoaXRlU3BhY2UgPyB3aGl0ZVNwYWNlLm5leHRTaWJsaW5nIDogKHN0YXJ0ID8gc3RhcnQubmV4dFNpYmxpbmcgOiB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKTsKICAgICAgdmFyIG5leHRDaGFycyA9IChzdGFydCAmJiBmaXJzdFRleHQgJiYgZmlyc3RUZXh0LmN1cnJlbnRUZXh0KSA/IGZpcnN0VGV4dC5jdXJyZW50VGV4dCA6ICIiOwoKICAgICAgLy8gQXNrIHRoZSBsZXhpY2FsIGNvbnRleHQgZm9yIHRoZSBjb3JyZWN0IGluZGVudGF0aW9uLCBhbmQKICAgICAgLy8gY29tcHV0ZSBob3cgbXVjaCB0aGlzIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCBpbmRlbnRhdGlvbi4KICAgICAgdmFyIG5ld0luZGVudCA9IDAsIGN1ckluZGVudCA9IHdoaXRlU3BhY2UgPyB3aGl0ZVNwYWNlLmN1cnJlbnRUZXh0Lmxlbmd0aCA6IDA7CiAgICAgIGlmIChkaXJlY3Rpb24gIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMudGFiTW9kZSA9PSAic2hpZnQiKQogICAgICAgIG5ld0luZGVudCA9IGRpcmVjdGlvbiA/IGN1ckluZGVudCArIGluZGVudFVuaXQgOiBNYXRoLm1heCgwLCBjdXJJbmRlbnQgLSBpbmRlbnRVbml0KQogICAgICBlbHNlIGlmIChzdGFydCkKICAgICAgICBuZXdJbmRlbnQgPSBzdGFydC5pbmRlbnRhdGlvbihuZXh0Q2hhcnMsIGN1ckluZGVudCwgZGlyZWN0aW9uKTsKICAgICAgZWxzZSBpZiAoRWRpdG9yLlBhcnNlci5maXJzdEluZGVudGF0aW9uKQogICAgICAgIG5ld0luZGVudCA9IEVkaXRvci5QYXJzZXIuZmlyc3RJbmRlbnRhdGlvbihuZXh0Q2hhcnMsIGN1ckluZGVudCwgZGlyZWN0aW9uKTsKICAgICAgdmFyIGluZGVudERpZmYgPSBuZXdJbmRlbnQgLSBjdXJJbmRlbnQ7CgogICAgICAvLyBJZiB0aGVyZSBpcyB0b28gbXVjaCwgdGhpcyBpcyBqdXN0IGEgbWF0dGVyIG9mIHNocmlua2luZyBhIHNwYW4uCiAgICAgIGlmIChpbmRlbnREaWZmIDwgMCkgewogICAgICAgIGlmIChuZXdJbmRlbnQgPT0gMCkgewogICAgICAgICAgaWYgKGZpcnN0VGV4dCkgc2VsZWN0LnNuYXBzaG90TW92ZSh3aGl0ZVNwYWNlLmZpcnN0Q2hpbGQsIGZpcnN0VGV4dC5maXJzdENoaWxkLCAwKTsKICAgICAgICAgIHJlbW92ZUVsZW1lbnQod2hpdGVTcGFjZSk7CiAgICAgICAgICB3aGl0ZVNwYWNlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBzZWxlY3Quc25hcHNob3RNb3ZlKHdoaXRlU3BhY2UuZmlyc3RDaGlsZCwgd2hpdGVTcGFjZS5maXJzdENoaWxkLCBpbmRlbnREaWZmLCB0cnVlKTsKICAgICAgICAgIHdoaXRlU3BhY2UuY3VycmVudFRleHQgPSBtYWtlV2hpdGVTcGFjZShuZXdJbmRlbnQpOwogICAgICAgICAgd2hpdGVTcGFjZS5maXJzdENoaWxkLm5vZGVWYWx1ZSA9IHdoaXRlU3BhY2UuY3VycmVudFRleHQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIE5vdCBlbm91Z2guLi4KICAgICAgZWxzZSBpZiAoaW5kZW50RGlmZiA+IDApIHsKICAgICAgICAvLyBJZiB0aGVyZSBpcyB3aGl0ZXNwYWNlLCB3ZSBncm93IGl0LgogICAgICAgIGlmICh3aGl0ZVNwYWNlKSB7CiAgICAgICAgICB3aGl0ZVNwYWNlLmN1cnJlbnRUZXh0ID0gbWFrZVdoaXRlU3BhY2UobmV3SW5kZW50KTsKICAgICAgICAgIHdoaXRlU3BhY2UuZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSB3aGl0ZVNwYWNlLmN1cnJlbnRUZXh0OwogICAgICAgIH0KICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgdG8gYWRkIGEgbmV3IHdoaXRlc3BhY2Ugbm9kZS4KICAgICAgICBlbHNlIHsKICAgICAgICAgIHdoaXRlU3BhY2UgPSBtYWtlUGFydFNwYW4obWFrZVdoaXRlU3BhY2UobmV3SW5kZW50KSwgdGhpcy5kb2MpOwogICAgICAgICAgd2hpdGVTcGFjZS5jbGFzc05hbWUgPSAid2hpdGVzcGFjZSI7CiAgICAgICAgICBpZiAoc3RhcnQpIGluc2VydEFmdGVyKHdoaXRlU3BhY2UsIHN0YXJ0KTsKICAgICAgICAgIGVsc2UgdGhpcy5jb250YWluZXIuaW5zZXJ0QmVmb3JlKHdoaXRlU3BhY2UsIHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpOwogICAgICAgIH0KICAgICAgICBpZiAoZmlyc3RUZXh0KSBzZWxlY3Quc25hcHNob3RNb3ZlKGZpcnN0VGV4dC5maXJzdENoaWxkLCB3aGl0ZVNwYWNlLmZpcnN0Q2hpbGQsIGN1ckluZGVudCwgZmFsc2UsIHRydWUpOwogICAgICB9CiAgICAgIGlmIChpbmRlbnREaWZmICE9IDApIHRoaXMuYWRkRGlydHlOb2RlKHN0YXJ0KTsKICAgICAgcmV0dXJuIHdoaXRlU3BhY2U7CiAgICB9LAoKICAgIC8vIFJlLWhpZ2hsaWdodCB0aGUgc2VsZWN0ZWQgcGFydCBvZiB0aGUgZG9jdW1lbnQuCiAgICBoaWdobGlnaHRBdEN1cnNvcjogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBwb3MgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgdHJ1ZSk7CiAgICAgIHZhciB0byA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCBmYWxzZSk7CiAgICAgIGlmIChwb3MgPT09IGZhbHNlIHx8IHRvID09PSBmYWxzZSkgcmV0dXJuOwoKICAgICAgc2VsZWN0Lm1hcmtTZWxlY3Rpb24odGhpcy53aW4pOwogICAgICBpZiAodGhpcy5oaWdobGlnaHQocG9zLCBlbmRPZkxpbmUodG8sIHRoaXMuY29udGFpbmVyKSwgdHJ1ZSwgMjApID09PSBmYWxzZSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIHNlbGVjdC5zZWxlY3RNYXJrZWQoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAoKICAgIC8vIFdoZW4gdGFiIGlzIHByZXNzZWQgd2l0aCB0ZXh0IHNlbGVjdGVkLCB0aGUgd2hvbGUgc2VsZWN0aW9uIGlzCiAgICAvLyByZS1pbmRlbnRlZCwgd2hlbiBub3RoaW5nIGlzIHNlbGVjdGVkLCB0aGUgbGluZSB3aXRoIHRoZSBjdXJzb3IKICAgIC8vIGlzIHJlLWluZGVudGVkLgogICAgaGFuZGxlVGFiOiBmdW5jdGlvbihkaXJlY3Rpb24pIHsKICAgICAgaWYgKHRoaXMub3B0aW9ucy50YWJNb2RlID09ICJzcGFjZXMiKQogICAgICAgIHNlbGVjdC5pbnNlcnRUYWJBdEN1cnNvcih0aGlzLndpbik7CiAgICAgIGVsc2UKICAgICAgICB0aGlzLnJlaW5kZW50U2VsZWN0aW9uKGRpcmVjdGlvbik7CiAgICB9LAoKICAgIGhvbWU6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgY3VyID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIHRydWUpLCBzdGFydCA9IGN1cjsKICAgICAgaWYgKGN1ciA9PT0gZmFsc2UgfHwgISghY3VyIHx8IGN1ci5pc1BhcnQgfHwgY3VyLm5vZGVOYW1lID09ICJCUiIpIHx8ICF0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKQogICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgIHdoaWxlIChjdXIgJiYgY3VyLm5vZGVOYW1lICE9ICJCUiIpIGN1ciA9IGN1ci5wcmV2aW91c1NpYmxpbmc7CiAgICAgIHZhciBuZXh0ID0gY3VyID8gY3VyLm5leHRTaWJsaW5nIDogdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgaWYgKG5leHQgJiYgbmV4dCAhPSBzdGFydCAmJiBuZXh0LmlzUGFydCAmJiBoYXNDbGFzcyhuZXh0LCAid2hpdGVzcGFjZSIpKQogICAgICAgIHNlbGVjdC5mb2N1c0FmdGVyTm9kZShuZXh0LCB0aGlzLmNvbnRhaW5lcik7CiAgICAgIGVsc2UKICAgICAgICBzZWxlY3QuZm9jdXNBZnRlck5vZGUoY3VyLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSwKCiAgICAvLyBEZWxheSAob3IgaW5pdGlhdGUpIHRoZSBuZXh0IHBhcmVuIGJsaW5rIGV2ZW50LgogICAgc2NoZWR1bGVQYXJlbkJsaW5rOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMucGFyZW5FdmVudCkgdGhpcy5wYXJlbnQuY2xlYXJUaW1lb3V0KHRoaXMucGFyZW5FdmVudCk7CiAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgdGhpcy5wYXJlbkV2ZW50ID0gdGhpcy5wYXJlbnQuc2V0VGltZW91dChmdW5jdGlvbigpe3NlbGYuYmxpbmtQYXJlbnMoKTt9LCAzMDApOwogICAgfSwKCiAgICAvLyBUYWtlIHRoZSB0b2tlbiBiZWZvcmUgdGhlIGN1cnNvci4gSWYgaXQgY29udGFpbnMgYSBjaGFyYWN0ZXIgaW4KICAgIC8vICcoKVtde30nLCBzZWFyY2ggZm9yIHRoZSBtYXRjaGluZyBwYXJlbi9icmFjZS9icmFja2V0LCBhbmQKICAgIC8vIGhpZ2hsaWdodCB0aGVtIGluIGdyZWVuIGZvciBhIG1vbWVudCwgb3IgcmVkIGlmIG5vIHByb3BlciBtYXRjaAogICAgLy8gd2FzIGZvdW5kLgogICAgYmxpbmtQYXJlbnM6IGZ1bmN0aW9uKGp1bXApIHsKICAgICAgaWYgKCF3aW5kb3cuc2VsZWN0KSByZXR1cm47CiAgICAgIC8vIENsZWFyIHRoZSBldmVudCBwcm9wZXJ0eS4KICAgICAgaWYgKHRoaXMucGFyZW5FdmVudCkgdGhpcy5wYXJlbnQuY2xlYXJUaW1lb3V0KHRoaXMucGFyZW5FdmVudCk7CiAgICAgIHRoaXMucGFyZW5FdmVudCA9IG51bGw7CgogICAgICAvLyBFeHRyYWN0IGEgJ3BhcmVuJyBmcm9tIGEgcGllY2Ugb2YgdGV4dC4KICAgICAgZnVuY3Rpb24gcGFyZW4obm9kZSkgewogICAgICAgIGlmIChub2RlLmN1cnJlbnRUZXh0KSB7CiAgICAgICAgICB2YXIgbWF0Y2ggPSBub2RlLmN1cnJlbnRUZXh0Lm1hdGNoKC9eW1xzXHUwMGEwXSooW1woXClcW1xde31dKVtcc1x1MDBhMF0qJC8pOwogICAgICAgICAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzFdOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBEZXRlcm1pbmUgdGhlIGRpcmVjdGlvbiBhIHBhcmVuIGlzIGZhY2luZy4KICAgICAgZnVuY3Rpb24gZm9yd2FyZChjaCkgewogICAgICAgIHJldHVybiAvW1woXFtce10vLnRlc3QoY2gpOwogICAgICB9CgogICAgICB2YXIgY2gsIHNlbGYgPSB0aGlzLCBjdXJzb3IgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgdHJ1ZSk7CiAgICAgIGlmICghY3Vyc29yIHx8ICF0aGlzLmhpZ2hsaWdodEF0Q3Vyc29yKCkpIHJldHVybjsKICAgICAgY3Vyc29yID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIHRydWUpOwogICAgICBpZiAoIShjdXJzb3IgJiYgKChjaCA9IHBhcmVuKGN1cnNvcikpIHx8IChjdXJzb3IgPSBjdXJzb3IubmV4dFNpYmxpbmcpICYmIChjaCA9IHBhcmVuKGN1cnNvcikpKSkpCiAgICAgICAgcmV0dXJuOwogICAgICAvLyBXZSBvbmx5IGxvb2sgZm9yIHRva2VucyB3aXRoIHRoZSBzYW1lIGNsYXNzTmFtZS4KICAgICAgdmFyIGNsYXNzTmFtZSA9IGN1cnNvci5jbGFzc05hbWUsIGRpciA9IGZvcndhcmQoY2gpLCBtYXRjaCA9IG1hdGNoaW5nW2NoXTsKCiAgICAgIC8vIFNpbmNlIHBhcnRzIG9mIHRoZSBkb2N1bWVudCBtaWdodCBub3QgaGF2ZSBiZWVuIHByb3Blcmx5CiAgICAgIC8vIGhpZ2hsaWdodGVkLCBhbmQgaXQgaXMgaGFyZCB0byBrbm93IGluIGFkdmFuY2Ugd2hpY2ggcGFydCB3ZQogICAgICAvLyBoYXZlIHRvIHNjYW4sIHdlIGp1c3QgdHJ5LCBhbmQgd2hlbiB3ZSBmaW5kIGRpcnR5IG5vZGVzIHdlCiAgICAgIC8vIGFib3J0LCBwYXJzZSB0aGVtLCBhbmQgcmUtdHJ5LgogICAgICBmdW5jdGlvbiB0cnlGaW5kTWF0Y2goKSB7CiAgICAgICAgdmFyIHN0YWNrID0gW10sIGNoLCBvayA9IHRydWU7OwogICAgICAgIGZvciAodmFyIHJ1bm5lciA9IGN1cnNvcjsgcnVubmVyOyBydW5uZXIgPSBkaXIgPyBydW5uZXIubmV4dFNpYmxpbmcgOiBydW5uZXIucHJldmlvdXNTaWJsaW5nKSB7CiAgICAgICAgICBpZiAocnVubmVyLmNsYXNzTmFtZSA9PSBjbGFzc05hbWUgJiYgcnVubmVyLm5vZGVOYW1lID09ICJTUEFOIiAmJiAoY2ggPSBwYXJlbihydW5uZXIpKSkgewogICAgICAgICAgICBpZiAoZm9yd2FyZChjaCkgPT0gZGlyKQogICAgICAgICAgICAgIHN0YWNrLnB1c2goY2gpOwogICAgICAgICAgICBlbHNlIGlmICghc3RhY2subGVuZ3RoKQogICAgICAgICAgICAgIG9rID0gZmFsc2U7CiAgICAgICAgICAgIGVsc2UgaWYgKHN0YWNrLnBvcCgpICE9IG1hdGNoaW5nW2NoXSkKICAgICAgICAgICAgICBvayA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXN0YWNrLmxlbmd0aCkgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmIChydW5uZXIuZGlydHkgfHwgcnVubmVyLm5vZGVOYW1lICE9ICJTUEFOIiAmJiBydW5uZXIubm9kZU5hbWUgIT0gIkJSIikgewogICAgICAgICAgICByZXR1cm4ge25vZGU6IHJ1bm5lciwgc3RhdHVzOiAiZGlydHkifTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHtub2RlOiBydW5uZXIsIHN0YXR1czogcnVubmVyICYmIG9rfTsKICAgICAgfQogICAgICAvLyBUZW1wb3JhcmlseSBnaXZlIHRoZSByZWxldmFudCBub2RlcyBhIGNvbG91ci4KICAgICAgZnVuY3Rpb24gYmxpbmsobm9kZSwgb2spIHsKICAgICAgICBub2RlLnN0eWxlLmZvbnRXZWlnaHQgPSAiYm9sZCI7CiAgICAgICAgbm9kZS5zdHlsZS5jb2xvciA9IG9rID8gIiM4RjgiIDogIiNGODgiOwogICAgICAgIHNlbGYucGFyZW50LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7bm9kZS5zdHlsZS5mb250V2VpZ2h0ID0gIiI7IG5vZGUuc3R5bGUuY29sb3IgPSAiIjt9LCA1MDApOwogICAgICB9CgogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIHZhciBmb3VuZCA9IHRyeUZpbmRNYXRjaCgpOwogICAgICAgIGlmIChmb3VuZC5zdGF0dXMgPT0gImRpcnR5IikgewogICAgICAgICAgdGhpcy5oaWdobGlnaHQoZm91bmQubm9kZSwgZW5kT2ZMaW5lKGZvdW5kLm5vZGUpKTsKICAgICAgICAgIC8vIE5lZWRlZCBiZWNhdXNlIGluIHNvbWUgY29ybmVyIGNhc2VzIGEgaGlnaGxpZ2h0IGRvZXMgbm90CiAgICAgICAgICAvLyByZWFjaCBhIG5vZGUuCiAgICAgICAgICBmb3VuZC5ub2RlLmRpcnR5ID0gZmFsc2U7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBibGluayhjdXJzb3IsIGZvdW5kLnN0YXR1cyk7CiAgICAgICAgICBpZiAoZm91bmQubm9kZSkgewogICAgICAgICAgICBibGluayhmb3VuZC5ub2RlLCBmb3VuZC5zdGF0dXMpOwogICAgICAgICAgICBpZiAoanVtcCkgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlKGZvdW5kLm5vZGUucHJldmlvdXNTaWJsaW5nLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLy8gQWRqdXN0IHRoZSBhbW91bnQgb2Ygd2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgdGhhdAogICAgLy8gdGhlIGN1cnNvciBpcyBvbiBzbyB0aGF0IGl0IGlzIGluZGVudGVkIHByb3Blcmx5LgogICAgaW5kZW50QXRDdXJzb3I6IGZ1bmN0aW9uKGRpcmVjdGlvbikgewogICAgICBpZiAoIXRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpIHJldHVybjsKICAgICAgLy8gVGhlIGxpbmUgaGFzIHRvIGhhdmUgdXAtdG8tZGF0ZSBsZXhpY2FsIGluZm9ybWF0aW9uLCBzbyB3ZQogICAgICAvLyBoaWdobGlnaHQgaXQgZmlyc3QuCiAgICAgIGlmICghdGhpcy5oaWdobGlnaHRBdEN1cnNvcigpKSByZXR1cm47CiAgICAgIHZhciBjdXJzb3IgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgZmFsc2UpOwogICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBkZXRlcm1pbmUgdGhlIHBsYWNlIG9mIHRoZSBjdXJzb3IsCiAgICAgIC8vIHRoZXJlJ3Mgbm90aGluZyB0byBpbmRlbnQuCiAgICAgIGlmIChjdXJzb3IgPT09IGZhbHNlKQogICAgICAgIHJldHVybjsKICAgICAgdmFyIGxpbmVTdGFydCA9IHN0YXJ0T2ZMaW5lKGN1cnNvcik7CiAgICAgIHZhciB3aGl0ZVNwYWNlID0gdGhpcy5pbmRlbnRMaW5lQWZ0ZXIobGluZVN0YXJ0LCBkaXJlY3Rpb24pOwogICAgICBpZiAoY3Vyc29yID09IGxpbmVTdGFydCAmJiB3aGl0ZVNwYWNlKQogICAgICAgICAgY3Vyc29yID0gd2hpdGVTcGFjZTsKICAgICAgLy8gVGhpcyBtZWFucyB0aGUgaW5kZW50YXRpb24gaGFzIHByb2JhYmx5IG1lc3NlZCB1cCB0aGUgY3Vyc29yLgogICAgICBpZiAoY3Vyc29yID09IHdoaXRlU3BhY2UpCiAgICAgICAgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlKGN1cnNvciwgdGhpcy5jb250YWluZXIpOwogICAgfSwKCiAgICAvLyBJbmRlbnQgYWxsIGxpbmVzIHdob3NlIHN0YXJ0IGZhbGxzIGluc2lkZSBvZiB0aGUgY3VycmVudAogICAgLy8gc2VsZWN0aW9uLgogICAgaW5kZW50UmVnaW9uOiBmdW5jdGlvbihzdGFydCwgZW5kLCBkaXJlY3Rpb24pIHsKICAgICAgdmFyIGN1cnJlbnQgPSAoc3RhcnQgPSBzdGFydE9mTGluZShzdGFydCkpLCBiZWZvcmUgPSBzdGFydCAmJiBzdGFydE9mTGluZShzdGFydC5wcmV2aW91c1NpYmxpbmcpOwogICAgICBpZiAoZW5kLm5vZGVOYW1lICE9ICJCUiIpIGVuZCA9IGVuZE9mTGluZShlbmQsIHRoaXMuY29udGFpbmVyKTsKCiAgICAgIGRvIHsKICAgICAgICB2YXIgbmV4dCA9IGVuZE9mTGluZShjdXJyZW50LCB0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgaWYgKGN1cnJlbnQpIHRoaXMuaGlnaGxpZ2h0KGJlZm9yZSwgbmV4dCwgdHJ1ZSk7CiAgICAgICAgdGhpcy5pbmRlbnRMaW5lQWZ0ZXIoY3VycmVudCwgZGlyZWN0aW9uKTsKICAgICAgICBiZWZvcmUgPSBjdXJyZW50OwogICAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgICB9IHdoaWxlIChjdXJyZW50ICE9IGVuZCk7CiAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHtub2RlOiBzdGFydCwgb2Zmc2V0OiAwfSwge25vZGU6IGVuZCwgb2Zmc2V0OiAwfSk7CiAgICB9LAoKICAgIC8vIEZpbmQgdGhlIG5vZGUgdGhhdCB0aGUgY3Vyc29yIGlzIGluLCBtYXJrIGl0IGFzIGRpcnR5LCBhbmQgbWFrZQogICAgLy8gc3VyZSBhIGhpZ2hsaWdodCBwYXNzIGlzIHNjaGVkdWxlZC4KICAgIGN1cnNvckFjdGl2aXR5OiBmdW5jdGlvbihzYWZlKSB7CiAgICAgIGlmIChpbnRlcm5ldEV4cGxvcmVyKSB7CiAgICAgICAgdGhpcy5jb250YWluZXIuY3JlYXRlVGV4dFJhbmdlKCkuZXhlY0NvbW1hbmQoInVubGluayIpOwogICAgICAgIHRoaXMuc2VsZWN0aW9uU25hcHNob3QgPSBzZWxlY3Quc2VsZWN0aW9uQ29vcmRzKHRoaXMud2luKTsKICAgICAgfQoKICAgICAgdmFyIGFjdGl2aXR5ID0gdGhpcy5vcHRpb25zLmN1cnNvckFjdGl2aXR5OwogICAgICBpZiAoIXNhZmUgfHwgYWN0aXZpdHkpIHsKICAgICAgICB2YXIgY3Vyc29yID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgICBpZiAoY3Vyc29yID09PSBmYWxzZSB8fCAhdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCkgcmV0dXJuOwogICAgICAgIGN1cnNvciA9IGN1cnNvciB8fCB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkOwogICAgICAgIGlmIChhY3Rpdml0eSkgYWN0aXZpdHkoY3Vyc29yKTsKICAgICAgICBpZiAoIXNhZmUpIHsKICAgICAgICAgIHRoaXMuc2NoZWR1bGVIaWdobGlnaHQoKTsKICAgICAgICAgIHRoaXMuYWRkRGlydHlOb2RlKGN1cnNvcik7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIHJlcGFyc2VCdWZmZXI6IGZ1bmN0aW9uKCkgewogICAgICBmb3JFYWNoKHRoaXMuY29udGFpbmVyLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHtub2RlLmRpcnR5ID0gdHJ1ZTt9KTsKICAgICAgaWYgKHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgdGhpcy5hZGREaXJ0eU5vZGUodGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCk7CiAgICB9LAoKICAgIC8vIEFkZCBhIG5vZGUgdG8gdGhlIHNldCBvZiBkaXJ0eSBub2RlcywgaWYgaXQgaXNuJ3QgYWxyZWFkeSBpbgogICAgLy8gdGhlcmUuCiAgICBhZGREaXJ0eU5vZGU6IGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgbm9kZSA9IG5vZGUgfHwgdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgaWYgKCFub2RlKSByZXR1cm47CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlydHkubGVuZ3RoOyBpKyspCiAgICAgICAgaWYgKHRoaXMuZGlydHlbaV0gPT0gbm9kZSkgcmV0dXJuOwoKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMykKICAgICAgICBub2RlLmRpcnR5ID0gdHJ1ZTsKICAgICAgdGhpcy5kaXJ0eS5wdXNoKG5vZGUpOwogICAgfSwKCiAgICAvLyBDYXVzZSBhIGhpZ2hsaWdodCBwYXNzIHRvIGhhcHBlbiBpbiBvcHRpb25zLnBhc3NEZWxheQogICAgLy8gbWlsbGlzZWNvbmRzLiBDbGVhciB0aGUgZXhpc3RpbmcgdGltZW91dCwgaWYgb25lIGV4aXN0cy4gVGhpcwogICAgLy8gd2F5LCB0aGUgcGFzc2VzIGRvIG5vdCBoYXBwZW4gd2hpbGUgdGhlIHVzZXIgaXMgdHlwaW5nLCBhbmQKICAgIC8vIHNob3VsZCBhcyB1bm9idHJ1c2l2ZSBhcyBwb3NzaWJsZS4KICAgIHNjaGVkdWxlSGlnaGxpZ2h0OiBmdW5jdGlvbigpIHsKICAgICAgLy8gVGltZW91dHMgYXJlIHJvdXRlZCB0aHJvdWdoIHRoZSBwYXJlbnQgd2luZG93LCBiZWNhdXNlIG9uCiAgICAgIC8vIHNvbWUgYnJvd3NlcnMgZGVzaWduTW9kZSB3aW5kb3dzIGRvIG5vdCBmaXJlIHRpbWVvdXRzLgogICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgIHRoaXMucGFyZW50LmNsZWFyVGltZW91dCh0aGlzLmhpZ2hsaWdodFRpbWVvdXQpOwogICAgICB0aGlzLmhpZ2hsaWdodFRpbWVvdXQgPSB0aGlzLnBhcmVudC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VsZi5oaWdobGlnaHREaXJ0eSgpO30sIHRoaXMub3B0aW9ucy5wYXNzRGVsYXkpOwogICAgfSwKCiAgICAvLyBGZXRjaCBvbmUgZGlydHkgbm9kZSwgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBkaXJ0eSBzZXQuCiAgICBnZXREaXJ0eU5vZGU6IGZ1bmN0aW9uKCkgewogICAgICB3aGlsZSAodGhpcy5kaXJ0eS5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIGZvdW5kID0gdGhpcy5kaXJ0eS5wb3AoKTsKICAgICAgICAvLyBJRTggc29tZXRpbWVzIHRocm93cyBhbiB1bmV4cGxhaW5hYmxlICdpbnZhbGlkIGFyZ3VtZW50JwogICAgICAgIC8vIGV4Y2VwdGlvbiBmb3IgZm91bmQucGFyZW50Tm9kZQogICAgICAgIHRyeSB7CiAgICAgICAgICAvLyBJZiB0aGUgbm9kZSBoYXMgYmVlbiBjb2xvdXJlZCBpbiB0aGUgbWVhbnRpbWUsIG9yIGlzIG5vCiAgICAgICAgICAvLyBsb25nZXIgaW4gdGhlIGRvY3VtZW50LCBpdCBzaG91bGQgbm90IGJlIHJldHVybmVkLgogICAgICAgICAgd2hpbGUgKGZvdW5kICYmIGZvdW5kLnBhcmVudE5vZGUgIT0gdGhpcy5jb250YWluZXIpCiAgICAgICAgICAgIGZvdW5kID0gZm91bmQucGFyZW50Tm9kZQogICAgICAgICAgaWYgKGZvdW5kICYmIChmb3VuZC5kaXJ0eSB8fCBmb3VuZC5ub2RlVHlwZSA9PSAzKSkKICAgICAgICAgICAgcmV0dXJuIGZvdW5kOwogICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9LAoKICAgIC8vIFBpY2sgZGlydHkgbm9kZXMsIGFuZCBoaWdobGlnaHQgdGhlbSwgdW50aWwgb3B0aW9ucy5wYXNzVGltZQogICAgLy8gbWlsbGlzZWNvbmRzIGhhdmUgZ29uZSBieS4gVGhlIGhpZ2hsaWdodCBtZXRob2Qgd2lsbCBjb250aW51ZQogICAgLy8gdG8gbmV4dCBsaW5lcyBhcyBsb25nIGFzIGl0IGZpbmRzIGRpcnR5IG5vZGVzLiBJdCByZXR1cm5zCiAgICAvLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGxhY2Ugd2hlcmUgaXQgc3RvcHBlZC4gSWYgdGhlcmUgYXJlCiAgICAvLyBkaXJ0eSBub2RlcyBsZWZ0IGFmdGVyIHRoaXMgZnVuY3Rpb24gaGFzIHNwZW50IGFsbCBpdHMgbGluZXMsCiAgICAvLyBpdCBzaGVkdWxlcyBhbm90aGVyIGhpZ2hsaWdodCB0byBmaW5pc2ggdGhlIGpvYi4KICAgIGhpZ2hsaWdodERpcnR5OiBmdW5jdGlvbihmb3JjZSkgewogICAgICAvLyBQcmV2ZW50IEZGIGZyb20gcmFpc2luZyBhbiBlcnJvciB3aGVuIGl0IGlzIGZpcmluZyB0aW1lb3V0cwogICAgICAvLyBvbiBhIHBhZ2UgdGhhdCdzIG5vIGxvbmdlciBsb2FkZWQuCiAgICAgIGlmICghd2luZG93LnNlbGVjdCkgcmV0dXJuOwoKICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucmVhZE9ubHkpIHNlbGVjdC5tYXJrU2VsZWN0aW9uKHRoaXMud2luKTsKICAgICAgdmFyIHN0YXJ0LCBlbmRUaW1lID0gZm9yY2UgPyBudWxsIDogdGltZSgpICsgdGhpcy5vcHRpb25zLnBhc3NUaW1lOwogICAgICB3aGlsZSAodGltZSgpIDwgZW5kVGltZSAmJiAoc3RhcnQgPSB0aGlzLmdldERpcnR5Tm9kZSgpKSkgewogICAgICAgIHZhciByZXN1bHQgPSB0aGlzLmhpZ2hsaWdodChzdGFydCwgZW5kVGltZSk7CiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQubm9kZSAmJiByZXN1bHQuZGlydHkpCiAgICAgICAgICB0aGlzLmFkZERpcnR5Tm9kZShyZXN1bHQubm9kZSk7CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucmVhZE9ubHkpIHNlbGVjdC5zZWxlY3RNYXJrZWQoKTsKICAgICAgaWYgKHN0YXJ0KSB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICAgIHJldHVybiB0aGlzLmRpcnR5Lmxlbmd0aCA9PSAwOwogICAgfSwKCiAgICAvLyBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQgdGhyb3VnaCBhIHRpbWVvdXQsIHdpbGwKICAgIC8vIGNvbnRpbnVvdXNseSByZS1wYXJzZSB0aGUgZG9jdW1lbnQuCiAgICBkb2N1bWVudFNjYW5uZXI6IGZ1bmN0aW9uKHBhc3NUaW1lKSB7CiAgICAgIHZhciBzZWxmID0gdGhpcywgcG9zID0gbnVsbDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIC8vIEZGIHRpbWVvdXQgd2VpcmRuZXNzIHdvcmthcm91bmQuCiAgICAgICAgaWYgKCF3aW5kb3cuc2VsZWN0KSByZXR1cm47CiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50Li4uIG9oCiAgICAgICAgLy8gd2VsbCwgd2Ugc3RhcnQgb3Zlci4KICAgICAgICBpZiAocG9zICYmIHBvcy5wYXJlbnROb2RlICE9IHNlbGYuY29udGFpbmVyKQogICAgICAgICAgcG9zID0gbnVsbDsKICAgICAgICBzZWxlY3QubWFya1NlbGVjdGlvbihzZWxmLndpbik7CiAgICAgICAgdmFyIHJlc3VsdCA9IHNlbGYuaGlnaGxpZ2h0KHBvcywgdGltZSgpICsgcGFzc1RpbWUsIHRydWUpOwogICAgICAgIHNlbGVjdC5zZWxlY3RNYXJrZWQoKTsKICAgICAgICB2YXIgbmV3UG9zID0gcmVzdWx0ID8gKHJlc3VsdC5ub2RlICYmIHJlc3VsdC5ub2RlLm5leHRTaWJsaW5nKSA6IG51bGw7CiAgICAgICAgcG9zID0gKHBvcyA9PSBuZXdQb3MpID8gbnVsbCA6IG5ld1BvczsKICAgICAgICBzZWxmLmRlbGF5U2Nhbm5pbmcoKTsKICAgICAgfTsKICAgIH0sCgogICAgLy8gU3RhcnRzIHRoZSBjb250aW51b3VzIHNjYW5uaW5nIHByb2Nlc3MgZm9yIHRoaXMgZG9jdW1lbnQgYWZ0ZXIKICAgIC8vIGEgZ2l2ZW4gaW50ZXJ2YWwuCiAgICBkZWxheVNjYW5uaW5nOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuc2Nhbm5lcikgewogICAgICAgIHRoaXMucGFyZW50LmNsZWFyVGltZW91dCh0aGlzLmRvY3VtZW50U2Nhbik7CiAgICAgICAgdGhpcy5kb2N1bWVudFNjYW4gPSB0aGlzLnBhcmVudC5zZXRUaW1lb3V0KHRoaXMuc2Nhbm5lciwgdGhpcy5vcHRpb25zLmNvbnRpbnVvdXNTY2FubmluZyk7CiAgICAgIH0KICAgIH0sCgogICAgLy8gVGhlIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgYWN0dWFsIGhpZ2hsaWdodGluZy9jb2xvdXJpbmcgKHdpdGgKICAgIC8vIGhlbHAgZnJvbSB0aGUgcGFyc2VyIGFuZCB0aGUgRE9NIG5vcm1hbGl6ZXIpLiBJdHMgaW50ZXJmYWNlIGlzCiAgICAvLyByYXRoZXIgb3ZlcmNvbXBsaWNhdGVkLCBiZWNhdXNlIGl0IGlzIHVzZWQgaW4gZGlmZmVyZW50CiAgICAvLyBzaXR1YXRpb25zOiBlbnN1cmluZyB0aGF0IGEgY2VydGFpbiBsaW5lIGlzIGhpZ2hsaWdodGVkLCBvcgogICAgLy8gaGlnaGxpZ2h0aW5nIHVwIHRvIFggbWlsbGlzZWNvbmRzIHN0YXJ0aW5nIGZyb20gYSBjZXJ0YWluCiAgICAvLyBwb2ludC4gVGhlICdmcm9tJyBhcmd1bWVudCBnaXZlcyB0aGUgbm9kZSBhdCB3aGljaCBpdCBzaG91bGQKICAgIC8vIHN0YXJ0LiBJZiB0aGlzIGlzIG51bGwsIGl0IHdpbGwgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKICAgIC8vIGRvY3VtZW50LiBXaGVuIGEgdGltZXN0YW1wIGlzIGdpdmVuIHdpdGggdGhlICd0YXJnZXQnIGFyZ3VtZW50LAogICAgLy8gaXQgd2lsbCBzdG9wIGhpZ2hsaWdodGluZyBhdCB0aGF0IHRpbWUuIElmIHRoaXMgYXJndW1lbnQgaG9sZHMKICAgIC8vIGEgRE9NIG5vZGUsIGl0IHdpbGwgaGlnaGxpZ2h0IHVudGlsIGl0IHJlYWNoZXMgdGhhdCBub2RlLiBJZiBhdAogICAgLy8gYW55IHRpbWUgaXQgY29tZXMgYWNyb3NzIHR3byAnY2xlYW4nIGxpbmVzIChubyBkaXJ0eSBub2RlcyksIGl0CiAgICAvLyB3aWxsIHN0b3AsIGV4Y2VwdCB3aGVuICdjbGVhbkxpbmVzJyBpcyB0cnVlLiBtYXhCYWNrdHJhY2sgaXMKICAgIC8vIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBiYWNrdHJhY2sgdG8gZmluZCBhbiBleGlzdGluZwogICAgLy8gcGFyc2VyIGluc3RhbmNlLiBUaGlzIGlzIHVzZWQgdG8gZ2l2ZSB1cCBpbiBzaXR1YXRpb25zIHdoZXJlIGEKICAgIC8vIGhpZ2hsaWdodCB3b3VsZCB0YWtlIHRvbyBsb25nIGFuZCBmcmVlemUgdGhlIGJyb3dzZXIgaW50ZXJmYWNlLgogICAgaGlnaGxpZ2h0OiBmdW5jdGlvbihmcm9tLCB0YXJnZXQsIGNsZWFuTGluZXMsIG1heEJhY2t0cmFjayl7CiAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lciwgc2VsZiA9IHRoaXMsIGFjdGl2ZSA9IHRoaXMub3B0aW9ucy5hY3RpdmVUb2tlbnM7CiAgICAgIHZhciBlbmRUaW1lID0gKHR5cGVvZiB0YXJnZXQgPT0gIm51bWJlciIgPyB0YXJnZXQgOiBudWxsKTsKCiAgICAgIGlmICghY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgcmV0dXJuOwogICAgICAvLyBCYWNrdHJhY2sgdG8gdGhlIGZpcnN0IG5vZGUgYmVmb3JlIGZyb20gdGhhdCBoYXMgYSBwYXJ0aWFsCiAgICAgIC8vIHBhcnNlIHN0b3JlZC4KICAgICAgd2hpbGUgKGZyb20gJiYgKCFmcm9tLnBhcnNlckZyb21IZXJlIHx8IGZyb20uZGlydHkpKSB7CiAgICAgICAgaWYgKG1heEJhY2t0cmFjayAhPSBudWxsICYmIGZyb20ubm9kZU5hbWUgPT0gIkJSIiAmJiAoLS1tYXhCYWNrdHJhY2spIDwgMCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBmcm9tID0gZnJvbS5wcmV2aW91c1NpYmxpbmc7CiAgICAgIH0KICAgICAgLy8gSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LCBkbyBub3RoaW5nLgogICAgICBpZiAoZnJvbSAmJiAhZnJvbS5uZXh0U2libGluZykKICAgICAgICByZXR1cm47CgogICAgICAvLyBDaGVjayB3aGV0aGVyIGEgcGFydCAoPHNwYW4+IG5vZGUpIGFuZCB0aGUgY29ycmVzcG9uZGluZyB0b2tlbgogICAgICAvLyBtYXRjaC4KICAgICAgZnVuY3Rpb24gY29ycmVjdFBhcnQodG9rZW4sIHBhcnQpewogICAgICAgIHJldHVybiAhcGFydC5yZWR1Y2VkICYmIHBhcnQuY3VycmVudFRleHQgPT0gdG9rZW4udmFsdWUgJiYgcGFydC5jbGFzc05hbWUgPT0gdG9rZW4uc3R5bGU7CiAgICAgIH0KICAgICAgLy8gU2hvcnRlbiB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0IGJ5IGNob3BwaW5nIG9mZgogICAgICAvLyBjaGFyYWN0ZXJzIGZyb20gdGhlIGZyb250LiBOb3RlIHRoYXQgb25seSB0aGUgY3VycmVudFRleHQKICAgICAgLy8gcHJvcGVydHkgZ2V0cyBjaGFuZ2VkLiBGb3IgZWZmaWNpZW5jeSByZWFzb25zLCB3ZSBsZWF2ZSB0aGUKICAgICAgLy8gbm9kZVZhbHVlIGFsb25lIC0tIHdlIHNldCB0aGUgcmVkdWNlZCBmbGFnIHRvIGluZGljYXRlIHRoYXQKICAgICAgLy8gdGhpcyBwYXJ0IG11c3QgYmUgcmVwbGFjZWQuCiAgICAgIGZ1bmN0aW9uIHNob3J0ZW5QYXJ0KHBhcnQsIG1pbnVzKXsKICAgICAgICBwYXJ0LmN1cnJlbnRUZXh0ID0gcGFydC5jdXJyZW50VGV4dC5zdWJzdHJpbmcobWludXMpOwogICAgICAgIHBhcnQucmVkdWNlZCA9IHRydWU7CiAgICAgIH0KICAgICAgLy8gQ3JlYXRlIGEgcGFydCBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gdG9rZW4uCiAgICAgIGZ1bmN0aW9uIHRva2VuUGFydCh0b2tlbil7CiAgICAgICAgdmFyIHBhcnQgPSBtYWtlUGFydFNwYW4odG9rZW4udmFsdWUsIHNlbGYuZG9jKTsgICAgIAogICAgICAgIHBhcnQuY2xhc3NOYW1lID0gdG9rZW4uc3R5bGU7CiAgICAgICAgcmV0dXJuIHBhcnQ7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1heWJlVG91Y2gobm9kZSkgewogICAgICAgIGlmIChub2RlKSB7CiAgICAgICAgICBpZiAobGluZURpcnR5IHx8IG5vZGUubmV4dFNpYmxpbmcgIT0gbm9kZS5vbGROZXh0U2libGluZykKICAgICAgICAgICAgc2VsZi5oaXN0b3J5LnRvdWNoKG5vZGUpOwogICAgICAgICAgbm9kZS5vbGROZXh0U2libGluZyA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgaWYgKGxpbmVEaXJ0eSB8fCBzZWxmLmNvbnRhaW5lci5maXJzdENoaWxkICE9IHNlbGYuY29udGFpbmVyLm9sZEZpcnN0Q2hpbGQpCiAgICAgICAgICAgIHNlbGYuaGlzdG9yeS50b3VjaChub2RlKTsKICAgICAgICAgIHNlbGYuY29udGFpbmVyLm9sZEZpcnN0Q2hpbGQgPSBzZWxmLmNvbnRhaW5lci5maXJzdENoaWxkOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gR2V0IHRoZSB0b2tlbiBzdHJlYW0uIElmIGZyb20gaXMgbnVsbCwgd2Ugc3RhcnQgd2l0aCBhIG5ldwogICAgICAvLyBwYXJzZXIgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lLCBvdGhlcndpc2UgYSBwYXJ0aWFsIHBhcnNlCiAgICAgIC8vIGlzIHJlc3VtZWQuCiAgICAgIHZhciB0cmF2ZXJzYWwgPSB0cmF2ZXJzZURPTShmcm9tID8gZnJvbS5uZXh0U2libGluZyA6IGNvbnRhaW5lci5maXJzdENoaWxkKSwKICAgICAgICAgIHN0cmVhbSA9IHN0cmluZ1N0cmVhbSh0cmF2ZXJzYWwpLAogICAgICAgICAgcGFyc2VkID0gZnJvbSA/IGZyb20ucGFyc2VyRnJvbUhlcmUoc3RyZWFtKSA6IEVkaXRvci5QYXJzZXIubWFrZShzdHJlYW0pOwoKICAgICAgLy8gcGFydHMgaXMgYW4gaW50ZXJmYWNlIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gJ2RlbGF5JyBmZXRjaGluZwogICAgICAvLyB0aGUgbmV4dCBET00gbm9kZSB1bnRpbCB3ZSBhcmUgY29tcGxldGVseSBkb25lIHdpdGggdGhlIG9uZQogICAgICAvLyBiZWZvcmUgaXQuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb2Z0ZW4gdGhlIG5leHQgbm9kZSBpcwogICAgICAvLyBub3QgeWV0IGF2YWlsYWJsZSB3aGVuIHdlIHdhbnQgdG8gcHJvY2VlZCBwYXN0IHRoZSBjdXJyZW50CiAgICAgIC8vIG9uZS4KICAgICAgdmFyIHBhcnRzID0gewogICAgICAgIGN1cnJlbnQ6IG51bGwsCiAgICAgICAgLy8gRmV0Y2ggY3VycmVudCBub2RlLgogICAgICAgIGdldDogZnVuY3Rpb24oKXsKICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50KQogICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0cmF2ZXJzYWwubm9kZXMuc2hpZnQoKTsKICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQ7CiAgICAgICAgfSwKICAgICAgICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHBhcnQgKGRvIG5vdCBmZXRjaCBpdCB5ZXQpLgogICAgICAgIG5leHQ6IGZ1bmN0aW9uKCl7CiAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBudWxsOwogICAgICAgIH0sCiAgICAgICAgLy8gUmVtb3ZlIHRoZSBjdXJyZW50IHBhcnQgZnJvbSB0aGUgRE9NIHRyZWUsIGFuZCBtb3ZlIHRvIHRoZQogICAgICAgIC8vIG5leHQuCiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbigpewogICAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMuZ2V0KCkpOwogICAgICAgICAgdGhpcy5jdXJyZW50ID0gbnVsbDsKICAgICAgICB9LAogICAgICAgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgcGFydCB0aGF0IGlzIG5vdCBlbXB0eSwgZGlzY2FyZGluZyBlbXB0eQogICAgICAgIC8vIHBhcnRzLgogICAgICAgIGdldE5vbkVtcHR5OiBmdW5jdGlvbigpewogICAgICAgICAgdmFyIHBhcnQgPSB0aGlzLmdldCgpOwogICAgICAgICAgLy8gQWxsb3cgZW1wdHkgbm9kZXMgd2hlbiB0aGV5IGFyZSBhbG9uZSBvbiBhIGxpbmUsIG5lZWRlZAogICAgICAgICAgLy8gZm9yIHRoZSBGRiBjdXJzb3IgYnVnIHdvcmthcm91bmQgKHNlZSBzZWxlY3QuanMsCiAgICAgICAgICAvLyBpbnNlcnROZXdsaW5lQXRDdXJzb3IpLgogICAgICAgICAgd2hpbGUgKHBhcnQgJiYgcGFydC5ub2RlTmFtZSA9PSAiU1BBTiIgJiYgcGFydC5jdXJyZW50VGV4dCA9PSAiIikgewogICAgICAgICAgICB2YXIgb2xkID0gcGFydDsKICAgICAgICAgICAgdGhpcy5yZW1vdmUoKTsKICAgICAgICAgICAgcGFydCA9IHRoaXMuZ2V0KCk7CiAgICAgICAgICAgIC8vIEFkanVzdCBzZWxlY3Rpb24gaW5mb3JtYXRpb24sIGlmIGFueS4gU2VlIHNlbGVjdC5qcyBmb3IgZGV0YWlscy4KICAgICAgICAgICAgc2VsZWN0LnNuYXBzaG90TW92ZShvbGQuZmlyc3RDaGlsZCwgcGFydCAmJiAocGFydC5maXJzdENoaWxkIHx8IHBhcnQpLCAwKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwYXJ0OwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIHZhciBsaW5lRGlydHkgPSBmYWxzZSwgcHJldkxpbmVEaXJ0eSA9IHRydWUsIGxpbmVOb2RlcyA9IDA7CgogICAgICAvLyBUaGlzIGZvckVhY2ggbG9vcHMgb3ZlciB0aGUgdG9rZW5zIGZyb20gdGhlIHBhcnNlZCBzdHJlYW0sIGFuZAogICAgICAvLyBhdCB0aGUgc2FtZSB0aW1lIHVzZXMgdGhlIHBhcnRzIG9iamVjdCB0byBwcm9jZWVkIHRocm91Z2ggdGhlCiAgICAgIC8vIGNvcnJlc3BvbmRpbmcgRE9NIG5vZGVzLgogICAgICBmb3JFYWNoKHBhcnNlZCwgZnVuY3Rpb24odG9rZW4pewogICAgICAgIHZhciBwYXJ0ID0gcGFydHMuZ2V0Tm9uRW1wdHkoKTsKCiAgICAgICAgaWYgKHRva2VuLnZhbHVlID09ICJcbiIpewogICAgICAgICAgLy8gVGhlIGlkZWEgb2YgdGhlIHR3byBzdHJlYW1zIGFjdHVhbGx5IHN0YXlpbmcgc3luY2hyb25pemVkCiAgICAgICAgICAvLyBpcyBzdWNoIGEgbG9uZyBzaG90IHRoYXQgd2UgZXhwbGljaXRseSBjaGVjay4KICAgICAgICAgIGlmIChwYXJ0Lm5vZGVOYW1lICE9ICJCUiIpCiAgICAgICAgICAgIHRocm93ICJQYXJzZXIgb3V0IG9mIHN5bmMuIEV4cGVjdGVkIEJSLiI7CgogICAgICAgICAgaWYgKHBhcnQuZGlydHkgfHwgIXBhcnQuaW5kZW50YXRpb24pIGxpbmVEaXJ0eSA9IHRydWU7CiAgICAgICAgICBtYXliZVRvdWNoKGZyb20pOwogICAgICAgICAgZnJvbSA9IHBhcnQ7CgogICAgICAgICAgLy8gRXZlcnkgPGJyPiBnZXRzIGEgY29weSBvZiB0aGUgcGFyc2VyIHN0YXRlIGFuZCBhIGxleGljYWwKICAgICAgICAgIC8vIGNvbnRleHQgYXNzaWduZWQgdG8gaXQuIFRoZSBmaXJzdCBpcyB1c2VkIHRvIGJlIGFibGUgdG8KICAgICAgICAgIC8vIGxhdGVyIHJlc3VtZSBwYXJzaW5nIGZyb20gdGhpcyBwb2ludCwgdGhlIHNlY29uZCBpcyB1c2VkCiAgICAgICAgICAvLyBmb3IgaW5kZW50YXRpb24uCiAgICAgICAgICBwYXJ0LnBhcnNlckZyb21IZXJlID0gcGFyc2VkLmNvcHkoKTsKICAgICAgICAgIHBhcnQuaW5kZW50YXRpb24gPSB0b2tlbi5pbmRlbnRhdGlvbjsKICAgICAgICAgIHBhcnQuZGlydHkgPSBmYWxzZTsKCiAgICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IGFyZ3VtZW50IHdhc24ndCBhbiBpbnRlZ2VyLCBnbyBhdCBsZWFzdAogICAgICAgICAgLy8gdW50aWwgdGhhdCBub2RlLgogICAgICAgICAgaWYgKGVuZFRpbWUgPT0gbnVsbCAmJiBwYXJ0ID09IHRhcmdldCkgdGhyb3cgU3RvcEl0ZXJhdGlvbjsKCiAgICAgICAgICAvLyBBIGNsZWFuIGxpbmUgd2l0aCBtb3JlIHRoYW4gb25lIG5vZGUgbWVhbnMgd2UgYXJlIGRvbmUuCiAgICAgICAgICAvLyBUaHJvd2luZyBhIFN0b3BJdGVyYXRpb24gaXMgdGhlIHdheSB0byBicmVhayBvdXQgb2YgYQogICAgICAgICAgLy8gTW9jaGlLaXQgZm9yRWFjaCBsb29wLgogICAgICAgICAgaWYgKChlbmRUaW1lICE9IG51bGwgJiYgdGltZSgpID49IGVuZFRpbWUpIHx8ICghbGluZURpcnR5ICYmICFwcmV2TGluZURpcnR5ICYmIGxpbmVOb2RlcyA+IDEgJiYgIWNsZWFuTGluZXMpKQogICAgICAgICAgICB0aHJvdyBTdG9wSXRlcmF0aW9uOwogICAgICAgICAgcHJldkxpbmVEaXJ0eSA9IGxpbmVEaXJ0eTsgbGluZURpcnR5ID0gZmFsc2U7IGxpbmVOb2RlcyA9IDA7CiAgICAgICAgICBwYXJ0cy5uZXh0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgaWYgKHBhcnQubm9kZU5hbWUgIT0gIlNQQU4iKQogICAgICAgICAgICB0aHJvdyAiUGFyc2VyIG91dCBvZiBzeW5jLiBFeHBlY3RlZCBTUEFOLiI7CiAgICAgICAgICBpZiAocGFydC5kaXJ0eSkKICAgICAgICAgICAgbGluZURpcnR5ID0gdHJ1ZTsKICAgICAgICAgIGxpbmVOb2RlcysrOwoKICAgICAgICAgIC8vIElmIHRoZSBwYXJ0IG1hdGNoZXMgdGhlIHRva2VuLCB3ZSBjYW4gbGVhdmUgaXQgYWxvbmUuCiAgICAgICAgICBpZiAoY29ycmVjdFBhcnQodG9rZW4sIHBhcnQpKXsKICAgICAgICAgICAgcGFydC5kaXJ0eSA9IGZhbHNlOwogICAgICAgICAgICBwYXJ0cy5uZXh0KCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgdG8gZml4IGl0LgogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxpbmVEaXJ0eSA9IHRydWU7CiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgY29ycmVjdCBwYXJ0LgogICAgICAgICAgICB2YXIgbmV3UGFydCA9IHRva2VuUGFydCh0b2tlbik7CiAgICAgICAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUobmV3UGFydCwgcGFydCk7CiAgICAgICAgICAgIGlmIChhY3RpdmUpIGFjdGl2ZShuZXdQYXJ0LCB0b2tlbiwgc2VsZik7CiAgICAgICAgICAgIHZhciB0b2tlbnNpemUgPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwOwogICAgICAgICAgICAvLyBFYXQgdXAgcGFydHMgdW50aWwgdGhlIHRleHQgZm9yIHRoaXMgdG9rZW4gaGFzIGJlZW4KICAgICAgICAgICAgLy8gcmVtb3ZlZCwgYWRqdXN0aW5nIHRoZSBzdG9yZWQgc2VsZWN0aW9uIGluZm8gKHNlZQogICAgICAgICAgICAvLyBzZWxlY3QuanMpIGluIHRoZSBwcm9jZXNzLgogICAgICAgICAgICB3aGlsZSAodG9rZW5zaXplID4gMCkgewogICAgICAgICAgICAgIHBhcnQgPSBwYXJ0cy5nZXQoKTsKICAgICAgICAgICAgICB2YXIgcGFydHNpemUgPSBwYXJ0LmN1cnJlbnRUZXh0Lmxlbmd0aDsKICAgICAgICAgICAgICBzZWxlY3Quc25hcHNob3RSZXBsYWNlTm9kZShwYXJ0LmZpcnN0Q2hpbGQsIG5ld1BhcnQuZmlyc3RDaGlsZCwgdG9rZW5zaXplLCBvZmZzZXQpOwogICAgICAgICAgICAgIGlmIChwYXJ0c2l6ZSA+IHRva2Vuc2l6ZSl7CiAgICAgICAgICAgICAgICBzaG9ydGVuUGFydChwYXJ0LCB0b2tlbnNpemUpOwogICAgICAgICAgICAgICAgdG9rZW5zaXplID0gMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0b2tlbnNpemUgLT0gcGFydHNpemU7CiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gcGFydHNpemU7CiAgICAgICAgICAgICAgICBwYXJ0cy5yZW1vdmUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBtYXliZVRvdWNoKGZyb20pOwogICAgICB3ZWJraXRMYXN0TGluZUhhY2sodGhpcy5jb250YWluZXIpOwoKICAgICAgLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgc29tZSBzdGF0dXMgaW5mb3JtYXRpb24gdGhhdCBpcyB1c2VkIGJ5CiAgICAgIC8vIGhpZ2h0bGlnaHREaXJ0eSB0byBkZXRlcm1pbmUgd2hldGhlciBhbmQgd2hlcmUgaXQgaGFzIHRvCiAgICAgIC8vIGNvbnRpbnVlLgogICAgICByZXR1cm4ge25vZGU6IHBhcnRzLmdldE5vbkVtcHR5KCksCiAgICAgICAgICAgICAgZGlydHk6IGxpbmVEaXJ0eX07CiAgICB9CiAgfTsKCiAgcmV0dXJuIEVkaXRvcjsKfSkoKTsKCmFkZEV2ZW50SGFuZGxlcih3aW5kb3csICJsb2FkIiwgZnVuY3Rpb24oKSB7CiAgdmFyIENvZGVNaXJyb3IgPSB3aW5kb3cuZnJhbWVFbGVtZW50LkNvZGVNaXJyb3I7CiAgQ29kZU1pcnJvci5lZGl0b3IgPSBuZXcgRWRpdG9yKENvZGVNaXJyb3Iub3B0aW9ucyk7CiAgdGhpcy5wYXJlbnQuc2V0VGltZW91dChtZXRob2QoQ29kZU1pcnJvciwgImluaXQiKSwgMCk7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/highlight.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gTWluaW1hbCBmcmFtaW5nIG5lZWRlZCB0byB1c2UgQ29kZU1pcnJvci1zdHlsZSBwYXJzZXJzIHRvIGhpZ2hsaWdodAovLyBjb2RlLiBMb2FkIHRoaXMgYWxvbmcgd2l0aCB0b2tlbml6ZS5qcywgc3RyaW5nc3RyZWFtLmpzLCBhbmQgeW91cgovLyBwYXJzZXIuIFRoZW4gY2FsbCBoaWdobGlnaHRUZXh0LCBwYXNzaW5nIGEgc3RyaW5nIGFzIHRoZSBmaXJzdAovLyBhcmd1bWVudCwgYW5kIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgZWl0aGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24KLy8gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGFycmF5IG9mIFNQQU4gbm9kZXMgZm9yIGV2ZXJ5IGxpbmUgaW4KLy8gdGhlIGNvZGUsIG9yIGEgRE9NIG5vZGUgdG8gd2hpY2ggdG8gYXBwZW5kIHRoZXNlIHNwYW5zLCBhbmQKLy8gb3B0aW9uYWxseSAobm90IG5lZWRlZCBpZiB5b3Ugb25seSBsb2FkZWQgb25lIHBhcnNlcikgYSBwYXJzZXIKLy8gb2JqZWN0LgoKLy8gU3R1ZmYgZnJvbSB1dGlsLmpzIHRoYXQgdGhlIHBhcnNlcnMgYXJlIHVzaW5nLgp2YXIgU3RvcEl0ZXJhdGlvbiA9IHt0b1N0cmluZzogZnVuY3Rpb24oKSB7cmV0dXJuICJTdG9wSXRlcmF0aW9uIn19OwoKdmFyIEVkaXRvciA9IHt9Owp2YXIgaW5kZW50VW5pdCA9IDI7CgooZnVuY3Rpb24oKXsKICBmdW5jdGlvbiBub3JtYWxpc2VTdHJpbmcoc3RyaW5nKSB7CiAgICB2YXIgdGFiID0gIiI7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluZGVudFVuaXQ7IGkrKykgdGFiICs9ICIgIjsKCiAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvXHQvZywgdGFiKS5yZXBsYWNlKC9cdTAwYTAvZywgIiAiKS5yZXBsYWNlKC9cclxuPy9nLCAiXG4iKTsKICAgIHZhciBwb3MgPSAwLCBwYXJ0cyA9IFtdLCBsaW5lcyA9IHN0cmluZy5zcGxpdCgiXG4iKTsKICAgIGZvciAodmFyIGxpbmUgPSAwOyBsaW5lIDwgbGluZXMubGVuZ3RoOyBsaW5lKyspIHsKICAgICAgaWYgKGxpbmUgIT0gMCkgcGFydHMucHVzaCgiXG4iKTsKICAgICAgcGFydHMucHVzaChsaW5lc1tsaW5lXSk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHBvcyA8IHBhcnRzLmxlbmd0aCkgcmV0dXJuIHBhcnRzW3BvcysrXTsKICAgICAgICBlbHNlIHRocm93IFN0b3BJdGVyYXRpb247CiAgICAgIH0KICAgIH07CiAgfQoKICB3aW5kb3cuaGlnaGxpZ2h0VGV4dCA9IGZ1bmN0aW9uKHN0cmluZywgY2FsbGJhY2ssIHBhcnNlcikgewogICAgdmFyIHBhcnNlciA9IChwYXJzZXIgfHwgRWRpdG9yLlBhcnNlcikubWFrZShzdHJpbmdTdHJlYW0obm9ybWFsaXNlU3RyaW5nKHN0cmluZykpKTsKICAgIHZhciBsaW5lID0gW107CiAgICBpZiAoY2FsbGJhY2subm9kZVR5cGUgPT0gMSkgewogICAgICB2YXIgbm9kZSA9IGNhbGxiYWNrOwogICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspCiAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGxpbmVbaV0pOwogICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiQlIiKSk7CiAgICAgIH07CiAgICB9CgogICAgdHJ5IHsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICB2YXIgdG9rZW4gPSBwYXJzZXIubmV4dCgpOwogICAgICAgIGlmICh0b2tlbi52YWx1ZSA9PSAiXG4iKSB7CiAgICAgICAgICBjYWxsYmFjayhsaW5lKTsKICAgICAgICAgIGxpbmUgPSBbXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlNQQU4iKTsKICAgICAgICAgIHNwYW4uY2xhc3NOYW1lID0gdG9rZW4uc3R5bGU7CiAgICAgICAgICBzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRva2VuLnZhbHVlKSk7CiAgICAgICAgICBsaW5lLnB1c2goc3Bhbik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjYXRjaCAoZSkgewogICAgICBpZiAoZSAhPSBTdG9wSXRlcmF0aW9uKSB0aHJvdyBlOwogICAgfQogICAgaWYgKGxpbmUubGVuZ3RoKSBjYWxsYmFjayhsaW5lKTsKICB9Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/mirrorframe.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogRGVtb25zdHJhdGlvbiBvZiBlbWJlZGRpbmcgQ29kZU1pcnJvciBpbiBhIGJpZ2dlciBhcHBsaWNhdGlvbi4gVGhlCiAqIGludGVyZmFjZSBkZWZpbmVkIGhlcmUgaXMgYSBtZXNzIG9mIHByb21wdHMgYW5kIGNvbmZpcm1zLCBhbmQKICogc2hvdWxkIHByb2JhYmx5IG5vdCBiZSB1c2VkIGluIGEgcmVhbCBwcm9qZWN0LgogKi8KCmZ1bmN0aW9uIE1pcnJvckZyYW1lKHBsYWNlLCBvcHRpb25zKSB7CiAgdGhpcy5ob21lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIik7CiAgaWYgKHBsYWNlLmFwcGVuZENoaWxkKQogICAgcGxhY2UuYXBwZW5kQ2hpbGQodGhpcy5ob21lKTsKICBlbHNlCiAgICBwbGFjZSh0aGlzLmhvbWUpOwoKICB2YXIgc2VsZiA9IHRoaXM7CiAgZnVuY3Rpb24gbWFrZUJ1dHRvbihuYW1lLCBhY3Rpb24pIHsKICAgIHZhciBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJJTlBVVCIpOwogICAgYnV0dG9uLnR5cGUgPSAiYnV0dG9uIjsKICAgIGJ1dHRvbi52YWx1ZSA9IG5hbWU7CiAgICBzZWxmLmhvbWUuYXBwZW5kQ2hpbGQoYnV0dG9uKTsKICAgIGJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24oKXtzZWxmW2FjdGlvbl0uY2FsbChzZWxmKTt9OwogIH0KCiAgbWFrZUJ1dHRvbigiU2VhcmNoIiwgInNlYXJjaCIpOwogIG1ha2VCdXR0b24oIlJlcGxhY2UiLCAicmVwbGFjZSIpOwogIG1ha2VCdXR0b24oIkN1cnJlbnQgbGluZSIsICJsaW5lIik7CiAgbWFrZUJ1dHRvbigiSnVtcCB0byBsaW5lIiwgImp1bXAiKTsKICBtYWtlQnV0dG9uKCJJbnNlcnQgY29uc3RydWN0b3IiLCAibWFjcm8iKTsKICBtYWtlQnV0dG9uKCJJbmRlbnQgYWxsIiwgInJlaW5kZW50Iik7CgogIHRoaXMubWlycm9yID0gbmV3IENvZGVNaXJyb3IodGhpcy5ob21lLCBvcHRpb25zKTsKfQoKTWlycm9yRnJhbWUucHJvdG90eXBlID0gewogIHNlYXJjaDogZnVuY3Rpb24oKSB7CiAgICB2YXIgdGV4dCA9IHByb21wdCgiRW50ZXIgc2VhcmNoIHRlcm06IiwgIiIpOwogICAgaWYgKCF0ZXh0KSByZXR1cm47CgogICAgdmFyIGZpcnN0ID0gdHJ1ZTsKICAgIGRvIHsKICAgICAgdmFyIGN1cnNvciA9IHRoaXMubWlycm9yLmdldFNlYXJjaEN1cnNvcih0ZXh0LCBmaXJzdCk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgIHdoaWxlIChjdXJzb3IuZmluZE5leHQoKSkgewogICAgICAgIGN1cnNvci5zZWxlY3QoKTsKICAgICAgICBpZiAoIWNvbmZpcm0oIlNlYXJjaCBhZ2Fpbj8iKSkKICAgICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSB3aGlsZSAoY29uZmlybSgiRW5kIG9mIGRvY3VtZW50IHJlYWNoZWQuIFN0YXJ0IG92ZXI/IikpOwogIH0sCgogIHJlcGxhY2U6IGZ1bmN0aW9uKCkgewogICAgLy8gVGhpcyBpcyBhIHJlcGxhY2UtYWxsLCBidXQgaXQgaXMgcG9zc2libGUgdG8gaW1wbGVtZW50IGEKICAgIC8vIHByb21wdGluZyByZXBsYWNlLgogICAgdmFyIGZyb20gPSBwcm9tcHQoIkVudGVyIHNlYXJjaCBzdHJpbmc6IiwgIiIpLCB0bzsKICAgIGlmIChmcm9tKSB0byA9IHByb21wdCgiV2hhdCBzaG91bGQgaXQgYmUgcmVwbGFjZWQgd2l0aD8iLCAiIik7CiAgICBpZiAodG8gPT0gbnVsbCkgcmV0dXJuOwoKICAgIHZhciBjdXJzb3IgPSB0aGlzLm1pcnJvci5nZXRTZWFyY2hDdXJzb3IoZnJvbSwgZmFsc2UpOwogICAgd2hpbGUgKGN1cnNvci5maW5kTmV4dCgpKQogICAgICBjdXJzb3IucmVwbGFjZSh0byk7CiAgfSwKCiAganVtcDogZnVuY3Rpb24oKSB7CiAgICB2YXIgbGluZSA9IHByb21wdCgiSnVtcCB0byBsaW5lOiIsICIiKTsKICAgIGlmIChsaW5lICYmICFpc05hTihOdW1iZXIobGluZSkpKQogICAgICB0aGlzLm1pcnJvci5qdW1wVG9MaW5lKE51bWJlcihsaW5lKSk7CiAgfSwKCiAgbGluZTogZnVuY3Rpb24oKSB7CiAgICBhbGVydCgiVGhlIGN1cnNvciBpcyBjdXJyZW50bHkgYXQgbGluZSAiICsgdGhpcy5taXJyb3IuY3VycmVudExpbmUoKSk7CiAgICB0aGlzLm1pcnJvci5mb2N1cygpOwogIH0sCgogIG1hY3JvOiBmdW5jdGlvbigpIHsKICAgIHZhciBuYW1lID0gcHJvbXB0KCJOYW1lIHlvdXIgY29uc3RydWN0b3I6IiwgIiIpOwogICAgaWYgKG5hbWUpCiAgICAgIHRoaXMubWlycm9yLnJlcGxhY2VTZWxlY3Rpb24oImZ1bmN0aW9uICIgKyBuYW1lICsgIigpIHtcbiAgXG59XG5cbiIgKyBuYW1lICsgIi5wcm90b3R5cGUgPSB7XG4gIFxufTtcbiIpOwogIH0sCgogIHJlaW5kZW50OiBmdW5jdGlvbigpIHsKICAgIHRoaXMubWlycm9yLnJlaW5kZW50KCk7CiAgfQp9Owo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsecss.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogU2ltcGxlIHBhcnNlciBmb3IgQ1NTICovCgp2YXIgQ1NTUGFyc2VyID0gRWRpdG9yLlBhcnNlciA9IChmdW5jdGlvbigpIHsKICB2YXIgdG9rZW5pemVDU1MgPSAoZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBub3JtYWwoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICBpZiAoY2ggPT0gIkAiKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1x3Lyk7CiAgICAgICAgcmV0dXJuICJjc3MtYXQiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICIvIiAmJiBzb3VyY2UuZXF1YWxzKCIqIikpIHsKICAgICAgICBzZXRTdGF0ZShpbkNDb21tZW50KTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiPCIgJiYgc291cmNlLmVxdWFscygiISIpKSB7CiAgICAgICAgc2V0U3RhdGUoaW5TR01MQ29tbWVudCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIj0iKSB7CiAgICAgICAgcmV0dXJuICJjc3MtY29tcGFyZSI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoc291cmNlLmVxdWFscygiPSIpICYmIChjaCA9PSAifiIgfHwgY2ggPT0gInwiKSkgewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgcmV0dXJuICJjc3MtY29tcGFyZSI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIlwiIiB8fCBjaCA9PSAiJyIpIHsKICAgICAgICBzZXRTdGF0ZShpblN0cmluZyhjaCkpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9cdy8pOwogICAgICAgIHJldHVybiAiY3NzLWhhc2giOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICIhIikgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bIFx0XS8pOwogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9cdy8pOwogICAgICAgIHJldHVybiAiY3NzLWltcG9ydGFudCI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHcuJV0vKTsKICAgICAgICByZXR1cm4gImNzcy11bml0IjsKICAgICAgfQogICAgICBlbHNlIGlmICgvWywuKz4qXC9dLy50ZXN0KGNoKSkgewogICAgICAgIHJldHVybiAiY3NzLXNlbGVjdC1vcCI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoL1s7e306XFtcXV0vLnRlc3QoY2gpKSB7CiAgICAgICAgcmV0dXJuICJjc3MtcHVuY3R1YXRpb24iOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHdcXFwtX10vKTsKICAgICAgICByZXR1cm4gImNzcy1pZGVudGlmaWVyIjsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluQ0NvbW1lbnQoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZTsKICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgIGlmIChtYXliZUVuZCAmJiBjaCA9PSAiLyIpIHsKICAgICAgICAgIHNldFN0YXRlKG5vcm1hbCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgICAgfQogICAgICByZXR1cm4gImNzcy1jb21tZW50IjsKICAgIH0KCiAgICBmdW5jdGlvbiBpblNHTUxDb21tZW50KHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgdmFyIGRhc2hlcyA9IDA7CiAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAoZGFzaGVzID49IDIgJiYgY2ggPT0gIj4iKSB7CiAgICAgICAgICBzZXRTdGF0ZShub3JtYWwpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGRhc2hlcyA9IChjaCA9PSAiLSIpID8gZGFzaGVzICsgMSA6IDA7CiAgICAgIH0KICAgICAgcmV0dXJuICJjc3MtY29tbWVudCI7CiAgICB9CgogICAgZnVuY3Rpb24gaW5TdHJpbmcocXVvdGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlOwogICAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgICAgaWYgKGNoID09IHF1b3RlICYmICFlc2NhcGVkKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSAiXFwiOwogICAgICAgIH0KICAgICAgICBpZiAoIWVzY2FwZWQpCiAgICAgICAgICBzZXRTdGF0ZShub3JtYWwpOwogICAgICAgIHJldHVybiAiY3NzLXN0cmluZyI7CiAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc3RhcnRTdGF0ZSkgewogICAgICByZXR1cm4gdG9rZW5pemVyKHNvdXJjZSwgc3RhcnRTdGF0ZSB8fCBub3JtYWwpOwogICAgfTsKICB9KSgpOwoKICBmdW5jdGlvbiBpbmRlbnRDU1MoaW5CcmFjZXMsIGluUnVsZSwgYmFzZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKG5leHRDaGFycykgewogICAgICBpZiAoIWluQnJhY2VzIHx8IC9eXH0vLnRlc3QobmV4dENoYXJzKSkgcmV0dXJuIGJhc2U7CiAgICAgIGVsc2UgaWYgKGluUnVsZSkgcmV0dXJuIGJhc2UgKyBpbmRlbnRVbml0ICogMjsKICAgICAgZWxzZSByZXR1cm4gYmFzZSArIGluZGVudFVuaXQ7CiAgICB9OwogIH0KCiAgLy8gVGhpcyBpcyBhIHZlcnkgc2ltcGxpc3RpYyBwYXJzZXIgLS0gc2luY2UgQ1NTIGRvZXMgbm90IHJlYWxseQogIC8vIG5lc3QsIGl0IHdvcmtzIGFjY2VwdGFibHkgd2VsbCwgYnV0IHNvbWUgbmljZXIgY29sb3Vyb2luZyBjb3VsZAogIC8vIGJlIHByb3ZpZGVkIHdpdGggYSBtb3JlIGNvbXBsaWNhdGVkIHBhcnNlci4KICBmdW5jdGlvbiBwYXJzZUNTUyhzb3VyY2UsIGJhc2Vjb2x1bW4pIHsKICAgIGJhc2Vjb2x1bW4gPSBiYXNlY29sdW1uIHx8IDA7CiAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVDU1Moc291cmNlKTsKICAgIHZhciBpbkJyYWNlcyA9IGZhbHNlLCBpblJ1bGUgPSBmYWxzZTsKCiAgICB2YXIgaXRlciA9IHsKICAgICAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zLm5leHQoKSwgc3R5bGUgPSB0b2tlbi5zdHlsZSwgY29udGVudCA9IHRva2VuLmNvbnRlbnQ7CgogICAgICAgIGlmIChzdHlsZSA9PSAiY3NzLWlkZW50aWZpZXIiICYmIGluUnVsZSkKICAgICAgICAgIHRva2VuLnN0eWxlID0gImNzcy12YWx1ZSI7CiAgICAgICAgaWYgKHN0eWxlID09ICJjc3MtaGFzaCIpCiAgICAgICAgICB0b2tlbi5zdHlsZSA9ICBpblJ1bGUgPyAiY3NzLWNvbG9yY29kZSIgOiAiY3NzLWlkZW50aWZpZXIiOwoKICAgICAgICBpZiAoY29udGVudCA9PSAiXG4iKQogICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBpbmRlbnRDU1MoaW5CcmFjZXMsIGluUnVsZSwgYmFzZWNvbHVtbik7CgogICAgICAgIGlmIChjb250ZW50ID09ICJ7IikKICAgICAgICAgIGluQnJhY2VzID0gdHJ1ZTsKICAgICAgICBlbHNlIGlmIChjb250ZW50ID09ICJ9IikKICAgICAgICAgIGluQnJhY2VzID0gaW5SdWxlID0gZmFsc2U7CiAgICAgICAgZWxzZSBpZiAoaW5CcmFjZXMgJiYgY29udGVudCA9PSAiOyIpCiAgICAgICAgICBpblJ1bGUgPSBmYWxzZTsKICAgICAgICBlbHNlIGlmIChpbkJyYWNlcyAmJiBzdHlsZSAhPSAiY3NzLWNvbW1lbnQiICYmIHN0eWxlICE9ICJ3aGl0ZXNwYWNlIikKICAgICAgICAgIGluUnVsZSA9IHRydWU7CgogICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgfSwKCiAgICAgIGNvcHk6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBfaW5CcmFjZXMgPSBpbkJyYWNlcywgX2luUnVsZSA9IGluUnVsZSwgX3Rva2VuU3RhdGUgPSB0b2tlbnMuc3RhdGU7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgICAgdG9rZW5zID0gdG9rZW5pemVDU1Moc291cmNlLCBfdG9rZW5TdGF0ZSk7CiAgICAgICAgICBpbkJyYWNlcyA9IF9pbkJyYWNlczsKICAgICAgICAgIGluUnVsZSA9IF9pblJ1bGU7CiAgICAgICAgICByZXR1cm4gaXRlcjsKICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGl0ZXI7CiAgfQoKICByZXR1cm4ge21ha2U6IHBhcnNlQ1NTLCBlbGVjdHJpY0NoYXJzOiAifSJ9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsedummy.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIER1bW15UGFyc2VyID0gRWRpdG9yLlBhcnNlciA9IChmdW5jdGlvbigpIHsKICBmdW5jdGlvbiB0b2tlbml6ZUR1bW15KHNvdXJjZSkgewogICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHNvdXJjZS5uZXh0KCk7CiAgICByZXR1cm4gInRleHQiOwogIH0KICBmdW5jdGlvbiBwYXJzZUR1bW15KHNvdXJjZSkgewogICAgZnVuY3Rpb24gaW5kZW50VG8obikge3JldHVybiBmdW5jdGlvbigpIHtyZXR1cm4gbjt9fQogICAgc291cmNlID0gdG9rZW5pemVyKHNvdXJjZSwgdG9rZW5pemVEdW1teSk7CiAgICB2YXIgc3BhY2UgPSAwOwoKICAgIHZhciBpdGVyID0gewogICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdG9rID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAodG9rLnR5cGUgPT0gIndoaXRlc3BhY2UiKSB7CiAgICAgICAgICBpZiAodG9rLnZhbHVlID09ICJcbiIpIHRvay5pbmRlbnRhdGlvbiA9IGluZGVudFRvKHNwYWNlKTsKICAgICAgICAgIGVsc2Ugc3BhY2UgPSB0b2sudmFsdWUubGVuZ3RoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdG9rOwogICAgICB9LAogICAgICBjb3B5OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX3NwYWNlID0gc3BhY2U7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9zb3VyY2UpIHsKICAgICAgICAgIHNwYWNlID0gX3NwYWNlOwogICAgICAgICAgc291cmNlID0gdG9rZW5pemVyKF9zb3VyY2UsIHRva2VuaXplRHVtbXkpOwogICAgICAgICAgcmV0dXJuIGl0ZXI7CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBpdGVyOwogIH0KICByZXR1cm4ge21ha2U6IHBhcnNlRHVtbXl9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsehtmlmixed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIEhUTUxNaXhlZFBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgaWYgKCEoQ1NTUGFyc2VyICYmIEpTUGFyc2VyICYmIFhNTFBhcnNlcikpCiAgICB0aHJvdyBuZXcgRXJyb3IoIkNTUywgSlMsIGFuZCBYTUwgcGFyc2VycyBtdXN0IGJlIGxvYWRlZCBmb3IgSFRNTCBtaXhlZCBtb2RlIHRvIHdvcmsuIik7CiAgWE1MUGFyc2VyLmNvbmZpZ3VyZSh7dXNlSFRNTEtsdWRnZXM6IHRydWV9KTsKCiAgZnVuY3Rpb24gcGFyc2VNaXhlZChzdHJlYW0pIHsKICAgIHZhciBodG1sUGFyc2VyID0gWE1MUGFyc2VyLm1ha2Uoc3RyZWFtKSwgbG9jYWxQYXJzZXIgPSBudWxsLCBpblRhZyA9IGZhbHNlOwogICAgdmFyIGl0ZXIgPSB7bmV4dDogdG9wLCBjb3B5OiBjb3B5fTsKCiAgICBmdW5jdGlvbiB0b3AoKSB7CiAgICAgIHZhciB0b2tlbiA9IGh0bWxQYXJzZXIubmV4dCgpOwogICAgICBpZiAodG9rZW4uY29udGVudCA9PSAiPCIpCiAgICAgICAgaW5UYWcgPSB0cnVlOwogICAgICBlbHNlIGlmICh0b2tlbi5zdHlsZSA9PSAieG1sLXRhZ25hbWUiICYmIGluVGFnID09PSB0cnVlKQogICAgICAgIGluVGFnID0gdG9rZW4uY29udGVudC50b0xvd2VyQ2FzZSgpOwogICAgICBlbHNlIGlmICh0b2tlbi5jb250ZW50ID09ICI+IikgewogICAgICAgIGlmIChpblRhZyA9PSAic2NyaXB0IikKICAgICAgICAgIGl0ZXIubmV4dCA9IGxvY2FsKEpTUGFyc2VyLCAiPC9zY3JpcHQiKTsKICAgICAgICBlbHNlIGlmIChpblRhZyA9PSAic3R5bGUiKQogICAgICAgICAgaXRlci5uZXh0ID0gbG9jYWwoQ1NTUGFyc2VyLCAiPC9zdHlsZSIpOwogICAgICAgIGluVGFnID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRva2VuOwogICAgfQogICAgZnVuY3Rpb24gbG9jYWwocGFyc2VyLCB0YWcpIHsKICAgICAgdmFyIGJhc2VJbmRlbnQgPSBodG1sUGFyc2VyLmluZGVudGF0aW9uKCk7CiAgICAgIGxvY2FsUGFyc2VyID0gcGFyc2VyLm1ha2Uoc3RyZWFtLCBiYXNlSW5kZW50ICsgaW5kZW50VW5pdCk7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoc3RyZWFtLmxvb2tBaGVhZCh0YWcsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpIHsKICAgICAgICAgIGxvY2FsUGFyc2VyID0gbnVsbDsKICAgICAgICAgIGl0ZXIubmV4dCA9IHRvcDsKICAgICAgICAgIHJldHVybiB0b3AoKTsKICAgICAgICB9CgogICAgICAgIHZhciB0b2tlbiA9IGxvY2FsUGFyc2VyLm5leHQoKTsKICAgICAgICB2YXIgbHQgPSB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZigiPCIpLCBzeiA9IE1hdGgubWluKHRva2VuLnZhbHVlLmxlbmd0aCAtIGx0LCB0YWcubGVuZ3RoKTsKICAgICAgICBpZiAobHQgIT0gLTEgJiYgdG9rZW4udmFsdWUuc2xpY2UobHQsIGx0ICsgc3opLnRvTG93ZXJDYXNlKCkgPT0gdGFnLnNsaWNlKDAsIHN6KSAmJgogICAgICAgICAgICBzdHJlYW0ubG9va0FoZWFkKHRhZy5zbGljZShzeiksIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpIHsKICAgICAgICAgIHN0cmVhbS5wdXNoKHRva2VuLnZhbHVlLnNsaWNlKGx0KSk7CiAgICAgICAgICB0b2tlbi52YWx1ZSA9IHRva2VuLnZhbHVlLnNsaWNlKDAsIGx0KTsKICAgICAgICB9CgogICAgICAgIGlmICh0b2tlbi5pbmRlbnRhdGlvbikgewogICAgICAgICAgdmFyIG9sZEluZGVudCA9IHRva2VuLmluZGVudGF0aW9uOwogICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBmdW5jdGlvbihjaGFycykgewogICAgICAgICAgICBpZiAoY2hhcnMgPT0gIjwvIikKICAgICAgICAgICAgICByZXR1cm4gYmFzZUluZGVudDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHJldHVybiBvbGRJbmRlbnQoY2hhcnMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvcHkoKSB7CiAgICAgIHZhciBfaHRtbCA9IGh0bWxQYXJzZXIuY29weSgpLCBfbG9jYWwgPSBsb2NhbFBhcnNlciAmJiBsb2NhbFBhcnNlci5jb3B5KCksCiAgICAgICAgICBfbmV4dCA9IGl0ZXIubmV4dCwgX2luVGFnID0gaW5UYWc7CiAgICAgIHJldHVybiBmdW5jdGlvbihfc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtID0gX3N0cmVhbTsKICAgICAgICBodG1sUGFyc2VyID0gX2h0bWwoX3N0cmVhbSk7CiAgICAgICAgbG9jYWxQYXJzZXIgPSBfbG9jYWwgJiYgX2xvY2FsKF9zdHJlYW0pOwogICAgICAgIGl0ZXIubmV4dCA9IF9uZXh0OwogICAgICAgIGluVGFnID0gX2luVGFnOwogICAgICAgIHJldHVybiBpdGVyOwogICAgICB9OwogICAgfQogICAgcmV0dXJuIGl0ZXI7CiAgfQoKICByZXR1cm4ge21ha2U6IHBhcnNlTWl4ZWQsIGVsZWN0cmljQ2hhcnM6ICJ7fS86In07Cgp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsejavascript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogUGFyc2UgZnVuY3Rpb24gZm9yIEphdmFTY3JpcHQuIE1ha2VzIHVzZSBvZiB0aGUgdG9rZW5pemVyIGZyb20KICogdG9rZW5pemVqYXZhc2NyaXB0LmpzLiBOb3RlIHRoYXQgeW91ciBwYXJzZXJzIGRvIG5vdCBoYXZlIHRvIGJlCiAqIHRoaXMgY29tcGxpY2F0ZWQgLS0gaWYgeW91IGRvbid0IHdhbnQgdG8gcmVjb2duaXplIGxvY2FsIHZhcmlhYmxlcywKICogaW4gbWFueSBsYW5ndWFnZXMgaXQgaXMgZW5vdWdoIHRvIGp1c3QgbG9vayBmb3IgYnJhY2VzLCBzZW1pY29sb25zLAogKiBwYXJlbnRoZXNlcywgZXRjLCBhbmQga25vdyB3aGVuIHlvdSBhcmUgaW5zaWRlIGEgc3RyaW5nIG9yIGNvbW1lbnQuCiAqCiAqIFNlZSBtYW51YWwuaHRtbCBmb3IgbW9yZSBpbmZvIGFib3V0IHRoZSBwYXJzZXIgaW50ZXJmYWNlLgogKi8KCnZhciBKU1BhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgLy8gVG9rZW4gdHlwZXMgdGhhdCBjYW4gYmUgY29uc2lkZXJlZCB0byBiZSBhdG9tcy4KICB2YXIgYXRvbWljVHlwZXMgPSB7ImF0b20iOiB0cnVlLCAibnVtYmVyIjogdHJ1ZSwgInZhcmlhYmxlIjogdHJ1ZSwgInN0cmluZyI6IHRydWUsICJyZWdleHAiOiB0cnVlfTsKICAvLyBDb25zdHJ1Y3RvciBmb3IgdGhlIGxleGljYWwgY29udGV4dCBvYmplY3RzLgogIGZ1bmN0aW9uIEpTTGV4aWNhbChpbmRlbnRlZCwgY29sdW1uLCB0eXBlLCBhbGlnbiwgcHJldiwgaW5mbykgewogICAgLy8gaW5kZW50YXRpb24gYXQgc3RhcnQgb2YgdGhpcyBsaW5lCiAgICB0aGlzLmluZGVudGVkID0gaW5kZW50ZWQ7CiAgICAvLyBjb2x1bW4gYXQgd2hpY2ggdGhpcyBzY29wZSB3YXMgb3BlbmVkCiAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKICAgIC8vIHR5cGUgb2Ygc2NvcGUgKCd2YXJkZWYnLCAnc3RhdCcgKHN0YXRlbWVudCksICdmb3JtJyAoc3BlY2lhbCBmb3JtKSwgJ1snLCAneycsIG9yICcoJykKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAvLyAnWycsICd7Jywgb3IgJygnIGJsb2NrcyB0aGF0IGhhdmUgYW55IHRleHQgYWZ0ZXIgdGhlaXIgb3BlbmluZwogICAgLy8gY2hhcmFjdGVyIGFyZSBzYWlkIHRvIGJlICdhbGlnbmVkJyAtLSBhbnkgbGluZXMgYmVsb3cgYXJlCiAgICAvLyBpbmRlbnRlZCBhbGwgdGhlIHdheSB0byB0aGUgb3BlbmluZyBjaGFyYWN0ZXIuCiAgICBpZiAoYWxpZ24gIT0gbnVsbCkKICAgICAgdGhpcy5hbGlnbiA9IGFsaWduOwogICAgLy8gUGFyZW50IHNjb3BlLCBpZiBhbnkuCiAgICB0aGlzLnByZXYgPSBwcmV2OwogICAgdGhpcy5pbmZvID0gaW5mbzsKICB9CgogIC8vIE15IGZhdm91cml0ZSBKYXZhU2NyaXB0IGluZGVudGF0aW9uIHJ1bGVzLgogIGZ1bmN0aW9uIGluZGVudEpTKGxleGljYWwpIHsKICAgIHJldHVybiBmdW5jdGlvbihmaXJzdENoYXJzKSB7CiAgICAgIHZhciBmaXJzdENoYXIgPSBmaXJzdENoYXJzICYmIGZpcnN0Q2hhcnMuY2hhckF0KDApLCB0eXBlID0gbGV4aWNhbC50eXBlOwogICAgICB2YXIgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSB0eXBlOwogICAgICBpZiAodHlwZSA9PSAidmFyZGVmIikKICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIDQ7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImZvcm0iICYmIGZpcnN0Q2hhciA9PSAieyIpCiAgICAgICAgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQ7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInN0YXQiIHx8IHR5cGUgPT0gImZvcm0iKQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgaW5kZW50VW5pdDsKICAgICAgZWxzZSBpZiAobGV4aWNhbC5pbmZvID09ICJzd2l0Y2giICYmICFjbG9zaW5nKQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKC9eKD86Y2FzZXxkZWZhdWx0KVxiLy50ZXN0KGZpcnN0Q2hhcnMpID8gaW5kZW50VW5pdCA6IDIgKiBpbmRlbnRVbml0KTsKICAgICAgZWxzZSBpZiAobGV4aWNhbC5hbGlnbikKICAgICAgICByZXR1cm4gbGV4aWNhbC5jb2x1bW4gLSAoY2xvc2luZyA/IDEgOiAwKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9OwogIH0KCiAgLy8gVGhlIHBhcnNlci1pdGVyYXRvci1wcm9kdWNpbmcgZnVuY3Rpb24gaXRzZWxmLgogIGZ1bmN0aW9uIHBhcnNlSlMoaW5wdXQsIGJhc2Vjb2x1bW4pIHsKICAgIC8vIFdyYXAgdGhlIGlucHV0IGluIGEgdG9rZW4gc3RyZWFtCiAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVKYXZhU2NyaXB0KGlucHV0KTsKICAgIC8vIFRoZSBwYXJzZXIgc3RhdGUuIGNjIGlzIGEgc3RhY2sgb2YgYWN0aW9ucyB0aGF0IGhhdmUgdG8gYmUKICAgIC8vIHBlcmZvcm1lZCB0byBmaW5pc2ggdGhlIGN1cnJlbnQgc3RhdGVtZW50LiBGb3IgZXhhbXBsZSB3ZSBtaWdodAogICAgLy8ga25vdyB0aGF0IHdlIHN0aWxsIG5lZWQgdG8gZmluZCBhIGNsb3NpbmcgcGFyZW50aGVzaXMgYW5kIGEKICAgIC8vIHNlbWljb2xvbi4gQWN0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBzdGFjayBnbyBmaXJzdC4gSXQgaXMKICAgIC8vIGluaXRpYWxpemVkIHdpdGggYW4gaW5maW5pdGVseSBsb29waW5nIGFjdGlvbiB0aGF0IGNvbnN1bWVzCiAgICAvLyB3aG9sZSBzdGF0ZW1lbnRzLgogICAgdmFyIGNjID0gW3N0YXRlbWVudHNdOwogICAgLy8gQ29udGV4dCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBsb2NhbCBzY29wZSwgdGhlCiAgICAvLyB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGF0LCBhbmQgdGhlIHNjb3BlcyBhYm92ZSBpdC4KICAgIHZhciBjb250ZXh0ID0gbnVsbDsKICAgIC8vIFRoZSBsZXhpY2FsIHNjb3BlLCB1c2VkIG1vc3RseSBmb3IgaW5kZW50YXRpb24uCiAgICB2YXIgbGV4aWNhbCA9IG5ldyBKU0xleGljYWwoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAiYmxvY2siLCBmYWxzZSk7CiAgICAvLyBDdXJyZW50IGNvbHVtbiwgYW5kIHRoZSBpbmRlbnRhdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQKICAgIC8vIGxpbmUuIFVzZWQgdG8gY3JlYXRlIGxleGljYWwgc2NvcGUgb2JqZWN0cy4KICAgIHZhciBjb2x1bW4gPSAwOwogICAgdmFyIGluZGVudGVkID0gMDsKICAgIC8vIFZhcmlhYmxlcyB3aGljaCBhcmUgdXNlZCBieSB0aGUgbWFyaywgY29udCwgYW5kIHBhc3MgZnVuY3Rpb25zCiAgICAvLyBiZWxvdyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBkcml2ZXIgbG9vcCBpbiB0aGUgJ25leHQnCiAgICAvLyBmdW5jdGlvbi4KICAgIHZhciBjb25zdW1lLCBtYXJrZWQ7CiAgCiAgICAvLyBUaGUgaXRlcmF0b3Igb2JqZWN0LgogICAgdmFyIHBhcnNlciA9IHtuZXh0OiBuZXh0LCBjb3B5OiBjb3B5fTsKCiAgICBmdW5jdGlvbiBuZXh0KCl7CiAgICAgIC8vIFN0YXJ0IGJ5IHBlcmZvcm1pbmcgYW55ICdsZXhpY2FsJyBhY3Rpb25zIChhZGp1c3RpbmcgdGhlCiAgICAgIC8vIGxleGljYWwgdmFyaWFibGUpLCBvciB0aGUgb3BlcmF0aW9ucyBiZWxvdyB3aWxsIGJlIHdvcmtpbmcKICAgICAgLy8gd2l0aCB0aGUgd3JvbmcgbGV4aWNhbCBzdGF0ZS4KICAgICAgd2hpbGUoY2NbY2MubGVuZ3RoIC0gMV0ubGV4KQogICAgICAgIGNjLnBvcCgpKCk7CgogICAgICAvLyBGZXRjaCBhIHRva2VuLgogICAgICB2YXIgdG9rZW4gPSB0b2tlbnMubmV4dCgpOwoKICAgICAgLy8gQWRqdXN0IGNvbHVtbiBhbmQgaW5kZW50ZWQuCiAgICAgIGlmICh0b2tlbi50eXBlID09ICJ3aGl0ZXNwYWNlIiAmJiBjb2x1bW4gPT0gMCkKICAgICAgICBpbmRlbnRlZCA9IHRva2VuLnZhbHVlLmxlbmd0aDsKICAgICAgY29sdW1uICs9IHRva2VuLnZhbHVlLmxlbmd0aDsKICAgICAgaWYgKHRva2VuLmNvbnRlbnQgPT0gIlxuIil7CiAgICAgICAgaW5kZW50ZWQgPSBjb2x1bW4gPSAwOwogICAgICAgIC8vIElmIHRoZSBsZXhpY2FsIHNjb3BlJ3MgYWxpZ24gcHJvcGVydHkgaXMgc3RpbGwgdW5kZWZpbmVkIGF0CiAgICAgICAgLy8gdGhlIGVuZCBvZiB0aGUgbGluZSwgaXQgaXMgYW4gdW4tYWxpZ25lZCBzY29wZS4KICAgICAgICBpZiAoISgiYWxpZ24iIGluIGxleGljYWwpKQogICAgICAgICAgbGV4aWNhbC5hbGlnbiA9IGZhbHNlOwogICAgICAgIC8vIE5ld2xpbmUgdG9rZW5zIGdldCBhbiBpbmRlbnRhdGlvbiBmdW5jdGlvbiBhc3NvY2lhdGVkIHdpdGgKICAgICAgICAvLyB0aGVtLgogICAgICAgIHRva2VuLmluZGVudGF0aW9uID0gaW5kZW50SlMobGV4aWNhbCk7CiAgICAgIH0KICAgICAgLy8gTm8gbW9yZSBwcm9jZXNzaW5nIGZvciBtZWFuaW5nbGVzcyB0b2tlbnMuCiAgICAgIGlmICh0b2tlbi50eXBlID09ICJ3aGl0ZXNwYWNlIiB8fCB0b2tlbi50eXBlID09ICJjb21tZW50IikKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIC8vIFdoZW4gYSBtZWFuaW5nZnVsIHRva2VuIGlzIGZvdW5kIGFuZCB0aGUgbGV4aWNhbCBzY29wZSdzCiAgICAgIC8vIGFsaWduIGlzIHVuZGVmaW5lZCwgaXQgaXMgYW4gYWxpZ25lZCBzY29wZS4KICAgICAgaWYgKCEoImFsaWduIiBpbiBsZXhpY2FsKSkKICAgICAgICBsZXhpY2FsLmFsaWduID0gdHJ1ZTsKCiAgICAgIC8vIEV4ZWN1dGUgYWN0aW9ucyB1bnRpbCBvbmUgJ2NvbnN1bWVzJyB0aGUgdG9rZW4gYW5kIHdlIGNhbgogICAgICAvLyByZXR1cm4gaXQuCiAgICAgIHdoaWxlKHRydWUpIHsKICAgICAgICBjb25zdW1lID0gbWFya2VkID0gZmFsc2U7CiAgICAgICAgLy8gVGFrZSBhbmQgZXhlY3V0ZSB0aGUgdG9wbW9zdCBhY3Rpb24uCiAgICAgICAgY2MucG9wKCkodG9rZW4udHlwZSwgdG9rZW4uY29udGVudCk7CiAgICAgICAgaWYgKGNvbnN1bWUpewogICAgICAgICAgLy8gTWFya2VkIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBzdHlsZSBvZiB0aGUgY3VycmVudCB0b2tlbi4KICAgICAgICAgIGlmIChtYXJrZWQpCiAgICAgICAgICAgIHRva2VuLnN0eWxlID0gbWFya2VkOwogICAgICAgICAgLy8gSGVyZSB3ZSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbG9jYWwgYW5kIGdsb2JhbCB2YXJpYWJsZXMuCiAgICAgICAgICBlbHNlIGlmICh0b2tlbi50eXBlID09ICJ2YXJpYWJsZSIgJiYgaW5TY29wZSh0b2tlbi5jb250ZW50KSkKICAgICAgICAgICAgdG9rZW4uc3R5bGUgPSAianMtbG9jYWx2YXJpYWJsZSI7CiAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gVGhpcyBtYWtlcyBhIGNvcHkgb2YgdGhlIHBhcnNlciBzdGF0ZS4gSXQgc3RvcmVzIGFsbCB0aGUKICAgIC8vIHN0YXRlZnVsIHZhcmlhYmxlcyBpbiBhIGNsb3N1cmUsIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdAogICAgLy8gd2lsbCByZXN0b3JlIHRoZW0gd2hlbiBjYWxsZWQgd2l0aCBhIG5ldyBpbnB1dCBzdHJlYW0uIE5vdGUKICAgIC8vIHRoYXQgdGhlIGNjIGFycmF5IGhhcyB0byBiZSBjb3BpZWQsIGJlY2F1c2UgaXQgaXMgY29udGFudGx5CiAgICAvLyBiZWluZyBtb2RpZmllZC4gTGV4aWNhbCBvYmplY3RzIGFyZSBub3QgbXV0YXRlZCwgYW5kIGNvbnRleHQKICAgIC8vIG9iamVjdHMgYXJlIG5vdCBtdXRhdGVkIGluIGEgaGFybWZ1bCB3YXksIHNvIHRoZXkgY2FuIGJlIHNoYXJlZAogICAgLy8gYmV0d2VlbiBydW5zIG9mIHRoZSBwYXJzZXIuCiAgICBmdW5jdGlvbiBjb3B5KCl7CiAgICAgIHZhciBfY29udGV4dCA9IGNvbnRleHQsIF9sZXhpY2FsID0gbGV4aWNhbCwgX2NjID0gY2MuY29uY2F0KFtdKSwgX3Rva2VuU3RhdGUgPSB0b2tlbnMuc3RhdGU7CiAgCiAgICAgIHJldHVybiBmdW5jdGlvbiBjb3B5UGFyc2VyKGlucHV0KXsKICAgICAgICBjb250ZXh0ID0gX2NvbnRleHQ7CiAgICAgICAgbGV4aWNhbCA9IF9sZXhpY2FsOwogICAgICAgIGNjID0gX2NjLmNvbmNhdChbXSk7IC8vIGNvcGllcyB0aGUgYXJyYXkKICAgICAgICBjb2x1bW4gPSBpbmRlbnRlZCA9IDA7CiAgICAgICAgdG9rZW5zID0gdG9rZW5pemVKYXZhU2NyaXB0KGlucHV0LCBfdG9rZW5TdGF0ZSk7CiAgICAgICAgcmV0dXJuIHBhcnNlcjsKICAgICAgfTsKICAgIH0KCiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHB1c2hpbmcgYSBudW1iZXIgb2YgYWN0aW9ucyBvbnRvIHRoZSBjYwogICAgLy8gc3RhY2sgaW4gcmV2ZXJzZSBvcmRlci4KICAgIGZ1bmN0aW9uIHB1c2goZnMpewogICAgICBmb3IgKHZhciBpID0gZnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgICAgY2MucHVzaChmc1tpXSk7CiAgICB9CiAgICAvLyBjb250IGFuZCBwYXNzIGFyZSB1c2VkIGJ5IHRoZSBhY3Rpb24gZnVuY3Rpb25zIHRvIGFkZCBvdGhlcgogICAgLy8gYWN0aW9ucyB0byB0aGUgc3RhY2suIGNvbnQgd2lsbCBjYXVzZSB0aGUgY3VycmVudCB0b2tlbiB0byBiZQogICAgLy8gY29uc3VtZWQsIHBhc3Mgd2lsbCBsZWF2ZSBpdCBmb3IgdGhlIG5leHQgYWN0aW9uLgogICAgZnVuY3Rpb24gY29udCgpewogICAgICBwdXNoKGFyZ3VtZW50cyk7CiAgICAgIGNvbnN1bWUgPSB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gcGFzcygpewogICAgICBwdXNoKGFyZ3VtZW50cyk7CiAgICAgIGNvbnN1bWUgPSBmYWxzZTsKICAgIH0KICAgIC8vIFVzZWQgdG8gY2hhbmdlIHRoZSBzdHlsZSBvZiB0aGUgY3VycmVudCB0b2tlbi4KICAgIGZ1bmN0aW9uIG1hcmsoc3R5bGUpewogICAgICBtYXJrZWQgPSBzdHlsZTsKICAgIH0KCiAgICAvLyBQdXNoIGEgbmV3IHNjb3BlLiBXaWxsIGF1dG9tYXRpY2FsbHkgbGluayB0aGUgY3VycmVudCBzY29wZS4KICAgIGZ1bmN0aW9uIHB1c2hjb250ZXh0KCl7CiAgICAgIGNvbnRleHQgPSB7cHJldjogY29udGV4dCwgdmFyczogeyJ0aGlzIjogdHJ1ZSwgImFyZ3VtZW50cyI6IHRydWV9fTsKICAgIH0KICAgIC8vIFBvcCBvZmYgdGhlIGN1cnJlbnQgc2NvcGUuCiAgICBmdW5jdGlvbiBwb3Bjb250ZXh0KCl7CiAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICB9CiAgICAvLyBSZWdpc3RlciBhIHZhcmlhYmxlIGluIHRoZSBjdXJyZW50IHNjb3BlLgogICAgZnVuY3Rpb24gcmVnaXN0ZXIodmFybmFtZSl7CiAgICAgIGlmIChjb250ZXh0KXsKICAgICAgICBtYXJrKCJqcy12YXJpYWJsZWRlZiIpOwogICAgICAgIGNvbnRleHQudmFyc1t2YXJuYW1lXSA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIC8vIENoZWNrIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IHNjb3BlLgogICAgZnVuY3Rpb24gaW5TY29wZSh2YXJuYW1lKXsKICAgICAgdmFyIGN1cnNvciA9IGNvbnRleHQ7CiAgICAgIHdoaWxlIChjdXJzb3IpIHsKICAgICAgICBpZiAoY3Vyc29yLnZhcnNbdmFybmFtZV0pCiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICBjdXJzb3IgPSBjdXJzb3IucHJldjsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgCiAgICAvLyBQdXNoIGEgbmV3IGxleGljYWwgY29udGV4dCBvZiB0aGUgZ2l2ZW4gdHlwZS4KICAgIGZ1bmN0aW9uIHB1c2hsZXgodHlwZSwgaW5mbykgewogICAgICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24oKXsKICAgICAgICBsZXhpY2FsID0gbmV3IEpTTGV4aWNhbChpbmRlbnRlZCwgY29sdW1uLCB0eXBlLCBudWxsLCBsZXhpY2FsLCBpbmZvKQogICAgICB9OwogICAgICByZXN1bHQubGV4ID0gdHJ1ZTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIC8vIFBvcCBvZmYgdGhlIGN1cnJlbnQgbGV4aWNhbCBjb250ZXh0LgogICAgZnVuY3Rpb24gcG9wbGV4KCl7CiAgICAgIGxleGljYWwgPSBsZXhpY2FsLnByZXY7CiAgICB9CiAgICBwb3BsZXgubGV4ID0gdHJ1ZTsKICAgIC8vIFRoZSAnbGV4JyBmbGFnIG9uIHRoZXNlIGFjdGlvbnMgaXMgdXNlZCBieSB0aGUgJ25leHQnIGZ1bmN0aW9uCiAgICAvLyB0byBrbm93IHRoZXkgY2FuIChhbmQgaGF2ZSB0bykgYmUgcmFuIGJlZm9yZSBtb3Zpbmcgb24gdG8gdGhlCiAgICAvLyBuZXh0IHRva2VuLgogIAogICAgLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBkaXNjYXJkcyB0b2tlbnMgdW50aWwgaXQgZmluZHMgb25lIG9mCiAgICAvLyB0aGUgZ2l2ZW4gdHlwZS4KICAgIGZ1bmN0aW9uIGV4cGVjdCh3YW50ZWQpewogICAgICByZXR1cm4gZnVuY3Rpb24gZXhwZWN0aW5nKHR5cGUpewogICAgICAgIGlmICh0eXBlID09IHdhbnRlZCkgY29udCgpOwogICAgICAgIGVsc2UgY29udChhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgfTsKICAgIH0KCiAgICAvLyBMb29rcyBmb3IgYSBzdGF0ZW1lbnQsIGFuZCB0aGVuIGNhbGxzIGl0c2VsZi4KICAgIGZ1bmN0aW9uIHN0YXRlbWVudHModHlwZSl7CiAgICAgIHJldHVybiBwYXNzKHN0YXRlbWVudCwgc3RhdGVtZW50cyk7CiAgICB9CiAgICAvLyBEaXNwYXRjaGVzIHZhcmlvdXMgdHlwZXMgb2Ygc3RhdGVtZW50cyBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUKICAgIC8vIGN1cnJlbnQgdG9rZW4uCiAgICBmdW5jdGlvbiBzdGF0ZW1lbnQodHlwZSl7CiAgICAgIGlmICh0eXBlID09ICJ2YXIiKSBjb250KHB1c2hsZXgoInZhcmRlZiIpLCB2YXJkZWYxLCBleHBlY3QoIjsiKSwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAia2V5d29yZCBhIikgY29udChwdXNobGV4KCJmb3JtIiksIGV4cHJlc3Npb24sIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAia2V5d29yZCBiIikgY29udChwdXNobGV4KCJmb3JtIiksIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAieyIpIGNvbnQocHVzaGxleCgifSIpLCBibG9jaywgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZnVuY3Rpb24iKSBjb250KGZ1bmN0aW9uZGVmKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZm9yIikgY29udChwdXNobGV4KCJmb3JtIiksIGV4cGVjdCgiKCIpLCBwdXNobGV4KCIpIiksIGZvcnNwZWMxLCBleHBlY3QoIikiKSwgcG9wbGV4LCBzdGF0ZW1lbnQsIHBvcGxleCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgY29udChwdXNobGV4KCJzdGF0IiksIG1heWJlbGFiZWwpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJzd2l0Y2giKSBjb250KHB1c2hsZXgoImZvcm0iKSwgZXhwcmVzc2lvbiwgcHVzaGxleCgifSIsICJzd2l0Y2giKSwgZXhwZWN0KCJ7IiksIGJsb2NrLCBwb3BsZXgsIHBvcGxleCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImNhc2UiKSBjb250KGV4cHJlc3Npb24sIGV4cGVjdCgiOiIpKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZGVmYXVsdCIpIGNvbnQoZXhwZWN0KCI6IikpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJjYXRjaCIpIGNvbnQocHVzaGxleCgiZm9ybSIpLCBwdXNoY29udGV4dCwgZXhwZWN0KCIoIiksIGZ1bmFyZywgZXhwZWN0KCIpIiksIHN0YXRlbWVudCwgcG9wbGV4LCBwb3Bjb250ZXh0KTsKICAgICAgZWxzZSBwYXNzKHB1c2hsZXgoInN0YXQiKSwgZXhwcmVzc2lvbiwgZXhwZWN0KCI7IiksIHBvcGxleCk7CiAgICB9CiAgICAvLyBEaXNwYXRjaCBleHByZXNzaW9uIHR5cGVzLgogICAgZnVuY3Rpb24gZXhwcmVzc2lvbih0eXBlKXsKICAgICAgaWYgKGF0b21pY1R5cGVzLmhhc093blByb3BlcnR5KHR5cGUpKSBjb250KG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmdW5jdGlvbiIpIGNvbnQoZnVuY3Rpb25kZWYpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJrZXl3b3JkIGMiKSBjb250KGV4cHJlc3Npb24pOwogICAgICBlbHNlIGlmICh0eXBlID09ICIoIikgY29udChwdXNobGV4KCIpIiksIGV4cHJlc3Npb24sIGV4cGVjdCgiKSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJvcGVyYXRvciIpIGNvbnQoZXhwcmVzc2lvbik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIlsiKSBjb250KHB1c2hsZXgoIl0iKSwgY29tbWFzZXAoZXhwcmVzc2lvbiwgIl0iKSwgcG9wbGV4LCBtYXliZW9wZXJhdG9yKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAieyIpIGNvbnQocHVzaGxleCgifSIpLCBjb21tYXNlcChvYmpwcm9wLCAifSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgfQogICAgLy8gQ2FsbGVkIGZvciBwbGFjZXMgd2hlcmUgb3BlcmF0b3JzLCBmdW5jdGlvbiBjYWxscywgb3IKICAgIC8vIHN1YnNjcmlwdHMgYXJlIHZhbGlkLiBXaWxsIHNraXAgb24gdG8gdGhlIG5leHQgYWN0aW9uIGlmIG5vbmUKICAgIC8vIGlzIGZvdW5kLgogICAgZnVuY3Rpb24gbWF5YmVvcGVyYXRvcih0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIikgY29udChleHByZXNzaW9uKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiKCIpIGNvbnQocHVzaGxleCgiKSIpLCBleHByZXNzaW9uLCBjb21tYXNlcChleHByZXNzaW9uLCAiKSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIGlmICh0eXBlID09ICIuIikgY29udChwcm9wZXJ0eSwgbWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIlsiKSBjb250KHB1c2hsZXgoIl0iKSwgZXhwcmVzc2lvbiwgZXhwZWN0KCJdIiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgICB9CiAgICAvLyBXaGVuIGEgc3RhdGVtZW50IHN0YXJ0cyB3aXRoIGEgdmFyaWFibGUgbmFtZSwgaXQgbWlnaHQgYmUgYQogICAgLy8gbGFiZWwuIElmIG5vIGNvbG9uIGZvbGxvd3MsIGl0J3MgYSByZWd1bGFyIHN0YXRlbWVudC4KICAgIGZ1bmN0aW9uIG1heWJlbGFiZWwodHlwZSl7CiAgICAgIGlmICh0eXBlID09ICI6IikgY29udChwb3BsZXgsIHN0YXRlbWVudCk7CiAgICAgIGVsc2UgcGFzcyhtYXliZW9wZXJhdG9yLCBleHBlY3QoIjsiKSwgcG9wbGV4KTsKICAgIH0KICAgIC8vIFByb3BlcnR5IG5hbWVzIG5lZWQgdG8gaGF2ZSB0aGVpciBzdHlsZSBhZGp1c3RlZCAtLSB0aGUKICAgIC8vIHRva2VuaXplciB0aGlua3MgdGhleSBhcmUgdmFyaWFibGVzLgogICAgZnVuY3Rpb24gcHJvcGVydHkodHlwZSl7CiAgICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHttYXJrKCJqcy1wcm9wZXJ0eSIpOyBjb250KCk7fQogICAgfQogICAgLy8gVGhpcyBwYXJzZXMgYSBwcm9wZXJ0eSBhbmQgaXRzIHZhbHVlIGluIGFuIG9iamVjdCBsaXRlcmFsLgogICAgZnVuY3Rpb24gb2JqcHJvcCh0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgbWFyaygianMtcHJvcGVydHkiKTsKICAgICAgaWYgKGF0b21pY1R5cGVzLmhhc093blByb3BlcnR5KHR5cGUpKSBjb250KGV4cGVjdCgiOiIpLCBleHByZXNzaW9uKTsKICAgIH0KICAgIC8vIFBhcnNlcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSB0aGluZ3MgdGhhdCBhcmUgcmVjb2duaXplZAogICAgLy8gYnkgdGhlICd3aGF0JyBhcmd1bWVudC4KICAgIGZ1bmN0aW9uIGNvbW1hc2VwKHdoYXQsIGVuZCl7CiAgICAgIGZ1bmN0aW9uIHByb2NlZWQodHlwZSkgewogICAgICAgIGlmICh0eXBlID09ICIsIikgY29udCh3aGF0LCBwcm9jZWVkKTsKICAgICAgICBlbHNlIGlmICh0eXBlID09IGVuZCkgY29udCgpOwogICAgICAgIGVsc2UgY29udChleHBlY3QoZW5kKSk7CiAgICAgIH07CiAgICAgIHJldHVybiBmdW5jdGlvbiBjb21tYVNlcGFyYXRlZCh0eXBlKSB7CiAgICAgICAgaWYgKHR5cGUgPT0gZW5kKSBjb250KCk7CiAgICAgICAgZWxzZSBwYXNzKHdoYXQsIHByb2NlZWQpOwogICAgICB9OwogICAgfQogICAgLy8gTG9vayBmb3Igc3RhdGVtZW50cyB1bnRpbCBhIGNsb3NpbmcgYnJhY2UgaXMgZm91bmQuCiAgICBmdW5jdGlvbiBibG9jayh0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gIn0iKSBjb250KCk7CiAgICAgIGVsc2UgcGFzcyhzdGF0ZW1lbnQsIGJsb2NrKTsKICAgIH0KICAgIC8vIFZhcmlhYmxlIGRlZmluaXRpb25zIGFyZSBzcGxpdCBpbnRvIHR3byBhY3Rpb25zIC0tIDEgbG9va3MgZm9yCiAgICAvLyBhIG5hbWUgb3IgdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbiwgMiBsb29rcyBmb3IgYW4gJz0nIHNpZ24gb3IKICAgIC8vIGEgY29tbWEuCiAgICBmdW5jdGlvbiB2YXJkZWYxKHR5cGUsIHZhbHVlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIil7cmVnaXN0ZXIodmFsdWUpOyBjb250KHZhcmRlZjIpO30KICAgICAgZWxzZSBjb250KCk7CiAgICB9CiAgICBmdW5jdGlvbiB2YXJkZWYyKHR5cGUsIHZhbHVlKXsKICAgICAgaWYgKHZhbHVlID09ICI9IikgY29udChleHByZXNzaW9uLCB2YXJkZWYyKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiLCIpIGNvbnQodmFyZGVmMSk7CiAgICB9CiAgICAvLyBGb3IgbG9vcHMuCiAgICBmdW5jdGlvbiBmb3JzcGVjMSh0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhciIpIGNvbnQodmFyZGVmMSwgZm9yc3BlYzIpOwogICAgICBlbHNlIGlmICh0eXBlID09ICI7IikgcGFzcyhmb3JzcGVjMik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgY29udChmb3JtYXliZWluKTsKICAgICAgZWxzZSBwYXNzKGZvcnNwZWMyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1heWJlaW4odHlwZSwgdmFsdWUpewogICAgICBpZiAodmFsdWUgPT0gImluIikgY29udChleHByZXNzaW9uKTsKICAgICAgZWxzZSBjb250KG1heWJlb3BlcmF0b3IsIGZvcnNwZWMyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcnNwZWMyKHR5cGUsIHZhbHVlKXsKICAgICAgaWYgKHR5cGUgPT0gIjsiKSBjb250KGZvcnNwZWMzKTsKICAgICAgZWxzZSBpZiAodmFsdWUgPT0gImluIikgY29udChleHByZXNzaW9uKTsKICAgICAgZWxzZSBjb250KGV4cHJlc3Npb24sIGV4cGVjdCgiOyIpLCBmb3JzcGVjMyk7CiAgICB9CiAgICBmdW5jdGlvbiBmb3JzcGVjMyh0eXBlKSB7CiAgICAgIGlmICh0eXBlID09ICIpIikgcGFzcygpOwogICAgICBlbHNlIGNvbnQoZXhwcmVzc2lvbik7CiAgICB9CiAgICAvLyBBIGZ1bmN0aW9uIGRlZmluaXRpb24gY3JlYXRlcyBhIG5ldyBjb250ZXh0LCBhbmQgdGhlIHZhcmlhYmxlcwogICAgLy8gaW4gaXRzIGFyZ3VtZW50IGxpc3QgaGF2ZSB0byBiZSBhZGRlZCB0byB0aGlzIGNvbnRleHQuCiAgICBmdW5jdGlvbiBmdW5jdGlvbmRlZih0eXBlLCB2YWx1ZSl7CiAgICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpe3JlZ2lzdGVyKHZhbHVlKTsgY29udChmdW5jdGlvbmRlZik7fQogICAgICBlbHNlIGlmICh0eXBlID09ICIoIikgY29udChwdXNoY29udGV4dCwgY29tbWFzZXAoZnVuYXJnLCAiKSIpLCBzdGF0ZW1lbnQsIHBvcGNvbnRleHQpOwogICAgfQogICAgZnVuY3Rpb24gZnVuYXJnKHR5cGUsIHZhbHVlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIil7cmVnaXN0ZXIodmFsdWUpOyBjb250KCk7fQogICAgfQogIAogICAgcmV0dXJuIHBhcnNlcjsKICB9CgogIHJldHVybiB7bWFrZTogcGFyc2VKUywgZWxlY3RyaWNDaGFyczogInt9OiJ9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsesparql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIFNwYXJxbFBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gd29yZFJlZ2V4cCh3b3JkcykgewogICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgd29yZHMuam9pbigifCIpICsgIikkIiwgImkiKTsKICB9CiAgdmFyIG9wcyA9IHdvcmRSZWdleHAoWyJzdHIiLCAibGFuZyIsICJsYW5nbWF0Y2hlcyIsICJkYXRhdHlwZSIsICJib3VuZCIsICJzYW1ldGVybSIsICJpc2lyaSIsICJpc3VyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpc2JsYW5rIiwgImlzbGl0ZXJhbCIsICJ1bmlvbiIsICJhIl0pOwogIHZhciBrZXl3b3JkcyA9IHdvcmRSZWdleHAoWyJiYXNlIiwgInByZWZpeCIsICJzZWxlY3QiLCAiZGlzdGluY3QiLCAicmVkdWNlZCIsICJjb25zdHJ1Y3QiLCAiZGVzY3JpYmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhc2siLCAiZnJvbSIsICJuYW1lZCIsICJ3aGVyZSIsICJvcmRlciIsICJsaW1pdCIsICJvZmZzZXQiLCAiZmlsdGVyIiwgIm9wdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JhcGgiLCAiYnkiLCAiYXNjIiwgImRlc2MiLCBdKTsKICB2YXIgb3BlcmF0b3JDaGFycyA9IC9bKitcLTw+PSZ8XS87CgogIHZhciB0b2tlbml6ZVNwYXJxbCA9IChmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIG5vcm1hbChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSAiJCIgfHwgY2ggPT0gIj8iKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tcd1xkXS8pOwogICAgICAgIHJldHVybiAic3AtdmFyIjsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiPCIgJiYgIXNvdXJjZS5tYXRjaGVzKC9bXHNcdTAwYTA9XS8pKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1teXHNcdTAwYTA+XS8pOwogICAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCI+IikpIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgcmV0dXJuICJzcC11cmkiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICJcIiIgfHwgY2ggPT0gIiciKSB7CiAgICAgICAgc2V0U3RhdGUoaW5MaXRlcmFsKGNoKSk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoL1t7fVwoXCksXC47XFtcXV0vLnRlc3QoY2gpKSB7CiAgICAgICAgcmV0dXJuICJzcC1wdW5jIjsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiIyIpIHsKICAgICAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgc291cmNlLm5leHQoKTsKICAgICAgICByZXR1cm4gInNwLWNvbW1lbnQiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKG9wZXJhdG9yQ2hhcnMudGVzdChjaCkpIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhvcGVyYXRvckNoYXJzKTsKICAgICAgICByZXR1cm4gInNwLW9wZXJhdG9yIjsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiOiIpIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW1x3XGRcLl9cLV0vKTsKICAgICAgICByZXR1cm4gInNwLXByZWZpeGVkIjsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW19cd1xkXS8pOwogICAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCI6IikpIHsKICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW1x3XGRfXC1dLyk7CiAgICAgICAgICByZXR1cm4gInNwLXByZWZpeGVkIjsKICAgICAgICB9CiAgICAgICAgdmFyIHdvcmQgPSBzb3VyY2UuZ2V0KCksIHR5cGU7CiAgICAgICAgaWYgKG9wcy50ZXN0KHdvcmQpKQogICAgICAgICAgdHlwZSA9ICJzcC1vcGVyYXRvciI7CiAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMudGVzdCh3b3JkKSkKICAgICAgICAgIHR5cGUgPSAic3Ata2V5d29yZCI7CiAgICAgICAgZWxzZQogICAgICAgICAgdHlwZSA9ICJzcC13b3JkIjsKICAgICAgICByZXR1cm4ge3N0eWxlOiB0eXBlLCBjb250ZW50OiB3b3JkfTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluTGl0ZXJhbChxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHsKICAgICAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJzcC1saXRlcmFsIjsKICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzdGFydFN0YXRlKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZXIoc291cmNlLCBzdGFydFN0YXRlIHx8IG5vcm1hbCk7CiAgICB9OwogIH0pKCk7CgogIGZ1bmN0aW9uIGluZGVudFNwYXJxbChjb250ZXh0KSB7CiAgICByZXR1cm4gZnVuY3Rpb24obmV4dENoYXJzKSB7CiAgICAgIHZhciBmaXJzdENoYXIgPSBuZXh0Q2hhcnMgJiYgbmV4dENoYXJzLmNoYXJBdCgwKTsKICAgICAgaWYgKC9bXF1cfV0vLnRlc3QoZmlyc3RDaGFyKSkKICAgICAgICB3aGlsZSAoY29udGV4dCAmJiBjb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKSBjb250ZXh0ID0gY29udGV4dC5wcmV2OwoKICAgICAgdmFyIGNsb3NpbmcgPSBjb250ZXh0ICYmIGZpcnN0Q2hhciA9PSBtYXRjaGluZ1tjb250ZXh0LnR5cGVdOwogICAgICBpZiAoIWNvbnRleHQpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGVsc2UgaWYgKGNvbnRleHQudHlwZSA9PSAicGF0dGVybiIpCiAgICAgICAgcmV0dXJuIGNvbnRleHQuY29sOwogICAgICBlbHNlIGlmIChjb250ZXh0LmFsaWduKQogICAgICAgIHJldHVybiBjb250ZXh0LmNvbCAtIChjbG9zaW5nID8gY29udGV4dC53aWR0aCA6IDApOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIGNvbnRleHQuaW5kZW50ICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXJzZVNwYXJxbChzb3VyY2UpIHsKICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZVNwYXJxbChzb3VyY2UpOwogICAgdmFyIGNvbnRleHQgPSBudWxsLCBpbmRlbnQgPSAwLCBjb2wgPSAwOwogICAgZnVuY3Rpb24gcHVzaENvbnRleHQodHlwZSwgd2lkdGgpIHsKICAgICAgY29udGV4dCA9IHtwcmV2OiBjb250ZXh0LCBpbmRlbnQ6IGluZGVudCwgY29sOiBjb2wsIHR5cGU6IHR5cGUsIHdpZHRoOiB3aWR0aH07CiAgICB9CiAgICBmdW5jdGlvbiBwb3BDb250ZXh0KCkgewogICAgICBjb250ZXh0ID0gY29udGV4dC5wcmV2OwogICAgfQoKICAgIHZhciBpdGVyID0gewogICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnMubmV4dCgpLCB0eXBlID0gdG9rZW4uc3R5bGUsIGNvbnRlbnQgPSB0b2tlbi5jb250ZW50LCB3aWR0aCA9IHRva2VuLnZhbHVlLmxlbmd0aDsKCiAgICAgICAgaWYgKGNvbnRlbnQgPT0gIlxuIikgewogICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBpbmRlbnRTcGFycWwoY29udGV4dCk7CiAgICAgICAgICBpbmRlbnQgPSBjb2wgPSAwOwogICAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5hbGlnbiA9PSBudWxsKSBjb250ZXh0LmFsaWduID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIndoaXRlc3BhY2UiICYmIGNvbCA9PSAwKSB7CiAgICAgICAgICBpbmRlbnQgPSB3aWR0aDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZSAhPSAic3AtY29tbWVudCIgJiYgY29udGV4dCAmJiBjb250ZXh0LmFsaWduID09IG51bGwpIHsKICAgICAgICAgIGNvbnRleHQuYWxpZ24gPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbnRlbnQgIT0gIlxuIikgY29sICs9IHdpZHRoOwoKICAgICAgICBpZiAoL1tcW1x7XChdLy50ZXN0KGNvbnRlbnQpKSB7CiAgICAgICAgICBwdXNoQ29udGV4dChjb250ZW50LCB3aWR0aCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKC9bXF1cfVwpXS8udGVzdChjb250ZW50KSkgewogICAgICAgICAgd2hpbGUgKGNvbnRleHQgJiYgY29udGV4dC50eXBlID09ICJwYXR0ZXJuIikKICAgICAgICAgICAgcG9wQ29udGV4dCgpOwogICAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGVudCA9PSBtYXRjaGluZ1tjb250ZXh0LnR5cGVdKQogICAgICAgICAgICBwb3BDb250ZXh0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNvbnRlbnQgPT0gIi4iICYmIGNvbnRleHQgJiYgY29udGV4dC50eXBlID09ICJwYXR0ZXJuIikgewogICAgICAgICAgcG9wQ29udGV4dCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgodHlwZSA9PSAic3Atd29yZCIgfHwgdHlwZSA9PSAic3AtcHJlZml4ZWQiIHx8IHR5cGUgPT0gInNwLXVyaSIgfHwgdHlwZSA9PSAic3AtdmFyIiB8fCB0eXBlID09ICJzcC1saXRlcmFsIikgJiYKICAgICAgICAgICAgICAgICBjb250ZXh0ICYmIC9bXHtcW10vLnRlc3QoY29udGV4dC50eXBlKSkgewogICAgICAgICAgcHVzaENvbnRleHQoInBhdHRlcm4iLCB3aWR0aCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0sCgogICAgICBjb3B5OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2NvbnRleHQgPSBjb250ZXh0LCBfaW5kZW50ID0gaW5kZW50LCBfY29sID0gY29sLCBfdG9rZW5TdGF0ZSA9IHRva2Vucy5zdGF0ZTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZVNwYXJxbChzb3VyY2UsIF90b2tlblN0YXRlKTsKICAgICAgICAgIGNvbnRleHQgPSBfY29udGV4dDsKICAgICAgICAgIGluZGVudCA9IF9pbmRlbnQ7CiAgICAgICAgICBjb2wgPSBfY29sOwogICAgICAgICAgcmV0dXJuIGl0ZXI7CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBpdGVyOwogIH0KCiAgcmV0dXJuIHttYWtlOiBwYXJzZVNwYXJxbCwgZWxlY3RyaWNDaGFyczogIn1dIn07Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsexml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVGhpcyBmaWxlIGRlZmluZXMgYW4gWE1MIHBhcnNlciwgd2l0aCBhIGZldyBrbHVkZ2VzIHRvIG1ha2UgaXQKICogdXNlYWJsZSBmb3IgSFRNTC4gYXV0b1NlbGZDbG9zZXJzIGRlZmluZXMgYSBzZXQgb2YgdGFnIG5hbWVzIHRoYXQKICogYXJlIGV4cGVjdGVkIHRvIG5vdCBoYXZlIGEgY2xvc2luZyB0YWcsIGFuZCBkb05vdEluZGVudCBzcGVjaWZpZXMKICogdGhlIHRhZ3MgaW5zaWRlIG9mIHdoaWNoIG5vIGluZGVudGF0aW9uIHNob3VsZCBoYXBwZW4gKHNlZSBDb25maWcKICogb2JqZWN0KS4gVGhlc2UgY2FuIGJlIGRpc2FibGVkIGJ5IHBhc3NpbmcgdGhlIGVkaXRvciBhbiBvYmplY3QgbGlrZQogKiB7dXNlSFRNTEtsdWRnZXM6IGZhbHNlfSBhcyBwYXJzZXJDb25maWcgb3B0aW9uLgogKi8KCnZhciBYTUxQYXJzZXIgPSBFZGl0b3IuUGFyc2VyID0gKGZ1bmN0aW9uKCkgewogIHZhciBLbHVkZ2VzID0gewogICAgYXV0b1NlbGZDbG9zZXJzOiB7ImJyIjogdHJ1ZSwgImltZyI6IHRydWUsICJociI6IHRydWUsICJsaW5rIjogdHJ1ZSwgImlucHV0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICJtZXRhIjogdHJ1ZSwgImNvbCI6IHRydWUsICJmcmFtZSI6IHRydWUsICJiYXNlIjogdHJ1ZSwgImFyZWEiOiB0cnVlfSwKICAgIGRvTm90SW5kZW50OiB7InByZSI6IHRydWUsICIhY2RhdGEiOiB0cnVlfQogIH07CiAgdmFyIE5vS2x1ZGdlcyA9IHthdXRvU2VsZkNsb3NlcnM6IHt9LCBkb05vdEluZGVudDogeyIhY2RhdGEiOiB0cnVlfX07CiAgdmFyIFVzZUtsdWRnZXMgPSBLbHVkZ2VzOwogIHZhciBhbGlnbkNEQVRBID0gZmFsc2U7CgogIC8vIFNpbXBsZSBzdGF0ZWZ1bCB0b2tlbml6ZXIgZm9yIFhNTCBkb2N1bWVudHMuIFJldHVybnMgYQogIC8vIE1vY2hpS2l0LXN0eWxlIGl0ZXJhdG9yLCB3aXRoIGEgc3RhdGUgcHJvcGVydHkgdGhhdCBjb250YWlucyBhCiAgLy8gZnVuY3Rpb24gZW5jYXBzdWxhdGluZyB0aGUgY3VycmVudCBzdGF0ZS4gU2VlIHRva2VuaXplLmpzLgogIHZhciB0b2tlbml6ZVhNTCA9IChmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIGluVGV4dChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSAiPCIpIHsKICAgICAgICBpZiAoc291cmNlLmVxdWFscygiISIpKSB7CiAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIlsiKSkgewogICAgICAgICAgICBpZiAoc291cmNlLmxvb2tBaGVhZCgiW0NEQVRBWyIsIHRydWUpKSB7CiAgICAgICAgICAgICAgc2V0U3RhdGUoaW5CbG9jaygieG1sLWNkYXRhIiwgIl1dPiIpKTsKICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gInhtbC10ZXh0IjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAoc291cmNlLmxvb2tBaGVhZCgiLS0iLCB0cnVlKSkgewogICAgICAgICAgICBzZXRTdGF0ZShpbkJsb2NrKCJ4bWwtY29tbWVudCIsICItLT4iKSk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAieG1sLXRleHQiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzb3VyY2UuZXF1YWxzKCI/IikpIHsKICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW1x3XC5fXC1dLyk7CiAgICAgICAgICBzZXRTdGF0ZShpbkJsb2NrKCJ4bWwtcHJvY2Vzc2luZyIsICI/PiIpKTsKICAgICAgICAgIHJldHVybiAieG1sLXByb2Nlc3NpbmciOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCIvIikpIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBzZXRTdGF0ZShpblRhZyk7CiAgICAgICAgICByZXR1cm4gInhtbC1wdW5jdHVhdGlvbiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICImIikgewogICAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICBpZiAoc291cmNlLm5leHQoKSA9PSAiOyIpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gInhtbC1lbnRpdHkiOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXiY8XG5dLyk7CiAgICAgICAgcmV0dXJuICJ4bWwtdGV4dCI7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpblRhZyhzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSAiPiIpIHsKICAgICAgICBzZXRTdGF0ZShpblRleHQpOwogICAgICAgIHJldHVybiAieG1sLXB1bmN0dWF0aW9uIjsKICAgICAgfQogICAgICBlbHNlIGlmICgvWz9cL10vLnRlc3QoY2gpICYmIHNvdXJjZS5lcXVhbHMoIj4iKSkgewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgc2V0U3RhdGUoaW5UZXh0KTsKICAgICAgICByZXR1cm4gInhtbC1wdW5jdHVhdGlvbiI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIj0iKSB7CiAgICAgICAgcmV0dXJuICJ4bWwtcHVuY3R1YXRpb24iOwogICAgICB9CiAgICAgIGVsc2UgaWYgKC9bXCdcIl0vLnRlc3QoY2gpKSB7CiAgICAgICAgc2V0U3RhdGUoaW5BdHRyaWJ1dGUoY2gpKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW15cc1x1MDBhMD08PlwiXCdcLz9dLyk7CiAgICAgICAgcmV0dXJuICJ4bWwtbmFtZSI7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbkF0dHJpYnV0ZShxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICBpZiAoc291cmNlLm5leHQoKSA9PSBxdW90ZSkgewogICAgICAgICAgICBzZXRTdGF0ZShpblRhZyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gInhtbC1hdHRyaWJ1dGUiOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGluQmxvY2soc3R5bGUsIHRlcm1pbmF0b3IpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgaWYgKHNvdXJjZS5sb29rQWhlYWQodGVybWluYXRvciwgdHJ1ZSkpIHsKICAgICAgICAgICAgc2V0U3RhdGUoaW5UZXh0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc3RhcnRTdGF0ZSkgewogICAgICByZXR1cm4gdG9rZW5pemVyKHNvdXJjZSwgc3RhcnRTdGF0ZSB8fCBpblRleHQpOwogICAgfTsKICB9KSgpOwoKICAvLyBUaGUgcGFyc2VyLiBUaGUgc3RydWN0dXJlIG9mIHRoaXMgZnVuY3Rpb24gbGFyZ2VseSBmb2xsb3dzIHRoYXQgb2YKICAvLyBwYXJzZUphdmFTY3JpcHQgaW4gcGFyc2VqYXZhc2NyaXB0LmpzICh0aGVyZSBpcyBhY3R1YWxseSBhIGJpdCBtb3JlCiAgLy8gc2hhcmVkIGNvZGUgdGhhbiBJJ2QgbGlrZSksIGJ1dCBpdCBpcyBxdWl0ZSBhIGJpdCBzaW1wbGVyLgogIGZ1bmN0aW9uIHBhcnNlWE1MKHNvdXJjZSkgewogICAgdmFyIHRva2VucyA9IHRva2VuaXplWE1MKHNvdXJjZSk7CiAgICB2YXIgY2MgPSBbYmFzZV07CiAgICB2YXIgdG9rZW5OciA9IDAsIGluZGVudGVkID0gMDsKICAgIHZhciBjdXJyZW50VGFnID0gbnVsbCwgY29udGV4dCA9IG51bGw7CiAgICB2YXIgY29uc3VtZSwgbWFya2VkOwogICAgCiAgICBmdW5jdGlvbiBwdXNoKGZzKSB7CiAgICAgIGZvciAodmFyIGkgPSBmcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKICAgICAgICBjYy5wdXNoKGZzW2ldKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnQoKSB7CiAgICAgIHB1c2goYXJndW1lbnRzKTsKICAgICAgY29uc3VtZSA9IHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBwYXNzKCkgewogICAgICBwdXNoKGFyZ3VtZW50cyk7CiAgICAgIGNvbnN1bWUgPSBmYWxzZTsKICAgIH0KCiAgICBmdW5jdGlvbiBtYXJrKHN0eWxlKSB7CiAgICAgIG1hcmtlZCA9IHN0eWxlOwogICAgfQogICAgZnVuY3Rpb24gZXhwZWN0KHRleHQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0eWxlLCBjb250ZW50KSB7CiAgICAgICAgaWYgKGNvbnRlbnQgPT0gdGV4dCkgY29udCgpOwogICAgICAgIGVsc2UgbWFyaygieG1sLWVycm9yIikgfHwgY29udChhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBwdXNoQ29udGV4dCh0YWduYW1lLCBzdGFydE9mTGluZSkgewogICAgICB2YXIgbm9JbmRlbnQgPSBVc2VLbHVkZ2VzLmRvTm90SW5kZW50Lmhhc093blByb3BlcnR5KHRhZ25hbWUpIHx8IChjb250ZXh0ICYmIGNvbnRleHQubm9JbmRlbnQpOwogICAgICBjb250ZXh0ID0ge3ByZXY6IGNvbnRleHQsIG5hbWU6IHRhZ25hbWUsIGluZGVudDogaW5kZW50ZWQsIHN0YXJ0T2ZMaW5lOiBzdGFydE9mTGluZSwgbm9JbmRlbnQ6IG5vSW5kZW50fTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvcENvbnRleHQoKSB7CiAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICB9CiAgICBmdW5jdGlvbiBjb21wdXRlSW5kZW50YXRpb24oYmFzZUNvbnRleHQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKG5leHRDaGFycywgY3VycmVudCkgewogICAgICAgIHZhciBjb250ZXh0ID0gYmFzZUNvbnRleHQ7CiAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5ub0luZGVudCkKICAgICAgICAgIHJldHVybiBjdXJyZW50OwogICAgICAgIGlmIChhbGlnbkNEQVRBICYmIC88IVxbQ0RBVEFcWy8udGVzdChuZXh0Q2hhcnMpKQogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKGNvbnRleHQgJiYgL148XC8vLnRlc3QobmV4dENoYXJzKSkKICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgICAgd2hpbGUgKGNvbnRleHQgJiYgIWNvbnRleHQuc3RhcnRPZkxpbmUpCiAgICAgICAgICBjb250ZXh0ID0gY29udGV4dC5wcmV2OwogICAgICAgIGlmIChjb250ZXh0KQogICAgICAgICAgcmV0dXJuIGNvbnRleHQuaW5kZW50ICsgaW5kZW50VW5pdDsKICAgICAgICBlbHNlCiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBiYXNlKCkgewogICAgICByZXR1cm4gcGFzcyhlbGVtZW50LCBiYXNlKTsKICAgIH0KICAgIHZhciBoYXJtbGVzc1Rva2VucyA9IHsieG1sLXRleHQiOiB0cnVlLCAieG1sLWVudGl0eSI6IHRydWUsICJ4bWwtY29tbWVudCI6IHRydWUsICJ4bWwtcHJvY2Vzc2luZyI6IHRydWV9OwogICAgZnVuY3Rpb24gZWxlbWVudChzdHlsZSwgY29udGVudCkgewogICAgICBpZiAoY29udGVudCA9PSAiPCIpIGNvbnQodGFnbmFtZSwgYXR0cmlidXRlcywgZW5kdGFnKHRva2VuTnIgPT0gMSkpOwogICAgICBlbHNlIGlmIChjb250ZW50ID09ICI8LyIpIGNvbnQoY2xvc2V0YWduYW1lLCBleHBlY3QoIj4iKSk7CiAgICAgIGVsc2UgaWYgKHN0eWxlID09ICJ4bWwtY2RhdGEiKSB7CiAgICAgICAgaWYgKCFjb250ZXh0IHx8IGNvbnRleHQubmFtZSAhPSAiIWNkYXRhIikgcHVzaENvbnRleHQoIiFjZGF0YSIpOwogICAgICAgIGlmICgvXF1cXT4kLy50ZXN0KGNvbnRlbnQpKSBwb3BDb250ZXh0KCk7CiAgICAgICAgY29udCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGhhcm1sZXNzVG9rZW5zLmhhc093blByb3BlcnR5KHN0eWxlKSkgY29udCgpOwogICAgICBlbHNlIG1hcmsoInhtbC1lcnJvciIpIHx8IGNvbnQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRhZ25hbWUoc3R5bGUsIGNvbnRlbnQpIHsKICAgICAgaWYgKHN0eWxlID09ICJ4bWwtbmFtZSIpIHsKICAgICAgICBjdXJyZW50VGFnID0gY29udGVudC50b0xvd2VyQ2FzZSgpOwogICAgICAgIG1hcmsoInhtbC10YWduYW1lIik7CiAgICAgICAgY29udCgpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGN1cnJlbnRUYWcgPSBudWxsOwogICAgICAgIHBhc3MoKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY2xvc2V0YWduYW1lKHN0eWxlLCBjb250ZW50KSB7CiAgICAgIGlmIChzdHlsZSA9PSAieG1sLW5hbWUiICYmIGNvbnRleHQgJiYgY29udGVudC50b0xvd2VyQ2FzZSgpID09IGNvbnRleHQubmFtZSkgewogICAgICAgIHBvcENvbnRleHQoKTsKICAgICAgICBtYXJrKCJ4bWwtdGFnbmFtZSIpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIG1hcmsoInhtbC1lcnJvciIpOwogICAgICB9CiAgICAgIGNvbnQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVuZHRhZyhzdGFydE9mTGluZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc3R5bGUsIGNvbnRlbnQpIHsKICAgICAgICBpZiAoY29udGVudCA9PSAiLz4iIHx8IChjb250ZW50ID09ICI+IiAmJiBVc2VLbHVkZ2VzLmF1dG9TZWxmQ2xvc2Vycy5oYXNPd25Qcm9wZXJ0eShjdXJyZW50VGFnKSkpIGNvbnQoKTsKICAgICAgICBlbHNlIGlmIChjb250ZW50ID09ICI+IikgcHVzaENvbnRleHQoY3VycmVudFRhZywgc3RhcnRPZkxpbmUpIHx8IGNvbnQoKTsKICAgICAgICBlbHNlIG1hcmsoInhtbC1lcnJvciIpIHx8IGNvbnQoYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBhdHRyaWJ1dGVzKHN0eWxlKSB7CiAgICAgIGlmIChzdHlsZSA9PSAieG1sLW5hbWUiKSBtYXJrKCJ4bWwtYXR0bmFtZSIpIHx8IGNvbnQoYXR0cmlidXRlLCBhdHRyaWJ1dGVzKTsKICAgICAgZWxzZSBwYXNzKCk7CiAgICB9CiAgICBmdW5jdGlvbiBhdHRyaWJ1dGUoc3R5bGUsIGNvbnRlbnQpIHsKICAgICAgaWYgKGNvbnRlbnQgPT0gIj0iKSBjb250KHZhbHVlKTsKICAgICAgZWxzZSBpZiAoY29udGVudCA9PSAiPiIgfHwgY29udGVudCA9PSAiLz4iKSBwYXNzKGVuZHRhZyk7CiAgICAgIGVsc2UgcGFzcygpOwogICAgfQogICAgZnVuY3Rpb24gdmFsdWUoc3R5bGUpIHsKICAgICAgaWYgKHN0eWxlID09ICJ4bWwtYXR0cmlidXRlIikgY29udCh2YWx1ZSk7CiAgICAgIGVsc2UgcGFzcygpOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgIGluZGVudGF0aW9uOiBmdW5jdGlvbigpIHtyZXR1cm4gaW5kZW50ZWQ7fSwKCiAgICAgIG5leHQ6IGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zLm5leHQoKTsKICAgICAgICBpZiAodG9rZW4uc3R5bGUgPT0gIndoaXRlc3BhY2UiICYmIHRva2VuTnIgPT0gMCkKICAgICAgICAgIGluZGVudGVkID0gdG9rZW4udmFsdWUubGVuZ3RoOwogICAgICAgIGVsc2UKICAgICAgICAgIHRva2VuTnIrKzsKICAgICAgICBpZiAodG9rZW4uY29udGVudCA9PSAiXG4iKSB7CiAgICAgICAgICBpbmRlbnRlZCA9IHRva2VuTnIgPSAwOwogICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBjb21wdXRlSW5kZW50YXRpb24oY29udGV4dCk7CiAgICAgICAgfQoKICAgICAgICBpZiAodG9rZW4uc3R5bGUgPT0gIndoaXRlc3BhY2UiIHx8IHRva2VuLnR5cGUgPT0gInhtbC1jb21tZW50IikKICAgICAgICAgIHJldHVybiB0b2tlbjsKCiAgICAgICAgd2hpbGUodHJ1ZSl7CiAgICAgICAgICBjb25zdW1lID0gbWFya2VkID0gZmFsc2U7CiAgICAgICAgICBjYy5wb3AoKSh0b2tlbi5zdHlsZSwgdG9rZW4uY29udGVudCk7CiAgICAgICAgICBpZiAoY29uc3VtZSl7CiAgICAgICAgICAgIGlmIChtYXJrZWQpCiAgICAgICAgICAgICAgdG9rZW4uc3R5bGUgPSBtYXJrZWQ7CiAgICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCgogICAgICBjb3B5OiBmdW5jdGlvbigpewogICAgICAgIHZhciBfY2MgPSBjYy5jb25jYXQoW10pLCBfdG9rZW5TdGF0ZSA9IHRva2Vucy5zdGF0ZSwgX2NvbnRleHQgPSBjb250ZXh0OwogICAgICAgIHZhciBwYXJzZXIgPSB0aGlzOwogICAgICAgIAogICAgICAgIHJldHVybiBmdW5jdGlvbihpbnB1dCl7CiAgICAgICAgICBjYyA9IF9jYy5jb25jYXQoW10pOwogICAgICAgICAgdG9rZW5OciA9IGluZGVudGVkID0gMDsKICAgICAgICAgIGNvbnRleHQgPSBfY29udGV4dDsKICAgICAgICAgIHRva2VucyA9IHRva2VuaXplWE1MKGlucHV0LCBfdG9rZW5TdGF0ZSk7CiAgICAgICAgICByZXR1cm4gcGFyc2VyOwogICAgICAgIH07CiAgICAgIH0KICAgIH07CiAgfQoKICByZXR1cm4gewogICAgbWFrZTogcGFyc2VYTUwsCiAgICBlbGVjdHJpY0NoYXJzOiAiLyIsCiAgICBjb25maWd1cmU6IGZ1bmN0aW9uKGNvbmZpZykgewogICAgICBpZiAoY29uZmlnLnVzZUhUTUxLbHVkZ2VzICE9IG51bGwpCiAgICAgICAgVXNlS2x1ZGdlcyA9IGNvbmZpZy51c2VIVE1MS2x1ZGdlcyA/IEtsdWRnZXMgOiBOb0tsdWRnZXM7CiAgICAgIGlmIChjb25maWcuYWxpZ25DREFUQSkKICAgICAgICBhbGlnbkNEQVRBID0gY29uZmlnLmFsaWduQ0RBVEE7CiAgICB9CiAgfTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/select.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogRnVuY3Rpb25hbGl0eSBmb3IgZmluZGluZywgc3RvcmluZywgYW5kIHJlc3RvcmluZyBzZWxlY3Rpb25zCiAqCiAqIFRoaXMgZG9lcyBub3QgcHJvdmlkZSBhIGdlbmVyaWMgQVBJLCBqdXN0IHRoZSBtaW5pbWFsIGZ1bmN0aW9uYWxpdHkKICogcmVxdWlyZWQgYnkgdGhlIENvZGVNaXJyb3Igc3lzdGVtLgogKi8KCi8vIE5hbWVzcGFjZSBvYmplY3QuCnZhciBzZWxlY3QgPSB7fTsKCihmdW5jdGlvbigpIHsKICBzZWxlY3QuaWVfc2VsZWN0aW9uID0gZG9jdW1lbnQuc2VsZWN0aW9uICYmIGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZUNvbGxlY3Rpb247CgogIC8vIEZpbmQgdGhlICd0b3AtbGV2ZWwnIChkZWZpbmVkIGFzICdhIGRpcmVjdCBjaGlsZCBvZiB0aGUgbm9kZQogIC8vIHBhc3NlZCBhcyB0aGUgdG9wIGFyZ3VtZW50Jykgbm9kZSB0aGF0IHRoZSBnaXZlbiBub2RlIGlzCiAgLy8gY29udGFpbmVkIGluLiBSZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW4gbm9kZSBpcyBub3QgaW5zaWRlIHRoZSB0b3AKICAvLyBub2RlLgogIGZ1bmN0aW9uIHRvcExldmVsTm9kZUF0KG5vZGUsIHRvcCkgewogICAgd2hpbGUgKG5vZGUgJiYgbm9kZS5wYXJlbnROb2RlICE9IHRvcCkKICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgLy8gRmluZCB0aGUgdG9wLWxldmVsIG5vZGUgdGhhdCBjb250YWlucyB0aGUgbm9kZSBiZWZvcmUgdGhpcyBvbmUuCiAgZnVuY3Rpb24gdG9wTGV2ZWxOb2RlQmVmb3JlKG5vZGUsIHRvcCkgewogICAgd2hpbGUgKCFub2RlLnByZXZpb3VzU2libGluZyAmJiBub2RlLnBhcmVudE5vZGUgIT0gdG9wKQogICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOwogICAgcmV0dXJuIHRvcExldmVsTm9kZUF0KG5vZGUucHJldmlvdXNTaWJsaW5nLCB0b3ApOwogIH0KCiAgLy8gVXNlZCB0byBwcmV2ZW50IHJlc3RvcmluZyBhIHNlbGVjdGlvbiB3aGVuIHdlIGRvIG5vdCBuZWVkIHRvLgogIHZhciBjdXJyZW50U2VsZWN0aW9uID0gbnVsbDsKCiAgdmFyIGZvdXJTcGFjZXMgPSAiXHUwMGEwXHUwMGEwXHUwMGEwXHUwMGEwIjsKCiAgc2VsZWN0LnNuYXBzaG90Q2hhbmdlZCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGN1cnJlbnRTZWxlY3Rpb24pIGN1cnJlbnRTZWxlY3Rpb24uY2hhbmdlZCA9IHRydWU7CiAgfTsKCiAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGNvZGUgaW4gZWRpdG9yLmpzIHdoZW5ldmVyIGl0IGlzIHJlcGxhY2luZwogIC8vIGEgdGV4dCBub2RlLiBUaGUgZnVuY3Rpb24gc2VlcyB3aGV0aGVyIHRoZSBnaXZlbiBvbGROb2RlIGlzIHBhcnQKICAvLyBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24sIGFuZCB1cGRhdGVzIHRoaXMgc2VsZWN0aW9uIGlmIGl0IGlzLgogIC8vIEJlY2F1c2Ugbm9kZXMgYXJlIG9mdGVuIG9ubHkgcGFydGlhbGx5IHJlcGxhY2VkLCB0aGUgbGVuZ3RoIG9mCiAgLy8gdGhlIHBhcnQgdGhhdCBnZXRzIHJlcGxhY2VkIGhhcyB0byBiZSB0YWtlbiBpbnRvIGFjY291bnQgLS0gdGhlCiAgLy8gc2VsZWN0aW9uIG1pZ2h0IHN0YXkgaW4gdGhlIG9sZE5vZGUgaWYgdGhlIG5ld05vZGUgaXMgc21hbGxlcgogIC8vIHRoYW4gdGhlIHNlbGVjdGlvbidzIG9mZnNldC4gVGhlIG9mZnNldCBhcmd1bWVudCBpcyBuZWVkZWQgaW4KICAvLyBjYXNlIHRoZSBzZWxlY3Rpb24gZG9lcyBtb3ZlIHRvIHRoZSBuZXcgb2JqZWN0LCBhbmQgdGhlIGdpdmVuCiAgLy8gbGVuZ3RoIGlzIG5vdCB0aGUgd2hvbGUgbGVuZ3RoIG9mIHRoZSBuZXcgbm9kZSAocGFydCBvZiBpdCBtaWdodAogIC8vIGhhdmUgYmVlbiB1c2VkIHRvIHJlcGxhY2UgYW5vdGhlciBub2RlKS4KICBzZWxlY3Quc25hcHNob3RSZXBsYWNlTm9kZSA9IGZ1bmN0aW9uKGZyb20sIHRvLCBsZW5ndGgsIG9mZnNldCkgewogICAgaWYgKCFjdXJyZW50U2VsZWN0aW9uKSByZXR1cm47CiAgICBjdXJyZW50U2VsZWN0aW9uLmNoYW5nZWQgPSB0cnVlOwoKICAgIGZ1bmN0aW9uIHJlcGxhY2UocG9pbnQpIHsKICAgICAgaWYgKGZyb20gPT0gcG9pbnQubm9kZSkgewogICAgICAgIGlmIChsZW5ndGggJiYgcG9pbnQub2Zmc2V0ID4gbGVuZ3RoKSB7CiAgICAgICAgICBwb2ludC5vZmZzZXQgLT0gbGVuZ3RoOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHBvaW50Lm5vZGUgPSB0bzsKICAgICAgICAgIHBvaW50Lm9mZnNldCArPSAob2Zmc2V0IHx8IDApOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmVwbGFjZShjdXJyZW50U2VsZWN0aW9uLnN0YXJ0KTsKICAgIHJlcGxhY2UoY3VycmVudFNlbGVjdGlvbi5lbmQpOwogIH07CgogIHNlbGVjdC5zbmFwc2hvdE1vdmUgPSBmdW5jdGlvbihmcm9tLCB0bywgZGlzdGFuY2UsIHJlbGF0aXZlLCBpZkF0U3RhcnQpIHsKICAgIGlmICghY3VycmVudFNlbGVjdGlvbikgcmV0dXJuOwogICAgY3VycmVudFNlbGVjdGlvbi5jaGFuZ2VkID0gdHJ1ZTsKCiAgICBmdW5jdGlvbiBtb3ZlKHBvaW50KSB7CiAgICAgIGlmIChmcm9tID09IHBvaW50Lm5vZGUgJiYgKCFpZkF0U3RhcnQgfHwgcG9pbnQub2Zmc2V0ID09IDApKSB7CiAgICAgICAgcG9pbnQubm9kZSA9IHRvOwogICAgICAgIGlmIChyZWxhdGl2ZSkgcG9pbnQub2Zmc2V0ID0gTWF0aC5tYXgoMCwgcG9pbnQub2Zmc2V0ICsgZGlzdGFuY2UpOwogICAgICAgIGVsc2UgcG9pbnQub2Zmc2V0ID0gZGlzdGFuY2U7CiAgICAgIH0KICAgIH0KICAgIG1vdmUoY3VycmVudFNlbGVjdGlvbi5zdGFydCk7CiAgICBtb3ZlKGN1cnJlbnRTZWxlY3Rpb24uZW5kKTsKICB9OwoKICAvLyBNb3N0IGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiB0d28gd2F5cywgb25lIGZvciB0aGUgSUUgc2VsZWN0aW9uCiAgLy8gbW9kZWwsIG9uZSBmb3IgdGhlIFczQyBvbmUuCiAgaWYgKHNlbGVjdC5pZV9zZWxlY3Rpb24pIHsKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbk5vZGUod2luLCBzdGFydCkgewogICAgICB2YXIgcmFuZ2UgPSB3aW4uZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CiAgICAgIHJhbmdlLmNvbGxhcHNlKHN0YXJ0KTsKCiAgICAgIGZ1bmN0aW9uIG5vZGVBZnRlcihub2RlKSB7CiAgICAgICAgdmFyIGZvdW5kID0gbnVsbDsKICAgICAgICB3aGlsZSAoIWZvdW5kICYmIG5vZGUpIHsKICAgICAgICAgIGZvdW5kID0gbm9kZS5uZXh0U2libGluZzsKICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub2RlQXRTdGFydE9mKGZvdW5kKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbm9kZUF0U3RhcnRPZihub2RlKSB7CiAgICAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZS5maXJzdENoaWxkKSBub2RlID0gbm9kZS5maXJzdENoaWxkOwogICAgICAgIHJldHVybiB7bm9kZTogbm9kZSwgb2Zmc2V0OiAwfTsKICAgICAgfQoKICAgICAgdmFyIGNvbnRhaW5pbmcgPSByYW5nZS5wYXJlbnRFbGVtZW50KCk7CiAgICAgIGlmICghaXNBbmNlc3Rvcih3aW4uZG9jdW1lbnQuYm9keSwgY29udGFpbmluZykpIHJldHVybiBudWxsOwogICAgICBpZiAoIWNvbnRhaW5pbmcuZmlyc3RDaGlsZCkgcmV0dXJuIG5vZGVBdFN0YXJ0T2YoY29udGFpbmluZyk7CgogICAgICB2YXIgd29ya2luZyA9IHJhbmdlLmR1cGxpY2F0ZSgpOwogICAgICB3b3JraW5nLm1vdmVUb0VsZW1lbnRUZXh0KGNvbnRhaW5pbmcpOwogICAgICB3b3JraW5nLmNvbGxhcHNlKHRydWUpOwogICAgICBmb3IgKHZhciBjdXIgPSBjb250YWluaW5nLmZpcnN0Q2hpbGQ7IGN1cjsgY3VyID0gY3VyLm5leHRTaWJsaW5nKSB7CiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSA9PSAzKSB7CiAgICAgICAgICB2YXIgc2l6ZSA9IGN1ci5ub2RlVmFsdWUubGVuZ3RoOwogICAgICAgICAgd29ya2luZy5tb3ZlKCJjaGFyYWN0ZXIiLCBzaXplKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB3b3JraW5nLm1vdmVUb0VsZW1lbnRUZXh0KGN1cik7CiAgICAgICAgICB3b3JraW5nLmNvbGxhcHNlKGZhbHNlKTsKICAgICAgICB9CgogICAgICAgIHZhciBkaXIgPSByYW5nZS5jb21wYXJlRW5kUG9pbnRzKCJTdGFydFRvU3RhcnQiLCB3b3JraW5nKTsKICAgICAgICBpZiAoZGlyID09IDApIHJldHVybiBub2RlQWZ0ZXIoY3VyKTsKICAgICAgICBpZiAoZGlyID09IDEpIGNvbnRpbnVlOwogICAgICAgIGlmIChjdXIubm9kZVR5cGUgIT0gMykgcmV0dXJuIG5vZGVBdFN0YXJ0T2YoY3VyKTsKCiAgICAgICAgd29ya2luZy5zZXRFbmRQb2ludCgiU3RhcnRUb0VuZCIsIHJhbmdlKTsKICAgICAgICByZXR1cm4ge25vZGU6IGN1ciwgb2Zmc2V0OiBzaXplIC0gd29ya2luZy50ZXh0Lmxlbmd0aH07CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGVBZnRlcihjb250YWluaW5nKTsKICAgIH0KCiAgICBzZWxlY3QubWFya1NlbGVjdGlvbiA9IGZ1bmN0aW9uKHdpbikgewogICAgICBjdXJyZW50U2VsZWN0aW9uID0gbnVsbDsKICAgICAgdmFyIHNlbCA9IHdpbi5kb2N1bWVudC5zZWxlY3Rpb247CiAgICAgIGlmICghc2VsKSByZXR1cm47CiAgICAgIHZhciBzdGFydCA9IHNlbGVjdGlvbk5vZGUod2luLCB0cnVlKSwKICAgICAgICAgIGVuZCA9IHNlbGVjdGlvbk5vZGUod2luLCBmYWxzZSk7CiAgICAgIGlmICghc3RhcnQgfHwgIWVuZCkgcmV0dXJuOwogICAgICBjdXJyZW50U2VsZWN0aW9uID0ge3N0YXJ0OiBzdGFydCwgZW5kOiBlbmQsIHdpbmRvdzogd2luLCBjaGFuZ2VkOiBmYWxzZX07CiAgICB9OwoKICAgIHNlbGVjdC5zZWxlY3RNYXJrZWQgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKCFjdXJyZW50U2VsZWN0aW9uIHx8ICFjdXJyZW50U2VsZWN0aW9uLmNoYW5nZWQpIHJldHVybjsKCiAgICAgIGZ1bmN0aW9uIG1ha2VSYW5nZShwb2ludCkgewogICAgICAgIHZhciByYW5nZSA9IGN1cnJlbnRTZWxlY3Rpb24ud2luZG93LmRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7CiAgICAgICAgdmFyIG5vZGUgPSBwb2ludC5ub2RlOwogICAgICAgIGlmICghbm9kZSkgewogICAgICAgICAgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQoY3VycmVudFNlbGVjdGlvbi53aW5kb3cuZG9jdW1lbnQuYm9keSk7CiAgICAgICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykgewogICAgICAgICAgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQobm9kZS5wYXJlbnROb2RlKTsKICAgICAgICAgIHZhciBvZmZzZXQgPSBwb2ludC5vZmZzZXQ7CiAgICAgICAgICB3aGlsZSAobm9kZS5wcmV2aW91c1NpYmxpbmcpIHsKICAgICAgICAgICAgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nOwogICAgICAgICAgICBvZmZzZXQgKz0gKG5vZGUuaW5uZXJUZXh0IHx8ICIiKS5sZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgICByYW5nZS5tb3ZlKCJjaGFyYWN0ZXIiLCBvZmZzZXQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KG5vZGUpOwogICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByYW5nZTsKICAgICAgfQoKICAgICAgdmFyIHN0YXJ0ID0gbWFrZVJhbmdlKGN1cnJlbnRTZWxlY3Rpb24uc3RhcnQpLCBlbmQgPSBtYWtlUmFuZ2UoY3VycmVudFNlbGVjdGlvbi5lbmQpOwogICAgICBzdGFydC5zZXRFbmRQb2ludCgiU3RhcnRUb0VuZCIsIGVuZCk7CiAgICAgIHN0YXJ0LnNlbGVjdCgpOwogICAgfTsKCiAgICAvLyBHZXQgdGhlIHRvcC1sZXZlbCBub2RlIHRoYXQgb25lIGVuZCBvZiB0aGUgY3Vyc29yIGlzIGluc2lkZSBvcgogICAgLy8gYWZ0ZXIuIE5vdGUgdGhhdCB0aGlzIHJldHVybnMgZmFsc2UgZm9yICdubyBjdXJzb3InLCBhbmQgbnVsbAogICAgLy8gZm9yICdzdGFydCBvZiBkb2N1bWVudCcuCiAgICBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgc3RhcnQpIHsKICAgICAgdmFyIHNlbGVjdGlvbiA9IGNvbnRhaW5lci5vd25lckRvY3VtZW50LnNlbGVjdGlvbjsKICAgICAgaWYgKCFzZWxlY3Rpb24pIHJldHVybiBmYWxzZTsKCiAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwogICAgICByYW5nZS5jb2xsYXBzZShzdGFydCk7CiAgICAgIHZhciBhcm91bmQgPSByYW5nZS5wYXJlbnRFbGVtZW50KCk7CiAgICAgIGlmIChhcm91bmQgJiYgaXNBbmNlc3Rvcihjb250YWluZXIsIGFyb3VuZCkpIHsKICAgICAgICAvLyBPbmx5IHVzZSB0aGlzIG5vZGUgaWYgdGhlIHNlbGVjdGlvbiBpcyBub3QgYXQgaXRzIHN0YXJ0LgogICAgICAgIHZhciByYW5nZTIgPSByYW5nZS5kdXBsaWNhdGUoKTsKICAgICAgICByYW5nZTIubW92ZVRvRWxlbWVudFRleHQoYXJvdW5kKTsKICAgICAgICBpZiAocmFuZ2UuY29tcGFyZUVuZFBvaW50cygiU3RhcnRUb1N0YXJ0IiwgcmFuZ2UyKSA9PSAtMSkKICAgICAgICAgIHJldHVybiB0b3BMZXZlbE5vZGVBdChhcm91bmQsIGNvbnRhaW5lcik7CiAgICAgIH0KICAgICAgLy8gRmFsbC1iYWNrIGhhY2sKICAgICAgdHJ5IHtyYW5nZS5wYXN0ZUhUTUwoIjxzcGFuIGlkPSd4eHgtdGVtcC14eHgnPjwvc3Bhbj4iKTt9CiAgICAgIGNhdGNoIChlKSB7cmV0dXJuIGZhbHNlO30KCiAgICAgIHZhciB0ZW1wID0gY29udGFpbmVyLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInh4eC10ZW1wLXh4eCIpOwogICAgICBpZiAodGVtcCkgewogICAgICAgIHZhciByZXN1bHQgPSB0b3BMZXZlbE5vZGVCZWZvcmUodGVtcCwgY29udGFpbmVyKTsKICAgICAgICByZW1vdmVFbGVtZW50KHRlbXApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKCiAgICAvLyBQbGFjZSB0aGUgY3Vyc29yIGFmdGVyIHRoaXMuc3RhcnQuIFRoaXMgaXMgb25seSB1c2VmdWwgd2hlbgogICAgLy8gbWFudWFsbHkgbW92aW5nIHRoZSBjdXJzb3IgaW5zdGVhZCBvZiByZXN0b3JpbmcgaXQgdG8gaXRzIG9sZAogICAgLy8gcG9zaXRpb24uCiAgICBzZWxlY3QuZm9jdXNBZnRlck5vZGUgPSBmdW5jdGlvbihub2RlLCBjb250YWluZXIpIHsKICAgICAgdmFyIHJhbmdlID0gY29udGFpbmVyLm93bmVyRG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsKICAgICAgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQobm9kZSB8fCBjb250YWluZXIpOwogICAgICByYW5nZS5jb2xsYXBzZSghbm9kZSk7CiAgICAgIHJhbmdlLnNlbGVjdCgpOwogICAgfTsKCiAgICBzZWxlY3Quc29tZXRoaW5nU2VsZWN0ZWQgPSBmdW5jdGlvbih3aW4pIHsKICAgICAgdmFyIHNlbCA9IHdpbi5kb2N1bWVudC5zZWxlY3Rpb247CiAgICAgIHJldHVybiBzZWwgJiYgKHNlbC5jcmVhdGVSYW5nZSgpLnRleHQgIT0gIiIpOwogICAgfTsKCiAgICBmdW5jdGlvbiBpbnNlcnRBdEN1cnNvcih3aW5kb3csIGh0bWwpIHsKICAgICAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5kb2N1bWVudC5zZWxlY3Rpb247CiAgICAgIGlmIChzZWxlY3Rpb24pIHsKICAgICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsKICAgICAgICByYW5nZS5wYXN0ZUhUTUwoaHRtbCk7CiAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOwogICAgICAgIHJhbmdlLnNlbGVjdCgpOwogICAgICB9CiAgICB9CgogICAgLy8gVXNlZCB0byBub3JtYWxpemUgdGhlIGVmZmVjdCBvZiB0aGUgZW50ZXIga2V5LCBzaW5jZSBicm93c2VycwogICAgLy8gZG8gd2lkZWx5IGRpZmZlcmVudCB0aGluZ3Mgd2hlbiBwcmVzc2luZyBlbnRlciBpbiBkZXNpZ25Nb2RlLgogICAgc2VsZWN0Lmluc2VydE5ld2xpbmVBdEN1cnNvciA9IGZ1bmN0aW9uKHdpbmRvdykgewogICAgICBpbnNlcnRBdEN1cnNvcih3aW5kb3csICI8YnI+Iik7CiAgICB9OwoKICAgIHNlbGVjdC5pbnNlcnRUYWJBdEN1cnNvciA9IGZ1bmN0aW9uKHdpbmRvdykgewogICAgICBpbnNlcnRBdEN1cnNvcih3aW5kb3csIGZvdXJTcGFjZXMpOwogICAgfTsKCiAgICAvLyBHZXQgdGhlIEJSIG5vZGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIG9uIHdoaWNoIHRoZSBjdXJzb3IKICAgIC8vIGN1cnJlbnRseSBpcywgYW5kIHRoZSBvZmZzZXQgaW50byB0aGUgbGluZS4gUmV0dXJucyBudWxsIGFzCiAgICAvLyBub2RlIGlmIGN1cnNvciBpcyBvbiBmaXJzdCBsaW5lLgogICAgc2VsZWN0LmN1cnNvclBvcyA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgc3RhcnQpIHsKICAgICAgdmFyIHNlbGVjdGlvbiA9IGNvbnRhaW5lci5vd25lckRvY3VtZW50LnNlbGVjdGlvbjsKICAgICAgaWYgKCFzZWxlY3Rpb24pIHJldHVybiBudWxsOwoKICAgICAgdmFyIHRvcE5vZGUgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZShjb250YWluZXIsIHN0YXJ0KTsKICAgICAgd2hpbGUgKHRvcE5vZGUgJiYgdG9wTm9kZS5ub2RlTmFtZSAhPSAiQlIiKQogICAgICAgIHRvcE5vZGUgPSB0b3BOb2RlLnByZXZpb3VzU2libGluZzsKCiAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLCByYW5nZTIgPSByYW5nZS5kdXBsaWNhdGUoKTsKICAgICAgcmFuZ2UuY29sbGFwc2Uoc3RhcnQpOwogICAgICBpZiAodG9wTm9kZSkgewogICAgICAgIHJhbmdlMi5tb3ZlVG9FbGVtZW50VGV4dCh0b3BOb2RlKTsKICAgICAgICByYW5nZTIuY29sbGFwc2UoZmFsc2UpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIC8vIFdoZW4gbm90aGluZyBpcyBzZWxlY3RlZCwgd2UgY2FuIGdldCBhbGwga2luZHMgb2YgZnVua3kgZXJyb3JzIGhlcmUuCiAgICAgICAgdHJ5IHsgcmFuZ2UyLm1vdmVUb0VsZW1lbnRUZXh0KGNvbnRhaW5lcik7IH0KICAgICAgICBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogICAgICAgIHJhbmdlMi5jb2xsYXBzZSh0cnVlKTsKICAgICAgfQogICAgICByYW5nZS5zZXRFbmRQb2ludCgiU3RhcnRUb1N0YXJ0IiwgcmFuZ2UyKTsKCiAgICAgIHJldHVybiB7bm9kZTogdG9wTm9kZSwgb2Zmc2V0OiByYW5nZS50ZXh0Lmxlbmd0aH07CiAgICB9OwoKICAgIHNlbGVjdC5zZXRDdXJzb3JQb3MgPSBmdW5jdGlvbihjb250YWluZXIsIGZyb20sIHRvKSB7CiAgICAgIGZ1bmN0aW9uIHJhbmdlQXQocG9zKSB7CiAgICAgICAgdmFyIHJhbmdlID0gY29udGFpbmVyLm93bmVyRG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsKICAgICAgICBpZiAoIXBvcy5ub2RlKSB7CiAgICAgICAgICByYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChjb250YWluZXIpOwogICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQocG9zLm5vZGUpOwogICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOwogICAgICAgIH0KICAgICAgICByYW5nZS5tb3ZlKCJjaGFyYWN0ZXIiLCBwb3Mub2Zmc2V0KTsKICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgIH0KCiAgICAgIHZhciByYW5nZSA9IHJhbmdlQXQoZnJvbSk7CiAgICAgIGlmICh0byAmJiB0byAhPSBmcm9tKQogICAgICAgIHJhbmdlLnNldEVuZFBvaW50KCJFbmRUb0VuZCIsIHJhbmdlQXQodG8pKTsKICAgICAgcmFuZ2Uuc2VsZWN0KCk7CiAgICB9CgogICAgLy8gTWFrZSBzdXJlIHRoZSBjdXJzb3IgaXMgdmlzaWJsZS4KICAgIHNlbGVjdC5zY3JvbGxUb0N1cnNvciA9IGZ1bmN0aW9uKGNvbnRhaW5lcikgewogICAgICB2YXIgc2VsZWN0aW9uID0gY29udGFpbmVyLm93bmVyRG9jdW1lbnQuc2VsZWN0aW9uOwogICAgICBpZiAoIXNlbGVjdGlvbikgcmV0dXJuIG51bGw7CiAgICAgIHNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLnNjcm9sbEludG9WaWV3KCk7CiAgICB9OwoKICAgIHNlbGVjdC5zY3JvbGxUb05vZGUgPSBmdW5jdGlvbihub2RlKSB7CiAgICAgIGlmICghbm9kZSkgcmV0dXJuOwogICAgICBub2RlLnNjcm9sbEludG9WaWV3KCk7CiAgICB9OwoKICAgIC8vIFNvbWUgaGFja3MgZm9yIHN0b3JpbmcgYW5kIHJlLXN0b3JpbmcgdGhlIHNlbGVjdGlvbiB3aGVuIHRoZSBlZGl0b3IgbG9zZXMgYW5kIHJlZ2FpbnMgZm9jdXMuCiAgICBzZWxlY3Quc2VsZWN0aW9uQ29vcmRzID0gZnVuY3Rpb24gKHdpbikgewogICAgICB2YXIgc2VsZWN0aW9uID0gd2luLmRvY3VtZW50LnNlbGVjdGlvbjsKICAgICAgaWYgKCFzZWxlY3Rpb24pIHJldHVybiBudWxsOwogICAgICB2YXIgc3RhcnQgPSBzZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKSwgZW5kID0gc3RhcnQuZHVwbGljYXRlKCk7CiAgICAgIHN0YXJ0LmNvbGxhcHNlKHRydWUpOwogICAgICBlbmQuY29sbGFwc2UoZmFsc2UpOwoKICAgICAgdmFyIGJvZHkgPSB3aW4uZG9jdW1lbnQuYm9keTsKICAgICAgcmV0dXJuIHtzdGFydDoge3g6IHN0YXJ0LmJvdW5kaW5nTGVmdCArIGJvZHkuc2Nyb2xsTGVmdCAtIDEsCiAgICAgICAgICAgICAgICAgICAgICB5OiBzdGFydC5ib3VuZGluZ1RvcCArIGJvZHkuc2Nyb2xsVG9wfSwKICAgICAgICAgICAgICBlbmQ6IHt4OiBlbmQuYm91bmRpbmdMZWZ0ICsgYm9keS5zY3JvbGxMZWZ0IC0gMSwKICAgICAgICAgICAgICAgICAgICB5OiBlbmQuYm91bmRpbmdUb3AgKyBib2R5LnNjcm9sbFRvcH19OwogICAgfTsKCiAgICAvLyBSZXN0b3JlIGEgc3RvcmVkIHNlbGVjdGlvbi4KICAgIHNlbGVjdC5zZWxlY3RDb29yZHMgPSBmdW5jdGlvbih3aW4sIGNvb3JkcykgewogICAgICBpZiAoIWNvb3JkcykgcmV0dXJuOwoKICAgICAgdmFyIHJhbmdlMSA9IHdpbi5kb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpLCByYW5nZTIgPSByYW5nZTEuZHVwbGljYXRlKCk7CiAgICAgIC8vIFRoaXMgY2FuIGZhaWwgZm9yIHZhcmlvdXMgaGFyZC10by1oYW5kbGUgcmVhc29ucy4KICAgICAgdHJ5IHsKICAgICAgICByYW5nZTEubW92ZVRvUG9pbnQoY29vcmRzLnN0YXJ0LngsIGNvb3Jkcy5zdGFydC55KTsKICAgICAgICByYW5nZTIubW92ZVRvUG9pbnQoY29vcmRzLmVuZC54LCBjb29yZHMuZW5kLnkpOwogICAgICAgIHJhbmdlMS5zZXRFbmRQb2ludCgiRW5kVG9TdGFydCIsIHJhbmdlMik7CiAgICAgICAgcmFuZ2UxLnNlbGVjdCgpOwogICAgICB9IGNhdGNoKGUpIHthbGVydChlLm1lc3NhZ2UpO30KICAgIH07CiAgfQogIC8vIFczQyBtb2RlbAogIGVsc2UgewogICAgLy8gU3RvcmUgc3RhcnQgYW5kIGVuZCBub2RlcywgYW5kIG9mZnNldHMgd2l0aGluIHRoZXNlLCBhbmQgcmVmZXIKICAgIC8vIGJhY2sgdG8gdGhlIHNlbGVjdGlvbiBvYmplY3QgZnJvbSB0aG9zZSBub2Rlcywgc28gdGhhdCB0aGlzCiAgICAvLyBvYmplY3QgY2FuIGJlIHVwZGF0ZWQgd2hlbiB0aGUgbm9kZXMgYXJlIHJlcGxhY2VkIGJlZm9yZSB0aGUKICAgIC8vIHNlbGVjdGlvbiBpcyByZXN0b3JlZC4KICAgIHNlbGVjdC5tYXJrU2VsZWN0aW9uID0gZnVuY3Rpb24gKHdpbikgewogICAgICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpOwogICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PSAwKQogICAgICAgIHJldHVybiAoY3VycmVudFNlbGVjdGlvbiA9IG51bGwpOwogICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKCiAgICAgIGN1cnJlbnRTZWxlY3Rpb24gPSB7CiAgICAgICAgc3RhcnQ6IHtub2RlOiByYW5nZS5zdGFydENvbnRhaW5lciwgb2Zmc2V0OiByYW5nZS5zdGFydE9mZnNldH0sCiAgICAgICAgZW5kOiB7bm9kZTogcmFuZ2UuZW5kQ29udGFpbmVyLCBvZmZzZXQ6IHJhbmdlLmVuZE9mZnNldH0sCiAgICAgICAgd2luZG93OiB3aW4sCiAgICAgICAgY2hhbmdlZDogZmFsc2UKICAgICAgfTsKCiAgICAgIC8vIFdlIHdhbnQgdGhlIG5vZGVzIHJpZ2h0IGF0IHRoZSBjdXJzb3IsIG5vdCBvbmUgb2YgdGhlaXIKICAgICAgLy8gYW5jZXN0b3JzIHdpdGggYSBzdWl0YWJsZSBvZmZzZXQuIFRoaXMgZ29lcyBkb3duIHRoZSBET00gdHJlZQogICAgICAvLyB1bnRpbCBhICdsZWFmJyBpcyByZWFjaGVkIChvciBpcyBpdCAqdXAqIHRoZSBET00gdHJlZT8pLgogICAgICBmdW5jdGlvbiBub3JtYWxpemUocG9pbnQpewogICAgICAgIHdoaWxlIChwb2ludC5ub2RlLm5vZGVUeXBlICE9IDMgJiYgcG9pbnQubm9kZS5ub2RlTmFtZSAhPSAiQlIiKSB7CiAgICAgICAgICB2YXIgbmV3Tm9kZSA9IHBvaW50Lm5vZGUuY2hpbGROb2Rlc1twb2ludC5vZmZzZXRdIHx8IHBvaW50Lm5vZGUubmV4dFNpYmxpbmc7CiAgICAgICAgICBwb2ludC5vZmZzZXQgPSAwOwogICAgICAgICAgd2hpbGUgKCFuZXdOb2RlICYmIHBvaW50Lm5vZGUucGFyZW50Tm9kZSkgewogICAgICAgICAgICBwb2ludC5ub2RlID0gcG9pbnQubm9kZS5wYXJlbnROb2RlOwogICAgICAgICAgICBuZXdOb2RlID0gcG9pbnQubm9kZS5uZXh0U2libGluZzsKICAgICAgICAgIH0KICAgICAgICAgIHBvaW50Lm5vZGUgPSBuZXdOb2RlOwogICAgICAgICAgaWYgKCFuZXdOb2RlKQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIG5vcm1hbGl6ZShjdXJyZW50U2VsZWN0aW9uLnN0YXJ0KTsKICAgICAgbm9ybWFsaXplKGN1cnJlbnRTZWxlY3Rpb24uZW5kKTsKICAgIH07CgogICAgc2VsZWN0LnNlbGVjdE1hcmtlZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKCFjdXJyZW50U2VsZWN0aW9uIHx8ICFjdXJyZW50U2VsZWN0aW9uLmNoYW5nZWQpIHJldHVybjsKICAgICAgdmFyIHdpbiA9IGN1cnJlbnRTZWxlY3Rpb24ud2luZG93LCByYW5nZSA9IHdpbi5kb2N1bWVudC5jcmVhdGVSYW5nZSgpOwoKICAgICAgZnVuY3Rpb24gc2V0UG9pbnQocG9pbnQsIHdoaWNoKSB7CiAgICAgICAgaWYgKHBvaW50Lm5vZGUpIHsKICAgICAgICAgIC8vIFNvbWUgbWFnaWMgdG8gZ2VuZXJhbGl6ZSB0aGUgc2V0dGluZyBvZiB0aGUgc3RhcnQgYW5kIGVuZAogICAgICAgICAgLy8gb2YgYSByYW5nZS4KICAgICAgICAgIGlmIChwb2ludC5vZmZzZXQgPT0gMCkKICAgICAgICAgICAgcmFuZ2VbInNldCIgKyB3aGljaCArICJCZWZvcmUiXShwb2ludC5ub2RlKTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgcmFuZ2VbInNldCIgKyB3aGljaF0ocG9pbnQubm9kZSwgcG9pbnQub2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHdpbi5kb2N1bWVudC5ib2R5Lmxhc3RDaGlsZCB8fCB3aW4uZG9jdW1lbnQuYm9keSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBzZXRQb2ludChjdXJyZW50U2VsZWN0aW9uLmVuZCwgIkVuZCIpOwogICAgICBzZXRQb2ludChjdXJyZW50U2VsZWN0aW9uLnN0YXJ0LCAiU3RhcnQiKTsKICAgICAgc2VsZWN0UmFuZ2UocmFuZ2UsIHdpbik7CiAgICB9OwoKICAgIC8vIEhlbHBlciBmb3Igc2VsZWN0aW5nIGEgcmFuZ2Ugb2JqZWN0LgogICAgZnVuY3Rpb24gc2VsZWN0UmFuZ2UocmFuZ2UsIHdpbmRvdykgewogICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7CiAgICB9OwogICAgZnVuY3Rpb24gc2VsZWN0aW9uUmFuZ2Uod2luZG93KSB7CiAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09IDApCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgfQoKICAgIC8vIEZpbmRpbmcgdGhlIHRvcC1sZXZlbCBub2RlIGF0IHRoZSBjdXJzb3IgaW4gdGhlIFczQyBpcywgYXMgeW91CiAgICAvLyBjYW4gc2VlLCBxdWl0ZSBhbiBpbnZvbHZlZCBwcm9jZXNzLgogICAgc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUgPSBmdW5jdGlvbihjb250YWluZXIsIHN0YXJ0KSB7CiAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvblJhbmdlKGNvbnRhaW5lci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KTsKICAgICAgaWYgKCFyYW5nZSkgcmV0dXJuIGZhbHNlOwoKICAgICAgdmFyIG5vZGUgPSBzdGFydCA/IHJhbmdlLnN0YXJ0Q29udGFpbmVyIDogcmFuZ2UuZW5kQ29udGFpbmVyOwogICAgICB2YXIgb2Zmc2V0ID0gc3RhcnQgPyByYW5nZS5zdGFydE9mZnNldCA6IHJhbmdlLmVuZE9mZnNldDsKICAgICAgLy8gV29yayBhcm91bmQgKHlldCBhbm90aGVyKSBidWcgaW4gT3BlcmEncyBzZWxlY3Rpb24gbW9kZWwuCiAgICAgIGlmICh3aW5kb3cub3BlcmEgJiYgIXN0YXJ0ICYmIHJhbmdlLmVuZENvbnRhaW5lciA9PSBjb250YWluZXIgJiYgcmFuZ2UuZW5kT2Zmc2V0ID09IHJhbmdlLnN0YXJ0T2Zmc2V0ICsgMSAmJgogICAgICAgICAgY29udGFpbmVyLmNoaWxkTm9kZXNbcmFuZ2Uuc3RhcnRPZmZzZXRdICYmIGNvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0XS5ub2RlTmFtZSA9PSAiQlIiKQogICAgICAgIG9mZnNldC0tOwoKICAgICAgLy8gRm9yIHRleHQgbm9kZXMsIHdlIGxvb2sgYXQgdGhlIG5vZGUgaXRzZWxmIGlmIHRoZSBjdXJzb3IgaXMKICAgICAgLy8gaW5zaWRlLCBvciBhdCB0aGUgbm9kZSBiZWZvcmUgaXQgaWYgdGhlIGN1cnNvciBpcyBhdCB0aGUKICAgICAgLy8gc3RhcnQuCiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpewogICAgICAgIGlmIChvZmZzZXQgPiAwKQogICAgICAgICAgcmV0dXJuIHRvcExldmVsTm9kZUF0KG5vZGUsIGNvbnRhaW5lcik7CiAgICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuIHRvcExldmVsTm9kZUJlZm9yZShub2RlLCBjb250YWluZXIpOwogICAgICB9CiAgICAgIC8vIE9jY2FzaW9uYWxseSwgYnJvd3NlcnMgd2lsbCByZXR1cm4gdGhlIEhUTUwgbm9kZSBhcwogICAgICAvLyBzZWxlY3Rpb24uIElmIHRoZSBvZmZzZXQgaXMgMCwgd2UgdGFrZSB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lCiAgICAgIC8vICgnYWZ0ZXIgbnVsbCcpLCBvdGhlcndpc2UsIHdlIHRha2UgdGhlIGxhc3Qgbm9kZS4KICAgICAgZWxzZSBpZiAobm9kZS5ub2RlTmFtZSA9PSAiSFRNTCIpIHsKICAgICAgICByZXR1cm4gKG9mZnNldCA9PSAxID8gbnVsbCA6IGNvbnRhaW5lci5sYXN0Q2hpbGQpOwogICAgICB9CiAgICAgIC8vIElmIHRoZSBnaXZlbiBub2RlIGlzIG91ciAnY29udGFpbmVyJywgd2UganVzdCBsb29rIHVwIHRoZQogICAgICAvLyBjb3JyZWN0IG5vZGUgYnkgdXNpbmcgdGhlIG9mZnNldC4KICAgICAgZWxzZSBpZiAobm9kZSA9PSBjb250YWluZXIpIHsKICAgICAgICByZXR1cm4gKG9mZnNldCA9PSAwKSA/IG51bGwgOiBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07CiAgICAgIH0KICAgICAgLy8gSW4gYW55IG90aGVyIGNhc2UsIHdlIGhhdmUgYSByZWd1bGFyIG5vZGUuIElmIHRoZSBjdXJzb3IgaXMKICAgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgbm9kZSwgd2UgdXNlIHRoZSBub2RlIGl0c2VsZiwgaWYgaXQgaXMgYXQKICAgICAgLy8gdGhlIHN0YXJ0LCB3ZSB1c2UgdGhlIG5vZGUgYmVmb3JlIGl0LCBhbmQgaW4gYW55IG90aGVyCiAgICAgIC8vIGNhc2UsIHdlIGxvb2sgdXAgdGhlIGNoaWxkIGJlZm9yZSB0aGUgY3Vyc29yIGFuZCB1c2UgdGhhdC4KICAgICAgZWxzZSB7CiAgICAgICAgaWYgKG9mZnNldCA9PSBub2RlLmNoaWxkTm9kZXMubGVuZ3RoKQogICAgICAgICAgcmV0dXJuIHRvcExldmVsTm9kZUF0KG5vZGUsIGNvbnRhaW5lcik7CiAgICAgICAgZWxzZSBpZiAob2Zmc2V0ID09IDApCiAgICAgICAgICByZXR1cm4gdG9wTGV2ZWxOb2RlQmVmb3JlKG5vZGUsIGNvbnRhaW5lcik7CiAgICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuIHRvcExldmVsTm9kZUF0KG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXSwgY29udGFpbmVyKTsKICAgICAgfQogICAgfTsKCiAgICBzZWxlY3QuZm9jdXNBZnRlck5vZGUgPSBmdW5jdGlvbihub2RlLCBjb250YWluZXIpIHsKICAgICAgdmFyIHdpbiA9IGNvbnRhaW5lci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LAogICAgICAgICAgcmFuZ2UgPSB3aW4uZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgcmFuZ2Uuc2V0U3RhcnRCZWZvcmUoY29udGFpbmVyLmZpcnN0Q2hpbGQgfHwgY29udGFpbmVyKTsKICAgICAgLy8gSW4gT3BlcmEsIHNldHRpbmcgdGhlIGVuZCBvZiBhIHJhbmdlIGF0IHRoZSBlbmQgb2YgYSBsaW5lCiAgICAgIC8vIChiZWZvcmUgYSBCUikgd2lsbCBjYXVzZSB0aGUgY3Vyc29yIHRvIGFwcGVhciBvbiB0aGUgbmV4dAogICAgICAvLyBsaW5lLCBzbyB3ZSBzZXQgdGhlIGVuZCBpbnNpZGUgb2YgdGhlIHN0YXJ0IG5vZGUgd2hlbgogICAgICAvLyBwb3NzaWJsZS4KICAgICAgaWYgKG5vZGUgJiYgIW5vZGUuZmlyc3RDaGlsZCkKICAgICAgICByYW5nZS5zZXRFbmRBZnRlcihub2RlKTsKICAgICAgZWxzZSBpZiAobm9kZSkKICAgICAgICByYW5nZS5zZXRFbmQobm9kZSwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCk7CiAgICAgIGVsc2UKICAgICAgICByYW5nZS5zZXRFbmRCZWZvcmUoY29udGFpbmVyLmZpcnN0Q2hpbGQgfHwgY29udGFpbmVyKTsKICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOwogICAgICBzZWxlY3RSYW5nZShyYW5nZSwgd2luKTsKICAgIH07CgogICAgc2VsZWN0LnNvbWV0aGluZ1NlbGVjdGVkID0gZnVuY3Rpb24od2luKSB7CiAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvblJhbmdlKHdpbik7CiAgICAgIHJldHVybiByYW5nZSAmJiAhcmFuZ2UuY29sbGFwc2VkOwogICAgfTsKCiAgICBmdW5jdGlvbiBpbnNlcnROb2RlQXRDdXJzb3Iod2luZG93LCBub2RlKSB7CiAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvblJhbmdlKHdpbmRvdyk7CiAgICAgIGlmICghcmFuZ2UpIHJldHVybjsKCiAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7CiAgICAgIHJhbmdlLmluc2VydE5vZGUobm9kZSk7CiAgICAgIHdlYmtpdExhc3RMaW5lSGFjayh3aW5kb3cuZG9jdW1lbnQuYm9keSk7CiAgICAgIHJhbmdlID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgIHJhbmdlLnNlbGVjdE5vZGUobm9kZSk7CiAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTsKICAgICAgc2VsZWN0UmFuZ2UocmFuZ2UsIHdpbmRvdyk7CiAgICB9CgogICAgc2VsZWN0Lmluc2VydE5ld2xpbmVBdEN1cnNvciA9IGZ1bmN0aW9uKHdpbmRvdykgewogICAgICBpbnNlcnROb2RlQXRDdXJzb3Iod2luZG93LCB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiQlIiKSk7CiAgICB9OwoKICAgIHNlbGVjdC5pbnNlcnRUYWJBdEN1cnNvciA9IGZ1bmN0aW9uKHdpbmRvdykgewogICAgICBpbnNlcnROb2RlQXRDdXJzb3Iod2luZG93LCB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZm91clNwYWNlcykpOwogICAgfTsKCiAgICBzZWxlY3QuY3Vyc29yUG9zID0gZnVuY3Rpb24oY29udGFpbmVyLCBzdGFydCkgewogICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb25SYW5nZSh3aW5kb3cpOwogICAgICBpZiAoIXJhbmdlKSByZXR1cm47CgogICAgICB2YXIgdG9wTm9kZSA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKGNvbnRhaW5lciwgc3RhcnQpOwogICAgICB3aGlsZSAodG9wTm9kZSAmJiB0b3BOb2RlLm5vZGVOYW1lICE9ICJCUiIpCiAgICAgICAgdG9wTm9kZSA9IHRvcE5vZGUucHJldmlvdXNTaWJsaW5nOwoKICAgICAgcmFuZ2UgPSByYW5nZS5jbG9uZVJhbmdlKCk7CiAgICAgIHJhbmdlLmNvbGxhcHNlKHN0YXJ0KTsKICAgICAgaWYgKHRvcE5vZGUpCiAgICAgICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcih0b3BOb2RlKTsKICAgICAgZWxzZQogICAgICAgIHJhbmdlLnNldFN0YXJ0QmVmb3JlKGNvbnRhaW5lcik7CiAgICAgIHJldHVybiB7bm9kZTogdG9wTm9kZSwgb2Zmc2V0OiByYW5nZS50b1N0cmluZygpLmxlbmd0aH07CiAgICB9OwoKICAgIHNlbGVjdC5zZXRDdXJzb3JQb3MgPSBmdW5jdGlvbihjb250YWluZXIsIGZyb20sIHRvKSB7CiAgICAgIHZhciB3aW4gPSBjb250YWluZXIub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldywKICAgICAgICAgIHJhbmdlID0gd2luLmRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CgogICAgICBmdW5jdGlvbiBzZXRQb2ludChub2RlLCBvZmZzZXQsIHNpZGUpIHsKICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICBub2RlID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgICAgZWxzZQogICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CgogICAgICAgIGlmICghbm9kZSkKICAgICAgICAgIHJldHVybjsKCiAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7CiAgICAgICAgICByYW5nZVsic2V0IiArIHNpZGUgKyAiQmVmb3JlIl0obm9kZSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHZhciBiYWNrbG9nID0gW10KICAgICAgICBmdW5jdGlvbiBkZWNvbXBvc2Uobm9kZSkgewogICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykKICAgICAgICAgICAgYmFja2xvZy5wdXNoKG5vZGUpOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBmb3JFYWNoKG5vZGUuY2hpbGROb2RlcywgZGVjb21wb3NlKTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgIHdoaWxlIChub2RlICYmICFiYWNrbG9nLmxlbmd0aCkgewogICAgICAgICAgICBkZWNvbXBvc2Uobm9kZSk7CiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGN1ciA9IGJhY2tsb2cuc2hpZnQoKTsKICAgICAgICAgIGlmICghY3VyKSByZXR1cm4gZmFsc2U7CgogICAgICAgICAgdmFyIGxlbmd0aCA9IGN1ci5ub2RlVmFsdWUubGVuZ3RoOwogICAgICAgICAgaWYgKGxlbmd0aCA+PSBvZmZzZXQpIHsKICAgICAgICAgICAgcmFuZ2VbInNldCIgKyBzaWRlXShjdXIsIG9mZnNldCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgb2Zmc2V0IC09IGxlbmd0aDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRvID0gdG8gfHwgZnJvbTsKICAgICAgaWYgKHNldFBvaW50KHRvLm5vZGUsIHRvLm9mZnNldCwgIkVuZCIpICYmIHNldFBvaW50KGZyb20ubm9kZSwgZnJvbS5vZmZzZXQsICJTdGFydCIpKQogICAgICAgIHNlbGVjdFJhbmdlKHJhbmdlLCB3aW4pOwogICAgfTsKCiAgICBzZWxlY3Quc2Nyb2xsVG9Ob2RlID0gZnVuY3Rpb24oZWxlbWVudCkgewogICAgICBpZiAoIWVsZW1lbnQpIHJldHVybjsKICAgICAgdmFyIGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudCwgYm9keSA9IGRvYy5ib2R5LCB3aW4gPSBkb2MuZGVmYXVsdFZpZXcsIGh0bWwgPSBkb2MuZG9jdW1lbnRFbGVtZW50OwogICAgICAKICAgICAgLy8gSW4gT3BlcmEsIEJSIGVsZW1lbnRzICphbHdheXMqIGhhdmUgYSBzY3JvbGxUb3AgcHJvcGVydHkgb2YgemVyby4gR28gT3BlcmEuCiAgICAgIHdoaWxlIChlbGVtZW50ICYmICFlbGVtZW50Lm9mZnNldFRvcCkKICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wcmV2aW91c1NpYmxpbmc7CgogICAgICB2YXIgeSA9IDAsIHBvcyA9IGVsZW1lbnQ7CiAgICAgIHdoaWxlIChwb3MgJiYgcG9zLm9mZnNldFBhcmVudCkgewogICAgICAgIHkgKz0gcG9zLm9mZnNldFRvcDsKICAgICAgICBwb3MgPSBwb3Mub2Zmc2V0UGFyZW50OwogICAgICB9CgogICAgICB2YXIgc2NyZWVuX3kgPSB5IC0gKGJvZHkuc2Nyb2xsVG9wIHx8IGh0bWwuc2Nyb2xsVG9wIHx8IDApOwogICAgICBpZiAoc2NyZWVuX3kgPCAwIHx8IHNjcmVlbl95ID4gd2luLmlubmVySGVpZ2h0IC0gMzApCiAgICAgICAgd2luLnNjcm9sbFRvKGJvZHkuc2Nyb2xsTGVmdCB8fCBodG1sLnNjcm9sbExlZnQgfHwgMCwgeSk7CiAgICB9OwoKICAgIHNlbGVjdC5zY3JvbGxUb0N1cnNvciA9IGZ1bmN0aW9uKGNvbnRhaW5lcikgewogICAgICBzZWxlY3Quc2Nyb2xsVG9Ob2RlKHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKGNvbnRhaW5lciwgdHJ1ZSkgfHwgY29udGFpbmVyLmZpcnN0Q2hpbGQpOwogICAgfTsKICB9Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/stringstream.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogU3RyaW5nIHN0cmVhbXMgYXJlIHRoZSB0aGluZ3MgZmVkIHRvIHBhcnNlcnMgKHdoaWNoIGNhbiBmZWVkIHRoZW0KICogdG8gYSB0b2tlbml6ZXIgaWYgdGhleSB3YW50KS4gVGhleSBwcm92aWRlIHBlZWsgYW5kIG5leHQgbWV0aG9kcwogKiBmb3IgbG9va2luZyBhdCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgKG5leHQgJ2NvbnN1bWVzJyB0aGlzCiAqIGNoYXJhY3RlciwgcGVlayBkb2VzIG5vdCksIGFuZCBhIGdldCBtZXRob2QgZm9yIHJldHJpZXZpbmcgYWxsIHRoZQogKiB0ZXh0IHRoYXQgd2FzIGNvbnN1bWVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgZ2V0IHdhcyBjYWxsZWQuCiAqCiAqIEFuIGVhc3kgbWlzdGFrZSB0byBtYWtlIGlzIHRvIGxldCBhIFN0b3BJdGVyYXRpb24gZXhjZXB0aW9uIGZpbmlzaAogKiB0aGUgdG9rZW4gc3RyZWFtIHdoaWxlIHRoZXJlIGFyZSBzdGlsbCBjaGFyYWN0ZXJzIHBlbmRpbmcgaW4gdGhlCiAqIHN0cmluZyBzdHJlYW0gKGhpdHRpbmcgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIHBhcnNpbmcgYQogKiB0b2tlbikuIFRvIG1ha2UgaXQgZWFzaWVyIHRvIGRldGVjdCBzdWNoIGVycm9ycywgdGhlIHN0cmluZ3MgdGhyb3cKICogYW4gZXhjZXB0aW9uIHdoZW4gdGhpcyBoYXBwZW5zLgogKi8KCi8vIE1ha2UgYSBzdHJpbmcgc3RyZWFtIG91dCBvZiBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgc3RyaW5ncy4gVGhpcwovLyBpcyBhcHBsaWVkIHRvIHRoZSByZXN1bHQgb2YgdHJhdmVyc2VET00gKHNlZSBjb2RlbWlycm9yLmpzKSwgYW5kCi8vIHRoZSByZXN1bHRpbmcgc3RyZWFtIGlzIGZlZCB0byB0aGUgcGFyc2VyLgp3aW5kb3cuc3RyaW5nU3RyZWFtID0gZnVuY3Rpb24oc291cmNlKXsKICAvLyBTdHJpbmcgdGhhdCdzIGN1cnJlbnRseSBiZWluZyBpdGVyYXRlZCBvdmVyLgogIHZhciBjdXJyZW50ID0gIiI7CiAgLy8gUG9zaXRpb24gaW4gdGhhdCBzdHJpbmcuCiAgdmFyIHBvcyA9IDA7CiAgLy8gQWNjdW11bGF0b3IgZm9yIHN0cmluZ3MgdGhhdCBoYXZlIGJlZW4gaXRlcmF0ZWQgb3ZlciBidXQgbm90CiAgLy8gZ2V0KCktZWQgeWV0LgogIHZhciBhY2N1bSA9ICIiOwogIC8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbW9yZSBjaGFyYWN0ZXJzIHJlYWR5LCBvciB0aHJvdwogIC8vIFN0b3BJdGVyYXRpb24uCiAgZnVuY3Rpb24gZW5zdXJlQ2hhcnMoKSB7CiAgICB3aGlsZSAocG9zID09IGN1cnJlbnQubGVuZ3RoKSB7CiAgICAgIGFjY3VtICs9IGN1cnJlbnQ7CiAgICAgIGN1cnJlbnQgPSAiIjsgLy8gSW4gY2FzZSBzb3VyY2UubmV4dCgpIHRocm93cwogICAgICBwb3MgPSAwOwogICAgICB0cnkge2N1cnJlbnQgPSBzb3VyY2UubmV4dCgpO30KICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICBpZiAoZSAhPSBTdG9wSXRlcmF0aW9uKSB0aHJvdyBlOwogICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHJldHVybiB7CiAgICAvLyBSZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBzdHJlYW0uCiAgICBwZWVrOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCFlbnN1cmVDaGFycygpKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIGN1cnJlbnQuY2hhckF0KHBvcyk7CiAgICB9LAogICAgLy8gR2V0IHRoZSBuZXh0IGNoYXJhY3RlciwgdGhyb3cgU3RvcEl0ZXJhdGlvbiBpZiBhdCBlbmQsIGNoZWNrCiAgICAvLyBmb3IgdW51c2VkIGNvbnRlbnQuCiAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCFlbnN1cmVDaGFycygpKSB7CiAgICAgICAgaWYgKGFjY3VtLmxlbmd0aCA+IDApCiAgICAgICAgICB0aHJvdyAiRW5kIG9mIHN0cmluZ3N0cmVhbSByZWFjaGVkIHdpdGhvdXQgZW1wdHlpbmcgYnVmZmVyICgnIiArIGFjY3VtICsgIicpLiI7CiAgICAgICAgZWxzZQogICAgICAgICAgdGhyb3cgU3RvcEl0ZXJhdGlvbjsKICAgICAgfQogICAgICByZXR1cm4gY3VycmVudC5jaGFyQXQocG9zKyspOwogICAgfSwKICAgIC8vIFJldHVybiB0aGUgY2hhcmFjdGVycyBpdGVyYXRlZCBvdmVyIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KICAgIC8vIC5nZXQoKS4KICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHZhciB0ZW1wID0gYWNjdW07CiAgICAgIGFjY3VtID0gIiI7CiAgICAgIGlmIChwb3MgPiAwKXsKICAgICAgICB0ZW1wICs9IGN1cnJlbnQuc2xpY2UoMCwgcG9zKTsKICAgICAgICBjdXJyZW50ID0gY3VycmVudC5zbGljZShwb3MpOwogICAgICAgIHBvcyA9IDA7CiAgICAgIH0KICAgICAgcmV0dXJuIHRlbXA7CiAgICB9LAogICAgLy8gUHVzaCBhIHN0cmluZyBiYWNrIGludG8gdGhlIHN0cmVhbS4KICAgIHB1c2g6IGZ1bmN0aW9uKHN0cikgewogICAgICBjdXJyZW50ID0gY3VycmVudC5zbGljZSgwLCBwb3MpICsgc3RyICsgY3VycmVudC5zbGljZShwb3MpOwogICAgfSwKICAgIGxvb2tBaGVhZDogZnVuY3Rpb24oc3RyLCBjb25zdW1lLCBza2lwU3BhY2VzLCBjYXNlSW5zZW5zaXRpdmUpIHsKICAgICAgZnVuY3Rpb24gY2FzZWQoc3RyKSB7cmV0dXJuIGNhc2VJbnNlbnNpdGl2ZSA/IHN0ci50b0xvd2VyQ2FzZSgpIDogc3RyO30KICAgICAgc3RyID0gY2FzZWQoc3RyKTsKICAgICAgdmFyIGZvdW5kID0gZmFsc2U7CgogICAgICB2YXIgX2FjY3VtID0gYWNjdW0sIF9wb3MgPSBwb3M7CiAgICAgIGlmIChza2lwU3BhY2VzKSB0aGlzLm5leHRXaGlsZU1hdGNoZXMoL1tcc1x1MDBhMF0vKTsKCiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdmFyIGVuZCA9IHBvcyArIHN0ci5sZW5ndGgsIGxlZnQgPSBjdXJyZW50Lmxlbmd0aCAtIHBvczsKICAgICAgICBpZiAoZW5kIDw9IGN1cnJlbnQubGVuZ3RoKSB7CiAgICAgICAgICBmb3VuZCA9IHN0ciA9PSBjYXNlZChjdXJyZW50LnNsaWNlKHBvcywgZW5kKSk7CiAgICAgICAgICBwb3MgPSBlbmQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc3RyLnNsaWNlKDAsIGxlZnQpID09IGNhc2VkKGN1cnJlbnQuc2xpY2UocG9zKSkpIHsKICAgICAgICAgIGFjY3VtICs9IGN1cnJlbnQ7IGN1cnJlbnQgPSAiIjsKICAgICAgICAgIHRyeSB7Y3VycmVudCA9IHNvdXJjZS5uZXh0KCk7fQogICAgICAgICAgY2F0Y2ggKGUpIHticmVhazt9CiAgICAgICAgICBwb3MgPSAwOwogICAgICAgICAgc3RyID0gc3RyLnNsaWNlKGxlZnQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKCEoZm91bmQgJiYgY29uc3VtZSkpIHsKICAgICAgICBjdXJyZW50ID0gYWNjdW0uc2xpY2UoX2FjY3VtLmxlbmd0aCkgKyBjdXJyZW50OwogICAgICAgIHBvcyA9IF9wb3M7CiAgICAgICAgYWNjdW0gPSBfYWNjdW07CiAgICAgIH0KCiAgICAgIHJldHVybiBmb3VuZDsKICAgIH0sCgogICAgLy8gVXRpbHMgYnVpbHQgb24gdG9wIG9mIHRoZSBhYm92ZQogICAgbW9yZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLnBlZWsoKSAhPT0gbnVsbDsKICAgIH0sCiAgICBhcHBsaWVzOiBmdW5jdGlvbih0ZXN0KSB7CiAgICAgIHZhciBuZXh0ID0gdGhpcy5wZWVrKCk7CiAgICAgIHJldHVybiAobmV4dCAhPT0gbnVsbCAmJiB0ZXN0KG5leHQpKTsKICAgIH0sCiAgICBuZXh0V2hpbGU6IGZ1bmN0aW9uKHRlc3QpIHsKICAgICAgdmFyIG5leHQ7CiAgICAgIHdoaWxlICgobmV4dCA9IHRoaXMucGVlaygpKSAhPT0gbnVsbCAmJiB0ZXN0KG5leHQpKQogICAgICAgIHRoaXMubmV4dCgpOwogICAgfSwKICAgIG1hdGNoZXM6IGZ1bmN0aW9uKHJlKSB7CiAgICAgIHZhciBuZXh0ID0gdGhpcy5wZWVrKCk7CiAgICAgIHJldHVybiAobmV4dCAhPT0gbnVsbCAmJiByZS50ZXN0KG5leHQpKTsKICAgIH0sCiAgICBuZXh0V2hpbGVNYXRjaGVzOiBmdW5jdGlvbihyZSkgewogICAgICB2YXIgbmV4dDsKICAgICAgd2hpbGUgKChuZXh0ID0gdGhpcy5wZWVrKCkpICE9PSBudWxsICYmIHJlLnRlc3QobmV4dCkpCiAgICAgICAgdGhpcy5uZXh0KCk7CiAgICB9LAogICAgZXF1YWxzOiBmdW5jdGlvbihjaCkgewogICAgICByZXR1cm4gY2ggPT09IHRoaXMucGVlaygpOwogICAgfSwKICAgIGVuZE9mTGluZTogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBuZXh0ID0gdGhpcy5wZWVrKCk7CiAgICAgIHJldHVybiBuZXh0ID09IG51bGwgfHwgbmV4dCA9PSAiXG4iOwogICAgfQogIH07Cn07Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/tokenize.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQSBmcmFtZXdvcmsgZm9yIHNpbXBsZSB0b2tlbml6ZXJzLiBUYWtlcyBjYXJlIG9mIG5ld2xpbmVzIGFuZAovLyB3aGl0ZS1zcGFjZSwgYW5kIG9mIGdldHRpbmcgdGhlIHRleHQgZnJvbSB0aGUgc291cmNlIHN0cmVhbSBpbnRvCi8vIHRoZSB0b2tlbiBvYmplY3QuIEEgc3RhdGUgaXMgYSBmdW5jdGlvbiBvZiB0d28gYXJndW1lbnRzIC0tIGEKLy8gc3RyaW5nIHN0cmVhbSBhbmQgYSBzZXRTdGF0ZSBmdW5jdGlvbi4gVGhlIHNlY29uZCBjYW4gYmUgdXNlZCB0bwovLyBjaGFuZ2UgdGhlIHRva2VuaXplcidzIHN0YXRlLCBhbmQgY2FuIGJlIGlnbm9yZWQgZm9yIHN0YXRlbGVzcwovLyB0b2tlbml6ZXJzLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhZHZhbmNlIHRoZSBzdHJlYW0gb3ZlciBhIHRva2VuCi8vIGFuZCByZXR1cm4gYSBzdHJpbmcgb3Igb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5leHQKLy8gdG9rZW4sIG9yIG51bGwgdG8gcGFzcyBhbmQgaGF2ZSB0aGUgKG5ldykgc3RhdGUgYmUgY2FsbGVkIHRvIGZpbmlzaAovLyB0aGUgdG9rZW4uIFdoZW4gYSBzdHJpbmcgaXMgZ2l2ZW4sIGl0IGlzIHdyYXBwZWQgaW4gYSB7c3R5bGUsIHR5cGV9Ci8vIG9iamVjdC4gSW4gdGhlIHJlc3VsdGluZyBvYmplY3QsIHRoZSBjaGFyYWN0ZXJzIGNvbnN1bWVkIGFyZSBzdG9yZWQKLy8gdW5kZXIgdGhlIGNvbnRlbnQgcHJvcGVydHkuIEFueSB3aGl0ZXNwYWNlIGZvbGxvd2luZyB0aGVtIGlzIGFsc28KLy8gYXV0b21hdGljYWxseSBjb25zdW1lZCwgYW5kIGFkZGVkIHRvIHRoZSB2YWx1ZSBwcm9wZXJ0eS4gKFRodXMsCi8vIGNvbnRlbnQgaXMgdGhlIGFjdHVhbCBtZWFuaW5nZnVsIHBhcnQgb2YgdGhlIHRva2VuLCB3aGlsZSB2YWx1ZQovLyBjb250YWlucyBhbGwgdGhlIHRleHQgaXQgc3BhbnMuKQoKZnVuY3Rpb24gdG9rZW5pemVyKHNvdXJjZSwgc3RhdGUpIHsKICAvLyBOZXdsaW5lcyBhcmUgYWx3YXlzIGEgc2VwYXJhdGUgdG9rZW4uCiAgZnVuY3Rpb24gaXNXaGl0ZVNwYWNlKGNoKSB7CiAgICAvLyBUaGUgbWVzc3kgcmVnZXhwIGlzIGJlY2F1c2UgSUUncyByZWdleHAgbWF0Y2hlciBpcyBvZiB0aGUKICAgIC8vIG9waW5pb24gdGhhdCBub24tYnJlYWtpbmcgc3BhY2VzIGFyZSBubyB3aGl0ZXNwYWNlLgogICAgcmV0dXJuIGNoICE9ICJcbiIgJiYgL15bXHNcdTAwYTBdKiQvLnRlc3QoY2gpOwogIH0KCiAgdmFyIHRva2VuaXplciA9IHsKICAgIHN0YXRlOiBzdGF0ZSwKCiAgICB0YWtlOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgIGlmICh0eXBlb2YodHlwZSkgPT0gInN0cmluZyIpCiAgICAgICAgdHlwZSA9IHtzdHlsZTogdHlwZSwgdHlwZTogdHlwZX07CgogICAgICB0eXBlLmNvbnRlbnQgPSAodHlwZS5jb250ZW50IHx8ICIiKSArIHNvdXJjZS5nZXQoKTsKICAgICAgaWYgKCEvXG4kLy50ZXN0KHR5cGUuY29udGVudCkpCiAgICAgICAgc291cmNlLm5leHRXaGlsZShpc1doaXRlU3BhY2UpOwogICAgICB0eXBlLnZhbHVlID0gdHlwZS5jb250ZW50ICsgc291cmNlLmdldCgpOwogICAgICByZXR1cm4gdHlwZTsKICAgIH0sCgogICAgbmV4dDogZnVuY3Rpb24gKCkgewogICAgICBpZiAoIXNvdXJjZS5tb3JlKCkpIHRocm93IFN0b3BJdGVyYXRpb247CgogICAgICB2YXIgdHlwZTsKICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIlxuIikpIHsKICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgIHJldHVybiB0aGlzLnRha2UoIndoaXRlc3BhY2UiKTsKICAgICAgfQogICAgICAKICAgICAgaWYgKHNvdXJjZS5hcHBsaWVzKGlzV2hpdGVTcGFjZSkpCiAgICAgICAgdHlwZSA9ICJ3aGl0ZXNwYWNlIjsKICAgICAgZWxzZQogICAgICAgIHdoaWxlICghdHlwZSkKICAgICAgICAgIHR5cGUgPSB0aGlzLnN0YXRlKHNvdXJjZSwgZnVuY3Rpb24ocykge3Rva2VuaXplci5zdGF0ZSA9IHM7fSk7CgogICAgICByZXR1cm4gdGhpcy50YWtlKHR5cGUpOwogICAgfQogIH07CiAgcmV0dXJuIHRva2VuaXplcjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/tokenizejavascript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVG9rZW5pemVyIGZvciBKYXZhU2NyaXB0IGNvZGUgKi8KCnZhciB0b2tlbml6ZUphdmFTY3JpcHQgPSAoZnVuY3Rpb24oKSB7CiAgLy8gQWR2YW5jZSB0aGUgc3RyZWFtIHVudGlsIHRoZSBnaXZlbiBjaGFyYWN0ZXIgKG5vdCBwcmVjZWRlZCBieSBhCiAgLy8gYmFja3NsYXNoKSBpcyBlbmNvdW50ZXJlZCwgb3IgdGhlIGVuZCBvZiB0aGUgbGluZSBpcyByZWFjaGVkLgogIGZ1bmN0aW9uIG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsIGVuZCkgewogICAgdmFyIGVzY2FwZWQgPSBmYWxzZTsKICAgIHZhciBuZXh0OwogICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgdmFyIG5leHQgPSBzb3VyY2UubmV4dCgpOwogICAgICBpZiAobmV4dCA9PSBlbmQgJiYgIWVzY2FwZWQpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgfQogICAgcmV0dXJuIGVzY2FwZWQ7CiAgfQoKICAvLyBBIG1hcCBvZiBKYXZhU2NyaXB0J3Mga2V5d29yZHMuIFRoZSBhL2IvYyBrZXl3b3JkIGRpc3RpbmN0aW9uIGlzCiAgLy8gdmVyeSByb3VnaCwgYnV0IGl0IGdpdmVzIHRoZSBwYXJzZXIgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHBhcnNlCiAgLy8gY29ycmVjdCBjb2RlIGNvcnJlY3RseSAod2UgZG9uJ3QgY2FyZSB0aGF0IG11Y2ggaG93IHdlIHBhcnNlCiAgLy8gaW5jb3JyZWN0IGNvZGUpLiBUaGUgc3R5bGUgaW5mb3JtYXRpb24gaW5jbHVkZWQgaW4gdGhlc2Ugb2JqZWN0cwogIC8vIGlzIHVzZWQgYnkgdGhlIGhpZ2hsaWdodGVyIHRvIHBpY2sgdGhlIGNvcnJlY3QgQ1NTIHN0eWxlIGZvciBhCiAgLy8gdG9rZW4uCiAgdmFyIGtleXdvcmRzID0gZnVuY3Rpb24oKXsKICAgIGZ1bmN0aW9uIHJlc3VsdCh0eXBlLCBzdHlsZSl7CiAgICAgIHJldHVybiB7dHlwZTogdHlwZSwgc3R5bGU6ICJqcy0iICsgc3R5bGV9OwogICAgfQogICAgLy8ga2V5d29yZHMgdGhhdCB0YWtlIGEgcGFyZW50aGlzZWQgZXhwcmVzc2lvbiwgYW5kIHRoZW4gYQogICAgLy8gc3RhdGVtZW50IChpZikKICAgIHZhciBrZXl3b3JkQSA9IHJlc3VsdCgia2V5d29yZCBhIiwgImtleXdvcmQiKTsKICAgIC8vIGtleXdvcmRzIHRoYXQgdGFrZSBqdXN0IGEgc3RhdGVtZW50IChlbHNlKQogICAgdmFyIGtleXdvcmRCID0gcmVzdWx0KCJrZXl3b3JkIGIiLCAia2V5d29yZCIpOwogICAgLy8ga2V5d29yZHMgdGhhdCBvcHRpb25hbGx5IHRha2UgYW4gZXhwcmVzc2lvbiwgYW5kIGZvcm0gYQogICAgLy8gc3RhdGVtZW50IChyZXR1cm4pCiAgICB2YXIga2V5d29yZEMgPSByZXN1bHQoImtleXdvcmQgYyIsICJrZXl3b3JkIik7CiAgICB2YXIgb3BlcmF0b3IgPSByZXN1bHQoIm9wZXJhdG9yIiwgImtleXdvcmQiKTsKICAgIHZhciBhdG9tID0gcmVzdWx0KCJhdG9tIiwgImF0b20iKTsKICAgIHJldHVybiB7CiAgICAgICJpZiI6IGtleXdvcmRBLCAid2hpbGUiOiBrZXl3b3JkQSwgIndpdGgiOiBrZXl3b3JkQSwKICAgICAgImVsc2UiOiBrZXl3b3JkQiwgImRvIjoga2V5d29yZEIsICJ0cnkiOiBrZXl3b3JkQiwgImZpbmFsbHkiOiBrZXl3b3JkQiwKICAgICAgInJldHVybiI6IGtleXdvcmRDLCAiYnJlYWsiOiBrZXl3b3JkQywgImNvbnRpbnVlIjoga2V5d29yZEMsICJuZXciOiBrZXl3b3JkQywgImRlbGV0ZSI6IGtleXdvcmRDLCAidGhyb3ciOiBrZXl3b3JkQywKICAgICAgImluIjogb3BlcmF0b3IsICJ0eXBlb2YiOiBvcGVyYXRvciwgImluc3RhbmNlb2YiOiBvcGVyYXRvciwKICAgICAgInZhciI6IHJlc3VsdCgidmFyIiwgImtleXdvcmQiKSwgImZ1bmN0aW9uIjogcmVzdWx0KCJmdW5jdGlvbiIsICJrZXl3b3JkIiksICJjYXRjaCI6IHJlc3VsdCgiY2F0Y2giLCAia2V5d29yZCIpLAogICAgICAiZm9yIjogcmVzdWx0KCJmb3IiLCAia2V5d29yZCIpLCAic3dpdGNoIjogcmVzdWx0KCJzd2l0Y2giLCAia2V5d29yZCIpLAogICAgICAiY2FzZSI6IHJlc3VsdCgiY2FzZSIsICJrZXl3b3JkIiksICJkZWZhdWx0IjogcmVzdWx0KCJkZWZhdWx0IiwgImtleXdvcmQiKSwKICAgICAgInRydWUiOiBhdG9tLCAiZmFsc2UiOiBhdG9tLCAibnVsbCI6IGF0b20sICJ1bmRlZmluZWQiOiBhdG9tLCAiTmFOIjogYXRvbSwgIkluZmluaXR5IjogYXRvbQogICAgfTsKICB9KCk7CgogIC8vIFNvbWUgaGVscGVyIHJlZ2V4cHMKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWytcLSomJVwvPTw+IT98XS87CiAgdmFyIGlzSGV4RGlnaXQgPSAvWzAtOUEtRmEtZl0vOwogIHZhciBpc1dvcmRDaGFyID0gL1tcd1wkX10vOwoKICAvLyBXcmFwcGVyIGFyb3VuZCBqc1Rva2VuIHRoYXQgaGVscHMgbWFpbnRhaW4gcGFyc2VyIHN0YXRlICh3aGV0aGVyCiAgLy8gd2UgYXJlIGluc2lkZSBvZiBhIG11bHRpLWxpbmUgY29tbWVudCBhbmQgd2hldGhlciB0aGUgbmV4dCB0b2tlbgogIC8vIGNvdWxkIGJlIGEgcmVndWxhciBleHByZXNzaW9uKS4KICBmdW5jdGlvbiBqc1Rva2VuU3RhdGUoaW5zaWRlLCByZWdleHApIHsKICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBuZXdJbnNpZGUgPSBpbnNpZGU7CiAgICAgIHZhciB0eXBlID0ganNUb2tlbihpbnNpZGUsIHJlZ2V4cCwgc291cmNlLCBmdW5jdGlvbihjKSB7bmV3SW5zaWRlID0gYzt9KTsKICAgICAgdmFyIG5ld1JlZ2V4cCA9IHR5cGUudHlwZSA9PSAib3BlcmF0b3IiIHx8IHR5cGUudHlwZSA9PSAia2V5d29yZCBjIiB8fCB0eXBlLnR5cGUubWF0Y2goL15bXFt7fVwoLDs6XSQvKTsKICAgICAgaWYgKG5ld1JlZ2V4cCAhPSByZWdleHAgfHwgbmV3SW5zaWRlICE9IGluc2lkZSkKICAgICAgICBzZXRTdGF0ZShqc1Rva2VuU3RhdGUobmV3SW5zaWRlLCBuZXdSZWdleHApKTsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9OwogIH0KCiAgLy8gVGhlIHRva2VuIHJlYWRlciwgaW50ZWRlZCB0byBiZSB1c2VkIGJ5IHRoZSB0b2tlbml6ZXIgZnJvbQogIC8vIHRva2VuaXplLmpzICh0aHJvdWdoIGpzVG9rZW5TdGF0ZSkuIEFkdmFuY2VzIHRoZSBzb3VyY2Ugc3RyZWFtCiAgLy8gb3ZlciBhIHRva2VuLCBhbmQgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgdHlwZSBhbmQgc3R5bGUKICAvLyBvZiB0aGF0IHRva2VuLgogIGZ1bmN0aW9uIGpzVG9rZW4oaW5zaWRlLCByZWdleHAsIHNvdXJjZSwgc2V0SW5zaWRlKSB7CiAgICBmdW5jdGlvbiByZWFkSGV4TnVtYmVyKCl7CiAgICAgIHNvdXJjZS5uZXh0KCk7IC8vIHNraXAgdGhlICd4JwogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc0hleERpZ2l0KTsKICAgICAgcmV0dXJuIHt0eXBlOiAibnVtYmVyIiwgc3R5bGU6ICJqcy1hdG9tIn07CiAgICB9CgogICAgZnVuY3Rpb24gcmVhZE51bWJlcigpIHsKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTldLyk7CiAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCIuIikpewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTldLyk7CiAgICAgIH0KICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoImUiKSB8fCBzb3VyY2UuZXF1YWxzKCJFIikpewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIi0iKSkKICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTldLyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHt0eXBlOiAibnVtYmVyIiwgc3R5bGU6ICJqcy1hdG9tIn07CiAgICB9CiAgICAvLyBSZWFkIGEgd29yZCwgbG9vayBpdCB1cCBpbiBrZXl3b3Jkcy4gSWYgbm90IGZvdW5kLCBpdCBpcyBhCiAgICAvLyB2YXJpYWJsZSwgb3RoZXJ3aXNlIGl0IGlzIGEga2V5d29yZCBvZiB0aGUgdHlwZSBmb3VuZC4KICAgIGZ1bmN0aW9uIHJlYWRXb3JkKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc1dvcmRDaGFyKTsKICAgICAgdmFyIHdvcmQgPSBzb3VyY2UuZ2V0KCk7CiAgICAgIHZhciBrbm93biA9IGtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpICYmIGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpICYmIGtleXdvcmRzW3dvcmRdOwogICAgICByZXR1cm4ga25vd24gPyB7dHlwZToga25vd24udHlwZSwgc3R5bGU6IGtub3duLnN0eWxlLCBjb250ZW50OiB3b3JkfSA6CiAgICAgIHt0eXBlOiAidmFyaWFibGUiLCBzdHlsZTogImpzLXZhcmlhYmxlIiwgY29udGVudDogd29yZH07CiAgICB9CiAgICBmdW5jdGlvbiByZWFkUmVnZXhwKCkgewogICAgICBuZXh0VW50aWxVbmVzY2FwZWQoc291cmNlLCAiLyIpOwogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW2dpXS8pOwogICAgICByZXR1cm4ge3R5cGU6ICJyZWdleHAiLCBzdHlsZTogImpzLXN0cmluZyJ9OwogICAgfQogICAgLy8gTXV0bGktbGluZSBjb21tZW50cyBhcmUgdHJpY2t5LiBXZSB3YW50IHRvIHJldHVybiB0aGUgbmV3bGluZXMKICAgIC8vIGVtYmVkZGVkIGluIHRoZW0gYXMgcmVndWxhciBuZXdsaW5lIHRva2VucywgYW5kIHRoZW4gY29udGludWUKICAgIC8vIHJldHVybmluZyBhIGNvbW1lbnQgdG9rZW4gZm9yIGV2ZXJ5IGxpbmUgb2YgdGhlIGNvbW1lbnQuIFNvCiAgICAvLyBzb21lIHN0YXRlIGhhcyB0byBiZSBzYXZlZCAoaW5zaWRlKSB0byBpbmRpY2F0ZSB3aGV0aGVyIHdlIGFyZQogICAgLy8gaW5zaWRlIGEgLyogKi8gc2VxdWVuY2UuCiAgICBmdW5jdGlvbiByZWFkTXVsdGlsaW5lQ29tbWVudChzdGFydCl7CiAgICAgIHZhciBuZXdJbnNpZGUgPSAiLyoiOwogICAgICB2YXIgbWF5YmVFbmQgPSAoc3RhcnQgPT0gIioiKTsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBpZiAoc291cmNlLmVuZE9mTGluZSgpKQogICAgICAgICAgYnJlYWs7CiAgICAgICAgdmFyIG5leHQgPSBzb3VyY2UubmV4dCgpOwogICAgICAgIGlmIChuZXh0ID09ICIvIiAmJiBtYXliZUVuZCl7CiAgICAgICAgICBuZXdJbnNpZGUgPSBudWxsOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG1heWJlRW5kID0gKG5leHQgPT0gIioiKTsKICAgICAgfQogICAgICBzZXRJbnNpZGUobmV3SW5zaWRlKTsKICAgICAgcmV0dXJuIHt0eXBlOiAiY29tbWVudCIsIHN0eWxlOiAianMtY29tbWVudCJ9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZE9wZXJhdG9yKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc09wZXJhdG9yQ2hhcik7CiAgICAgIHJldHVybiB7dHlwZTogIm9wZXJhdG9yIiwgc3R5bGU6ICJqcy1vcGVyYXRvciJ9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZFN0cmluZyhxdW90ZSkgewogICAgICB2YXIgZW5kQmFja1NsYXNoID0gbmV4dFVudGlsVW5lc2NhcGVkKHNvdXJjZSwgcXVvdGUpOwogICAgICBzZXRJbnNpZGUoZW5kQmFja1NsYXNoID8gcXVvdGUgOiBudWxsKTsKICAgICAgcmV0dXJuIHt0eXBlOiAic3RyaW5nIiwgc3R5bGU6ICJqcy1zdHJpbmcifTsKICAgIH0KCiAgICAvLyBGZXRjaCB0aGUgbmV4dCB0b2tlbi4gRGlzcGF0Y2hlcyBvbiBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlCiAgICAvLyBzdHJlYW0sIG9yIGZpcnN0IHR3byBjaGFyYWN0ZXJzIHdoZW4gdGhlIGZpcnN0IGlzIGEgc2xhc2guCiAgICBpZiAoaW5zaWRlID09ICJcIiIgfHwgaW5zaWRlID09ICInIikKICAgICAgcmV0dXJuIHJlYWRTdHJpbmcoaW5zaWRlKTsKICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICBpZiAoaW5zaWRlID09ICIvKiIpCiAgICAgIHJldHVybiByZWFkTXVsdGlsaW5lQ29tbWVudChjaCk7CiAgICBlbHNlIGlmIChjaCA9PSAiXCIiIHx8IGNoID09ICInIikKICAgICAgcmV0dXJuIHJlYWRTdHJpbmcoY2gpOwogICAgLy8gd2l0aCBwdW5jdHVhdGlvbiwgdGhlIHR5cGUgb2YgdGhlIHRva2VuIGlzIHRoZSBzeW1ib2wgaXRzZWxmCiAgICBlbHNlIGlmICgvW1xbXF17fVwoXCksO1w6XC5dLy50ZXN0KGNoKSkKICAgICAgcmV0dXJuIHt0eXBlOiBjaCwgc3R5bGU6ICJqcy1wdW5jdHVhdGlvbiJ9OwogICAgZWxzZSBpZiAoY2ggPT0gIjAiICYmIChzb3VyY2UuZXF1YWxzKCJ4IikgfHwgc291cmNlLmVxdWFscygiWCIpKSkKICAgICAgcmV0dXJuIHJlYWRIZXhOdW1iZXIoKTsKICAgIGVsc2UgaWYgKC9bMC05XS8udGVzdChjaCkpCiAgICAgIHJldHVybiByZWFkTnVtYmVyKCk7CiAgICBlbHNlIGlmIChjaCA9PSAiLyIpewogICAgICBpZiAoc291cmNlLmVxdWFscygiKiIpKQogICAgICB7IHNvdXJjZS5uZXh0KCk7IHJldHVybiByZWFkTXVsdGlsaW5lQ29tbWVudChjaCk7IH0KICAgICAgZWxzZSBpZiAoc291cmNlLmVxdWFscygiLyIpKQogICAgICB7IG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsIG51bGwpOyByZXR1cm4ge3R5cGU6ICJjb21tZW50Iiwgc3R5bGU6ICJqcy1jb21tZW50In07fQogICAgICBlbHNlIGlmIChyZWdleHApCiAgICAgICAgcmV0dXJuIHJlYWRSZWdleHAoKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiByZWFkT3BlcmF0b3IoKTsKICAgIH0KICAgIGVsc2UgaWYgKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKQogICAgICByZXR1cm4gcmVhZE9wZXJhdG9yKCk7CiAgICBlbHNlCiAgICAgIHJldHVybiByZWFkV29yZCgpOwogIH0KCiAgLy8gVGhlIGV4dGVybmFsIGludGVyZmFjZSB0byB0aGUgdG9rZW5pemVyLgogIHJldHVybiBmdW5jdGlvbihzb3VyY2UsIHN0YXJ0U3RhdGUpIHsKICAgIHJldHVybiB0b2tlbml6ZXIoc291cmNlLCBzdGFydFN0YXRlIHx8IGpzVG9rZW5TdGF0ZShmYWxzZSwgdHJ1ZSkpOwogIH07Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/undo.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFN0b3JhZ2UgYW5kIGNvbnRyb2wgZm9yIHVuZG8gaW5mb3JtYXRpb24gd2l0aGluIGEgQ29kZU1pcnJvcgogKiBlZGl0b3IuICdXaHkgb24gZWFydGggaXMgc3VjaCBhIGNvbXBsaWNhdGVkIG1lc3MgcmVxdWlyZWQgZm9yCiAqIHRoYXQ/JywgSSBoZWFyIHlvdSBhc2suIFRoZSBnb2FsLCBpbiBpbXBsZW1lbnRpbmcgdGhpcywgd2FzIHRvIG1ha2UKICogdGhlIGNvbXBsZXhpdHkgb2Ygc3RvcmluZyBhbmQgcmV2ZXJ0aW5nIHVuZG8gaW5mb3JtYXRpb24gZGVwZW5kCiAqIG9ubHkgb24gdGhlIHNpemUgb2YgdGhlIGVkaXRlZCBvciByZXN0b3JlZCBjb250ZW50LCBub3Qgb24gdGhlIHNpemUKICogb2YgdGhlIHdob2xlIGRvY3VtZW50LiBUaGlzIG1ha2VzIGl0IG5lY2Vzc2FyeSB0byB1c2UgYSBraW5kIG9mCiAqICdkaWZmJyBzeXN0ZW0sIHdoaWNoLCB3aGVuIGFwcGxpZWQgdG8gYSBET00gdHJlZSwgY2F1c2VzIHNvbWUKICogY29tcGxleGl0eSBhbmQgaGFja2VyeS4KICoKICogSW4gc2hvcnQsIHRoZSBlZGl0b3IgJ3RvdWNoZXMnIEJSIGVsZW1lbnRzIGFzIGl0IHBhcnNlcyB0aGVtLCBhbmQKICogdGhlIEhpc3Rvcnkgc3RvcmVzIHRoZXNlLiBXaGVuIG5vdGhpbmcgaXMgdG91Y2hlZCBpbiBjb21taXREZWxheQogKiBtaWxsaXNlY29uZHMsIHRoZSBjaGFuZ2VzIGFyZSBjb21taXR0ZWQ6IEl0IGdvZXMgb3ZlciBhbGwgdG91Y2hlZAogKiBub2RlcywgdGhyb3dzIG91dCB0aGUgb25lcyB0aGF0IGRpZCBub3QgY2hhbmdlIHNpbmNlIGxhc3QgY29tbWl0IG9yCiAqIGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50LCBhbmQgYXNzZW1ibGVzIHRoZSByZXN0IGludG8gemVybyBvcgogKiBtb3JlICdjaGFpbnMnIC0tIGFycmF5cyBvZiBhZGphY2VudCBsaW5lcy4gTGlua3MgYmFjayB0byB0aGVzZQogKiBjaGFpbnMgYXJlIGFkZGVkIHRvIHRoZSBCUiBub2Rlcywgd2hpbGUgdGhlIGNoYWluIHRoYXQgcHJldmlvdXNseQogKiBzcGFubmVkIHRoZXNlIG5vZGVzIGlzIGFkZGVkIHRvIHRoZSB1bmRvIGhpc3RvcnkuIFVuZG9pbmcgYSBjaGFuZ2UKICogbWVhbnMgdGFraW5nIHN1Y2ggYSBjaGFpbiBvZmYgdGhlIHVuZG8gaGlzdG9yeSwgcmVzdG9yaW5nIGl0cwogKiBjb250ZW50ICh0ZXh0IGlzIHNhdmVkIHBlciBsaW5lKSBhbmQgbGlua2luZyBpdCBiYWNrIGludG8gdGhlCiAqIGRvY3VtZW50LgogKi8KCi8vIEEgaGlzdG9yeSBvYmplY3QgbmVlZHMgdG8ga25vdyBhYm91dCB0aGUgRE9NIGNvbnRhaW5lciBob2xkaW5nIHRoZQovLyBkb2N1bWVudCwgdGhlIG1heGltdW0gYW1vdW50IG9mIHVuZG8gbGV2ZWxzIGl0IHNob3VsZCBzdG9yZSwgdGhlCi8vIGRlbGF5IChvZiBubyBpbnB1dCkgYWZ0ZXIgd2hpY2ggaXQgY29tbWl0cyBhIHNldCBvZiBjaGFuZ2VzLCBhbmQsCi8vIHVuZm9ydHVuYXRlbHksIHRoZSAncGFyZW50JyB3aW5kb3cgLS0gYSB3aW5kb3cgdGhhdCBpcyBub3QgaW4KLy8gZGVzaWduTW9kZSwgYW5kIG9uIHdoaWNoIHNldFRpbWVvdXQgd29ya3MgaW4gZXZlcnkgYnJvd3Nlci4KZnVuY3Rpb24gSGlzdG9yeShjb250YWluZXIsIG1heERlcHRoLCBjb21taXREZWxheSwgZWRpdG9yLCBvbkNoYW5nZSkgewogIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwogIHRoaXMubWF4RGVwdGggPSBtYXhEZXB0aDsgdGhpcy5jb21taXREZWxheSA9IGNvbW1pdERlbGF5OwogIHRoaXMuZWRpdG9yID0gZWRpdG9yOyB0aGlzLnBhcmVudCA9IGVkaXRvci5wYXJlbnQ7CiAgdGhpcy5vbkNoYW5nZSA9IG9uQ2hhbmdlOwogIC8vIFRoaXMgbGluZSBvYmplY3QgcmVwcmVzZW50cyB0aGUgaW5pdGlhbCwgZW1wdHkgZWRpdG9yLgogIHZhciBpbml0aWFsID0ge3RleHQ6ICIiLCBmcm9tOiBudWxsLCB0bzogbnVsbH07CiAgLy8gQXMgdGhlIGJvcmRlcnMgYmV0d2VlbiBsaW5lcyBhcmUgcmVwcmVzZW50ZWQgYnkgQlIgZWxlbWVudHMsIHRoZQogIC8vIHN0YXJ0IG9mIHRoZSBmaXJzdCBsaW5lIGFuZCB0aGUgZW5kIG9mIHRoZSBsYXN0IG9uZSBhcmUKICAvLyByZXByZXNlbnRlZCBieSBudWxsLiBTaW5jZSB5b3UgY2FuIG5vdCBzdG9yZSBhbnkgcHJvcGVydGllcwogIC8vIChsaW5rcyB0byBsaW5lIG9iamVjdHMpIGluIG51bGwsIHRoZXNlIHByb3BlcnRpZXMgYXJlIHVzZWQgaW4KICAvLyB0aG9zZSBjYXNlcy4KICB0aGlzLmZpcnN0ID0gaW5pdGlhbDsgdGhpcy5sYXN0ID0gaW5pdGlhbDsKICAvLyBTaW1pbGFybHksIGEgJ2hpc3RvcnlUb3VjaGVkJyBwcm9wZXJ0eSBpcyBhZGRlZCB0byB0aGUgQlIgaW4KICAvLyBmcm9udCBvZiBsaW5lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHRvdWNoZWQsIGFuZCAnZmlyc3RUb3VjaGVkJwogIC8vIGlzIHVzZWQgZm9yIHRoZSBmaXJzdCBsaW5lLgogIHRoaXMuZmlyc3RUb3VjaGVkID0gZmFsc2U7CiAgLy8gSGlzdG9yeSBpcyB0aGUgc2V0IG9mIGNvbW1pdHRlZCBjaGFuZ2VzLCB0b3VjaGVkIGlzIHRoZSBzZXQgb2YKICAvLyBub2RlcyB0b3VjaGVkIHNpbmNlIHRoZSBsYXN0IGNvbW1pdC4KICB0aGlzLmhpc3RvcnkgPSBbXTsgdGhpcy5yZWRvSGlzdG9yeSA9IFtdOyB0aGlzLnRvdWNoZWQgPSBbXTsKfQoKSGlzdG9yeS5wcm90b3R5cGUgPSB7CiAgLy8gU2NoZWR1bGUgYSBjb21taXQgKGlmIG5vIG90aGVyIHRvdWNoZXMgY29tZSBpbiBmb3IgY29tbWl0RGVsYXkKICAvLyBtaWxsaXNlY29uZHMpLgogIHNjaGVkdWxlQ29tbWl0OiBmdW5jdGlvbigpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHRoaXMucGFyZW50LmNsZWFyVGltZW91dCh0aGlzLmNvbW1pdFRpbWVvdXQpOwogICAgdGhpcy5jb21taXRUaW1lb3V0ID0gdGhpcy5wYXJlbnQuc2V0VGltZW91dChmdW5jdGlvbigpe3NlbGYudHJ5Q29tbWl0KCk7fSwgdGhpcy5jb21taXREZWxheSk7CiAgfSwKCiAgLy8gTWFyayBhIG5vZGUgYXMgdG91Y2hlZC4gTnVsbCBpcyBhIHZhbGlkIGFyZ3VtZW50LgogIHRvdWNoOiBmdW5jdGlvbihub2RlKSB7CiAgICB0aGlzLnNldFRvdWNoZWQobm9kZSk7CiAgICB0aGlzLnNjaGVkdWxlQ29tbWl0KCk7CiAgfSwKCiAgLy8gVW5kbyB0aGUgbGFzdCBjaGFuZ2UuCiAgdW5kbzogZnVuY3Rpb24oKSB7CiAgICAvLyBNYWtlIHN1cmUgcGVuZGluZyBjaGFuZ2VzIGhhdmUgYmVlbiBjb21taXR0ZWQuCiAgICB0aGlzLmNvbW1pdCgpOwoKICAgIGlmICh0aGlzLmhpc3RvcnkubGVuZ3RoKSB7CiAgICAgIC8vIFRha2UgdGhlIHRvcCBkaWZmIGZyb20gdGhlIGhpc3RvcnksIGFwcGx5IGl0LCBhbmQgc3RvcmUgaXRzCiAgICAgIC8vIHNoYWRvdyBpbiB0aGUgcmVkbyBoaXN0b3J5LgogICAgICB2YXIgaXRlbSA9IHRoaXMuaGlzdG9yeS5wb3AoKTsKICAgICAgdGhpcy5yZWRvSGlzdG9yeS5wdXNoKHRoaXMudXBkYXRlVG8oaXRlbSwgImFwcGx5Q2hhaW4iKSk7CiAgICAgIGlmICh0aGlzLm9uQ2hhbmdlKSB0aGlzLm9uQ2hhbmdlKCk7CiAgICAgIHJldHVybiB0aGlzLmNoYWluTm9kZShpdGVtKTsKICAgIH0KICB9LAoKICAvLyBSZWRvIHRoZSBsYXN0IHVuZG9uZSBjaGFuZ2UuCiAgcmVkbzogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNvbW1pdCgpOwogICAgaWYgKHRoaXMucmVkb0hpc3RvcnkubGVuZ3RoKSB7CiAgICAgIC8vIFRoZSBpbnZlcnNlIG9mIHVuZG8sIGJhc2ljYWxseS4KICAgICAgdmFyIGl0ZW0gPSB0aGlzLnJlZG9IaXN0b3J5LnBvcCgpOwogICAgICB0aGlzLmFkZFVuZG9MZXZlbCh0aGlzLnVwZGF0ZVRvKGl0ZW0sICJhcHBseUNoYWluIikpOwogICAgICBpZiAodGhpcy5vbkNoYW5nZSkgdGhpcy5vbkNoYW5nZSgpOwogICAgICByZXR1cm4gdGhpcy5jaGFpbk5vZGUoaXRlbSk7CiAgICB9CiAgfSwKCiAgY2xlYXI6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5oaXN0b3J5ID0gW107CiAgICB0aGlzLnJlZG9IaXN0b3J5ID0gW107CiAgfSwKCiAgLy8gQXNrIGZvciB0aGUgc2l6ZSBvZiB0aGUgdW4vcmVkbyBoaXN0b3JpZXMuCiAgaGlzdG9yeVNpemU6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHt1bmRvOiB0aGlzLmhpc3RvcnkubGVuZ3RoLCByZWRvOiB0aGlzLnJlZG9IaXN0b3J5Lmxlbmd0aH07CiAgfSwKCiAgLy8gUHVzaCBhIGNoYW5nZXNldCBpbnRvIHRoZSBkb2N1bWVudC4KICBwdXNoOiBmdW5jdGlvbihmcm9tLCB0bywgbGluZXMpIHsKICAgIHZhciBjaGFpbiA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZW5kID0gKGkgPT0gbGluZXMubGVuZ3RoIC0gMSkgPyB0byA6IHRoaXMuY29udGFpbmVyLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiQlIiKTsKICAgICAgY2hhaW4ucHVzaCh7ZnJvbTogZnJvbSwgdG86IGVuZCwgdGV4dDogY2xlYW5UZXh0KGxpbmVzW2ldKX0pOwogICAgICBmcm9tID0gZW5kOwogICAgfQogICAgdGhpcy5wdXNoQ2hhaW5zKFtjaGFpbl0sIGZyb20gPT0gbnVsbCAmJiB0byA9PSBudWxsKTsKICB9LAoKICBwdXNoQ2hhaW5zOiBmdW5jdGlvbihjaGFpbnMsIGRvTm90SGlnaGxpZ2h0KSB7CiAgICB0aGlzLmNvbW1pdChkb05vdEhpZ2hsaWdodCk7CiAgICB0aGlzLmFkZFVuZG9MZXZlbCh0aGlzLnVwZGF0ZVRvKGNoYWlucywgImFwcGx5Q2hhaW4iKSk7CiAgICB0aGlzLnJlZG9IaXN0b3J5ID0gW107CiAgfSwKCiAgLy8gUmV0cmlldmUgYSBET00gbm9kZSBmcm9tIGEgY2hhaW4gKGZvciBzY3JvbGxpbmcgdG8gaXQgYWZ0ZXIgdW5kby9yZWRvKS4KICBjaGFpbk5vZGU6IGZ1bmN0aW9uKGNoYWlucykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFpbnMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHN0YXJ0ID0gY2hhaW5zW2ldWzBdLCBub2RlID0gc3RhcnQgJiYgKHN0YXJ0LmZyb20gfHwgc3RhcnQudG8pOwogICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7CiAgICB9CiAgfSwKCiAgLy8gQ2xlYXIgdGhlIHVuZG8gaGlzdG9yeSwgbWFrZSB0aGUgY3VycmVudCBkb2N1bWVudCB0aGUgc3RhcnQKICAvLyBwb3NpdGlvbi4KICByZXNldDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmhpc3RvcnkgPSBbXTsgdGhpcy5yZWRvSGlzdG9yeSA9IFtdOwogIH0sCgogIHRleHRBZnRlcjogZnVuY3Rpb24oYnIpIHsKICAgIHJldHVybiB0aGlzLmFmdGVyKGJyKS50ZXh0OwogIH0sCgogIG5vZGVBZnRlcjogZnVuY3Rpb24oYnIpIHsKICAgIHJldHVybiB0aGlzLmFmdGVyKGJyKS50bzsKICB9LAoKICBub2RlQmVmb3JlOiBmdW5jdGlvbihicikgewogICAgcmV0dXJuIHRoaXMuYmVmb3JlKGJyKS5mcm9tOwogIH0sCgogIC8vIENvbW1pdCB1bmxlc3MgdGhlcmUgYXJlIHBlbmRpbmcgZGlydHkgbm9kZXMuCiAgdHJ5Q29tbWl0OiBmdW5jdGlvbigpIHsKICAgIGlmICghd2luZG93Lkhpc3RvcnkpIHJldHVybjsgLy8gU3RvcCB3aGVuIGZyYW1lIGhhcyBiZWVuIHVubG9hZGVkCiAgICBpZiAodGhpcy5lZGl0b3IuaGlnaGxpZ2h0RGlydHkoKSkgdGhpcy5jb21taXQoKTsKICAgIGVsc2UgdGhpcy5zY2hlZHVsZUNvbW1pdCgpOwogIH0sCgogIC8vIENoZWNrIHdoZXRoZXIgdGhlIHRvdWNoZWQgbm9kZXMgaG9sZCBhbnkgY2hhbmdlcywgaWYgc28sIGNvbW1pdAogIC8vIHRoZW0uCiAgY29tbWl0OiBmdW5jdGlvbihkb05vdEhpZ2hsaWdodCkgewogICAgdGhpcy5wYXJlbnQuY2xlYXJUaW1lb3V0KHRoaXMuY29tbWl0VGltZW91dCk7CiAgICAvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHBlbmRpbmcgZGlydHkgbm9kZXMuCiAgICBpZiAoIWRvTm90SGlnaGxpZ2h0KSB0aGlzLmVkaXRvci5oaWdobGlnaHREaXJ0eSh0cnVlKTsKICAgIC8vIEJ1aWxkIHNldCBvZiBjaGFpbnMuCiAgICB2YXIgY2hhaW5zID0gdGhpcy50b3VjaGVkQ2hhaW5zKCksIHNlbGYgPSB0aGlzOwoKICAgIGlmIChjaGFpbnMubGVuZ3RoKSB7CiAgICAgIHRoaXMuYWRkVW5kb0xldmVsKHRoaXMudXBkYXRlVG8oY2hhaW5zLCAibGlua0NoYWluIikpOwogICAgICB0aGlzLnJlZG9IaXN0b3J5ID0gW107CiAgICAgIGlmICh0aGlzLm9uQ2hhbmdlKSB0aGlzLm9uQ2hhbmdlKCk7CiAgICB9CiAgfSwKCiAgLy8gWyBlbmQgb2YgcHVibGljIGludGVyZmFjZSBdCgogIC8vIFVwZGF0ZSB0aGUgZG9jdW1lbnQgd2l0aCBhIGdpdmVuIHNldCBvZiBjaGFpbnMsIHJldHVybiBpdHMKICAvLyBzaGFkb3cuIHVwZGF0ZUZ1bmMgc2hvdWxkIGJlICJhcHBseUNoYWluIiBvciAibGlua0NoYWluIi4gSW4gdGhlCiAgLy8gc2Vjb25kIGNhc2UsIHRoZSBjaGFpbnMgYXJlIHRha2VuIHRvIGNvcnJlc3BvbmQgdGhlIHRoZSBjdXJyZW50CiAgLy8gZG9jdW1lbnQsIGFuZCBvbmx5IHRoZSBzdGF0ZSBvZiB0aGUgbGluZSBkYXRhIGlzIHVwZGF0ZWQuIEluIHRoZQogIC8vIGZpcnN0IGNhc2UsIHRoZSBjb250ZW50IG9mIHRoZSBjaGFpbnMgaXMgYWxzbyBwdXNoZWQgaWludG8gdGhlCiAgLy8gZG9jdW1lbnQuCiAgdXBkYXRlVG86IGZ1bmN0aW9uKGNoYWlucywgdXBkYXRlRnVuYykgewogICAgdmFyIHNoYWRvd3MgPSBbXSwgZGlydHkgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhaW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgIHNoYWRvd3MucHVzaCh0aGlzLnNoYWRvd0NoYWluKGNoYWluc1tpXSkpOwogICAgICBkaXJ0eS5wdXNoKHRoaXNbdXBkYXRlRnVuY10oY2hhaW5zW2ldKSk7CiAgICB9CiAgICBpZiAodXBkYXRlRnVuYyA9PSAiYXBwbHlDaGFpbiIpCiAgICAgIHRoaXMubm90aWZ5RGlydHkoZGlydHkpOwogICAgcmV0dXJuIHNoYWRvd3M7CiAgfSwKCiAgLy8gTm90aWZ5IHRoZSBlZGl0b3IgdGhhdCBzb21lIG5vZGVzIGhhdmUgY2hhbmdlZC4KICBub3RpZnlEaXJ0eTogZnVuY3Rpb24obm9kZXMpIHsKICAgIGZvckVhY2gobm9kZXMsIG1ldGhvZCh0aGlzLmVkaXRvciwgImFkZERpcnR5Tm9kZSIpKQogICAgdGhpcy5lZGl0b3Iuc2NoZWR1bGVIaWdobGlnaHQoKTsKICB9LAoKICAvLyBMaW5rIGEgY2hhaW4gaW50byB0aGUgRE9NIG5vZGVzIChvciB0aGUgZmlyc3QvbGFzdCBsaW5rcyBmb3IgbnVsbAogIC8vIG5vZGVzKS4KICBsaW5rQ2hhaW46IGZ1bmN0aW9uKGNoYWluKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBsaW5lID0gY2hhaW5baV07CiAgICAgIGlmIChsaW5lLmZyb20pIGxpbmUuZnJvbS5oaXN0b3J5QWZ0ZXIgPSBsaW5lOwogICAgICBlbHNlIHRoaXMuZmlyc3QgPSBsaW5lOwogICAgICBpZiAobGluZS50bykgbGluZS50by5oaXN0b3J5QmVmb3JlID0gbGluZTsKICAgICAgZWxzZSB0aGlzLmxhc3QgPSBsaW5lOwogICAgfQogIH0sCgogIC8vIEdldCB0aGUgbGluZSBvYmplY3QgYWZ0ZXIvYmVmb3JlIGEgZ2l2ZW4gbm9kZS4KICBhZnRlcjogZnVuY3Rpb24obm9kZSkgewogICAgcmV0dXJuIG5vZGUgPyBub2RlLmhpc3RvcnlBZnRlciA6IHRoaXMuZmlyc3Q7CiAgfSwKICBiZWZvcmU6IGZ1bmN0aW9uKG5vZGUpIHsKICAgIHJldHVybiBub2RlID8gbm9kZS5oaXN0b3J5QmVmb3JlIDogdGhpcy5sYXN0OwogIH0sCgogIC8vIE1hcmsgYSBub2RlIGFzIHRvdWNoZWQgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gbWFya2VkLgogIHNldFRvdWNoZWQ6IGZ1bmN0aW9uKG5vZGUpIHsKICAgIGlmIChub2RlKSB7CiAgICAgIGlmICghbm9kZS5oaXN0b3J5VG91Y2hlZCkgewogICAgICAgIHRoaXMudG91Y2hlZC5wdXNoKG5vZGUpOwogICAgICAgIG5vZGUuaGlzdG9yeVRvdWNoZWQgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgdGhpcy5maXJzdFRvdWNoZWQgPSB0cnVlOwogICAgfQogIH0sCgogIC8vIFN0b3JlIGEgbmV3IHNldCBvZiB1bmRvIGluZm8sIHRocm93IGF3YXkgaW5mbyBpZiB0aGVyZSBpcyBtb3JlIG9mCiAgLy8gaXQgdGhhbiBhbGxvd2VkLgogIGFkZFVuZG9MZXZlbDogZnVuY3Rpb24oZGlmZnMpIHsKICAgIHRoaXMuaGlzdG9yeS5wdXNoKGRpZmZzKTsKICAgIGlmICh0aGlzLmhpc3RvcnkubGVuZ3RoID4gdGhpcy5tYXhEZXB0aCkKICAgICAgdGhpcy5oaXN0b3J5LnNoaWZ0KCk7CiAgfSwKCiAgLy8gQnVpbGQgY2hhaW5zIGZyb20gYSBzZXQgb2YgdG91Y2hlZCBub2Rlcy4KICB0b3VjaGVkQ2hhaW5zOiBmdW5jdGlvbigpIHsKICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAvLyBUaGUgdGVtcCBzeXN0ZW0gaXMgYSBjcnVtbXkgaGFjayB0byBzcGVlZCB1cCBkZXRlcm1pbmluZwogICAgLy8gd2hldGhlciBhIChjdXJyZW50bHkgdG91Y2hlZCkgbm9kZSBoYXMgYSBsaW5lIG9iamVjdCBhc3NvY2lhdGVkCiAgICAvLyB3aXRoIGl0LiBudWxsVGVtcCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBvYmplY3QgZm9yIHRoZSBmaXJzdAogICAgLy8gbGluZSwgb3RoZXIgbm9kZXMgZ2V0IGl0IHN0b3JlZCBpbiB0aGVpciBoaXN0b3J5VGVtcCBwcm9wZXJ0eS4KICAgIHZhciBudWxsVGVtcCA9IG51bGw7CiAgICBmdW5jdGlvbiB0ZW1wKG5vZGUpIHtyZXR1cm4gbm9kZSA/IG5vZGUuaGlzdG9yeVRlbXAgOiBudWxsVGVtcDt9CiAgICBmdW5jdGlvbiBzZXRUZW1wKG5vZGUsIGxpbmUpIHsKICAgICAgaWYgKG5vZGUpIG5vZGUuaGlzdG9yeVRlbXAgPSBsaW5lOwogICAgICBlbHNlIG51bGxUZW1wID0gbGluZTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZExpbmUobm9kZSkgewogICAgICB2YXIgdGV4dCA9IFtdOwogICAgICBmb3IgKHZhciBjdXIgPSBub2RlID8gbm9kZS5uZXh0U2libGluZyA6IHNlbGYuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgICAgICAgY3VyICYmIGN1ci5ub2RlTmFtZSAhPSAiQlIiOyBjdXIgPSBjdXIubmV4dFNpYmxpbmcpCiAgICAgICAgaWYgKGN1ci5jdXJyZW50VGV4dCkgdGV4dC5wdXNoKGN1ci5jdXJyZW50VGV4dCk7CiAgICAgIHJldHVybiB7ZnJvbTogbm9kZSwgdG86IGN1ciwgdGV4dDogY2xlYW5UZXh0KHRleHQuam9pbigiIikpfTsKICAgIH0KCiAgICAvLyBGaWx0ZXIgb3V0IHVuY2hhbmdlZCBsaW5lcyBhbmQgbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZQogICAgLy8gZG9jdW1lbnQuIEJ1aWxkIHVwIGxpbmUgb2JqZWN0cyBmb3IgcmVtYWluaW5nIG5vZGVzLgogICAgdmFyIGxpbmVzID0gW107CiAgICBpZiAoc2VsZi5maXJzdFRvdWNoZWQpIHNlbGYudG91Y2hlZC5wdXNoKG51bGwpOwogICAgZm9yRWFjaChzZWxmLnRvdWNoZWQsIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgaWYgKG5vZGUgJiYgbm9kZS5wYXJlbnROb2RlICE9IHNlbGYuY29udGFpbmVyKSByZXR1cm47CgogICAgICBpZiAobm9kZSkgbm9kZS5oaXN0b3J5VG91Y2hlZCA9IGZhbHNlOwogICAgICBlbHNlIHNlbGYuZmlyc3RUb3VjaGVkID0gZmFsc2U7CgogICAgICB2YXIgbGluZSA9IGJ1aWxkTGluZShub2RlKSwgc2hhZG93ID0gc2VsZi5hZnRlcihub2RlKTsKICAgICAgaWYgKCFzaGFkb3cgfHwgc2hhZG93LnRleHQgIT0gbGluZS50ZXh0IHx8IHNoYWRvdy50byAhPSBsaW5lLnRvKSB7CiAgICAgICAgbGluZXMucHVzaChsaW5lKTsKICAgICAgICBzZXRUZW1wKG5vZGUsIGxpbmUpOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBHZXQgdGhlIEJSIGVsZW1lbnQgYWZ0ZXIvYmVmb3JlIHRoZSBnaXZlbiBub2RlLgogICAgZnVuY3Rpb24gbmV4dEJSKG5vZGUsIGRpcikgewogICAgICB2YXIgbGluayA9IGRpciArICJTaWJsaW5nIiwgc2VhcmNoID0gbm9kZVtsaW5rXTsKICAgICAgd2hpbGUgKHNlYXJjaCAmJiBzZWFyY2gubm9kZU5hbWUgIT0gIkJSIikKICAgICAgICBzZWFyY2ggPSBzZWFyY2hbbGlua107CiAgICAgIHJldHVybiBzZWFyY2g7CiAgICB9CgogICAgLy8gQXNzZW1ibGUgbGluZSBvYmplY3RzIGludG8gY2hhaW5zIGJ5IHNjYW5uaW5nIHRoZSBET00gdHJlZQogICAgLy8gYXJvdW5kIHRoZW0uCiAgICB2YXIgY2hhaW5zID0gW107IHNlbGYudG91Y2hlZCA9IFtdOwogICAgZm9yRWFjaChsaW5lcywgZnVuY3Rpb24obGluZSkgewogICAgICAvLyBOb3RlIHRoYXQgdGhpcyBtYWtlcyB0aGUgbG9vcCBza2lwIGxpbmUgb2JqZWN0cyB0aGF0IGhhdmUKICAgICAgLy8gYmVlbiBwdWxsZWQgaW50byBjaGFpbnMgYnkgbGluZXMgYmVmb3JlIHRoZW0uCiAgICAgIGlmICghdGVtcChsaW5lLmZyb20pKSByZXR1cm47CgogICAgICB2YXIgY2hhaW4gPSBbXSwgY3VyTm9kZSA9IGxpbmUuZnJvbSwgc2FmZSA9IHRydWU7CiAgICAgIC8vIFB1dCBhbnkgbGluZSBvYmplY3RzIChyZWZlcnJlZCB0byBieSB0ZW1wIGluZm8pIGJlZm9yZSB0aGlzCiAgICAgIC8vIG9uZSBvbiB0aGUgZnJvbnQgb2YgdGhlIGFycmF5LgogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIHZhciBjdXJMaW5lID0gdGVtcChjdXJOb2RlKTsKICAgICAgICBpZiAoIWN1ckxpbmUpIHsKICAgICAgICAgIGlmIChzYWZlKSBicmVhazsKICAgICAgICAgIGVsc2UgY3VyTGluZSA9IGJ1aWxkTGluZShjdXJOb2RlKTsKICAgICAgICB9CiAgICAgICAgY2hhaW4udW5zaGlmdChjdXJMaW5lKTsKICAgICAgICBzZXRUZW1wKGN1ck5vZGUsIG51bGwpOwogICAgICAgIGlmICghY3VyTm9kZSkgYnJlYWs7CiAgICAgICAgc2FmZSA9IHNlbGYuYWZ0ZXIoY3VyTm9kZSk7CiAgICAgICAgY3VyTm9kZSA9IG5leHRCUihjdXJOb2RlLCAicHJldmlvdXMiKTsKICAgICAgfQogICAgICBjdXJOb2RlID0gbGluZS50bzsgc2FmZSA9IHNlbGYuYmVmb3JlKGxpbmUuZnJvbSk7CiAgICAgIC8vIEFkZCBsaW5lcyBhZnRlciB0aGlzIG9uZSBhdCBlbmQgb2YgYXJyYXkuCiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKCFjdXJOb2RlKSBicmVhazsKICAgICAgICB2YXIgY3VyTGluZSA9IHRlbXAoY3VyTm9kZSk7CiAgICAgICAgaWYgKCFjdXJMaW5lKSB7CiAgICAgICAgICBpZiAoc2FmZSkgYnJlYWs7CiAgICAgICAgICBlbHNlIGN1ckxpbmUgPSBidWlsZExpbmUoY3VyTm9kZSk7CiAgICAgICAgfQogICAgICAgIGNoYWluLnB1c2goY3VyTGluZSk7CiAgICAgICAgc2V0VGVtcChjdXJOb2RlLCBudWxsKTsKICAgICAgICBzYWZlID0gc2VsZi5iZWZvcmUoY3VyTm9kZSk7CiAgICAgICAgY3VyTm9kZSA9IG5leHRCUihjdXJOb2RlLCAibmV4dCIpOwogICAgICB9CiAgICAgIGNoYWlucy5wdXNoKGNoYWluKTsKICAgIH0pOwoKICAgIHJldHVybiBjaGFpbnM7CiAgfSwKCiAgLy8gRmluZCB0aGUgJ3NoYWRvdycgb2YgYSBnaXZlbiBjaGFpbiBieSBmb2xsb3dpbmcgdGhlIGxpbmtzIGluIHRoZQogIC8vIERPTSBub2RlcyBhdCBpdHMgc3RhcnQgYW5kIGVuZC4KICBzaGFkb3dDaGFpbjogZnVuY3Rpb24oY2hhaW4pIHsKICAgIHZhciBzaGFkb3dzID0gW10sIG5leHQgPSB0aGlzLmFmdGVyKGNoYWluWzBdLmZyb20pLCBlbmQgPSBjaGFpbltjaGFpbi5sZW5ndGggLSAxXS50bzsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIHNoYWRvd3MucHVzaChuZXh0KTsKICAgICAgdmFyIG5leHROb2RlID0gbmV4dC50bzsKICAgICAgaWYgKCFuZXh0Tm9kZSB8fCBuZXh0Tm9kZSA9PSBlbmQpCiAgICAgICAgYnJlYWs7CiAgICAgIGVsc2UKICAgICAgICBuZXh0ID0gbmV4dE5vZGUuaGlzdG9yeUFmdGVyIHx8IHRoaXMuYmVmb3JlKGVuZCk7CiAgICAgIC8vIChUaGUgdGhpcy5iZWZvcmUoZW5kKSBpcyBhIGhhY2sgLS0gRkYgc29tZXRpbWVzIHJlbW92ZXMKICAgICAgLy8gcHJvcGVydGllcyBmcm9tIEJSIG5vZGVzLCBpbiB3aGljaCBjYXNlIHRoZSBiZXN0IHdlIGNhbiBob3BlCiAgICAgIC8vIGZvciBpcyB0byBub3QgYnJlYWsuKQogICAgfQogICAgcmV0dXJuIHNoYWRvd3M7CiAgfSwKCiAgLy8gVXBkYXRlIHRoZSBET00gdHJlZSB0byBjb250YWluIHRoZSBsaW5lcyBzcGVjaWZpZWQgaW4gYSBnaXZlbgogIC8vIGNoYWluLCBsaW5rIHRoaXMgY2hhaW4gaW50byB0aGUgRE9NIG5vZGVzLgogIGFwcGx5Q2hhaW46IGZ1bmN0aW9uKGNoYWluKSB7CiAgICAvLyBTb21lIGF0dGVtcHQgaXMgbWFkZSB0byBwcmV2ZW50IHRoZSBjdXJzb3IgZnJvbSBqdW1waW5nCiAgICAvLyByYW5kb21seSB3aGVuIGFuIHVuZG8gb3IgcmVkbyBoYXBwZW5zLiBJdCBzdGlsbCBiZWhhdmVzIGEgYml0CiAgICAvLyBzdHJhbmdlIHNvbWV0aW1lcy4KICAgIHZhciBjdXJzb3IgPSBzZWxlY3QuY3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCBmYWxzZSksIHNlbGYgPSB0aGlzOwoKICAgIC8vIFJlbW92ZSBhbGwgbm9kZXMgaW4gdGhlIERPTSB0cmVlIGJldHdlZW4gZnJvbSBhbmQgdG8gKG51bGwgZm9yCiAgICAvLyBzdGFydC9lbmQgb2YgY29udGFpbmVyKS4KICAgIGZ1bmN0aW9uIHJlbW92ZVJhbmdlKGZyb20sIHRvKSB7CiAgICAgIHZhciBwb3MgPSBmcm9tID8gZnJvbS5uZXh0U2libGluZyA6IHNlbGYuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgIHdoaWxlIChwb3MgIT0gdG8pIHsKICAgICAgICB2YXIgdGVtcCA9IHBvcy5uZXh0U2libGluZzsKICAgICAgICByZW1vdmVFbGVtZW50KHBvcyk7CiAgICAgICAgcG9zID0gdGVtcDsKICAgICAgfQogICAgfQoKICAgIHZhciBzdGFydCA9IGNoYWluWzBdLmZyb20sIGVuZCA9IGNoYWluW2NoYWluLmxlbmd0aCAtIDFdLnRvOwogICAgLy8gQ2xlYXIgdGhlIHNwYWNlIHdoZXJlIHRoaXMgY2hhbmdlIGhhcyB0byBiZSBtYWRlLgogICAgcmVtb3ZlUmFuZ2Uoc3RhcnQsIGVuZCk7CgogICAgLy8gSW5zZXJ0IHRoZSBjb250ZW50IHNwZWNpZmllZCBieSB0aGUgY2hhaW4gaW50byB0aGUgRE9NIHRyZWUuCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBsaW5lID0gY2hhaW5baV07CiAgICAgIC8vIFRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzcGFjZSBhcmUgYWxyZWFkeSBjb3JyZWN0LCBidXQgQlIKICAgICAgLy8gdGFncyBpbnNpZGUgaXQgaGF2ZSB0byBiZSBwdXQgYmFjay4KICAgICAgaWYgKGkgPiAwKQogICAgICAgIHNlbGYuY29udGFpbmVyLmluc2VydEJlZm9yZShsaW5lLmZyb20sIGVuZCk7CgogICAgICAvLyBBZGQgdGhlIHRleHQuCiAgICAgIHZhciBub2RlID0gbWFrZVBhcnRTcGFuKGZpeFNwYWNlcyhsaW5lLnRleHQpLCB0aGlzLmNvbnRhaW5lci5vd25lckRvY3VtZW50KTsKICAgICAgc2VsZi5jb250YWluZXIuaW5zZXJ0QmVmb3JlKG5vZGUsIGVuZCk7CiAgICAgIC8vIFNlZSBpZiB0aGUgY3Vyc29yIHdhcyBvbiB0aGlzIGxpbmUuIFB1dCBpdCBiYWNrLCBhZGp1c3RpbmcKICAgICAgLy8gZm9yIGNoYW5nZWQgbGluZSBsZW5ndGgsIGlmIGl0IHdhcy4KICAgICAgaWYgKGN1cnNvciAmJiBjdXJzb3Iubm9kZSA9PSBsaW5lLmZyb20pIHsKICAgICAgICB2YXIgY3Vyc29yZGlmZiA9IDA7CiAgICAgICAgdmFyIHByZXYgPSB0aGlzLmFmdGVyKGxpbmUuZnJvbSk7CiAgICAgICAgaWYgKHByZXYgJiYgaSA9PSBjaGFpbi5sZW5ndGggLSAxKSB7CiAgICAgICAgICAvLyBPbmx5IGFkanVzdCBpZiB0aGUgY3Vyc29yIGlzIGFmdGVyIHRoZSB1bmNoYW5nZWQgcGFydCBvZgogICAgICAgICAgLy8gdGhlIGxpbmUuCiAgICAgICAgICBmb3IgKHZhciBtYXRjaCA9IDA7IG1hdGNoIDwgY3Vyc29yLm9mZnNldCAmJgogICAgICAgICAgICAgICBsaW5lLnRleHQuY2hhckF0KG1hdGNoKSA9PSBwcmV2LnRleHQuY2hhckF0KG1hdGNoKTsgbWF0Y2grKyk7CiAgICAgICAgICBpZiAoY3Vyc29yLm9mZnNldCA+IG1hdGNoKQogICAgICAgICAgICBjdXJzb3JkaWZmID0gbGluZS50ZXh0Lmxlbmd0aCAtIHByZXYudGV4dC5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHtub2RlOiBsaW5lLmZyb20sIG9mZnNldDogTWF0aC5tYXgoMCwgY3Vyc29yLm9mZnNldCArIGN1cnNvcmRpZmYpfSk7CiAgICAgIH0KICAgICAgLy8gQ3Vyc29yIHdhcyBpbiByZW1vdmVkIGxpbmUsIHRoaXMgaXMgbGFzdCBuZXcgbGluZS4KICAgICAgZWxzZSBpZiAoY3Vyc29yICYmIChpID09IGNoYWluLmxlbmd0aCAtIDEpICYmIGN1cnNvci5ub2RlICYmIGN1cnNvci5ub2RlLnBhcmVudE5vZGUgIT0gdGhpcy5jb250YWluZXIpIHsKICAgICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCB7bm9kZTogbGluZS5mcm9tLCBvZmZzZXQ6IGxpbmUudGV4dC5sZW5ndGh9KTsKICAgICAgfQogICAgfQoKICAgIC8vIEFuY2hvciB0aGUgY2hhaW4gaW4gdGhlIERPTSB0cmVlLgogICAgdGhpcy5saW5rQ2hhaW4oY2hhaW4pOwogICAgcmV0dXJuIHN0YXJ0OwogIH0KfTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/util.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQSBmZXcgdXNlZnVsIHV0aWxpdHkgZnVuY3Rpb25zLiAqLwoKdmFyIGludGVybmV0RXhwbG9yZXIgPSBkb2N1bWVudC5zZWxlY3Rpb24gJiYgd2luZG93LkFjdGl2ZVhPYmplY3QgJiYgL01TSUUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CnZhciB3ZWJraXQgPSAvQXBwbGVXZWJLaXQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CgovLyBDYXB0dXJlIGEgbWV0aG9kIG9uIGFuIG9iamVjdC4KZnVuY3Rpb24gbWV0aG9kKG9iaiwgbmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHtvYmpbbmFtZV0uYXBwbHkob2JqLCBhcmd1bWVudHMpO307Cn0KCi8vIFRoZSB2YWx1ZSB1c2VkIHRvIHNpZ25hbCB0aGUgZW5kIG9mIGEgc2VxdWVuY2UgaW4gaXRlcmF0b3JzLgp2YXIgU3RvcEl0ZXJhdGlvbiA9IHt0b1N0cmluZzogZnVuY3Rpb24oKSB7cmV0dXJuICJTdG9wSXRlcmF0aW9uIn19OwoKLy8gQXBwbHkgYSBmdW5jdGlvbiB0byBlYWNoIGVsZW1lbnQgaW4gYSBzZXF1ZW5jZS4KZnVuY3Rpb24gZm9yRWFjaChpdGVyLCBmKSB7CiAgaWYgKGl0ZXIubmV4dCkgewogICAgdHJ5IHt3aGlsZSAodHJ1ZSkgZihpdGVyLm5leHQoKSk7fQogICAgY2F0Y2ggKGUpIHtpZiAoZSAhPSBTdG9wSXRlcmF0aW9uKSB0aHJvdyBlO30KICB9CiAgZWxzZSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZXIubGVuZ3RoOyBpKyspCiAgICAgIGYoaXRlcltpXSk7CiAgfQp9CgovLyBNYXAgYSBmdW5jdGlvbiBvdmVyIGEgc2VxdWVuY2UsIHByb2R1Y2luZyBhbiBhcnJheSBvZiByZXN1bHRzLgpmdW5jdGlvbiBtYXAoaXRlciwgZikgewogIHZhciBhY2N1bSA9IFtdOwogIGZvckVhY2goaXRlciwgZnVuY3Rpb24odmFsKSB7YWNjdW0ucHVzaChmKHZhbCkpO30pOwogIHJldHVybiBhY2N1bTsKfQoKLy8gQ3JlYXRlIGEgcHJlZGljYXRlIGZ1bmN0aW9uIHRoYXQgdGVzdHMgYSBzdHJpbmcgYWdhaW5zdHMgYSBnaXZlbgovLyByZWd1bGFyIGV4cHJlc3Npb24uIE5vIGxvbmdlciB1c2VkIGJ1dCBtaWdodCBiZSB1c2VkIGJ5IDNyZCBwYXJ0eQovLyBwYXJzZXJzLgpmdW5jdGlvbiBtYXRjaGVyKHJlZ2V4cCl7CiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gcmVnZXhwLnRlc3QodmFsdWUpO307Cn0KCi8vIFRlc3Qgd2hldGhlciBhIERPTSBub2RlIGhhcyBhIGNlcnRhaW4gQ1NTIGNsYXNzLiBNdWNoIGZhc3RlciB0aGFuCi8vIHRoZSBNb2NoaUtpdCBlcXVpdmFsZW50LCBmb3Igc29tZSByZWFzb24uCmZ1bmN0aW9uIGhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSl7CiAgdmFyIGNsYXNzZXMgPSBlbGVtZW50LmNsYXNzTmFtZTsKICByZXR1cm4gY2xhc3NlcyAmJiBuZXcgUmVnRXhwKCIoXnwgKSIgKyBjbGFzc05hbWUgKyAiKCR8ICkiKS50ZXN0KGNsYXNzZXMpOwp9CgovLyBJbnNlcnQgYSBET00gbm9kZSBhZnRlciBhbm90aGVyIG5vZGUuCmZ1bmN0aW9uIGluc2VydEFmdGVyKG5ld05vZGUsIG9sZE5vZGUpIHsKICB2YXIgcGFyZW50ID0gb2xkTm9kZS5wYXJlbnROb2RlOwogIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgb2xkTm9kZS5uZXh0U2libGluZyk7CiAgcmV0dXJuIG5ld05vZGU7Cn0KCmZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQobm9kZSkgewogIGlmIChub2RlLnBhcmVudE5vZGUpCiAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7Cn0KCmZ1bmN0aW9uIGNsZWFyRWxlbWVudChub2RlKSB7CiAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkKICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTsKfQoKLy8gQ2hlY2sgd2hldGhlciBhIG5vZGUgaXMgY29udGFpbmVkIGluIGFub3RoZXIgb25lLgpmdW5jdGlvbiBpc0FuY2VzdG9yKG5vZGUsIGNoaWxkKSB7CiAgd2hpbGUgKGNoaWxkID0gY2hpbGQucGFyZW50Tm9kZSkgewogICAgaWYgKG5vZGUgPT0gY2hpbGQpCiAgICAgIHJldHVybiB0cnVlOwogIH0KICByZXR1cm4gZmFsc2U7Cn0KCi8vIFRoZSBub24tYnJlYWtpbmcgc3BhY2UgY2hhcmFjdGVyLgp2YXIgbmJzcCA9ICJcdTAwYTAiOwp2YXIgbWF0Y2hpbmcgPSB7InsiOiAifSIsICJbIjogIl0iLCAiKCI6ICIpIiwKICAgICAgICAgICAgICAgICJ9IjogInsiLCAiXSI6ICJbIiwgIikiOiAiKCJ9OwoKLy8gU3RhbmRhcmRpemUgYSBmZXcgdW5wb3J0YWJsZSBldmVudCBwcm9wZXJ0aWVzLgpmdW5jdGlvbiBub3JtYWxpemVFdmVudChldmVudCkgewogIGlmICghZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7CiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpIHt0aGlzLmNhbmNlbEJ1YmJsZSA9IHRydWU7fTsKICAgIGV2ZW50LnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7dGhpcy5yZXR1cm5WYWx1ZSA9IGZhbHNlO307CiAgfQogIGlmICghZXZlbnQuc3RvcCkgewogICAgZXZlbnQuc3RvcCA9IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICB0aGlzLnByZXZlbnREZWZhdWx0KCk7CiAgICB9OwogIH0KCiAgaWYgKGV2ZW50LnR5cGUgPT0gImtleXByZXNzIikgewogICAgZXZlbnQuY29kZSA9IChldmVudC5jaGFyQ29kZSA9PSBudWxsKSA/IGV2ZW50LmtleUNvZGUgOiBldmVudC5jaGFyQ29kZTsKICAgIGV2ZW50LmNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY29kZSk7CiAgfQogIHJldHVybiBldmVudDsKfQoKLy8gUG9ydGFibHkgcmVnaXN0ZXIgZXZlbnQgaGFuZGxlcnMuCmZ1bmN0aW9uIGFkZEV2ZW50SGFuZGxlcihub2RlLCB0eXBlLCBoYW5kbGVyLCByZW1vdmVGdW5jKSB7CiAgZnVuY3Rpb24gd3JhcEhhbmRsZXIoZXZlbnQpIHsKICAgIGhhbmRsZXIobm9ybWFsaXplRXZlbnQoZXZlbnQgfHwgd2luZG93LmV2ZW50KSk7CiAgfQogIGlmICh0eXBlb2Ygbm9kZS5hZGRFdmVudExpc3RlbmVyID09ICJmdW5jdGlvbiIpIHsKICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCB3cmFwSGFuZGxlciwgZmFsc2UpOwogICAgaWYgKHJlbW92ZUZ1bmMpIHJldHVybiBmdW5jdGlvbigpIHtub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgd3JhcEhhbmRsZXIsIGZhbHNlKTt9OwogIH0KICBlbHNlIHsKICAgIG5vZGUuYXR0YWNoRXZlbnQoIm9uIiArIHR5cGUsIHdyYXBIYW5kbGVyKTsKICAgIGlmIChyZW1vdmVGdW5jKSByZXR1cm4gZnVuY3Rpb24oKSB7bm9kZS5kZXRhY2hFdmVudCgib24iICsgdHlwZSwgd3JhcEhhbmRsZXIpO307CiAgfQp9CgpmdW5jdGlvbiBub2RlVGV4dChub2RlKSB7CiAgcmV0dXJuIG5vZGUuaW5uZXJUZXh0IHx8IG5vZGUudGV4dENvbnRlbnQgfHwgbm9kZS5ub2RlVmFsdWUgfHwgIiI7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror/jstest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ianMvbWlycm9yZnJhbWUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogSmF2YVNjcmlwdCBkZW1vbnN0cmF0aW9uPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9kb2NzLmNzcyIvPgogIDwvaGVhZD4KICA8Ym9keSBzdHlsZT0icGFkZGluZzogMjBweDsiPgoKPHA+VGhpcyBwYWdlIGRlbW9uc3RyYXRlcyA8YSBocmVmPSJpbmRleC5odG1sIj5Db2RlTWlycm9yPC9hPidzCkphdmFTY3JpcHQgcGFyc2VyLiBOb3RlIHRoYXQgdGhlIHVnbHkgYnV0dG9ucyBhdCB0aGUgdG9wIGFyZSBub3QgYXJlCm5vdCBwYXJ0IG9mIENvZGVNaXJyb3IgcHJvcGVyIC0tIHRoZXkgZGVtb25zdHJhdGUgdGhlIHdheSBpdCBjYW4gYmUKZW1iZWRkZWQgaW4gYSB3ZWItYXBwbGljYXRpb24uPC9wPgoKPGRpdiBjbGFzcz0iYm9yZGVyIj4KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjMwIj4KLy8gSGVyZSB5b3Ugc2VlIHNvbWUgSmF2YVNjcmlwdCBjb2RlLiBNZXNzIGFyb3VuZCB3aXRoIGl0IHRvIGdldAovLyBhY3F1YWludGVkIHdpdGggQ29kZU1pcnJvcidzIGZlYXR1cmVzLgoKLy8gUHJlc3MgZW50ZXIgaW5zaWRlIHRoZSBvYmplY3QgYW5kIHlvdXIgbmV3IGxpbmUgd2lsbCBiZSBzdWl0YWJseQovLyBpbmRlbnRlZC4KdmFyIGtleUJpbmRpbmdzID0gewogIGVudGVyOiAibmV3bGluZS1hbmQtaW5kZW50IiwKICB0YWI6ICJyZWluZGVudC1zZWxlY3Rpb24iLAogIGN0cmxfejogInVuZG8iLAogIGN0cmxfeTogInJlZG8iLAogIGN0cmxfYmFja3NwYWNlOiAidW5kby1mb3Itc2FmYXJpICh3aGljaCBibG9ja3MgY3RybC16KSIsCiAgY3RybC1icmFja2V0OiAiaGlnaGxpZ2h0LWJyYWNrZXRzIiwKICBjdHJsLXNoaWZ0LWJyYWNrZXQ6ICJqdW1wLXRvLW1hdGNoaW5nLWJyYWNrZXQiCn07CgovLyBQcmVzcyB0YWIgb24gdGhlIG5leHQgbGluZSBhbmQgdGhlIHdyb25nIGluZGVudGF0aW9uIHdpbGwgYmUgZml4ZWQuCiAgICAgIHZhciByZWdleCA9IC9mb298YmFyL2k7CgpmdW5jdGlvbiBleGFtcGxlKHgpIHsKICAvLyBMb2NhbCB2YXJpYWJsZXMgZ2V0IGEgZGlmZmVyZW50IGNvbG91ciB0aGFuIGdsb2JhbCBvbmVzLgogIHZhciB5ID0gNDQuNDsKICByZXR1cm4geCArIHkgLSB6Owp9CjwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogIHZhciB0ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2RlJyk7CiAgdmFyIGVkaXRvciA9IG5ldyBNaXJyb3JGcmFtZShDb2RlTWlycm9yLnJlcGxhY2UodGV4dGFyZWEpLCB7CiAgICBoZWlnaHQ6ICIzNTBweCIsCiAgICBjb250ZW50OiB0ZXh0YXJlYS52YWx1ZSwKICAgIHBhcnNlcmZpbGU6IFsidG9rZW5pemVqYXZhc2NyaXB0LmpzIiwgInBhcnNlamF2YXNjcmlwdC5qcyJdLAogICAgc3R5bGVzaGVldDogImNzcy9qc2NvbG9ycy5jc3MiLAogICAgcGF0aDogImpzLyIsCiAgICBhdXRvTWF0Y2hQYXJlbnM6IHRydWUKICB9KTsKPC9zY3JpcHQ+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IENvcHlyaWdodCAoYykgMjAwNy0yMDA5IE1hcmlqbiBIYXZlcmJla2UKCiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueQogZGFtYWdlcyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgoKIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogcHVycG9zZSwgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kCiByZWRpc3RyaWJ1dGUgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgoKIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3QKICAgIG5vdCBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcwogICAgc29mdHdhcmUgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdAogICAgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgoKIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3QKICAgIG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCgogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlCiAgICBkaXN0cmlidXRpb24uCgogTWFyaWpuIEhhdmVyYmVrZQogbWFyaWpuaCBhdCBnbWFpbAo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/manual.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHRpdGxlPkNvZGVNaXJyb3IgdXNlciBtYW51YWw8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2RvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxIGNsYXNzPSJ1bmRlcmxpbmUiPkNvZGVNaXJyb3IgdXNlciBtYW51YWw8L2gxPgoKICAgIDxoMj5Db250ZW50czwvaDI+CgogICAgPHVsPgogICAgICA8bGk+PGEgaHJlZj0iI3VzZWFnZSI+QmFzaWMgVXNlYWdlPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjY29uZmlndXJhdGlvbiI+Q29uZmlndXJhdGlvbjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iI3BhcnNlcnMiPlBhcnNlcnM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9IiNwcm9ncmFtbWluZyI+UHJvZ3JhbW1pbmcgSW50ZXJmYWNlPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjd3JpdGVwYXJzZXIiPldyaXRpbmcgYSBQYXJzZXI8L2E+PC9saT4KICAgIDwvdWw+CgogICAgPGgyIGlkPSJ1c2VhZ2UiPkJhc2ljIFVzYWdlPC9oMj4KCiAgICA8cD5JbnNpZGUgdGhlIGVkaXRvciwgdGhlIHRhYiBrZXkgaXMgdXNlZCB0byByZS1pbmRlbnQgdGhlIGN1cnJlbnQKICAgIHNlbGVjdGlvbiAob3IgdGhlIGN1cnJlbnQgbGluZSB3aGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQpLCBhbmQKICAgIHByZXNzaW5nIGVudGVyIHdpbGwsIGFwYXJ0IGZyb20gaW5zZXJ0aW5nIGEgbGluZSBicmVhaywKICAgIGF1dG9tYXRpY2FsbHkgaW5kZW50IHRoZSBuZXcgbGluZS4gUHJlc3NpbmcgY29udHJvbC1lbnRlciB3aWxsCiAgICBjYXVzZSB0aGUgd2hvbGUgYnVmZmVyIHRvIGJlIHJlLWNvbG91cmVkLCB3aGljaCBjYW4gYmUgaGVscGZ1bAogICAgd2hlbiBzb21lIGNvbG91cmluZyBoYXMgYmVjb21lIG91dC1vZi1kYXRlIHdpdGhvdXQgdGhlIGVkaXRvcgogICAgbm90aWNpbmcgaXQuPC9wPgoKICAgIDxwPlRoZSBlZGl0b3Igc3BvcnRzIGFuIHVuZG8vcmVkbyBzeXN0ZW0sIGFjY2Vzc2libGUgd2l0aAogICAgY29udHJvbC16ICh1bmRvKSBhbmQgY29udHJvbC15IChyZWRvKS4gU2FmYXJpIHdpbGwgbm90IGFsbG93CiAgICBjbGllbnQgc2NyaXB0cyB0byBjYXB0dXJlIGNvbnRyb2wteiBwcmVzc2VzLCBidXQgeW91IGNhbiB1c2UKICAgIGNvbnRyb2wtYmFja3NwYWNlIGluc3RlYWQgb24gdGhhdCBicm93c2VyLjwvcD4KCiAgICA8cD5UaGUga2V5LWNvbWJpbmF0aW9uIGNvbnRyb2wtWyB0cmlnZ2VycyBhIHBhcmVuLWJsaW5rOiBJZiB0aGUKICAgIGN1cnNvciBpcyBkaXJlY3RseSBhZnRlciBhICcoJywgJyknLCAnWycsICddJywgJ3snLCBvciAnfScsIHRoZQogICAgZWRpdG9yIGxvb2tzIGZvciB0aGUgbWF0Y2hpbmcgY2hhcmFjdGVyLCBhbmQgaGlnaGxpZ2h0cyB0aGVzZQogICAgY2hhcmFjdGVycyBmb3IgYSBtb21lbnQuIFRoZXJlIGlzIGFuIG9wdGlvbiB0byBlbmFibGUgdGhpcyB0bwogICAgaGFwcGVuIGFueSB0aW1lIHRoZSB1c2VyIHR5cGVzIHNvbWV0aGluZyBvciBtb3ZlcyB0aGUgY3Vyc29yLjwvcD4KCiAgICA8cD5UbyB1c2UgQ29kZU1pcnJvciBpbiBhIGRvY3VtZW50LCB5b3Ugc2hvdWxkIGFkZCBhIHNjcmlwdCB0YWcgdG8KICAgIGxvYWQgPGEgaHJlZj0ianMvY29kZW1pcnJvci5qcyI+PGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT48L2E+LiBUaGlzCiAgICBhZGRzIHR3byBvYmplY3RzIHRvIHlvdXIgZW52aXJvbm1lbnQsIDxjb2RlPkNvZGVNaXJyb3I8L2NvZGU+IGFuZAogICAgPGNvZGU+Q29kZU1pcnJvckNvbmZpZzwvY29kZT4uIFRoZSBmaXJzdCBpcyB0aGUgaW50ZXJmYWNlIHRvIHRoZQogICAgZWRpdG9yLCB0aGUgc2Vjb25kIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBpdC4gKE5vdGUgdGhhdCB0aGlzIGlzCiAgICB0aGUgb25seSBuYW1lLXNwYWNlIHBvbGx1dGlvbiB5b3UgY2FuIGV4cGVjdCBmcm9tIENvZGVNaXJyb3IgLS0KICAgIGFsbCBvdGhlciBjcnVmdCBpcyBrZXB0IGluc2lkZSB0aGUgSUZSQU1FcyB0aGF0IGl0IGNyZWF0ZXMgd2hlbgogICAgeW91IG9wZW4gYW4gZWRpdG9yLik8L3A+CgogICAgPHA+VG8gYWRkIGFuIGVkaXRvciB0byBhIGRvY3VtZW50LCB5b3UgbXVzdCBjaG9vc2UgYSBwbGFjZSwgYQogICAgcGFyc2VyLCBhbmQgYSBzdHlsZS1zaGVldCBmb3IgaXQuIEZvciBleGFtcGxlLCB0byBhcHBlbmQgYW4KICAgIFhNTCBlZGl0b3IgdG8gdGhlIGJvZHkgb2YgdGhlIGRvY3VtZW50LCB5b3UgZG86PC9wPgoKICAgIDxwcmUgY2xhc3M9ImNvZGUiPnZhciBlZGl0b3IgPSBuZXcgQ29kZU1pcnJvcihkb2N1bWVudC5ib2R5LCB7CiAgcGFyc2VyZmlsZTogInBhcnNleG1sLmpzIiwKICBzdHlsZXNoZWV0OiAieG1sY29sb3JzLmNzcyIKfSk7PC9wcmU+CgogICAgPHA+VGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPiBjb25zdHJ1Y3RvcgogICAgY2FuIGJlIGEgRE9NIG5vZGUsIGluIHdoaWNoIGNhc2UgdGhlIGVkaXRvciBnZXRzIGFwcGVuZGVkIHRvIHRoYXQKICAgIG5vZGUsIG9yIGEgZnVuY3Rpb24sIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIElGUkFNRSBub2RlIGFzCiAgICBhcmd1bWVudCwgYW5kIHdoaWNoIGlzIGV4cGVjdGVkIHRvIHBsYWNlIHRoYXQgbm9kZSBzb21ld2hlcmUgaW4KICAgIHRoZSBkb2N1bWVudC48L3A+CgogICAgPHA+VGhlIHNlY29uZCAob3B0aW9uYWwpIGFyZ3VtZW50IGlzIGFuIG9iamVjdCB0aGF0IHNwZWNpZmllcwogICAgb3B0aW9ucy4gQSBzZXQgb2YgZGVmYXVsdCBvcHRpb25zIChzZWUgYmVsb3cpIGlzIHByZXNlbnQgaW4gdGhlCiAgICA8Y29kZT5Db2RlTWlycm9yQ29uZmlnPC9jb2RlPiBvYmplY3QsIGJ1dCBlYWNoIGluc3RhbmNlIG9mIHRoZQogICAgZWRpdG9yIGNhbiBiZSBnaXZlbiBhIHNldCBvZiBzcGVjaWZpYyBvcHRpb25zIHRvIG92ZXJyaWRlIHRoZXNlCiAgICBkZWZhdWx0cy4gSW4gdGhpcyBjYXNlLCB3ZSBzcGVjaWZpZWQgdGhhdCB0aGUgcGFyc2VyIHNob3VsZCBiZQogICAgbG9hZGVkIGZyb20gdGhlIDxhCiAgICBocmVmPSJqcy9wYXJzZXhtbC5qcyI+PGNvZGU+InBhcnNleG1sLmpzIjwvY29kZT48L2E+IGZpbGUsIGFuZAogICAgdGhhdCA8YSBocmVmPSJjc3MveG1sY29sb3JzLmNzcyI+PGNvZGU+InhtbGNvbG9ycy5jc3MiPC9jb2RlPjwvYT4KICAgIHNob3VsZCBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbG91cnMgb2YgdGhlIGNvZGUuPC9wPgoKICAgIDxwPkFub3RoZXIgZXhhbXBsZTo8L3A+CgogICAgPHByZSBjbGFzcz0iY29kZSI+dmFyIGVkaXRvciA9IG5ldyBDb2RlTWlycm9yKENvZGVNaXJyb3IucmVwbGFjZSgiaW5wdXRmaWVsZCIpLCB7CiAgcGFyc2VyZmlsZTogWyJ0b2tlbml6ZWphdmFzY3JpcHQuanMiLCAicGFyc2VqYXZhc2NyaXB0LmpzIl0sCiAgcGF0aDogImxpYi9jb2RlbWlycm9yL2pzLyIsCiAgc3R5bGVzaGVldDogImxpYi9jb2RlbWlycm9yL2Nzcy9qc2NvbG9ycy5jc3MiLAogIGNvbnRlbnQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpbnB1dGZpZWxkIikudmFsdWUKfSk7PC9wcmU+CgogICAgPHA+SGVyZSB3ZSB1c2UgdGhlIHV0aWxpdHkgZnVuY3Rpb24KICAgIDxjb2RlPkNvZGVNaXJyb3IucmVwbGFjZTwvY29kZT4gdG8gY3JlYXRlIGEgZnVuY3Rpb24gdGhhdCB3aWxsCiAgICByZXBsYWNlIGEgbm9kZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudCAoZ2l2ZW4gZWl0aGVyIGRpcmVjdGx5IG9yCiAgICBieSBJRCkgd2l0aCB0aGUgZWRpdG9yLiBXZSBhbHNvIHNlbGVjdCB0aGUgSmF2YVNjcmlwdCBwYXJzZXIgdGhpcwogICAgdGltZSwgYW5kIGdpdmUgYSA8Y29kZT5wYXRoPC9jb2RlPiBvcHRpb24gdG8gdGVsbCB0aGUgZWRpdG9yIHRoYXQKICAgIGl0cyBmaWxlcyBhcmUgbm90IGxvY2F0ZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjdXJyZW50CiAgICBIVE1MIHBhZ2UsIGJ1dCBpbiA8Y29kZT4ibGliL2NvZGVtaXJyb3IvIjwvY29kZT4uPC9wPgoKICAgIDxwPlRoZXJlIGlzIGEgZnVuY3Rpb24KICAgIDxjb2RlPkNvZGVNaXJyb3IuaXNQcm9iYWJseVN1cHBvcnRlZCgpPC9jb2RlPiB0aGF0IGNhdXNlcyBzb21lCiAgICAxOTk4LXN0eWxlIGJyb3dzZXIgZGV0ZWN0aW9uIHRvIGhhcHBlbiwgcmV0dXJuaW5nCiAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgQ29kZU1pcnJvciBpcyBwcm9iYWJseSBub3Qgc3VwcG9ydGVkIG9uIHRoZQogICAgYnJvd3NlciwgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgcHJvYmFibHkgaXMsIGFuZAogICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaGFzIG5vIGlkZWEuIEFzIHRoZSBuYW1lIHN1Z2dlc3RzLCB0aGlzIGlzCiAgICBub3Qgc29tZXRoaW5nIHlvdSBjYW4gcmVseSBvbiwgYnV0IGl0J3MgdXN1YWxseSBiZXR0ZXIgdGhhbgogICAgbm90aGluZy48L3A+CgogICAgPHA+QW5vdGhlciB1dGlsaXR5IGZ1bmN0aW9uLCA8Y29kZT5Db2RlTWlycm9yLmZyb21UZXh0QXJlYTwvY29kZT4sCiAgICB3aWxsLCBnaXZlbiBhIHRleHRhcmVhIG5vZGUgb3IgdGhlIGlkIG9mIHN1Y2ggYSBub2RlLCBoaWRlIHRoZQogICAgdGV4dGFyZWEgYW5kIHJlcGxhY2UgaXQgd2l0aCBhIENvZGVNaXJyb3IgZnJhbWUuIElmIHRoZSB0ZXh0YXJlYQogICAgd2FzIHBhcnQgb2YgYSBmb3JtLCBhbiA8Y29kZT5vbnN1Ym1pdDwvY29kZT4gaGFuZGxlciB3aWxsIGJlCiAgICByZWdpc3RlcmVkIHdpdGggdGhpcyBmb3JtLCB3aGljaCB3aWxsIGxvYWQgdGhlIGNvbnRlbnQgb2YgdGhlCiAgICBlZGl0b3IgaW50byB0aGUgdGV4dGFyZWEsIHNvIHRoYXQgaXQgY2FuIGJlIHN1Ym1pdHRlZCBhcyBub3JtYWwuCiAgICBUaGlzIGZ1bmN0aW9uIG9wdGlvbmFsbHkgdGFrZXMgYSBjb25maWd1cmF0aW9uIG9iamVjdCBhcyBzZWNvbmQKICAgIGFyZ3VtZW50LjwvcD4KCiAgICA8cHJlIGNsYXNzPSJjb2RlIj52YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoImlucHV0ZmllbGQiLCB7CiAgcGFyc2VyZmlsZTogWyJ0b2tlbml6ZWphdmFzY3JpcHQuanMiLCAicGFyc2VqYXZhc2NyaXB0LmpzIl0sCiAgcGF0aDogImxpYi9jb2RlbWlycm9yL2pzLyIsCiAgc3R5bGVzaGVldDogImxpYi9jb2RlbWlycm9yL2Nzcy9qc2NvbG9ycy5jc3MiCn0pOzwvcHJlPgoKICAgIDxwPlRoZSByZWFzb24gdGhhdCB0aGUgc2NyaXB0IHBhdGggaGFzIHRvIGJlIGNvbmZpZ3VyZWQgaXMgdGhhdAogICAgQ29kZU1pcnJvciB3aWxsIGxvYWQgaW4gYSBidW5jaCBvZiBleHRyYSBmaWxlcyB3aGVuIGFuIGVkaXRvciBpcwogICAgY3JlYXRlZCAodGhlIHBhcnNlciBzY3JpcHQsIGFtb25nIG90aGVycykuIFRvIGJlIGFibGUgdG8gZG8gdGhpcywKICAgIGl0IGhhcyB0byBrbm93IHdoZXJlIHRvIGZpbmQgdGhlbS4gVGhlc2UgYXJlIGFsbCB0aGUgSmF2YVNjcmlwdAogICAgZmlsZXMgdGhhdCBhcmUgcGFydCBvZiBDb2RlTWlycm9yIGl0c2VsZjo8L3A+CgogICAgPGRsPgogICAgICA8ZHQ+PGEgaHJlZj0ianMvY29kZW1pcnJvci5qcyI+PGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPk1haW4gaW50ZXJmYWNlLCB0YWtlcyBjYXJlIG9mIGRlZmF1bHQgY29uZmlndXJhdGlvbiBhbmQgdGhlCiAgICAgIGRlZmluaXRpb24gb2YgZWRpdG9yIGZyYW1lcy4gSW5jbHVkZSB0aGlzIGluIHlvdXIgSFRNTAogICAgICBkb2N1bWVudC48L2RkPgogICAgICA8ZHQ+PGEgaHJlZj0ianMvZWRpdG9yLmpzIj48Y29kZT5lZGl0b3IuanM8L2NvZGU+PC9hPjwvZHQ+IDxkZD5UaGUKICAgICAgY29kZSB0aGF0IHRha2VzIGNhcmUgb2YgcmVhY3RpbmcgdG8gdXNlciBpbnB1dCwgY29sb3VyaW5nIHRleHQsCiAgICAgIGFuZCBpbmRlbnRpbmcgbGluZXMuPC9kZD4KICAgICAgPGR0PjxhIGhyZWY9ImpzL3V0aWwuanMiPjxjb2RlPnV0aWwuanM8L2NvZGU+PC9hPjwvZHQ+IDxkZD5BIGZldwogICAgICBnZW5lcmljIHV0aWxpdHkgZnVuY3Rpb25zLjwvZGQ+CiAgICAgIDxkdD48YQogICAgICBocmVmPSJqcy91bmRvLmpzIj48Y29kZT51bmRvLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+SW1wbGVtZW50cyB0aGUgdW5kbyBoaXN0b3J5IGZvciB0aGUgZWRpdG9yLjwvZGQ+CiAgICAgIDxkdD48YQogICAgICBocmVmPSJqcy9zdHJpbmdzdHJlYW0uanMiPjxjb2RlPnN0cmluZ3N0cmVhbS5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPk9iamVjdHMgZm9yIHdyYXBwaW5nIHRoZSB0ZXh0dWFsIGlucHV0IHRvIHRoZSBwYXJzZXIuPC9kZD4KICAgICAgPGR0PjxhIGhyZWY9ImpzL3NlbGVjdC5qcyI+PGNvZGU+c2VsZWN0LmpzPC9jb2RlPjwvYT48L2R0PiA8ZGQ+U29tZQogICAgICBoZWxwZXIgdXRpbGl0aWVzIGZvciB3b3JraW5nIHdpdGggc2VsZWN0ZWQgdGV4dCBhbmQgY3Vyc29yCiAgICAgIHBvc2l0aW9ucy48L2RkPgogICAgICA8ZHQ+PGEgaHJlZj0ianMvdG9rZW5pemUuanMiPjxjb2RlPnRva2VuaXplLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+SGVscGVyIGZyYW1ld29yayBmb3Igd3JpdGluZyB0b2tlbmlzZXJzLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxwPk1vc3Qgb2YgdGhlc2UgYXJlIHJhdGhlciBmdWxsIG9mIGNvbW1lbnRzLCB3aGljaCBjYW4gYmUgdXNlZnVsCiAgICB3aGVuIHlvdSBhcmUgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgaG93IHRoZXkgd29yaywgYnV0IHdhc3RlcyBhIGxvdAogICAgb2YgYmFuZHdpZHRoIGluIGEgcHJvZHVjdGlvbiBzeXN0ZW0uIFRha2UgYSBsb29rIGF0IHRoZQogICAgZGVzY3JpcHRpb24gb2YgdGhlIDxjb2RlPmJhc2VmaWxlczwvY29kZT4gb3B0aW9uIGJlbG93IGlmIHlvdSB3YW50CiAgICB0byBjb25jYXRlbmF0ZSBhbmQgbWluaW1pc2UgdGhlIGxpYnJhcnkuPC9wPgoKICAgIDxwPkFwYXJ0IGZyb20gdGhlc2UsIHRoZXJlIGFyZSBmaWxlcyB0aGF0IGltcGxlbWVudCB0aGUgdmFyaW91cwogICAgcGFyc2Vycy4gVGhlc2UgYWxsIHN0YXJ0IHdpdGggZWl0aGVyIDxjb2RlPnBhcnNlPC9jb2RlPiBvcgogICAgPGNvZGU+dG9rZW5pemU8L2NvZGU+LjwvcD4KCiAgICA8aDIgaWQ9ImNvbmZpZ3VyYXRpb24iPkNvbmZpZ3VyYXRpb248L2gyPgoKICAgIDxwPlRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGNvbmZpZ3VyZSBDb2RlTWlycm9yOjwvcD4KCiAgICA8dWw+CiAgICAgIDxsaT5JZiB5b3UgZGVmaW5lIGEgZ2xvYmFsIDxjb2RlPkNvZGVNaXJyb3JDb25maWc8L2NvZGU+IG9iamVjdAogICAgICBiZWZvcmUgbG9hZGluZyA8YQogICAgICBocmVmPSJqcy9jb2RlbWlycm9yLmpzIj48Y29kZT5jb2RlbWlycm9yLmpzPC9jb2RlPjwvYT4sIHRoZQogICAgICBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW4gdGhhdCBvYmplY3Qgd2lsbCBvdmVycmlkZSB0aGUKICAgICAgZGVmYXVsdHMuPC9saT4KICAgICAgPGxpPkJ5IGFzc2lnbmluZyB0byB0aGUgcHJvcGVydGllcyBvZiB0aGUKICAgICAgPGNvZGU+Q29kZU1pcnJvckNvbmZpZzwvY29kZT4gb2JqZWN0LCBjb25maWd1cmF0aW9uIGRlZmF1bHRzIGNhbgogICAgICBiZSBvdmVycmlkZGVuIGFmdGVyIGxvYWRpbmcgPGEKICAgICAgaHJlZj0ianMvY29kZW1pcnJvci5qcyI+PGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT48L2E+LjwvbGk+CiAgICAgIDxsaT5UaGUgPGNvZGU+Q29kZU1pcnJvcjwvY29kZT4gY29uc3RydWN0b3IgY2FuIGJlIGdpdmVuIGEgc2Vjb25kCiAgICAgIGFyZ3VtZW50LCBhbiBvYmplY3QsIHdoaWNoIHdpbGwgb3ZlcnJpZGUgc29tZSBvcHRpb25zIGZvciBqdXN0CiAgICAgIHRoYXQgZWRpdG9yLiBPcHRpb25zIG5vdCBtZW50aW9uZWQgaW4gdGhpcyBvYmplY3Qgd2lsbCBkZWZhdWx0IHRvCiAgICAgIHRoZSB2YWx1ZXMgaW4gdGhlIDxjb2RlPkNvZGVNaXJyb3JDb25maWc8L2NvZGU+IG9iamVjdC48L2xpPgogICAgPC91bD4KCiAgICA8cD5UaGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgYXJlIHRoZXNlIChtb3N0IGhhdmUgc2Vuc2libGUKICAgIGRlZmF1bHRzIHNwZWNpZmllZCBpbiA8YQogICAgaHJlZj0ianMvY29kZW1pcnJvci5qcyI+PGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT48L2E+KTo8L3A+CgogICAgPGRsPgoKICAgICAgPGR0Pjxjb2RlPnN0eWxlc2hlZXQ8L2NvZGU+PC9kdD48ZGQ+VGhlIGZpbGUgbmFtZSBvZiB0aGUgc3R5bGUtc2hlZXQKICAgICAgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb2xvdXIgdGhlIGNvZGUgaW4gdGhlIGVkaXRvciBmcmFtZS4gU2VlIDxhCiAgICAgIGhyZWY9ImNzcy9qc2NvbG9ycy5jc3MiPjxjb2RlPmpzY29sb3JzLmNzczwvY29kZT48L2E+IGZvciBhbgogICAgICBleGFtcGxlLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+cGF0aDwvY29kZT48L2R0PjxkZD5UaGUgcGF0aCB0aGF0IGlzIHByZWZpeGVkIHRvCiAgICAgIHNjcmlwdCBmaWxlIG5hbWVzIHdoZW4gdGhleSBhcmUgbG9hZGVkIGludG8gYW4gSUZSQU1FLiAoTm90ZSB0aGF0CiAgICAgIHRoaXMgaXMgbm90IGFwcGxpZWQgdG8gdGhlIHN0eWxlLXNoZWV0IGZpbGUgbmFtZS4pPC9kZD4KCiAgICAgIDxkdD48Y29kZT5wYXJzZXJmaWxlPC9jb2RlPjwvZHQ+PGRkPkEgZmlsZSBuYW1lIHN0cmluZywgb3IgYW4KICAgICAgYXJyYXkgb2Ygc3RyaW5ncyB0aGF0IG5hbWUgdGhlIGZpbGVzIGNvbnRhaW5pbmcgdGhlIHBhcnNlci4gU2VlCiAgICAgIGJlbG93IGZvciB0aGUgaW50ZXJmYWNlIHRoYXQgc3VjaCBhIHBhcnNlciBzaG91bGQKICAgICAgaW1wbGVtZW50LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+YmFzZWZpbGVzPC9jb2RlPjwvZHQ+PGRkPkFuIGFycmF5IG9mIHN0cmluZ3MgbmFtaW5nCiAgICAgIHRoZSBmaWxlcyBjb250YWluaW5nIHRoZSBiYXNlIENvZGVNaXJyb3IgZnVuY3Rpb25hbGl0eS4gRGVmYXVsdHMKICAgICAgdG8gPGNvZGU+WyJ1dGlsLmpzIiwgInN0cmluZ3N0cmVhbS5qcyIsICJzZWxlY3QuanMiLCAidW5kby5qcyIsCiAgICAgICJlZGl0b3IuanMiLCAidG9rZW5pemUuanMiXTwvY29kZT4sIGJ1dCBpZiB5b3UgcHV0IHRoZW0gYWxsIGludG8KICAgICAgYSBzaW5nbGUgZmlsZSB0byByZWR1Y2UgbGF0ZW5jeSwgb3IgYWRkIHNvbWUgZnVuY3Rpb25hbGl0eSwgeW91CiAgICAgIG1pZ2h0IGhhdmUgdG8gYWRqdXN0IHRoYXQuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5pZnJhbWVDbGFzczwvY29kZT48L2R0PjxkZD5TZXQgdGhpcyB0byBhIHN0cmluZyB0bwogICAgICBnaXZlIHRoZSBJRlJBTUUgbm9kZSBjcmVhdGVkIGZvciB0aGUgZWRpdG9yIGEgY3VzdG9tIENTUyBjbGFzcy4KICAgICAgRGVmYXVsdHMgdG8gPGNvZGU+bnVsbDwvY29kZT4uPC9kZD4KICAgICAgCiAgICAgIDxkdD48Y29kZT5wYXNzRGVsYXk8L2NvZGU+PC9kdD48ZGQ+R2l2ZXMgdGhlIGFtb3VudCBvZgogICAgICBtaWxsaXNlY29uZHMgYmV0d2VlbiBjb2xvdXJpbmcgcGFzc2VzLiBEZWZhdWx0cyB0byAyMDAuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5wYXNzVGltZTwvY29kZT48L2R0PjxkZD5TcGVjaWZpZXMgdGhlIG1heGltdW0gYW1vdW50CiAgICAgIG9mIHRpbWUgdGhhdCB0aGUgaGlnaGxpZ2h0ZXIgd2lsbCBzcGVuZCBpbiBvbmUgc2hvdC4gU2V0dGluZwogICAgICB0aGlzIHRvbyBoaWdoIHdpbGwgY2F1c2UgdGhlIGVkaXRvciB0byAnZnJlZXplJyB0aGUgYnJvd3NlciBmb3IKICAgICAgbm90aWNlYWJsZSBpbnRlcnZhbHMuIERlZmF1bHRzIHRvIDUwLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+Y29udGludW91c1NjYW5uaW5nPC9jb2RlPjwvZHQ+PGRkPkNvbmZpZ3VyZSBjb250aW51b3VzCiAgICAgIHNjYW5uaW5nIG9mIHRoZSBkb2N1bWVudC4gV2hlbiA8Y29kZT5mYWxzZTwvY29kZT4sIHNjYW5uaW5nIGlzCiAgICAgIGRpc2FibGVkLiBXaGVuIHNldCB0byBhIG51bWJlciwgc2F5IDxjb2RlPk48L2NvZGU+LCBhCiAgICAgICdiYWNrZ3JvdW5kJyBwcm9jZXNzIHdpbGwgc2NhbiB0aGUgZG9jdW1lbnQgZm9yCiAgICAgIDxjb2RlPnBhc3NUaW1lPC9jb2RlPiAoc2VlIGFib3ZlKSBtaWxsaXNlY29uZHMgZXZlcnkKICAgICAgPGNvZGU+TjwvY29kZT4gbWlsbGlzZWNvbmRzLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55dGhpbmcKICAgICAgY2hhbmdlZC4gVGhpcyBtYWtlcyBzdXJlIG5vbi1sb2NhbCBjaGFuZ2VzIHByb3BhZ2F0ZSB0aHJvdWdoIHRoZQogICAgICBkb2N1bWVudCwgYW5kIHdpbGwgaGVscCBrZWVwIGV2ZXJ5dGhpbmcgY29uc2lzdGVudC4gSXQgZG9lcyBhZGQKICAgICAgZXh0cmEgcHJvY2Vzc2luZyBjb3N0LCBldmVuIGZvciBhbiBpZGxlIGVkaXRvci4gRGVmYXVsdCB2YWx1ZSBpcwogICAgICA8Y29kZT5mYWxzZTwvY29kZT4uPC9kZD4KCiAgICAgIDxkdD48Y29kZT5hdXRvTWF0Y2hQYXJlbnM8L2NvZGU+PC9kdD48ZGQ+V2hlbiA8Y29kZT50cnVlPC9jb2RlPiwKICAgICAgd2lsbCBjYXVzZSBwYXJlbnMgdG8gYmUgbWF0Y2hlZCBldmVyeSB0aW1lIGEga2V5IGlzIHByZXNzZWQgb3IKICAgICAgdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBkb2N1bWVudC4gRGVmYXVsdHMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LgogICAgICBNaWdodCBiZSBleHBlbnNpdmUgZm9yIGJpZyBkb2N1bWVudHMuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5zYXZlRnVuY3Rpb248L2NvZGU+PC9kdD48ZGQ+SWYgZ2l2ZW4gYSBmdW5jdGlvbgogICAgICB2YWx1ZSwgdGhhdCBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgdXNlciBwcmVzc2VzCiAgICAgIGNvbnRyb2wtcy4gWW91IHNob3VsZCBhZHZpc2UgeW91ciBPcGVyYSB1c2VycyB0byB1c2UKICAgICAgY29udHJvbC1zaGlmdC1zIGluc3RlYWQsIHNpbmNlIHBsYWluIGNvbnRyb2wtcyB3aWxsIGJyaW5nIHVwIHRoZQogICAgICAnc2F2ZSBwYWdlJyBkaWFsb2cuIERlZmF1bHRzIHRvIDxjb2RlPm51bGw8L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+dW5kb0RlcHRoPC9jb2RlPjwvZHQ+PGRkPk1heGltdW0gbGVuZ3RoIG9mIHRoZSB1bmRvCiAgICAgIGhpc3RvcnkuIERlZmF1bHQgaXMgNTAuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5vbkNoYW5nZTwvY29kZT48L2R0PjxkZD5BbiBvcHRpb25hbCBmdW5jdGlvbiBvZiB6ZXJvCiAgICAgIGFyZ3VtZW50cyB0aGF0IGdldHMgY2FsbGVkIHdoZW5ldmVyIHRoZSBkb2N1bWVudCBpcyBjaGFuZ2VkLgogICAgICBIYXBwZW5zIGF0IHVuZG8tY29tbWl0IHRpbWUsIG5vdCBpbnN0YW50YW5pb3VzbHkuPC9kZD4KCiAgICAgIDxkdD48Y29kZT51bmRvRGVsYXk8L2NvZGU+PC9kdD48ZGQ+V2hlbiBub3RoaW5nIGlzIGRvbmUgaW4gdGhlCiAgICAgIGVkaXRvciBmb3IgdGhpcyBhbW91bnQgb2YgbWlsbGlzZWNvbmRzLCBwZW5kaW5nIGNoYW5nZXMgZ2V0CiAgICAgIGFkZGVkIHRvIHRoZSB1bmRvIGhpc3RvcnkuIFNldHRpbmcgdGhpcyBsb3dlciB3aWxsIGdpdmUgdGhlIHVuZG8KICAgICAgZnVuY3Rpb25hbGl0eSBhIGZpbmVyIGdyYW51bGFyaXR5LiBEZWZhdWx0cyB0byA4MDAuPC9kZD4KCiAgICAgIDxkdD48Y29kZT53aWR0aDwvY29kZT4sIDxjb2RlPmhlaWdodDwvY29kZT48L2R0PjxkZD5UaGUgc2l6ZSBvZgogICAgICB0aGUgZWRpdG9yIGZyYW1lLCBnaXZlbiBhcyBhIHN0eWxlLXNoZWV0IHF1YW50aXRpZXMgKGZvciBleGFtcGxlCiAgICAgIDxjb2RlPiI2MDBweCI8L2NvZGU+IG9yIDxjb2RlPiIxMDAlIjwvY29kZT4pLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+ZGlzYWJsZVNwZWxsY2hlY2s8L2NvZGU+PC9kdD48ZGQ+U2hvdWxkIHRoZSBlZGl0b3IKICAgICAgZGlzYWJsZSBzcGVsbC1jaGVja2luZyBvbiBicm93c2VycyB0aGF0IHN1cHBvcnQgaXQgKEZpcmVmb3ggMispLgogICAgICBEZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LCBzaW5jZSBmb3IgbW9zdCBjb2RlIHNwZWxsLWNoZWNraW5nCiAgICAgIGlzIHVzZWxlc3MuPC9kZD4KCiAgICAgIDxkdD48Y29kZT50ZXh0V3JhcHBpbmc8L2NvZGU+PC9kdD48ZGQ+Q2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBvcgogICAgICBlbmFibGUgdGV4dC13cmFwcGluZyBpbiB0aGUgZWRpdG9yIGZyYW1lLiBEZWZhdWx0IGlzCiAgICAgIDxjb2RlPnRydWU8L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+bGluZU51bWJlcnM8L2NvZGU+PC9kdD48ZGQ+U2hvdyBsaW5lIG51bWJlcnMgdG8gdGhlCiAgICAgIGxlZnQgb2YgdGhlIGVkaXRvci4gVGhpcyByZXF1aXJlcyB5b3UgdG8gc3BlY2lmeSBhIHN0eWxlIGZvciB0aGUKICAgICAgPGNvZGU+Q29kZU1pcnJvci1saW5lLW51bWJlcnM8L2NvZGU+IENTUyBjbGFzcyAoaW4gdGhlIG91dGVyCiAgICAgIGRvY3VtZW50KSB0byBjb25maWd1cmUgdGhlIHdpZHRoLCBmb250LCBjb2xvcnMsIGV0Y2V0ZXJhIGZvciB0aGUKICAgICAgbGluZS1udW1iZXIgRElWLiBZb3UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCBsaW5lcyBpbiB0aGUKICAgICAgbnVtYmVyaW5nIGVsZW1lbnQgaGF2ZSB0aGUgc2FtZSBoZWlnaHQgYXMgbGluZXMgaW4gdGhlIGVkaXRvci4KICAgICAgVGhpcyBpcyBtb3N0IGVhc2lseSBkb25lIGJ5IGdpdmluZyB0aGVtIGJvdGggdGhlIHNhbWUgZm9udCBhbmQKICAgICAgYW4gYWJzb2x1dGUgKCdwdCcgb3IgJ3B4JykgZm9udCBzaXplLiBUaGlzIG9wdGlvbiBkZWZhdWx0cyB0bwogICAgICA8Y29kZT5mYWxzZTwvY29kZT4uIFdoZW4gZW5hYmxpbmcgdGhpcywgeW91IGhhdmUgdG8gZGlzYWJsZQogICAgICA8Y29kZT50ZXh0V3JhcHBpbmc8L2NvZGU+LCBzaW5jZSB0aGUgbGluZSBudW1iZXJzIGRvbid0IHRha2UKICAgICAgd3JhcHBlZCBsaW5lcyBpbnRvIGFjY291bnQuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5pbmRlbnRVbml0PC9jb2RlPjwvZHQ+PGRkPkFuIGludGVnZXIgdGhhdCBzcGVjaWZpZXMKICAgICAgdGhlIGFtb3VudCBvZiBzcGFjZXMgb25lICdsZXZlbCcgb2YgaW5kZW50YXRpb24gc2hvdWxkIGFkZC4KICAgICAgRGVmYXVsdCBpcyA8Y29kZT4yPC9jb2RlPi48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnRhYk1vZGU8L2NvZGU+PC9kdD48ZGQ+RGV0ZXJtaW5lcyB3aGF0IHRoZSBlZmZlY3Qgb2YKICAgICAgcHJlc3NpbmcgdGFiIGlzLiBQb3NzaWJpbGl0aWVzIGFyZToKICAgICAgPGRsPgogICAgICAgIDxkdD48Y29kZT4iaW5kZW50IjwvY29kZT48L2R0PjxkZD5UaGUgZGVmYXVsdC4gQ2F1c2VzIHRhYiB0bwogICAgICAgIGFkanVzdCB0aGUgaW5kZW50YXRpb24gb2YgdGhlIHNlbGVjdGlvbiBvciBjdXJyZW50IGxpbmUgdXNpbmcKICAgICAgICB0aGUgcGFyc2VyJ3MgcnVsZXMuPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+InNwYWNlcyI8L2NvZGU+PC9kdD48ZGQ+UHJlc3NpbmcgdGFiIHNpbXBseSBpbnNlcnRzCiAgICAgICAgZm91ciBzcGFjZXMuPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+ImRlZmF1bHQiPC9jb2RlPjwvZHQ+PGRkPkNvZGVNaXJyb3IgZG9lcyBub3QKICAgICAgICBpbnRlcmZlcmUgd2l0aCB0aGUgdGFiIGtleSwgYnV0IGxlYXZlcyBpdCB0byB0aGUgYnJvd3NlciB0bwogICAgICAgIGhhbmRsZSBpdC4gQmluZHMgc2hpZnQtc3BhY2UgdG8gcmVndWxhciBpbmRlbnRhdGlvbgogICAgICAgIGJlaGF2aW91ci48L2RkPgogICAgICAgIDxkdD48Y29kZT4ic2hpZnQiPC9jb2RlPjwvZHQ+PGRkPlByZXNzaW5nIHRhYiBpbmRlbnRzIHRoZQogICAgICAgIGN1cnJlbnQgbGluZSAob3Igc2VsZWN0aW9uKSBvbmUgPGNvZGU+aW5kZW50VW5pdDwvY29kZT4KICAgICAgICBkZWVwZXIsIHByZXNzaW5nIHNoaWZ0LXRhYiBvciBjdHJsLXRhYiAod2hpY2hldmVyIHlvdXIgYnJvd3NlcgogICAgICAgIGRvZXMgbm90IGludGVyZmVyZSB3aXRoKSwgdW4taW5kZW50cyBpdC48L2RkPgogICAgICA8L2RsPjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+cmVpbmRlbnRPbkxvYWQ8L2NvZGU+PC9kdD48ZGQ+V2hlbiA8Y29kZT50cnVlPC9jb2RlPiwKICAgICAgdGhpcyBjYXVzZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGVkaXRvciB0byBiZSByZWluZGVudGVkCiAgICAgIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGVkaXRvciBsb2Fkcy4gRGVmYXVsdHMgdG8KICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+cmVhZE9ubHk8L2NvZGU+PC9kdD48ZGQ+V2hlbiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sCiAgICAgIHRoZSBkb2N1bWVudCBpcyBub3QgZWRpdGFibGUuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5pbml0Q2FsbGJhY2s8L2NvZGU+PC9kdD48ZGQ+SWYgc2V0IHRvIGEgZnVuY3Rpb24sIHRoaXMKICAgICAgd2lsbCBiZSBjYWxsZWQgKHdpdGggdGhlIGVkaXRvciBvYmplY3QgYXMgaXRzIGFyZ3VtZW50KSBhZnRlcgogICAgICB0aGUgZWRpdG9yIGhhcyBmaW5pc2hlZCBpbml0aWFsaXNpbmcuPC9kZD4KICAgICAgCiAgICAgIDxkdD48Y29kZT5jdXJzb3JBY3Rpdml0eTwvY29kZT48L2R0PjxkZD5BIGZ1bmN0aW9uIHRoYXQgaXMKICAgICAgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIGN1cnNvciBtb3Zlcywgd2l0aCB0aGUgdG9wLWxldmVsIG5vZGUgdGhhdAogICAgICB0aGUgY3Vyc29yIGlzIGluc2lkZSBvciBuZXh0IHRvIGFzIGFuIGFyZ3VtZW50LiBDYW4gYmUgdXNlZCB0bwogICAgICBoYXZlIHNvbWUgY29udHJvbHMgcmVhY3QgdG8gdGhlIGNvbnRleHQgb2YgdGhlIGN1cnNvci48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmFjdGl2ZVRva2VuczwvY29kZT48L2R0PjxkZD5DYW4gYmUgc2V0IHRvIGEgZnVuY3Rpb24KICAgICAgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIDxjb2RlPihzcGFuTm9kZSwgdG9rZW5PYmplY3QsCiAgICAgIGVkaXRvcik8L2NvZGU+IGFyZ3VtZW50cyB3aGVuZXZlciBhIG5ldyB0b2tlbiBub2RlIGlzIGJlaW5nCiAgICAgIGFkZGVkIHRvIHRoZSBkb2N1bWVudC4gQ2FuIGJlIHVzZWQgdG8gZG8gdGhpbmdzIGxpa2UgYWRkIGV2ZW50CiAgICAgIGhhbmRsZXJzIHRvIG5vZGVzLiBTaG91bGQgPGVtPm5vdDwvZW0+IGNoYW5nZSB0aGUgRE9NIHN0cnVjdHVyZQogICAgICBvZiB0aGUgbm9kZSAoc28gbm8gdHVybmluZyB0aGUgc3BhbiBpbnRvIGEgbGluayksIHNpbmNlIHRoaXMKICAgICAgd2lsbCBncmVhdGx5IGNvbmZ1c2UgdGhlIGVkaXRvci48L2RkPgoKICAgICAgPGR0IGlkPSJwYXJzZXJDb25maWciPjxjb2RlPnBhcnNlckNvbmZpZzwvY29kZT48L2R0PjxkZD5BbgogICAgICBvYmplY3QgdmFsdWUgdGhhdCBpcyBwYXNzZWQgYWxvbmcgdG8gdGhlIHBhcnNlciB0byBjb25maWd1cmUgaXQuCiAgICAgIFdoYXQgdGhpcyBvYmplY3Qgc2hvdWxkIGxvb2sgbGlrZSBkZXBlbmRzIG9uIHRoZSBwYXJzZXIKICAgICAgdXNlZC48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmNvbnRlbnQ8L2NvZGU+PC9kdD48ZGQ+VGhlIHN0YXJ0aW5nIGNvbnRlbnQgb2YgdGhlCiAgICAgIGVkaXRvci4gWW91J2xsIHByb2JhYmx5IG5vdCB3YW50IHRvIHByb3ZpZGUgYSBnbG9iYWwgZGVmYXVsdCBmb3IKICAgICAgdGhpcywgYnV0IGFkZCBpdCB0byB0aGUgPGNvZGU+b3B0aW9uczwvY29kZT4gb2JqZWN0IHBhc3NlZCB0bwogICAgICBpbmRpdmlkdWFsIGVkaXRvcnMgYXMgdGhleSBhcmUgY3JlYXRlZC48L2RkPgoKICAgIDwvZGw+CgogICAgPGgyIGlkPSJwYXJzZXJzIj5QYXJzZXJzPC9oMj4KCiAgICA8cD4oSWYgeW91IHdhbnQgdG8gdXNlIGEgQ29kZU1pcnJvciBwYXJzZXIgdG8gaGlnaGxpZ2h0IGEgcGllY2Ugb2YKICAgIHRleHQsIHdpdGhvdXQgY3JlYXRpbmcgYW4gZWRpdG9yLCBzZWUgPGEKICAgIGhyZWY9ImhpZ2hsaWdodC5odG1sIj50aGlzIGV4YW1wbGU8L2E+LCBhbmQgdGhlIDxjb2RlPjxhCiAgICBocmVmPSJqcy9oaWdobGlnaHQuanMiPmhpZ2hsaWdodC5qczwvYT48L2NvZGU+IHNjcmlwdC4pPC9wPgoKICAgIDxwPlRoZSBmb2xsb3dpbmcgcGFyc2VycyBjb21lIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiBvZiBDb2RlTWlycm9yOjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT48YSBocmVmPSJqcy9wYXJzZXhtbC5qcyI+cGFyc2V4bWwuanM8L2E+PC9jb2RlPiAoPGEKICAgICAgaHJlZj0iaHRtbHRlc3QuaHRtbCI+ZGVtbzwvYT4pPC9kdD48ZGQ+QSBIVE1ML1hNTCBwYXJzZXIuIFRha2VzCiAgICAgIGEgPGNvZGU+dXNlSFRNTEtsdWRnZXM8L2NvZGU+IGNvbmZpZ3VyYXRpb24gb3B0aW9uIChzZWUgdGhlCiAgICAgIDxjb2RlPjxhIGhyZWY9IiNwYXJzZXJDb25maWciPnBhcnNlckNvbmZpZzwvYT48L2NvZGU+IG9wdGlvbgogICAgICBhYm92ZSksIHdoaWNoIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjb250ZW50IG9mIHRoZSBlZGl0b3IgaXMKICAgICAgSFRNTCBvciBYTUwsIGFuZCB0aGluZ3MgbGlrZSBzZWxmLWNsb3NpbmcgdGFncyAoPGNvZGU+YnI8L2NvZGU+LAogICAgICA8Y29kZT5pbWc8L2NvZGU+KSBleGlzdC4gVGhpcyBkZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPi4KICAgICAgRXhhbXBsZSBjb2xvdXJzIGZvciB0aGUgc3R5bGVzIHRoYXQgdGhpcyBwYXJzZXIgdXNlcyBhcmUgZGVmaW5lZAogICAgICBpbiA8Y29kZT48YQogICAgICBocmVmPSJjc3MveG1sY29sb3JzLmNzcyI+Y3NzL3htbGNvbG9ycy5jc3M8L2E+PC9jb2RlPi48L2RkPgoKICAgICAgPGR0Pjxjb2RlPjxhCiAgICAgIGhyZWY9ImpzL3Rva2VuaXplamF2YXNjcmlwdC5qcyI+dG9rZW5pemVqYXZhc2NyaXB0LmpzPC9hPjwvY29kZT4sCiAgICAgIDxjb2RlPjxhCiAgICAgIGhyZWY9ImpzL3BhcnNlamF2YXNjcmlwdC5qcyI+cGFyc2VlamF2YXNjcmlwdC5qczwvYT48L2NvZGU+ICg8YQogICAgICBocmVmPSJqc3Rlc3QuaHRtbCI+ZGVtbzwvYT4pPC9kdD48ZGQ+VGhlIEphdmFTY3JpcHQgcGFyc2VyLgogICAgICBFeGFtcGxlIGNvbG91cnMgaW4gPGNvZGU+PGEKICAgICAgaHJlZj0iY3NzL2pzY29sb3JzLmNzcyI+Y3NzL2pzY29sb3JzLmNzczwvYT48L2NvZGU+PC9kZD4KCiAgICAgIDxkdD48Y29kZT48YSBocmVmPSJqcy9wYXJzZWNzcy5qcyI+cGFyc2Vjc3MuanM8L2E+PC9jb2RlPiAoPGEKICAgICAgaHJlZj0iY3NzdGVzdC5odG1sIj5kZW1vPC9hPik8L2R0PjxkZD5BIENTUyBwYXJzZXIuIFN0eWxlcyBpbgogICAgICA8Y29kZT48YQogICAgICBocmVmPSJjc3MvY3NzY29sb3JzLmNzcyI+Y3NzL2Nzc2NvbG9ycy5jc3M8L2E+PC9jb2RlPjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+PGEKICAgICAgaHJlZj0ianMvcGFyc2VodG1sbWl4ZWQuanMiPnBhcnNlaHRtbG1peGVkLmpzPC9hPjwvY29kZT4gKDxhCiAgICAgIGhyZWY9Im1peGVkdGVzdC5odG1sIj5kZW1vPC9hPik8L2R0PjxkZD5BIG1peGVkLW1vZGUgSFRNTAogICAgICBwYXJzZXIuIFJlcXVpcmVzIHRoZSBYTUwsIEphdmFTY3JpcHQsIGFuZCBDU1MgcGFyc2VycyB0byBhbHNvIGJlCiAgICAgIGxvYWRlZCwgc28geW91ciA8Y29kZT5wYXJzZXJmaWxlPC9jb2RlPiBvcHRpb24gbG9va3Mgc29tZXRoaW5nCiAgICAgIGxpa2UgPGNvZGU+WyJwYXJzZXhtbC5qcyIsICJwYXJzZWNzcy5qcyIsCiAgICAgICJ0b2tlbml6ZWphdmFzY3JpcHQuanMiLCAicGFyc2VqYXZhc2NyaXB0LmpzIiwKICAgICAgInBhcnNlaHRtbG1peGVkLmpzIl08L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+PGEgaHJlZj0ianMvcGFyc2VzcGFycWwuanMiPnBhcnNlc3BhcnFsLmpzPC9hPjwvY29kZT4KICAgICAgKDxhIGhyZWY9InNwYXJxbHRlc3QuaHRtbCI+ZGVtbzwvYT4pPC9kdD48ZGQ+UGFyc2VzIHRoZSA8YQogICAgICBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NQQVJRTCI+U1BBUlFMPC9hPiBxdWVyeQogICAgICBsYW5ndWFnZS4gRXhhbXBsZSBzdHlsZXMgaW4gPGNvZGU+PGEKICAgICAgaHJlZj0iY3NzL3NwYXJxbGNvbG9ycy5jc3MiPmNzcy9zcGFycWxjb2xvcnMuY3NzPC9hPjwvY29kZT48L2RkPgoKICAgICAgPGR0Pjxjb2RlPjxhCiAgICAgIGhyZWY9ImpzL3BhcnNlZHVtbXkuanMiPnBhcnNlZHVtbXkuanM8L2E+PC9jb2RlPjwvZHQ+PGRkPkEKICAgICAgJ2R1bW15JyBwYXJzZXIgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBlZGl0IHBsYWluIHRleHQsIG9yCiAgICAgIGRvY3VtZW50cyBmb3Igd2hpY2ggbm8gc3VpdGFibGUgcGFyc2VyIGV4aXN0cy48L2RkPgoKICAgICAgPGR0Pjxjb2RlPjxhCiAgICAgIGhyZWY9ImNvbnRyaWIvcGhwL2pzL3BhcnNlcGhwLmpzIj5jb250cmliL3BocC9qcy9wYXJzZXBocC5qczwvYT48L2NvZGU+CiAgICAgICg8YSBocmVmPSJjb250cmliL3BocC9pbmRleC5odG1sIj5kZW1vPC9hPik8L2R0PjxkZD5QSFAKICAgICAgcGFyc2VyLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+PGEKICAgICAgaHJlZj0iY29udHJpYi9weXRob24vanMvcGFyc2VweXRob24uanMiPmNvbnRyaWIvcHl0aG9uL2pzL3BhcnNlcHl0aG9uLmpzPC9hPjwvY29kZT4KICAgICAgKDxhIGhyZWY9ImNvbnRyaWIvcHl0aG9uL2luZGV4Lmh0bWwiPmRlbW88L2E+KTwvZHQ+PGRkPlB5dGhvbgogICAgICBwYXJzZXIuPC9kZD4KCiAgICAgIDxkdD48Y29kZT48YSBocmVmPSJjb250cmliL2x1YS9qcy9wYXJzZWx1YS5qcyI+Y29udHJpYi9sdWEvanMvcGFyc2VsdWEuanM8L2E+PC9jb2RlPgogICAgICAoPGEgaHJlZj0iY29udHJpYi9sdWEvaW5kZXguaHRtbCI+ZGVtbzwvYT4pPC9kdD48ZGQ+THVhCiAgICAgIHBhcnNlci48L2RkPgoKICAgIDwvZGw+CgogICAgPGgyIGlkPSJwcm9ncmFtbWluZyI+UHJvZ3JhbW1pbmcgSW50ZXJmYWNlPC9oMj4KCiAgICA8cD5UbyBiZSBhcyBmbGV4aWJsZSBhcyBwb3NzaWJsZSwgQ29kZU1pcnJvciBpbXBsZW1lbnRzIGEgdmVyeQogICAgcGxhaW4gZWRpdGFibGUgZmllbGQsIHdpdGhvdXQgYW55IGFjY29tcGFueWluZyBidXR0b25zLCBiZWxscywgYW5kCiAgICB3aGlzdGxlcy4gPGNvZGU+Q29kZU1pcnJvcjwvY29kZT4gb2JqZWN0cyBkbywgaG93ZXZlciwgcHJvdmlkZSBhCiAgICBudW1iZXIgb2YgbWV0aG9kcyB0aGF0IG1ha2UgaXQgcG9zc2libGUgdG8gYWRkIGV4dHJhIGZ1bmN0aW9uYWxpdHkKICAgIGFyb3VuZCB0aGUgZWRpdG9yLiA8YQogICAgaHJlZj0ianMvbWlycm9yZnJhbWUuanMiPjxjb2RlPm1pcnJvcmZyYW1lLmpzPC9jb2RlPjwvYT4gcHJvdmlkZXMgYQogICAgYmFzaWMgZXhhbXBsZSBvZiB0aGVpciB1c2FnZS48L3A+CgogICAgPGRsPgoKICAgICAgPGR0Pjxjb2RlPmdldENvZGUoKTwvY29kZT4gJiM4NTk0OwogICAgICA8Y29kZT5zdHJpbmc8L2NvZGU+PC9kdD48ZGQ+UmV0dXJucyB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZQogICAgICBlZGl0b3IsIGFzIGEgc3RyaW5nLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+c2V0Q29kZShzdHJpbmcpPC9jb2RlPjwvZHQ+PGRkPlJlcGxhY2VzIHRoZSBjdXJyZW50CiAgICAgIGNvbnRlbnQgb2YgdGhlIGVkaXRvciB3aXRoIHRoZSBnaXZlbiB2YWx1ZS48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmZvY3VzKCk8L2NvZGU+PC9kdD48ZGQ+R2l2ZXMgZm9jdXMgdG8gdGhlIGVkaXRvcgogICAgICBmcmFtZS48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmN1cnJlbnRMaW5lKCk8L2NvZGU+ICYjODU5NDsKICAgICAgPGNvZGU+bnVtYmVyPC9jb2RlPjwvZHQ+PGRkPlJldHVybnMgdGhlIGxpbmUgb24gd2hpY2ggdGhlIGN1cnNvcgogICAgICBpcyBjdXJyZW50bHkgc2l0dGluZy4gPHNwYW4gY2xhc3M9Indhcm4iPihEZXByZWNhdGVkLCBzZWUgdGhlCiAgICAgIGxpbmUtYmFzZWQgaW50ZXJmYWNlIGJlbG93KTwvc3Bhbj48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmp1bXBUb0xpbmUobnVtYmVyKTwvY29kZT48L2R0PjxkZD5Nb3ZlcyB0aGUgY3Vyc29yIHRvCiAgICAgIHRoZSBzdGFydCBvZiB0aGUgZ2l2ZW4gbGluZS4gPHNwYW4KICAgICAgY2xhc3M9Indhcm4iPihEZXByZWNhdGVkKTwvc3Bhbj48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnNlbGVjdGlvbigpPC9jb2RlPiAmIzg1OTQ7CiAgICAgIDxjb2RlPnN0cmluZzwvY29kZT48L2R0PjxkZD5SZXR1cm5zIHRoZSB0ZXh0IHRoYXQgaXMgY3VycmVudGx5CiAgICAgIHNlbGVjdGVkIGluIHRoZSBlZGl0b3IuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5yZXBsYWNlU2VsZWN0aW9uKHN0cmluZyk8L2NvZGU+PC9kdD48ZGQ+UmVwbGFjZXMgdGhlCiAgICAgIGN1cnJlbnRseSBzZWxlY3RlZCB0ZXh0IHdpdGggdGhlIGdpdmVuIHN0cmluZy4gV2lsbCBhbHNvIGNhdXNlCiAgICAgIHRoZSBlZGl0b3IgZnJhbWUgdG8gZ2FpbiBmb2N1cy48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnJlaW5kZW50KCk8L2NvZGU+PC9kdD48ZGQ+QXV0b21hdGljYWxseSByZS1pbmRlbnQgdGhlCiAgICAgIHdob2xlIGRvY3VtZW50LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+cmVpbmRlbnRTZWxlY3Rpb24oKTwvY29kZT48L2R0PjxkZD5BdXRvbWF0aWNhbGx5CiAgICAgIHJlLWluZGVudCB0aGUgc2VsZWN0ZWQgbGluZXMuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5nZXRTZWFyY2hDdXJzb3Ioc3RyaW5nLCBhdEN1cnNvcik8L2NvZGU+ICYjODU5NDsKICAgICAgPGNvZGU+Y3Vyc29yPC9jb2RlPjwvZHQ+PGRkPlRoZSBmaXJzdCBhcmd1bWVudCBpbmRpY2F0ZXMgdGhlCiAgICAgIHN0cmluZyB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBmb3IsIGFuZCB0aGUgc2Vjb25kIGluZGljYXRlcwogICAgICB3aGV0aGVyIHNlYXJjaGluZyBzaG91bGQgc3RhcnQgYXQgdGhlIGN1cnNvciAoPGNvZGU+dHJ1ZTwvY29kZT4pCiAgICAgIG9yIGF0IHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQgKDxjb2RlPmZhbHNlPC9jb2RlPikuIFJldHVybnMgYW4KICAgICAgb2JqZWN0IHRoYXQgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBzZWFyY2hpbmcuIENhbGwgaXRzCiAgICAgIDxjb2RlPmZpbmROZXh0KCk8L2NvZGU+IG1ldGhvZCB0byBzZWFyY2ggZm9yIGFuIG9jY3VycmVuY2Ugb2YKICAgICAgdGhlIGdpdmVuIHN0cmluZy4gVGhpcyByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHNvbWV0aGluZyBpcwogICAgICBmb3VuZCwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBlbmQgb2YgZG9jdW1lbnQgaXMgcmVhY2hlZC4KICAgICAgV2hlbiBhbiBvY2N1cnJlbmNlIGhhcyBiZWVuIGZvdW5kLCB5b3UgY2FuIGNhbGwKICAgICAgPGNvZGU+c2VsZWN0KCk8L2NvZGU+IHRvIHNlbGVjdCBpdCwgb3IKICAgICAgPGNvZGU+cmVwbGFjZShzdHJpbmcpPC9jb2RlPiB0byByZXBsYWNlIGl0IHdpdGggYSBnaXZlbiBzdHJpbmcuCiAgICAgIE5vdGUgdGhhdCBsZXR0aW5nIHRoZSB1c2VyIGNoYW5nZSB0aGUgZG9jdW1lbnQsIG9yCiAgICAgIHByb2dyYW1tYXRpY2FsbHkgY2hhbmdpbmcgaXQgaW4gYW55IHdheSBleGNlcHQgZm9yIGNhbGxpbmcKICAgICAgPGNvZGU+cmVwbGFjZTwvY29kZT4gb24gdGhlIGN1cnNvciBpdHNlbGYsIG1pZ2h0IGNhdXNlIGEgY3Vyc29yCiAgICAgIG9iamVjdCB0byBza2lwIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQuPC9kZD4KCiAgICAgIDxkdD48Y29kZT51bmRvKCk8L2NvZGU+PC9kdD48ZGQ+VW5kbyBvbmUgY2hhbmdlc2V0LCBpZiBhdmFpbGFibGUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPnJlZG8oKTwvY29kZT48L2R0PjxkZD5SZWRvIG9uZSBjaGFuZ2VzZXQsIGlmIGF2YWlsYWJsZS48L2RkPgogICAgICA8ZHQ+PGNvZGU+aGlzdG9yeVNpemUoKSAmIzg1OTQ7IG9iamVjdDwvY29kZT48L2R0PjxkZD5HZXQgYQogICAgICA8Y29kZT57dW5kbywgcmVkb308L2NvZGU+IG9iamVjdCBob2xkaW5nIHRoZSBzaXplcyBvZiB0aGUgdW5kbwogICAgICBhbmQgcmVkbyBoaXN0b3JpZXMuPC9kZD4KICAgICAgPGR0Pjxjb2RlPmNsZWFySGlzdG9yeSgpPC9jb2RlPjwvZHQ+PGRkPkRyb3AgYWxsIGhpc3RvcnkKICAgICAgaW5mb3JtYXRpb24uPC9kZD4KCiAgICAgIDxkdD48Y29kZT5ncmFiS2V5cyhjYWxsYmFjaywgZmlsdGVyKTwvY29kZT48L2R0PjxkZD5Sb3V0ZQogICAgICBrZXlib2FyZCBpbnB1dCBpbiB0aGUgZWRpdG9yIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24uIFRoaXMKICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gYSBzbGlnaHRseSBub3JtYWxpc2VkIChzZWUKICAgICAgPGNvZGU+bm9ybWFsaXplRXZlbnQ8L2NvZGU+IGluIDxhCiAgICAgIGhyZWY9ImpzL3V0aWwuanMiPjxjb2RlPnV0aWwuanM8L2NvZGU+PC9hPikgPGNvZGU+a2V5ZG93bjwvY29kZT4KICAgICAgZXZlbnQgb2JqZWN0LiBJZiBhIHNlY29uZCBhcmd1bWVudCBpcyBnaXZlbiwgdGhpcyB3aWxsIGJlIHVzZWQKICAgICAgdG8gZGV0ZXJtaW5lIHdoaWNoIGV2ZW50cyB0byBhcHBseSB0aGUgY2FsbGJhY2sgdG8uIEl0IHNob3VsZAogICAgICB0YWtlIGEga2V5IGNvZGUgKGFzIGluIDxjb2RlPmV2ZW50LmtleUNvZGU8L2NvZGU+KSwgYW5kIHJldHVybiBhCiAgICAgIGJvb2xlYW4sIHdoZXJlIDxjb2RlPnRydWU8L2NvZGU+IG1lYW5zIHRoZSBldmVudCBzaG91bGQgYmUKICAgICAgcm91dGVkIHRvIHRoZSBjYWxsYmFjaywgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBsZWF2ZXMgdGhlIGtleSB0bwogICAgICBwZXJmb3JtIGl0cyBub3JtYWwgYmVoYXZpb3VyLjwvZGQ+CiAgICAgIDxkdD48Y29kZT51bmdyYWJLZXlzKCk8L2NvZGU+PC9kdD48ZGQ+UmV2ZXJ0IHRoZSBlZmZlY3Qgb2YKICAgICAgPGNvZGU+Z3JhYktleXM8L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+c2V0UGFyc2VyKG5hbWUpPC9jb2RlPjwvZHQ+PGRkPkNoYW5nZSB0aGUgYWN0aXZlCiAgICAgIHBhcnNlci4gVG8gdXNlIHRoaXMgeW91J2xsIGhhdmUgdG8gbG9hZCBtb3JlIHRoYW4gb25lIHBhcnNlcgogICAgICAocHV0IHRoZSBvbmUgeW91IHdhbnQgdG8gdXNlIGFzIGRlZmF1bHQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCkuCiAgICAgIFRoZW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUKICAgICAgcGFyc2VyIHlvdSB3YW50IHRvIHN3aXRjaCB0byAoc2VlIHRoZSBwYXJzZXIgc2NyaXB0IGZpbGUgdG8gZmluZAogICAgICB0aGUgbmFtZSwgaXQnbGwgYmUgc29tZXRoaW5nIGxpa2UgPGNvZGU+Q1NTUGFyc2VyPC9jb2RlPikuPC9kZD4KICAgIDwvZGw+CgogICAgPHA+Rm9yIGRldGFpbGVkIGludGVyYWN0aW9uIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIGVkaXRvciwKICAgIENvZGVNaXJyb3IgZXhwb3NlcyBhIGxpbmUtb3JpZW50ZWQgaW50ZXJmYWNlLCB3aGljaCBhbGxvd3MgeW91IHRvCiAgICBpbnNwZWN0IGFuZCBtYW5pcHVsYXRlIHRoZSBkb2N1bWVudCBsaW5lIGJ5IGxpbmUuIExpbmUgaGFuZGxlcwogICAgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3BhcXVlICh0aGV5IGFyZSBpbiBmYWN0IHRoZSA8Y29kZT5CUjwvY29kZT4KICAgIG5vZGVzIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSksIGV4Y2VwdCB0aGF0IHRoZSB2YWx1ZQogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IChidXQgPGVtPm5vdDwvZW0+IDxjb2RlPm51bGw8L2NvZGU+KSBhbHdheXMKICAgIGRlbm90ZXMgYW4gaW52YWxpZCB2YWx1ZS4gU2luY2UgY2hhbmdpbmcgdGhlIGRvY3VtZW50IG1pZ2h0IGNhdXNlCiAgICBzb21lIGxpbmUgaGFuZGxlcyB0byBiZWNvbWUgaW52YWxpZCwgZXZlcnkgZnVuY3Rpb24gdGhhdCB0YWtlcwogICAgdGhlbSBhcyBhcmd1bWVudCBjYW4gdGhyb3cKICAgIDxjb2RlPkNvZGVNaXJyb3IuSW52YWxpZExpbmVIYW5kbGU8L2NvZGU+LiBUaGVzZSBhcmUgdGhlIHJlbGV2YW50CiAgICBtZXRob2RzOjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT5jdXJzb3JQb3NpdGlvbihzdGFydCk8L2NvZGU+ICYjODU5NDsKICAgICAgPGNvZGU+b2JqZWN0PC9jb2RlPjwvZHQ+PGRkPlJldHJpZXZlIGEgPGNvZGU+e2xpbmUsCiAgICAgIGNoYXJhY3Rlcn08L2NvZGU+IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnNvciBwb3NpdGlvbi4KICAgICAgPGNvZGU+c3RhcnQ8L2NvZGU+IGRlZmF1bHRzIHRvIDxjb2RlPnRydWU8L2NvZGU+IGFuZCBkZXRlcm1pbmVzCiAgICAgIGlmIHRoZSBzdGFydHBvaW50IG9yIHRoZSBlbmRwb2ludCBvZiB0aGUgc2VsZWN0aW9uIGlzIHVzZWQuPC9kZD4KICAgICAgPGR0Pjxjb2RlPmZpcnN0TGluZSgpPC9jb2RlPiAmIzg1OTQ7CiAgICAgIDxjb2RlPmhhbmRsZTwvY29kZT48L2R0PjxkZD5HZXQgdGhlIGZpcnN0IGxpbmUgb2YgdGhlCiAgICAgIGRvY3VtZW50LjwvZGQ+CiAgICAgIDxkdD48Y29kZT5sYXN0TGluZSgpPC9jb2RlPiAmIzg1OTQ7CiAgICAgIDxjb2RlPmhhbmRsZTwvY29kZT48L2R0PjxkZD5UaGUgbGFzdCBsaW5lLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5uZXh0TGluZShoYW5kbGUpPC9jb2RlPiAmIzg1OTQ7CiAgICAgIDxjb2RlPmhhbmRsZTwvY29kZT48L2R0PjxkZD5HZXQgdGhlIGxpbmUgYWZ0ZXIgdGhlIGdpdmVuIG9uZSwgb3IKICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoYXQgd2FzIHRoZSBsYXN0IGxpbmUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPnByZXZMaW5lKGhhbmRsZSk8L2NvZGU+ICYjODU5NDsKICAgICAgPGNvZGU+aGFuZGxlPC9jb2RlPjwvZHQ+PGRkPkZpbmQgdGhlIGxpbmUgYmVmb3JlIHRoZSBnaXZlbiBvbmUsCiAgICAgIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhhdCB3YXMgdGhlIGZpcnN0IGxpbmUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPm50aExpbmUobnVtYmVyKTwvY29kZT4gJiM4NTk0OwogICAgICA8Y29kZT5oYW5kbGU8L2NvZGU+PC9kdD48ZGQ+RmluZCB0aGUgTnRoIGxpbmUgb2YgdGhlIGRvY3VtZW50LgogICAgICBOb3RlIHRoYXQgdGhlIGZpcnN0IGxpbmUgY291bnRzIGFzIG9uZSwgbm90IHplcm8uIFJldHVybnMKICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHN1Y2ggbGluZS48L2RkPgogICAgICA8ZHQ+PGNvZGU+bGluZUNvbnRlbnQoaGFuZGxlKTwvY29kZT4gJiM4NTk0OwogICAgICA8Y29kZT5zdHJpbmc8L2NvZGU+PC9kdD48ZGQ+UmV0cmlldmUgdGhlIGNvbnRlbnQgb2YgdGhlCiAgICAgIGxpbmUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPnNldExpbmVDb250ZW50KGhhbmRsZSwgc3RyaW5nKTwvY29kZT48L2R0PjxkZD5SZXBsYWNlCiAgICAgIHRoZSBjb250ZW50IG9mIHRoZSBsaW5lIHdpdGggdGhlIGdpdmVuIHN0cmluZy48L2RkPgogICAgICA8ZHQ+PGNvZGU+bGluZU51bWJlcihoYW5kbGUpPC9jb2RlPiAmIzg1OTQ7CiAgICAgIDxjb2RlPm51bWJlcjwvY29kZT48L2R0PjxkZD5Bc2sgd2hpY2ggbGluZSBvZiB0aGUgZG9jdW1lbnQKICAgICAgKDEtYmFzZWQpIHRoZSBnaXZlbiBsaW5lIGlzLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5zZWxlY3RMaW5lcyhzdGFydEhhbmRsZSwgc3RhcnRPZmZzZXQsCiAgICAgIGVuZEhhbmRsZSwgZW5kT2Zmc2V0KTwvY29kZT48L2R0PjxkZD5Nb3ZlIHRoZSBzZWxlY3Rpb24gdG8gYQogICAgICBzcGVjaWZpYyBwb2ludC4gPGNvZGU+ZW5kSGFuZGxlPC9jb2RlPiBhbmQKICAgICAgPGNvZGU+ZW5kT2Zmc2V0PC9jb2RlPiBjYW4gYmUgb21pdHRlZCB0byBqdXN0IHBsYWNlIHRoZSBjdXJzb3IKICAgICAgc29tZXdoZXJlIHdpdGhvdXQgc2VsZWN0aW5nIGFueSB0ZXh0LjwvZGQ+CiAgICAgIDxkdD48Y29kZT5pbnNlcnRJbnRvTGluZShoYW5kbGUsIHBvc2l0aW9uLAogICAgICB0ZXh0KTwvY29kZT48L2R0PjxkZD5JbnNlcnQgYSBwaWVjZSBvZiB0ZXh0IGludG8gYSBsaW5lLgogICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT4gY2FuIGJlIGFuIGludGVnZXIsIHNwZWNpZnlpbmcgdGhlIHBvc2l0aW9uCiAgICAgIGluIHRoZSBsaW5lIHdoZXJlIHRoZSB0ZXh0IHNob3VsZCBiZSBpbnNlcnRlZCwgb3IgdGhlIHN0cmluZwogICAgICA8Y29kZT4iZW5kIjwvY29kZT4sIGZvciB0aGUgZW5kIG9mIHRoZSBsaW5lLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxoMiBpZD0id3JpdGVwYXJzZXIiPldyaXRpbmcgYSBQYXJzZXI8L2gyPgoKICAgIDxwPkEgcGFyc2VyIGlzIGltcGxlbWVudGVkIGJ5IG9uZSBvciBtb3JlIGZpbGVzIChzZWUKICAgIDxjb2RlPnBhcnNlcmZpbGU8L2NvZGU+IGFib3ZlKSB3aGljaCwgd2hlbiBsb2FkZWQsIGFkZCBhCiAgICA8Y29kZT5QYXJzZXI8L2NvZGU+IG9iamVjdCB0byB0aGUgPGNvZGU+RWRpdG9yPC9jb2RlPiBvYmplY3QKICAgIGRlZmluZWQgYnkgPGEgaHJlZj0ianMvZWRpdG9yLmpzIj48Y29kZT5lZGl0b3IuanM8L2NvZGU+PC9hPi4gVGhpcwogICAgb2JqZWN0IG11c3Qgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGludGVyZmFjZTo8L3A+CgogICAgPGRsPgoKICAgICAgPGR0Pjxjb2RlPm1ha2Uoc3RyZWFtKTwvY29kZT48L2R0PjxkZD5BIGZ1bmN0aW9uIHRoYXQsIGdpdmVuIGEKICAgICAgc3RyaW5nIHN0cmVhbSAoc2VlIDxhCiAgICAgIGhyZWY9ImpzL3N0cmluZ3N0cmVhbS5qcyI+PGNvZGU+c3RyaW5nc3RyZWFtLmpzPC9jb2RlPjwvYT4pLAogICAgICBjcmVhdGVzIGEgcGFyc2VyLiBUaGUgYmVoYXZpb3VyIG9mIHRoaXMgcGFyc2VyIGlzIGRlc2NyaWJlZAogICAgICBiZWxvdy48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmVsZWN0cmljQ2hhcnM8L2NvZGU+PC9kdD48ZGQ+QW4gb3B0aW9uYWwgc3RyaW5nCiAgICAgIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlcnMgdGhhdCwgd2hlbiB0eXBlZCwgc2hvdWxkIGNhdXNlIHRoZQogICAgICBpbmRlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBsaW5lIHRvIGJlIHJlY29tcHV0ZWQgKGZvciBleGFtcGxlCiAgICAgIDxjb2RlPiJ7fSI8L2NvZGU+IGZvciBjLWxpa2UgbGFuZ3VhZ2VzKS48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmNvbmZpZ3VyZShvYmplY3QpPC9jb2RlPjwvZHQ+PGRkPkFuIG9wdGlvbmFsIGZ1bmN0aW9uCiAgICAgIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBwYXJzZXIuIElmIGl0IGV4aXN0cywgYW5kIGFuCiAgICAgIGVkaXRvciBpcyBnaXZlbiBhIDxjb2RlPnBhcnNlckNvbmZpZzwvY29kZT4gb3B0aW9uLCBpdCB3aWxsIGJlCiAgICAgIGNhbGxlZCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGF0IG9wdGlvbi48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmZpcnN0SW5kZW50YXRpb24oY2hhcnMsIGN1cnJlbnQsCiAgICAgIGRpcmVjdGlvbik8L2NvZGU+PC9kdD48ZGQ+QW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHRvCiAgICAgIGRldGVybWluZSB0aGUgcHJvcGVyIGluZGVudGF0aW9uIG9mIHRoZSBmaXJzdCBsaW5lIG9mIGEKICAgICAgZG9jdW1lbnQuIFdoZW4gbm90IHByb3ZpZGVkLCA8Y29kZT4wPC9jb2RlPiBpcyB1c2VkLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxwPldoZW4gdGhlIDxjb2RlPm1ha2U8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhIHN0cmluZwogICAgc3RyZWFtLCBpdCBzaG91bGQgcmV0dXJuIGEgTW9jaGlLaXQtc3R5bGUgaXRlcmF0b3I6IGFuIG9iamVjdCB3aXRoCiAgICBhIDxjb2RlPm5leHQ8L2NvZGU+IG1ldGhvZCwgd2hpY2ggd2lsbCByYWlzZQogICAgPGNvZGU+U3RvcEl0ZXJhdGlvbjwvY29kZT4gd2hlbiBpdCBpcyBhdCBpdHMgZW5kIChzZWUgPGEKICAgIGhyZWY9Imh0dHA6Ly9ib2IucHl0aG9ubWFjLm9yZy9hcmNoaXZlcy8yMDA1LzA3LzA2L2l0ZXJhdGlvbi1pbi1qYXZhc2NyaXB0LyI+dGhpczwvYT4KICAgIGZvciBkZXRhaWxzKS4gVGhpcyBpdGVyYXRvciwgd2hlbiBjYWxsZWQsIHdpbGwgY29uc3VtZSBpbnB1dCBmcm9tCiAgICB0aGUgc3RyaW5nIHN0cmVhbSwgYW5kIHByb2R1Y2UgYSB0b2tlbiBvYmplY3QuPC9wPgoKICAgIDxwPlRva2VuIG9iamVjdHMgcmVwcmVzZW50IGEgc2luZ2xlIHNpZ25pZmljYW50IHBpZWNlIG9mIHRoZSB0ZXh0CiAgICB0aGF0IGlzIGJlaW5nIGVkaXRlZC4gQSB0b2tlbiBvYmplY3QgbXVzdCBoYXZlIGEKICAgIDxjb2RlPnZhbHVlPC9jb2RlPiBwcm9wZXJ0eSBob2xkaW5nIHRoZSB0ZXh0IGl0IHN0YW5kcyBmb3IsIGFuZCBhCiAgICA8Y29kZT5zdHlsZTwvY29kZT4gcHJvcGVydHkgd2l0aCB0aGUgQ1NTIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHVzZWQKICAgIHRvIGNvbG91ciB0aGlzIGVsZW1lbnQuIFRoaXMgY2FuIGJlIGFueXRoaW5nLCBleGNlcHQgdGhhdCBhbnkKICAgIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZSBzaG91bGQgPGVtPmFsd2F5czwvZW0+IGhhdmUKICAgIGNsYXNzIDxjb2RlPiJ3aGl0ZXNwYWNlIjwvY29kZT46IFRoZSBlZGl0b3IgbXVzdCBiZSBhYmxlIHRvCiAgICByZWNvZ25pemUgdGhlc2Ugd2hlbiBpdCBpbmRlbnRzIGxpbmVzLiBGdXJ0aGVybW9yZSwgZWFjaCBuZXdsaW5lCiAgICBjaGFyYWN0ZXIgPGVtPm11c3Q8L2VtPiBoYXZlIGl0cyBvd24gc2VwYXJhdGUgdG9rZW4sIHdoaWNoIGhhcyBhbgogICAgPGNvZGU+aW5kZW50YXRpb248L2NvZGU+IHByb3BlcnR5IGhvbGRpbmcgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZQogICAgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHByb3BlciBpbmRlbnRhdGlvbiBsZXZlbCBmb3IgdGhlIG5leHQgbGluZS4KICAgIFRoaXMgZnVuY3Rpb24gb3B0aW9uYWxseSB0YWtlcyB0aGUgdGV4dCBpbiB0aGUgZmlyc3QgdG9rZW4gb2YgdGhlCiAgICBuZXh0IGxpbmUsIHRoZSBjdXJyZW50IGluZGVudGF0aW9uIG9mIHRoZSBsaW5lLCBhbmQgdGhlCiAgICAnZGlyZWN0aW9uJyBvZiB0aGUgaW5kZW50YXRpb24gYXMgYXJndW1lbnRzLCB3aGljaCBpdCBjYW4gdXNlIHRvCiAgICBhZGp1c3QgdGhlIGluZGVudGF0aW9uIGxldmVsLiBUaGUgZGlyZWN0aW9uIGFyZ3VtZW50IGlzIG9ubHkKICAgIHVzZWZ1bCBmb3IgbW9kZXMgaW4gd2hpY2ggbGluZXMgZG8gbm90IGhhdmUgYSBmaXhlZCBpbmRlbnRhdGlvbiwKICAgIGFuZCBjYW4gYmUgbW9kaWZpZWQgYnkgbXVsdGlwbGUgdGFiIHByZXNzZXMuIEl0IGlzCiAgICA8Y29kZT5udWxsPC9jb2RlPiBmb3IgJ2RlZmF1bHQnIGluZGVudGF0aW9ucyAobGlrZSB3aGF0IGhhcHBlbnMKICAgIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBlbnRlciksIDxjb2RlPnRydWU8L2NvZGU+IGZvciByZWd1bGFyIHRhYgogICAgcHJlc3NlcywgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IgY29udHJvbC10YWIgb3Igc2hpZnQtdGFiLjwvcD4KCiAgICA8cD5TbyBmYXIgdGhpcyBzaG91bGQgYmUgcHJldHR5IGVhc3kuIFRoZSBoYXJkIHBhcnQgaXMgdGhhdCB0aGlzCiAgICBpdGVyYXRvciBtdXN0IGFsc28gaGF2ZSBhIDxjb2RlPmNvcHk8L2NvZGU+IG1ldGhvZC4gVGhpcyBtZXRob2QsCiAgICBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsIHJldHVybnMgYSBmdW5jdGlvbiByZXByZXNlbnRpbmcgdGhlCiAgICBjdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZXIuIFdoZW4gdGhpcyBzdGF0ZSBmdW5jdGlvbiBpcyBsYXRlcgogICAgY2FsbGVkIHdpdGggYSBzdHJpbmcgc3RyZWFtIGFzIGl0cyBhcmd1bWVudCwgaXQgcmV0dXJucyBhIHBhcnNlcgogICAgb2JqZWN0IHRoYXQgcmVzdW1lcyBwYXJzaW5nIHVzaW5nIHRoZSBvbGQgc3RhdGUgYW5kIHRoZSBuZXcgaW5wdXQKICAgIHN0cmVhbS4gSXQgbWF5IGFzc3VtZSB0aGF0IG9ubHkgb25lIHBhcnNlciBpcyBhY3RpdmUgYXQgYSB0aW1lLAogICAgYW5kIGNhbiBjbG9iYmVyIHRoZSBzdGF0ZSBvZiB0aGUgb2xkIHBhcnNlciBpZiBpdCB3YW50cy48L3A+CgogICAgPHA+Rm9yIGV4YW1wbGVzLCBzZWUgPGEKICAgIGhyZWY9ImpzL3BhcnNlamF2YXNjcmlwdC5qcyI+PGNvZGU+cGFyc2VqYXZhc2NyaXB0LmpzPC9jb2RlPjwvYT4sCiAgICA8YSBocmVmPSJqcy9wYXJzZXhtbC5qcyI+PGNvZGU+cGFyc2V4bWwuanM8L2NvZGU+PC9hPiwgYW5kIDxhCiAgICBocmVmPSJqcy9wYXJzZWNzcy5qcyI+PGNvZGU+cGFyc2Vjc3MuanM8L2NvZGU+PC9hPi48L3A+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/mixedtest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogSFRNTCBtaXhlZC1tb2RlIGRlbW9uc3RyYXRpb248L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2RvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+Cgo8cD5UaGlzIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgdGhlIEhUTUwgbWl4ZWQtbW9kZSBpbmRlbnRhdGlvbgptb2R1bGUgZm9yIDxhIGhyZWY9ImluZGV4Lmh0bWwiPkNvZGVNaXJyb3I8L2E+LiBTY3JpcHQgdGFncyB1c2UgdGhlIEpTCnBhcnNlciwgc3R5bGUgdGFncyB1c2UgdGhlIENTUyBwYXJzZXIuPC9wPgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IHBhZGRpbmc6IDNweDsiPgo8dGV4dGFyZWEgaWQ9ImNvZGUiIGNvbHM9IjEyMCIgcm93cz0iMzAiPgombHQ7aHRtbD4KICAmbHQ7aGVhZD4KICAgICZsdDt0aXRsZT5IVE1MIEV4YW1wbGUmbHQ7L3RpdGxlPgogICAgJmx0O3NjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICBmdW5jdGlvbiBmb28oYmFyLCBiYXopIHsKICAgICAgICBhbGVydCgicXV1eCIpOwogICAgICAgIHJldHVybiBiYXIgKyBiYXogKyAxOwogICAgICB9CiAgICAmbHQ7L3NjcmlwdD4KICAgICZsdDtzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIGRpdi5ib3JkZXIgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgfQogICAgICAjZm9vIGNvZGUgewogICAgICAgIGZvbnQtZmFtaWx5OiBjb3VyaWVyLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiA4MCU7CiAgICAgICAgY29sb3I6ICM0NDg4ODg7CiAgICAgIH0KICAgICZsdDsvc3R5bGU+CiAgJmx0Oy9oZWFkPgogICZsdDtib2R5PgogICAgJmx0O3A+RHVoJmx0Oy9wPgogICZsdDsvYm9keT4KJmx0Oy9odG1sPgo8L3RleHRhcmVhPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoJ2NvZGUnLCB7CiAgICBoZWlnaHQ6ICIzNTBweCIsCiAgICBwYXJzZXJmaWxlOiBbInBhcnNleG1sLmpzIiwgInBhcnNlY3NzLmpzIiwgInRva2VuaXplamF2YXNjcmlwdC5qcyIsICJwYXJzZWphdmFzY3JpcHQuanMiLCAicGFyc2VodG1sbWl4ZWQuanMiXSwKICAgIHN0eWxlc2hlZXQ6IFsiY3NzL3htbGNvbG9ycy5jc3MiLCAiY3NzL2pzY29sb3JzLmNzcyIsICJjc3MvY3NzY29sb3JzLmNzcyJdLAogICAgcGF0aDogImpzLyIKICB9KTsKPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/sparqltest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogU3BhcnFsIGRlbW9uc3RyYXRpb248L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2RvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+Cgo8cD5EZW1vbnN0cmF0aW9uIG9mIDxhIGhyZWY9ImluZGV4Lmh0bWwiPkNvZGVNaXJyb3I8L2E+J3MgU3BhcnFsCmhpZ2hsaWdodGVyLjwvcD4KCjxkaXYgY2xhc3M9ImJvcmRlciI+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgY29scz0iMTIwIiByb3dzPSIzMCI+ClBSRUZJWCBhOiAmbHQ7aHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9hbm5vdGF0aW9uLW5zIz4KUFJFRklYIGRjOiAmbHQ7aHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8+ClBSRUZJWCBmb2FmOiAmbHQ7aHR0cDovL3htbG5zLmNvbS9mb2FmLzAuMS8+CgojIENvbW1lbnQhCgpTRUxFQ1QgP2dpdmVuID9mYW1pbHkKV0hFUkUgewogID9hbm5vdCBhOmFubm90YXRlcyAmbHQ7aHR0cDovL3d3dy53My5vcmcvVFIvcmRmLXNwYXJxbC1xdWVyeS8+IC4KICA/YW5ub3QgZGM6Y3JlYXRvciA/YyAuCiAgT1BUSU9OQUwgez9jIGZvYWY6Z2l2ZW4gP2dpdmVuIDsKICAgICAgICAgICAgICAgZm9hZjpmYW1pbHkgP2ZhbWlseSB9IC4KICBGSUxURVIgaXNCbGFuayg/YykKfQo8L3RleHRhcmVhPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoJ2NvZGUnLCB7CiAgICBoZWlnaHQ6ICIyNTBweCIsCiAgICBwYXJzZXJmaWxlOiAicGFyc2VzcGFycWwuanMiLAogICAgc3R5bGVzaGVldDogImNzcy9zcGFycWxjb2xvcnMuY3NzIiwKICAgIHBhdGg6ICJqcy8iCiAgfSk7Cjwvc2NyaXB0PgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/story.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHRpdGxlPkltcGxlbWVudGluZyBhIHN5bnRheC1oaWdsaWdodGluZyBKYXZhU2NyaXB0IGVkaXRvciBpbiBKYXZhU2NyaXB0PC90aXRsZT4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIGJvZHkgewogICAgICAgIHBhZGRpbmc6IDNlbSA2ZW07CiAgICAgICAgbWF4LXdpZHRoOiA1MGVtOwogICAgICB9CiAgICAgIGgxIHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICAgIGgyIHsKICAgICAgICBmb250LXNpemU6IDEzMCU7CiAgICAgIH0KICAgICAgY29kZSB7CiAgICAgICAgZm9udC1mYW1pbHk6IGNvdXJpZXIsIG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDgwJTsKICAgICAgICBjb2xvcjogIzE0NDsKICAgICAgfQogICAgICBwIHsKICAgICAgICBtYXJnaW46IDFlbSAwOwogICAgICB9CiAgICAgIHByZS5jb2RlIHsKICAgICAgICBtYXJnaW46IDEuMWVtIDEycHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI0NDQ0NDQzsKICAgICAgICBwYWRkaW5nOiAuNGVtOwogICAgICAgIGZvbnQtZmFtaWx5OiBjb3VyaWVyLCBtb25vc3BhY2U7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjc3MvanNjb2xvcnMuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxIHN0eWxlPSJmb250LXNpemU6IDE4MCU7Ij5JbXBsZW1lbnRpbmcgYSBzeW50YXgtaGlnbGlnaHRpbmcgSmF2YVNjcmlwdCBlZGl0b3IgaW4gSmF2YVNjcmlwdDwvaDE+CiAgICA8aDEgc3R5bGU9ImZvbnQtc2l6ZTogMTEwJTsiPm9yPC9oMT4KICAgIDxoMSBzdHlsZT0iZm9udC1zaXplOiAxMzAlOyBtYXJnaW4tYm90dG9tOiAzZW07Ij5BIGJydXRhbCBvZHlzc2V5IHRvIHRoZSBkYXJrIHNpZGUgb2YgdGhlIERPTSB0cmVlPC9oMT4KCiAgICA8cCBzdHlsZT0iZm9udC1zaXplOiA4MCUiPgogICAgICA8Yj5Ub3BpYzwvYj46IEphdmFTY3JpcHQsIGFkdmFuY2VkIGJyb3dzZXIgd2VpcmRuZXNzLCBjb29sIHByb2dyYW1taW5nIHRlY2huaXF1ZXM8YnIvPgogICAgICA8Yj5BdWRpZW5jZTwvYj46IFByb2dyYW1tZXJzLCBlc3BlY2lhbGx5IEphdmFTY3JpcHQgcHJvZ3JhbW1lcnM8YnIvPgogICAgICA8Yj5BdXRob3I8L2I+OiBNYXJpam4gSGF2ZXJiZWtlPGJyLz4KICAgICAgPGI+RGF0ZTwvYj46IE1heSAyNHRoIDIwMDcKICAgIDwvcD4KCiAgICA8cCBzdHlsZT0iY29sb3I6ICM4MTE7IGZvbnQtc2l6ZTogOTAlOyBmb250LXN0eWxlOiBpdGFsaWMiPk5vdGU6IHNvbWUgb2YgdGhlIGRldGFpbHMgZ2l2ZW4gaGVyZSBubwogICAgbG9uZ2VyIGFwcGx5IHRvIHRoZSBjdXJyZW50IDxhCiAgICBocmVmPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yIj5Db2RlTWlycm9yPC9hPgogICAgY29kZWJhc2UsIHdoaWNoIGhhcyBldm9sdmVkIHF1aXRlIGEgYml0IGluIHRoZSBtZWFudGltZS48L3A+CgogICAgPHA+SW4gb25lIG9mIGhpcyAodmVyeSBpbmZvcm1hdGl2ZSkgPGEKICAgIGhyZWY9Imh0dHA6Ly93d3cubGVhcm53ZWJkZXNpZ25vbmxpbmUuY29tL3ZpZGVvcy9wcm9ncmFtbWluZy9qYXZhc2NyaXB0L3lhaG9vLWRvdWdsYXMtY3JvY2tmb3JkIj52aWRlbwogICAgbGVjdHVyZXM8L2E+LCBEb3VnbGFzIENyb2NrZm9yZCByZW1hcmtzIHRoYXQgd3JpdGluZyBKYXZhU2NyaXB0CiAgICBmb3IgdGhlIHdlYiBpcyAncHJvZ3JhbW1pbmcgaW4gYSBob3N0aWxlIGVudmlyb25tZW50Jy4gSSBoYWQgZG9uZQogICAgbXkgZmFpciBzaGFyZSBvZiB3ZWlyZCB3b3JrYXJvdW5kcywgYW5kIGV2ZW4gb2NjYXNvbmFsbHkgZ2F2ZSB1cAogICAgYW4gb24gaWRlYSBlbnRpcmVseSBiZWNhdXNlIGJyb3dzZXJzIGp1c3Qgd291bGRuJ3Qgc3VwcG9ydCBpdCwgYnV0CiAgICBiZWZvcmUgdGhpcyBwcm9qZWN0IEkgbmV2ZXIgcmVhbGx5IHJlYWxpemVkIGp1c3QgaG93IHBvd2VybGVzcyBhCiAgICBwcm9ncmFtbWVyIGNhbiBiZSBpbiB0aGUgZmFjZSBvZiBidWdneSwgaW5jb21wYXRpYmxlLCBhbmQgcG9vcmx5CiAgICBkZXNpZ25lZCBwbGF0Zm9ybXMuPC9wPgoKICAgIDxwPlRoZSBwbGFuIHdhcyBub3QgcmlkaWN1bG91c2x5IGFtYml0aW91cy4gSSB3YW50ZWQgdG8gJ2VuaGFuY2UnIGEKICAgIHRleHRhcmVhIHRvIHRoZSBwb2ludCB3aGVyZSB3cml0aW5nIGNvZGUgaW4gaXQgaXMgcGxlYXNhbnQuIFRoaXMgbWVhbnQKICAgIGF1dG9tYXRpYyBpbmRlbnRhdGlvbiBhbmQsIGlmIHBvc3NpYmxlIGF0IGFsbCwgc3ludGF4IGhpZ2hsaWdodGluZy48L3A+CgogICAgPHA+SW4gdGhpcyBkb2N1bWVudCBJIGRlc2NyaWJlIHRoZSBzdG9yeSBvZiBpbXBsZW1lbnRpbmcgdGhpcywgZm9yIHlvdXIKICAgIGVkdWNhdGlvbiBhbmQgYW11c2VtZW50LiBBIGRlbW9uc3RyYXRpb24gb2YgdGhlIHJlc3VsdGluZyBwcm9ncmFtLAogICAgYWxvbmcgd2l0aCB0aGUgc291cmNlIGNvZGUsIGNhbiBiZSBmb3VuZCBhdCA8YQogICAgaHJlZj0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvciI+bXkgd2Vic2l0ZTwvYT4uPC9wPgoKICAgIDxoMj5UYWtlIG9uZTogT25seSBpbmRlbnRhdGlvbjwvaDI+CgogICAgPHA+VGhlIHZlcnkgZmlyc3QgYXR0ZW1wdCBtZXJlbHkgYWRkZWQgYXV0by1pbmRlbnRhdGlvbiB0byBhIHRleHRhcmVhCiAgICBlbGVtZW50LiBJdCB3b3VsZCBzY2FuIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSBjb250ZW50IG9mIHRoZSBhcmVhLAogICAgc3RhcnRpbmcgZnJvbSB0aGUgY3Vyc29yLCB1bnRpbCBpdCBoYWQgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGRlY2lkZQogICAgaG93IHRvIGluZGVudCB0aGUgY3VycmVudCBsaW5lLiBJdCB0b29rIG1lIGEgd2hpbGUgdG8gZmlndXJlIG91dCBhCiAgICBkZWNlbnQgbW9kZWwgZm9yIGluZGVudGluZyBKYXZhU2NyaXB0IGNvZGUsIGJ1dCBpbiB0aGUgZW5kIHRoaXMgc2VlbXMKICAgIHRvIHdvcms6PC9wPgoKICAgIDx1bD4KICAgICAgPGxpPkNvZGUgdGhhdCBzaXRzIGluc2lkZSBhIGJsb2NrIGlzIGluZGVudGVkIG9uZSB1bml0IChnZW5lcmFsbHkgdHdvCiAgICAgIHNwYWNlcykgbW9yZSB0aGFuIHRoZSBzdGF0ZW1lbnQgb3IgYnJhY2UgdGhhdCBvcGVuZWQgdGhlIGJsb2NrLjwvbGk+CiAgICAgIDxsaT5BIHN0YXRlbWVudCB0aGF0IGlzIGNvbnRpbnVlZCB0byB0aGUgbmV4dCBsaW5lIGlzIGluZGVudGVkIG9uZSB1bml0CiAgICAgIG1vcmUgdGhhbiB0aGUgbGluZSB0aGF0IHN0YXJ0cyB0aGUgc3RhdGVtZW50LjwvbGk+CiAgICAgIDxsaT5XaGVuIGRlYWxpbmcgd2l0aCBsaXN0cyBvZiBhcmd1bWVudHMgb3IgdGhlIGNvbnRlbnQgb2YgYXJyYXkgYW5kCiAgICAgIG9iamVjdCBsaXRlcmFscyB0aGVyZSBhcmUgdHdvIHBvc3NpYmxlIG1vZGVscy4gSWYgdGhlcmUgaXMgYW55IHRleHQKICAgICAgZGlyZWN0bHkgYWZ0ZXIgdGhlIG9wZW5pbmcgYnJhY2UsIGJyYWNrZXQsIG9yIHBhcmVudGhlc2lzLAogICAgICBzdWJzZXF1ZW50IGxpbmVzIGFyZSBhbGlnbmVkIHdpdGggdGhpcyBvcGVuaW5nIGNoYXJhY3Rlci4gSWYgdGhlCiAgICAgIG9wZW5pbmcgY2hhcmFjdGVyIGlzIGZvbGxvd2VkIGJ5IGEgbmV3bGluZSAob3B0aW9uYWxseSB3aXRoIHdoaXRlc3BhY2UKICAgICAgb3IgY29tbWVudHMgYmVmb3JlIGl0KSwgdGhlIG5leHQgbGluZSBpcyBpbmRlbnRlZCBvbmUgdW5pdCBmdXJ0aGVyCiAgICAgIHRoYW4gdGhlIGxpbmUgdGhhdCBzdGFydGVkIHRoZSBsaXN0LjwvbGk+CiAgICAgIDxsaT5BbmQsIG9idmlvdXNseSwgaWYgYSBzdGF0ZW1lbnQgZm9sbG93cyBhbm90aGVyIHN0YXRlbWVudCBpdCBpcwogICAgICBpbmRlbnRlZCB0aGUgc2FtZSBhbW91bnQgYXMgdGhlIG9uZSBiZWZvcmUgaXQuPC9saT4KICAgIDwvdWw+CgogICAgPHA+V2hlbiBzY2FubmluZyBiYWNrd2FyZHMgdGhyb3VnaCBjb2RlIG9uZSBoYXMgdG8gdGFrZSBzdHJpbmcgdmFsdWVzLAogICAgY29tbWVudHMsIGFuZCByZWd1bGFyIGV4cHJlc3Npb25zICh3aGljaCBhcmUgZGVsaW1pdGVkIGJ5IHNsYXNoZXMpCiAgICBpbnRvIGFjY291bnQsIGJlY2F1c2UgYnJhY2VzIGFuZCBzZW1pY29sb25zIGFuZCBzdWNoIGFyZSBub3QKICAgIHNpZ25pZmljYW50IHdoZW4gdGhleSBhcHBlYXIgaW5zaWRlIHRoZW0uIFNpbmdsZS1saW5lICgnLy8nKSBjb21tZW50cwogICAgdHVybmVkIG91dCB0byBiZSByYXRoZXIgaW5lZmZpY2llbnQgdG8gY2hlY2sgZm9yIHdoZW4gZG9pbmcgYQogICAgYmFja3dhcmRzIHNjYW4sIHNpbmNlIGV2ZXJ5IHRpbWUgeW91IGVuY291bnRlciBhIG5ld2xpbmUgeW91IGhhdmUgdG8KICAgIGdvIG9uIHRvIHRoZSBuZXh0IG5ld2xpbmUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBsaW5lIGVuZHMgaW4gYQogICAgY29tbWVudCBvciBub3QuIFJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIGV2ZW4gd29yc2UgJiN4MjAxNTsgd2l0aG91dAogICAgY29udGV4dHVhbCBpbmZvcm1hdGlvbiB0aGV5IGFyZSBpbXBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoIGZyb20gdGhlCiAgICBkaXZpc2lvbiBvcGVyYXRvciwgYW5kIEkgZGlkbid0IGdldCB0aGVtIHdvcmtpbmcgaW4gdGhpcyBmaXJzdAogICAgdmVyc2lvbi48L3A+CgogICAgPHA+VG8gZmluZCBvdXQgd2hpY2ggbGluZSB0byBpbmRlbnQsIGFuZCB0byBtYWtlIHN1cmUgdGhhdCBhZGRpbmcgb3IKICAgIHJlbW92aW5nIHdoaXRlc3BhY2UgZG9lc24ndCBjYXVzZSB0aGUgY3Vyc29yIHRvIGp1bXAgaW4gc3RyYW5nZSB3YXlzLAogICAgaXQgaXMgbmVjZXNzYXJ5IHRvIGRldGVybWluZSB3aGljaCB0ZXh0IHRoZSB1c2VyIGhhcyBzZWxlY3RlZC4gRXZlbgogICAgdGhvdWdoIEkgd2FzIHdvcmtpbmcgd2l0aCBqdXN0IGEgc2ltcGxlIHRleHRhcmVhIGF0IHRoaXMgcG9pbnQsIHRoaXMKICAgIHdhcyBhbHJlYWR5IGEgYml0IG9mIGEgaGVhZGFjaGUuPC9wPgoKICAgIDxwPk9uIFczQy1zdGFuZGFyZHMtcmVzcGVjdGluZyBicm93c2VycywgdGV4dGFyZWEgbm9kZXMgaGF2ZQogICAgPGNvZGU+c2VsZWN0aW9uU3RhcnQ8L2NvZGU+IGFuZCA8Y29kZT5zZWxlY3Rpb25FbmQ8L2NvZGU+CiAgICBwcm9wZXJ0aWVzIHdoaWNoIG5pY2VseSBnaXZlIHlvdSB0aGUgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmVmb3JlCiAgICB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgc2VsZWN0aW9uLiBHcmVhdCE8L3A+CgogICAgPHA+VGhlbiwgdGhlcmUgaXMgSW50ZXJuZXQgRXhwbG9yZXIuIEludGVybmV0IEV4cGxvcmVyIGFsc28gaGFzIGFuIEFQSQogICAgZm9yIGxvb2tpbmcgYXQgYW5kIG1hbmlwdWxhdGluZyBzZWxlY3Rpb25zLiBJdCBnaXZlcyB5b3UgaW5mb3JtYXRpb24KICAgIHN1Y2ggYXMgYSBkZXRhaWxlZCBtYXAgb2YgdGhlIHNwYWNlIHRoZSBzZWxlY3RlZCBsaW5lcyB0YWtlIHVwIG9uIHRoZQogICAgc2NyZWVuLCBpbiBwaXhlbHMsIGFuZCBvZiBjb3Vyc2UgdGhlIHRleHQgaW5zaWRlIHRoZSBzZWxlY3Rpb24uIEl0CiAgICBkb2VzLCBob3dldmVyLCBub3QgZ2l2ZSB5b3UgbXVjaCBvZiBhIGNsdWUgb24gd2hlcmUgdGhlIHNlbGVjdGlvbiBpcwogICAgbG9jYXRlZCBpbiB0aGUgZG9jdW1lbnQuPC9wPgoKICAgIDxwPkFmdGVyIHNvbWUgZXhwZXJpbWVudGF0aW9uIEkgbWFuYWdlZCB0byB3b3JrIG91dCBhbiBlbGFib3JhdGUKICAgIG1ldGhvZCBmb3IgZ2V0dGluZyBzb21ldGhpbmcgc2ltaWxhciB0byB0aGUKICAgIDxjb2RlPnNlbGVjdGlvblN0YXJ0PC9jb2RlPiBhbmQgPGNvZGU+c2VsZWN0aW9uRW5kPC9jb2RlPiB2YWx1ZXMKICAgIGluIG90aGVyIGJyb3dzZXJzLiBJdCB3b3JrZWQgbGlrZSB0aGlzOjwvcD4KCiAgICA8dWw+CiAgICAgIDxsaT5HZXQgdGhlIDxjb2RlPlRleHRSYW5nZTwvY29kZT4gb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlbGVjdGlvbi48L2xpPgogICAgICA8bGk+UmVjb3JkIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgaW5zaWRlIGl0LjwvbGk+CiAgICAgIDxsaT5NYWtlIGFub3RoZXIgPGNvZGU+VGV4dFJhbmdlPC9jb2RlPiB0aGF0IGNvdmVycyB0aGUgd2hvbGUgdGV4dGFyZWEgZWxlbWVudC48L2xpPgogICAgICA8bGk+U2V0IHRoZSBzdGFydCBvZiB0aGUgZmlyc3QgPGNvZGU+VGV4dFJhbmdlPC9jb2RlPiB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY29uZCBvbmUuPC9saT4KICAgICAgPGxpPkFnYWluIGdldCB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IGluIHRoZSBmaXJzdCBvYmplY3QuPC9saT4KICAgICAgPGxpPk5vdyA8Y29kZT5zZWxlY3Rpb25FbmQ8L2NvZGU+IGlzIHRoZSBzZWNvbmQgbGVuZ3RoLCBhbmQgPGNvZGU+c2VsZWN0aW9uU3RhcnQ8L2NvZGU+IGlzCiAgICAgIHRoZSBzZWNvbmQgbWludXMgdGhlIGZpcnN0IG9uZS48L2xpPgogICAgPC91bD4KCiAgICA8cD5UaGF0IHNlZW1lZCB0byB3b3JrLCBidXQgd2hlbiByZXNldHRpbmcgdGhlIHNlbGVjdGlvbiBhZnRlciBtb2RpZnlpbmcKICAgIHRoZSBjb250ZW50IG9mIHRoZSB0ZXh0YXJlYSBJIHJhbiBpbnRvIGFub3RoZXIgaW50ZXJlc3RpbmcgZmVhdHVyZSBvZgogICAgdGhlc2UgPGNvZGU+VGV4dFJhbmdlPC9jb2RlPnM6IFlvdSBjYW4gbW92ZSB0aGVpciBlbmRwb2ludHMgYnkgYSBnaXZlbiBudW1iZXIgb2YKICAgIGNoYXJhY3RlcnMsIHdoaWNoIGlzIHVzZWZ1bCB3aGVuIHRyeWluZyB0byBzZXQgYSBjdXJzb3IgYXQgdGhlIE50aAogICAgY2hhcmFjdGVyIG9mIGEgdGV4dGFyZWEsIGJ1dCBpbiB0aGlzIGNvbnRleHQsIG5ld2xpbmVzIGFyZSA8ZW0+bm90PC9lbT4KICAgIGNvbnNpZGVyZWQgdG8gYmUgY2hhcmFjdGVycywgc28geW91J2xsIGFsd2F5cyBlbmQgdXAgb25lIGNoYXJhY3RlciB0b28KICAgIGZhciBmb3IgZXZlcnkgbmV3bGluZSB5b3UgcGFzc2VkLiBPZiBjb3Vyc2UsIHlvdSBjYW4gY291bnQgbmV3bGluZXMKICAgIGFuZCBjb21wZW5zYXRlIGZvciB0aGlzICh0aG91Z2ggaXQgaXMgc3RpbGwgbm90IHBvc3NpYmxlIHRvIHBvc2l0aW9uCiAgICB0aGUgY3Vyc29yIHJpZ2h0IGluIGZyb250IG9mIGEgbmV3bGluZSkuIFNoZWVzaC48L3A+CgogICAgPHA+QWZ0ZXIgcmFnZ2luZyBvbiBJbnRlcm5ldCBFeHBsb3JlciBmb3IgYSB3aGlsZSwgbGV0IHVzIG1vdmUgb24gYW5kIHJhZwogICAgb24gRmlyZWZveCBhIGJpdC4gSXQgdHVybnMgb3V0IHRoYXQsIGluIEZpcmVmb3gsIGdldHRpbmcgYW5kIHNldHRpbmcKICAgIHRoZSB0ZXh0IGNvbnRlbnQgb2YgYSBET00gZWxlbWVudCBpcyB1bmV4cGxhaW5hYmx5IGV4cGVuc2l2ZSwKICAgIGVzcGVjaWFsbHkgd2hlbiB0aGVyZSBpcyBhIGxvdCBvZiB0ZXh0IGludm9sdmVkLiBBcyBzb29uIGFzIEkgdHJpZWQgdG8KICAgIHVzZSBteSBpbmRlbnRhdGlvbiBjb2RlIHRvIGluZGVudCBpdHNlbGYgKHNvbWUgNDAwIGxpbmVzKSwgSSBmb3VuZAogICAgbXlzZWxmIHdhaXRpbmcgZm9yIG92ZXIgZm91ciBzZWNvbmRzIGV2ZXJ5IHRpbWUgSSBwcmVzc2VkIGVudGVyLiBUaGF0CiAgICBzZWVtZWQgYSBsaXR0bGUgc2xvdy48L3A+CgogICAgPGgyPmRlc2lnbk1vZGUgaXQgaXM8L2gyPgoKICAgIDxwPlRoZSBzb2x1dGlvbiB3YXMgb2J2aW91czogU2luY2UgdGhlIHRleHQgaW5zaWRlIGEgdGV4dGFyZWEgY2FuIG9ubHkgYmUKICAgIG1hbmlwdWxhdGVkIGFzIG9uZSBzaW5nbGUgYmlnIHN0cmluZywgSSBoYWQgdG8gc3ByZWFkIGl0IG91dCBvdmVyCiAgICBtdWx0aXBsZSBub2Rlcy4gSG93IGRvIHlvdSBzcHJlYWQgZWRpdGFibGUgY29udGVudCBvdmVyIG11bHRpcGxlCiAgICBub2Rlcz8gUmlnaHQhIDxjb2RlPmRlc2lnbk1vZGU8L2NvZGU+IG9yIDxjb2RlPmNvbnRlbnRFZGl0YWJsZTwvY29kZT4uPC9wPgoKICAgIDxwPk5vdyBJIHdhc24ndCBlbnRpcmVseSBuYWl2ZSBhYm91dCA8Y29kZT5kZXNpZ25Nb2RlPC9jb2RlPiwgSSBoYWQgYmVlbiBsb29raW5nCiAgICBpbnRvIHdyaXRpbmcgYSBub24tbWVzc3kgV1lTSVdZRyBlZGl0b3IgYmVmb3JlLCBhbmQgYXQgdGhhdCB0aW1lIEkgaGFkCiAgICBjb25jbHVkZWQgdHdvIHRoaW5nczo8L3A+CgogICAgPHVsPgogICAgICA8bGk+SXQgaXMgaW1wb3NzaWJsZSB0byBwcmV2ZW50IHRoZSB1c2VyIGZyb20gaW5zZXJ0aW5nIHdoaWNoZXZlciBIVE1MCiAgICAgIGp1bmsgaGUgd2FudHMgaW50byB0aGUgZG9jdW1lbnQuPC9saT4KICAgICAgPGxpPkluIEludGVybmV0IEV4cGxvcmVyLCBpdCBpcyBleHRlbWVseSBoYXJkIHRvIGdldCBhIGdvb2QgdmlldwogICAgICBvbiB3aGF0IG5vZGVzIHRoZSB1c2VyIGhhcyBzZWxlY3RlZC48L2xpPgogICAgPC91bD4KCiAgICA8cD5CYXNpY2FsbHksIHRoZSBnb29kIGZvbGtzIGF0IE1pY3Jvc29mdCBkZXNpZ25lZCBhIHJlYWxseSBiYWQgaW50ZXJmYWNlCiAgICBmb3IgcHV0dGluZyBlZGl0YWJsZSBkb2N1bWVudHMgaW4gcGFnZXMsIGFuZCB0aGUgb3RoZXIgYnJvd3NlcnMsIG5vdAogICAgd2FudGluZyB0byBiZSBsZWZ0IGJlaGluZCwgbW9yZSBvciBsZXNzIGNvcGllZCB0aGF0LiBBbmQgdGhlcmUgaXNuJ3QKICAgIG11Y2ggaG9wZSBmb3IgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMgYXBwZWFyaW5nIGFueXRpbWUgc29vbi4gV2lzZQogICAgcGVvcGxlIHByb2JhYmx5IHVzZSBhIEZsYXNoIG1vdmllIG9yIChHb2QgZm9yYmlkKSBhIEphdmEgYXBwbGV0IGZvcgogICAgdGhlc2Uga2luZCBvZiB0aGluZ3MsIHRob3VnaCB0aG9zZSBhcmUgbm90IHdpdGhvdXQgZHJhd2JhY2tzIGVpdGhlci48L3A+CgogICAgPHA+QW55d2F5LCBzZWVpbmcgaG93IHVzaW5nIGFuIGVkaXRhYmxlIGRvY3VtZW50IHdvdWxkIGFsc28gbWFrZSBzeW50YXgKICAgIGhpZ2hsaWdodGluZyBwb3NzaWJsZSwgSSBmb29saXNobHkgd2VudCBhaGVhZC4gVGhlcmUgaXMgc29tZXRoaW5nCiAgICBwZXJ2ZXJzZWx5IGZhc2NpbmF0aW5nIGFib3V0IHRyeWluZyB0byBidWlsZCBhIGNvbXBsaWNhdGVkIHN5c3RlbSBvbiBhCiAgICBsb3VzeSwgdW5zdWl0YWJsZSBwbGF0Zm9ybS48L3A+CgogICAgPGgyPkEgcGFyc2VyPC9oMj4KCiAgICA8cD5Ib3cgZG9lcyBvbmUgZG8gZGVjZW50IHN5bnRheCBoaWdobGlnaHRpbmc/IEEgdmVyeSBzaW1wbGUgc2Nhbm5pbmcgY2FuCiAgICB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc3RyaW5ncywgY29tbWVudHMsIGtleXdvcmRzLCBhbmQgb3RoZXIKICAgIGNvZGUuIEJ1dCB0aGlzIHRpbWUgSSB3YW50ZWQgdG8gYWN0dWFsbHkgYmUgYWJsZSB0byByZWNvZ25pemUgcmVndWxhcgogICAgZXhwcmVzc2lvbnMsIHNvIHRoYXQgSSBkaWRuJ3QgaGF2ZSBhbnkgYmxhdGFudCBpbmNvcnJlY3QgYmVoYXZpb3VyCiAgICBhbnltb3JlLjwvcD4KCiAgICA8cD5UaGF0IGJyb3VnaHQgbWUgdG8gdGhlIGlkZWEgb2YgZG9pbmcgYSBzZXJpb3VzIHBhcnNlIG9uIHRoZSBjb2RlLiBUaGlzCiAgICB3b3VsZCBub3Qgb25seSBtYWtlIGRldGVjdGluZyByZWd1bGFyIGV4cHJlc3Npb25zIG11Y2ggZWFzaWVyLCBpdAogICAgd291bGQgYWxzbyBnaXZlIG1lIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlLCB3aGljaCBjYW4gYmUKICAgIHVzZWQgdG8gZGV0ZXJtaW5lIHByb3BlciBpbmRlbnRhdGlvbiBsZXZlbHMsIGFuZCB0byBtYWtlIHN1YnRsZQogICAgZGlzdGluY3Rpb25zIGluIGNvbG91cmluZywgZm9yIGV4YW1wbGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB2YXJpYWJsZQogICAgbmFtZXMgYW5kIHByb3BlcnR5IG5hbWVzLjwvcD4KCiAgICA8cD5BbmQgaGV5LCB3aGVuIHdlJ3JlIHBhcnNpbmcgdGhlIHdob2xlIHRoaW5nLCBpdCB3b3VsZCBldmVuIGJlIHBvc3NpYmxlCiAgICB0byBtYWtlIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBsb2NhbCBhbmQgZ2xvYmFsIHZhcmlhYmxlcywgYW5kIGNvbG91cgogICAgdGhlbSBkaWZmZXJlbnRseS4gSWYgeW91J3ZlIGV2ZXIgcHJvZ3JhbW1lZCBKYXZhU2NyaXB0IHlvdSBjYW4KICAgIHByb2JhYmx5IGltYWdpbmUgaG93IHVzZWZ1bCB0aGlzIHdvdWxkIGJlICYjeDIwMTU7IGl0IGlzIHJpZGljdWxvdXNseSBlYXN5CiAgICB0byBhY2NpZGVudGFsbHkgY3JlYXRlIGdsb2JhbCBpbnN0ZWFkIG9mIGxvY2FsIHZhcmlhYmxlcy4gSSBkb24ndAogICAgY29uc2lkZXIgbXlzZWxmIGEgSmF2YVNjcmlwdCByb29raWUgYW55bW9yZSwgYnV0IGl0IHdhcyAoZW1iYXJyYXNpbmdseQogICAgZW5vdWdoKSBvbmx5IHRoaXMgd2VlayB0aGF0IEkgcmVhbGl6ZWQgdGhhdCBteSBoYWJpdCBvZiB0eXBpbmcgPGNvZGU+Zm9yCiAgICAobmFtZSBpbiBvYmplY3QpIC4uLjwvY29kZT4gd2FzIGNyZWF0aW5nIGEgZ2xvYmFsIHZhcmlhYmxlIDxjb2RlPm5hbWU8L2NvZGU+LCBhbmQgdGhhdAogICAgSSBzaG91bGQgYmUgdHlwaW5nIDxjb2RlPmZvciAodmFyIG5hbWUgaW4gb2JqZWN0KSAuLi48L2NvZGU+IGluc3RlYWQuPC9wPgoKICAgIDxwPlJlLXBhcnNpbmcgYWxsIHRoZSBjb2RlIHRoZSB1c2VyIGhhcyB0eXBlZCBpbiBldmVyeSB0aW1lIGhlIGhpdHMgYSBrZXkKICAgIGlzIG9idmlvdXNseSBub3QgZmVhc2libGUuIFNvIGhvdyBkb2VzIG9uZSBjb21iaW5lIG9uLXRoZS1mbHkKICAgIGhpZ2hsaWdodGluZyB3aXRoIGEgc2VyaW91cyBwYXJzZXI/IE9uZSBvcHRpb24gd291bGQgYmUgdG8gc3BsaXQgdGhlCiAgICBjb2RlIGludG8gdG9wLWxldmVsIHN0YXRlbWVudHMgKGZ1bmN0aW9ucywgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGV0Yy4pCiAgICBhbmQgcGFyc2UgdGhlc2Ugc2VwYXJhdGVseS4gVGhpcyBpcyBob3JyaWJseSBjbHVua3kgdGhvdWdoLCBlc3BlY2lhbGx5CiAgICBjb25zaWRlcmluZyB0aGUgZmFjdCB0aGF0IG1vZGVybiBKYXZhU2NyaXB0ZXJzIG9mdGVuIHB1dCBhbGwgdGhlIGNvZGUKICAgIGluIGEgZmlsZSBpbiBhIHNpbmdsZSBiaWcgb2JqZWN0IG9yIGZ1bmN0aW9uIHRvIHByZXZlbnQgbmFtZXNwYWNlCiAgICBwb2xsdXRpb24uPC9wPgoKICAgIDxwPkkgaGF2ZSBhbHdheXMgbGlrZWQgY29udGludWF0aW9uLXBhc3Npbmcgc3R5bGUgYW5kIGdlbmVyYXRvcnMuIFNvIHRoZQogICAgaWRlYSBJIGNhbWUgdXAgd2l0aCBpcyB0aGlzOiBBbiBpbnRlcnJ1cHRhYmxlLCByZXN1bWFibGUgcGFyc2VyLiBUaGlzCiAgICBpcyBhIHBhcnNlciB0aGF0IGRvZXMgbm90IHJ1biB0aHJvdWdoIGEgd2hvbGUgZG9jdW1lbnQgYXQgb25jZSwgYnV0CiAgICBwYXJzZXMgb24tZGVtYW5kLCBhIGxpdHRsZSBiaXQgYXQgYSB0aW1lLiBBdCBhbnkgbW9tZW50IHlvdSBjYW4gY3JlYXRlCiAgICBhIGNvcHkgb2YgaXRzIGN1cnJlbnQgc3RhdGUsIHdoaWNoIGNhbiBiZSByZXN1bWVkIGxhdGVyLiBZb3Ugc3RhcnQKICAgIHBhcnNpbmcgYXQgdGhlIHRvcCBvZiB0aGUgY29kZSwgYW5kIGtlZXAgZ29pbmcgYXMgbG9uZyBhcyB5b3UgbGlrZSwKICAgIGJ1dCB0aHJvdWdob3V0IHRoZSBkb2N1bWVudCwgZm9yIGV4YW1wbGUgYXQgZXZlcnkgZW5kIG9mIGxpbmUsIHlvdQogICAgc3RvcmUgYSBjb3B5IG9mIHRoZSBjdXJyZW50IHBhcnNlciBzdGF0ZS4gTGF0ZXIgb24sIHdoZW4gbGluZSAxMDYKICAgIGNoYW5nZXMsIHlvdSBncmFiIHRoZSBpbnRlcnJ1cHRlZCBwYXJzZXIgdGhhdCB3YXMgc3RvcmVkIGF0IHRoZSBlbmQgb2YKICAgIGxpbmUgMTA1LCBhbmQgdXNlIGl0IHRvIHJlLXBhcnNlIGxpbmUgMTA2LiBJdCBzdGlsbCBrbm93cyBleGFjdGx5IHdoYXQKICAgIHRoZSBjb250ZXh0IHdhcyBhdCB0aGF0IHBvaW50LCB3aGljaCBsb2NhbCB2YXJpYWJsZXMgd2VyZSBkZWZpbmVkLAogICAgd2hpY2ggdW5maW5pc2hlZCBzdGF0ZW1lbnRzIHdlcmUgZW5jb3VudGVyZWQsIGFuZCBzbyBvbi48L3A+CgogICAgPHA+QnV0IHRoYXQsIHVuZm9ydHVuYXRlbHksIHR1cm5lZCBvdXQgdG8gYmUgbm90IHF1aXRlIGFzIGVhc3kgYXMgaXQKICAgIHNvdW5kcy48L3A+CgogICAgPGgyPlRoZSBET00gbm9kZXMgdW5kZXJmb290PC9oMj4KCiAgICA8cD5PZiBjb3Vyc2UsIHdoZW4gd29ya2luZyBpbnNpZGUgYW4gZWRpdGFibGUgZnJhbWUgd2UgZG9uJ3QganVzdAogICAgaGF2ZSB0byBkZWFsIHdpdGggdGV4dC4gVGhlIGNvZGUgd2lsbCBiZSByZXByZXNlbnRlZCBieSBzb21lIGtpbmQKICAgIG9mIERPTSB0cmVlLiBNeSBmaXJzdCBpZGVhIHdhcyB0byBzZXQgdGhlIDxjb2RlPndoaXRlLXNwYWNlOgogICAgcHJlPC9jb2RlPiBzdHlsZSBmb3IgdGhlIGZyYW1lIGFuZCB0cnkgdG8gd29yayB3aXRoIG1vc3RseSB0ZXh0LAogICAgd2l0aCB0aGUgb2NjYXNpb25hbCBjb2xvdXJlZCA8Y29kZT5zcGFuPC9jb2RlPiBlbGVtZW50LiBJdCB0dXJuZWQKICAgIG91dCB0aGF0IHN1cHBvcnQgZm9yIDxjb2RlPndoaXRlLXNwYWNlOiBwcmU8L2NvZGU+IGluIGJyb3dzZXJzLAogICAgZXNwZWNpYWxseSBpbiBlZGl0YWJsZSBmcmFtZXMsIGlzIHNvIGhvcGVsZXNzbHkgZ2xpdGNoeSB0aGF0IHRoaXMKICAgIHdhcyB1bndvcmthYmxlLjwvcD4KCiAgICA8cD5OZXh0IEkgdHJpZWQgYSBzZXJpZXMgb2YgPGNvZGU+ZGl2PC9jb2RlPiBlbGVtZW50cywgb25lIHBlcgogICAgbGluZSwgd2l0aCA8Y29kZT5zcGFuPC9jb2RlPiBlbGVtZW50cyBpbnNpZGUgdGhlbS4gVGhpcyBzZWVtZWQgdG8KICAgIG5pY2VseSByZWZsZWN0IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW4gYSBzaGFsbG93bHkKICAgIGhpZXJhcmNoaWNhbCB3YXkuIEkgc29vbiByZWFsaXplZCwgaG93ZXZlciwgdGhhdCBteSBjb2RlIHdvdWxkIGJlCiAgICBtdWNoIG1vcmUgc3RyYWlnaHRmb3dhcmQgd2hlbiB1c2luZyBubyBoaWVyYXJjaHkgd2hhdHNvZXZlcgogICAgJiN4MjAxNTsgYSBzZXJpZXMgb2YgPGNvZGU+c3BhbjwvY29kZT5zLCB3aXRoIDxjb2RlPmJyPC9jb2RlPiB0YWdzCiAgICBhdCB0aGUgZW5kIG9mIGV2ZXJ5IGxpbmUuIFRoaXMgd2F5LCB0aGUgRE9NIG5vZGVzIGZvcm0gYSBmbGF0CiAgICBzZXF1ZW5jZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzZXF1ZW5jZSBvZiB0aGUgdGV4dCAmI3gyMDE1OwogICAganVzdCBleHRyYWN0IHRleHQgZnJvbSA8Y29kZT5zcGFuPC9jb2RlPiBub2RlcyBhbmQgc3Vic3RpdHV0ZQogICAgbmV3bGluZXMgZm9yIDxjb2RlPmJyPC9jb2RlPiBub2Rlcy48L3A+CgogICAgPHA+SXQgd291bGQgYmUgYSBzaGFtZSBpZiB0aGUgZWRpdG9yIHdvdWxkIGZhbGwgYXBhcnQgYXMgc29vbiBhcwogICAgc29tZW9uZSBwYXN0ZXMgc29tZSBjb21wbGljYXRlZCBIVE1MIGludG8gaXQuIEkgd2FudGVkIGl0IHRvIGJlCiAgICBhYmxlIHRvIGRlYWwgd2l0aCB3aGF0ZXZlciBtZXNzIGl0IGZpbmRzLiBUaGlzIG1lYW5zIHVzaW5nIHNvbWUKICAgIGtpbmQgb2YgSFRNTC1ub3JtYWxpemVyIHRoYXQgdGFrZXMgYXJiaXRyYXJ5IEhUTUwgYW5kIGZsYXR0ZW5zIGl0CiAgICBpbnRvIGEgc2VyaWVzIG9mIDxjb2RlPmJyPC9jb2RlPnMgYW5kIDxjb2RlPnNwYW48L2NvZGU+IGVsZW1lbnRzCiAgICB0aGF0IGNvbnRhaW4gYSBzaW5nbGUgdGV4dCBub2RlLiBKdXN0IGxpa2UgdGhlIHBhcnNpbmcgcHJvY2VzcywgaXQKICAgIHdvdWxkIGJlIGJlc3QgaWYgdGhpcyBkaWQgbm90IGhhdmUgdG8gZG9uZSB0byB0aGUgZW50aXJlIGJ1ZmZlcgogICAgZXZlcnkgdGltZSBzb21ldGhpbmcgY2hhbmdlcy48L3A+CgogICAgPHA+SXQgdG9vayBzb21lIGJhbmdpbmcgbXkgaGVhZCBhZ2FpbnN0IG15IGtleWJvYXJkLCBidXQgSSBmb3VuZCBhIHZlcnkKICAgIG5pY2Ugd2F5IHRvIG1vZGVsIHRoaXMuIEl0IG1ha2VzIGhlYXZ5IHVzZSBvZiBnZW5lcmF0b3JzLCBmb3Igd2hpY2ggSQogICAgdXNlZCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vY2hpa2l0LmNvbSI+TW9jaGlLaXQ8L2E+J3MgaXRlcmF0b3IKICAgIGZyYW1ld29yay4gQm9iIElwcG9saXRvIGV4cGxhaW5zIHRoZSBjb25jZXB0cyBpbiB0aGlzIGxpYnJhcnkgdmVyeQogICAgd2VsbCBpbiBoaXMgPGEKICAgIGhyZWY9Imh0dHA6Ly9ib2IucHl0aG9ubWFjLm9yZy9hcmNoaXZlcy8yMDA1LzA3LzA2L2l0ZXJhdGlvbi1pbi1qYXZhc2NyaXB0LyI+YmxvZwogICAgcG9zdDwvYT4gYWJvdXQgaXQuIChBbHNvIG5vdGljZSBzb21lIG9mIHRoZSBkaXNtaXNzaXZlIGNvbW1lbnRzIGF0IHRoZQogICAgYm90dG9tIG9mIHRoYXQgcG9zdC4gVGhleSBzYXkgIkkgZG9uJ3QgdGhpbmsgSSByZWFsbHkgd2FudCB0byBsZWFybgogICAgdGhpcywgc28gSSdsbCBtYWtlIHVwIHNvbWUgc2lsbHkgcmVhc29uIHRvIGNvbmRlbW4gaXQuIik8L3A+CgogICAgPHA+VGhlIGhpZ2hsaWdodGluZyBwcm9jZXNzIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudHM6CiAgICBub3JtYWxpemluZyB0aGUgRE9NIHRyZWUsIGV4dHJhY3RpbmcgdGhlIHRleHQgZnJvbSB0aGUgRE9NIHRyZWUsCiAgICB0b2tlbml6aW5nIHRoaXMgdGV4dCwgcGFyc2luZyB0aGUgdG9rZW5zLCBhbmQgZmluYWxseSBhZGp1c3RpbmcgdGhlCiAgICBET00gbm9kZXMgdG8gcmVmbGVjdCB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlLjwvcD4KCiAgICA8cD5UaGUgZmlyc3QgdHdvLCBJIHB1dCBpbnRvIGEgc2luZ2xlIGdlbmVyYXRvci4gSXQgc2NhbnMgdGhlIERPTQogICAgdHJlZSwgZml4aW5nIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgc2ltcGxlIHRvcC1sZXZlbAogICAgPGNvZGU+c3BhbjwvY29kZT4gb3IgPGNvZGU+YnI8L2NvZGU+LCBhbmQgaXQgcHJvZHVjZXMgdGhlIHRleHQKICAgIGNvbnRlbnQgb2YgdGhlIG5vZGVzIChvciBhIG5ld2xpbmUgaW4gY2FzZSBvZiBhIDxjb2RlPmJyPC9jb2RlPikKICAgIGFzIGl0cyBvdXRwdXQgJiN4MjAxNTsgZWFjaCB0aW1lIGl0IGlzIGNhbGxlZCwgaXQgeWllbGRzIGEgc3RyaW5nLgogICAgQ29udGludWF0aW9uIHBhc3Npbmcgc3R5bGUgd2FzIGEgZ29vZCB3YXkgdG8gbW9kZWwgdGhpcyBwcm9jZXNzIGluCiAgICBhbiBpdGVyYXRvciwgd2hpY2ggaGFzIHRvIGJlIHByb2Nlc3NlZCBvbmUgc3RlcCBhdCBhIHRpbWUuIExvb2sgYXQKICAgIHRoaXMgc2ltcGxpZmllZCB2ZXJzaW9uOjwvcD4KCiAgICA8cHJlIGNsYXNzPSJjb2RlIj48c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZnVuY3Rpb248L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+dHJhdmVyc2VET008L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+c3RhcnQ8L3NwYW4+KXsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+dmFyPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGVkZWYiPmNjPC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5mdW5jdGlvbjwvc3Bhbj4oKXs8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPnNjYW5Ob2RlPC9zcGFuPig8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+c3RhcnQ8L3NwYW4+LCA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPnN0b3A8L3NwYW4+KTt9OwogIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5mdW5jdGlvbjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj5zdG9wPC9zcGFuPigpewogICAgPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPmNjPC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5zdG9wPC9zcGFuPjsKICAgIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj50aHJvdzwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5TdG9wSXRlcmF0aW9uPC9zcGFuPjsKICB9CiAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmZ1bmN0aW9uPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGVkZWYiPnlpZWxkPC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGVkZWYiPnZhbHVlPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj5jPC9zcGFuPil7CiAgICA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+Y2M8L3NwYW4+ID0gPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPmM8L3NwYW4+OwogICAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPnJldHVybjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnZhbHVlPC9zcGFuPjsKICB9CgogIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5mdW5jdGlvbjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj5zY2FuTm9kZTwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj5ub2RlPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj5jPC9zcGFuPil7CiAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+aWY8L3NwYW4+ICg8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+bm9kZTwvc3Bhbj4uPHNwYW4gY2xhc3M9ImpzLXByb3BlcnR5Ij5uZXh0U2libGluZzwvc3Bhbj4pCiAgICAgIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj52YXI8L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+bmV4dGM8L3NwYW4+ID0gPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmZ1bmN0aW9uPC9zcGFuPigpezxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5zY2FuTm9kZTwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPm5vZGU8L3NwYW4+LjxzcGFuIGNsYXNzPSJqcy1wcm9wZXJ0eSI+bmV4dFNpYmxpbmc8L3NwYW4+LCA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+Yzwvc3Bhbj4pO307CiAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPnZhcjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj5uZXh0Yzwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+Yzwvc3Bhbj47CgogICAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWNvbW1lbnQiPi8qIG5vZGUgaXMgcHJvcGVyIHNwYW4gZWxlbWVudCAqLzwvc3Bhbj4pCiAgICAgIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5yZXR1cm48L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj55aWVsZDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPm5vZGU8L3NwYW4+LjxzcGFuIGNsYXNzPSJqcy1wcm9wZXJ0eSI+Zmlyc3RDaGlsZDwvc3Bhbj4uPHNwYW4gY2xhc3M9ImpzLXByb3BlcnR5Ij5ub2RlVmFsdWU8L3NwYW4+LCA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+bmV4dGM8L3NwYW4+KTsKICAgIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5lbHNlPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+aWY8L3NwYW4+ICg8c3BhbiBjbGFzcz0ianMtY29tbWVudCI+Lyogbm9kZSBpcyBwcm9wZXIgYnIgZWxlbWVudCAqLzwvc3Bhbj4pCiAgICAgIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5yZXR1cm48L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj55aWVsZDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXN0cmluZyI+JnF1b3Q7XG4mcXVvdDs8L3NwYW4+LCA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+bmV4dGM8L3NwYW4+KTsKICAgIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5lbHNlPC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0ianMtY29tbWVudCI+LyogZmxhdHRlbiBub2RlLCB5aWVsZCBpdHMgdGV4dHVhbCBjb250ZW50ICovPC9zcGFuPjsKICB9CgogIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5yZXR1cm48L3NwYW4+IHs8c3BhbiBjbGFzcz0ianMtcHJvcGVydHkiPm5leHQ8L3NwYW4+OiA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZnVuY3Rpb248L3NwYW4+KCl7PHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPnJldHVybjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPmNjPC9zcGFuPigpO319Owp9PC9wcmU+CgogICAgPHA+VGhlIHZhcmlhYmxlIDxjb2RlPmM8L2NvZGU+IHN0YW5kcyBmb3IgJ2NvbnRpbnVhdGlvbicsIGFuZCA8Y29kZT5jYzwvY29kZT4gZm9yICdjdXJyZW50CiAgICBjb250aW51YXRpb24nICYjeDIwMTU7IHRoYXQgbGFzdCB2YXJpYWJsZSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBmdW5jdGlvbiB0bwogICAgY29udGludWUgd2l0aCwgd2hlbiB5aWVsZGluZyBhIHZhbHVlIHRvIHRoZSBvdXRzaWRlIHdvcmxkLiBFdmVyeSB0aW1lCiAgICBjb250cm9sIGxlYXZlcyB0aGlzIGZ1bmN0aW9uLCBpdCBoYXMgdG8gbWFrZSBzdXJlIHRoYXQgPGNvZGU+Y2M8L2NvZGU+IGlzIHNldCB0bwogICAgYSBzdWl0YWJsZSB2YWx1ZSwgd2hpY2ggaXMgd2hhdCA8Y29kZT55aWVsZDwvY29kZT4gYW5kIDxjb2RlPnN0b3A8L2NvZGU+IHRha2UgY2FyZSBvZi48L3A+CgogICAgPHA+VGhlIG9iamVjdCB0aGF0IGlzIHJldHVybmVkIGNvbnRhaW5zIGEgPGNvZGU+bmV4dDwvY29kZT4gbWV0aG9kLCB3aGljaCBpcwogICAgTW9jaGlLaXQncyBpZGVhIG9mIGFuIGl0ZXJhdG9yLCBhbmQgdGhlIGluaXRpYWwgY29udGludWF0aW9uIGp1c3QKICAgIHRocm93cyBhIDxjb2RlPlN0b3BJdGVyYXRpb248L2NvZGU+LCB3aGljaCBpcyBob3cgTW9jaGlLaXQgc2lnbmFscyB0aGF0IGFuCiAgICBpdGVyYXRvciBoYXMgcmVhY2hlZCBpdHMgZW5kLjwvcD4KCiAgICA8cD5UaGUgZmlyc3QgbGluZXMgb2YgPGNvZGU+c2Nhbk5vZGU8L2NvZGU+IGV4dGVuZCB0aGUgY29udGludWF0aW9uIHdpdGggdGhlIHRhc2sgb2YKICAgIHNjYW5uaW5nIHRoZSBuZXh0IG5vZGUsIGlmIHRoZXJlIGlzIGEgbmV4dCBub2RlLiBUaGUgcmVzdCBvZiB0aGUKICAgIGZ1bmN0aW9uIGRlY2lkZXMgd2hhdCBraW5kIG9mIHZhbHVlIHRvIDxjb2RlPnlpZWxkPC9jb2RlPi4gTm90ZSB0aGF0IHRoaXMgaXMgYQogICAgcmF0aGVyIHRyaXZpYWwgZXhhbXBsZSBvZiB0aGlzIHRlY2huaXF1ZSwgc2luY2UgdGhlIHByb2Nlc3Mgb2YgZ29pbmcKICAgIHRocm91Z2ggdGhlc2Ugbm9kZXMgaXMgYmFzaWNhbGx5IGxpbmVhciAoaXQgd2FzIG11Y2gsIG11Y2ggbW9yZQogICAgY29tcGxleCBpbiBlYXJsaWVyIHZlcnNpb25zKSwgYnV0IHN0aWxsIHRoZSB0cmljayB3aXRoIHRoZQogICAgY29udGludWF0aW9ucyBtYWtlcyB0aGUgY29kZSBzaG9ydGVyIGFuZCwgZm9yIHRob3NlIGluIHRoZSBrbm93LAogICAgY2xlYXJlciB0aGFuIHRoZSBlcXVpdmFsZW50ICdzdG9yaW5nIHRoZSBpdGVyYXRvciBzdGF0ZSBpbiB2YXJpYWJsZXMnCiAgICBhcHByb2FjaC48L3A+CgogICAgPHA+VGhlIG5leHQgaXRlcmF0b3IgdGhhdCB0aGUgaW5wdXQgcGFzc2VzIHRocm91Z2ggaXMgdGhlCiAgICB0b2tlbml6ZXIuIFdlbGwsIGFjdHVhbGx5LCB0aGVyZSBpcyBhbm90aGVyIGl0ZXJhdG9yIGluIGJldHdlZW4KICAgIHRoYXQgaXNvbGF0ZXMgdGhlIHRva2VuaXplciBmcm9tIHRoZSBmYWN0IHRoYXQgdGhlIERPTSB0cmF2ZXJzYWwKICAgIHlpZWxkcyBhIGJ1bmNoIG9mIHNlcGFyYXRlIHN0cmluZ3MsIGFuZCBwcmVzZW50cyB0aGVtIGFzIGEgc2luZ2xlCiAgICBjaGFyYWN0ZXIgc3RyZWFtICh3aXRoIGEgY29udmVuaWVudCA8Y29kZT5wZWVrPC9jb2RlPiBvcGVyYXRpb24pLAogICAgYnV0IHRoaXMgaXMgbm90IGEgdmVyeSBpbnRlcmVzdGluZyBvbmUuIFdoYXQgdGhlIHRva2VuaXplciByZXR1cm5zCiAgICBpcyBhIHN0cmVhbSBvZiB0b2tlbiBvYmplY3RzLCBlYWNoIG9mIHdoaWNoIGhhcyBhCiAgICA8Y29kZT52YWx1ZTwvY29kZT4sIGl0cyB0ZXh0dWFsIGNvbnRlbnQsIGEgPGNvZGU+dHlwZTwvY29kZT4sIGxpa2UKICAgIDxjb2RlPiJ2YXJpYWJsZSI8L2NvZGU+LCA8Y29kZT4ib3BlcmF0b3IiPC9jb2RlPiwgb3IganVzdCBpdHNlbGYsCiAgICA8Y29kZT4ieyI8L2NvZGU+IGZvciBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBzaWduaWZpY2FudAogICAgcHVuY3R1YXRpb24gb3Igc3BlY2lhbCBrZXl3b3Jkcy4gVGhleSBhbHNvIGhhdmUgYQogICAgPGNvZGU+c3R5bGU8L2NvZGU+LCB3aGljaCBpcyB1c2VkIGxhdGVyIGJ5IHRoZSBoaWdobGlnaHRlciB0byBnaXZlCiAgICB0aGVpciA8Y29kZT5zcGFuPC9jb2RlPiBlbGVtZW50cyBhIGNsYXNzIG5hbWUgKHRoZSBwYXJzZXIgd2lsbAogICAgc3RpbGwgYWRqdXN0IHRoaXMgaW4gc29tZSBjYXNlcykuPC9wPgoKICAgIDxwPkF0IGZpcnN0IEkgYXNzdW1lZCB0aGUgcGFyc2VyIHdvdWxkIGhhdmUgdG8gdGFsayBiYWNrIHRvIHRoZQogICAgdG9rZW5pemVyIGFib3V0IHRoZSBjdXJyZW50IGNvbnRleHQsIGluIG9yZGVyIHRvIGJlIGFibGUgdG8KICAgIGRpc3Rpbmd1aXNoIHRob3NlIGFjY3Vyc2VkIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZnJvbSBkaXZpc2lvbnMsIGJ1dAogICAgaXQgc2VlbXMgdGhhdCByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBvbmx5IGFsbG93ZWQgaWYgdGhlIHByZXZpb3VzCiAgICAobm9uLXdoaXRlc3BhY2UsIG5vbi1jb21tZW50KSB0b2tlbiB3YXMgZWl0aGVyIGFuIG9wZXJhdG9yLCBhCiAgICBrZXl3b3JkIGxpa2UgPGNvZGU+bmV3PC9jb2RlPiBvciA8Y29kZT50aHJvdzwvY29kZT4sIG9yIGEgc3BlY2lmaWMKICAgIGtpbmQgb2YgcHVuY3R1YXRpb24gKDxjb2RlPiJbe30oLDs6IjwvY29kZT4pIHRoYXQgaW5kaWNhdGVzIGEgbmV3CiAgICBleHByZXNzaW9uIGNhbiBiZSBzdGFydGVkIGhlcmUuIFRoaXMgbWFkZSB0aGluZ3MgY29uc2lkZXJhYmx5CiAgICBlYXNpZXIsIHNpbmNlIHRoZSAncmVnZXhwIG9yIG5vIHJlZ2V4cCcgcXVlc3Rpb24gY291bGQgc3RheQogICAgZW50aXJlbHkgd2l0aGluIHRoZSB0b2tlbml6ZXIuPC9wPgoKICAgIDxwPlRoZSBuZXh0IHN0ZXAsIHRoZW4sIGlzIHRoZSBwYXJzZXIuIEl0IGRvZXMgbm90IGRvIGEgdmVyeQogICAgdGhvcm91Z2ggam9iIGJlY2F1c2UsIGZpcnN0bHksIGl0IGhhcyB0byBiZSBmYXN0LCBhbmQgc2Vjb25kbHksIGl0CiAgICBzaG91bGQgbm90IGdvIHRvIHBpZWNlcyB3aGVuIGZlZCBhbiBpbmNvcnJlY3QgcHJvZ3JhbS4gU28gb25seQogICAgc3VwZXJmaWNpYWwgY29uc3RydWN0cyBhcmUgcmVjb2duaXplZCwga2V5d29yZHMgdGhhdCByZXNlbWJsZSBlYWNoCiAgICBvdGhlciBpbiBzeW50YXgsIHN1Y2ggYXMgPGNvZGU+d2hpbGU8L2NvZGU+IGFuZCA8Y29kZT5pZjwvY29kZT4sCiAgICBhcmUgdHJlYXRlZCBpbiBwcmVjaXNlbHkgdGhlIHNhbWUgd2F5LCBhcyBhcmUgPGNvZGU+dHJ5PC9jb2RlPiBhbmQKICAgIDxjb2RlPmVsc2U8L2NvZGU+ICYjeDIwMTU7IHRoZSBwYXJzZXIgZG9lc24ndCBtaW5kIGlmIGFuCiAgICA8Y29kZT5lbHNlPC9jb2RlPiBhcHBlYXJzIHdpdGhvdXQgYW4gPGNvZGU+aWY8L2NvZGU+LiBTdHVmZiB0aGF0CiAgICBiaW5kcyB2YXJpYWJsZXMsIDxjb2RlPnZhcjwvY29kZT4sIDxjb2RlPmZ1bmN0aW9uPC9jb2RlPiwgYW5kCiAgICA8Y29kZT5jYXRjaDwvY29kZT4gdG8gYmUgcHJlY2lzZSwgaXMgdHJlYXRlZCB3aXRoIG1vcmUgY2FyZSwKICAgIGJlY2F1c2UgdGhlIHBhcnNlciB3YW50cyB0byBrbm93IGFib3V0IGxvY2FsIHZhcmlhYmxlcy48L3A+CgogICAgPHA+SW5zaWRlIHRoZSBwYXJzZXIsIHRocmVlIGtpbmRzIG9mIGNvbnRleHQgYXJlIHN0b3JlZC4gRmlyc3RseSwgYSBzZXQKICAgIG9mIGtub3duIGxvY2FsIHZhcmlhYmxlcywgd2hpY2ggaXMgdXNlZCB0byBhZGp1c3QgdGhlIHN0eWxlIG9mCiAgICB2YXJpYWJsZSB0b2tlbnMuIEV2ZXJ5IHRpbWUgdGhlIHBhcnNlciBlbnRlcnMgYSBmdW5jdGlvbiwgYSBuZXcgc2V0IG9mCiAgICB2YXJpYWJsZXMgaXMgY3JlYXRlZC4gSWYgdGhlcmUgd2FzIGFscmVhZHkgc3VjaCBhIHNldCAoZW50ZXJpbmcgYW4KICAgIGlubmVyIGZ1bmN0aW9uKSwgYSBwb2ludGVyIHRvIHRoZSBvbGQgb25lIGlzIHN0b3JlZCBpbiB0aGUgbmV3IG9uZS4gQXQKICAgIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLCB0aGUgY3VycmVudCB2YXJpYWJsZSBzZXQgaXMgJ3BvcHBlZCcgb2ZmIGFuZAogICAgdGhlIHByZXZpb3VzIG9uZSBpcyByZXN0b3JlZC48L3A+CgogICAgPHA+VGhlIHNlY29uZCBraW5kIG9mIGNvbnRleHQgaXMgdGhlIGxleGljYWwgY29udGV4dCwgdGhpcyBrZWVwcyB0cmFjayBvZgogICAgd2hldGhlciB3ZSBhcmUgaW5zaWRlIGEgc3RhdGVtZW50LCBibG9jaywgb3IgbGlzdC4gTGlrZSB0aGUgdmFyaWFibGUKICAgIGNvbnRleHQsIGl0IGFsc28gZm9ybXMgYSBzdGFjayBvZiBjb250ZXh0cywgd2l0aCBlYWNoIG9uZSBjb250YWluaW5nIGEKICAgIHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzIG9uZXMgc28gdGhhdCB0aGV5IGNhbiBiZSBwb3BwZWQgb2ZmIGFnYWluIHdoZW4KICAgIHRoZXkgYXJlIGZpbmlzaGVkLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgZm9yIGluZGVudGF0aW9uLiBFdmVyeQogICAgdGltZSB0aGUgcGFyc2VyIGVuY291bnRlcnMgYSBuZXdsaW5lIHRva2VuLCBpdCBhdHRhY2hlcyB0aGUgY3VycmVudAogICAgbGV4aWNhbCBjb250ZXh0IGFuZCBhICdjb3B5JyBvZiBpdHNlbGYgKG1vcmUgYWJvdXQgdGhhdCBsYXRlcikgdG8gdGhpcwogICAgdG9rZW4uPC9wPgoKICAgIDxwPlRoZSB0aGlyZCBjb250ZXh0IGlzIGEgY29udGludWF0aW9uIGNvbnRleHQuIFRoaXMgcGFyc2VyIGRvZXMgbm90IHVzZQogICAgc3RyYWlnaHQgY29udGludWF0aW9uIHN0eWxlLCBpbnN0ZWFkIGl0IHVzZXMgYSBzdGFjayBvZiBhY3Rpb25zIHRoYXQKICAgIGhhdmUgdG8gYmUgcGVyZm9ybWVkLiBUaGVzZSBhY3Rpb25zIGFyZSBzaW1wbGUgZnVuY3Rpb25zLCBhIGtpbmQgb2YKICAgIG1pbmlsYW5ndWFnZSwgdGhleSBhY3Qgb24gdG9rZW5zLCBhbmQgZGVjaWRlIHdoYXQga2luZCBvZiBuZXcgYWN0aW9ucwogICAgc2hvdWxkIGJlIHB1c2hlZCBvbnRvIHRoZSBzdGFjay4gSGVyZSBhcmUgc29tZSBleGFtcGxlczo8L3A+Cgo8cHJlIGNsYXNzPSJjb2RlIj48c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZnVuY3Rpb248L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+ZXhwcmVzc2lvbjwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj50eXBlPC9zcGFuPil7CiAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnR5cGU8L3NwYW4+IGluIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+YXRvbWljVHlwZXM8L3NwYW4+KSA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbnQ8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+bWF5YmVvcGVyYXRvcjwvc3Bhbj4pOwogIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5lbHNlPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+aWY8L3NwYW4+ICg8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+dHlwZTwvc3Bhbj4gPT0gPHNwYW4gY2xhc3M9ImpzLXN0cmluZyI+JnF1b3Q7ZnVuY3Rpb24mcXVvdDs8L3NwYW4+KSA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbnQ8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+ZnVuY3Rpb25kZWY8L3NwYW4+KTsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnR5cGU8L3NwYW4+ID09IDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90OygmcXVvdDs8L3NwYW4+KSA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbnQ8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+cHVzaGxleDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXN0cmluZyI+JnF1b3Q7bGlzdCZxdW90Ozwvc3Bhbj4pLCA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmV4cHJlc3Npb248L3NwYW4+LCA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmV4cGVjdDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXN0cmluZyI+JnF1b3Q7KSZxdW90Ozwvc3Bhbj4pLCA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPnBvcGxleDwvc3Bhbj4pOwogIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5lbHNlPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+aWY8L3NwYW4+ICg8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+dHlwZTwvc3Bhbj4gPT0gPHNwYW4gY2xhc3M9ImpzLXN0cmluZyI+JnF1b3Q7b3BlcmF0b3ImcXVvdDs8L3NwYW4+KSA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbnQ8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+ZXhwcmVzc2lvbjwvc3Bhbj4pOwogIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5lbHNlPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+aWY8L3NwYW4+ICg8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+dHlwZTwvc3Bhbj4gPT0gPHNwYW4gY2xhc3M9ImpzLXN0cmluZyI+JnF1b3Q7WyZxdW90Ozwvc3Bhbj4pIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+Y29udDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5wdXNobGV4PC9zcGFuPig8c3BhbiBjbGFzcz0ianMtc3RyaW5nIj4mcXVvdDtsaXN0JnF1b3Q7PC9zcGFuPiksIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+Y29tbWFzZXA8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+ZXhwcmVzc2lvbjwvc3Bhbj4pLCA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmV4cGVjdDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXN0cmluZyI+JnF1b3Q7XSZxdW90Ozwvc3Bhbj4pLCA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPnBvcGxleDwvc3Bhbj4pOwogIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5lbHNlPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+aWY8L3NwYW4+ICg8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+dHlwZTwvc3Bhbj4gPT0gPHNwYW4gY2xhc3M9ImpzLXN0cmluZyI+JnF1b3Q7eyZxdW90Ozwvc3Bhbj4pIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+Y29udDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5wdXNobGV4PC9zcGFuPig8c3BhbiBjbGFzcz0ianMtc3RyaW5nIj4mcXVvdDtsaXN0JnF1b3Q7PC9zcGFuPiksIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+Y29tbWFzZXA8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+b2JqcHJvcDwvc3Bhbj4pLCA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmV4cGVjdDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXN0cmluZyI+JnF1b3Q7fSZxdW90Ozwvc3Bhbj4pLCA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPnBvcGxleDwvc3Bhbj4pOwogIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5lbHNlPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+aWY8L3NwYW4+ICg8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+dHlwZTwvc3Bhbj4gPT0gPHNwYW4gY2xhc3M9ImpzLXN0cmluZyI+JnF1b3Q7a2V5d29yZCBjJnF1b3Q7PC9zcGFuPikgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5jb250PC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmV4cHJlc3Npb248L3NwYW4+KTsKfQoKPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmZ1bmN0aW9uPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmJsb2NrPC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGVkZWYiPnR5cGU8L3NwYW4+KXsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+aWY8L3NwYW4+ICg8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+dHlwZTwvc3Bhbj4gPT0gPHNwYW4gY2xhc3M9ImpzLXN0cmluZyI+JnF1b3Q7fSZxdW90Ozwvc3Bhbj4pIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+Y29udDwvc3Bhbj4oKTsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5wYXNzPC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPnN0YXRlbWVudDwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+YmxvY2s8L3NwYW4+KTsKfTwvcHJlPgoKICAgIDxwPlRoZSBmdW5jdGlvbiA8Y29kZT5jb250PC9jb2RlPiAoZm9yIGNvbnRpbnVlKSwgd2lsbCBwdXNoIHRoZSBhY3Rpb25zIGl0IGlzIGdpdmVuCiAgICBvbnRvIHRoZSBzdGFjayAoaW4gcmV2ZXJzZSBvcmRlciwgc28gdGhhdCB0aGUgZmlyc3Qgb25lIHdpbGwgYmUgcG9wcGVkCiAgICBmaXJzdCkuIEFjdGlvbnMgc3VjaCBhcyA8Y29kZT5wdXNobGV4PC9jb2RlPiBhbmQgPGNvZGU+cG9wbGV4PC9jb2RlPiBtZXJlbHkgYWRqdXN0IHRoZQogICAgbGV4aWNhbCBlbnZpcm9ubWVudCwgd2hpbGUgb3RoZXJzLCBzdWNoIGFzIDxjb2RlPmV4cHJlc3Npb248L2NvZGU+IGl0c2VsZiwgZG8KICAgIGFjdHVhbCBwYXJzaW5nLiA8Y29kZT5wYXNzPC9jb2RlPiwgYXMgc2VlbiBpbiA8Y29kZT5ibG9jazwvY29kZT4sIGlzIHNpbWlsYXIgdG8gPGNvZGU+Y29udDwvY29kZT4sIGJ1dAogICAgaXQgZG9lcyBub3QgJ2NvbnN1bWUnIHRoZSBjdXJyZW50IHRva2VuLCBzbyB0aGUgbmV4dCBhY3Rpb24gd2lsbCBhZ2FpbgogICAgc2VlIHRoaXMgc2FtZSB0b2tlbi4gSW4gPGNvZGU+YmxvY2s8L2NvZGU+LCB0aGlzIGhhcHBlbnMgd2hlbiB0aGUgZnVuY3Rpb24KICAgIGRldGVybWluZXMgdGhhdCB3ZSBhcmUgbm90IGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrIHlldCwgc28gaXQgcHVzaGVzCiAgICB0aGUgPGNvZGU+c3RhdGVtZW50PC9jb2RlPiBmdW5jdGlvbiB3aGljaCB3aWxsIGludGVycHJldCB0aGUgY3VycmVudCB0b2tlbiBhcyB0aGUKICAgIHN0YXJ0IG9mIGEgc3RhdGVtZW50LjwvcD4KCiAgICA8cD5UaGVzZSBhY3Rpb25zIGFyZSBjYWxsZWQgYnkgYSAnZHJpdmVyJyBmdW5jdGlvbiwgd2hpY2ggZmlsdGVycyBvdXQgdGhlCiAgICB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cywgc28gdGhhdCB0aGUgcGFyc2VyIGFjdGlvbnMgZG8gbm90IGhhdmUgdG8KICAgIHRoaW5rIGFib3V0IHRob3NlLCBhbmQga2VlcHMgdHJhY2sgb2Ygc29tZSB0aGluZ3MgbGlrZSB0aGUgaW5kZW50YXRpb24KICAgIG9mIHRoZSBjdXJyZW50IGxpbmUgYW5kIHRoZSBjb2x1bW4gYXQgd2hpY2ggdGhlIGN1cnJlbnQgdG9rZW4gZW5kcywKICAgIHdoaWNoIGFyZSBzdG9yZWQgaW4gdGhlIGxleGljYWwgY29udGV4dCBhbmQgdXNlZCBmb3IgaW5kZW50YXRpb24uCiAgICBBZnRlciBjYWxsaW5nIGFuIGFjdGlvbiwgaWYgdGhlIGFjdGlvbiBjYWxsZWQgPGNvZGU+Y29udDwvY29kZT4sIHRoaXMgZHJpdmVyCiAgICBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgY3VycmVudCB0b2tlbiwgaWYgPGNvZGU+cGFzczwvY29kZT4gKG9yIG5vdGhpbmcpIHdhcwogICAgY2FsbGVkLCBpdCB3aWxsIGltbWVkaWF0ZWx5IGNvbnRpbnVlIHdpdGggdGhlIG5leHQgYWN0aW9uLjwvcD4KCiAgICA8cD5UaGlzIGdvZXMgdG8gc2hvdyB0aGF0IGl0IGlzIHZpYWJsZSB0byB3cml0ZSBhIHF1aXRlIGVsYWJvcmF0ZQogICAgbWluaWxhbmd1YWdlIGluIGEgbWFjcm8tbGVzcyBsYW5ndWFnZSBsaWtlIEphdmFTY3JpcHQuIEkgZG9uJ3QgdGhpbmsKICAgIGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGRvIHNvbWV0aGluZyBsaWtlIHRoaXMgd2l0aG91dCBjbG9zdXJlcyAob3IKICAgIHNpbWlsYXJseSBwb3dlcmZ1bCBhYnN0cmFjdGlvbikgdGhvdWdoLCBJJ3ZlIGNlcnRhaW5seSBuZXZlciBzZWVuCiAgICBhbnl0aGluZyBsaWtlIGl0IGluIEphdmEgY29kZS48L3A+CgogICAgPHA+VGhlIHdheSBhICdjb3B5JyBvZiB0aGUgcGFyc2VyIHdhcyBwcm9kdWNlZCBzaG93cyBhIG5pY2UgdXNhZ2UKICAgIG9mIGNsb3N1cmVzLiBMaWtlIHdpdGggdGhlIERPTSB0cmFuc2Zvcm1lciBzaG93biBhYm92ZSwgbW9zdCBvZgogICAgdGhlIGxvY2FsIHN0YXRlIG9mIHRoZSBwYXJzZXIgaXMgaGVsZCBpbiBhIGNsb3N1cmUgcHJvZHVjZWQgYnkKICAgIGNhbGxpbmcgPGNvZGU+cGFyc2Uoc3RyZWFtKTwvY29kZT4uIFRoZSBmdW5jdGlvbgogICAgPGNvZGU+Y29weTwvY29kZT4sIHdoaWNoIGlzIGxvY2FsIHRvIHRoZSBwYXJzZXIgZnVuY3Rpb24sIHByb2R1Y2VzCiAgICBhIG5ldyBjbG9zdXJlLCB3aXRoIGNvcGllcyBvZiBhbGwgdGhlIHJlbGV2YW50IHZhcmlhYmxlczo8L3A+Cgo8cHJlIGNsYXNzPSJjb2RlIj48c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZnVuY3Rpb248L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+Y29weTwvc3Bhbj4oKXsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+dmFyPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGVkZWYiPl9jb250ZXh0PC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+Y29udGV4dDwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+X2xleGljYWw8L3NwYW4+ID0gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5sZXhpY2FsPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj5fYWN0aW9uczwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvcHlBcnJheTwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5hY3Rpb25zPC9zcGFuPik7CgogIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5yZXR1cm48L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5mdW5jdGlvbjwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj5fdG9rZW5zPC9zcGFuPil7CiAgICA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbnRleHQ8L3NwYW4+ID0gPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPl9jb250ZXh0PC9zcGFuPjsKICAgIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+bGV4aWNhbDwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+X2xleGljYWw8L3NwYW4+OwogICAgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5hY3Rpb25zPC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+Y29weUFycmF5PC9zcGFuPig8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+X2FjdGlvbnM8L3NwYW4+KTsKICAgIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+dG9rZW5zPC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5fdG9rZW5zPC9zcGFuPjsKICAgIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5yZXR1cm48L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+cGFyc2VyPC9zcGFuPjsKICB9Owp9PC9wcmU+CgogICAgPHA+V2hlcmUgPGNvZGU+cGFyc2VyPC9jb2RlPiBpcyB0aGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIDxjb2RlPm5leHQ8L2NvZGU+IChkcml2ZXIpCiAgICBmdW5jdGlvbiwgYW5kIGEgcmVmZXJlbmNlIHRvIHRoaXMgPGNvZGU+Y29weTwvY29kZT4gZnVuY3Rpb24uIFdoZW4gdGhlIGZ1bmN0aW9uCiAgICB0aGF0IDxjb2RlPmNvcHk8L2NvZGU+IHByb2R1Y2VzIGlzIGNhbGxlZCB3aXRoIGEgdG9rZW4gc3RyZWFtIGFzIGFyZ3VtZW50LCBpdAogICAgdXBkYXRlcyB0aGUgbG9jYWwgdmFyaWFibGVzIGluIHRoZSBwYXJzZXIgY2xvc3VyZSwgYW5kIHJldHVybnMgdGhlCiAgICBjb3JyZXNwb25kaW5nIGl0ZXJhdG9yIG9iamVjdC48L3A+CgogICAgPHA+TW92aW5nIG9uLCB3ZSBnZXQgdG8gdGhlIGxhc3Qgc3RvcCBpbiB0aGlzIGNoYWluIG9mIGdlbmVyYXRvcnMsIHRoZQogICAgYWN0dWFsIGhpZ2hsaWdodGVyLiBZb3UgY2FuIHZpZXcgdGhpcyBvbmUgYXMgdGFraW5nIHR3byBzdHJlYW1zIGFzCiAgICBpbnB1dCwgb24gdGhlIG9uZSBoYW5kIHRoZXJlIGlzIHRoZSBzdHJlYW0gb2YgdG9rZW5zIGZyb20gdGhlIHBhcnNlciwKICAgIGFuZCBvbiB0aGUgb3RoZXIgaGFuZCB0aGVyZSBpcyB0aGUgRE9NIHRyZWUgYXMgbGVmdCBieSB0aGUgRE9NCiAgICB0cmFuc2Zvcm1lci4gSWYgZXZlcnl0aGluZyB3ZW50IGNvcnJlY3RseSwgdGhlc2UgdHdvIHNob3VsZCBiZQogICAgc3luY2hyb25pemVkLiBUaGUgaGlnaGxpZ2h0ZXIgY2FuIGxvb2sgYXQgdGhlIGN1cnJlbnQgdG9rZW4sIHNlZSBpZgogICAgdGhlIDxjb2RlPnNwYW48L2NvZGU+IGluIHRoZSBET00gdHJlZSBjb3JyZXNwb25kcyB0byBpdCAoaGFzIHRoZSBzYW1lIHRleHQKICAgIGNvbnRlbnQsIGFuZCB0aGUgY29ycmVjdCBjbGFzcyksIGFuZCBpZiBub3QgaXQgY2FuIGNob3AgdXAgdGhlIERPTQogICAgbm9kZXMgdG8gY29uZm9ybSB0byB0aGUgdG9rZW5zLjwvcD4KCiAgICA8cD5FdmVyeSB0aW1lIHRoZSBwYXJzZXIgeWllbGRzIGEgbmV3bGluZSB0b2tlbiwgdGhlIGhpZ2hsaWdoZXIKICAgIGVuY291bnRlcnMgYSA8Y29kZT5icjwvY29kZT4gZWxlbWVudCBpbiB0aGUgRE9NIHN0cmVhbS4gSXQgdGFrZXMgdGhlIGNvcHkgb2YgdGhlCiAgICBwYXJzZXIgYW5kIHRoZSBsZXhpY2FsIGNvbnRleHQgZnJvbSB0aGlzIHRva2VuIGFuZCBhdHRhY2hlcyB0aGVtIHRvCiAgICB0aGUgRE9NIG5vZGUuIFRoaXMgd2F5LCBhIG5ldyBoaWdobGlnaHRpbmcgcHJvY2VzcyBjYW4gYmUgc3RhcnRlZCBmcm9tCiAgICB0aGF0IG5vZGUgYnkgcmUtc3RhcnRpbmcgdGhlIGNvcHkgb2YgdGhlIHBhcnNlciB3aXRoIGEgbmV3IHRva2VuCiAgICBzdHJlYW0sIHdoaWNoIHJlYWRzIHRva2VucyBmcm9tIHRoZSBET00gbm9kZXMgc3RhcnRpbmcgYXQgdGhhdCA8Y29kZT5icjwvY29kZT4KICAgIGVsZW1lbnQsIGFuZCB0aGUgaW5kZW50YXRpb24gY29kZSBjYW4gdXNlIHRoZSBsZXhpY2FsIGNvbnRleHQKICAgIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCBpbmRlbnRhdGlvbiBhdCB0aGF0IHBvaW50LjwvcD4KCiAgICA8aDI+U2VsZWN0aW9uIHdvZXM8L2gyPgoKICAgIDxwPkFsbCB0aGUgYWJvdmUgY2FuIGJlIGRvbmUgdXNpbmcgdGhlIERPTSBpbnRlcmZhY2UgdGhhdCBhbGwgbWFqb3IKICAgIGJyb3dzZXJzIGhhdmUgaW4gY29tbW9uLCBhbmQgd2hpY2ggaXMgcmVsYXRpdmVseSBmcmVlIG9mIHdlaXJkIGJ1Z3MKICAgIGFuZCBhYmJlcnJhdGlvbnMuIEhvd2V2ZXIsIHdoZW4gdGhlIHVzZXIgaXMgdHlwaW5nIGluIG5ldyBjb2RlLCB0aGlzCiAgICBtdXN0IGFsc28gYmUgaGlnaGxpZ2h0ZWQuIEZvciB0aGlzIHRvIGhhcHBlbiwgdGhlIHByb2dyYW0gbXVzdCBrbm93CiAgICB3aGVyZSB0aGUgY3Vyc29yIGN1cnJlbnRseSBpcywgYW5kIGJlY2F1c2UgaXQgbXVja3MgdXAgdGhlIERPTSB0cmVlLAogICAgaXQgaGFzIHRvIHJlc3RvcmUgdGhpcyBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgZG9pbmcgdGhlIGhpZ2hsaWdodGluZy48L3A+CgogICAgPHA+UmUtaGlnaGxpZ2h0aW5nIGFsd2F5cyBoYXBwZW5zIHBlciBsaW5lLCBiZWNhdXNlIHRoZSBjb3B5IG9mIHRoZQogICAgcGFyc2VyIGlzIHN0b3JlZCBvbmx5IGF0IHRoZSBlbmQgb2YgbGluZXMuIERvaW5nIHRoaXMgZXZlcnkgdGltZSB0aGUKICAgIHVzZXIgcHJlc3NlcyBhIGtleSBpcyB0ZXJyaWJseSBzbG93IGFuZCBvYm5veGlvdXMsIHNvIHdoYXQgSSBkaWQgd2FzCiAgICBrZWVwIGEgbGlzdCBvZiAnZGlydHknIG5vZGVzLCBhbmQgYXMgc29vbiBhcyB0aGUgdXNlciBkaWRuJ3QgdHlwZQogICAgYW55dGluZyBmb3IgMzAwIG1pbGxpc2Vjb25kcyB0aGUgcHJvZ3JhbSBzdGFydHMgcmUtaGlnaGxpZ2h0aW5nIHRoZXNlCiAgICBub2Rlcy4gSWYgaXQgZmluZHMgbW9yZSB0aGFuIHRlbiBsaW5lcyBtdXN0IGJlIHJlLXBhcnNlZCwgaXQgZG9lcyBvbmx5CiAgICB0ZW4gYW5kIHdhaXRzIGFub3RoZXIgMzAwIG1pbGxpc2Vjb25kcyBiZWZvcmUgaXQgY29udGludWVzLCB0aGlzIHdheQogICAgdGhlIGJyb3dzZXIgbmV2ZXIgZnJlZXplcyB1cCBlbnRpcmVseS48L3A+CgogICAgPHA+QXMgbWVudGlvbmVkIGVhcmxpZXIsIEludGVybmV0IEV4cGxvcmVyJ3Mgc2VsZWN0aW9uIG1vZGVsIGlzIG5vdCB0aGUKICAgIG1vc3QgcHJhY3RpY2FsIG9uZS4gTXkgYXR0ZW1wdHMgdG8gYnVpbGQgYSB3cmFwcGVyIHRoYXQgbWFrZXMgaXQgbG9vawogICAgbGlrZSB0aGUgVzNDIG1vZGVsIGFsbCBzdHJhbmRlZC4gSW4gdGhlIGVuZCBJIGNhbWUgdG8gdGhlIGNvbmNsdXNpb24KICAgIHRoYXQgSSBvbmx5IG5lZWRlZCB0d28gb3BlcmF0aW9uczo8L3A+CgogICAgPHVsPgogICAgICA8bGk+Q3JlYXRpbmcgYSBzZWxlY3Rpb24gJ3NuYXBzaG90JyB0aGF0IGNhbiBiZSByZXN0b3JlZCBhZnRlcgogICAgICBoaWdobGlnaHRpbmcsIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBzdGlsbCB3b3JrcyBpZiBzb21lIG9mIHRoZSBub2RlcwogICAgICB0aGF0IHdlcmUgc2VsZWN0ZWQgYXJlIHJlcGxhY2VkIGJ5IG90aGVyIG5vZGVzIHdpdGggdGhlIHNhbWUKICAgICAgc2l6ZSBidXQgYSBkaWZmZXJlbnQgc3RydWN0dXJlLjwvbGk+CiAgICAgIDxsaT5GaW5kaW5nIHRoZSB0b3AtbGV2ZWwgbm9kZSBhcm91bmQgb3IgYmVmb3JlIHRoZSBjdXJzb3IsIHRvIG1hcmsgaXQKICAgICAgZGlydHkgb3IgdG8gaW5zZXJ0IGluZGVudGF0aW9uIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIHRoYXQgbGluZS48L2xpPgogICAgPC91bD4KCiAgICA8cD5JdCB0dXJucyBvdXQgdGhhdCB0aGUgcGl4ZWwtYmFzZWQgc2VsZWN0aW9uIG1vZGVsIHRoYXQgSW50ZXJuZXQKICAgIEV4cGxvcmVyIHVzZXMsIHdoaWNoIGFsd2F5cyBzZWVtZWQgY29tcGxldGVseSBsdWRyaWNyb3VzIHRvIG1lLCBpcwogICAgcGVyZmVjdCBmb3IgdGhlIGZpcnN0IGNhc2UuIFNpbmNlIHRoZSBET00gdHJhbnNmb3JtYXRpb24gKGdlbmVyYWxseSkKICAgIGRvZXMgbm90IGNoYW5nZSB0aGUgcG9zaXRpb24gb2YgdGhpbmdzLCBzdG9yaW5nIHRoZSBwaXhlbCBvZmZzZXRzIG9mCiAgICB0aGUgc2VsZWN0aW9uIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJlc3RvcmUgdGhhdCBzYW1lIHNlbGVjdGlvbiwgbmV2ZXIKICAgIG1pbmQgd2hhdCBoYXBwZW5lZCB0byB0aGUgdW5kZXJseWluZyBET00gc3RydWN0dXJlLjwvcD4KCiAgICA8cD5bTGF0ZXIgYWRkaXRpb246IE5vdGUgdGhhdCB0aGlzLCBkdWUgdG8gdGhlIHZlcnkgcmFuZG9tIGRlc2lnbgogICAgb2YgdGhlIDxhCiAgICBocmVmPSJodHRwOi8vbXNkbjIubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM1ODcyKFZTLjg1KS5hc3B4IyI+VGV4dFJhbmdlCiAgICBpbnRlcmZhY2U8L2E+LCBvbmx5IHJlYWxseSB3b3JrcyB3aGVuIHRoZSB3aG9sZSBzZWxlY3Rpb24gZmFsbHMKICAgIHdpdGhpbiB0aGUgdmlzaWJsZSBwYXJ0IG9mIHRoZSBkb2N1bWVudC5dPC9wPgoKICAgIDxwPkRvaW5nIHRoZSBzYW1lIHdpdGggdGhlIFczQyBzZWxlY3Rpb24gbW9kZWwgaXMgYSBsb3QgaGFyZGVyLiBXaGF0IEkKICAgIGVuZGVkIHVwIHdpdGggd2FzIHRoaXM6PC9wPgoKICAgIDx1bD4KICAgICAgPGxpPkNyZWF0ZSBhbiBvYmplY3QgcG9pbnRpbmcgdG8gdGhlIG5vZGVzIGF0IHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZQogICAgICBzZWxlY3Rpb24sIGFuZCB0aGUgb2Zmc2V0IHdpdGhpbiB0aG9zZSBub2Rlcy4gVGhpcyBpcyBiYXNpY2FsbHkgdGhlCiAgICAgIGluZm9ybWF0aW9uIHRoYXQgdGhlIDxjb2RlPlJhbmdlPC9jb2RlPiBvYmplY3QgZ2l2ZXMgeW91LjwvbGk+CiAgICAgIDxsaT5NYWtlIHJlZmVyZW5jZXMgZnJvbSB0aGVzZSBub2RlcyBiYWNrIHRvIHRoYXQgb2JqZWN0LjwvbGk+CiAgICAgIDxsaT5XaGVuIHJlcGxhY2luZyAocGFydCBvZikgYSBub2RlIHdpdGggYW5vdGhlciBvbmUsIGNoZWNrIGZvciBzdWNoIGEKICAgICAgcmVmZXJlbmNlLCBhbmQgd2hlbiBpdCBpcyBwcmVzZW50LCBjaGVjayB3aGV0aGVyIHRoaXMgbmV3IG5vZGUgd2lsbAogICAgICBnZXQgdGhlIHNlbGVjdGlvbi4gSWYgaXQgZG9lcywgbW92ZSB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIG9sZCB0byB0aGUKICAgICAgbmV3IG5vZGUsIGlmIGl0IGRvZXMgbm90LCBhZGp1c3QgdGhlIG9mZnNldCBpbiB0aGUgc2VsZWN0aW9uIG9iamVjdCB0bwogICAgICByZWZsZWN0IHRoZSBmYWN0IHRoYXQgcGFydCBvZiB0aGUgb2xkIG5vZGUgaGFzIGJlZW4gcmVwbGFjZWQuPC9saT4KICAgIDwvdWw+CgogICAgPHA+Tm93IGluIHRoZSBzZWNvbmQgY2FzZSAoZ2V0dGluZyB0aGUgdG9wLWxldmVsIG5vZGUgYXQgdGhlCiAgICBjdXJzb3IpIHRoZSBJbnRlcm5ldCBFeHBsb3JlciBjaGVhdCBkb2VzIG5vdCB3b3JrLiBJbiB0aGUgVzNDCiAgICBtb2RlbCB0aGlzIGlzIHJhdGhlciBlYXN5LCB5b3UgaGF2ZSB0byBkbyBzb21lIGNyZWF0aXZlIHBhcmVudC0KICAgIGFuZCBzaWJsaW5nLXBvaW50ZXIgZm9sbG93aW5nIHRvIGFycml2ZSBhdCB0aGUgY29ycmVjdCB0b3AtbGV2ZWwKICAgIG5vZGUsIGJ1dCBub3RoaW5nIHdlaXJkLiBJbiBJbnRlcm5ldCBFeHBsb3JlciwgYWxsIHdlIGhhdmUgdG8gZ28KICAgIG9uIGlzIHRoZSA8Y29kZT5wYXJlbnRFbGVtZW50PC9jb2RlPiBtZXRob2Qgb24gYQogICAgPGNvZGU+VGV4dFJhbmdlPC9jb2RlPiwgd2hpY2ggZ2l2ZXMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdAogICAgY29tcGxldGVseSBlbnZlbG9wcyB0aGUgc2VsZWN0aW9uLiBJZiB0aGUgY3Vyc29yIGlzIGluc2lkZSBhIHRleHQKICAgIG5vZGUsIHRoaXMgaXMgZ29vZCwgdGhhdCB0ZXh0IG5vZGUgdGVsbHMgdXMgd2hlcmUgd2UgYXJlLiBJZiB0aGUKICAgIGN1cnNvciBpcyBiZXR3ZWVuIG5vZGVzLCBmb3IgZXhhbXBsZSBiZXR3ZWVuIHR3byA8Y29kZT5icjwvY29kZT4KICAgIG5vZGVzLCB5b3UgZ2V0IHRvIHRvcC1sZXZlbCBub2RlIGl0c2VsZiBiYWNrLCB3aGljaCBpcyByZW1hcmthYmx5CiAgICB1c2VsZXNzLiBJbiBjYXNlcyBsaWtlIHRoaXMgSSBzdG9vcCB0byBhIHJhdGhlciB1Z2x5IGhhY2sgKHdoaWNoCiAgICBmb3J0dW5hdGVseSB0dXJuZWQgb3V0IHRvIGJlIGFjY2VwdGFibHkgZmFzdCkgJiN4MjAxNTsgSSBjcmVhdGUgYQogICAgdGVtcG9yYXJ5IGVtcHR5IDxjb2RlPnNwYW48L2NvZGU+IHdpdGggYW4gSUQgaW5zaWRlIHRoZSBzZWxlY3Rpb24sCiAgICBnZXQgYSByZWZlcmVuY2UgdG8gdGhpcyA8Y29kZT5zcGFuPC9jb2RlPiBieSBJRCwgdGFrZSBpdHMKICAgIDxjb2RlPnByZXZpb3VzU2libGluZzwvY29kZT4sIGFuZCByZW1vdmUgaXQgYWdhaW4uPC9wPgoKICAgIDxwPlVuZm9ydHVuYXRlbHksIE9wZXJhJ3Mgc2VsZWN0aW9uIGltcGxlbWVudGF0aW9uIGlzIGJ1Z2d5LCBhbmQgaXQKICAgIHdpbGwgZ2l2ZSB3aWxkbHkgaW5jb3JyZWN0IDxjb2RlPlJhbmdlPC9jb2RlPiBvYmplY3RzIHdoZW4gdGhlIGN1cnNvcgogICAgaXMgYmV0d2VlbiB0d28gbm9kZXMuIFRoaXMgaXMgYSBiaXQgb2YgYSBzaG93c3RvcHBlciwgYW5kIHVudGlsIEkgZmluZAogICAgYSB3b3JrYXJvdW5kIGZvciB0aGF0IG9yIGl0IGdldHMgZml4ZWQsIHRoZSBoaWdobGlnaHRlciBkb2Vzbid0IHdvcmsKICAgIHByb3Blcmx5IGluIE9wZXJhLjwvcD4KCiAgICA8cD5BbHNvLCB3aGVuIG9uZSBwcmVzc2VzIGVudGVyIGluIGEgPGNvZGU+ZGVzaWduTW9kZTwvY29kZT4KICAgIGRvY3VtZW50IGluIEZpcmVmb3ggb3IgT3BlcmEsIGEgPGNvZGU+YnI8L2NvZGU+IHRhZyBpcyBpbnNlcnRlZC4KICAgIEluIEludGVybmV0IEV4cGxvcmVyLCBwcmVzc2luZyBlbnRlciBjYXVzZXMgc29tZSBtYW5pYWNhbCBnbm9tZSB0bwogICAgY29tZSBvdXQgYW5kIHN0YXJ0IHdyYXBwaW5nIGFsbCB0aGUgY29udGVudCBiZWZvcmUgYW5kIGFmdGVyIHRoZQogICAgY3Vyc29yIGluIDxjb2RlPnA8L2NvZGU+IHRhZ3MuIEkgc3VwcG9zZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gYmUKICAgIHNhaWQgZm9yIHRoYXQsIGluIHByaW5jaXBsZSwgdGhvdWdoIGlmIHlvdSBzYXcgdGhlIHRhZyBzb3VwIG9mCiAgICA8Y29kZT5mb250PC9jb2RlPnMgYW5kIG5lc3RlZCBwYXJhZ3JhcGhzIEludGVybmV0IEV4cGxvcmVyCiAgICBnZW5lcmF0ZXMgeW91IHdvdWxkIHNvb24gZW5vdWdoIGZvcmdldCBhbGwgYWJvdXQgcHJpbmNpcGxlLgogICAgQW55d2F5LCBnZXR0aW5nIHVud2FudGVkIDxjb2RlPnA8L2NvZGU+IHRhZ3Mgc2xvd2VkIHRoZQogICAgaGlnaGxpZ2h0ZXIgZG93biB0ZXJyaWJseSAmI3gyMDE1OyBpdCBoYWQgdG8gb3ZlcmhhdWwgdGhlIHdob2xlCiAgICBET00gdHJlZSB0byByZW1vdmUgdGhlbSBhZ2FpbiwgZXZlcnkgdGltZSB0aGUgdXNlciBwcmVzc2VkIGVudGVyLgogICAgRm9ydHVuYXRlbHkgSSBjb3VsZCBmaXggdGhpcyBieSBjYXB0dXJpbmcgdGhlIGVudGVyIHByZXNzZXMgYW5kCiAgICBtYW51YWxseSBpbnNlcnRpbmcgYSA8Y29kZT5icjwvY29kZT4gdGFnIGF0IHRoZSBjdXJzb3IuPC9wPgoKICAgIDxwPk9uIHRoZSBzdWJqZWN0IG9mIEludGVybmV0IEV4cGxvcmVyJ3MgdGFnIHNvdXAsIGhlcmUgaXMgYW4gaW50ZXJlc3RpbmcKICAgIGFuZWNkb3RlOiBPbmUgdGltZSwgd2hlbiB0ZXN0aW5nIHRoZSBlZmZlY3QgdGhhdCBtb2RpZnlpbmcgdGhlIGNvbnRlbnQKICAgIG9mIGEgc2VsZWN0aW9uIGhhZCwgSSBpbnNwZWN0ZWQgdGhlIERPTSB0cmVlIGFuZCBmb3VuZCBhIDxjb2RlPiIvQiI8L2NvZGU+CiAgICBlbGVtZW50LiBUaGlzIHdhcyBub3QgYSBjbG9zaW5nIHRhZywgdGhlcmUgYXJlIG5vIGNsb3NpbmcgdGFncyBpbiB0aGUKICAgIERPTSB0cmVlLCBqdXN0IGVsZW1lbnRzLiBUaGUgPGNvZGU+bm9kZU5hbWU8L2NvZGU+IG9mIHRoaXMgZWxlbWVudCB3YXMgYWN0dWFsbHkKICAgIDxjb2RlPiIvQiI8L2NvZGU+LiBUaGF0IHdhcyB3aGVuIEkgZ2F2ZSB1cCBhbnkgbm90aW9ucyBvZiBldmVyIHVuZGVyc3RhbmRpbmcgdGhlCiAgICBwcm9mb3VuZCBteXN0ZXJ5IHRoYXQgaXMgSW50ZXJuZXQgRXhwbG9yZXIuPC9wPgoKICAgIDxoMj5DbG9zaW5nIHRob3VnaHRzPC9oMj4KCiAgICA8cD5XZWxsLCBJIGRlc3BhaXJlZCBhdCB0aW1lcywgYnV0IEkgZGlkIGVuZCB1cCB3aXRoIGEgd29ya2luZyBKYXZhU2NyaXB0CiAgICBlZGl0b3IuIEkgZGlkIG5vdCBrZWVwIHRyYWNrIG9mIHRoZSBhbW91bnQgb2YgdGltZSBJIHdhc3RlZCBvbiB0aGlzLAogICAgYnV0IEkgd291bGQgZXN0aW1hdGUgaXQgdG8gYmUgYXJvdW5kIGZpZnR5IGhvdXJzLiBGaW5kaW5nIHdvcmthcm91bmRzCiAgICBmb3IgYnJvd3NlciBidWdzIGNhbiBiZSBhIHRlcnJpYmx5IG5vbmxpbmVhciBwcm9jZXNzLiBJIGp1c3Qgc3BlbnQKICAgIGhhbGYgYSBkYXkgd29ya2luZyBvbiBhIHdlaXJkIGdsaXRjaCBpbiBGaXJlZm94IHRoYXQgY2F1c2VkIHRoZSBjdXJzb3IKICAgIGluIHRoZSBlZGl0YWJsZSBmcmFtZSB0byBiZSBkaXNwbGF5ZWQgMy80IGxpbmUgdG9vIGhpZ2ggd2hlbiBpdCB3YXMgYXQKICAgIHRoZSB2ZXJ5IGVuZCBvZiB0aGUgZG9jdW1lbnQuIFRoZW4gSSBmb3VuZCBvdXQgdGhhdCBzZXR0aW5nIHRoZQogICAgc3R5bGUuZGlzcGxheSBvZiB0aGUgaWZyYW1lIHRvICJibG9jayIgZml4ZWQgdGhpcyAod2h5IG5vdD8pLiBJJ20KICAgIGFtYXplZCBob3cgb2Z0ZW4gaXNzdWVzIHRoYXQgc2VlbSBob3BlbGVzcyBkbyB0dXJuIG91dCB0byBiZQogICAgYXZvaWRhYmxlLCBldmVuIGlmIGl0IHRha2VzIGhvdXJzIG9mIHNjcmV3aW5nIGFyb3VuZCBhbmQgc29tZSB0cnVseQogICAgbm9uLW9idmlvdXMgaWRlYXMuPC9wPgoKICAgIDxwPkZvciBhIGxvdCBvZiB0aGluZ3MsIEphdmFTY3JpcHQgKyBET00gZWxlbWVudHMgYXJlIGEgc3VycHJpc2luZ2x5CiAgICBwb3dlcmZ1bCBwbGF0Zm9ybS4gU2ltcGxlIGludGVyYWN0aXZlIGRvY3VtZW50cyBhbmQgZm9ybXMgY2FuIGJlCiAgICB3cml0dGVuIGluIGJyb3dzZXJzIHdpdGggdmVyeSBsaXR0bGUgZWZmb3J0LCBnZW5lcmFsbHkgbGVzcyB0aGFuIHdpdGgKICAgIG1vc3QgJ3RyYWRpdGlvbmFsJyBwbGF0Zm9ybXMgKEphdmEsIFdpbjMyLCB0aGluZ3MgbGlrZSBXeFdpZGdldHMpLgogICAgTGlicmFyaWVzIGxpa2UgRG9qbyAoYW5kIGEgc2ltaWxhciBtb25zdGVyIEkgb25jZSB3cm90ZSBteXNlbGYpIGV2ZW4KICAgIG1ha2UgY29tcGxleCwgY29tcG9zaXRlIHdpZGdldHMgd29ya2FibGUuIEhvd2V2ZXIsIHdoZW4gYXBwbGljYXRpb25zCiAgICBnbyBzdWZmaWNpZW50bHkgYmV5b25kIHRoZSB0aGluZ3MgdGhhdCBicm93c2VycyB3ZXJlIGRlc2lnbmVkIGZvciwgdGhlCiAgICBhdmFpbGFibGUgQVBJcyBkbyBub3QgZ2l2ZSBlbm91Z2ggY29udHJvbCwgYXJlIG5vbnN0YW5kYXJkIGFuZCBidWdneSwKICAgIGFuZCBhcmUgb2Z0ZW4gcG9vcmx5IGRlc2lnbmVkLiBCZWNhdXNlIG9mIHRoaXMsIHdyaXRpbmcgc3VjaAogICAgYXBwbGljYXRpb25zLCB3aGVuIGl0IGlzIGV2ZW4gcG9zc2libGUsIGlzIDxlbT5wYWluZnVsPC9lbT4gcHJvY2Vzcy48L3A+CgogICAgPHA+QW5kIHdobyBsaWtlcyBwYWluPyBTdXJlLCB3aGVuIGZpbmRpbmcgdGhhdCBjcmF6eSB3b3JrYXJvdW5kLAogICAgc3ViZHVlaW5nIHRoZSBkYW1uIGJyb3dzZXIsIGFuZCBnZXR0aW5nIGV2ZXJ5dGhpbmcgdG8gd29yaywgdGhlcmUKICAgIGlzIGEgY2VydGFpbiBtYWNobyB0aHJpbGwuIEJ1dCBvbmUgY2FuJ3QgaGVscCB3b25kZXJpbmcgaG93IG11Y2gKICAgIGVhc2llciB0aGluZ3MgbGlrZSBwcmV2ZW50aW5nIHRoZSB1c2VyIGZyb20gcGFzdGluZyBwaWN0dXJlcyBpbgogICAgaGlzIHNvdXJjZSBjb2RlIHdvdWxkIGJlIG9uIGFub3RoZXIgcGxhdGZvcm0uIE1heWJlIHNvbWV0aGluZyBsaWtlCiAgICBTaWx2ZXJsaWdodCBvciB3aGF0ZXZlciBvdGhlciBuZXcgYnJvd3NlciBwbHVnaW4gZ2l6bW9zIHBlb3BsZSBhcmUKICAgIHB1c2hpbmcgdGhlc2UgZGF5cyB3aWxsIGJlY29tZSB0aGUgd2F5IHRvIHNvbHZlIHRoaW5ncyBsaWtlIHRoaXMKICAgIGluIHRoZSBmdXR1cmUuIEJ1dCwgcGVyc29uYWxseSwgSSB3b3VsZCBwcmVmZXIgZm9yIHRob3NlIGJyb3dzZXIKICAgIGNvbXBhbmllcyB0byBwdXQgc29tZSByZWFsIGVmZm9ydCBpbnRvIHRoaW5ncyBsaWtlIGNsZWFuaW5nIHVwIGFuZAogICAgc3RhbmRhcmRpc2luZyBzaGFkeSB0aGluZ3MgbGlrZSA8Y29kZT5kZXNpZ25Nb2RlPC9jb2RlPiwgZml4aW5nCiAgICB0aGVpciBidWdzLCBhbmQgZ2V0dGluZyBzZXJpb3VzIGFib3V0IEVDTUFTY3JpcHQgNC48L3A+CgogICAgPHA+V2hpY2ggaXMgcHJvYmFibHkgbm90IHJlYWxpc3RpY2FsbHkgZ29pbmcgdG8gaGFwcGVuIGFueXRpbWUgc29vbi48L3A+CgogICAgPGhyLz4KCiAgICA8cD5Tb21lIGludGVyZXN0aW5nIHByb2plY3RzIHNpbWlsYXIgdG8gdGhpczo8L3A+CgogICAgPHVsPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2dwbC5pbnRlcm5ldGNvbm5lY3Rpb24ubmV0L3ZpLyI+dmkgY2xvbmU8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9yb2Jyb2hhbi5jb20vcHJvamVjdHMvOW5lLyI+RW1hY3MgY2xvbmU8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlcHJlc3Muc291cmNlZm9yZ2UubmV0LyI+Q29kZVByZXNzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmNvZGVpZGUuY29tIj5Db2RlSURFPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmNkb2xpdmV0Lm5ldC9lZGl0YXJlYSI+RWRpdEFyZWE8L2E+PC9saT4KICAgIDwvdWw+CgogICAgPGhyLz4KCiAgICA8cD5JZiB5b3UgaGF2ZSBhbnkgcmVtYXJrcywgY3JpdGljaXNtLCBvciBoaW50cyByZWxhdGVkIHRvIHRoZQogICAgYWJvdmUsIGRyb3AgbWUgYW4gZS1tYWlsIGF0IDxhCiAgICBocmVmPSJtYWlsdG86bWFyaWpuaEBnbWFpbC5jb20iPm1hcmlqbmhAZ21haWwuY29tPC9hPi4gSWYgeW91IHNheQogICAgc29tZXRoaW5nIGdlbmVyYWxseSBpbnRlcmVzdGluZywgSSdsbCBpbmNsdWRlIHlvdXIgcmVhY3Rpb24gaGVyZQogICAgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIHBhZ2UuPC9wPgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbImZyaWVuZGx5bmFtZSJdPSJDb2RlTWlycm9yIHN5bnRheGhpZ2hsaWdodGluZyBlZGl0b3IiOwoKJGxhbmdbInBvc3RpbnN0YWxsIl09IlRoZSBDb2RlTWlycm9yIG1vZHVsZSB3YXMgc3VjZXNzZnVsbHkgaW5zdGFsbGVkIjsKJGxhbmdbIm5lZWRwZXJtaXNzaW9uIl09IidZb3UgbmVlZCB0aGUgJyVzJyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhhdCBmdW5jdGlvbi4iOwoKJGxhbmdbInNldHRpbmdzdGFiIl09IlNldHRpbmdzIjsKJGxhbmdbInNhdmVzZXR0aW5ncyJdPSJTYXZlIHNldHRpbmdzIjsKJGxhbmdbInNldHRpbmdzc2F2ZWQiXT0iU2V0dGluZ3Mgc2F2ZWQiOwoKJGxhbmdbImh0bWx0ZXN0Il09IkhUTUwgc3ludGF4IHRlc3QiOwokbGFuZ1siY3NzdGVzdCJdPSJDU1Mgc3ludGF4IHRlc3QiOwokbGFuZ1sicGhwdGVzdCJdPSJQSFAgc3ludGF4IHRlc3QiOwoKJGxhbmdbInNob3dsaW5lbnVtYmVycyJdPSJTaG93IGxpbmVudW1iZXJzIjsKCiRsYW5nWyJoZWxwIl09IjxzdHJvbmc+V2hhdCBkb2VzIHRoaXMgbW9kdWxlIGRvPzwvc3Ryb25nPgo8YnIvPgpUaGUgQ29kZU1pcnJvciBtb2R1bGUgYWxsb3dzIHlvdSB0byBlZGl0IGNvbnRlbnQsIHRlbXBsYXRlcyBhbmQgc3R5bGVzaGVldHMgdXNpbmcgYSBzeW50YXhoaWdobGlnaHRpbmcgZWRpdG9yIGluc2lkZSB5b3VyIGJyb3dzZXIuCkl0IGNhbiBib3RoIHJlcGxhY2UgYSB3eXNpd3lnLW1vZHVsZSwgYW5kIGFjdCBzdGFuZGFsb25lIGZvciB0ZW1wbGF0ZS9zdHlsZXNoZWV0IGVkaXRpbmcgKG9ubHkgc3VwcG9ydGVkIGluIENNU21zIDEuMSspCjxici8+PGJyLz4KPHN0cm9uZz5Ib3cgZG8gSSB1c2UgdGhpcyBtb2R1bGU/PC9zdHJvbmc+CllvdSBzaW1wbHkgaW5zdGFsbCBpdCwgYW5kIGNob29zZSBpdCBpbiB5b3VyIGFkbWluIHVzZXIgcHJlZmVyZW5jZXMuIE5vdGUsIHRoYXQgaWYgeW91IHVzZSBDTVNtcyAxLjEgb3IgYWJvdmUgeW91IGNhbgpzZWxlY3QgQ29kZU1pcnJvciBib3RoIGFzIGEgV1lTSVdZRyBhbmQgYXMgYSBzeW50YXggaGlnaGxpZ2h0aW5nIGVkaXRvci4iOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/da_DK.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgLSBlbiBzeW50YWtzLWZyZW1oJmFlbGlnO3ZlbmRlIGVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0NvZGVNaXJyb3IgbW9kdWxldCBibGV2IGtvcnJla3QgaW5zdGFsbGVyZXQnOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtZb3UgbmVlZCB0aGUgJiMwMzk7JXMmIzAzOTsgcGVybWlzc2lvbiB0byBwZXJmb3JtIHRoYXQgZnVuY3Rpb24uJzsKJGxhbmdbJ3NldHRpbmdzdGFiJ10gPSAnSW5kc3RpbGxpbmdlcic7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdHZW0gaW5kc3RpbGxpbmdlcic7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnSW5kc3RpbGxpbmdlcm5lIGJsZXYgZ2VtdCc7CiRsYW5nWydodG1sdGVzdCddID0gJ0hUTUwgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1Mgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ3BocHRlc3QnXSA9ICdQSFAgc3ludGFrYSB0ZXN0JzsKJGxhbmdbJ3Nob3dsaW5lbnVtYmVycyddID0gJ1ZpcyBsaW5pZW51bXJlJzsKJGxhbmdbJ2hlbHAnXSA9ICc8c3Ryb25nPkh2YWQgZyZvc2xhc2g7ciBkZXR0ZSBtb2R1bD88L3N0cm9uZz4NCjxici8+DQpUaGUgQ29kZU1pcnJvciBtb2R1bGUgYWxsb3dzIHlvdSB0byBlZGl0IGNvbnRlbnQsIHRlbXBsYXRlcyBhbmQgc3R5bGVzaGVldHMgdXNpbmcgYSBzeW50YXhoaWdobGlnaHRpbmcgZWRpdG9yIGluc2lkZSB5b3VyIGJyb3dzZXIuDQpJdCBjYW4gYm90aCByZXBsYWNlIGEgd3lzaXd5Zy1tb2R1bGUsIGFuZCBhY3Qgc3RhbmRhbG9uZSBmb3IgdGVtcGxhdGUvc3R5bGVzaGVldCBlZGl0aW5nIChvbmx5IHN1cHBvcnRlZCBpbiBDTVNtcyAxLjErKQ0KPGJyLz48YnIvPg0KPHN0cm9uZz5Ib3cgZG8gSSB1c2UgdGhpcyBtb2R1bGU/PC9zdHJvbmc+DQpZb3Ugc2ltcGx5IGluc3RhbGwgaXQsIGFuZCBjaG9vc2UgaXQgaW4geW91ciBhZG1pbiB1c2VyIHByZWZlcmVuY2VzLiBOb3RlLCB0aGF0IGlmIHlvdSB1c2UgQ01TbXMgMS4xIG9yIGFib3ZlIHlvdSBjYW4NCnNlbGVjdCBDb2RlTWlycm9yIGJvdGggYXMgYSBXWVNJV1lHIGFuZCBhcyBhIHN5bnRheCBoaWdobGlnaHRpbmcgZWRpdG9yLic7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjIwMzk4ODY1ODUuMTIzMTcxMzYxOC4xMjQzODQxMDMyLjEyNDM4NjY1NTIuMzknOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjQyNzgwNDYzLjM1LjgudXRtY3NyPWZvcnVtLmNtc21hZGVzaW1wbGUub3JnfHV0bWNjbj0ocmVmZXJyYWwpfHV0bWNtZD1yZWZlcnJhbHx1dG1jY3Q9L2luZGV4LnBocC9ib2FyZCw5LjAuaHRtbCc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0VkaXRldXIgZGUgc3ludGF4ZSBjb2xvciZlYWN1dGU7IENvZGVNaXJyb3InOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdMZSBtb2R1bGUgQ29kZU1pcnJvciBhICZlYWN1dGU7dCZlYWN1dGU7IGluc3RhbGwmZWFjdXRlOyBhdmVjIHN1Y2MmZWdyYXZlO3MnOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtWb3VzIGF2ZXogYmVzb2luIGRlIGwmIzAzOTthdXRvcmlzYXRpb24gJiMwMzk7JXMmIzAzOTsgIHBvdXIgY2V0dGUgZm9uY3Rpb24nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdQYXJhbSZlZ3JhdmU7dHJlcyc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYXV2ZWdhcmRlciBsZXMgcGFyYW0mZWdyYXZlO3RyZXMnOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ1BhcmFtJmVncmF2ZTt0cmVzIHNhdXZlZ2FyZCZlYWN1dGU7cyc7CiRsYW5nWydodG1sdGVzdCddID0gJ1Rlc3QgZGUgc3ludGF4ZSBIVE1MICc7CiRsYW5nWydjc3N0ZXN0J10gPSAnVGVzdCBkZSBzeW50YXhlIENTUyAnOwokbGFuZ1sncGhwdGVzdCddID0gJ1Rlc3QgZGUgc3ludGF4ZSBQSFAnOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnQWZmaWNoZXIgbGUgbm9tYnJlIGRlIGxpZ25lcyc7CiRsYW5nWydoZWxwJ10gPSAnPHN0cm9uZz5RdWUgZmFpdCBjZSBtb2R1bGUmbmJzcDs/PC9zdHJvbmc+DQo8YnIvPg0KTGUgbW9kdWxlIENvZGVNaXJyb3Igdm91cyBwZXJtZXQgZGUgbW9kaWZpZXIgbGUgY29udGVudSwgbGVzIGdhYmFyaXRzIGV0IGxlcyBmZXVpbGxlcyBkZSBzdHlsZSBlbiB1dGlsaXNhbnQgdW4gJmVhY3V0ZTtkaXRldXIgZGUgc3ludGF4ZSBjb2xvciZlYWN1dGU7IGwmIzAzOTtpbnQmZWFjdXRlO3JpZXVyIGRlIHZvdHJlIG5hdmlnYXRldXIuIA0KSWwgcGV1dCBhdXNzaSBiaWVuIHJlbXBsYWNlciBsJiMwMzk7JmVhY3V0ZTtkaXRldXIgV1lTSVdZRywgZXQgcGVybWV0dHJlIGRlIHZpc3VhbGlzZXItJmVhY3V0ZTtkaXRlciBsZXMgZ2FiYXJpdHMsIGZldWlsbGVzIGRlIHN0eWxlLiAoVW5pcXVlbWVudCBwb3VyIHZlcnNpb24gQ01TTVMgMS4xIG91IHBsdXMpDQo8YnIvPjxici8+DQo8c3Ryb25nPkNvbW1lbnQgbCYjMDM5O3V0aWxpc2VyJm5ic3A7Pzwvc3Ryb25nPg0KSWwgdm91cyBzdWZmaXQgZGUgbCYjMDM5O2luc3RhbGxlciwgZXQgZGUgbGUgY2hvaXNpciBkYW5zIDogTWVzIHByJmVhY3V0ZTtmJmVhY3V0ZTtyZW5jZXMgLyBQciZlYWN1dGU7ZiZlYWN1dGU7cmVuY2VzIGRlIGwmIzAzOTt1dGlsaXNhdGV1ci4gUyZlYWN1dGU7bGVjdGlvbm5lciBhbG9ycyBkYW5zIGxlIG1lbnUgZCZlYWN1dGU7cm91bGFudCAgPHN0cm9uZz5Db2RlTWlycm9yPC9zdHJvbmc+IGRhbnMgJnF1b3Q7UyZlYWN1dGU7bGVjdGlvbm5lciBsYSBzeW50YXhlIHN1cmxpZ24mZWFjdXRlO2UmcXVvdDsgIG91ICZlYWN1dGU7dmVudHVlbGxlbWVudCBkYW5zICZxdW90O1MmZWFjdXRlO2xlY3Rpb24gZHUgV1lTSVdZRyAmYWdyYXZlOyB1dGlsaXNlciAmcXVvdDsNCic7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEyMzkyMDkyMDMuMS4xLnV0bWNjbj0oZGlyZWN0KXx1dG1jc3I9KGRpcmVjdCl8dXRtY21kPShub25lKSc7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjY4MDM5NTgwMC4xMjM5MjA5MjAzLjEyMzkyMDkyMDMuMTIzOTIxODkwMC4yJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nb_NO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3Igc3ludGFrc2ZyZW1oZXZpbmdzcmVkaWdlcmVyJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnQ29kZU1pcnJvciBtb2R1bGVuIGJsZSBpbnN0YWxsZXJ0JzsKJGxhbmdbJ25lZWRwZXJtaXNzaW9uJ10gPSAnRHUgdHJlbmdlciAmIzAzOTslcyYjMDM5OyB0aWxsYXRlbHNlIGZvciAmYXJpbmc7IHV0ZiZvc2xhc2g7cmUgZGVubmUgZnVua3Nqb25lbi4nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdJbm5zdGlsbGluZ2VyJzsKJGxhbmdbJ3NhdmVzZXR0aW5ncyddID0gJ0xhZ3JlIGlubnN0aWxsaW5nZXInOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ0lubnN0aWxsaW5nZXIgbGFncmV0JzsKJGxhbmdbJ2h0bWx0ZXN0J10gPSAnSFRNTCBzeW50YWtzIHRlc3QnOwokbGFuZ1snY3NzdGVzdCddID0gJ0NTUyBzeW50YWtzIHRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBzeW50YWtzIHRlc3QnOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnVmlzIGxpbmplbnVtbWVyJzsKJGxhbmdbJ2hlbHAnXSA9ICc8c3Ryb25nPldoYXQgZG9lcyB0aGlzIG1vZHVsZSBkbz88L3N0cm9uZz4NCjxici8+DQpUaGUgQ29kZU1pcnJvciBtb2R1bGUgYWxsb3dzIHlvdSB0byBlZGl0IGNvbnRlbnQsIHRlbXBsYXRlcyBhbmQgc3R5bGVzaGVldHMgdXNpbmcgYSBzeW50YXhoaWdobGlnaHRpbmcgZWRpdG9yIGluc2lkZSB5b3VyIGJyb3dzZXIuDQpJdCBjYW4gYm90aCByZXBsYWNlIGEgd3lzaXd5Zy1tb2R1bGUsIGFuZCBhY3Qgc3RhbmRhbG9uZSBmb3IgdGVtcGxhdGUvc3R5bGVzaGVldCBlZGl0aW5nIChvbmx5IHN1cHBvcnRlZCBpbiBDTVNtcyAxLjErKQ0KPGJyLz48YnIvPg0KPHN0cm9uZz5Ib3cgZG8gSSB1c2UgdGhpcyBtb2R1bGU/PC9zdHJvbmc+DQpZb3Ugc2ltcGx5IGluc3RhbGwgaXQsIGFuZCBjaG9vc2UgaXQgaW4geW91ciBhZG1pbiB1c2VyIHByZWZlcmVuY2VzLiBOb3RlLCB0aGF0IGlmIHlvdSB1c2UgQ01TbXMgMS4xIG9yIGFib3ZlIHlvdSBjYW4NCnNlbGVjdCBDb2RlQXJlYSBib3RoIGFzIGEgV1lTSVdZRyBhbmQgYXMgYSBzeW50YXggaGlnaGxpZ2h0aW5nIGVkaXRvci4nOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjM3NTkzODc2LjEwNDkuMjgudXRtY2NuPShyZWZlcnJhbCl8dXRtY3NyPWZvcnVtLmNtc21hZGVzaW1wbGUub3JnfHV0bWNjdD0vaW5kZXgucGhwL3RvcGljLDE4MTMxLjAuaHRtbHx1dG1jbWQ9cmVmZXJyYWwnOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4xNzkwNTI2MjMwODQxMTAxMDAuMTIxMDQyMzU3Ny4xMjM3OTMzNDk5LjEyMzgwMTg2ODAuMTA2NSc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bWInXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgU3ludGF4aGlnaGxpZ2h0aW5nIEVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0RlIENvZGVNaXJyb3IgTW9kdWxlIGlzIGdlJml1bWw7bnN0YWxsZWVyZCc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJ1UgaGVlZnQgJiMwMzk7JXMmIzAzOTsgcmVjaHRlbiBub2RpZyBvbSBkZXplIGZ1bmN0aWUgdGUgZ2VicnVpa2VuLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ0luc3RlbGxpbmdlbic7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdJbnN0ZWxsaW5nZW4gb3BzbGFhbic7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnSW5zdGVsbGluZ2VuIG9wZ2VzbGFnZW4nOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MIFN5bnRheCBUZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1MgU3ludGF4IFRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBTeW50YXggVGVzdCc7CiRsYW5nWydzaG93bGluZW51bWJlcnMnXSA9ICdSZWdlbG51bW1lcnMgdG9uZW4nOwokbGFuZ1snaGVscCddID0gJzxzdHJvbmc+V2hhdCBkb2VzIHRoaXMgbW9kdWxlIGRvPyA8L3N0cm9uZz4NCjxici8+DQpUaGUgQ29kZU1pcnJvciBtb2R1bGUgYWxsb3dzIHlvdSB0byBlZGl0IGNvbnRlbnQsIHRlbXBsYXRlcyBhbmQgc3R5bGVzaGVldHMgdXNpbmcgYSBzeW50YXhoaWdobGlnaHRpbmcgZWRpdG9yIGluc2lkZSB5b3VyIGJyb3dzZXIuDQpJdCBjYW4gYm90aCByZXBsYWNlIGEgd3lzaXd5Zy1tb2R1bGUsIGFuZCBhY3Qgc3RhbmRhbG9uZSBmb3IgdGVtcGxhdGUvc3R5bGVzaGVldCBlZGl0aW5nIChvbmx5IHN1cHBvcnRlZCBpbiBDTVNtcyAxLjErKQ0KPGJyLz48YnIvPg0KPHN0cm9uZz5Ib3cgZG8gSSB1c2UgdGhpcyBtb2R1bGU/PC9zdHJvbmc+DQpZb3Ugc2ltcGx5IGluc3RhbGwgaXQsIGFuZCBjaG9vc2UgaXQgaW4geW91ciBhZG1pbiB1c2VyIHByZWZlcmVuY2VzLiBOb3RlLCB0aGF0IGlmIHlvdSB1c2UgQ01TbXMgMS4xIG9yIGFib3ZlIHlvdSBjYW4NCnNlbGVjdCBDb2RlQXJlYSBib3RoIGFzIGEgV1lTSVdZRyBhbmQgYXMgYSBzeW50YXggaGlnaGxpZ2h0aW5nIGVkaXRvci4nOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My43OTk5NjkwNTAuMTIyNTAyNDA1Ni4xMjM3OTk4ODk5LjEyMzgwNTI5NjUuOTcnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjM3OTg2MTM2Ljk0LjkudXRtY3NyPWZvcnVtLmNtc21hZGVzaW1wbGUub3JnfHV0bWNjbj0ocmVmZXJyYWwpfHV0bWNtZD1yZWZlcnJhbHx1dG1jY3Q9L2luZGV4LnBocCc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/sv_SE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3Igc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0NvZGVNaXJyb3ItbW9kdWxlbiBpbnN0YWxsZXJhZGVzIHV0YW4gbiZhcmluZztncmEgcHJvYmxlbSc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJyYjMDM5O1lvdSBuZWVkIHRoZSAmIzAzOTslcyYjMDM5OyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhhdCBmdW5jdGlvbi4nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdJbnN0JmF1bWw7bGxuaW5nYXInOwokbGFuZ1snc2F2ZXNldHRpbmdzJ10gPSAnU3BhcmEgaW5zdCZhdW1sO2xsbmluZ2FyJzsKJGxhbmdbJ3NldHRpbmdzc2F2ZWQnXSA9ICdJbnN0JmF1bWw7bGxuaW5nYXIgc3BhcmFkZXMnOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MIHN5bnRheCB0ZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1Mgc3ludGF4IHRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBzeW50YXggdGVzdCc7CiRsYW5nWydzaG93bGluZW51bWJlcnMnXSA9ICdWaXNhIHJhZG51bW1lcic7CiRsYW5nWydoZWxwJ10gPSAnPHN0cm9uZz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/PC9zdHJvbmc+DQo8YnIvPg0KVGhlIENvZGVNaXJyb3IgbW9kdWxlIGFsbG93cyB5b3UgdG8gZWRpdCBjb250ZW50LCB0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzIHVzaW5nIGEgc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvciBpbnNpZGUgeW91ciBicm93c2VyLg0KSXQgY2FuIGJvdGggcmVwbGFjZSBhIHd5c2l3eWctbW9kdWxlLCBhbmQgYWN0IHN0YW5kYWxvbmUgZm9yIHRlbXBsYXRlL3N0eWxlc2hlZXQgZWRpdGluZyAob25seSBzdXBwb3J0ZWQgaW4gQ01TbXMgMS4xKykNCjxici8+PGJyLz4NCjxzdHJvbmc+SG93IGRvIEkgdXNlIHRoaXMgbW9kdWxlPzwvc3Ryb25nPg0KWW91IHNpbXBseSBpbnN0YWxsIGl0LCBhbmQgY2hvb3NlIGl0IGluIHlvdXIgYWRtaW4gdXNlciBwcmVmZXJlbmNlcy4gTm90ZSwgdGhhdCBpZiB5b3UgdXNlIENNU21zIDEuMSBvciBhYm92ZSB5b3UgY2FuDQpzZWxlY3QgQ29kZUFyZWEgYm90aCBhcyBhIFdZU0lXWUcgYW5kIGFzIGEgc3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IuJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuNDMzMjc1NDgwMjc5OTY2ODUwLjEyNDE2NDEyODUuMTI0MTY0MTI4NS4xMjQxNjQxMjg1LjEnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1My4xLjEwLjEyNDE2NDEyODUnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEyNDE2NDEyODUuMS4xLnV0bWNzcj1nb29nbGV8dXRtY2NuPShvcmdhbmljKXx1dG1jbWQ9b3JnYW5pY3x1dG1jdHI9Y21zbXMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgic2hvd2xpbmVudW1iZXJzIiwxKTsNCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInVzZWF1dG9jb21wbGV0ZSIsMSk7Cj8+]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICAvL1JlbW92ZSBvbGQgc3BlY2lmaWsgcGVybWlzc2lvbgogICR0aGlzLT5SZW1vdmVQZXJtaXNzaW9uKCJtb2RpZnllZGl0YXJlYXNldHRpbmdzIik7Cj8+]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/changelog.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgo8bGk+MC4xLjEgLSBVcGRhdGVkIHRvIENNIDAuNjIsIGZpeGVkIGV4YW1wbGVzIGFuZCBwcm9iYWJseSBmdW5jdGlvbmFsaXR5IGFzIHdlbGw8L2xpPgo8bGk+MC4xLjAgLSBJbml0aWFsIHJlbGVhc2UgPC9saT4KCjwvdWw+]]></data>
	</file>
	<file>
	  <filename>/templates/codemirrorarea.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCBibGFjazsiPgo8dGV4dGFyZWEgIGlkPSJ7JHRleHRhcmVhaWR9IiBuYW1lPSJ7JHRleHRhcmVhbmFtZX0iPnskY29udGVudH08L3RleHRhcmVhPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICB2YXIgZWRpdG9yeyRpZH0gPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSgneyR0ZXh0YXJlYWlkfScsIHtsaXRlcmFsfXt7L2xpdGVyYWx9CiAgICB7aWYgJGhlaWdodCE9Jyd9aGVpZ2h0OiAieyRoZWlnaHR9IiwKICAgIHsvaWZ9CiAgICBoZWlnaHQ6ICIzNTBweCIsCiAgICBwYXJzZXJmaWxlOiB7JHBhcnNlcmZpbGV9LAogICAgc3R5bGVzaGVldDogeyRjc3NmaWxlfSwKICAgIHtpZiAkbGluZW51bWJlcnMhPScnfWxpbmVOdW1iZXJzOiB0cnVlLAogICAgey9pZn0KICAgIAogICAgcGF0aDogInskcm9vdF91cmx9L21vZHVsZXMvQ29kZU1pcnJvci9jb2RlbWlycm9yL2pzLyIKCiAge2xpdGVyYWx9fSk7ey9saXRlcmFsfQo8L3NjcmlwdD4K]]></data>
	</file>
	<file>
	  <filename>/templates/settings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRzdGFydGZvcm19CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHNob3dsaW5lbnVtYmVyc3RleHR9PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskc2hvd2xpbmVudW1iZXJzaW5wdXR9PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskc3VibWl0fTwvcD4KCTwvZGl2Pgp7JGVuZGZvcm19Cg==]]></data>
	</file>
</module>
